diff --git a/.github/workflows/code-quality.yml b/.github/workflows/code-quality.yml index 86b01542..8b3ce625 100644 --- a/.github/workflows/code-quality.yml +++ b/.github/workflows/code-quality.yml @@ -9,6 +9,7 @@ on: jobs: quality: + if: (github.event_name != 'pull_request' || github.head_ref != 'development') # ConductionNL, NOT Conduction. Commit 5f4069ac ("org rename", 2026-06-01) # pointed every reusable-workflow call in this repo at `Conduction/.github`, # an org that does not exist. Actions cannot resolve it, so from that date @@ -151,6 +152,17 @@ jobs: # and say why — it is still honoured. To roll back for everyone, revert on # ConductionNL/.github main. enable-hydra-gates: true + # ── Cost controls (see ConductionNL/.github#596, #599) ─────────────── + # Run PHPUnit and Playwright only when the diff could change their + # verdict. Fails safe TOWARDS running: an unreadable diff, a force-push, + # a branch creation or a dispatch all run everything, and a filtered + # skip is a declared state in the Quality Report, not a missing one. + enable-path-filtering: true + # PR-time PHPUnit runs the primary PHP against the newest declared + # Nextcloud; the full matrix still runs on every push to a default + # branch and on the release PR into beta. Breadth moves from + # per-commit to per-merge, it is not dropped. + reduce-pr-matrix: true # Translation-completeness gate: every required European locale must carry a # real translation for every key in l10n/en.json. Dependency-free pure Node diff --git a/appinfo/info.xml b/appinfo/info.xml index b75d6fd9..0e40713d 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -42,7 +42,7 @@ Vrij en open source onder de EUPL-1.2-licentie. **Ondersteuning:** Voor ondersteuning, neem contact op via support@conduction.nl. ]]> - 0.2.17 + 0.2.23-unstable.20261003100000 EUPL-1.2 Conduction Planninq @@ -161,7 +161,45 @@ Vrij en open source onder de EUPL-1.2-licentie. OCA\Planninq\Repair\MigrateAppConfigKeys OCA\Planninq\Repair\MigrateUserPreferences OCA\Planninq\Repair\MigrateRegisterSlug + + OCA\Planninq\Repair\RenameTimeEntrySchemaSlug OCA\Planninq\Repair\InitializeSettings + + OCA\Planninq\Repair\BackfillProjectMembers + + OCA\Planninq\Repair\AssignBoardColumns + + OCA\Planninq\Repair\ApplyProjectPolicy OCA\Planninq\Repair\ReconcileDueReminderOverrides @@ -178,7 +216,13 @@ Vrij en open source onder de EUPL-1.2-licentie. happen here or the import below forks a second, empty register. --> OCA\Planninq\Repair\MigrateRegisterSlug + + OCA\Planninq\Repair\RenameTimeEntrySchemaSlug OCA\Planninq\Repair\InitializeSettings + + OCA\Planninq\Repair\BackfillProjectMembers + OCA\Planninq\Repair\AssignBoardColumns + OCA\Planninq\Repair\ApplyProjectPolicy diff --git a/appinfo/routes.php b/appinfo/routes.php index e4d3f028..0d690258 100644 --- a/appinfo/routes.php +++ b/appinfo/routes.php @@ -12,11 +12,13 @@ // First-time setup wizard (ADR-042) - the standard CnSetupWizard contract. ['name' => 'setup#status', 'url' => '/api/setup/status', 'verb' => 'GET'], ['name' => 'setup#runAction', 'url' => '/api/setup/action/{actionId}', 'verb' => 'POST', 'requirements' => ['actionId' => '[a-z0-9\\-]+']], + ['name' => 'setup#saveConfig', 'url' => '/api/setup/config', 'verb' => 'POST'], ['name' => 'settings#updateUser', 'url' => '/api/settings/user', 'verb' => 'POST'], // Project creation policy check — enforces allow_project_creation server-side. ['name' => 'project#checkCreatePolicy', 'url' => '/api/projects/check-create-policy', 'verb' => 'GET'], // Project create proxy — C1: enforces policy then calls OR ObjectService server-side. + ['name' => 'project#keyAvailable', 'url' => '/api/projects/key-available', 'verb' => 'GET'], ['name' => 'project#create', 'url' => '/api/projects', 'verb' => 'POST'], // Leave-project proxy — C3: allows non-owner members to remove themselves (_rbac: false). ['name' => 'project#leaveProject', 'url' => '/api/projects/{projectId}/leave', 'verb' => 'POST', 'requirements' => ['projectId' => '[^/]+']], @@ -32,6 +34,34 @@ // Dependency edge delete — project-member guarded. ['name' => 'dependency#destroy', 'url' => '/api/dependencies/{id}', 'verb' => 'DELETE', 'requirements' => ['id' => '[^/]+']], + // Microsoft Project plan import: preview (writes nothing), then import. Owner or admin, checked per project. + ['name' => 'projectImport#preview', 'url' => '/api/projects/{projectId}/import/msproject/preview', 'verb' => 'POST', 'requirements' => ['projectId' => '[^/]+']], + ['name' => 'projectImport#import', 'url' => '/api/projects/{projectId}/import/msproject', 'verb' => 'POST', 'requirements' => ['projectId' => '[^/]+']], + + // Case handover: copy a project's files and metadata to its linked case. Owner or admin, checked per project. + ['name' => 'caseHandover#status', 'url' => '/api/projects/{projectId}/case-handover', 'verb' => 'GET', 'requirements' => ['projectId' => '[^/]+']], + ['name' => 'caseHandover#handOver', 'url' => '/api/projects/{projectId}/case-handover', 'verb' => 'POST', 'requirements' => ['projectId' => '[^/]+']], + // Read-only per-project timeline (Gantt) — RBAC-scoped through OR ObjectService. ['name' => 'timeline#forProject', 'url' => '/api/projects/{projectId}/timeline', 'verb' => 'GET', 'requirements' => ['projectId' => '[^/]+']], + // Several projects on one axis (portfolio timeline), same RBAC-scoped read per project. + ['name' => 'timeline#forProjects', 'url' => '/api/timeline', 'verb' => 'GET'], + // Cumulative flow and lead/cycle time, replayed from the audit trail (portfolio-flow-reports). + ['name' => 'flow#forProject', 'url' => '/api/projects/{projectId}/flow', 'verb' => 'GET', 'requirements' => ['projectId' => '[^/]+']], + ['name' => 'flow#forPortfolio', 'url' => '/api/portfolios/{portfolioId}/flow', 'verb' => 'GET', 'requirements' => ['portfolioId' => '[^/]+']], + + // School timetable (school-timetable-target, decision D10): signed-in users + // read a cohort's, group's or teacher's sessions; admins upsert a batch by hand. + ['name' => 'timetable#sessions', 'url' => '/api/timetable/sessions', 'verb' => 'GET'], + ['name' => 'timetable#upsert', 'url' => '/api/timetable/sessions/upsert', 'verb' => 'POST'], + // Admins publish a source's draft lessons in a window (timetable-draft-review). + ['name' => 'timetable#publish', 'url' => '/api/timetable/sessions/publish', 'verb' => 'POST'], + // Admins upload the activities and rooms sheets for the timetable generator (timetabling-generator 2.2). + ['name' => 'timetableInput#upload', 'url' => '/api/timetable/input/upload', 'verb' => 'POST'], + // Admins start a generator run for a timetable scenario (timetabling-generator 5.2). + ['name' => 'timetableScenario#generate', 'url' => '/api/timetable/scenarios/{id}/generate', 'verb' => 'POST'], + // Admins take the current timetable into an imported scenario (timetabling-generator 6.1). + ['name' => 'timetableScenario#importCurrent', 'url' => '/api/timetable/scenarios/{id}/import', 'verb' => 'POST'], + // Admins publish a scenario as draft lessons for its window (timetabling-generator 8.1). + ['name' => 'timetableScenario#publishDrafts', 'url' => '/api/timetable/scenarios/{id}/publish-drafts', 'verb' => 'POST'], ]); diff --git a/composer.json b/composer.json index 403abce4..d50e3833 100644 --- a/composer.json +++ b/composer.json @@ -19,10 +19,10 @@ }, "require-dev": { "conduction/coding-standard": "^1.0", - "conduction/hydra-gates": "^1.7.1", + "conduction/hydra-gates": "^1.14.0", "cyclonedx/cyclonedx-php-composer": "^6.2", "edgedesign/phpqa": "^1.27", - "nextcloud/ocp": "^34.0", + "nextcloud/ocp": "^35.0", "phpcsstandards/phpcsextra": "^1.4", "phpmd/phpmd": "^2.15", "phpmetrics/phpmetrics": "^2.8", @@ -39,9 +39,9 @@ "phpcs": "./vendor/bin/phpcs --standard=phpcs.xml", "phpcs:fix": "./vendor/bin/phpcbf --standard=phpcs.xml", "phpcs:output": "./vendor/bin/phpcs --standard=phpcs.xml --report=json lib/ 2>/dev/null | tail -1 > phpcs-output.json", - "phpmd": "E=0; ./vendor/bin/phpmd lib text phpmd.xml || E=$?; ./vendor/bin/phpmd lib text vendor/conduction/hydra-gates/quality-config/phpmd-unusedparams.xml || E=$?; exit $E", + "phpmd": "E=0; php -d memory_limit=2G ./vendor/bin/phpmd lib text phpmd.xml || E=$?; php -d memory_limit=2G ./vendor/bin/phpmd lib text vendor/conduction/hydra-gates/quality-config/phpmd-unusedparams.xml || E=$?; exit $E", "phpmetrics": "./vendor/bin/phpmetrics --report-html=phpmetrics lib/", - "psalm": "if [ -f vendor/bin/psalm ]; then ./vendor/bin/psalm --threads=1 --no-cache; else echo 'Psalm not installed, skipping...'; fi", + "psalm": "if [ -f vendor/bin/psalm ]; then ./vendor/bin/psalm --threads=1 --no-cache --memory-limit=2G; else echo 'Psalm not installed, skipping...'; fi", "phpstan": "if [ -f vendor/bin/phpstan ]; then ./vendor/bin/phpstan analyse --memory-limit=1G; else echo 'PHPStan not installed, skipping...'; fi", "test:unit": "if [ ! -f vendor/bin/phpunit ]; then echo 'phpunit not installed - run composer install' >&2; exit 1; elif [ -f ../../lib/base.php ]; then ./vendor/bin/phpunit -c phpunit.xml --colors=always; else echo 'No Nextcloud server tree (../../lib/base.php) - running the pure unit suite via phpunit-unit.xml, which stubs OCP from vendor/nextcloud/ocp.'; ./vendor/bin/phpunit -c phpunit-unit.xml --colors=always --no-coverage; fi", "test:all": "if [ ! -f vendor/bin/phpunit ]; then echo 'phpunit not installed - run composer install' >&2; exit 1; elif [ -f ../../lib/base.php ]; then ./vendor/bin/phpunit -c phpunit.xml --colors=always; else echo 'No Nextcloud server tree (../../lib/base.php) - running the pure unit suite via phpunit-unit.xml, which stubs OCP from vendor/nextcloud/ocp.'; ./vendor/bin/phpunit -c phpunit-unit.xml --colors=always --no-coverage; fi", diff --git a/composer.lock b/composer.lock index ec7a4394..d7ed1528 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d0789f5ef86439a279e2b7c74f115981", + "content-hash": "27e59f4ef3adbbc64225b7dc433ac465", "packages": [], "packages-dev": [ { @@ -516,16 +516,16 @@ }, { "name": "conduction/hydra-gates", - "version": "v1.10.0", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/ConductionNL/.github.git", - "reference": "d143bc27aecbb44a66c843dba89d374628bf9eef" + "reference": "477f930e84f1b3e709d2fb645d7c303d8d39a994" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ConductionNL/.github/zipball/d143bc27aecbb44a66c843dba89d374628bf9eef", - "reference": "d143bc27aecbb44a66c843dba89d374628bf9eef", + "url": "https://api.github.com/repos/ConductionNL/.github/zipball/477f930e84f1b3e709d2fb645d7c303d8d39a994", + "reference": "477f930e84f1b3e709d2fb645d7c303d8d39a994", "shasum": "" }, "require": { @@ -564,9 +564,9 @@ "support": { "docs": "https://github.com/ConductionNL/.github/blob/main/hydra-gates/README.md", "issues": "https://github.com/ConductionNL/.github/issues", - "source": "https://github.com/ConductionNL/.github/tree/v1.10.0" + "source": "https://github.com/ConductionNL/.github/tree/v1.18.0" }, - "time": "2026-08-27T16:18:04+00:00" + "time": "2026-09-10T10:15:53+00:00" }, { "name": "consolidation/annotated-command", @@ -1929,30 +1929,34 @@ }, { "name": "nextcloud/ocp", - "version": "v34.0.3", + "version": "v35.0.0", "source": { "type": "git", "url": "https://github.com/nextcloud-deps/ocp.git", - "reference": "3fb764be792476e4dcf1593101d978fc1dc8ac9a" + "reference": "94d85a0ba6b3b3911c25b2eddb0ca0fe5691acbf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/3fb764be792476e4dcf1593101d978fc1dc8ac9a", - "reference": "3fb764be792476e4dcf1593101d978fc1dc8ac9a", + "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/94d85a0ba6b3b3911c25b2eddb0ca0fe5691acbf", + "reference": "94d85a0ba6b3b3911c25b2eddb0ca0fe5691acbf", "shasum": "" }, "require": { - "php": "~8.2 || ~8.3 || ~8.4 || ~8.5", + "php": "~8.3 || ~8.4 || ~8.5", "psr/clock": "^1.0", "psr/container": "^2.0.2", "psr/event-dispatcher": "^1.0", "psr/http-client": "^1.0.3", - "psr/log": "^3.0.2" + "psr/log": "^3.0.2", + "symfony/polyfill-intl-normalizer": "^1.38", + "symfony/polyfill-php84": "^1.38", + "symfony/polyfill-php85": "^1.41", + "symfony/polyfill-php86": "^1.41" }, "type": "library", "extra": { "branch-alias": { - "dev-stable34": "34.0.0-dev" + "dev-stable35": "35.0.0-dev" } }, "notification-url": "https://packagist.org/downloads/", @@ -1972,9 +1976,9 @@ "description": "Composer package containing Nextcloud's public OCP API and the unstable NCU API", "support": { "issues": "https://github.com/nextcloud-deps/ocp/issues", - "source": "https://github.com/nextcloud-deps/ocp/tree/v34.0.3" + "source": "https://github.com/nextcloud-deps/ocp/tree/v35.0.0" }, - "time": "2026-08-07T02:03:36+00:00" + "time": "2026-09-04T01:52:36+00:00" }, { "name": "nikic/php-parser", @@ -3224,11 +3228,11 @@ }, { "name": "phpstan/phpstan", - "version": "2.2.9", + "version": "2.2.13", "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/13d6b4f347bad222da436580c8304fa6f83e6bd0", - "reference": "13d6b4f347bad222da436580c8304fa6f83e6bd0", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", + "reference": "9ba9ac76ee9c5cf5b56d58eb5deec6315b7a0260", "shasum": "" }, "require": { @@ -3284,7 +3288,7 @@ "type": "github" } ], - "time": "2026-08-22T07:38:16+00:00" + "time": "2026-09-03T20:38:19+00:00" }, { "name": "phpunit/php-code-coverage", @@ -7046,16 +7050,16 @@ }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.33.0", + "version": "v1.42.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", - "reference": "3833d7255cc303546435cb650316bff708a1c75c" + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", - "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/aa20edea75bd9c48cfecc8360922e5a6e5c44502", + "reference": "aa20edea75bd9c48cfecc8360922e5a6e5c44502", "shasum": "" }, "require": { @@ -7107,7 +7111,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.42.0" }, "funding": [ { @@ -7127,7 +7131,7 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2026-08-07T06:33:24+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -7294,6 +7298,246 @@ ], "time": "2026-05-26T12:45:58+00:00" }, + { + "name": "symfony/polyfill-php84", + "version": "v1.38.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php84.git", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "reference": "f4e1dfaee5b74aba5964fe1fd4dfc7ba5e3085fa", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php84\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.4+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php84/tree/v1.38.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-05-26T12:51:13+00:00" + }, + { + "name": "symfony/polyfill-php85", + "version": "v1.41.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php85.git", + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php85/zipball/255fab485aaa1006ed411040c42aecd7b5302d7a", + "reference": "255fab485aaa1006ed411040c42aecd7b5302d7a", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php85\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.5+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php85/tree/v1.41.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-01T12:47:55+00:00" + }, + { + "name": "symfony/polyfill-php86", + "version": "v1.41.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php86.git", + "reference": "6bc356ed3d8dbfeea8f0de235e34d670704e880e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php86/zipball/6bc356ed3d8dbfeea8f0de235e34d670704e880e", + "reference": "6bc356ed3d8dbfeea8f0de235e34d670704e880e", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "url": "https://github.com/symfony/polyfill", + "name": "symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php86\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.6+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php86/tree/v1.41.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://github.com/nicolas-grekas", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2026-07-02T13:42:24+00:00" + }, { "name": "symfony/process", "version": "v6.4.33", @@ -8003,7 +8247,8 @@ }, "platform-dev": {}, "platform-overrides": { - "php": "8.3" + "php": "8.3", + "ext-xsl": "1" }, "plugin-api-version": "2.9.0" } diff --git a/docs/FEATURES.md b/docs/FEATURES.md index 1c6c9f1b..510afc3c 100644 --- a/docs/FEATURES.md +++ b/docs/FEATURES.md @@ -201,6 +201,7 @@ No dedicated Dutch government task management tools were identified. OpenProject | Feature | Tier | Justification | |---------|------|---------------| | Procest bridge (case → project/task) | **MVP** | Cross-app workflow (sister app) | +| Hand a project's files and metadata over to its case, unchanged and checksummed | **Enterprise** | Tender demand: TenderNed 365739, requirements 4054 and 4126 | | Nextcloud Files (attachment via CnObjectSidebar) | **MVP** | Document management | | Nextcloud Activity (publish task events) | **MVP** | Unified timeline | | Nextcloud Notifications (INotificationManager) | **MVP** | In-app push | @@ -209,6 +210,7 @@ No dedicated Dutch government task management tools were identified. OpenProject | Webhook outgoing (on task create/update/complete) | **V1** | External system triggers | | Import from Nextcloud Deck (boards → projects) | **V1** | Migration from Deck | | Import from CSV (tasks bulk import) | **V1** | Data onboarding | +| Import a Gantt plan from Microsoft Project (XML: phases, tasks, sub-tasks, milestones, links; re-import updates) | **V1** | Tender demand: TenderNed 365739, requirement 4132 | ### Security & Compliance diff --git a/docs/features/README.md b/docs/features/README.md index 4cc1244e..01b42d69 100644 --- a/docs/features/README.md +++ b/docs/features/README.md @@ -14,3 +14,6 @@ Planninq is a project management app for Nextcloud, providing kanban boards, tas | Time Tracking | Per-task time estimates and manual time log entries; personal timesheet view with date grouping and range filters | Schema.org QuantitativeValue, iCalendar ESTIMATED-DURATION (RFC 7986) | [time-tracking.md](time-tracking.md) | | Admin & User Settings | Admin settings panel for default columns and label management; user settings dialog for notification preferences and default view | Nextcloud OCP\IAppConfig, OCP\IConfig, NcAppSettingsDialog | [admin-settings.md](admin-settings.md) | | Procest Integration | Link tasks and projects to Procest cases via caseReference and zaakUuid fields; case badges and links in the UI | VNG ZGW InterneTaak, Schema.org Action | [procest-integration.md](procest-integration.md) | +| Finance import | Actual costs and commitments from the finance system land on the project with the same project number; unmatched lines wait in Beheer | OpenRegister financeLine, integriq mapping | [finance-import.md](finance-import.md) | +| School timetable | Lessons delivered by a rostering system (Zermelo, Untis, Xedule, TimeEdit) through integriq, upserted by source and lesson id, read by learniq per group or teacher | Schema.org Event, iCalendar VEVENT (RFC 5545) | [school-timetable.md](school-timetable.md) | +| Timetable generator | Generate a school timetable that keeps every hard wish, take the current timetable into a scenario, compare two or three scenarios, publish one as draft lessons | Schema.org Event, iCalendar VEVENT (RFC 5545) | [timetable-generator.md](timetable-generator.md) | diff --git a/docs/features/admin-settings.md b/docs/features/admin-settings.md index c9c49a48..76e913d6 100644 --- a/docs/features/admin-settings.md +++ b/docs/features/admin-settings.md @@ -14,6 +14,8 @@ Accessible to Nextcloud administrators at **Administration → Planninq**. **Label Management** — create, edit, and delete app-wide labels that are available across all projects. Each label has a title and a hex color. +**Code forges**: the three steps to link GitHub commits and pull requests to tasks through Integriq (import the configuration, add the webhook with the shown address and a secret, name task keys such as VC-12), and a button that downloads `lib/Settings/integriq/planninq-code-forge.json`. Planninq itself never calls GitHub; without Integriq, project members paste links on the task page. + **OpenRegister Setup** — shows whether the Planninq register and schemas are initialized in OpenRegister. An "Initialize register" button triggers the import if the register is not yet set up. ### Access Control @@ -30,6 +32,7 @@ Accessible from the gear icon in the Planninq navigation bar, the user settings |---------|---------|-------------| | Notify when a task is assigned to me | On | Nextcloud notification on task assignment | | Remind me 1 day before a task's due date | On | Due-date reminder notification | +| Also send these to me by email | Off | The assignment and due-date notifications also arrive by email; each one follows its own switch above. Disabled while the account has no email address | ### Display Preferences diff --git a/docs/features/finance-import.md b/docs/features/finance-import.md new file mode 100644 index 00000000..0971df2b --- /dev/null +++ b/docs/features/finance-import.md @@ -0,0 +1,48 @@ +# Finance import + +Your finance system sends actual costs and commitments to planninq. Each line lands on the project with the same project number. Planninq holds no import code for this. The integration app (integriq) reads the finance system and writes the lines. + +## What a project manager sees + +Open a project and go to the Finance tab. Lines from the finance system show "From the finance system". You cannot edit or remove them there. The next import would overwrite a hand edit, so only the import changes them. + +## What an admin sets up + +1. Create a Nextcloud group named `planninq-finance-import`. +2. Add the integration app's service account to that group. +3. Give each project a key that matches its project number in the finance system. +4. Map the finance system's export onto the fields below in the integration app. + +Only admins and the members of that group can write imported lines. The project owner, the portfolio managers and admins can read them. + +## The contract + +The integration writes to `POST /apps/openregister/api/objects/planninq/financeLine` with these fields: + +| Field | Required | Value | +|---|---|---| +| `source` | yes | Always `import`. | +| `externalRef` | yes | The finance system's own id of the line. | +| `projectKey` | yes | The project number. Planninq matches it against `project.key`. | +| `kind` | yes | `actual` for spend, `commitment` for orders not yet paid. `budget` and `forecast` are allowed too. | +| `amount` | yes | The amount in euro. | +| `category` | no | One of the cost categories an admin set under Beheer, Cost categories. | +| `date` | no | The booking date, as `YYYY-MM-DD`. | +| `description` | no | What the amount is for. | +| `phase` | no | A phase id of the project, when the finance system knows it. | + +Leave `project` empty. Planninq fills it from `projectKey`. + +## Sending a line again + +Each `externalRef` exists once among imported lines. Sending it a second time is refused with the error code `planninq-finance-line-exists`. The answer names the existing line in `conflictingObject`. Send the new values to that line with `PATCH /apps/openregister/api/objects/planninq/financeLine/{conflictingObject}`. + +## Lines that match no project + +A line whose project number matches no project key is kept, with an empty project. Admins find these lines under Beheer, Unmatched finance lines. Open a line and pick its project. It then moves to that project's Finance tab. + +A project number that two projects share also counts as unmatched. Planninq does not guess between them. + +## Who sees the money + +Project owners, the managers of the project's portfolio and admins see the amounts. Project members see the billing model and the planned dates, but no amount. diff --git a/docs/features/kanban-board.md b/docs/features/kanban-board.md index a4e13567..fc7458b6 100644 --- a/docs/features/kanban-board.md +++ b/docs/features/kanban-board.md @@ -17,6 +17,7 @@ Each project has exactly one kanban board. Columns represent stages in the workf - **Column task count** — column header shows the current task count alongside the WIP limit - **Board filter** — filter visible cards by assignee, label, or priority - **View toggle** — switch between kanban (card grid) and list view for the same project tasks +- **Cross-project views**: save a view of up to twenty of your projects on the Boards page and share it with people in them; its lanes are task statuses, each card names its project, and moving a card puts it in the matching column of the task's own project - **Backlog access** — tasks without a column are in the backlog; a "View Backlog" link is available from the board view ## Standards diff --git a/docs/features/register-schemas.md b/docs/features/register-schemas.md index 67b3ef1b..c2ad792d 100644 --- a/docs/features/register-schemas.md +++ b/docs/features/register-schemas.md @@ -17,12 +17,9 @@ Planninq uses OpenRegister to store its data model. The `planninq_register.json` ## Seed Data -Fresh installs include demo data: -- 5 labels: Bug, Feature, Docs, Design, Infrastructure -- 3 projects: Client Portal v2, Infrastructure Migration, Onboarding Automation -- 12 columns: 4 per project (To Do, In Progress, Review, Done) -- 5 tasks with realistic assignments -- 3 time entries +A fresh install creates only the five default labels: Bug, Feature, Docs, Design and Infrastructure. + +Example projects come from the setup wizard's "Example data" step (`lib/Settings/planninq_mock_register.json`, loaded by `DemoDataService`). It adds three projects (Client Portal v2, Infrastructure Migration, Onboarding Automation) with their columns, phases, tasks, dependencies, logged time, risks, status reports, finance lines and portfolios. The admin who loads it becomes the owner and the assignee, and the dates are placed around the day it is loaded. ## Technical Details diff --git a/docs/features/school-timetable.md b/docs/features/school-timetable.md new file mode 100644 index 00000000..4561608b --- /dev/null +++ b/docs/features/school-timetable.md @@ -0,0 +1,66 @@ +# School timetable + +Planninq keeps a school's timetable: every lesson with its time, group, teacher, room and subject. A rostering system such as Zermelo, Untis, Xedule or TimeEdit delivers the lessons through integriq. Learniq shows them to teachers, pupils and parents. + +Planninq has no timetable page of its own. It stores the lessons and answers two kinds of question: "deliver these lessons" and "which lessons does this group or teacher have this week". + +## What a lesson holds + +| Field | Meaning | +|---|---| +| `externalRef` | The id the rostering system gives the lesson. | +| `sourceSystem` | The system that delivered it, for example `roster-zermelo`, or `manual`. | +| `subject`, `title` | The subject as the school names it, and the name shown. | +| `startsAt`, `endsAt` | When the lesson runs. | +| `groupReference`, `cohortId` | The school's group code, and the learniq cohort it belongs to when known. | +| `teacherReference`, `teacherUserId` | The school's teacher code, and the teacher's Nextcloud account when known. | +| `roomReference`, `roomLabel` | The school's room code and the room name. | +| `status` | `draft`, `scheduled` or `cancelled`. | +| `importedAt` | When planninq last received the lesson. Planninq fills this in. | + +## Delivering the same timetable again + +A rostering system sends the whole timetable again every night. Planninq recognises a lesson by its source and its `externalRef`: + +- a lesson it has not seen is added; +- a lesson that moved room or time is updated; +- a lesson that did not change is left alone and counted as unchanged. + +A lesson with a missing subject or time, or one that ends before it starts, is refused with a reason. The rest of the delivery still lands. + +## Who can read the timetable + +A lesson is not open to everyone who can sign in. It can be read by: + +- members of the Nextcloud group `planninq-timetable`, meant for planners and staff who need the whole school timetable. Create the group and add those people to it; +- the teacher the lesson names, through `teacherUserId`; +- admins. + +## Checking a draft timetable with the teachers + +A school often checks a new timetable with its teachers before pupils see it. Deliver those lessons with the status `draft`. A draft lesson can be read only by the teacher it names and by admins; the `planninq-timetable` group sees it once it is published. A read returns drafts only when it asks for them with `includeDrafts=true`. + +When the teachers agree, an admin publishes the drafts of one source for a period: + +`POST /apps/planninq/api/timetable/sessions/publish` with `{"sourceSystem": "roster-zermelo", "from": "2026-10-05T00:00:00+02:00", "to": "2026-10-11T23:59:59+02:00"}` + +Every draft of that source in that period becomes scheduled. Delivering a draft lesson again as `scheduled` publishes that one lesson. A lesson that is already published cannot turn back into a draft: the delivery refuses it with `already-published`. + +Pupils and parents see their own lessons in learniq. Learniq works out which groups they belong to and asks planninq for those groups only. + +## For integrators + +Apps talk to planninq through two events (ADR-041). Look the class up by name and treat a missing class as "planninq is not installed". + +- `OCA\Planninq\Event\TimetableUpsertRequestedEvent`: deliver a batch. Read the counts from `getResult()`. +- `OCA\Planninq\Event\TimetableSessionsQueryEvent`: read lessons by `cohortId`, `groupReference`, `teacherUserId` or `teacherReference`, optionally between `from` and `to`. Read them from `getSessions()`. Planninq answers this event without checking the signed-in user, so your app must only ask for a group or teacher that its user is allowed to see. + +Two endpoints do the same over HTTP: + +| Method | Path | Who | +|---|---|---| +| `GET` | `/apps/planninq/api/timetable/sessions?cohortId=…&from=…&to=…` | Any signed-in user, who gets only the lessons they may read | +| `POST` | `/apps/planninq/api/timetable/sessions/upsert` with `{"sourceSystem": "…", "sessions": […]}` | Admins | +| `POST` | `/apps/planninq/api/timetable/sessions/publish` with `{"sourceSystem": "…", "from": "…", "to": "…"}` | Admins | + +The full contract, with every field and rejection code, is in `openspec/changes/archive/2026-09-29-school-timetable-target/contract.md`. diff --git a/docs/features/timetable-generator.md b/docs/features/timetable-generator.md new file mode 100644 index 00000000..15cdbfd2 --- /dev/null +++ b/docs/features/timetable-generator.md @@ -0,0 +1,73 @@ +# Timetable generator + +Planninq makes a school timetable for you. You set the wishes, press Generate, and compare the result with the timetable you have now. When you like it, you publish it as draft lessons. Teachers review the drafts before anything goes live. + +Only admins run the generator. Everyone with the `planninq-timetable` read right sees the wishes and the scenarios. + +## Set the week grid + +An admin sets two values through `POST /apps/planninq/api/settings`. There is no screen for them yet. + +- `timetable_period_grid`: the school days and the periods of a day, each with a start and an end time. The default is Monday to Friday with eight periods of 50 minutes from 08:30. +- `timetable_generator_budget_minutes`: how many minutes one run may search. The default is 10. + +Planninq refuses a grid without days, and periods that overlap. + +## Give the generator its activities + +The generator needs to know what to place: which group gets which subject, from which teacher, how many lessons a week, and in which kind of room. + +- **With learniq installed**, learniq answers with the activities of its hour plan. +- **Without learniq**, an admin sends two CSV sheets to `POST /apps/planninq/api/timetable/input/upload`: `rooms` (reference, capacity, type) and `activities` (group, subject, teacher, lessons per week, lesson length, room type). + +## Set the wishes + +Go to Timetable, Wishes. A wish applies to a teacher, a group, a room or an activity. Pick its kind: + +| Kind | What it asks | +|---|---| +| Not on these periods | No lessons on the periods you tick. | +| Preferably not on these periods | Avoid the periods you tick if possible. | +| At most a number of lessons a day | Never more lessons a day than the limit. | +| No free periods between lessons | Keep the day without gaps. | +| Always the same room | Every lesson in one room. | + +A **hard** wish is always kept. A **soft** wish has a weight from 1 to 3. The generator breaks a heavy soft wish last. + +## Generate a scenario + +1. Go to Timetable, Scenarios and add a scenario. Choose source "generated", the first week (`weekOf`) and the window it covers. +2. Open it and press **Generate**. The run goes to the background and shows how much of the time budget it used. +3. When it is done, the page shows how many lessons have a place. + +A generated scenario never breaks a hard wish. A lesson that has no place without breaking one stays off the grid, and the page names the wish that blocked it. Loosen that wish or make it soft, then press **Generate again**. + +## Compare with the timetable you have now + +1. Add a scenario with source "imported" and the week you want to take. +2. Open it and press **Take the current timetable**. Planninq reads the scheduled lessons of that week and scores them the same way. Hard wishes the current timetable breaks are listed under "Broken hard wishes". +3. Back on Timetable, Scenarios, choose two or three scenarios under "Scenarios to compare". + +Each line shows the value of every scenario, with the best one in bold. Below it, the lessons that sit on another period or in another room. + +## Publish as draft lessons + +Open a generated scenario that is done and press **Publish as draft lessons**. Planninq writes its lessons as drafts for every week of the window, with source `planninq-generator`. + +- Drafts of an earlier scenario for the same window are replaced. +- If lessons of that window from the generator are already published, nothing is written and the page tells you why. + +Teachers then see their own drafts, and an admin publishes them through the usual draft review. See [school-timetable.md](school-timetable.md). + +## The endpoints + +| Call | What it does | +|---|---| +| `POST /apps/planninq/api/timetable/input/upload` | Stores the rooms and activities sheets. | +| `POST /apps/planninq/api/timetable/scenarios/{id}/generate` | Starts a run. Answers 202. | +| `POST /apps/planninq/api/timetable/scenarios/{id}/import` | Takes the scheduled lessons of the scenario's week. | +| `POST /apps/planninq/api/timetable/scenarios/{id}/publish-drafts` | Writes the placements as draft lessons. | + +All four are for admins only. Anyone else gets 403. + +Next: set your week grid and add your first hard wish. diff --git a/eslint.config.js b/eslint.config.js deleted file mode 100644 index 4c368972..00000000 --- a/eslint.config.js +++ /dev/null @@ -1,73 +0,0 @@ -const { - defineConfig, -} = require('@eslint/config-helpers') - -const js = require('@eslint/js') - -const { - FlatCompat, -} = require('@eslint/eslintrc') - -// Shared Vue 3 correction layer from @conduction/nextcloud-vue. -// -// `@nextcloud/eslint-config@8` (pulled in via FlatCompat below) resolves -// eslint-plugin-vue's **Vue 2** preset. That is not merely stale: two of its -// rules are INVERTED under Vue 3, and NONE of the `vue/no-deprecated-*` rules -// are active — verified on this repo before the migration, where -// `eslint --print-config src/App.vue` listed **zero** `vue/no-deprecated-*` -// rules while `vue/no-v-model-argument` and `vue/no-v-for-template-key` were -// both at severity 2. So Vue 2 idioms survive a migration silently: -// `beforeDestroy` is the dangerous case, because Vue 3 never calls that hook, -// and planninq cleaned up live-update subscriptions, a debounce timer and an -// AbortController there — four real leaks with zero console output. -// -// `conductionVue3Fixes` is an ARRAY of three flat-config objects (language -// level, SFC parser, deprecation rules). It deliberately registers no plugins, -// so it layers cleanly onto the `@nextcloud` base — and must be spread **last** -// to win over the preset it is correcting. -// -// It enables `vue/v-on-event-hyphenation` with `ignore: ['update:modelValue']`. -// That exception is load-bearing — Nextcloud Vue 3 field components read -// `onUpdate:modelValue` directly via `useModel`, so the hyphenated -// `@update:model-value` form is silently dead. -const { - conductionVue3Fixes, -} = require('@conduction/nextcloud-vue/eslint') - -const compat = new FlatCompat({ - baseDirectory: __dirname, - recommendedConfig: js.configs.recommended, - allConfig: js.configs.all, -}) - -module.exports = defineConfig([{ - extends: compat.extends('@nextcloud'), - - settings: { - 'import/resolver': { - alias: { - map: [ - ['@', './src'], - ['@floating-ui/dom-actual', './node_modules/@floating-ui/dom'], - ['@conduction/nextcloud-vue', '../nextcloud-vue/src'], - ], - extensions: ['.js', '.ts', '.vue', '.json', '.css'], - }, - }, - }, - - rules: { - // Allow unused i18n functions (t, n) — imported for future translation wiring - 'no-unused-vars': ['error', { varsIgnorePattern: '^(t|n)$', argsIgnorePattern: '^_' }], - 'jsdoc/require-jsdoc': 'off', - // Allow the ADR-008 spec-coverage annotation tag (@spec) in JSDoc blocks - 'jsdoc/check-tag-names': ['warn', { definedTags: ['spec'] }], - 'vue/first-attribute-linebreak': 'off', - '@typescript-eslint/no-explicit-any': 'off', - 'n/no-missing-import': 'off', - 'import/namespace': 'off', // disable namespace checking to avoid parser requirement - 'import/default': 'off', // disable default import checking to avoid parser requirement - 'import/no-named-as-default': 'off', // disable named-as-default checking to avoid parser requirement - 'import/no-named-as-default-member': 'off', // disable named-as-default-member checking to avoid parser requirement - }, -}, ...conductionVue3Fixes]) diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..be39793e --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,269 @@ +// Flat config for eslint 10. +// +// WHY THIS REPLACED eslint.config.js +// ---------------------------------- +// planninq was the last app in the fleet still on eslint 8. `@nextcloud/eslint-config@9` +// declares `peer eslint: ">=10"`, so the dependabot bump to 9.0.1 could not install at +// all: twelve checks went red at `npm ci`, before a single file was linted. Bumping the +// config alone was never going to work, because the eslint 8 constraint was held in three +// more places at once: +// +// @typescript-eslint/parser@7 peers eslint ^8.56.0 +// eslint-plugin-import@2.32.0 peers eslint up to ^9 +// @eslint/eslintrc exists only to bridge the eslintrc era +// +// So the stack moved together, to the versions hermiq, versioniq and keepiq already run +// green: eslint ^10.9.1, @nextcloud/eslint-config ^9.0.1, @typescript-eslint/parser +// ^8.68.0. +// +// `eslint-plugin-vue` is deliberately NOT a dependency any more. v9 bundles its own +// `eslint-plugin-vue@10`, and a stale `^9` left in devDependencies hoists over the +// bundled copy, which makes `**/*.vue` parse as TypeScript and fails every SFC. +// `vue-eslint-parser` stays, at `^10`, because it is a peer the app must supply. +// +// `conductionVue3Fixes` is gone too. That preset existed to patch a Vue-2 ruleset, and +// against v9's `recommended` every one of its jobs is already done: all 21 +// `vue/no-deprecated-*` rules are enabled, and the two it had to switch off because they +// are inverted under Vue 3 are not enabled at all. Spreading it here is not merely +// redundant, it BREAKS the run: it names `vue/*` rules while registering no plugin, and +// eslint aborts with "could not find plugin vue" — exit 2, nothing linted. +// +// 🔴 THE FAILURE MODE THIS FILE MUST AVOID. An eslint 10 install pointed at a config it +// cannot read does not report zero problems loudly. It lints NOTHING and exits non-zero +// in a way that reads as a lint failure, which is how versioniq's entire Vue and +// TypeScript layer went unchecked with 266 real problems behind it. So the check after +// any change here is the FILE COUNT, never the error count: `npx eslint src --format +// json` must report the same 46 files it reported under eslint 8, not 0. +import { recommended } from '@nextcloud/eslint-config' + +export default [ + ...recommended, + { + // 🔴 SCOPED, and it must be. Flat config resolves a rule's plugin from the config + // object the rule sits in, and v9 also lints `.json`, where `jsdoc` is not + // registered. An unscoped `jsdoc/*` override aborts the whole run with "The jsdoc + // plugin is not defined in your configuration file" — a config error, not a + // finding. The ignores are part of that scope rather than an opinion: v9 registers + // jsdoc only inside `nextcloud/documentation/*`, and those blocks carry exactly + // this list, because Nextcloud does not require JSDoc in tests. + files: ['**/*.js', '**/*.mjs', '**/*.ts', '**/*.tsx', '**/*.vue'], + ignores: [ + '**/*.test.*', + '**/*.spec.*', + '**/*.cy.*', + '**/test/**', + '**/tests/**', + '**/__tests__/**', + '**/__mocks__/**', + ], + + settings: { + // `@conduction/nextcloud-vue` resolves to the sibling checkout when one is + // present, which is how a local nextcloud-vue is linted against this app. + 'import/resolver': { + alias: { + map: [ + ['@', './src'], + ['@floating-ui/dom-actual', './node_modules/@floating-ui/dom'], + ['@conduction/nextcloud-vue', '../nextcloud-vue/src'], + ], + extensions: ['.js', '.ts', '.vue', '.json', '.css'], + }, + }, + }, + + rules: { + // `t` and `n` are imported ahead of the translation wiring that will use them. + 'no-unused-vars': [ + 'error', + { varsIgnorePattern: '^(t|n)$', argsIgnorePattern: '^_' }, + ], + 'jsdoc/require-jsdoc': 'off', + // ADR-008 spec-coverage annotation. + 'jsdoc/check-tag-names': ['warn', { definedTags: ['spec'] }], + 'vue/first-attribute-linebreak': 'off', + '@typescript-eslint/no-explicit-any': 'off', + 'n/no-missing-import': 'off', + + // `error` and `warn` are how this app reports failures it cannot show in + // the UI, and all 21 existing calls are one of those two. Deleting them to + // satisfy the rule would remove diagnostics, so they are allowed by name + // rather than the rule being switched off: a stray `console.log` left + // behind while debugging is still an error, which is what the rule is for. + 'no-console': ['error', { allow: ['error', 'warn'] }], + }, + }, + { + // Route views are mounted by the router under their path, never written as a + // tag in a template, so they cannot collide with a current or future HTML + // element — which is the entire reason `vue/multi-word-component-names` + // exists. Renaming `Dashboard` to `PlanninqDashboard` would churn five files + // and every import of them to satisfy a rule that is not describing a risk + // here. Scoped to `views/` so ordinary components keep the rule. + files: ['src/views/**/*.vue'], + rules: { + 'vue/multi-word-component-names': 'off', + }, + }, + { + // Node-side CLI checkers under tests/ legitimately use console and + // process.exit, and ship as plain JS with no shebang. A GLOB, not a file + // list: an explicit list silently stopped covering every new checker. + files: ['tests/**/*.js', 'tests/**/*.mjs', 'tests/**/*.ts'], + rules: { + 'no-console': 'off', + 'n/no-process-exit': 'off', + 'n/hashbang': 'off', + // Tests import devDependencies by definition; this rule is about what + // ships in the published package, which tests/ never does. + 'n/no-unpublished-import': 'off', + }, + }, + + { + // `_` / `__` as a deliberate throwaway binding — `catch (_)`, a discarded + // destructuring slot. Narrow on purpose: the pattern matches UNDERSCORES + // ONLY, so a real name that happens to start with `_` is still reported. + // + // 🔴 `.js` / `.mjs` ONLY, NOT `.ts`. The CORE rule is not TypeScript-aware: + // applied to a `.ts` file it reads the parameter NAMES inside a function + // TYPE as bindings and reports them unused. Measured on humaniq — + // + // t?: (app: string, key: string) => string + // + // produced four `no-unused-vars` errors for `app` and `key`, which are + // documentation, not variables. The same mis-scoping made every unused + // `catch (e)` in a `.ts` spec report TWICE, once per rule. + // + // v9 already turns the core rule off for `.ts` and drives + // `@typescript-eslint/no-unused-vars` instead; naming `.ts` here switched + // it back on. TypeScript files are handled by the block below. + files: ['tests/**/*.js', 'tests/**/*.mjs'], + rules: { + 'no-unused-vars': [ + 'error', + { + // vars/caught: UNDERSCORES ONLY, so a real name that merely + // starts with `_` is still reported. + varsIgnorePattern: '^_+$', + caughtErrors: 'all', + caughtErrorsIgnorePattern: '^_+$', + // args: leading underscore, which is what NC's own TypeScript + // block uses (`argsIgnorePattern: '^_'`) — a positional + // parameter often has to keep a descriptive name to document + // the signature even when the body ignores it. + argsIgnorePattern: '^_', + ignoreRestSiblings: true, + }, + ], + }, + }, + + { + // The TypeScript half of the block above. Same intent, same patterns, on + // the rule that actually understands the language: it knows a name inside + // a function type is not a binding, so type annotations stay quiet while a + // genuinely dead local is still reported. + files: ['tests/**/*.ts', 'tests/**/*.tsx'], + rules: { + '@typescript-eslint/no-unused-vars': [ + 'error', + { + varsIgnorePattern: '^_+$', + caughtErrors: 'all', + caughtErrorsIgnorePattern: '^_+$', + argsIgnorePattern: '^_', + ignoreRestSiblings: true, + }, + ], + }, + }, + { + // 🔴 Node-side CLI tooling under `scripts/`, which is COMMONJS. Flat + // config defaults every `.js` to ESM with browser-ish globals, so without + // this block eslint reports the CommonJS wrapper itself as undefined + // identifiers. Measured on this app: 52 of the 233 errors under + // `tests/` + `scripts/` were `no-undef`, ALL of them in `scripts/`, and + // all five names were the environment rather than a typo — `process` 23, + // `require` 20, `__dirname` 6, `__filename` 2, `module` 1. + // + // This is describing the environment, not relaxing a rule, and it is the + // same argument the test-globals block below makes: declaring them keeps + // `no-undef` able to do its real job, which is catching a genuinely + // misspelled identifier. Suppressing the rule instead would bury that. + // + // `no-console` is off because printing its report is what a CLI checker + // is FOR. + // + // 🔴 NO `n/*` ENTRIES HERE, DELIBERATELY. `eslint-plugin-n` is NOT + // registered for these files under eslint 10 + @nextcloud/eslint-config + // 9, so `'n/no-process-exit': 'off'` would be dead config that reads as + // if it were doing something. Measured both ways on this app: 0 `n/` + // findings with the entries and 0 without. + // + // What DID report was the opposite — four `scripts/*.js` carried + // `/* eslint-disable n/no-process-exit */` and `/* eslint-disable + // n/shebang */` left over from the eslintrc era, and an inline disable + // naming an unregistered plugin is itself an error ("Definition for rule + // 'n/shebang' was not found"). Those 8 comments are removed; do not add + // `n/*` rules back to replace them. + // + // ⚠️ `.js` and `.cjs` ONLY. A `scripts/*.mjs` is genuinely ESM and must + // keep the default `sourceType`, or `import` stops parsing there. + files: ['scripts/**/*.js', 'scripts/**/*.cjs'], + languageOptions: { + sourceType: 'commonjs', + globals: { + require: 'readonly', + module: 'writable', + exports: 'writable', + process: 'readonly', + __dirname: 'readonly', + __filename: 'readonly', + console: 'readonly', + Buffer: 'readonly', + global: 'readonly', + URL: 'readonly', + TextEncoder: 'readonly', + TextDecoder: 'readonly', + }, + }, + rules: { + 'no-console': 'off', + }, + }, + + { + // The ESM half of the block above. A `scripts/*.mjs` is genuinely a module + // and must keep the default `sourceType`, so it gets Node's globals but + // none of the CommonJS wrapper. Measured: `process` reported undefined 2x + // in hermiq's generate-opengemeenten-icons.mjs and 4x in openregister's + // l10n/runtime-check.mjs, which the `.js`/`.cjs` block deliberately does + // not match. + files: ['scripts/**/*.mjs', 'tests/**/*.mjs'], + languageOptions: { + globals: { + process: 'readonly', + console: 'readonly', + Buffer: 'readonly', + global: 'readonly', + URL: 'readonly', + TextEncoder: 'readonly', + TextDecoder: 'readonly', + }, + }, + rules: { + 'no-console': 'off', + }, + }, + + { + // eslint must not try to PARSE a shell script. `tests/e2e/seed.test.sh` + // matches the `**/*.test.*` glob some presets use, and eslint then reads + // it as JavaScript and reports "Parsing error: Unexpected character" — + // a finding about a file it should never have opened. + ignores: ['**/*.sh', '**/*.bash'], + }, + + +] diff --git a/l10n/.schema-l10n-baseline.json b/l10n/.schema-l10n-baseline.json index 3c00040b..7a846bc0 100644 --- a/l10n/.schema-l10n-baseline.json +++ b/l10n/.schema-l10n-baseline.json @@ -1,3 +1,3 @@ { - "uncovered": 107 + "uncovered": 123 } diff --git a/l10n/be.js b/l10n/be.js index 77d16c08..a4f09ec1 100644 --- a/l10n/be.js +++ b/l10n/be.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Актыўныя праекты", + "Archived projects": "Архіўныя праекты", + "Boards": "Дошкі", + "My projects": "Мае праекты", + "Portfolio": "Партфель", + "Project board": "Дошка праекта", + "Projects I am in": "Праекты, у якіх я ўдзельнічаю", + "Timeline": "Часовая шкала", + "Timesheet": "Улік часу", + "Features & roadmap": "Функцыі і дарожная карта", + "Flow": "Паток", + "Flows": "Патокі", + "Reports": "Справаздачы", + "Pick a report to open it.": "Выберыце справаздачу, каб адкрыць яе.", + "In progress": "У працы", + "Date": "Дата", + "Due": "Тэрмін", + "Assignee": "Прызначана", + "Who": "Хто", + "What": "Што", + "Minutes": "Хвіліны", + "Entries": "Запісы", + "Most recent": "Найноўшыя", + "Per person": "На асобу", + "By status": "Па статусе", + "By priority": "Па прыярытэце", + "Task status": "Статус задач", + "Time spent": "Затрачаны час", + "Capacity": "Магутнасць", + "Due soonest": "Найбліжэйшы тэрмін", + "Minutes logged": "Запісаныя хвіліны", + "Nothing is due": "Нічога не заплянавана", + "Nothing logged yet": "Яшчэ нічога не запісана", + "What is open, what is blocked, and what is overdue.": "Што адкрыта, што заблакіравана і што пратэрмінавана.", + "How allocation is spread across the people working on projects.": "Як размеркавана нагрузка паміж людзьмі, што працуюць над праектамі.", + "Hours logged, and the projects they went to.": "Запісаныя гадзіны і праекты, на якія яны пайшлі.", + "Billable": "Аплатна", + "Budget: {amount}": "Бюджэт: {amount}", + "Loading projects": "Загрузка праектаў", + "No projects for this client yet": "Для гэтага кліента яшчэ няма праектаў", + "Open in Planninq": "Адкрыць у Planninq", + "This project could not be found": "Не ўдалося знайсці гэты праект", + "Untitled project": "Праект без назвы", + "and {count} more": "і яшчэ {count}", + "Store": "Крама", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Усталюйце рэестры, схемы і патокі, апублікаваныя іншымі арганізацыямі.", + "Work Date": "Дата працы", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Дзеянні са слупком", + "Columns": "Слупкі", + "Could not remove the column. Please try again.": "Не ўдалося выдаліць слупок. Паспрабуйце яшчэ раз.", + "Could not save the column. Please try again.": "Не ўдалося захаваць слупок. Паспрабуйце яшчэ раз.", + "Done column": "Слупок выкананых", + "Edit column": "Рэдагаваць слупок", + "Keep the card's status": "Захаваць статус карткі", + "Move its cards to": "Перамясціць яго карткі ў", + "Move left": "Перамясціць улева", + "Move right": "Перамясціць управа", + "Status of cards moved here": "Статус картак, перамешчаных сюды", + "The last done column cannot be removed.": "Апошні слупок выкананых нельга выдаліць.", + "WIP limit": "Ліміт WIP", + "over limit": "вышэй за ліміт", + "The status a card gets when it is moved into this column.": "Статус, які атрымлівае картка, калі яе перамяшчаюць у гэты слупок.", + "All priorities": "Усе прыярытэты", + "Could not create the task. Please try again.": "Не ўдалося стварыць задачу. Паспрабуйце яшчэ раз.", + "Created": "Створана", + "Move to backlog": "У беклог", + "Move to board": "На дошку", + "New task": "Новая задача", + "Nothing in the backlog": "У беклогу нічога няма", + "Rank": "Ранг", + "Sort by": "Сартаваць па", + "Sort by rank to reorder": "Сартуйце па рангу, каб змяніць парадак", + "Task actions": "Дзеянні з задачай", + "All labels": "Усе меткі", + "Filter tasks by label": "Фільтраваць задачы па метцы", + "View timeline": "Праглядзець часовую шкалу", + "Board": "Дошка", + "List": "Спіс", + "Column": "Слупок", + "Board or list": "Дошка або спіс", + "Log": "Журнал", + "Add entry": "Дадаць запіс", + "Show": "Паказаць", + "No actions yet": "Дзеянняў яшчэ няма", + "Closed": "Закрыта", + "Entry actions": "Дзеянні з запісам", + "Add action": "Дадаць дзеянне", + "by {author}": "аўтар {author}", + "saved {time}": "захавана {time}", + "Attendees: {names}": "Прысутныя: {names}", + "Add the first entry": "Дадаць першы запіс", + "Issues": "Праблемы", + "Lessons learned": "Вывучаныя ўрокі", + "Meetings": "Сустрэчы", + "Decisions": "Рашэнні", + "Actions": "Дзеянні", + "Issue": "Праблема", + "Lesson learned": "Вывучаны ўрок", + "Meeting": "Сустрэча", + "Decision": "Рашэнне", + "About this project": "Пра гэты праект", + "No description yet": "Апісання яшчэ няма", + "Start date": "Дата пачатку", + "Not set": "Не зададзена", + "End date": "Дата заканчэння", + "Progress": "Ход", + "No tasks yet": "Задач яшчэ няма", + "Open the board": "Адкрыць дошку", + "People": "Людзі", + "Owner": "Уладальнік", + "Latest log entries": "Апошнія запісы", + "Open the log": "Адкрыць журнал", + "{done} of {total} tasks done": "Выканана {done} з {total} задач", + "Edit entry": "Рэдагаваць запіс", + "Type": "Від", + "Attendees": "Прысутныя", + "Issue is closed": "Праблема закрыта", + "Could not save the entry. Please try again.": "Не ўдалося захаваць запіс. Паспрабуйце яшчэ раз.", + "From: {title}": "З: {title}", + "What needs to happen": "Што трэба зрабіць", + "Could not create the action. Please try again.": "Не ўдалося стварыць дзеянне. Паспрабуйце яшчэ раз.", + "The action was created but could not be linked to the entry.": "Дзеянне створана, але не ўдалося звязаць яго з запісам.", + "Project pages": "Старонкі праекта", + "Overview": "Агляд", + "Risks": "Рызыкі", + "Log entry": "Запіс журнала", + "A short name for the entry": "Кароткая назва запісу", + "Project": "Праект", + "The project this entry belongs to": "Праект, да якога належыць гэты запіс", + "What kind of entry this is": "Які гэта від запісу", + "When it happened": "Калі гэта адбылося", + "What happened, in Markdown": "Што адбылося, у Markdown", + "Whether an issue is still open": "Ці праблема яшчэ адкрытая", + "The people at a meeting": "Людзі на сустрэчы", + "Tasks that came out of this entry": "Задачы, якія ўзніклі з гэтага запісу", + "Add risk": "Дадаць рызыку", + "Risk": "Рызыка", + "Score": "Ацэнка", + "Response": "Рэагаванне", + "Review date": "Дата перагляду", + "no longer on the project": "больш не ў праекце", + "Edit {title}": "Рэдагаваць {title}", + "No risks recorded yet": "Рызык яшчэ не запісана", + "Add the first risk": "Дадаць першую рызыку", + "Medium": "Сярэдняя", + "Mitigating": "Змякчаецца", + "Occurred": "Наступіла", + "Avoid": "Пазбегнуць", + "Reduce": "Зменшыць", + "Transfer": "Перадаць", + "Accept": "Прыняць", + "Highest open risks": "Найвышэйшыя адкрытыя рызыкі", + "No open risks": "Няма адкрытых рызык", + "Open the risk register": "Адкрыць рэестр рызык", + "Edit risk": "Рэдагаваць рызыку", + "What could go wrong": "Што можа пайсці не так", + "Likelihood": "Імавернасць", + "Impact": "Уплыў", + "Score {score}": "Ацэнка {score}", + "Countermeasures": "Контрмеры", + "Could not save the risk. Please try again.": "Не ўдалося захаваць рызыку. Паспрабуйце яшчэ раз.", + "Risks by likelihood and impact": "Рызыкі паводле імавернасці і ўплыву", + "Risk scale": "Шкала рызык", + "The levels every project scores its risks on, and where low turns into medium and high": "Узроўні, па якіх кожны праект ацэньвае свае рызыкі, і дзе нізкі пераходзіць у сярэдні і высокі", + "Number of levels": "Колькасць узроўняў", + "Likelihood labels": "Назвы імавернасці", + "Impact labels": "Назвы ўплыву", + "Level {level}": "Узровень {level}", + "Medium from score": "Сярэдні ад ацэнкі", + "High from score": "Высокі ад ацэнкі", + "Risk scale saved": "Шкала рызык захавана", + "1 risk uses level {level}. Change it first.": "1 рызыка выкарыстоўвае ўзровень {level}. Спачатку змяніце яе.", + "{count} risks use level {level}. Change them first.": "Рызык на ўзроўні {level}: {count}. Спачатку змяніце іх.", + "Every level needs a label, and high must start above medium.": "Кожнаму ўзроўню патрэбна назва, а высокі мусіць пачынацца вышэй за сярэдні.", + "The project this risk belongs to": "Праект, да якога належыць гэтая рызыка", + "The cause and the effect, in Markdown": "Прычына і вынік, у Markdown", + "Category": "Катэгорыя", + "A free grouping, such as planning, budget or supplier": "Вольнае групаванне, напрыклад планаванне, бюджэт ці пастаўшчык", + "How likely it is, on the admin's risk scale": "Наколькі гэта імаверна, па шкале рызык адміністратара", + "How hard it would hit, on the admin's risk scale": "Наколькі моцна гэта ўдарыць, па шкале рызык адміністратара", + "Likelihood times impact, calculated by the server": "Імавернасць, памножаная на ўплыў, лічыць сервер", + "Where the risk stands": "На якім этапе рызыка", + "The person who watches this risk": "Чалавек, які сочыць за гэтай рызыкай", + "How the project answers the risk": "Як праект рэагуе на рызыку", + "What is done to prevent it or soften it, in Markdown": "Што робіцца, каб яе прадухіліць ці змякчыць, у Markdown", + "When to look at this risk again": "Калі зноў пераглядзець гэтую рызыку", + "Very low": "Вельмі нізкі", + "Very high": "Вельмі высокі", + "All projects": "Усе праекты", + "Project status report": "Справаздача пра стан праекта", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датаваная справаздача пра тое, як праект стаіць з грашыма, арганізацыяй, часам, інфармацыяй, якасцю і рызыкай (аспекты GROTIK), кожны з заўвагай.", + "The project this report is about": "Праект, да якога адносіцца справаздача", + "Report date": "Дата справаздачы", + "The day the report describes": "Дзень, які апісвае справаздача", + "Money": "Грошы", + "How the project stands on this aspect": "Як праект стаіць па гэтым аспекце", + "On track": "Па плане", + "At risk": "Пад пагрозай", + "Off track": "Па-за планам", + "Money note": "Заўвага пра грошы", + "A short explanation of this status": "Кароткае тлумачэнне гэтага стану", + "Organisation": "Арганізацыя", + "Organisation note": "Заўвага пра арганізацыю", + "Time": "Час", + "Time note": "Заўвага пра час", + "Information": "Інфармацыя", + "Information note": "Заўвага пра інфармацыю", + "Quality": "Якасць", + "Quality note": "Заўвага пра якасць", + "Risk note": "Заўвага пра рызыку", + "Overall": "Агулам", + "The worst of the six statuses, calculated by the server": "Найгоршы з шасці станаў, вылічваецца серверам", + "Health: money": "Стан: грошы", + "Copied from the newest status report": "Скапіявана з найноўшай справаздачы пра стан", + "Health: organisation": "Стан: арганізацыя", + "Health: time": "Стан: час", + "Health: information": "Стан: інфармацыя", + "Health: quality": "Стан: якасць", + "Health: risk": "Стан: рызыка", + "Health: overall": "Стан: агулам", + "Health: report date": "Стан: дата справаздачы", + "The date of the newest status report": "Дата найноўшай справаздачы пра стан", + "New report": "Новая справаздача", + "Only the project owner writes status reports.": "Справаздачы пра стан піша толькі ўладальнік праекта.", + "Latest report, {date}": "Апошняя справаздача, {date}", + "Aspect": "Аспект", + "Note": "Заўвага", + "Report history": "Гісторыя справаздач", + "Author": "Аўтар", + "No status reports yet": "Справаздач пра стан яшчэ няма", + "Write the first report": "Напісаць першую справаздачу", + "Choose a status for every aspect to save the report.": "Выберыце стан для кожнага аспекта, каб захаваць справаздачу.", + "Suggested: on track.": "Прапанова: па плане.", + "Suggested: at risk.": "Прапанова: пад пагрозай.", + "Suggested: off track.": "Прапанова: па-за планам.", + "1 task is past its due date.": "1 задача пратэрмінавана.", + "{count} tasks are past their due date.": "Пратэрмінаваных задач: {count}.", + "The end date has passed with 1 open task.": "Дата заканчэння мінула, адкрыта 1 задача.", + "The end date has passed with {count} open tasks.": "Дата заканчэння мінула, адкрытых задач: {count}.", + "No open task is past its due date.": "Ніводная адкрытая задача не пратэрмінавана.", + "The highest open risk, \"{title}\", scores {score}.": "Найвышэйшая адкрытая рызыка, «{title}», мае ацэнку {score}.", + "There are no open risks.": "Адкрытых рызык няма.", + "Costs are at {percent}% of the budget.": "Выдаткі складаюць {percent}% бюджэту.", + "No suggestion: the project has no budget.": "Няма прапановы: у праекта няма бюджэту.", + "No suggestion: no costs are recorded for this project yet.": "Няма прапановы: па гэтым праекце яшчэ не ўлічаны выдаткі.", + "The report was not saved. Only the project owner can write status reports.": "Справаздача не захавана. Справаздачы пра стан можа пісаць толькі ўладальнік праекта.", + "No report": "Няма справаздачы", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Група праектаў, якімі кіруюць адны і тыя ж людзі, напрыклад аддзел або праграма. Яе кіраўнікі чытаюць кожны праект у ёй.", + "The name of the portfolio": "Назва партфеля", + "What the portfolio holds and who runs it": "Што ўваходзіць у партфель і хто ім кіруе", + "A colour for the portfolio's section in project lists": "Колер раздзела партфеля ў спісах праектаў", + "Managers": "Кіраўнікі", + "Nextcloud user UIDs of the people who run the portfolio": "Ідэнтыфікатары карыстальнікаў Nextcloud, якія кіруюць партфелем", + "Order": "Парадак", + "Where the portfolio comes in project lists, lowest first": "Месца партфеля ў спісах праектаў, спачатку найменшы", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Уласная шкала рызык гэтага партфеля ў фармаце JSON, у той жа форме, што і шкала ўсёй праграмы. Пуста азначае шкалу праграмы.", + "Portfolio readers": "Чытачы партфеля", + "Nextcloud user UIDs of the managers of the project's portfolio": "Ідэнтыфікатары карыстальнікаў Nextcloud кіраўнікоў партфеля праекта", + "The portfolio this project belongs to": "Партфель, да якога належыць праект", + "No portfolio": "Без партфеля", + "All portfolios": "Усе партфелі", + "You read this project as a manager of its portfolio. Only its members change it.": "Вы чытаеце гэты праект як кіраўнік яго партфеля. Змяняюць яго толькі ўдзельнікі.", + "Portfolios": "Партфелі", + "Portfolio status": "Стан партфеля", + "No portfolios yet": "Партфеляў пакуль няма", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Адміністратар дадае партфелі ў раздзеле Праекты, Партфелі. Праекты партфеля пералічаны тут з іх станам.", + "Roll-up": "Зводка", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} па плане, {atRisk} пад пагрозай, {offTrack} па-за планам, {noReport} без справаздачы", + "No project in this portfolio that you can read.": "У гэтым партфелі няма праекта, які вы можаце чытаць.", + "Start": "Пачатак", + "End": "Канец", + "Budget": "Бюджэт", + "Last report": "Апошняя справаздача", + "Out of date": "Састарэла", + "Portfolio timeline": "Часавая шкала партфеля", + "Zoom": "Маштаб", + "Could not load the timeline": "Не ўдалося загрузіць часавую шкалу", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Адміністратар дадае партфелі ў раздзеле Праекты, Партфелі. Праекты партфеля паказаны тут на адной часавай шкале.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Адкрыйце праект, каб убачыць яго фазы і задачы. Часавая шкала толькі для чытання.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Прапушчаны, бо вы не можаце іх чытаць: {count} праектаў", + "Week": "Тыдзень", + "Day": "Дзень", + "Month": "Месяц", + "Please try again later.": "Паспрабуйце пазней.", + "Status reports": "Справаздачы аб стане", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Праз колькі дзён апошняя справаздача аб стане праекта пазначаецца як састарэлая ў аглядзе партфеля", + "Reporting period (days)": "Справаздачны перыяд (дні)", + "The reporting period is a whole number of days from 1 to 365.": "Справаздачны перыяд — цэлая колькасць дзён ад 1 да 365.", + "Reporting period saved": "Справаздачны перыяд захаваны", + "The reporting period was not saved. Please try again.": "Справаздачны перыяд не захаваны. Паспрабуйце яшчэ раз.", + "Every project of a portfolio with its status per aspect, rolled up.": "Кожны праект партфеля са станам па аспектах, зводна.", + "The projects of a portfolio on one timeline.": "Праекты партфеля на адной часавай шкале.", + "Phases": "Фазы", + "Add phase": "Дадаць фазу", + "No phases yet": "Фаз пакуль няма", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Падзяліце праект на фазы, напрыклад ініцыяцыя, вызначэнне і рэалізацыя. Фаза закрываецца, калі загружаны яе выніковы дакумент.", + "{hours} hours": "{hours} гадз", + "Concluding document: {title}": "Выніковы дакумент: {title}", + "Concluding document missing": "Няма выніковага дакумента", + "Move {title} up": "Перамясціць {title} уверх", + "Move {title} down": "Перамясціць {title} уніз", + "Close phase": "Закрыць фазу", + "Phase": "Фаза", + "Files": "Файлы", + "Notes": "Нататкі", + "Audit trail": "Журнал аўдыту", + "Edit phase": "Рэдагаваць фазу", + "Name": "Назва", + "Budget hours": "Гадзіны па бюджэце", + "Could not save the phase. Please try again.": "Не ўдалося захаваць фазу. Паспрабуйце яшчэ раз.", + "Close phase {title}": "Закрыць фазу {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фаза закрываецца выніковым дакументам: загрузіце яго тут або выберыце адзін з файлаў фазы.", + "Concluding document": "Выніковы дакумент", + "This phase has no files yet.": "У гэтай фазы пакуль няма файлаў.", + "Upload a document": "Загрузіць дакумент", + "The document was not uploaded. Please try again.": "Дакумент не загружаны. Паспрабуйце яшчэ раз.", + "Upload the concluding document before you close this phase.": "Загрузіце выніковы дакумент, перш чым закрыць гэту фазу.", + "This phase cannot be closed from its current status.": "Гэту фазу нельга закрыць з яе цяперашняга статусу.", + "The phase was not closed. Please try again.": "Фаза не закрыта. Паспрабуйце яшчэ раз.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID файла гэтай фазы, які яе закрывае. Фазу можна завяршыць, толькі калі ён зададзены і файл прымацаваны.", + "Import from Microsoft Project": "Імпарт з Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Выберыце план, захаваны з Microsoft Project у фармаце XML. Нічога не імпартуецца, пакуль вы не пацвердзіце.", + "Plan file": "Файл плана", + "What the import creates": "Што створыць імпарт", + "Tasks": "Задачы", + "Sub-tasks": "Падзадачы", + "Milestones": "Вехі", + "Links": "Сувязі", + "Already imported, updated in place: {count}": "Ужо імпартаваныя, абноўленыя на месцы: {count}", + "What does not carry over": "Што не пераносіцца", + "Tasks with resources, which are not imported: {count}": "Задачы з рэсурсамі, якія не імпартуюцца: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Задачы глыбей за ўзровень 3, змешчаныя пад сваёй задачай узроўню 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Сувязі, адрозныя ад заканчэнне-пачатак, імпартаваныя як звязаныя: {count}", + "Link lags, which are dropped: {count}": "Затрымкі сувязей, якія адкідаюцца: {count}", + "Links to a summary task, which are not imported: {count}": "Сувязі з выніковай задачай, якія не імпартуюцца: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Сувязі з задачамі па-за гэтым планам, якія не імпартуюцца: {count}", + "No longer in the plan": "Больш няма ў плане", + "These stay in the project; remove them yourself if they are no longer needed.": "Яны застаюцца ў праекце; выдаліце іх самі, калі яны больш не патрэбныя.", + "Import": "Імпартаваць", + "Close": "Закрыць", + "The plan is imported: {created} created, {updated} updated.": "План імпартаваны: створана {created}, абноўлена {updated}.", + "Links that would close a loop were left out: {count}": "Сувязі, якія замкнулі б цыкл, прапушчаны: {count}", + "The import stopped part-way. Run it again to finish it.": "Імпарт спыніўся на паўдарозе. Запусціце яго зноў, каб завяршыць.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Захавайце план у Microsoft Project праз Файл, Захаваць як, фармат XML, і імпартуйце гэты файл.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Гэты файл аб'яўляе DOCTYPE або сутнасці, якія не прымаюцца.", + "The file is larger than 10 MB.": "Файл большы за 10 МБ.", + "The plan has more than 2,000 tasks, more than one import takes.": "У плане больш за 2000 задач, больш, чым прымае адзін імпарт.", + "This file is not a Microsoft Project plan in XML format.": "Гэты файл не з'яўляецца планам Microsoft Project у фармаце XML.", + "Choose a file to import.": "Выберыце файл для імпарту.", + "Only the project owner can import a plan.": "Толькі ўладальнік праекта можа імпартаваць план.", + "The plan could not be read. Please try again.": "Не ўдалося прачытаць план. Паспрабуйце яшчэ раз.", + "Linked case: {title}": "Звязаная справа: {title}", + "Linked to a case": "Звязана са справай", + "Hand over to case": "Перадаць у справу", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Капіюе без змен кожны файл праекта і яго задач, а таксама файл з апісаннем праекта, у звязаную справу.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Скапіявана файлаў: {count}", + "Files that failed: {names}": "Файлы з памылкай: {names}", + "The handover failed. Please try again.": "Перадача не ўдалася. Паспрабуйце яшчэ раз.", + "The linked case could not be found, or you cannot open it.": "Звязаную справу не знойдзена, або вы не можаце яе адкрыць.", + "Case handovers": "Перадачы ў справу", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Кожная перадача файлаў і метаданых праекта ў яго справу: калі, кім, у якую справу, кожны скапіяваны файл з яго SHA-256 і файлы з памылкай.", + "Finance": "Фінансы", + "Add cost line": "Дадаць радок выдаткаў", + "Delivery terms": "Умовы пастаўкі", + "Billing model": "Мадэль аплаты", + "Budget in euro": "Бюджэт у еўра", + "Budget in hours": "Бюджэт у гадзінах", + "Hourly rate in euro": "Пагадзінная стаўка ў еўра", + "Planned start": "Запланаваны пачатак", + "Planned end": "Запланаваны канец", + "Planned dates": "Запланаваныя даты", + "Budget {amount}": "Бюджэт {amount}", + "No budget agreed": "Бюджэт не ўзгоднены", + "Hours": "Гадзіны", + "Only the project owner and the portfolio managers see the amounts.": "Сумы бачаць толькі ўладальнік праекта і менеджары партфеля.", + "Budget against cost per category": "Бюджэт і выдаткі па катэгорыях", + "Labour (booked time)": "Праца (улічаны час)", + "No category": "Без катэгорыі", + "Hours are not available": "Гадзіны недаступныя", + "Not yet assigned to a category": "Яшчэ не аднесена да катэгорыі", + "Total": "Разам", + "{spent} spent, {remaining} remaining": "{spent} выдаткавана, {remaining} засталося", + "Budget against cost per phase": "Бюджэт і выдаткі па фазах", + "No phase": "Без фазы", + "Cost lines": "Радкі выдаткаў", + "From the finance system": "З фінансавай сістэмы", + "Edit cost line {amount}": "Змяніць радок выдаткаў {amount}", + "No cost lines yet": "Радкоў выдаткаў пакуль няма", + "Commitments": "Абавязацельствы", + "Actual cost": "Фактычныя выдаткі", + "Forecast": "Прагноз", + "Remaining": "Засталося", + "Not planned yet": "Яшчэ не запланавана", + "{start} to {end}": "з {start} па {end}", + "The terms were not saved. Please try again.": "Умовы не захаваны. Паспрабуйце яшчэ раз.", + "Terms saved": "Умовы захаваны", + "Fixed price": "Фіксаваная цана", + "Hourly": "Пагадзінна", + "Not billed": "Без рахунку", + "Commitment": "Абавязацельства", + "Edit cost line": "Змяніць радок выдаткаў", + "Kind": "Від", + "Amount in euro": "Сума ў еўра", + "Remove": "Выдаліць", + "Could not save the cost line. Only the project owner changes the money of a project.": "Не ўдалося захаваць радок выдаткаў. Грошы праекта змяняе толькі ўладальнік праекта.", + "Could not remove the cost line. Please try again.": "Не ўдалося выдаліць радок выдаткаў. Паспрабуйце яшчэ раз.", + "{amount} over budget": "{amount} звыш бюджэту", + "Cost categories": "Катэгорыі выдаткаў", + "The categories every project splits its budget and costs into, one per line": "Катэгорыі, на якія кожны праект дзеліць свой бюджэт і выдаткі, па адной у радку", + "Categories": "Катэгорыі", + "Give at least one category, each name once.": "Укажыце хаця б адну катэгорыю, кожную назву адзін раз.", + "Cost categories saved": "Катэгорыі выдаткаў захаваны", + "The cost categories were not saved. Please try again.": "Катэгорыі выдаткаў не захаваны. Паспрабуйце яшчэ раз.", + "Finance line": "Фінансавы радок", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Адна грашовая сума праекта: бюджэт, абавязацельства, фактычныя выдаткі або прагноз, у катэгорыі выдаткаў і пры патрэбе ў фазе. Уводзіць уладальнік праекта або дасылае фінансавая сістэма праз праграму інтэграцыі.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Праект, да якога адносіцца сума. Пуста для радка з фінансавай сістэмы, нумар праекта якога не супадае ні з адным праектам.", + "The phase this amount belongs to, if any": "Фаза, да якой адносіцца сума, калі ёсць", + "The cost category, one of the categories the admin set up": "Катэгорыя выдаткаў, адна з катэгорый, зададзеных адміністратарам", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Ці з'яўляецца сума бюджэтам, абавязацельствам, фактычнымі выдаткамі або прагнозам", + "Amount": "Сума", + "The amount in the reporting currency (euro)": "Сума ў валюце справаздачнасці (еўра)", + "The date the amount was booked or is expected": "Дата, калі сума праведзена або чакаецца", + "What the amount is for": "На што гэта сума", + "Whether a person entered the line or the finance system sent it": "Ці ўвёў радок чалавек, ці яго даслала фінансавая сістэма", + "Entered by hand": "Уведзена ўручную", + "Finance line id": "Ідэнтыфікатар фінансавага радка", + "The finance system's own id of this line. One imported line per id.": "Уласны ідэнтыфікатар радка ў фінансавай сістэме. Адзін імпартаваны радок на ідэнтыфікатар.", + "Project number": "Нумар праекта", + "The project number the finance system sent, matched against the project key": "Нумар праекта з фінансавай сістэмы, звераны з ключом праекта", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Партфель праекта радка, скапіяваны з праекта, каб выніках партфеля хапала аднаго фільтра", + "Finance readers": "Чытачы фінансаў", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID карыстальнікаў Nextcloud, якім дазволена бачыць суму: уладальнік праекта і менеджары яго партфеля", + "Project owner": "Уладальнік праекта", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID карыстальніка Nextcloud, уладальніка праекта, які можа змяняць і выдаляць ручныя радкі", + "How the client pays: not billed, a fixed price, or by the hour.": "Як плаціць кліент: без рахунку, фіксаваная цана або пагадзінна.", + "Portfolio finance": "Фінансы партфеля", + "You cannot see the money of any project in this portfolio": "Вы не бачыце грошай ніводнага праекта ў гэтым партфелі", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Сервер вярнуў радкі выдаткаў праектаў па-за гэтым партфелем, таму вынікі могуць быць памылковымі.", + "Projects left out because you cannot see their money: {count}": "Прапушчана праектаў, чые грошы вам не бачныя: {count}", + "Unmatched finance lines": "Незвязаныя фінансавыя радкі", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Бюджэт, абавязацельствы, фактычныя выдаткі і прагноз у суме па партфелі.", + "Subprojects": "Падпраекты", + "{done} of {total}": "{done} з {total}", + "{done} of {total} tasks done, including subprojects": "Выканана {done} з {total} задач, разам з падпраектамі", + "Show the subprojects of {title}": "Паказаць падпраекты {title}", + "Hide the subprojects of {title}": "Схаваць падпраекты {title}", + "Part of": "Уваходзіць у", + "No parent project": "Без бацькоўскага праекта", + "A project cannot sit under one of its own subprojects.": "Праект не можа знаходзіцца пад адным са сваіх падпраектаў.", + "Projects nest three levels deep at most: programme, project and subproject.": "Праекты ўкладаюцца не глыбей за тры ўзроўні: праграма, праект і падпраект.", + "Parent project": "Бацькоўскі праект", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Праект, пад якім знаходзіцца гэты праект, напрыклад праграма. Праекты ўкладаюцца не глыбей за тры ўзроўні.", + "Yes": "Так", + "No": "Не", + "{label} (required)": "{label} (абавязкова)", + "{label} is required": "Поле «{label}» абавязковае", + "Project field": "Поле праекта", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поле, якое адміністратар дадае да кожнага праекта, напрыклад сфера палітыкі або кошт дамовы.", + "Key": "Ключ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Пастаянная назва, пад якой захоўваецца значэнне, у lower camel case. Не змяняйце яе, калі праекты яе выкарыстоўваюць.", + "Label": "Подпіс", + "The name people see next to the field": "Назва каля поля", + "What the field holds": "Што змяшчае поле", + "Text": "Тэкст", + "Number": "Лік", + "Choice": "Выбар", + "Person": "Асоба", + "Yes or no": "Так або не", + "Options": "Варыянты", + "The choices of a choice field": "Варыянты поля выбару", + "Required": "Абавязковае", + "Whether a project must fill in the field": "Ці павінен праект запоўніць поле", + "Where the field appears, lowest first": "Дзе з'яўляецца поле, меншае першым", + "Applies to": "Адносіцца да", + "What the field is added to": "Да чаго дадаецца поле", + "Custom fields": "Уласныя палі", + "The values of the project fields an admin defined, keyed by the field's key.": "Значэнні палёў праекта, вызначаных адміністратарам, па ключы поля.", + "Project fields": "Палі праекта", + "Related": "Звязаныя", + "Remove link": "Выдаліць сувязь", + "Link type": "Тып сувязі", + "Relates to": "Звязана з", + "Duplicates": "Дублюе", + "Project key": "Ключ праекта", + "Every task number starts with it, such as VERG-42.": "З яго пачынаецца кожны нумар задачы, напрыклад VERG-42.", + "This key is already used by another project.": "Гэты ключ ужо выкарыстоўвае іншы праект.", + "Use 2 to 10 letters and digits, starting with a letter.": "Выкарыстоўвайце ад 2 да 10 літар і лічбаў, пачынаючы з літары.", + "The key cannot change once tasks carry it.": "Ключ нельга змяніць, калі задачы ўжо яго маюць.", + "Project saved. The existing tasks get their numbers in the background.": "Праект захаваны. Існуючыя задачы атрымліваюць нумары ў фонавым рэжыме.", + "Next task number": "Нумар наступнай задачы", + "The number the next task of this project gets in its key. Only the system writes it.": "Нумар, які наступная задача гэтага праекта атрымлівае ў сваім ключы. Яго запісвае толькі сістэма.", + "Restore {title}": "Аднавіць {title}", + "Restore": "Аднавіць", + "Project restored": "Праект адноўлены", + "Could not restore the project": "Не ўдалося аднавіць праект", + "Bring this project back to the active list.": "Вярнуць гэты праект у спіс актыўных праектаў.", + "Restore project": "Аднавіць праект", + "Request reason": "Прычына запыту", + "Why the requester needs this project. Filled in when the project is requested.": "Навошта заяўніку гэты праект. Запаўняецца пры запыце.", + "Reviewed by": "Разгледжана", + "The user who approved or rejected the request.": "Карыстальнік, які адобрыў або адхіліў запыт.", + "Reviewed at": "Дата разгляду", + "When the request was approved or rejected.": "Калі запыт быў адобраны або адхілены.", + "Review note": "Заўвага рэцэнзента", + "The reviewer's reason, shown to the requester when a request is not approved.": "Прычына рэцэнзента, якую бачыць заяўнік, калі запыт не адобраны.", + "Members of these groups": "Удзельнікі гэтых груп", + "Groups that may create projects": "Групы, якім можна ствараць праекты", + "The group {group} no longer exists. Save to remove it.": "Групы {group} больш не існуе. Захавайце, каб прыбраць яе.", + "Review project request": "Разгледзець запыт на праект", + "Requested by": "Запытаў", + "Why it is needed": "Навошта ён патрэбны", + "Desired start date": "Пажаданая дата пачатку", + "Why is it not approved?": "Чаму не адобрана?", + "Give a reason. The requester sees it.": "Пакажыце прычыну. Заяўнік яе ўбачыць.", + "Approve": "Адобрыць", + "Reject": "Адхіліць", + "Reject request": "Адхіліць запыт", + "The review was not saved. Try again.": "Рашэнне не захавана. Паспрабуйце яшчэ раз.", + "This project is waiting for review": "Гэты праект чакае разгляду", + "This request was not approved": "Гэты запыт не адобраны", + "Reason: {note}": "Прычына: {note}", + "Review request": "Разгледзець запыт", + "Request a project": "Запытаць праект", + "Step {step} of 2": "Крок {step} з 2", + "Why is this project needed?": "Навошта патрэбны гэты праект?", + "Give a reason. The reviewer reads it.": "Пакажыце прычыну. Рэцэнзент яе прачытае.", + "Back": "Назад", + "Next": "Далей", + "Send request": "Адправіць запыт", + "The request was not sent. Try again.": "Запыт не адпраўлены. Паспрабуйце яшчэ раз.", + "Requested": "Запытаны", + "Not approved": "Не адобраны", + "Your request was sent": "Ваш запыт адпраўлены", + "Let everyone else request a project": "Дазволіць усім астатнім запытваць праект", + "Add a task": "Дадаць задачу", + "Delete task": "Выдаліць задачу", + "Edit task": "Рэдагаваць задачу", + "Write": "Пісаць", + "Preview": "Папярэдні прагляд", + "Markdown works here: headings, lists and links.": "Тут працуе Markdown: загалоўкі, спісы і спасылкі.", + "Could not save the task. Please try again.": "Не ўдалося захаваць задачу. Паспрабуйце яшчэ раз.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Па задачы \"{title}\" улічаны час, таму яе нельга выдаліць. Замест гэтага яе можна скасаваць: запісы часу застануцца.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Выдаліць \"{title}\"? Яе сувязі з іншымі задачамі таксама будуць выдалены. Гэта нельга адмяніць.", + "Keep task": "Пакінуць задачу", + "Cancel task": "Скасаваць задачу", + "Only the reporter, the project owner or an admin can delete this task.": "Выдаліць гэтую задачу можа толькі аўтар, уладальнік праекта або адміністратар.", + "Could not delete the task. Please try again.": "Не ўдалося выдаліць задачу. Паспрабуйце яшчэ раз.", + "Could not cancel the task. Please try again.": "Не ўдалося скасаваць задачу. Паспрабуйце яшчэ раз.", + "Responsible": "Адказны", + "Also working on this": "Таксама працуюць над гэтым", + "Labels": "Меткі", + "Could not change the priority. Please try again.": "Не ўдалося змяніць прыярытэт. Паспрабуйце яшчэ раз.", + "Other project members who work on this task alongside the person responsible.": "Іншыя ўдзельнікі праекта, якія працуюць над задачай разам з адказным.", + "Duplicate": "Дубляваць", + "Could not copy the task. Please try again.": "Не ўдалося скапіяваць задачу. Паспрабуйце яшчэ раз.", + "Subtasks": "Падзадачы", + "{done} of {total} done": "Выканана {done} з {total}", + "Add a subtask": "Дадаць падзадачу", + "Checklist": "Чэк-ліст", + "Checklist item actions": "Дзеянні з пунктам чэк-ліста", + "Add a checklist item": "Дадаць пункт чэк-ліста", + "Subtasks: {estimate} estimated, {logged} logged": "Падзадачы: ацэнка {estimate}, улічана {logged}", + "Total estimate: {total}": "Агульная ацэнка: {total}", + "Part of {title}": "Частка задачы {title}", + "Checklist: {count} done": "Чэк-ліст: выканана {count}", + "This task has subtasks: {count}.": "У гэтай задачы ёсць падзадачы: {count}.", + "Keep subtasks as separate tasks": "Пакінуць падзадачы асобнымі задачамі", + "Delete subtasks too": "Выдаліць і падзадачы", + "Copy of {title}": "Копія: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Задача скапіявана, але не ўсе яе падзадачы. Праверце копію.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Невялікія крокі ўнутры задачы. У кожнага пункта ёсць id, тэкст і адзнака аб выкананні.", + "Open work per person and per project.": "Адкрытая праца па людзях і па праектах.", + "View": "Выгляд", + "By person": "Па людзях", + "By project": "Па праектах", + "Hours left": "Засталося гадзін", + "Tasks without an estimate": "Задачы без ацэнкі", + "Due in 14 days": "Тэрмін на працягу 14 дзён", + "Shared": "Агульныя", + "Unassigned": "Не прызначаныя", + "{hours} h": "{hours} г", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Паказана праца ў праектах, якія вы можаце бачыць. Гадзіны ўлічваюцца для адказнага; агульныя задачы ўлічваюцца без гадзін.", + "No open work in these projects.": "У гэтых праектах няма адкрытай працы.", + "Open work": "Адкрытая праца", + "{count} open tasks": "Адкрытых задач: {count}", + "Create a project to see capacity here.": "Стварыце праект, каб убачыць тут загрузку.", + "My tasks": "Мае задачы", + "Show all my tasks": "Паказаць усе мае задачы", + "No tasks assigned to you": "Вам не прызначана ніводнай задачы", + "Browse projects": "Праглядзець праекты", + "Later": "Пазней", + "Due {date}": "Тэрмін {date}", + "Could not change the status. Please try again.": "Не ўдалося змяніць статус. Паспрабуйце яшчэ раз.", + "Completed today": "Завершана сёння", + "My open tasks": "Мае адкрытыя задачы", + "My overdue tasks": "Мае пратэрмінаваныя задачы", + "My tasks in progress": "Мае задачы ў рабоце", + "Pin to the top": "Замацаваць уверсе", + "Unpin": "Адмацаваць", + "Pinned": "Замацавана", + "Actions for {title}": "Дзеянні для {title}", + "Could not save your project order. Please try again.": "Не ўдалося захаваць парадак вашых праектаў. Паспрабуйце яшчэ раз.", + "No boards yet": "Дошак пакуль няма", + "Create a project to get a board.": "Стварыце праект, каб атрымаць дошку.", + "Use the Projects page to create and manage your projects and tasks.": "Стварайце праекты і задачы і кіруйце імі на старонцы «Праекты».", + "Go to projects": "Да праектаў", + "You are not a member of any projects yet.": "Вы пакуль не ўдзельнік ніводнага праекта.", + "Could not search for users. Please try again.": "Не ўдалося знайсці карыстальнікаў. Паспрабуйце яшчэ раз.", + "Project creation is restricted to administrators.": "Ствараць праекты могуць толькі адміністратары.", + "Only the project owner or an administrator can delete this project.": "Выдаліць гэты праект можа толькі ўладальнік праекта або адміністратар.", + "No projects are available to you yet. Ask an administrator to create one.": "Вам пакуль не даступны ніводзін праект. Папрасіце адміністратара стварыць праект.", + "Due: {date}": "Тэрмін: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Задачы з датай пачатку або тэрмінам паказваюцца на часавай шкале. Дадайце даты, каб убачыць іх тут.", + "You do not have access to this project.": "У вас няма доступу да гэтага праекта.", + "Zoom level": "Маштаб", + "Unscheduled": "Не запланаваныя", + "Start: {date}": "Пачатак: {date}", + "Today": "Сёння", + "No scheduled tasks": "Няма запланаваных задач", + "An unexpected error occurred.": "Адбылася нечаканая памылка.", + "Column {number} name": "Назва слупка {number}", + "Failed to save creation policy": "Не ўдалося захаваць правіла стварэння", + "All authenticated users": "Усе карыстальнікі, якія ўвайшлі", + "Control who may create new projects": "Вызначце, хто можа ствараць новыя праекты", + "Administrators only": "Толькі адміністратары", + "Project creation": "Стварэнне праектаў", + "Allow project creation": "Дазволіць стварэнне праектаў", + "Creation policy saved successfully": "Правіла стварэння захавана", + "Initializing…": "Запуск…", + "e.g. 2h 30m, 90m, 1.5h": "напр. 2h 30m, 90m, 1.5h", + "Log time": "Улічыць час", + "Save estimate": "Захаваць ацэнку", + "Logged: {logged}": "Улічана: {logged}", + "over by {amount}": "перавышана на {amount}", + "Time tracking": "Улік часу", + "Estimate": "Ацэнка", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Увядзіце карэктную ацэнку (напр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Увядзіце карэктную працягласць (напр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Не ўдалося захаваць запіс часу. Паспрабуйце яшчэ раз.", + "Edit time entry": "Змяніць запіс часу", + "Duration": "Працягласць", + "Date range": "Перыяд", + "Last week": "Мінулы тыдзень", + "No time logged": "Час не ўлічаны", + "Log time on a task to see it here.": "Улічыце час у задачы, каб убачыць яго тут.", + "To date": "Па дату", + "This week": "Гэты тыдзень", + "Total: {total}": "Разам: {total}", + "From date": "З даты", + "Custom range": "Свой перыяд", + "All time": "За ўвесь час", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Не ўдалося выдаліць задачу, таму даныя маглі застацца. Выдаліце праект яшчэ раз.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Не ўдалося выдаліць запіс часу, таму даныя маглі застацца. Выдаліце праект яшчэ раз.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Не ўдалося выдаліць слупок, таму даныя маглі застацца. Выдаліце праект яшчэ раз.", + "Could not delete the project. Please try again.": "Не ўдалося выдаліць праект. Паспрабуйце яшчэ раз.", + "Notification settings": "Налады апавяшчэнняў", + "Configure when due-date reminders are sent": "Вызначце, калі адпраўляюцца напаміны пра тэрміны", + "Due-date reminder lead time (hours)": "Загадзя для напаміну (гадзіны)", + "Lead time must be between 1 and 336 hours": "Загадзя павінна быць ад 1 да 336 гадзін", + "Reminder lead time saved successfully": "Загадзя для напаміну захавана", + "Failed to save reminder lead time": "Не ўдалося захаваць загадзя для напаміну", + "Notifications": "Апавяшчэнні", + "Notify me 1 day before a task's due date": "Апавяшчаць мяне за 1 дзень да тэрміну задачы", + "Draft": "Чарнавік", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Ці ёсць урок чарнавіком, які бачыць толькі яго настаўнік, ці адбудзецца ён, ці адменены.", + "New release": "Новы выпуск", + "Roadmap chart. The same releases and epics are listed below.": "Дыяграма дарожнай карты. Тыя ж выпускі і эпікі пералічаны ніжэй.", + "Nothing on the roadmap yet": "На дарожнай карце яшчэ нічога няма", + "Releases with a target date and epics with dated tasks appear here.": "Тут з'яўляюцца выпускі з мэтавай датай і эпікі з задачамі, якія маюць дату.", + "Releases": "Выпускі", + "No releases yet": "Яшчэ няма выпускаў", + "Target date: {date}": "Мэтавая дата: {date}", + "No target date": "Без мэтавай даты", + "Edit {name}": "Рэдагаваць {name}", + "Mark {name} as released": "Пазначыць {name} як выпушчаны", + "Mark as released": "Пазначыць як выпушчаны", + "Epics": "Эпікі", + "No epics yet. Open a task to make it an epic.": "Яшчэ няма эпікаў. Адкрыйце задачу, каб зрабіць яе эпікам.", + "Not scheduled yet": "Яшчэ не запланавана", + "Planned": "Запланавана", + "Released": "Выпушчана", + "Edit release": "Рэдагаваць выпуск", + "Target date": "Мэтавая дата", + "Could not save the release. Please try again.": "Не ўдалося захаваць выпуск. Паспрабуйце яшчэ раз.", + "Every task of this release is done or cancelled.": "Кожная задача гэтага выпуску выканана або скасавана.", + "Not finished yet: {count}": "Яшчэ не завершана: {count}", + "What happens to these tasks?": "Што будзе з гэтымі задачамі?", + "Move to {name}": "Перамясціць у {name}", + "Remove the release": "Прыбраць выпуск", + "Keep it on {name}": "Пакінуць іх у {name}", + "Could not mark the release as released. Please try again.": "Не ўдалося пазначыць выпуск як выпушчаны. Паспрабуйце яшчэ раз.", + "Roadmap": "Дарожная карта", + "Tasks or roadmap": "Задачы або дарожная карта", + "Release": "Выпуск", + "Epic": "Эпік", + "This task is an epic": "Гэта задача з'яўляецца эпікам", + "A named, dated delivery of a project that its tasks are planned against.": "Названая пастаўка праекта з датай, пад якую плануюцца яго задачы.", + "Name of the release": "Назва выпуску", + "The project this release belongs to": "Праект, да якога належыць гэты выпуск", + "What this release delivers": "Што пастаўляе гэты выпуск", + "When work on the release starts": "Калі пачынаецца праца над выпускам", + "The date the release is due": "Дата, да якой выпуск павінен быць гатовы", + "Whether the release is planned, released or archived": "Ці выпуск запланаваны, выпушчаны ці архіваваны", + "Released on": "Выпушчана", + "When the release was marked as released": "Калі выпуск пазначылі як выпушчаны", + "The release this task is planned for": "Выпуск, на які запланавана гэта задача", + "Board view options": "Параметры выгляду дошкі", + "Colour cards": "Афарбаваць карткі", + "No colour": "Без колеру", + "By label": "Па метцы", + "Swimlanes": "Дарожкі", + "No swimlanes": "Без дарожак", + "By assignee": "Па выканаўцы", + "By epic": "Па эпіку", + "No assignee": "Не прызначана", + "No epic": "Без эпіка", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Карткі застаюцца ў радку свайго эпіка. Змяніце эпік на старонцы задачы.", + "Hand over to": "Перадаць", + "Could not save your board view. It applies until you reload.": "Выгляд дошкі не захаваны. Ён дзейнічае да перазагрузкі.", + "Timetable wish": "Пажаданне да раскладу", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Пажаданне, якое ўлічвае генератар. Жорсткае пажаданне ён выконвае заўсёды, мяккае, дзе можа.", + "Whether the wish is about a teacher, a group, a room or one activity": "Ці датычыць пажаданне настаўніка, групы, памяшкання ці аднаго занятку", + "Teacher": "Настаўнік", + "Group": "Група", + "Reference": "Спасылка", + "The user, group, room or activity the wish is about": "Карыстальнік, група, памяшканне ці занятак, якіх датычыць пажаданне", + "What the wish asks for": "Чаго просіць пажаданне", + "Not on these periods": "Не ў гэтыя ўрокі", + "Preferably not on these periods": "Лепш не ў гэтыя ўрокі", + "At most a number of lessons a day": "Не больш за пэўную колькасць урокаў у дзень", + "No free periods between lessons": "Без вокнаў паміж урокамі", + "Always the same room": "Заўсёды тое самае памяшканне", + "Periods": "Урокі", + "The periods of the week the wish is about, such as wed-5": "Урокі тыдня, якіх датычыць пажаданне, напрыклад wed-5", + "Limit": "Мяжа", + "The most lessons a day, for a wish of that kind": "Найбольшая колькасць урокаў у дзень для пажадання такога віду", + "Strength": "Сіла", + "Whether the generator must keep the wish or should keep it": "Ці мусіць генератар выканаць пажаданне, ці пажадана", + "Hard": "Жорсткае", + "Soft": "Мяккае", + "Weight": "Вага", + "How much a soft wish counts, from 1 to 3": "Колькі важыць мяккае пажаданне, ад 1 да 3", + "Why the wish exists": "Навошта існуе пажаданне", + "Timetable scenario": "Сцэнарый раскладу", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Адзін тыднёвы шаблон, створаны генератарам або ўзяты з цяперашняга раскладу. Ён захоўвае свае ўваходныя даныя і тое, як добра выконвае пажаданні.", + "The name timetablers know the scenario by": "Назва, пад якой складальнікі ведаюць сцэнарый", + "Whether the generator made it or it came from the current timetable": "Ці стварыў яго генератар, ці ён узяты з цяперашняга раскладу", + "Generated": "Згенераваны", + "From the current timetable": "З цяперашняга раскладу", + "Week of": "Тыдзень з", + "The Monday of the first week of the window": "Панядзелак першага тыдня перыяду", + "Window start": "Пачатак перыяду", + "The first day the week pattern applies to": "Першы дзень, да якога дастасоўваецца тыднёвы шаблон", + "Window end": "Канец перыяду", + "The last day the week pattern applies to": "Апошні дзень, да якога дастасоўваецца тыднёвы шаблон", + "Waiting, generating, done, failed, or published as draft lessons": "Чакае, ствараецца, гатовы, не ўдаўся або апублікаваны як чарнавыя ўрокі", + "Waiting": "Чакае", + "Generating": "Ствараецца", + "Failed": "Не ўдаўся", + "Published": "Апублікаваны", + "Seed": "Пачатковы лік", + "The number the generator starts from, so a run can be repeated": "Лік, з якога пачынае генератар, каб запуск можна было паўтарыць", + "Input": "Уваходныя даныя", + "The periods, rooms, lessons and wishes the scenario was made from": "Урокі, памяшканні, заняткі і пажаданні, з якіх зроблены сцэнарый", + "Placements": "Размяшчэнні", + "Each lesson with the period and room it was given": "Кожны занятак з атрыманымі ўрокам і памяшканнем", + "Unplaced lessons": "Неразмешчаныя заняткі", + "Lessons without a place, each with the hard wish that blocked it": "Заняткі без месца, кожны з жорсткім пажаданнем, якое яго спыніла", + "Broken wishes": "Парушаныя пажаданні", + "The wishes this scenario breaks, with the lessons that break them": "Пажаданні, якія парушае гэты сцэнарый, з заняткамі, што іх парушаюць", + "Measures": "Паказчыкі", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Размешчаныя заняткі, парушаныя пажаданні, вокны настаўнікаў, урокі ў дзень і выкарыстанне памяшканняў", + "Reason": "Прычына", + "Why the run failed": "Чаму запуск не ўдаўся", + "Published at": "Апублікаваны", + "When the scenario was written out as draft lessons": "Калі сцэнарый запісаны як чарнавыя ўрокі", + "Edit wish": "Рэдагаваць пажаданне", + "New wish": "Новае пажаданне", + "Hard: the generator always keeps it": "Абавязковае: генератар заўсёды яго выконвае", + "Soft: the generator keeps it where it can": "Гнуткае: генератар выконвае яго, калі можа", + "Weight (1 to 3)": "Вага (ад 1 да 3)", + "Most lessons a day": "Не больш за столькі ўрокаў у дзень", + "Period": "Урок", + "{day} period {number}": "{day} урок {number}", + "Teacher (user name)": "Настаўнік (імя карыстальніка)", + "Activity (group:subject)": "Заняткі (група:прадмет)", + "Say who or what the wish is about.": "Пазначце, каго ці чаго датычыць пажаданне.", + "Choose at least one period.": "Выберыце хаця б адзін урок.", + "The limit is a whole number of 1 or more.": "Ліміт: цэлы лік ад 1.", + "Timetable": "Расклад", + "Wishes": "Пажаданні", + "Timetable wishes": "Пажаданні да раскладу", + "Generator run": "Запуск генератара", + "Generator progress": "Ход генератара", + "The run failed: {reason}": "Запуск не ўдаўся: {reason}", + "{placed} of {lessons} lessons placed": "Размешчана {placed} з {lessons} урокаў", + "Generate again": "Згенераваць зноў", + "Generate": "Згенераваць", + "Every lesson has a place.": "Кожны ўрок мае месца.", + "Lesson": "Урок", + "No free period and room": "Няма вольнага ўрока і кабінета", + "Broken soft wishes": "Парушаныя гнуткія пажаданні", + "Every soft wish is kept.": "Кожнае гнуткае пажаданне выканана.", + "Wish": "Пажаданне", + "Lessons": "Урокі", + "Generating: {percent}% of the time budget used": "Генерацыя: выкарыстана {percent}% часу", + "Waiting to start": "Чакае запуску", + "Published as draft lessons": "Апублікавана як чарнавікі ўрокаў", + "Could not read the scenario.": "Не ўдалося прачытаць сцэнарый.", + "Could not start the run.": "Не ўдалося пачаць запуск.", + "Scenarios": "Сцэнарыі", + "Timetable scenarios": "Сцэнарыі раскладу", + "Scenario": "Сцэнарый", + "Take the current timetable": "Узяць бягучы расклад", + "Could not take the current timetable.": "Не ўдалося ўзяць бягучы расклад.", + "Broken hard wishes": "Парушаныя абавязковыя пажаданні", + "Not on a period of the week grid": "Не на ўроку тыднёвай сеткі", + "Compare scenarios": "Параўнаць сцэнарыі", + "Scenarios to compare": "Сцэнарыі для параўнання", + "Choose two or three scenarios to compare them.": "Выберыце два ці тры сцэнарыі, каб параўнаць іх.", + "Measure": "Паказчык", + "Best": "Найлепшы", + "Lessons that differ": "Урокі, якія адрозніваюцца", + "No lesson differs.": "Ніводзін урок не адрозніваецца.", + "Not placed": "Не размешчаны", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Размешчаныя ўрокі", + "Lessons without a place": "Урокі без месца", + "Clashes": "Канфлікты", + "Hard wishes broken": "Парушаныя абавязковыя пажаданні", + "Soft wishes broken": "Парушаныя гнуткія пажаданні", + "Soft wishes broken, weighted": "Парушаныя гнуткія пажаданні, узважаныя", + "Free periods between lessons, all teachers": "Вокны, усе настаўнікі", + "Most free periods of one teacher": "Найбольш вокнаў у аднаго настаўніка", + "Most lessons of one group on a day": "Найбольш урокаў адной групы за дзень", + "Room use": "Выкарыстанне кабінетаў", + "Publish as draft lessons": "Апублікаваць як чарнавікі ўрокаў", + "Draft lessons written: {count}": "Запісана чарнавікоў урокаў: {count}", + "Could not publish the scenario.": "Не ўдалося апублікаваць сцэнарый.", + "Rules": "Правілы", + "Rules for {column}": "Правілы для {column}", + "When a card enters this column": "Калі картка трапляе ў гэты слупок", + "Action": "Дзеянне", + "Set the priority": "Задаць прыярытэт", + "Assign to": "Прызначыць", + "Assign the person who moved the card": "Прызначыць таму, хто перамясціў картку", + "Remove the assignee": "Прыбраць выканаўцу", + "Add a label": "Дадаць метку", + "No longer a project member": "Ужо не ўдзельнік праекта", + "This label no longer exists": "Гэтай меткі больш няма", + "Add rule": "Дадаць правіла", + "Remove rule": "Выдаліць правіла", + "No rules yet. Add one to change a card when it enters this column.": "Правілаў пакуль няма. Дадайце правіла, каб мяняць картку, калі яна трапляе ў гэты слупок.", + "Could not save the rules. Please try again.": "Не ўдалося захаваць правілы. Паспрабуйце яшчэ раз.", + "1 rule runs when a card enters this column": "1 правіла спрацоўвае, калі картка трапляе ў гэты слупок", + "{count} rules run when a card enters this column": "Колькасць правілаў, якія спрацоўваюць, калі картка трапляе ў гэты слупок: {count}", + "Rules applied: {changes}": "Ужытыя правілы: {changes}", + "assigned to {name}": "прызначана: {name}", + "assignee removed": "выканаўца прыбраны", + "priority {priority}": "прыярытэт {priority}", + "label {label}": "метка {label}", + "What happens to a card when it enters this column, applied in list order.": "Што адбываецца з карткай, калі яна трапляе ў гэты слупок, у парадку спіса.", + "Value": "Значэнне", + "What the rule does to the card.": "Што правіла робіць з карткай.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Прыярытэт, id карыстальніка або id меткі, якія выкарыстоўвае дзеянне; пуста для дзеянняў без значэння.", + "is not": "не", + "{dimension} is not": "{dimension} не", + "Saved filters": "Захаваныя фільтры", + "No saved filters yet": "Захаваных фільтраў пакуль няма", + "Save filter": "Захаваць фільтр", + "Rename \"{name}\"": "Перайменаваць «{name}»", + "Delete \"{name}\"": "Выдаліць «{name}»", + "Clear filters": "Ачысціць фільтры", + "Showing {shown} of {total} tasks": "Паказана {shown} з {total} задач", + "Me": "Я", + "No date": "Без даты", + "Rename saved filter": "Перайменаваць захаваны фільтр", + "Share with the project": "Абагуліць з праектам", + "Give the filter a name": "Дайце фільтру назву", + "Could not save the filter. Please try again.": "Не ўдалося захаваць фільтр. Паспрабуйце яшчэ раз.", + "Some labels in \"{name}\" no longer exist and were left out.": "Некаторых метак з «{name}» больш няма, іх прапушчана.", + "Could not delete the filter. Please try again.": "Не ўдалося выдаліць фільтр. Паспрабуйце яшчэ раз.", + "Saved filter": "Захаваны фільтр", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Названы фільтр дошкі аднаго праекта, асабісты для таго, хто яго захаваў, калі ён не абагулены з праектам.", + "The project whose board the filter applies to": "Праект, да дошкі якога адносіцца фільтр", + "The name the filter is listed under": "Назва, пад якой фільтр паказаны ў спісе", + "Saved by": "Захаваў(ла)", + "Nextcloud user id of the person who saved the filter": "Id карыстальніка Nextcloud таго, хто захаваў фільтр", + "Shared with the project": "Абагулены з праектам", + "Whether every project member sees and applies the filter": "Ці бачыць кожны ўдзельнік праекта фільтр і ці можа яго ўжыць", + "Criteria": "Крытэрыі", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Фільтр: выканаўца, метка, прыярытэт і тэрмін, кожны з ёсць або не і значэннямі", + "Cross-project view": "Міжпраектны выгляд", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Захаваны набор праектаў, задачы якіх паказваюцца разам у калонках па статусе, з доступам для названых людзей.", + "Shared with": "Даступна для", + "The name the view is listed under": "Назва, пад якой выгляд паказаны ў спісе", + "Nextcloud user id of the person who saved the view": "Ідэнтыфікатар карыстальніка Nextcloud таго, хто захаваў выгляд", + "Nextcloud user ids of the people the view is shared with": "Ідэнтыфікатары карыстальнікаў Nextcloud тых, каму адкрыты выгляд", + "The projects whose tasks the view shows, at most twenty": "Праекты, задачы якіх паказвае выгляд, не больш за дваццаць", + "1 project in this view is hidden from you.": "1 праект у гэтым выглядзе схаваны ад вас.", + "{count} projects in this view are hidden from you.": "Праекты ў гэтым выглядзе, схаваныя ад вас: {count}.", + "{project} has no column for {status}.": "У праекта {project} няма калонкі для статусу {status}.", + "This view does not exist or is not shared with you.": "Гэты выгляд не існуе або вам не адкрыты.", + "\"{task}\" moved to {status}.": "\"{task}\" перамешчана ў {status}.", + "Project: {title}": "Праект: {title}", + "Cross-project views": "Міжпраектныя выгляды", + "New view": "Новы выгляд", + "Edit view": "Змяніць выгляд", + "Delete view": "Выдаліць выгляд", + "Give the view a name": "Дайце выгляду назву", + "Pick at least one project": "Выберыце хаця б адзін праект", + "A view shows at most {max} projects": "Выгляд паказвае не больш за {max} праектаў", + "Could not save the view. Please try again.": "Не ўдалося захаваць выгляд. Паспрабуйце яшчэ раз.", + "Could not delete the view. Please try again.": "Не ўдалося выдаліць выгляд. Паспрабуйце яшчэ раз.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Выдаліць «{title}»? Праекты і іх задачы застануцца без змен.", + "People see the tasks of the projects they are in, never more.": "Кожны бачыць толькі задачы праектаў, у якіх удзельнічае.", + "No views yet. A view shows the tasks of several of your projects together.": "Выглядаў пакуль няма. Выгляд паказвае задачы некалькіх вашых праектаў разам.", + "Projects in view: {count}": "Праектаў у выглядзе: {count}", + "Notify me when a task is assigned to me": "Паведамляць мне, калі мне прызначаюць задачу", + "Also send these to me by email": "Таксама дасылаць іх мне па пошце", + "Add an email address in your Nextcloud personal settings to get mail.": "Дадайце адрас электроннай пошты ў асабістых наладах Nextcloud, каб атрымліваць лісты.", + "Code link": "Спасылка на код", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Коміт, галіна, запыт на зліццё або задача ў сэрвісе кода, звязаныя з заданнем.", + "The task the link belongs to": "Заданне, да якога належыць спасылка", + "The project of the task": "Праект задання", + "Task key": "Ключ задання", + "The task key the forge text named, such as VC-12": "Ключ задання, названы ў тэксце сэрвісу кода, напрыклад VC-12", + "What the link points at": "На што паказвае спасылка", + "Link": "Спасылка", + "The address of the item in the forge": "Адрас элемента ў сэрвісе кода", + "The commit message, branch name or merge request title": "Паведамленне каміта, назва галіны або загаловак запыту на зліццё", + "Repository": "Рэпазіторый", + "The repository, such as acme/portal": "Рэпазіторый, напрыклад acme/portal", + "Forge id": "Id у сэрвісе", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Уласны id элемента ў сэрвісе кода, напрыклад github:acme/portal#42 або хэш каміта", + "State": "Стан", + "The state of a merge request or issue": "Стан запыту на зліццё або задачы", + "Who made the commit or opened the merge request": "Хто зрабіў каміт або адкрыў запыт на зліццё", + "When the commit was made or the merge request last changed": "Калі зроблены каміт або апошні раз змяніўся запыт на зліццё", + "Added by": "Кім дададзена", + "Whether a person added the link or the integration wrote it": "Ці дадаў спасылку чалавек, ці яе запісала інтэграцыя", + "Nextcloud user UIDs of project members": "ID карыстальнікаў Nextcloud удзельнікаў праекта", + "Add link": "Дадаць спасылку", + "Added by hand": "Дададзена ўручную", + "Branch": "Галіна", + "Code": "Код", + "Commit": "Каміт", + "From the integration": "З інтэграцыі", + "Link to a commit, branch or merge request": "Спасылка на каміт, галіну або запыт на зліццё", + "Merge request": "Запыт на зліццё", + "Merged": "Злiты", + "No code linked yet. Name {key} in a commit message or paste a link.": "Код яшчэ не прывязаны. Назавіце {key} у паведамленні каміта або ўстаўце спасылку.", + "No code linked yet. Paste a link to a commit or merge request.": "Код яшчэ не прывязаны. Устаўце спасылку на каміт або запыт на зліццё.", + "Paste a web address that starts with https://.": "Устаўце вэб-адрас, які пачынаецца з https://.", + "Remove link {title}": "Выдаліць спасылку {title}", + "The link could not be added.": "Не ўдалося дадаць спасылку.", + "The link could not be removed.": "Не ўдалося выдаліць спасылку.", + "This link is already on the task.": "Гэтая спасылка ўжо ёсць у заданні.", + "Code forges": "Сэрвісы кода", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Звязвайце каміты і pull request з GitHub з заданнямі. Integriq атрымлівае падзеі; planninq ніколі не звяртаецца да GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Спампуйце канфігурацыю і імпартуйце яе ў Integriq. Потым укажыце сакрэт у правіле \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "У GitHub дадайце да рэпазіторыя webhook з гэтым адрасам і тым жа сакрэтам. Выберыце тып змесціва application/json і падзеі push і pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Назавіце ключ задання, напрыклад VC-12, у паведамленні каміта, назве галіны або загалоўку pull request. Спасылка тады з'явіцца ў гэтым заданні.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq удзельнікі праекта ўсё роўна могуць уставіць спасылку на старонцы задання.", + "Download the Integriq configuration": "Спампаваць канфігурацыю Integriq", + "Calendar": "Каляндар", + "Previous": "Назад", + "Calendar view": "Выгляд каляндара", + "Starts:": "Пачатак:", + "No tasks with a date in this month.": "У гэтым месяцы няма заданняў з датай.", + "Week of {start} to {end}": "Тыдзень з {start} па {end}", + "My calendar": "Мой каляндар", + "Show as list": "Паказаць спісам", + "Show as calendar": "Паказаць у каляндары", + "Open my calendar": "Адкрыць мой каляндар", + "Nextcloud Tasks": "Заданні Nextcloud", + "Show my tasks in Nextcloud Tasks": "Паказваць мае заданні ў Заданнях Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Заданні, прызначаныя вам або абагуленыя з вамі, з'яўляюцца ў спісе \"Planninq\" у Заданнях і Каляндары Nextcloud. Змены, зробленыя там, замяняюцца пры наступнай змене ў Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Гэты сервер не можа запісваць у Заданні Nextcloud, таму экспарт недаступны.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Кіруецца Planninq. Змены, зробленыя тут, замяняюцца пры наступнай змене ў Planninq.", + "Working days and holidays": "Працоўныя і святочныя дні", + "Dates set on the timeline skip the days that are not working days.": "Даты, зададзеныя на часавой шкале, прапускаюць непрацоўныя дні.", + "Working weekdays": "Працоўныя дні тыдня", + "Non-working days": "Непрацоўныя дні", + "No non-working days yet.": "Непрацоўных дзён пакуль няма.", + "Add day": "Дадаць дзень", + "Year": "Год", + "Add Dutch national holidays": "Дадаць дзяржаўныя святы Нідэрландаў", + "Save working days": "Захаваць працоўныя дні", + "Choose at least one working weekday.": "Выберыце хаця б адзін працоўны дзень.", + "Working days saved.": "Працоўныя дні захаваны.", + "Could not save the working days.": "Не ўдалося захаваць працоўныя дні.", + "New Year's Day": "Новы год", + "Easter Sunday": "Вялікдзень", + "Easter Monday": "Велікодны панядзелак", + "King's Day": "Дзень караля", + "Liberation Day": "Дзень вызвалення", + "Ascension Day": "Узнясенне", + "Whit Sunday": "Тройца", + "Whit Monday": "Духаў дзень", + "Christmas Day": "Каляды", + "Boxing Day": "Другі дзень Калядаў", + "Dates of {title}": "Даты задання {title}", + "The due date cannot be before the start date.": "Тэрмін не можа быць раней за дату пачатку.", + "{title}, from {start} to {end}": "{title}, з {start} па {end}", + "The dates could not be saved.": "Не ўдалося захаваць даты.", + "{title} now runs from {start} to {end}": "{title} цяпер доўжыцца з {start} па {end}", + "Auto-scheduling": "Аўтаматычнае планаванне", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Калі ўключана, перанос тэрміну на часавой шкале пазней прапануе зрушыць і заблакаваныя ім заданні.", + "Move blocked tasks along when a task slips": "Зрушваць заблакаваныя заданні, калі заданне затрымліваецца", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На часавой шкале пазнейшы тэрмін прапануе зрушыць заблакаваныя заданні. Улічваюцца толькі сувязі \"блакуе\", і заданні зрушваюцца толькі пазней.", + "Move the tasks that wait for {title}?": "Зрушыць заданні, якія чакаюць {title}?", + "These tasks wait for it and would start after its new due date:": "Гэтыя заданні чакаюць яго і пачнуцца пасля новага тэрміну:", + "{count} tasks would move; the first {limit} are listed.": "Будзе зрушана заданняў: {count}; паказаны першыя {limit}.", + "Now": "Цяпер", + "After the move": "Пасля зруху", + "Only this task": "Толькі гэтае заданне", + "Move all": "Зрушыць усе", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Спынена на {title}: не ўдалося захаваць даты. Заданні перад ім зрушаны.", + "Cumulative flow": "Назапашвальны паток", + "Show as chart": "Паказаць як дыяграму", + "Show as table": "Паказаць як табліцу", + "Tasks per column per day": "Задачы па слупках па днях", + "Tasks without recorded history in this period: {count}": "Задачы без запісанай гісторыі за гэты перыяд: {count}", + "Lead and cycle time": "Час выканання і час цыкла", + "No tasks were finished in this period.": "За гэты перыяд не завершана ніводнай задачы.", + "Finished tasks": "Завершаныя задачы", + "Cycle time, average": "Час цыкла, сярэдні", + "Cycle time, 85th percentile": "Час цыкла, 85-ы процентыль", + "Lead time, average": "Час выканання, сярэдні", + "Tasks whose finish time was estimated from their history: {count}": "Задачы, час завяршэння якіх ацэнены па гісторыі: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Час цыкла кожнай завершанай задачы з сярэднім і 85-м процентылем", + "Slowest tasks": "Самыя павольныя задачы", + "cycle {cycle}, lead {lead}": "цыкл {cycle}, выкананне {lead}", + "{days} days": "{days} дз.", + "Could not load the flow of this project.": "Не ўдалося загрузіць паток гэтага праекта.", + "Last {days} days": "Апошнія {days} дз.", + "Portfolio flow": "Паток партфеля", + "An admin adds portfolios under Projects, Portfolios.": "Адміністратар дадае партфелі ў раздзеле Праекты, Партфелі.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Непаказаныя праекты, бо адначасова паказваецца не больш за 50: {count}", + "Could not load the flow of this portfolio.": "Не ўдалося загрузіць паток гэтага партфеля.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Назапашвальны паток і час цыкла па праектах партфеля.", + "Edit report": "Змяніць справаздачу", + "Only tasks where": "Толькі задачы, дзе", + "Group by": "Групаваць па", + "Display": "Выгляд", + "Share with everyone who can read its projects": "Падзяліцца з усімі, хто можа чытаць яе праекты", + "The report could not be saved.": "Не ўдалося захаваць справаздачу.", + "Number of tasks": "Колькасць задач", + "Bar": "Слупкі", + "Donut": "Кольца", + "Table": "Табліца", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} з {total} праектаў у гэтай справаздачы вам не бачныя", + "No tasks match this report.": "Ніводная задача не адпавядае гэтай справаздачы.", + "None": "Няма", + "Could not load this report.": "Не ўдалося загрузіць гэту справаздачу.", + "Report": "Справаздача", + "Your reports": "Вашы справаздачы", + "My reports": "Мае справаздачы", + "Shared reports": "Агульныя справаздачы", + "You have not built a report yet.": "Вы яшчэ не стварылі ніводнай справаздачы.", + "Nobody has shared a report with you yet.": "З вамі яшчэ ніхто не падзяліўся справаздачай.", + "Reports you built over tasks, and the ones shared with you.": "Справаздачы, якія вы стварылі па задачах, і тыя, якімі падзяліліся з вамі.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Захаваны запыт па задачах: якія праекты, якія фільтры, групоўка па чым, колькасць або сума, у выглядзе табліцы ці дыяграмы.", + "The name the report is listed under": "Назва, пад якой справаздача паказана ў спісе", + "What the report shows and who it is for": "Што паказвае справаздача і для каго яна", + "Nextcloud user id of the person who saved the report": "Ідэнтыфікатар карыстальніка Nextcloud, які захаваў справаздачу", + "Who can open the report": "Хто можа адкрыць справаздачу", + "Only me": "Толькі я", + "Everyone who can read its projects": "Усе, хто можа чытаць яе праекты", + "The projects the report covers, at most fifty": "Праекты, якія ахоплівае справаздача, не больш за пяцьдзесят", + "Filters": "Фільтры", + "Task fields and the value each must equal": "Палі задачы і значэнне, якому павінна быць роўна кожнае", + "The task field the report groups on": "Поле задачы, па якім групуе справаздача", + "Count the tasks, or add up a number on them": "Палічыць задачы або скласці лік па іх", + "Sum": "Сума", + "Sum of": "Сума па", + "The number added up when the measure is a sum": "Лік, які складваецца, калі мера гэта сума", + "Story points": "Балы гісторый", + "Estimated duration": "Ацэначная працягласць", + "How the report is shown": "Як паказваецца справаздача", + "Issue type": "Тып задачы", + "Task fields and the value each must equal; empty when the report covers every task": "Палі задачы і значэнне, якому мусіць адпавядаць кожнае; пуста, калі справаздача ахоплівае ўсе задачы", + "The status a task must have": "Статус, які мусіць мець задача", + "The priority a task must have": "Прыярытэт, які мусіць мець задача", + "The user a task must be assigned to": "Карыстальнік, якому мусіць быць прызначана задача", + "A label a task must carry": "Метка, якую мусіць мець задача", + "The board column a task must be in": "Слупок дошкі, у якім мусіць быць задача", + "The issue type a task must have": "Тып, які мусіць мець задача", + "Manager groups": "Групы кіраўнікоў", + "Member groups": "Групы ўдзельнікаў", + "Viewer groups": "Групы чытачоў", + "Viewers": "Чытачы", + "Owning group": "Група-ўладальнік", + "Nextcloud groups whose members manage the project": "Групы Nextcloud, удзельнікі якіх кіруюць праектам", + "Nextcloud groups whose members work on the project": "Групы Nextcloud, удзельнікі якіх працуюць над праектам", + "Nextcloud groups whose members may read the project": "Групы Nextcloud, удзельнікі якіх могуць чытаць праект", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Карыстальнікі Nextcloud, якія кіруюць праектам: наладамі, удзельнікамі і працай", + "Nextcloud user ids who may read the project and its work but not change it": "Карыстальнікі Nextcloud, якія могуць чытаць праект і яго працу, але не змяняць", + "The Nextcloud group that owns the project with its creator, at most one": "Група Nextcloud, якая валодае праектам разам з яго аўтарам, не больш за адну", + "Nextcloud user ids who may read this through the project": "Карыстальнікі Nextcloud, якія могуць чытаць гэта праз праект", + "Nextcloud groups whose members may change this through the project": "Групы Nextcloud, удзельнікі якіх могуць змяняць гэта праз праект", + "Nextcloud groups whose members may read this through the project": "Групы Nextcloud, удзельнікі якіх могуць чытаць гэта праз праект", + "Search for a person or a group…": "Шукаць чалавека або групу…", + "No one found. Your admin's sharing settings decide who you can find.": "Нікога не знойдзена. Каго вы можаце знайсці, вызначаюць налады абагульвання вашага адміністратара.", + "Type at least two characters": "Увядзіце не менш за два сімвалы", + "Everyone in this group": "Усе ў гэтай групе", + "Could not search for people. Please try again.": "Не ўдалося знайсці людзей. Паспрабуйце яшчэ раз.", + "Could not remove the group": "Не ўдалося выдаліць групу", + "Only the owner and managers change who is on this project.": "Толькі ўладальнік і кіраўнікі змяняюць склад гэтага праекта.", + "Role of {name}": "Роля: {name}", + "Manager": "Кіраўнік", + "Member": "Удзельнік", + "Viewer": "Чытач", + "Could not change the role": "Не ўдалося змяніць ролю", + "Owned by group: {name}": "Належыць групе: {name}", + "No group owns this project.": "Гэты праект не належыць ніводнай групе.", + "Owned by group": "Належыць групе", + "Search for a group…": "Знайсці групу…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Група не знойдзена. Налады абагульвання вашага адміністратара вызначаюць, якія групы вы можаце знайсці.", + "No owning group": "Без групы-ўладальніка", + "Could not search for groups. Please try again.": "Не ўдалося знайсці групы. Паспрабуйце яшчэ раз.", + "Could not change the owning group": "Не ўдалося змяніць групу-ўладальніка", + "You can read this project. Only its members change it.": "Вы можаце чытаць гэты праект. Змяняюць яго толькі яго ўдзельнікі.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, які выкладаюць на гэтым уроку, напрыклад факультатыў, калі школьная навучальная праграма яго ведае.", + "Online meeting link": "Спасылка на анлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Дзе вучні далучаюцца да гэтага ўрока анлайн. Кнопка «Далучыцца» з'яўляецца толькі для спасылкі https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/be.json b/l10n/be.json index e929e6f3..c28caf89 100644 --- a/l10n/be.json +++ b/l10n/be.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Актыўныя праекты", + "Archived projects": "Архіўныя праекты", + "Boards": "Дошкі", + "My projects": "Мае праекты", + "Portfolio": "Партфель", + "Project board": "Дошка праекта", + "Projects I am in": "Праекты, у якіх я ўдзельнічаю", + "Timeline": "Часовая шкала", + "Timesheet": "Улік часу", + "Features & roadmap": "Функцыі і дарожная карта", + "Flow": "Паток", + "Flows": "Патокі", + "Reports": "Справаздачы", + "Pick a report to open it.": "Выберыце справаздачу, каб адкрыць яе.", + "In progress": "У працы", + "Date": "Дата", + "Due": "Тэрмін", + "Assignee": "Прызначана", + "Who": "Хто", + "What": "Што", + "Minutes": "Хвіліны", + "Entries": "Запісы", + "Most recent": "Найноўшыя", + "Per person": "На асобу", + "By status": "Па статусе", + "By priority": "Па прыярытэце", + "Task status": "Статус задач", + "Time spent": "Затрачаны час", + "Capacity": "Магутнасць", + "Due soonest": "Найбліжэйшы тэрмін", + "Minutes logged": "Запісаныя хвіліны", + "Nothing is due": "Нічога не заплянавана", + "Nothing logged yet": "Яшчэ нічога не запісана", + "What is open, what is blocked, and what is overdue.": "Што адкрыта, што заблакіравана і што пратэрмінавана.", + "How allocation is spread across the people working on projects.": "Як размеркавана нагрузка паміж людзьмі, што працуюць над праектамі.", + "Hours logged, and the projects they went to.": "Запісаныя гадзіны і праекты, на якія яны пайшлі.", + "Billable": "Аплатна", + "Budget: {amount}": "Бюджэт: {amount}", + "Loading projects": "Загрузка праектаў", + "No projects for this client yet": "Для гэтага кліента яшчэ няма праектаў", + "Open in Planninq": "Адкрыць у Planninq", + "This project could not be found": "Не ўдалося знайсці гэты праект", + "Untitled project": "Праект без назвы", + "and {count} more": "і яшчэ {count}", + "Store": "Крама", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Усталюйце рэестры, схемы і патокі, апублікаваныя іншымі арганізацыямі.", + "Work Date": "Дата працы", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Дзеянні са слупком", + "Columns": "Слупкі", + "Could not remove the column. Please try again.": "Не ўдалося выдаліць слупок. Паспрабуйце яшчэ раз.", + "Could not save the column. Please try again.": "Не ўдалося захаваць слупок. Паспрабуйце яшчэ раз.", + "Done column": "Слупок выкананых", + "Edit column": "Рэдагаваць слупок", + "Keep the card's status": "Захаваць статус карткі", + "Move its cards to": "Перамясціць яго карткі ў", + "Move left": "Перамясціць улева", + "Move right": "Перамясціць управа", + "Status of cards moved here": "Статус картак, перамешчаных сюды", + "The last done column cannot be removed.": "Апошні слупок выкананых нельга выдаліць.", + "WIP limit": "Ліміт WIP", + "over limit": "вышэй за ліміт", + "The status a card gets when it is moved into this column.": "Статус, які атрымлівае картка, калі яе перамяшчаюць у гэты слупок.", + "All priorities": "Усе прыярытэты", + "Could not create the task. Please try again.": "Не ўдалося стварыць задачу. Паспрабуйце яшчэ раз.", + "Created": "Створана", + "Move to backlog": "У беклог", + "Move to board": "На дошку", + "New task": "Новая задача", + "Nothing in the backlog": "У беклогу нічога няма", + "Rank": "Ранг", + "Sort by": "Сартаваць па", + "Sort by rank to reorder": "Сартуйце па рангу, каб змяніць парадак", + "Task actions": "Дзеянні з задачай", + "All labels": "Усе меткі", + "Filter tasks by label": "Фільтраваць задачы па метцы", + "View timeline": "Праглядзець часовую шкалу", + "Board": "Дошка", + "List": "Спіс", + "Column": "Слупок", + "Board or list": "Дошка або спіс", + "Log": "Журнал", + "Add entry": "Дадаць запіс", + "Show": "Паказаць", + "No actions yet": "Дзеянняў яшчэ няма", + "Closed": "Закрыта", + "Entry actions": "Дзеянні з запісам", + "Add action": "Дадаць дзеянне", + "by {author}": "аўтар {author}", + "saved {time}": "захавана {time}", + "Attendees: {names}": "Прысутныя: {names}", + "Add the first entry": "Дадаць першы запіс", + "Issues": "Праблемы", + "Lessons learned": "Вывучаныя ўрокі", + "Meetings": "Сустрэчы", + "Decisions": "Рашэнні", + "Actions": "Дзеянні", + "Issue": "Праблема", + "Lesson learned": "Вывучаны ўрок", + "Meeting": "Сустрэча", + "Decision": "Рашэнне", + "About this project": "Пра гэты праект", + "No description yet": "Апісання яшчэ няма", + "Start date": "Дата пачатку", + "Not set": "Не зададзена", + "End date": "Дата заканчэння", + "Progress": "Ход", + "No tasks yet": "Задач яшчэ няма", + "Open the board": "Адкрыць дошку", + "People": "Людзі", + "Owner": "Уладальнік", + "Latest log entries": "Апошнія запісы", + "Open the log": "Адкрыць журнал", + "{done} of {total} tasks done": "Выканана {done} з {total} задач", + "Edit entry": "Рэдагаваць запіс", + "Type": "Від", + "Attendees": "Прысутныя", + "Issue is closed": "Праблема закрыта", + "Could not save the entry. Please try again.": "Не ўдалося захаваць запіс. Паспрабуйце яшчэ раз.", + "From: {title}": "З: {title}", + "What needs to happen": "Што трэба зрабіць", + "Could not create the action. Please try again.": "Не ўдалося стварыць дзеянне. Паспрабуйце яшчэ раз.", + "The action was created but could not be linked to the entry.": "Дзеянне створана, але не ўдалося звязаць яго з запісам.", + "Project pages": "Старонкі праекта", + "Overview": "Агляд", + "Risks": "Рызыкі", + "Log entry": "Запіс журнала", + "A short name for the entry": "Кароткая назва запісу", + "Project": "Праект", + "The project this entry belongs to": "Праект, да якога належыць гэты запіс", + "What kind of entry this is": "Які гэта від запісу", + "When it happened": "Калі гэта адбылося", + "What happened, in Markdown": "Што адбылося, у Markdown", + "Whether an issue is still open": "Ці праблема яшчэ адкрытая", + "The people at a meeting": "Людзі на сустрэчы", + "Tasks that came out of this entry": "Задачы, якія ўзніклі з гэтага запісу", + "Add risk": "Дадаць рызыку", + "Risk": "Рызыка", + "Score": "Ацэнка", + "Response": "Рэагаванне", + "Review date": "Дата перагляду", + "no longer on the project": "больш не ў праекце", + "Edit {title}": "Рэдагаваць {title}", + "No risks recorded yet": "Рызык яшчэ не запісана", + "Add the first risk": "Дадаць першую рызыку", + "Medium": "Сярэдняя", + "Mitigating": "Змякчаецца", + "Occurred": "Наступіла", + "Avoid": "Пазбегнуць", + "Reduce": "Зменшыць", + "Transfer": "Перадаць", + "Accept": "Прыняць", + "Highest open risks": "Найвышэйшыя адкрытыя рызыкі", + "No open risks": "Няма адкрытых рызык", + "Open the risk register": "Адкрыць рэестр рызык", + "Edit risk": "Рэдагаваць рызыку", + "What could go wrong": "Што можа пайсці не так", + "Likelihood": "Імавернасць", + "Impact": "Уплыў", + "Score {score}": "Ацэнка {score}", + "Countermeasures": "Контрмеры", + "Could not save the risk. Please try again.": "Не ўдалося захаваць рызыку. Паспрабуйце яшчэ раз.", + "Risks by likelihood and impact": "Рызыкі паводле імавернасці і ўплыву", + "Risk scale": "Шкала рызык", + "The levels every project scores its risks on, and where low turns into medium and high": "Узроўні, па якіх кожны праект ацэньвае свае рызыкі, і дзе нізкі пераходзіць у сярэдні і высокі", + "Number of levels": "Колькасць узроўняў", + "Likelihood labels": "Назвы імавернасці", + "Impact labels": "Назвы ўплыву", + "Level {level}": "Узровень {level}", + "Medium from score": "Сярэдні ад ацэнкі", + "High from score": "Высокі ад ацэнкі", + "Risk scale saved": "Шкала рызык захавана", + "1 risk uses level {level}. Change it first.": "1 рызыка выкарыстоўвае ўзровень {level}. Спачатку змяніце яе.", + "{count} risks use level {level}. Change them first.": "Рызык на ўзроўні {level}: {count}. Спачатку змяніце іх.", + "Every level needs a label, and high must start above medium.": "Кожнаму ўзроўню патрэбна назва, а высокі мусіць пачынацца вышэй за сярэдні.", + "The project this risk belongs to": "Праект, да якога належыць гэтая рызыка", + "The cause and the effect, in Markdown": "Прычына і вынік, у Markdown", + "Category": "Катэгорыя", + "A free grouping, such as planning, budget or supplier": "Вольнае групаванне, напрыклад планаванне, бюджэт ці пастаўшчык", + "How likely it is, on the admin's risk scale": "Наколькі гэта імаверна, па шкале рызык адміністратара", + "How hard it would hit, on the admin's risk scale": "Наколькі моцна гэта ўдарыць, па шкале рызык адміністратара", + "Likelihood times impact, calculated by the server": "Імавернасць, памножаная на ўплыў, лічыць сервер", + "Where the risk stands": "На якім этапе рызыка", + "The person who watches this risk": "Чалавек, які сочыць за гэтай рызыкай", + "How the project answers the risk": "Як праект рэагуе на рызыку", + "What is done to prevent it or soften it, in Markdown": "Што робіцца, каб яе прадухіліць ці змякчыць, у Markdown", + "When to look at this risk again": "Калі зноў пераглядзець гэтую рызыку", + "Very low": "Вельмі нізкі", + "Very high": "Вельмі высокі", + "All projects": "Усе праекты", + "Project status report": "Справаздача пра стан праекта", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датаваная справаздача пра тое, як праект стаіць з грашыма, арганізацыяй, часам, інфармацыяй, якасцю і рызыкай (аспекты GROTIK), кожны з заўвагай.", + "The project this report is about": "Праект, да якога адносіцца справаздача", + "Report date": "Дата справаздачы", + "The day the report describes": "Дзень, які апісвае справаздача", + "Money": "Грошы", + "How the project stands on this aspect": "Як праект стаіць па гэтым аспекце", + "On track": "Па плане", + "At risk": "Пад пагрозай", + "Off track": "Па-за планам", + "Money note": "Заўвага пра грошы", + "A short explanation of this status": "Кароткае тлумачэнне гэтага стану", + "Organisation": "Арганізацыя", + "Organisation note": "Заўвага пра арганізацыю", + "Time": "Час", + "Time note": "Заўвага пра час", + "Information": "Інфармацыя", + "Information note": "Заўвага пра інфармацыю", + "Quality": "Якасць", + "Quality note": "Заўвага пра якасць", + "Risk note": "Заўвага пра рызыку", + "Overall": "Агулам", + "The worst of the six statuses, calculated by the server": "Найгоршы з шасці станаў, вылічваецца серверам", + "Health: money": "Стан: грошы", + "Copied from the newest status report": "Скапіявана з найноўшай справаздачы пра стан", + "Health: organisation": "Стан: арганізацыя", + "Health: time": "Стан: час", + "Health: information": "Стан: інфармацыя", + "Health: quality": "Стан: якасць", + "Health: risk": "Стан: рызыка", + "Health: overall": "Стан: агулам", + "Health: report date": "Стан: дата справаздачы", + "The date of the newest status report": "Дата найноўшай справаздачы пра стан", + "New report": "Новая справаздача", + "Only the project owner writes status reports.": "Справаздачы пра стан піша толькі ўладальнік праекта.", + "Latest report, {date}": "Апошняя справаздача, {date}", + "Aspect": "Аспект", + "Note": "Заўвага", + "Report history": "Гісторыя справаздач", + "Author": "Аўтар", + "No status reports yet": "Справаздач пра стан яшчэ няма", + "Write the first report": "Напісаць першую справаздачу", + "Choose a status for every aspect to save the report.": "Выберыце стан для кожнага аспекта, каб захаваць справаздачу.", + "Suggested: on track.": "Прапанова: па плане.", + "Suggested: at risk.": "Прапанова: пад пагрозай.", + "Suggested: off track.": "Прапанова: па-за планам.", + "1 task is past its due date.": "1 задача пратэрмінавана.", + "{count} tasks are past their due date.": "Пратэрмінаваных задач: {count}.", + "The end date has passed with 1 open task.": "Дата заканчэння мінула, адкрыта 1 задача.", + "The end date has passed with {count} open tasks.": "Дата заканчэння мінула, адкрытых задач: {count}.", + "No open task is past its due date.": "Ніводная адкрытая задача не пратэрмінавана.", + "The highest open risk, \"{title}\", scores {score}.": "Найвышэйшая адкрытая рызыка, «{title}», мае ацэнку {score}.", + "There are no open risks.": "Адкрытых рызык няма.", + "Costs are at {percent}% of the budget.": "Выдаткі складаюць {percent}% бюджэту.", + "No suggestion: the project has no budget.": "Няма прапановы: у праекта няма бюджэту.", + "No suggestion: no costs are recorded for this project yet.": "Няма прапановы: па гэтым праекце яшчэ не ўлічаны выдаткі.", + "The report was not saved. Only the project owner can write status reports.": "Справаздача не захавана. Справаздачы пра стан можа пісаць толькі ўладальнік праекта.", + "No report": "Няма справаздачы", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Група праектаў, якімі кіруюць адны і тыя ж людзі, напрыклад аддзел або праграма. Яе кіраўнікі чытаюць кожны праект у ёй.", + "The name of the portfolio": "Назва партфеля", + "What the portfolio holds and who runs it": "Што ўваходзіць у партфель і хто ім кіруе", + "A colour for the portfolio's section in project lists": "Колер раздзела партфеля ў спісах праектаў", + "Managers": "Кіраўнікі", + "Nextcloud user UIDs of the people who run the portfolio": "Ідэнтыфікатары карыстальнікаў Nextcloud, якія кіруюць партфелем", + "Order": "Парадак", + "Where the portfolio comes in project lists, lowest first": "Месца партфеля ў спісах праектаў, спачатку найменшы", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Уласная шкала рызык гэтага партфеля ў фармаце JSON, у той жа форме, што і шкала ўсёй праграмы. Пуста азначае шкалу праграмы.", + "Portfolio readers": "Чытачы партфеля", + "Nextcloud user UIDs of the managers of the project's portfolio": "Ідэнтыфікатары карыстальнікаў Nextcloud кіраўнікоў партфеля праекта", + "The portfolio this project belongs to": "Партфель, да якога належыць праект", + "No portfolio": "Без партфеля", + "All portfolios": "Усе партфелі", + "You read this project as a manager of its portfolio. Only its members change it.": "Вы чытаеце гэты праект як кіраўнік яго партфеля. Змяняюць яго толькі ўдзельнікі.", + "Portfolios": "Партфелі", + "Portfolio status": "Стан партфеля", + "No portfolios yet": "Партфеляў пакуль няма", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Адміністратар дадае партфелі ў раздзеле Праекты, Партфелі. Праекты партфеля пералічаны тут з іх станам.", + "Roll-up": "Зводка", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} па плане, {atRisk} пад пагрозай, {offTrack} па-за планам, {noReport} без справаздачы", + "No project in this portfolio that you can read.": "У гэтым партфелі няма праекта, які вы можаце чытаць.", + "Start": "Пачатак", + "End": "Канец", + "Budget": "Бюджэт", + "Last report": "Апошняя справаздача", + "Out of date": "Састарэла", + "Portfolio timeline": "Часавая шкала партфеля", + "Zoom": "Маштаб", + "Could not load the timeline": "Не ўдалося загрузіць часавую шкалу", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Адміністратар дадае партфелі ў раздзеле Праекты, Партфелі. Праекты партфеля паказаны тут на адной часавай шкале.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Адкрыйце праект, каб убачыць яго фазы і задачы. Часавая шкала толькі для чытання.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Прапушчаны, бо вы не можаце іх чытаць: {count} праектаў", + "Week": "Тыдзень", + "Day": "Дзень", + "Month": "Месяц", + "Please try again later.": "Паспрабуйце пазней.", + "Status reports": "Справаздачы аб стане", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Праз колькі дзён апошняя справаздача аб стане праекта пазначаецца як састарэлая ў аглядзе партфеля", + "Reporting period (days)": "Справаздачны перыяд (дні)", + "The reporting period is a whole number of days from 1 to 365.": "Справаздачны перыяд — цэлая колькасць дзён ад 1 да 365.", + "Reporting period saved": "Справаздачны перыяд захаваны", + "The reporting period was not saved. Please try again.": "Справаздачны перыяд не захаваны. Паспрабуйце яшчэ раз.", + "Every project of a portfolio with its status per aspect, rolled up.": "Кожны праект партфеля са станам па аспектах, зводна.", + "The projects of a portfolio on one timeline.": "Праекты партфеля на адной часавай шкале.", + "Phases": "Фазы", + "Add phase": "Дадаць фазу", + "No phases yet": "Фаз пакуль няма", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Падзяліце праект на фазы, напрыклад ініцыяцыя, вызначэнне і рэалізацыя. Фаза закрываецца, калі загружаны яе выніковы дакумент.", + "{hours} hours": "{hours} гадз", + "Concluding document: {title}": "Выніковы дакумент: {title}", + "Concluding document missing": "Няма выніковага дакумента", + "Move {title} up": "Перамясціць {title} уверх", + "Move {title} down": "Перамясціць {title} уніз", + "Close phase": "Закрыць фазу", + "Phase": "Фаза", + "Files": "Файлы", + "Notes": "Нататкі", + "Audit trail": "Журнал аўдыту", + "Edit phase": "Рэдагаваць фазу", + "Name": "Назва", + "Budget hours": "Гадзіны па бюджэце", + "Could not save the phase. Please try again.": "Не ўдалося захаваць фазу. Паспрабуйце яшчэ раз.", + "Close phase {title}": "Закрыць фазу {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фаза закрываецца выніковым дакументам: загрузіце яго тут або выберыце адзін з файлаў фазы.", + "Concluding document": "Выніковы дакумент", + "This phase has no files yet.": "У гэтай фазы пакуль няма файлаў.", + "Upload a document": "Загрузіць дакумент", + "The document was not uploaded. Please try again.": "Дакумент не загружаны. Паспрабуйце яшчэ раз.", + "Upload the concluding document before you close this phase.": "Загрузіце выніковы дакумент, перш чым закрыць гэту фазу.", + "This phase cannot be closed from its current status.": "Гэту фазу нельга закрыць з яе цяперашняга статусу.", + "The phase was not closed. Please try again.": "Фаза не закрыта. Паспрабуйце яшчэ раз.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID файла гэтай фазы, які яе закрывае. Фазу можна завяршыць, толькі калі ён зададзены і файл прымацаваны.", + "Import from Microsoft Project": "Імпарт з Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Выберыце план, захаваны з Microsoft Project у фармаце XML. Нічога не імпартуецца, пакуль вы не пацвердзіце.", + "Plan file": "Файл плана", + "What the import creates": "Што створыць імпарт", + "Tasks": "Задачы", + "Sub-tasks": "Падзадачы", + "Milestones": "Вехі", + "Links": "Сувязі", + "Already imported, updated in place: {count}": "Ужо імпартаваныя, абноўленыя на месцы: {count}", + "What does not carry over": "Што не пераносіцца", + "Tasks with resources, which are not imported: {count}": "Задачы з рэсурсамі, якія не імпартуюцца: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Задачы глыбей за ўзровень 3, змешчаныя пад сваёй задачай узроўню 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Сувязі, адрозныя ад заканчэнне-пачатак, імпартаваныя як звязаныя: {count}", + "Link lags, which are dropped: {count}": "Затрымкі сувязей, якія адкідаюцца: {count}", + "Links to a summary task, which are not imported: {count}": "Сувязі з выніковай задачай, якія не імпартуюцца: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Сувязі з задачамі па-за гэтым планам, якія не імпартуюцца: {count}", + "No longer in the plan": "Больш няма ў плане", + "These stay in the project; remove them yourself if they are no longer needed.": "Яны застаюцца ў праекце; выдаліце іх самі, калі яны больш не патрэбныя.", + "Import": "Імпартаваць", + "Close": "Закрыць", + "The plan is imported: {created} created, {updated} updated.": "План імпартаваны: створана {created}, абноўлена {updated}.", + "Links that would close a loop were left out: {count}": "Сувязі, якія замкнулі б цыкл, прапушчаны: {count}", + "The import stopped part-way. Run it again to finish it.": "Імпарт спыніўся на паўдарозе. Запусціце яго зноў, каб завяршыць.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Захавайце план у Microsoft Project праз Файл, Захаваць як, фармат XML, і імпартуйце гэты файл.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Гэты файл аб'яўляе DOCTYPE або сутнасці, якія не прымаюцца.", + "The file is larger than 10 MB.": "Файл большы за 10 МБ.", + "The plan has more than 2,000 tasks, more than one import takes.": "У плане больш за 2000 задач, больш, чым прымае адзін імпарт.", + "This file is not a Microsoft Project plan in XML format.": "Гэты файл не з'яўляецца планам Microsoft Project у фармаце XML.", + "Choose a file to import.": "Выберыце файл для імпарту.", + "Only the project owner can import a plan.": "Толькі ўладальнік праекта можа імпартаваць план.", + "The plan could not be read. Please try again.": "Не ўдалося прачытаць план. Паспрабуйце яшчэ раз.", + "Linked case: {title}": "Звязаная справа: {title}", + "Linked to a case": "Звязана са справай", + "Hand over to case": "Перадаць у справу", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Капіюе без змен кожны файл праекта і яго задач, а таксама файл з апісаннем праекта, у звязаную справу.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Скапіявана файлаў: {count}", + "Files that failed: {names}": "Файлы з памылкай: {names}", + "The handover failed. Please try again.": "Перадача не ўдалася. Паспрабуйце яшчэ раз.", + "The linked case could not be found, or you cannot open it.": "Звязаную справу не знойдзена, або вы не можаце яе адкрыць.", + "Case handovers": "Перадачы ў справу", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Кожная перадача файлаў і метаданых праекта ў яго справу: калі, кім, у якую справу, кожны скапіяваны файл з яго SHA-256 і файлы з памылкай.", + "Finance": "Фінансы", + "Add cost line": "Дадаць радок выдаткаў", + "Delivery terms": "Умовы пастаўкі", + "Billing model": "Мадэль аплаты", + "Budget in euro": "Бюджэт у еўра", + "Budget in hours": "Бюджэт у гадзінах", + "Hourly rate in euro": "Пагадзінная стаўка ў еўра", + "Planned start": "Запланаваны пачатак", + "Planned end": "Запланаваны канец", + "Planned dates": "Запланаваныя даты", + "Budget {amount}": "Бюджэт {amount}", + "No budget agreed": "Бюджэт не ўзгоднены", + "Hours": "Гадзіны", + "Only the project owner and the portfolio managers see the amounts.": "Сумы бачаць толькі ўладальнік праекта і менеджары партфеля.", + "Budget against cost per category": "Бюджэт і выдаткі па катэгорыях", + "Labour (booked time)": "Праца (улічаны час)", + "No category": "Без катэгорыі", + "Hours are not available": "Гадзіны недаступныя", + "Not yet assigned to a category": "Яшчэ не аднесена да катэгорыі", + "Total": "Разам", + "{spent} spent, {remaining} remaining": "{spent} выдаткавана, {remaining} засталося", + "Budget against cost per phase": "Бюджэт і выдаткі па фазах", + "No phase": "Без фазы", + "Cost lines": "Радкі выдаткаў", + "From the finance system": "З фінансавай сістэмы", + "Edit cost line {amount}": "Змяніць радок выдаткаў {amount}", + "No cost lines yet": "Радкоў выдаткаў пакуль няма", + "Commitments": "Абавязацельствы", + "Actual cost": "Фактычныя выдаткі", + "Forecast": "Прагноз", + "Remaining": "Засталося", + "Not planned yet": "Яшчэ не запланавана", + "{start} to {end}": "з {start} па {end}", + "The terms were not saved. Please try again.": "Умовы не захаваны. Паспрабуйце яшчэ раз.", + "Terms saved": "Умовы захаваны", + "Fixed price": "Фіксаваная цана", + "Hourly": "Пагадзінна", + "Not billed": "Без рахунку", + "Commitment": "Абавязацельства", + "Edit cost line": "Змяніць радок выдаткаў", + "Kind": "Від", + "Amount in euro": "Сума ў еўра", + "Remove": "Выдаліць", + "Could not save the cost line. Only the project owner changes the money of a project.": "Не ўдалося захаваць радок выдаткаў. Грошы праекта змяняе толькі ўладальнік праекта.", + "Could not remove the cost line. Please try again.": "Не ўдалося выдаліць радок выдаткаў. Паспрабуйце яшчэ раз.", + "{amount} over budget": "{amount} звыш бюджэту", + "Cost categories": "Катэгорыі выдаткаў", + "The categories every project splits its budget and costs into, one per line": "Катэгорыі, на якія кожны праект дзеліць свой бюджэт і выдаткі, па адной у радку", + "Categories": "Катэгорыі", + "Give at least one category, each name once.": "Укажыце хаця б адну катэгорыю, кожную назву адзін раз.", + "Cost categories saved": "Катэгорыі выдаткаў захаваны", + "The cost categories were not saved. Please try again.": "Катэгорыі выдаткаў не захаваны. Паспрабуйце яшчэ раз.", + "Finance line": "Фінансавы радок", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Адна грашовая сума праекта: бюджэт, абавязацельства, фактычныя выдаткі або прагноз, у катэгорыі выдаткаў і пры патрэбе ў фазе. Уводзіць уладальнік праекта або дасылае фінансавая сістэма праз праграму інтэграцыі.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Праект, да якога адносіцца сума. Пуста для радка з фінансавай сістэмы, нумар праекта якога не супадае ні з адным праектам.", + "The phase this amount belongs to, if any": "Фаза, да якой адносіцца сума, калі ёсць", + "The cost category, one of the categories the admin set up": "Катэгорыя выдаткаў, адна з катэгорый, зададзеных адміністратарам", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Ці з'яўляецца сума бюджэтам, абавязацельствам, фактычнымі выдаткамі або прагнозам", + "Amount": "Сума", + "The amount in the reporting currency (euro)": "Сума ў валюце справаздачнасці (еўра)", + "The date the amount was booked or is expected": "Дата, калі сума праведзена або чакаецца", + "What the amount is for": "На што гэта сума", + "Whether a person entered the line or the finance system sent it": "Ці ўвёў радок чалавек, ці яго даслала фінансавая сістэма", + "Entered by hand": "Уведзена ўручную", + "Finance line id": "Ідэнтыфікатар фінансавага радка", + "The finance system's own id of this line. One imported line per id.": "Уласны ідэнтыфікатар радка ў фінансавай сістэме. Адзін імпартаваны радок на ідэнтыфікатар.", + "Project number": "Нумар праекта", + "The project number the finance system sent, matched against the project key": "Нумар праекта з фінансавай сістэмы, звераны з ключом праекта", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Партфель праекта радка, скапіяваны з праекта, каб выніках партфеля хапала аднаго фільтра", + "Finance readers": "Чытачы фінансаў", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID карыстальнікаў Nextcloud, якім дазволена бачыць суму: уладальнік праекта і менеджары яго партфеля", + "Project owner": "Уладальнік праекта", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID карыстальніка Nextcloud, уладальніка праекта, які можа змяняць і выдаляць ручныя радкі", + "How the client pays: not billed, a fixed price, or by the hour.": "Як плаціць кліент: без рахунку, фіксаваная цана або пагадзінна.", + "Portfolio finance": "Фінансы партфеля", + "You cannot see the money of any project in this portfolio": "Вы не бачыце грошай ніводнага праекта ў гэтым партфелі", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Сервер вярнуў радкі выдаткаў праектаў па-за гэтым партфелем, таму вынікі могуць быць памылковымі.", + "Projects left out because you cannot see their money: {count}": "Прапушчана праектаў, чые грошы вам не бачныя: {count}", + "Unmatched finance lines": "Незвязаныя фінансавыя радкі", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Бюджэт, абавязацельствы, фактычныя выдаткі і прагноз у суме па партфелі.", + "Subprojects": "Падпраекты", + "{done} of {total}": "{done} з {total}", + "{done} of {total} tasks done, including subprojects": "Выканана {done} з {total} задач, разам з падпраектамі", + "Show the subprojects of {title}": "Паказаць падпраекты {title}", + "Hide the subprojects of {title}": "Схаваць падпраекты {title}", + "Part of": "Уваходзіць у", + "No parent project": "Без бацькоўскага праекта", + "A project cannot sit under one of its own subprojects.": "Праект не можа знаходзіцца пад адным са сваіх падпраектаў.", + "Projects nest three levels deep at most: programme, project and subproject.": "Праекты ўкладаюцца не глыбей за тры ўзроўні: праграма, праект і падпраект.", + "Parent project": "Бацькоўскі праект", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Праект, пад якім знаходзіцца гэты праект, напрыклад праграма. Праекты ўкладаюцца не глыбей за тры ўзроўні.", + "Yes": "Так", + "No": "Не", + "{label} (required)": "{label} (абавязкова)", + "{label} is required": "Поле «{label}» абавязковае", + "Project field": "Поле праекта", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поле, якое адміністратар дадае да кожнага праекта, напрыклад сфера палітыкі або кошт дамовы.", + "Key": "Ключ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Пастаянная назва, пад якой захоўваецца значэнне, у lower camel case. Не змяняйце яе, калі праекты яе выкарыстоўваюць.", + "Label": "Подпіс", + "The name people see next to the field": "Назва каля поля", + "What the field holds": "Што змяшчае поле", + "Text": "Тэкст", + "Number": "Лік", + "Choice": "Выбар", + "Person": "Асоба", + "Yes or no": "Так або не", + "Options": "Варыянты", + "The choices of a choice field": "Варыянты поля выбару", + "Required": "Абавязковае", + "Whether a project must fill in the field": "Ці павінен праект запоўніць поле", + "Where the field appears, lowest first": "Дзе з'яўляецца поле, меншае першым", + "Applies to": "Адносіцца да", + "What the field is added to": "Да чаго дадаецца поле", + "Custom fields": "Уласныя палі", + "The values of the project fields an admin defined, keyed by the field's key.": "Значэнні палёў праекта, вызначаных адміністратарам, па ключы поля.", + "Project fields": "Палі праекта", + "Related": "Звязаныя", + "Remove link": "Выдаліць сувязь", + "Link type": "Тып сувязі", + "Relates to": "Звязана з", + "Duplicates": "Дублюе", + "Project key": "Ключ праекта", + "Every task number starts with it, such as VERG-42.": "З яго пачынаецца кожны нумар задачы, напрыклад VERG-42.", + "This key is already used by another project.": "Гэты ключ ужо выкарыстоўвае іншы праект.", + "Use 2 to 10 letters and digits, starting with a letter.": "Выкарыстоўвайце ад 2 да 10 літар і лічбаў, пачынаючы з літары.", + "The key cannot change once tasks carry it.": "Ключ нельга змяніць, калі задачы ўжо яго маюць.", + "Project saved. The existing tasks get their numbers in the background.": "Праект захаваны. Існуючыя задачы атрымліваюць нумары ў фонавым рэжыме.", + "Next task number": "Нумар наступнай задачы", + "The number the next task of this project gets in its key. Only the system writes it.": "Нумар, які наступная задача гэтага праекта атрымлівае ў сваім ключы. Яго запісвае толькі сістэма.", + "Restore {title}": "Аднавіць {title}", + "Restore": "Аднавіць", + "Project restored": "Праект адноўлены", + "Could not restore the project": "Не ўдалося аднавіць праект", + "Bring this project back to the active list.": "Вярнуць гэты праект у спіс актыўных праектаў.", + "Restore project": "Аднавіць праект", + "Request reason": "Прычына запыту", + "Why the requester needs this project. Filled in when the project is requested.": "Навошта заяўніку гэты праект. Запаўняецца пры запыце.", + "Reviewed by": "Разгледжана", + "The user who approved or rejected the request.": "Карыстальнік, які адобрыў або адхіліў запыт.", + "Reviewed at": "Дата разгляду", + "When the request was approved or rejected.": "Калі запыт быў адобраны або адхілены.", + "Review note": "Заўвага рэцэнзента", + "The reviewer's reason, shown to the requester when a request is not approved.": "Прычына рэцэнзента, якую бачыць заяўнік, калі запыт не адобраны.", + "Members of these groups": "Удзельнікі гэтых груп", + "Groups that may create projects": "Групы, якім можна ствараць праекты", + "The group {group} no longer exists. Save to remove it.": "Групы {group} больш не існуе. Захавайце, каб прыбраць яе.", + "Review project request": "Разгледзець запыт на праект", + "Requested by": "Запытаў", + "Why it is needed": "Навошта ён патрэбны", + "Desired start date": "Пажаданая дата пачатку", + "Why is it not approved?": "Чаму не адобрана?", + "Give a reason. The requester sees it.": "Пакажыце прычыну. Заяўнік яе ўбачыць.", + "Approve": "Адобрыць", + "Reject": "Адхіліць", + "Reject request": "Адхіліць запыт", + "The review was not saved. Try again.": "Рашэнне не захавана. Паспрабуйце яшчэ раз.", + "This project is waiting for review": "Гэты праект чакае разгляду", + "This request was not approved": "Гэты запыт не адобраны", + "Reason: {note}": "Прычына: {note}", + "Review request": "Разгледзець запыт", + "Request a project": "Запытаць праект", + "Step {step} of 2": "Крок {step} з 2", + "Why is this project needed?": "Навошта патрэбны гэты праект?", + "Give a reason. The reviewer reads it.": "Пакажыце прычыну. Рэцэнзент яе прачытае.", + "Back": "Назад", + "Next": "Далей", + "Send request": "Адправіць запыт", + "The request was not sent. Try again.": "Запыт не адпраўлены. Паспрабуйце яшчэ раз.", + "Requested": "Запытаны", + "Not approved": "Не адобраны", + "Your request was sent": "Ваш запыт адпраўлены", + "Let everyone else request a project": "Дазволіць усім астатнім запытваць праект", + "Add a task": "Дадаць задачу", + "Delete task": "Выдаліць задачу", + "Edit task": "Рэдагаваць задачу", + "Write": "Пісаць", + "Preview": "Папярэдні прагляд", + "Markdown works here: headings, lists and links.": "Тут працуе Markdown: загалоўкі, спісы і спасылкі.", + "Could not save the task. Please try again.": "Не ўдалося захаваць задачу. Паспрабуйце яшчэ раз.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Па задачы \"{title}\" улічаны час, таму яе нельга выдаліць. Замест гэтага яе можна скасаваць: запісы часу застануцца.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Выдаліць \"{title}\"? Яе сувязі з іншымі задачамі таксама будуць выдалены. Гэта нельга адмяніць.", + "Keep task": "Пакінуць задачу", + "Cancel task": "Скасаваць задачу", + "Only the reporter, the project owner or an admin can delete this task.": "Выдаліць гэтую задачу можа толькі аўтар, уладальнік праекта або адміністратар.", + "Could not delete the task. Please try again.": "Не ўдалося выдаліць задачу. Паспрабуйце яшчэ раз.", + "Could not cancel the task. Please try again.": "Не ўдалося скасаваць задачу. Паспрабуйце яшчэ раз.", + "Responsible": "Адказны", + "Also working on this": "Таксама працуюць над гэтым", + "Labels": "Меткі", + "Could not change the priority. Please try again.": "Не ўдалося змяніць прыярытэт. Паспрабуйце яшчэ раз.", + "Other project members who work on this task alongside the person responsible.": "Іншыя ўдзельнікі праекта, якія працуюць над задачай разам з адказным.", + "Duplicate": "Дубляваць", + "Could not copy the task. Please try again.": "Не ўдалося скапіяваць задачу. Паспрабуйце яшчэ раз.", + "Subtasks": "Падзадачы", + "{done} of {total} done": "Выканана {done} з {total}", + "Add a subtask": "Дадаць падзадачу", + "Checklist": "Чэк-ліст", + "Checklist item actions": "Дзеянні з пунктам чэк-ліста", + "Add a checklist item": "Дадаць пункт чэк-ліста", + "Subtasks: {estimate} estimated, {logged} logged": "Падзадачы: ацэнка {estimate}, улічана {logged}", + "Total estimate: {total}": "Агульная ацэнка: {total}", + "Part of {title}": "Частка задачы {title}", + "Checklist: {count} done": "Чэк-ліст: выканана {count}", + "This task has subtasks: {count}.": "У гэтай задачы ёсць падзадачы: {count}.", + "Keep subtasks as separate tasks": "Пакінуць падзадачы асобнымі задачамі", + "Delete subtasks too": "Выдаліць і падзадачы", + "Copy of {title}": "Копія: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Задача скапіявана, але не ўсе яе падзадачы. Праверце копію.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Невялікія крокі ўнутры задачы. У кожнага пункта ёсць id, тэкст і адзнака аб выкананні.", + "Open work per person and per project.": "Адкрытая праца па людзях і па праектах.", + "View": "Выгляд", + "By person": "Па людзях", + "By project": "Па праектах", + "Hours left": "Засталося гадзін", + "Tasks without an estimate": "Задачы без ацэнкі", + "Due in 14 days": "Тэрмін на працягу 14 дзён", + "Shared": "Агульныя", + "Unassigned": "Не прызначаныя", + "{hours} h": "{hours} г", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Паказана праца ў праектах, якія вы можаце бачыць. Гадзіны ўлічваюцца для адказнага; агульныя задачы ўлічваюцца без гадзін.", + "No open work in these projects.": "У гэтых праектах няма адкрытай працы.", + "Open work": "Адкрытая праца", + "{count} open tasks": "Адкрытых задач: {count}", + "Create a project to see capacity here.": "Стварыце праект, каб убачыць тут загрузку.", + "My tasks": "Мае задачы", + "Show all my tasks": "Паказаць усе мае задачы", + "No tasks assigned to you": "Вам не прызначана ніводнай задачы", + "Browse projects": "Праглядзець праекты", + "Later": "Пазней", + "Due {date}": "Тэрмін {date}", + "Could not change the status. Please try again.": "Не ўдалося змяніць статус. Паспрабуйце яшчэ раз.", + "Completed today": "Завершана сёння", + "My open tasks": "Мае адкрытыя задачы", + "My overdue tasks": "Мае пратэрмінаваныя задачы", + "My tasks in progress": "Мае задачы ў рабоце", + "Pin to the top": "Замацаваць уверсе", + "Unpin": "Адмацаваць", + "Pinned": "Замацавана", + "Actions for {title}": "Дзеянні для {title}", + "Could not save your project order. Please try again.": "Не ўдалося захаваць парадак вашых праектаў. Паспрабуйце яшчэ раз.", + "No boards yet": "Дошак пакуль няма", + "Create a project to get a board.": "Стварыце праект, каб атрымаць дошку.", + "Use the Projects page to create and manage your projects and tasks.": "Стварайце праекты і задачы і кіруйце імі на старонцы «Праекты».", + "Go to projects": "Да праектаў", + "You are not a member of any projects yet.": "Вы пакуль не ўдзельнік ніводнага праекта.", + "Could not search for users. Please try again.": "Не ўдалося знайсці карыстальнікаў. Паспрабуйце яшчэ раз.", + "Project creation is restricted to administrators.": "Ствараць праекты могуць толькі адміністратары.", + "Only the project owner or an administrator can delete this project.": "Выдаліць гэты праект можа толькі ўладальнік праекта або адміністратар.", + "No projects are available to you yet. Ask an administrator to create one.": "Вам пакуль не даступны ніводзін праект. Папрасіце адміністратара стварыць праект.", + "Due: {date}": "Тэрмін: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Задачы з датай пачатку або тэрмінам паказваюцца на часавай шкале. Дадайце даты, каб убачыць іх тут.", + "You do not have access to this project.": "У вас няма доступу да гэтага праекта.", + "Zoom level": "Маштаб", + "Unscheduled": "Не запланаваныя", + "Start: {date}": "Пачатак: {date}", + "Today": "Сёння", + "No scheduled tasks": "Няма запланаваных задач", + "An unexpected error occurred.": "Адбылася нечаканая памылка.", + "Column {number} name": "Назва слупка {number}", + "Failed to save creation policy": "Не ўдалося захаваць правіла стварэння", + "All authenticated users": "Усе карыстальнікі, якія ўвайшлі", + "Control who may create new projects": "Вызначце, хто можа ствараць новыя праекты", + "Administrators only": "Толькі адміністратары", + "Project creation": "Стварэнне праектаў", + "Allow project creation": "Дазволіць стварэнне праектаў", + "Creation policy saved successfully": "Правіла стварэння захавана", + "Initializing…": "Запуск…", + "e.g. 2h 30m, 90m, 1.5h": "напр. 2h 30m, 90m, 1.5h", + "Log time": "Улічыць час", + "Save estimate": "Захаваць ацэнку", + "Logged: {logged}": "Улічана: {logged}", + "over by {amount}": "перавышана на {amount}", + "Time tracking": "Улік часу", + "Estimate": "Ацэнка", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Увядзіце карэктную ацэнку (напр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Увядзіце карэктную працягласць (напр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Не ўдалося захаваць запіс часу. Паспрабуйце яшчэ раз.", + "Edit time entry": "Змяніць запіс часу", + "Duration": "Працягласць", + "Date range": "Перыяд", + "Last week": "Мінулы тыдзень", + "No time logged": "Час не ўлічаны", + "Log time on a task to see it here.": "Улічыце час у задачы, каб убачыць яго тут.", + "To date": "Па дату", + "This week": "Гэты тыдзень", + "Total: {total}": "Разам: {total}", + "From date": "З даты", + "Custom range": "Свой перыяд", + "All time": "За ўвесь час", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Не ўдалося выдаліць задачу, таму даныя маглі застацца. Выдаліце праект яшчэ раз.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Не ўдалося выдаліць запіс часу, таму даныя маглі застацца. Выдаліце праект яшчэ раз.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Не ўдалося выдаліць слупок, таму даныя маглі застацца. Выдаліце праект яшчэ раз.", + "Could not delete the project. Please try again.": "Не ўдалося выдаліць праект. Паспрабуйце яшчэ раз.", + "Notification settings": "Налады апавяшчэнняў", + "Configure when due-date reminders are sent": "Вызначце, калі адпраўляюцца напаміны пра тэрміны", + "Due-date reminder lead time (hours)": "Загадзя для напаміну (гадзіны)", + "Lead time must be between 1 and 336 hours": "Загадзя павінна быць ад 1 да 336 гадзін", + "Reminder lead time saved successfully": "Загадзя для напаміну захавана", + "Failed to save reminder lead time": "Не ўдалося захаваць загадзя для напаміну", + "Notifications": "Апавяшчэнні", + "Notify me 1 day before a task's due date": "Апавяшчаць мяне за 1 дзень да тэрміну задачы", + "Draft": "Чарнавік", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Ці ёсць урок чарнавіком, які бачыць толькі яго настаўнік, ці адбудзецца ён, ці адменены.", + "New release": "Новы выпуск", + "Roadmap chart. The same releases and epics are listed below.": "Дыяграма дарожнай карты. Тыя ж выпускі і эпікі пералічаны ніжэй.", + "Nothing on the roadmap yet": "На дарожнай карце яшчэ нічога няма", + "Releases with a target date and epics with dated tasks appear here.": "Тут з'яўляюцца выпускі з мэтавай датай і эпікі з задачамі, якія маюць дату.", + "Releases": "Выпускі", + "No releases yet": "Яшчэ няма выпускаў", + "Target date: {date}": "Мэтавая дата: {date}", + "No target date": "Без мэтавай даты", + "Edit {name}": "Рэдагаваць {name}", + "Mark {name} as released": "Пазначыць {name} як выпушчаны", + "Mark as released": "Пазначыць як выпушчаны", + "Epics": "Эпікі", + "No epics yet. Open a task to make it an epic.": "Яшчэ няма эпікаў. Адкрыйце задачу, каб зрабіць яе эпікам.", + "Not scheduled yet": "Яшчэ не запланавана", + "Planned": "Запланавана", + "Released": "Выпушчана", + "Edit release": "Рэдагаваць выпуск", + "Target date": "Мэтавая дата", + "Could not save the release. Please try again.": "Не ўдалося захаваць выпуск. Паспрабуйце яшчэ раз.", + "Every task of this release is done or cancelled.": "Кожная задача гэтага выпуску выканана або скасавана.", + "Not finished yet: {count}": "Яшчэ не завершана: {count}", + "What happens to these tasks?": "Што будзе з гэтымі задачамі?", + "Move to {name}": "Перамясціць у {name}", + "Remove the release": "Прыбраць выпуск", + "Keep it on {name}": "Пакінуць іх у {name}", + "Could not mark the release as released. Please try again.": "Не ўдалося пазначыць выпуск як выпушчаны. Паспрабуйце яшчэ раз.", + "Roadmap": "Дарожная карта", + "Tasks or roadmap": "Задачы або дарожная карта", + "Release": "Выпуск", + "Epic": "Эпік", + "This task is an epic": "Гэта задача з'яўляецца эпікам", + "A named, dated delivery of a project that its tasks are planned against.": "Названая пастаўка праекта з датай, пад якую плануюцца яго задачы.", + "Name of the release": "Назва выпуску", + "The project this release belongs to": "Праект, да якога належыць гэты выпуск", + "What this release delivers": "Што пастаўляе гэты выпуск", + "When work on the release starts": "Калі пачынаецца праца над выпускам", + "The date the release is due": "Дата, да якой выпуск павінен быць гатовы", + "Whether the release is planned, released or archived": "Ці выпуск запланаваны, выпушчаны ці архіваваны", + "Released on": "Выпушчана", + "When the release was marked as released": "Калі выпуск пазначылі як выпушчаны", + "The release this task is planned for": "Выпуск, на які запланавана гэта задача", + "Board view options": "Параметры выгляду дошкі", + "Colour cards": "Афарбаваць карткі", + "No colour": "Без колеру", + "By label": "Па метцы", + "Swimlanes": "Дарожкі", + "No swimlanes": "Без дарожак", + "By assignee": "Па выканаўцы", + "By epic": "Па эпіку", + "No assignee": "Не прызначана", + "No epic": "Без эпіка", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Карткі застаюцца ў радку свайго эпіка. Змяніце эпік на старонцы задачы.", + "Hand over to": "Перадаць", + "Could not save your board view. It applies until you reload.": "Выгляд дошкі не захаваны. Ён дзейнічае да перазагрузкі.", + "Timetable wish": "Пажаданне да раскладу", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Пажаданне, якое ўлічвае генератар. Жорсткае пажаданне ён выконвае заўсёды, мяккае, дзе можа.", + "Whether the wish is about a teacher, a group, a room or one activity": "Ці датычыць пажаданне настаўніка, групы, памяшкання ці аднаго занятку", + "Teacher": "Настаўнік", + "Group": "Група", + "Reference": "Спасылка", + "The user, group, room or activity the wish is about": "Карыстальнік, група, памяшканне ці занятак, якіх датычыць пажаданне", + "What the wish asks for": "Чаго просіць пажаданне", + "Not on these periods": "Не ў гэтыя ўрокі", + "Preferably not on these periods": "Лепш не ў гэтыя ўрокі", + "At most a number of lessons a day": "Не больш за пэўную колькасць урокаў у дзень", + "No free periods between lessons": "Без вокнаў паміж урокамі", + "Always the same room": "Заўсёды тое самае памяшканне", + "Periods": "Урокі", + "The periods of the week the wish is about, such as wed-5": "Урокі тыдня, якіх датычыць пажаданне, напрыклад wed-5", + "Limit": "Мяжа", + "The most lessons a day, for a wish of that kind": "Найбольшая колькасць урокаў у дзень для пажадання такога віду", + "Strength": "Сіла", + "Whether the generator must keep the wish or should keep it": "Ці мусіць генератар выканаць пажаданне, ці пажадана", + "Hard": "Жорсткае", + "Soft": "Мяккае", + "Weight": "Вага", + "How much a soft wish counts, from 1 to 3": "Колькі важыць мяккае пажаданне, ад 1 да 3", + "Why the wish exists": "Навошта існуе пажаданне", + "Timetable scenario": "Сцэнарый раскладу", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Адзін тыднёвы шаблон, створаны генератарам або ўзяты з цяперашняга раскладу. Ён захоўвае свае ўваходныя даныя і тое, як добра выконвае пажаданні.", + "The name timetablers know the scenario by": "Назва, пад якой складальнікі ведаюць сцэнарый", + "Whether the generator made it or it came from the current timetable": "Ці стварыў яго генератар, ці ён узяты з цяперашняга раскладу", + "Generated": "Згенераваны", + "From the current timetable": "З цяперашняга раскладу", + "Week of": "Тыдзень з", + "The Monday of the first week of the window": "Панядзелак першага тыдня перыяду", + "Window start": "Пачатак перыяду", + "The first day the week pattern applies to": "Першы дзень, да якога дастасоўваецца тыднёвы шаблон", + "Window end": "Канец перыяду", + "The last day the week pattern applies to": "Апошні дзень, да якога дастасоўваецца тыднёвы шаблон", + "Waiting, generating, done, failed, or published as draft lessons": "Чакае, ствараецца, гатовы, не ўдаўся або апублікаваны як чарнавыя ўрокі", + "Waiting": "Чакае", + "Generating": "Ствараецца", + "Failed": "Не ўдаўся", + "Published": "Апублікаваны", + "Seed": "Пачатковы лік", + "The number the generator starts from, so a run can be repeated": "Лік, з якога пачынае генератар, каб запуск можна было паўтарыць", + "Input": "Уваходныя даныя", + "The periods, rooms, lessons and wishes the scenario was made from": "Урокі, памяшканні, заняткі і пажаданні, з якіх зроблены сцэнарый", + "Placements": "Размяшчэнні", + "Each lesson with the period and room it was given": "Кожны занятак з атрыманымі ўрокам і памяшканнем", + "Unplaced lessons": "Неразмешчаныя заняткі", + "Lessons without a place, each with the hard wish that blocked it": "Заняткі без месца, кожны з жорсткім пажаданнем, якое яго спыніла", + "Broken wishes": "Парушаныя пажаданні", + "The wishes this scenario breaks, with the lessons that break them": "Пажаданні, якія парушае гэты сцэнарый, з заняткамі, што іх парушаюць", + "Measures": "Паказчыкі", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Размешчаныя заняткі, парушаныя пажаданні, вокны настаўнікаў, урокі ў дзень і выкарыстанне памяшканняў", + "Reason": "Прычына", + "Why the run failed": "Чаму запуск не ўдаўся", + "Published at": "Апублікаваны", + "When the scenario was written out as draft lessons": "Калі сцэнарый запісаны як чарнавыя ўрокі", + "Edit wish": "Рэдагаваць пажаданне", + "New wish": "Новае пажаданне", + "Hard: the generator always keeps it": "Абавязковае: генератар заўсёды яго выконвае", + "Soft: the generator keeps it where it can": "Гнуткае: генератар выконвае яго, калі можа", + "Weight (1 to 3)": "Вага (ад 1 да 3)", + "Most lessons a day": "Не больш за столькі ўрокаў у дзень", + "Period": "Урок", + "{day} period {number}": "{day} урок {number}", + "Teacher (user name)": "Настаўнік (імя карыстальніка)", + "Activity (group:subject)": "Заняткі (група:прадмет)", + "Say who or what the wish is about.": "Пазначце, каго ці чаго датычыць пажаданне.", + "Choose at least one period.": "Выберыце хаця б адзін урок.", + "The limit is a whole number of 1 or more.": "Ліміт: цэлы лік ад 1.", + "Timetable": "Расклад", + "Wishes": "Пажаданні", + "Timetable wishes": "Пажаданні да раскладу", + "Generator run": "Запуск генератара", + "Generator progress": "Ход генератара", + "The run failed: {reason}": "Запуск не ўдаўся: {reason}", + "{placed} of {lessons} lessons placed": "Размешчана {placed} з {lessons} урокаў", + "Generate again": "Згенераваць зноў", + "Generate": "Згенераваць", + "Every lesson has a place.": "Кожны ўрок мае месца.", + "Lesson": "Урок", + "No free period and room": "Няма вольнага ўрока і кабінета", + "Broken soft wishes": "Парушаныя гнуткія пажаданні", + "Every soft wish is kept.": "Кожнае гнуткае пажаданне выканана.", + "Wish": "Пажаданне", + "Lessons": "Урокі", + "Generating: {percent}% of the time budget used": "Генерацыя: выкарыстана {percent}% часу", + "Waiting to start": "Чакае запуску", + "Published as draft lessons": "Апублікавана як чарнавікі ўрокаў", + "Could not read the scenario.": "Не ўдалося прачытаць сцэнарый.", + "Could not start the run.": "Не ўдалося пачаць запуск.", + "Scenarios": "Сцэнарыі", + "Timetable scenarios": "Сцэнарыі раскладу", + "Scenario": "Сцэнарый", + "Take the current timetable": "Узяць бягучы расклад", + "Could not take the current timetable.": "Не ўдалося ўзяць бягучы расклад.", + "Broken hard wishes": "Парушаныя абавязковыя пажаданні", + "Not on a period of the week grid": "Не на ўроку тыднёвай сеткі", + "Compare scenarios": "Параўнаць сцэнарыі", + "Scenarios to compare": "Сцэнарыі для параўнання", + "Choose two or three scenarios to compare them.": "Выберыце два ці тры сцэнарыі, каб параўнаць іх.", + "Measure": "Паказчык", + "Best": "Найлепшы", + "Lessons that differ": "Урокі, якія адрозніваюцца", + "No lesson differs.": "Ніводзін урок не адрозніваецца.", + "Not placed": "Не размешчаны", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Размешчаныя ўрокі", + "Lessons without a place": "Урокі без месца", + "Clashes": "Канфлікты", + "Hard wishes broken": "Парушаныя абавязковыя пажаданні", + "Soft wishes broken": "Парушаныя гнуткія пажаданні", + "Soft wishes broken, weighted": "Парушаныя гнуткія пажаданні, узважаныя", + "Free periods between lessons, all teachers": "Вокны, усе настаўнікі", + "Most free periods of one teacher": "Найбольш вокнаў у аднаго настаўніка", + "Most lessons of one group on a day": "Найбольш урокаў адной групы за дзень", + "Room use": "Выкарыстанне кабінетаў", + "Publish as draft lessons": "Апублікаваць як чарнавікі ўрокаў", + "Draft lessons written: {count}": "Запісана чарнавікоў урокаў: {count}", + "Could not publish the scenario.": "Не ўдалося апублікаваць сцэнарый.", + "Rules": "Правілы", + "Rules for {column}": "Правілы для {column}", + "When a card enters this column": "Калі картка трапляе ў гэты слупок", + "Action": "Дзеянне", + "Set the priority": "Задаць прыярытэт", + "Assign to": "Прызначыць", + "Assign the person who moved the card": "Прызначыць таму, хто перамясціў картку", + "Remove the assignee": "Прыбраць выканаўцу", + "Add a label": "Дадаць метку", + "No longer a project member": "Ужо не ўдзельнік праекта", + "This label no longer exists": "Гэтай меткі больш няма", + "Add rule": "Дадаць правіла", + "Remove rule": "Выдаліць правіла", + "No rules yet. Add one to change a card when it enters this column.": "Правілаў пакуль няма. Дадайце правіла, каб мяняць картку, калі яна трапляе ў гэты слупок.", + "Could not save the rules. Please try again.": "Не ўдалося захаваць правілы. Паспрабуйце яшчэ раз.", + "1 rule runs when a card enters this column": "1 правіла спрацоўвае, калі картка трапляе ў гэты слупок", + "{count} rules run when a card enters this column": "Колькасць правілаў, якія спрацоўваюць, калі картка трапляе ў гэты слупок: {count}", + "Rules applied: {changes}": "Ужытыя правілы: {changes}", + "assigned to {name}": "прызначана: {name}", + "assignee removed": "выканаўца прыбраны", + "priority {priority}": "прыярытэт {priority}", + "label {label}": "метка {label}", + "What happens to a card when it enters this column, applied in list order.": "Што адбываецца з карткай, калі яна трапляе ў гэты слупок, у парадку спіса.", + "Value": "Значэнне", + "What the rule does to the card.": "Што правіла робіць з карткай.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Прыярытэт, id карыстальніка або id меткі, якія выкарыстоўвае дзеянне; пуста для дзеянняў без значэння.", + "is not": "не", + "{dimension} is not": "{dimension} не", + "Saved filters": "Захаваныя фільтры", + "No saved filters yet": "Захаваных фільтраў пакуль няма", + "Save filter": "Захаваць фільтр", + "Rename \"{name}\"": "Перайменаваць «{name}»", + "Delete \"{name}\"": "Выдаліць «{name}»", + "Clear filters": "Ачысціць фільтры", + "Showing {shown} of {total} tasks": "Паказана {shown} з {total} задач", + "Me": "Я", + "No date": "Без даты", + "Rename saved filter": "Перайменаваць захаваны фільтр", + "Share with the project": "Абагуліць з праектам", + "Give the filter a name": "Дайце фільтру назву", + "Could not save the filter. Please try again.": "Не ўдалося захаваць фільтр. Паспрабуйце яшчэ раз.", + "Some labels in \"{name}\" no longer exist and were left out.": "Некаторых метак з «{name}» больш няма, іх прапушчана.", + "Could not delete the filter. Please try again.": "Не ўдалося выдаліць фільтр. Паспрабуйце яшчэ раз.", + "Saved filter": "Захаваны фільтр", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Названы фільтр дошкі аднаго праекта, асабісты для таго, хто яго захаваў, калі ён не абагулены з праектам.", + "The project whose board the filter applies to": "Праект, да дошкі якога адносіцца фільтр", + "The name the filter is listed under": "Назва, пад якой фільтр паказаны ў спісе", + "Saved by": "Захаваў(ла)", + "Nextcloud user id of the person who saved the filter": "Id карыстальніка Nextcloud таго, хто захаваў фільтр", + "Shared with the project": "Абагулены з праектам", + "Whether every project member sees and applies the filter": "Ці бачыць кожны ўдзельнік праекта фільтр і ці можа яго ўжыць", + "Criteria": "Крытэрыі", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Фільтр: выканаўца, метка, прыярытэт і тэрмін, кожны з ёсць або не і значэннямі", + "Cross-project view": "Міжпраектны выгляд", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Захаваны набор праектаў, задачы якіх паказваюцца разам у калонках па статусе, з доступам для названых людзей.", + "Shared with": "Даступна для", + "The name the view is listed under": "Назва, пад якой выгляд паказаны ў спісе", + "Nextcloud user id of the person who saved the view": "Ідэнтыфікатар карыстальніка Nextcloud таго, хто захаваў выгляд", + "Nextcloud user ids of the people the view is shared with": "Ідэнтыфікатары карыстальнікаў Nextcloud тых, каму адкрыты выгляд", + "The projects whose tasks the view shows, at most twenty": "Праекты, задачы якіх паказвае выгляд, не больш за дваццаць", + "1 project in this view is hidden from you.": "1 праект у гэтым выглядзе схаваны ад вас.", + "{count} projects in this view are hidden from you.": "Праекты ў гэтым выглядзе, схаваныя ад вас: {count}.", + "{project} has no column for {status}.": "У праекта {project} няма калонкі для статусу {status}.", + "This view does not exist or is not shared with you.": "Гэты выгляд не існуе або вам не адкрыты.", + "\"{task}\" moved to {status}.": "\"{task}\" перамешчана ў {status}.", + "Project: {title}": "Праект: {title}", + "Cross-project views": "Міжпраектныя выгляды", + "New view": "Новы выгляд", + "Edit view": "Змяніць выгляд", + "Delete view": "Выдаліць выгляд", + "Give the view a name": "Дайце выгляду назву", + "Pick at least one project": "Выберыце хаця б адзін праект", + "A view shows at most {max} projects": "Выгляд паказвае не больш за {max} праектаў", + "Could not save the view. Please try again.": "Не ўдалося захаваць выгляд. Паспрабуйце яшчэ раз.", + "Could not delete the view. Please try again.": "Не ўдалося выдаліць выгляд. Паспрабуйце яшчэ раз.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Выдаліць «{title}»? Праекты і іх задачы застануцца без змен.", + "People see the tasks of the projects they are in, never more.": "Кожны бачыць толькі задачы праектаў, у якіх удзельнічае.", + "No views yet. A view shows the tasks of several of your projects together.": "Выглядаў пакуль няма. Выгляд паказвае задачы некалькіх вашых праектаў разам.", + "Projects in view: {count}": "Праектаў у выглядзе: {count}", + "Notify me when a task is assigned to me": "Паведамляць мне, калі мне прызначаюць задачу", + "Also send these to me by email": "Таксама дасылаць іх мне па пошце", + "Add an email address in your Nextcloud personal settings to get mail.": "Дадайце адрас электроннай пошты ў асабістых наладах Nextcloud, каб атрымліваць лісты.", + "Code link": "Спасылка на код", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Коміт, галіна, запыт на зліццё або задача ў сэрвісе кода, звязаныя з заданнем.", + "The task the link belongs to": "Заданне, да якога належыць спасылка", + "The project of the task": "Праект задання", + "Task key": "Ключ задання", + "The task key the forge text named, such as VC-12": "Ключ задання, названы ў тэксце сэрвісу кода, напрыклад VC-12", + "What the link points at": "На што паказвае спасылка", + "Link": "Спасылка", + "The address of the item in the forge": "Адрас элемента ў сэрвісе кода", + "The commit message, branch name or merge request title": "Паведамленне каміта, назва галіны або загаловак запыту на зліццё", + "Repository": "Рэпазіторый", + "The repository, such as acme/portal": "Рэпазіторый, напрыклад acme/portal", + "Forge id": "Id у сэрвісе", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Уласны id элемента ў сэрвісе кода, напрыклад github:acme/portal#42 або хэш каміта", + "State": "Стан", + "The state of a merge request or issue": "Стан запыту на зліццё або задачы", + "Who made the commit or opened the merge request": "Хто зрабіў каміт або адкрыў запыт на зліццё", + "When the commit was made or the merge request last changed": "Калі зроблены каміт або апошні раз змяніўся запыт на зліццё", + "Added by": "Кім дададзена", + "Whether a person added the link or the integration wrote it": "Ці дадаў спасылку чалавек, ці яе запісала інтэграцыя", + "Nextcloud user UIDs of project members": "ID карыстальнікаў Nextcloud удзельнікаў праекта", + "Add link": "Дадаць спасылку", + "Added by hand": "Дададзена ўручную", + "Branch": "Галіна", + "Code": "Код", + "Commit": "Каміт", + "From the integration": "З інтэграцыі", + "Link to a commit, branch or merge request": "Спасылка на каміт, галіну або запыт на зліццё", + "Merge request": "Запыт на зліццё", + "Merged": "Злiты", + "No code linked yet. Name {key} in a commit message or paste a link.": "Код яшчэ не прывязаны. Назавіце {key} у паведамленні каміта або ўстаўце спасылку.", + "No code linked yet. Paste a link to a commit or merge request.": "Код яшчэ не прывязаны. Устаўце спасылку на каміт або запыт на зліццё.", + "Paste a web address that starts with https://.": "Устаўце вэб-адрас, які пачынаецца з https://.", + "Remove link {title}": "Выдаліць спасылку {title}", + "The link could not be added.": "Не ўдалося дадаць спасылку.", + "The link could not be removed.": "Не ўдалося выдаліць спасылку.", + "This link is already on the task.": "Гэтая спасылка ўжо ёсць у заданні.", + "Code forges": "Сэрвісы кода", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Звязвайце каміты і pull request з GitHub з заданнямі. Integriq атрымлівае падзеі; planninq ніколі не звяртаецца да GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Спампуйце канфігурацыю і імпартуйце яе ў Integriq. Потым укажыце сакрэт у правіле \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "У GitHub дадайце да рэпазіторыя webhook з гэтым адрасам і тым жа сакрэтам. Выберыце тып змесціва application/json і падзеі push і pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Назавіце ключ задання, напрыклад VC-12, у паведамленні каміта, назве галіны або загалоўку pull request. Спасылка тады з'явіцца ў гэтым заданні.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq удзельнікі праекта ўсё роўна могуць уставіць спасылку на старонцы задання.", + "Download the Integriq configuration": "Спампаваць канфігурацыю Integriq", + "Calendar": "Каляндар", + "Previous": "Назад", + "Calendar view": "Выгляд каляндара", + "Starts:": "Пачатак:", + "No tasks with a date in this month.": "У гэтым месяцы няма заданняў з датай.", + "Week of {start} to {end}": "Тыдзень з {start} па {end}", + "My calendar": "Мой каляндар", + "Show as list": "Паказаць спісам", + "Show as calendar": "Паказаць у каляндары", + "Open my calendar": "Адкрыць мой каляндар", + "Nextcloud Tasks": "Заданні Nextcloud", + "Show my tasks in Nextcloud Tasks": "Паказваць мае заданні ў Заданнях Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Заданні, прызначаныя вам або абагуленыя з вамі, з'яўляюцца ў спісе \"Planninq\" у Заданнях і Каляндары Nextcloud. Змены, зробленыя там, замяняюцца пры наступнай змене ў Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Гэты сервер не можа запісваць у Заданні Nextcloud, таму экспарт недаступны.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Кіруецца Planninq. Змены, зробленыя тут, замяняюцца пры наступнай змене ў Planninq.", + "Working days and holidays": "Працоўныя і святочныя дні", + "Dates set on the timeline skip the days that are not working days.": "Даты, зададзеныя на часавой шкале, прапускаюць непрацоўныя дні.", + "Working weekdays": "Працоўныя дні тыдня", + "Non-working days": "Непрацоўныя дні", + "No non-working days yet.": "Непрацоўных дзён пакуль няма.", + "Add day": "Дадаць дзень", + "Year": "Год", + "Add Dutch national holidays": "Дадаць дзяржаўныя святы Нідэрландаў", + "Save working days": "Захаваць працоўныя дні", + "Choose at least one working weekday.": "Выберыце хаця б адзін працоўны дзень.", + "Working days saved.": "Працоўныя дні захаваны.", + "Could not save the working days.": "Не ўдалося захаваць працоўныя дні.", + "New Year's Day": "Новы год", + "Easter Sunday": "Вялікдзень", + "Easter Monday": "Велікодны панядзелак", + "King's Day": "Дзень караля", + "Liberation Day": "Дзень вызвалення", + "Ascension Day": "Узнясенне", + "Whit Sunday": "Тройца", + "Whit Monday": "Духаў дзень", + "Christmas Day": "Каляды", + "Boxing Day": "Другі дзень Калядаў", + "Dates of {title}": "Даты задання {title}", + "The due date cannot be before the start date.": "Тэрмін не можа быць раней за дату пачатку.", + "{title}, from {start} to {end}": "{title}, з {start} па {end}", + "The dates could not be saved.": "Не ўдалося захаваць даты.", + "{title} now runs from {start} to {end}": "{title} цяпер доўжыцца з {start} па {end}", + "Auto-scheduling": "Аўтаматычнае планаванне", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Калі ўключана, перанос тэрміну на часавой шкале пазней прапануе зрушыць і заблакаваныя ім заданні.", + "Move blocked tasks along when a task slips": "Зрушваць заблакаваныя заданні, калі заданне затрымліваецца", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На часавой шкале пазнейшы тэрмін прапануе зрушыць заблакаваныя заданні. Улічваюцца толькі сувязі \"блакуе\", і заданні зрушваюцца толькі пазней.", + "Move the tasks that wait for {title}?": "Зрушыць заданні, якія чакаюць {title}?", + "These tasks wait for it and would start after its new due date:": "Гэтыя заданні чакаюць яго і пачнуцца пасля новага тэрміну:", + "{count} tasks would move; the first {limit} are listed.": "Будзе зрушана заданняў: {count}; паказаны першыя {limit}.", + "Now": "Цяпер", + "After the move": "Пасля зруху", + "Only this task": "Толькі гэтае заданне", + "Move all": "Зрушыць усе", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Спынена на {title}: не ўдалося захаваць даты. Заданні перад ім зрушаны.", + "Cumulative flow": "Назапашвальны паток", + "Show as chart": "Паказаць як дыяграму", + "Show as table": "Паказаць як табліцу", + "Tasks per column per day": "Задачы па слупках па днях", + "Tasks without recorded history in this period: {count}": "Задачы без запісанай гісторыі за гэты перыяд: {count}", + "Lead and cycle time": "Час выканання і час цыкла", + "No tasks were finished in this period.": "За гэты перыяд не завершана ніводнай задачы.", + "Finished tasks": "Завершаныя задачы", + "Cycle time, average": "Час цыкла, сярэдні", + "Cycle time, 85th percentile": "Час цыкла, 85-ы процентыль", + "Lead time, average": "Час выканання, сярэдні", + "Tasks whose finish time was estimated from their history: {count}": "Задачы, час завяршэння якіх ацэнены па гісторыі: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Час цыкла кожнай завершанай задачы з сярэднім і 85-м процентылем", + "Slowest tasks": "Самыя павольныя задачы", + "cycle {cycle}, lead {lead}": "цыкл {cycle}, выкананне {lead}", + "{days} days": "{days} дз.", + "Could not load the flow of this project.": "Не ўдалося загрузіць паток гэтага праекта.", + "Last {days} days": "Апошнія {days} дз.", + "Portfolio flow": "Паток партфеля", + "An admin adds portfolios under Projects, Portfolios.": "Адміністратар дадае партфелі ў раздзеле Праекты, Партфелі.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Непаказаныя праекты, бо адначасова паказваецца не больш за 50: {count}", + "Could not load the flow of this portfolio.": "Не ўдалося загрузіць паток гэтага партфеля.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Назапашвальны паток і час цыкла па праектах партфеля.", + "Edit report": "Змяніць справаздачу", + "Only tasks where": "Толькі задачы, дзе", + "Group by": "Групаваць па", + "Display": "Выгляд", + "Share with everyone who can read its projects": "Падзяліцца з усімі, хто можа чытаць яе праекты", + "The report could not be saved.": "Не ўдалося захаваць справаздачу.", + "Number of tasks": "Колькасць задач", + "Bar": "Слупкі", + "Donut": "Кольца", + "Table": "Табліца", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} з {total} праектаў у гэтай справаздачы вам не бачныя", + "No tasks match this report.": "Ніводная задача не адпавядае гэтай справаздачы.", + "None": "Няма", + "Could not load this report.": "Не ўдалося загрузіць гэту справаздачу.", + "Report": "Справаздача", + "Your reports": "Вашы справаздачы", + "My reports": "Мае справаздачы", + "Shared reports": "Агульныя справаздачы", + "You have not built a report yet.": "Вы яшчэ не стварылі ніводнай справаздачы.", + "Nobody has shared a report with you yet.": "З вамі яшчэ ніхто не падзяліўся справаздачай.", + "Reports you built over tasks, and the ones shared with you.": "Справаздачы, якія вы стварылі па задачах, і тыя, якімі падзяліліся з вамі.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Захаваны запыт па задачах: якія праекты, якія фільтры, групоўка па чым, колькасць або сума, у выглядзе табліцы ці дыяграмы.", + "The name the report is listed under": "Назва, пад якой справаздача паказана ў спісе", + "What the report shows and who it is for": "Што паказвае справаздача і для каго яна", + "Nextcloud user id of the person who saved the report": "Ідэнтыфікатар карыстальніка Nextcloud, які захаваў справаздачу", + "Who can open the report": "Хто можа адкрыць справаздачу", + "Only me": "Толькі я", + "Everyone who can read its projects": "Усе, хто можа чытаць яе праекты", + "The projects the report covers, at most fifty": "Праекты, якія ахоплівае справаздача, не больш за пяцьдзесят", + "Filters": "Фільтры", + "Task fields and the value each must equal": "Палі задачы і значэнне, якому павінна быць роўна кожнае", + "The task field the report groups on": "Поле задачы, па якім групуе справаздача", + "Count the tasks, or add up a number on them": "Палічыць задачы або скласці лік па іх", + "Sum": "Сума", + "Sum of": "Сума па", + "The number added up when the measure is a sum": "Лік, які складваецца, калі мера гэта сума", + "Story points": "Балы гісторый", + "Estimated duration": "Ацэначная працягласць", + "How the report is shown": "Як паказваецца справаздача", + "Issue type": "Тып задачы", + "Task fields and the value each must equal; empty when the report covers every task": "Палі задачы і значэнне, якому мусіць адпавядаць кожнае; пуста, калі справаздача ахоплівае ўсе задачы", + "The status a task must have": "Статус, які мусіць мець задача", + "The priority a task must have": "Прыярытэт, які мусіць мець задача", + "The user a task must be assigned to": "Карыстальнік, якому мусіць быць прызначана задача", + "A label a task must carry": "Метка, якую мусіць мець задача", + "The board column a task must be in": "Слупок дошкі, у якім мусіць быць задача", + "The issue type a task must have": "Тып, які мусіць мець задача", + "Manager groups": "Групы кіраўнікоў", + "Member groups": "Групы ўдзельнікаў", + "Viewer groups": "Групы чытачоў", + "Viewers": "Чытачы", + "Owning group": "Група-ўладальнік", + "Nextcloud groups whose members manage the project": "Групы Nextcloud, удзельнікі якіх кіруюць праектам", + "Nextcloud groups whose members work on the project": "Групы Nextcloud, удзельнікі якіх працуюць над праектам", + "Nextcloud groups whose members may read the project": "Групы Nextcloud, удзельнікі якіх могуць чытаць праект", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Карыстальнікі Nextcloud, якія кіруюць праектам: наладамі, удзельнікамі і працай", + "Nextcloud user ids who may read the project and its work but not change it": "Карыстальнікі Nextcloud, якія могуць чытаць праект і яго працу, але не змяняць", + "The Nextcloud group that owns the project with its creator, at most one": "Група Nextcloud, якая валодае праектам разам з яго аўтарам, не больш за адну", + "Nextcloud user ids who may read this through the project": "Карыстальнікі Nextcloud, якія могуць чытаць гэта праз праект", + "Nextcloud groups whose members may change this through the project": "Групы Nextcloud, удзельнікі якіх могуць змяняць гэта праз праект", + "Nextcloud groups whose members may read this through the project": "Групы Nextcloud, удзельнікі якіх могуць чытаць гэта праз праект", + "Search for a person or a group…": "Шукаць чалавека або групу…", + "No one found. Your admin's sharing settings decide who you can find.": "Нікога не знойдзена. Каго вы можаце знайсці, вызначаюць налады абагульвання вашага адміністратара.", + "Type at least two characters": "Увядзіце не менш за два сімвалы", + "Everyone in this group": "Усе ў гэтай групе", + "Could not search for people. Please try again.": "Не ўдалося знайсці людзей. Паспрабуйце яшчэ раз.", + "Could not remove the group": "Не ўдалося выдаліць групу", + "Only the owner and managers change who is on this project.": "Толькі ўладальнік і кіраўнікі змяняюць склад гэтага праекта.", + "Role of {name}": "Роля: {name}", + "Manager": "Кіраўнік", + "Member": "Удзельнік", + "Viewer": "Чытач", + "Could not change the role": "Не ўдалося змяніць ролю", + "Owned by group: {name}": "Належыць групе: {name}", + "No group owns this project.": "Гэты праект не належыць ніводнай групе.", + "Owned by group": "Належыць групе", + "Search for a group…": "Знайсці групу…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Група не знойдзена. Налады абагульвання вашага адміністратара вызначаюць, якія групы вы можаце знайсці.", + "No owning group": "Без групы-ўладальніка", + "Could not search for groups. Please try again.": "Не ўдалося знайсці групы. Паспрабуйце яшчэ раз.", + "Could not change the owning group": "Не ўдалося змяніць групу-ўладальніка", + "You can read this project. Only its members change it.": "Вы можаце чытаць гэты праект. Змяняюць яго толькі яго ўдзельнікі.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, які выкладаюць на гэтым уроку, напрыклад факультатыў, калі школьная навучальная праграма яго ведае.", + "Online meeting link": "Спасылка на анлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Дзе вучні далучаюцца да гэтага ўрока анлайн. Кнопка «Далучыцца» з'яўляецца толькі для спасылкі https." }, "plurals": {} } diff --git a/l10n/bg.js b/l10n/bg.js index 3061dede..bbd49ad8 100644 --- a/l10n/bg.js +++ b/l10n/bg.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Активни проекти", + "Archived projects": "Архивирани проекти", + "Boards": "Табла", + "My projects": "Моите проекти", + "Portfolio": "Портфолио", + "Project board": "Табло на проекта", + "Projects I am in": "Проекти, в които участвам", + "Timeline": "Времева линия", + "Timesheet": "Отчет за времето", + "Features & roadmap": "Функции и пътна карта", + "Flow": "Поток", + "Flows": "Потоци", + "Reports": "Отчети", + "Pick a report to open it.": "Изберете отчет, за да го отворите.", + "In progress": "В процес", + "Date": "Дата", + "Due": "Краен срок", + "Assignee": "Възложено на", + "Who": "Кой", + "What": "Какво", + "Minutes": "Минути", + "Entries": "Записи", + "Most recent": "Най-скорошни", + "Per person": "На човек", + "By status": "По статус", + "By priority": "По приоритет", + "Task status": "Статус на задачите", + "Time spent": "Изразходвано време", + "Capacity": "Капацитет", + "Due soonest": "Най-скоро дължими", + "Minutes logged": "Записани минути", + "Nothing is due": "Няма нищо дължимо", + "Nothing logged yet": "Още нищо не е записано", + "What is open, what is blocked, and what is overdue.": "Какво е отворено, какво е блокирано и какво е просрочено.", + "How allocation is spread across the people working on projects.": "Как е разпределено натоварването между хората по проектите.", + "Hours logged, and the projects they went to.": "Записаните часове и проектите, за които са отишли.", + "Billable": "Таксуемо", + "Budget: {amount}": "Бюджет: {amount}", + "Loading projects": "Зареждане на проекти", + "No projects for this client yet": "Все още няма проекти за този клиент", + "Open in Planninq": "Отваряне в Planninq", + "This project could not be found": "Този проект не беше намерен", + "Untitled project": "Проект без име", + "and {count} more": "и още {count}", + "Store": "Магазин", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Инсталирайте регистри, схеми и потоци, публикувани от други организации.", + "Work Date": "Работна дата", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Действия с колоната", + "Columns": "Колони", + "Could not remove the column. Please try again.": "Колоната не можа да бъде премахната. Опитайте отново.", + "Could not save the column. Please try again.": "Колоната не можа да бъде запазена. Опитайте отново.", + "Done column": "Колона за завършени", + "Edit column": "Редактиране на колоната", + "Keep the card's status": "Запазване на статуса на картата", + "Move its cards to": "Преместване на картите в", + "Move left": "Преместване наляво", + "Move right": "Преместване надясно", + "Status of cards moved here": "Статус на картите, преместени тук", + "The last done column cannot be removed.": "Последната колона за завършени не може да бъде премахната.", + "WIP limit": "WIP лимит", + "over limit": "над лимита", + "The status a card gets when it is moved into this column.": "Статусът, който картата получава, когато бъде преместена в тази колона.", + "All priorities": "Всички приоритети", + "Could not create the task. Please try again.": "Задачата не можа да бъде създадена. Опитайте отново.", + "Created": "Създадена", + "Move to backlog": "Към беклога", + "Move to board": "Към таблото", + "New task": "Нова задача", + "Nothing in the backlog": "Няма нищо в беклога", + "Rank": "Ранг", + "Sort by": "Сортиране по", + "Sort by rank to reorder": "Сортирайте по ранг, за да пренаредите", + "Task actions": "Действия със задачата", + "All labels": "Всички етикети", + "Filter tasks by label": "Филтриране на задачите по етикет", + "View timeline": "Преглед на времевата линия", + "Board": "Табло", + "List": "Списък", + "Column": "Колона", + "Board or list": "Табло или списък", + "Log": "Дневник", + "Add entry": "Добавяне на запис", + "Show": "Показване", + "No actions yet": "Все още няма действия", + "Closed": "Затворен", + "Entry actions": "Действия със записа", + "Add action": "Добавяне на действие", + "by {author}": "от {author}", + "saved {time}": "запазено {time}", + "Attendees: {names}": "Присъстващи: {names}", + "Add the first entry": "Добавяне на първия запис", + "Issues": "Проблеми", + "Lessons learned": "Научени уроци", + "Meetings": "Срещи", + "Decisions": "Решения", + "Actions": "Действия", + "Issue": "Проблем", + "Lesson learned": "Научен урок", + "Meeting": "Среща", + "Decision": "Решение", + "About this project": "За този проект", + "No description yet": "Все още няма описание", + "Start date": "Начална дата", + "Not set": "Не е зададено", + "End date": "Крайна дата", + "Progress": "Напредък", + "No tasks yet": "Все още няма задачи", + "Open the board": "Отваряне на таблото", + "People": "Хора", + "Owner": "Собственик", + "Latest log entries": "Последни записи", + "Open the log": "Отваряне на дневника", + "{done} of {total} tasks done": "{done} от {total} задачи са готови", + "Edit entry": "Редактиране на запис", + "Type": "Вид", + "Attendees": "Присъстващи", + "Issue is closed": "Проблемът е затворен", + "Could not save the entry. Please try again.": "Записът не можа да бъде запазен. Опитайте отново.", + "From: {title}": "От: {title}", + "What needs to happen": "Какво трябва да се направи", + "Could not create the action. Please try again.": "Действието не можа да бъде създадено. Опитайте отново.", + "The action was created but could not be linked to the entry.": "Действието е създадено, но не можа да бъде свързано със записа.", + "Project pages": "Страници на проекта", + "Overview": "Преглед", + "Risks": "Рискове", + "Log entry": "Запис в дневника", + "A short name for the entry": "Кратко име за записа", + "Project": "Проект", + "The project this entry belongs to": "Проектът, към който принадлежи този запис", + "What kind of entry this is": "Какъв вид запис е това", + "When it happened": "Кога се е случило", + "What happened, in Markdown": "Какво се е случило, в Markdown", + "Whether an issue is still open": "Дали проблемът все още е отворен", + "The people at a meeting": "Хората на среща", + "Tasks that came out of this entry": "Задачи, произлезли от този запис", + "Add risk": "Добавяне на риск", + "Risk": "Риск", + "Score": "Оценка", + "Response": "Реакция", + "Review date": "Дата за преглед", + "no longer on the project": "вече не е в проекта", + "Edit {title}": "Редактиране на {title}", + "No risks recorded yet": "Все още няма записани рискове", + "Add the first risk": "Добавяне на първия риск", + "Medium": "Среден", + "Mitigating": "Смекчава се", + "Occurred": "Настъпил", + "Avoid": "Избягване", + "Reduce": "Намаляване", + "Transfer": "Прехвърляне", + "Accept": "Приемане", + "Highest open risks": "Най-високи отворени рискове", + "No open risks": "Няма отворени рискове", + "Open the risk register": "Отваряне на регистъра на рисковете", + "Edit risk": "Редактиране на риск", + "What could go wrong": "Какво може да се обърка", + "Likelihood": "Вероятност", + "Impact": "Въздействие", + "Score {score}": "Оценка {score}", + "Countermeasures": "Мерки", + "Could not save the risk. Please try again.": "Рискът не можа да бъде запазен. Опитайте отново.", + "Risks by likelihood and impact": "Рискове по вероятност и въздействие", + "Risk scale": "Скала на риска", + "The levels every project scores its risks on, and where low turns into medium and high": "Нивата, по които всеки проект оценява рисковете си, и къде ниско преминава в средно и високо", + "Number of levels": "Брой нива", + "Likelihood labels": "Етикети за вероятност", + "Impact labels": "Етикети за въздействие", + "Level {level}": "Ниво {level}", + "Medium from score": "Средно от оценка", + "High from score": "Високо от оценка", + "Risk scale saved": "Скалата на риска е запазена", + "1 risk uses level {level}. Change it first.": "1 риск използва ниво {level}. Първо го променете.", + "{count} risks use level {level}. Change them first.": "{count} риска използват ниво {level}. Първо ги променете.", + "Every level needs a label, and high must start above medium.": "Всяко ниво има нужда от етикет, а високо трябва да започва над средно.", + "The project this risk belongs to": "Проектът, към който принадлежи този риск", + "The cause and the effect, in Markdown": "Причината и последицата, в Markdown", + "Category": "Категория", + "A free grouping, such as planning, budget or supplier": "Свободно групиране, например планиране, бюджет или доставчик", + "How likely it is, on the admin's risk scale": "Колко вероятно е, по скалата на риска на администратора", + "How hard it would hit, on the admin's risk scale": "Колко силно би ударило, по скалата на риска на администратора", + "Likelihood times impact, calculated by the server": "Вероятност по въздействие, изчислено от сървъра", + "Where the risk stands": "Докъде е стигнал рискът", + "The person who watches this risk": "Човекът, който следи този риск", + "How the project answers the risk": "Как проектът отговаря на риска", + "What is done to prevent it or soften it, in Markdown": "Какво се прави, за да се предотврати или смекчи, в Markdown", + "When to look at this risk again": "Кога рискът да се прегледа отново", + "Very low": "Много ниско", + "Very high": "Много високо", + "All projects": "Всички проекти", + "Project status report": "Доклад за състоянието на проекта", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датиран доклад за това как стои проектът по пари, организация, време, информация, качество и риск (аспектите GROTIK), всеки с бележка.", + "The project this report is about": "Проектът, за който е докладът", + "Report date": "Дата на доклада", + "The day the report describes": "Денят, който докладът описва", + "Money": "Пари", + "How the project stands on this aspect": "Как стои проектът по този аспект", + "On track": "По план", + "At risk": "В риск", + "Off track": "Извън плана", + "Money note": "Бележка за парите", + "A short explanation of this status": "Кратко обяснение на това състояние", + "Organisation": "Организация", + "Organisation note": "Бележка за организацията", + "Time": "Време", + "Time note": "Бележка за времето", + "Information": "Информация", + "Information note": "Бележка за информацията", + "Quality": "Качество", + "Quality note": "Бележка за качеството", + "Risk note": "Бележка за риска", + "Overall": "Общо", + "The worst of the six statuses, calculated by the server": "Най-лошото от шестте състояния, изчислено от сървъра", + "Health: money": "Състояние: пари", + "Copied from the newest status report": "Копирано от най-новия доклад за състоянието", + "Health: organisation": "Състояние: организация", + "Health: time": "Състояние: време", + "Health: information": "Състояние: информация", + "Health: quality": "Състояние: качество", + "Health: risk": "Състояние: риск", + "Health: overall": "Състояние: общо", + "Health: report date": "Състояние: дата на доклада", + "The date of the newest status report": "Датата на най-новия доклад за състоянието", + "New report": "Нов доклад", + "Only the project owner writes status reports.": "Само собственикът на проекта пише доклади за състоянието.", + "Latest report, {date}": "Последен доклад, {date}", + "Aspect": "Аспект", + "Note": "Бележка", + "Report history": "История на докладите", + "Author": "Автор", + "No status reports yet": "Все още няма доклади за състоянието", + "Write the first report": "Напишете първия доклад", + "Choose a status for every aspect to save the report.": "Изберете състояние за всеки аспект, за да запазите доклада.", + "Suggested: on track.": "Предложение: по план.", + "Suggested: at risk.": "Предложение: в риск.", + "Suggested: off track.": "Предложение: извън плана.", + "1 task is past its due date.": "1 задача е с изтекъл срок.", + "{count} tasks are past their due date.": "Задачи с изтекъл срок: {count}.", + "The end date has passed with 1 open task.": "Крайната дата е минала с 1 отворена задача.", + "The end date has passed with {count} open tasks.": "Крайната дата е минала, отворени задачи: {count}.", + "No open task is past its due date.": "Няма отворена задача с изтекъл срок.", + "The highest open risk, \"{title}\", scores {score}.": "Най-високият отворен риск, \"{title}\", има оценка {score}.", + "There are no open risks.": "Няма отворени рискове.", + "Costs are at {percent}% of the budget.": "Разходите са {percent}% от бюджета.", + "No suggestion: the project has no budget.": "Няма предложение: проектът няма бюджет.", + "No suggestion: no costs are recorded for this project yet.": "Няма предложение: все още няма записани разходи за този проект.", + "The report was not saved. Only the project owner can write status reports.": "Докладът не е запазен. Само собственикът на проекта може да пише доклади за състоянието.", + "No report": "Няма доклад", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Група проекти, водени от едни и същи хора, например отдел или програма. Нейните ръководители четат всеки проект в нея.", + "The name of the portfolio": "Името на портфолиото", + "What the portfolio holds and who runs it": "Какво съдържа портфолиото и кой го води", + "A colour for the portfolio's section in project lists": "Цвят за раздела на портфолиото в списъците с проекти", + "Managers": "Ръководители", + "Nextcloud user UIDs of the people who run the portfolio": "Потребителски ID в Nextcloud на хората, които водят портфолиото", + "Order": "Ред", + "Where the portfolio comes in project lists, lowest first": "Къде е портфолиото в списъците с проекти, най-ниското първо", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Собствената скала за риск на това портфолио като JSON, в същата форма като скалата за цялото приложение. Празно означава скалата на приложението.", + "Portfolio readers": "Читатели на портфолиото", + "Nextcloud user UIDs of the managers of the project's portfolio": "Потребителски ID в Nextcloud на ръководителите на портфолиото на проекта", + "The portfolio this project belongs to": "Портфолиото, към което принадлежи проектът", + "No portfolio": "Без портфолио", + "All portfolios": "Всички портфолиа", + "You read this project as a manager of its portfolio. Only its members change it.": "Четете този проект като ръководител на неговото портфолио. Само членовете му го променят.", + "Portfolios": "Портфолиа", + "Portfolio status": "Състояние на портфейла", + "No portfolios yet": "Все още няма портфейли", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Администратор добавя портфейли в Проекти, Портфейли. Проектите в портфейла са изброени тук със своето състояние.", + "Roll-up": "Обобщение", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} по план, {atRisk} в риск, {offTrack} извън плана, {noReport} без отчет", + "No project in this portfolio that you can read.": "Няма проект в този портфейл, който можете да четете.", + "Start": "Начало", + "End": "Край", + "Budget": "Бюджет", + "Last report": "Последен отчет", + "Out of date": "Остарял", + "Portfolio timeline": "Времева линия на портфейла", + "Zoom": "Мащаб", + "Could not load the timeline": "Времевата линия не можа да се зареди", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Администратор добавя портфейли в Проекти, Портфейли. Проектите в портфейла са показани тук на една времева линия.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Отворете проект, за да видите фазите и задачите му. Времевата линия е само за четене.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Пропуснати, защото не можете да ги четете: {count} проекта", + "Week": "Седмица", + "Day": "Ден", + "Month": "Месец", + "Please try again later.": "Опитайте отново по-късно.", + "Status reports": "Отчети за състояние", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "След колко дни последният отчет за състоянието на проект се отбелязва като остарял в прегледа на портфейла", + "Reporting period (days)": "Отчетен период (дни)", + "The reporting period is a whole number of days from 1 to 365.": "Отчетният период е цял брой дни от 1 до 365.", + "Reporting period saved": "Отчетният период е запазен", + "The reporting period was not saved. Please try again.": "Отчетният период не беше запазен. Опитайте отново.", + "Every project of a portfolio with its status per aspect, rolled up.": "Всеки проект от портфейла със състоянието по аспекти, обобщено.", + "The projects of a portfolio on one timeline.": "Проектите от портфейла на една времева линия.", + "Phases": "Фази", + "Add phase": "Добавяне на фаза", + "No phases yet": "Все още няма фази", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Разделете проекта на фази, например иницииране, дефиниране и изпълнение. Фазата се затваря, когато заключителният ѝ документ е качен.", + "{hours} hours": "{hours} часа", + "Concluding document: {title}": "Заключителен документ: {title}", + "Concluding document missing": "Липсва заключителен документ", + "Move {title} up": "Премести {title} нагоре", + "Move {title} down": "Премести {title} надолу", + "Close phase": "Затваряне на фаза", + "Phase": "Фаза", + "Files": "Файлове", + "Notes": "Бележки", + "Audit trail": "Одитна следа", + "Edit phase": "Редактиране на фаза", + "Name": "Име", + "Budget hours": "Бюджетни часове", + "Could not save the phase. Please try again.": "Фазата не можа да се запази. Опитайте отново.", + "Close phase {title}": "Затваряне на фаза {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фазата се затваря със заключителния си документ: качете го тук или изберете един от файловете на фазата.", + "Concluding document": "Заключителен документ", + "This phase has no files yet.": "Тази фаза все още няма файлове.", + "Upload a document": "Качване на документ", + "The document was not uploaded. Please try again.": "Документът не беше качен. Опитайте отново.", + "Upload the concluding document before you close this phase.": "Качете заключителния документ, преди да затворите тази фаза.", + "This phase cannot be closed from its current status.": "Тази фаза не може да бъде затворена от текущото ѝ състояние.", + "The phase was not closed. Please try again.": "Фазата не беше затворена. Опитайте отново.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID на файла в тази фаза, който я приключва. Фазата може да бъде завършена едва когато е зададен и файлът е прикачен.", + "Import from Microsoft Project": "Импортиране от Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Изберете план, записан от Microsoft Project във формат XML. Нищо не се импортира, докато не потвърдите.", + "Plan file": "Файл на плана", + "What the import creates": "Какво създава импортът", + "Tasks": "Задачи", + "Sub-tasks": "Подзадачи", + "Milestones": "Етапи", + "Links": "Връзки", + "Already imported, updated in place: {count}": "Вече импортирани, обновени на място: {count}", + "What does not carry over": "Какво не се пренася", + "Tasks with resources, which are not imported: {count}": "Задачи с ресурси, които не се импортират: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Задачи по-дълбоко от ниво 3, поставени под своята задача от ниво 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Връзки, различни от край-начало, импортирани като свързани връзки: {count}", + "Link lags, which are dropped: {count}": "Закъснения на връзки, които отпадат: {count}", + "Links to a summary task, which are not imported: {count}": "Връзки към обобщаваща задача, които не се импортират: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Връзки към задачи извън този план, които не се импортират: {count}", + "No longer in the plan": "Вече не е в плана", + "These stay in the project; remove them yourself if they are no longer needed.": "Остават в проекта; премахнете ги сами, ако вече не са нужни.", + "Import": "Импортиране", + "Close": "Затваряне", + "The plan is imported: {created} created, {updated} updated.": "Планът е импортиран: създадени {created}, обновени {updated}.", + "Links that would close a loop were left out: {count}": "Връзките, които биха затворили цикъл, са пропуснати: {count}", + "The import stopped part-way. Run it again to finish it.": "Импортът спря по средата. Пуснете го отново, за да го завършите.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Запишете плана в Microsoft Project чрез Файл, Запиши като, формат XML, и импортирайте този файл.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Този файл декларира DOCTYPE или обекти, които не се приемат.", + "The file is larger than 10 MB.": "Файлът е по-голям от 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Планът има над 2000 задачи, повече, отколкото приема един импорт.", + "This file is not a Microsoft Project plan in XML format.": "Този файл не е план на Microsoft Project във формат XML.", + "Choose a file to import.": "Изберете файл за импортиране.", + "Only the project owner can import a plan.": "Само собственикът на проекта може да импортира план.", + "The plan could not be read. Please try again.": "Планът не можа да бъде прочетен. Опитайте отново.", + "Linked case: {title}": "Свързана преписка: {title}", + "Linked to a case": "Свързано с преписка", + "Hand over to case": "Предаване към преписката", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Копира без промяна всеки файл на проекта и задачите му, както и файл, описващ проекта, в свързаната преписка.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Копирани файлове: {count}", + "Files that failed: {names}": "Неуспешни файлове: {names}", + "The handover failed. Please try again.": "Предаването не успя. Опитайте отново.", + "The linked case could not be found, or you cannot open it.": "Свързаната преписка не е намерена или не можете да я отворите.", + "Case handovers": "Предавания към преписката", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Всяко предаване на файловете и метаданните на проекта към преписката му: кога, от кого, към коя преписка, всеки копиран файл с неговия SHA-256 и неуспешните файлове.", + "Finance": "Финанси", + "Add cost line": "Добавяне на разходен ред", + "Delivery terms": "Условия за доставка", + "Billing model": "Модел на фактуриране", + "Budget in euro": "Бюджет в евро", + "Budget in hours": "Бюджет в часове", + "Hourly rate in euro": "Часова ставка в евро", + "Planned start": "Планирано начало", + "Planned end": "Планиран край", + "Planned dates": "Планирани дати", + "Budget {amount}": "Бюджет {amount}", + "No budget agreed": "Няма договорен бюджет", + "Hours": "Часове", + "Only the project owner and the portfolio managers see the amounts.": "Сумите виждат само собственикът на проекта и мениджърите на портфолиото.", + "Budget against cost per category": "Бюджет спрямо разходи по категория", + "Labour (booked time)": "Труд (отчетено време)", + "No category": "Без категория", + "Hours are not available": "Часовете не са налични", + "Not yet assigned to a category": "Все още не е разпределено към категория", + "Total": "Общо", + "{spent} spent, {remaining} remaining": "{spent} изразходвани, {remaining} остават", + "Budget against cost per phase": "Бюджет спрямо разходи по фаза", + "No phase": "Без фаза", + "Cost lines": "Разходни редове", + "From the finance system": "От финансовата система", + "Edit cost line {amount}": "Редактиране на разходния ред {amount}", + "No cost lines yet": "Все още няма разходни редове", + "Commitments": "Ангажименти", + "Actual cost": "Действителни разходи", + "Forecast": "Прогноза", + "Remaining": "Остават", + "Not planned yet": "Все още не е планирано", + "{start} to {end}": "{start} до {end}", + "The terms were not saved. Please try again.": "Условията не бяха запазени. Опитайте отново.", + "Terms saved": "Условията са запазени", + "Fixed price": "Фиксирана цена", + "Hourly": "На час", + "Not billed": "Не се фактурира", + "Commitment": "Ангажимент", + "Edit cost line": "Редактиране на разходен ред", + "Kind": "Вид", + "Amount in euro": "Сума в евро", + "Remove": "Премахване", + "Could not save the cost line. Only the project owner changes the money of a project.": "Разходният ред не можа да бъде запазен. Само собственикът на проекта променя парите на проекта.", + "Could not remove the cost line. Please try again.": "Разходният ред не можа да бъде премахнат. Опитайте отново.", + "{amount} over budget": "{amount} над бюджета", + "Cost categories": "Категории разходи", + "The categories every project splits its budget and costs into, one per line": "Категориите, на които всеки проект разделя бюджета и разходите си, по една на ред", + "Categories": "Категории", + "Give at least one category, each name once.": "Посочете поне една категория, всяко име веднъж.", + "Cost categories saved": "Категориите разходи са запазени", + "The cost categories were not saved. Please try again.": "Категориите разходи не бяха запазени. Опитайте отново.", + "Finance line": "Финансов ред", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Една парична сума в проект: бюджет, ангажимент, действителен разход или прогноза, в категория разходи и по избор във фаза. Въвежда се от собственика на проекта или от финансовата система чрез приложението за интеграция.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Проектът, към който принадлежи сумата. Празно за ред от финансовата система, чийто номер на проект не съвпада с нито един проект.", + "The phase this amount belongs to, if any": "Фазата, към която принадлежи сумата, ако има такава", + "The cost category, one of the categories the admin set up": "Категорията разходи, една от категориите, зададени от администратора", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Дали сумата е бюджет, ангажимент, действителен разход или прогноза", + "Amount": "Сума", + "The amount in the reporting currency (euro)": "Сумата във валутата на отчитане (евро)", + "The date the amount was booked or is expected": "Датата, на която сумата е осчетоводена или се очаква", + "What the amount is for": "За какво е сумата", + "Whether a person entered the line or the finance system sent it": "Дали ред е въведен от човек или е изпратен от финансовата система", + "Entered by hand": "Въведено ръчно", + "Finance line id": "Идентификатор на финансовия ред", + "The finance system's own id of this line. One imported line per id.": "Собственият идентификатор на този ред във финансовата система. Един импортиран ред за идентификатор.", + "Project number": "Номер на проект", + "The project number the finance system sent, matched against the project key": "Номерът на проект, изпратен от финансовата система, сравнен с ключа на проекта", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Портфолиото на проекта на реда, копирано от проекта, за да изискват сумите на портфолиото един филтър", + "Finance readers": "Читатели на финансите", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID на потребителите на Nextcloud, които могат да виждат сумата: собственикът на проекта и мениджърите на неговото портфолио", + "Project owner": "Собственик на проекта", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID на потребителя на Nextcloud, собственик на проекта, който може да променя и премахва ръчни редове", + "How the client pays: not billed, a fixed price, or by the hour.": "Как плаща клиентът: не се фактурира, фиксирана цена или на час.", + "Portfolio finance": "Финанси на портфолиото", + "You cannot see the money of any project in this portfolio": "Не можете да видите парите на нито един проект в това портфолио", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Сървърът върна разходни редове на проекти извън това портфолио, затова тези суми може да са грешни.", + "Projects left out because you cannot see their money: {count}": "Пропуснати проекти, защото не можете да видите парите им: {count}", + "Unmatched finance lines": "Несвързани финансови редове", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Бюджет, ангажименти, действителни разходи и прогноза, сумирани за портфолио.", + "Subprojects": "Подпроекти", + "{done} of {total}": "{done} от {total}", + "{done} of {total} tasks done, including subprojects": "{done} от {total} задачи изпълнени, включително подпроектите", + "Show the subprojects of {title}": "Показване на подпроектите на {title}", + "Hide the subprojects of {title}": "Скриване на подпроектите на {title}", + "Part of": "Част от", + "No parent project": "Без родителски проект", + "A project cannot sit under one of its own subprojects.": "Проект не може да стои под някой от собствените си подпроекти.", + "Projects nest three levels deep at most: programme, project and subproject.": "Проектите се влагат най-много на три нива: програма, проект и подпроект.", + "Parent project": "Родителски проект", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Проектът, под който стои този проект, например програма. Проектите се влагат най-много на три нива.", + "Yes": "Да", + "No": "Не", + "{label} (required)": "{label} (задължително)", + "{label} is required": "{label} е задължително", + "Project field": "Поле на проект", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поле, което администраторът добавя към всеки проект, например област на политика или стойност на договор.", + "Key": "Ключ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Постоянното име, под което се пази стойността, в lower camel case. Запазете го, щом проектите го използват.", + "Label": "Етикет", + "The name people see next to the field": "Името, което хората виждат до полето", + "What the field holds": "Какво съдържа полето", + "Text": "Текст", + "Number": "Число", + "Choice": "Избор", + "Person": "Лице", + "Yes or no": "Да или не", + "Options": "Опции", + "The choices of a choice field": "Опциите на поле за избор", + "Required": "Задължително", + "Whether a project must fill in the field": "Дали проектът трябва да попълни полето", + "Where the field appears, lowest first": "Къде се показва полето, най-ниското първо", + "Applies to": "Отнася се за", + "What the field is added to": "Към какво се добавя полето", + "Custom fields": "Собствени полета", + "The values of the project fields an admin defined, keyed by the field's key.": "Стойностите на полетата на проекта, зададени от администратор, по ключа на полето.", + "Project fields": "Полета на проекта", + "Related": "Свързани", + "Remove link": "Премахване на връзката", + "Link type": "Вид връзка", + "Relates to": "Свързана с", + "Duplicates": "Дублира", + "Project key": "Ключ на проекта", + "Every task number starts with it, such as VERG-42.": "Всеки номер на задача започва с него, например VERG-42.", + "This key is already used by another project.": "Този ключ вече се използва от друг проект.", + "Use 2 to 10 letters and digits, starting with a letter.": "Използвайте от 2 до 10 букви и цифри, като започнете с буква.", + "The key cannot change once tasks carry it.": "Ключът не може да се промени, след като задачите го носят.", + "Project saved. The existing tasks get their numbers in the background.": "Проектът е запазен. Съществуващите задачи получават номерата си във фонов режим.", + "Next task number": "Номер на следващата задача", + "The number the next task of this project gets in its key. Only the system writes it.": "Номерът, който следващата задача на този проект получава в ключа си. Записва го само системата.", + "Restore {title}": "Възстанови {title}", + "Restore": "Възстанови", + "Project restored": "Проектът е възстановен", + "Could not restore the project": "Проектът не можа да бъде възстановен", + "Bring this project back to the active list.": "Върнете този проект в списъка с активни проекти.", + "Restore project": "Възстанови проекта", + "Request reason": "Причина за заявката", + "Why the requester needs this project. Filled in when the project is requested.": "Защо заявителят се нуждае от този проект. Попълва се при заявката.", + "Reviewed by": "Прегледано от", + "The user who approved or rejected the request.": "Потребителят, който е одобрил или отхвърлил заявката.", + "Reviewed at": "Прегледано на", + "When the request was approved or rejected.": "Кога заявката е одобрена или отхвърлена.", + "Review note": "Бележка от прегледа", + "The reviewer's reason, shown to the requester when a request is not approved.": "Причината на проверяващия, която заявителят вижда, когато заявката не е одобрена.", + "Members of these groups": "Членове на тези групи", + "Groups that may create projects": "Групи, които могат да създават проекти", + "The group {group} no longer exists. Save to remove it.": "Групата {group} вече не съществува. Запазете, за да я премахнете.", + "Review project request": "Преглед на заявка за проект", + "Requested by": "Заявено от", + "Why it is needed": "Защо е необходим", + "Desired start date": "Желана начална дата", + "Why is it not approved?": "Защо не е одобрен?", + "Give a reason. The requester sees it.": "Посочете причина. Заявителят ще я види.", + "Approve": "Одобри", + "Reject": "Отхвърли", + "Reject request": "Отхвърли заявката", + "The review was not saved. Try again.": "Прегледът не е запазен. Опитайте отново.", + "This project is waiting for review": "Този проект чака преглед", + "This request was not approved": "Тази заявка не е одобрена", + "Reason: {note}": "Причина: {note}", + "Review request": "Преглед на заявката", + "Request a project": "Заявете проект", + "Step {step} of 2": "Стъпка {step} от 2", + "Why is this project needed?": "Защо е нужен този проект?", + "Give a reason. The reviewer reads it.": "Посочете причина. Проверяващият ще я прочете.", + "Back": "Назад", + "Next": "Напред", + "Send request": "Изпрати заявка", + "The request was not sent. Try again.": "Заявката не е изпратена. Опитайте отново.", + "Requested": "Заявен", + "Not approved": "Не е одобрен", + "Your request was sent": "Заявката ви е изпратена", + "Let everyone else request a project": "Разрешете на всички останали да заявяват проект", + "Add a task": "Добавяне на задача", + "Delete task": "Изтриване на задачата", + "Edit task": "Редактиране на задачата", + "Write": "Писане", + "Preview": "Преглед", + "Markdown works here: headings, lists and links.": "Тук работи Markdown: заглавия, списъци и връзки.", + "Could not save the task. Please try again.": "Задачата не можа да бъде запазена. Опитайте отново.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "По \"{title}\" има отчетено време, затова не може да бъде изтрита. Вместо това можете да я откажете: записите за време остават.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Да се изтрие ли \"{title}\"? Връзките ѝ с други задачи също се премахват. Това не може да бъде отменено.", + "Keep task": "Запазване на задачата", + "Cancel task": "Отказване на задачата", + "Only the reporter, the project owner or an admin can delete this task.": "Само подателят, собственикът на проекта или администратор може да изтрие тази задача.", + "Could not delete the task. Please try again.": "Задачата не можа да бъде изтрита. Опитайте отново.", + "Could not cancel the task. Please try again.": "Задачата не можа да бъде отказана. Опитайте отново.", + "Responsible": "Отговорник", + "Also working on this": "Работят и по това", + "Labels": "Етикети", + "Could not change the priority. Please try again.": "Приоритетът не можа да бъде променен. Опитайте отново.", + "Other project members who work on this task alongside the person responsible.": "Други членове на проекта, които работят по задачата заедно с отговорника.", + "Duplicate": "Дублиране", + "Could not copy the task. Please try again.": "Задачата не можа да бъде копирана. Опитайте отново.", + "Subtasks": "Подзадачи", + "{done} of {total} done": "Завършени {done} от {total}", + "Add a subtask": "Добавяне на подзадача", + "Checklist": "Контролен списък", + "Checklist item actions": "Действия за елемента от списъка", + "Add a checklist item": "Добавяне на елемент в списъка", + "Subtasks: {estimate} estimated, {logged} logged": "Подзадачи: {estimate} оценка, {logged} отчетено", + "Total estimate: {total}": "Обща оценка: {total}", + "Part of {title}": "Част от {title}", + "Checklist: {count} done": "Контролен списък: {count} завършени", + "This task has subtasks: {count}.": "Тази задача има подзадачи: {count}.", + "Keep subtasks as separate tasks": "Запазване на подзадачите като отделни задачи", + "Delete subtasks too": "Изтриване и на подзадачите", + "Copy of {title}": "Копие на {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Задачата беше копирана, но не всички нейни подзадачи. Проверете копието.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Малки стъпки в задачата. Всеки елемент има id, текст и дали е завършен.", + "Open work per person and per project.": "Отворена работа по човек и по проект.", + "View": "Изглед", + "By person": "По човек", + "By project": "По проект", + "Hours left": "Оставащи часове", + "Tasks without an estimate": "Задачи без оценка", + "Due in 14 days": "Срок до 14 дни", + "Shared": "Споделени", + "Unassigned": "Неразпределени", + "{hours} h": "{hours} ч", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Показва се работата в проектите, които можете да виждате. Часовете се отчитат за отговорния; споделените задачи се броят без часове.", + "No open work in these projects.": "Няма отворена работа в тези проекти.", + "Open work": "Отворена работа", + "{count} open tasks": "{count} отворени задачи", + "Create a project to see capacity here.": "Създайте проект, за да видите капацитета тук.", + "My tasks": "Моите задачи", + "Show all my tasks": "Покажи всички мои задачи", + "No tasks assigned to you": "Нямате възложени задачи", + "Browse projects": "Разгледай проектите", + "Later": "По-късно", + "Due {date}": "Срок {date}", + "Could not change the status. Please try again.": "Статусът не можа да бъде променен. Опитайте отново.", + "Completed today": "Завършени днес", + "My open tasks": "Моите отворени задачи", + "My overdue tasks": "Моите просрочени задачи", + "My tasks in progress": "Моите задачи в процес", + "Pin to the top": "Закачи най-горе", + "Unpin": "Откачи", + "Pinned": "Закачено", + "Actions for {title}": "Действия за {title}", + "Could not save your project order. Please try again.": "Редът на проектите ви не можа да бъде запазен. Опитайте отново.", + "No boards yet": "Все още няма табла", + "Create a project to get a board.": "Създайте проект, за да получите табло.", + "Use the Projects page to create and manage your projects and tasks.": "Използвайте страницата Проекти, за да създавате и управлявате проектите и задачите си.", + "Go to projects": "Към проектите", + "You are not a member of any projects yet.": "Все още не сте член на нито един проект.", + "Could not search for users. Please try again.": "Търсенето на потребители не успя. Опитайте отново.", + "Project creation is restricted to administrators.": "Само администраторите могат да създават проекти.", + "Only the project owner or an administrator can delete this project.": "Само собственикът на проекта или администратор може да изтрие този проект.", + "No projects are available to you yet. Ask an administrator to create one.": "Все още нямате достъпни проекти. Помолете администратор да създаде такъв.", + "Due: {date}": "Срок: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Задачите с начална дата или срок се показват на времевата линия. Добавете дати, за да ги видите тук.", + "You do not have access to this project.": "Нямате достъп до този проект.", + "Zoom level": "Ниво на мащабиране", + "Unscheduled": "Непланирани", + "Start: {date}": "Начало: {date}", + "Today": "Днес", + "No scheduled tasks": "Няма планирани задачи", + "An unexpected error occurred.": "Възникна неочаквана грешка.", + "Column {number} name": "Име на колона {number}", + "Failed to save creation policy": "Правилото за създаване не можа да бъде запазено", + "All authenticated users": "Всички влезли потребители", + "Control who may create new projects": "Определете кой може да създава нови проекти", + "Administrators only": "Само администратори", + "Project creation": "Създаване на проекти", + "Allow project creation": "Разрешаване на създаването на проекти", + "Creation policy saved successfully": "Правилото за създаване е запазено", + "Initializing…": "Стартиране…", + "e.g. 2h 30m, 90m, 1.5h": "напр. 2h 30m, 90m, 1.5h", + "Log time": "Отчитане на време", + "Save estimate": "Запазване на оценката", + "Logged: {logged}": "Отчетено: {logged}", + "over by {amount}": "надвишено с {amount}", + "Time tracking": "Отчитане на времето", + "Estimate": "Оценка", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Въведете валидна оценка (напр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Въведете валидна продължителност (напр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Записът за време не можа да бъде запазен. Опитайте отново.", + "Edit time entry": "Редактиране на запис за време", + "Duration": "Продължителност", + "Date range": "Период", + "Last week": "Миналата седмица", + "No time logged": "Няма отчетено време", + "Log time on a task to see it here.": "Отчетете време по задача, за да го видите тук.", + "To date": "До дата", + "This week": "Тази седмица", + "Total: {total}": "Общо: {total}", + "From date": "От дата", + "Custom range": "Потребителски период", + "All time": "Цялото време", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Задача не можа да бъде изтрита, така че може да останат данни. Изтрийте проекта отново.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Запис за време не можа да бъде изтрит, така че може да останат данни. Изтрийте проекта отново.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Колона не можа да бъде изтрита, така че може да останат данни. Изтрийте проекта отново.", + "Could not delete the project. Please try again.": "Проектът не можа да бъде изтрит. Опитайте отново.", + "Notification settings": "Настройки за известия", + "Configure when due-date reminders are sent": "Задайте кога се изпращат напомняния за срокове", + "Due-date reminder lead time (hours)": "Предварително време за напомняне (часове)", + "Lead time must be between 1 and 336 hours": "Предварителното време трябва да е между 1 и 336 часа", + "Reminder lead time saved successfully": "Предварителното време за напомняне е запазено", + "Failed to save reminder lead time": "Предварителното време за напомняне не можа да бъде запазено", + "Notifications": "Известия", + "Notify me 1 day before a task's due date": "Уведоми ме 1 ден преди срока на задача", + "Draft": "Чернова", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Дали часът е чернова, която вижда само учителят, провежда ли се или е отменен.", + "New release": "Нова версия", + "Roadmap chart. The same releases and epics are listed below.": "Диаграма на пътната карта. Същите версии и епици са изброени по-долу.", + "Nothing on the roadmap yet": "Все още няма нищо в пътната карта", + "Releases with a target date and epics with dated tasks appear here.": "Тук се показват версиите с целева дата и епиците със задачи с дати.", + "Releases": "Версии", + "No releases yet": "Все още няма версии", + "Target date: {date}": "Целева дата: {date}", + "No target date": "Няма целева дата", + "Edit {name}": "Редактиране на {name}", + "Mark {name} as released": "Отбелязване на {name} като издадена", + "Mark as released": "Отбелязване като издадена", + "Epics": "Епици", + "No epics yet. Open a task to make it an epic.": "Все още няма епици. Отворете задача, за да я направите епик.", + "Not scheduled yet": "Все още не е насрочено", + "Planned": "Планирана", + "Released": "Издадена", + "Edit release": "Редактиране на версията", + "Target date": "Целева дата", + "Could not save the release. Please try again.": "Версията не можа да бъде запазена. Опитайте отново.", + "Every task of this release is done or cancelled.": "Всяка задача от тази версия е изпълнена или отменена.", + "Not finished yet: {count}": "Все още незавършени: {count}", + "What happens to these tasks?": "Какво става с тези задачи?", + "Move to {name}": "Преместване в {name}", + "Remove the release": "Премахване на версията", + "Keep it on {name}": "Оставяне в {name}", + "Could not mark the release as released. Please try again.": "Версията не можа да бъде отбелязана като издадена. Опитайте отново.", + "Roadmap": "Пътна карта", + "Tasks or roadmap": "Задачи или пътна карта", + "Release": "Версия", + "Epic": "Епик", + "This task is an epic": "Тази задача е епик", + "A named, dated delivery of a project that its tasks are planned against.": "Именувана доставка на проект с дата, спрямо която се планират задачите му.", + "Name of the release": "Име на версията", + "The project this release belongs to": "Проектът, към който принадлежи тази версия", + "What this release delivers": "Какво доставя тази версия", + "When work on the release starts": "Кога започва работата по версията", + "The date the release is due": "Датата, към която версията трябва да е готова", + "Whether the release is planned, released or archived": "Дали версията е планирана, издадена или архивирана", + "Released on": "Издадена на", + "When the release was marked as released": "Кога версията е отбелязана като издадена", + "The release this task is planned for": "Версията, за която е планирана тази задача", + "Board view options": "Опции за изгледа на таблото", + "Colour cards": "Оцветяване на картите", + "No colour": "Без цвят", + "By label": "По етикет", + "Swimlanes": "Ленти", + "No swimlanes": "Без ленти", + "By assignee": "По отговорник", + "By epic": "По епик", + "No assignee": "Без отговорник", + "No epic": "Без епик", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Картите остават в реда на своя епик. Променете епика на страницата на задачата.", + "Hand over to": "Предаване на", + "Could not save your board view. It applies until you reload.": "Изгледът на таблото не беше запазен. Важи до презареждане.", + "Timetable wish": "Желание за разписание", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Желание, което генераторът взема предвид. Твърдо желание спазва винаги, гъвкаво, където може.", + "Whether the wish is about a teacher, a group, a room or one activity": "Дали желанието засяга учител, група, стая или една дейност", + "Teacher": "Учител", + "Group": "Група", + "Reference": "Препратка", + "The user, group, room or activity the wish is about": "Потребителят, групата, стаята или дейността, за които е желанието", + "What the wish asks for": "Какво иска желанието", + "Not on these periods": "Не в тези часове", + "Preferably not on these periods": "По-добре не в тези часове", + "At most a number of lessons a day": "Най-много определен брой часове на ден", + "No free periods between lessons": "Без прозорци между часовете", + "Always the same room": "Винаги една и съща стая", + "Periods": "Часове", + "The periods of the week the wish is about, such as wed-5": "Часовете от седмицата, за които е желанието, напр. wed-5", + "Limit": "Граница", + "The most lessons a day, for a wish of that kind": "Най-много часове на ден, за желание от този вид", + "Strength": "Сила", + "Whether the generator must keep the wish or should keep it": "Дали генераторът трябва или би трябвало да спази желанието", + "Hard": "Твърдо", + "Soft": "Гъвкаво", + "Weight": "Тежест", + "How much a soft wish counts, from 1 to 3": "Колко тежи гъвкаво желание, от 1 до 3", + "Why the wish exists": "Защо съществува желанието", + "Timetable scenario": "Сценарий за разписание", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Един седмичен модел, създаден от генератора или взет от текущото разписание. Пази входните си данни и колко добре спазва желанията.", + "The name timetablers know the scenario by": "Името, под което съставителите знаят сценария", + "Whether the generator made it or it came from the current timetable": "Дали го е създал генераторът, или идва от текущото разписание", + "Generated": "Генериран", + "From the current timetable": "От текущото разписание", + "Week of": "Седмица от", + "The Monday of the first week of the window": "Понеделникът на първата седмица от периода", + "Window start": "Начало на периода", + "The first day the week pattern applies to": "Първият ден, за който важи седмичният модел", + "Window end": "Край на периода", + "The last day the week pattern applies to": "Последният ден, за който важи седмичният модел", + "Waiting, generating, done, failed, or published as draft lessons": "Чака, генерира се, готов, неуспешен или публикуван като чернови часове", + "Waiting": "Чака", + "Generating": "Генерира се", + "Failed": "Неуспешен", + "Published": "Публикуван", + "Seed": "Начално число", + "The number the generator starts from, so a run can be repeated": "Числото, от което генераторът започва, за да може изпълнението да се повтори", + "Input": "Входни данни", + "The periods, rooms, lessons and wishes the scenario was made from": "Часовете, стаите, уроците и желанията, от които е създаден сценарият", + "Placements": "Разположения", + "Each lesson with the period and room it was given": "Всеки урок с часа и стаята, които е получил", + "Unplaced lessons": "Неразположени уроци", + "Lessons without a place, each with the hard wish that blocked it": "Уроци без място, всеки с твърдото желание, което го е спряло", + "Broken wishes": "Нарушени желания", + "The wishes this scenario breaks, with the lessons that break them": "Желанията, които този сценарий нарушава, с уроците, които ги нарушават", + "Measures": "Показатели", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Разположени уроци, нарушени желания, прозорци на учителите, часове на ден и използване на стаите", + "Reason": "Причина", + "Why the run failed": "Защо изпълнението е неуспешно", + "Published at": "Публикуван на", + "When the scenario was written out as draft lessons": "Кога сценарият е записан като чернови часове", + "Edit wish": "Редактиране на желание", + "New wish": "Ново желание", + "Hard: the generator always keeps it": "Задължително: генераторът винаги го спазва", + "Soft: the generator keeps it where it can": "Гъвкаво: генераторът го спазва, когато може", + "Weight (1 to 3)": "Тежест (от 1 до 3)", + "Most lessons a day": "Най-много часове на ден", + "Period": "Час", + "{day} period {number}": "{day} час {number}", + "Teacher (user name)": "Учител (потребителско име)", + "Activity (group:subject)": "Дейност (група:предмет)", + "Say who or what the wish is about.": "Посочете за кого или за какво е желанието.", + "Choose at least one period.": "Изберете поне един час.", + "The limit is a whole number of 1 or more.": "Лимитът е цяло число от 1 нагоре.", + "Timetable": "Разписание", + "Wishes": "Желания", + "Timetable wishes": "Желания за разписанието", + "Generator run": "Изпълнение на генератора", + "Generator progress": "Напредък на генератора", + "The run failed: {reason}": "Изпълнението е неуспешно: {reason}", + "{placed} of {lessons} lessons placed": "Поставени {placed} от {lessons} часа", + "Generate again": "Генериране отново", + "Generate": "Генериране", + "Every lesson has a place.": "Всеки час има място.", + "Lesson": "Час", + "No free period and room": "Няма свободен час и стая", + "Broken soft wishes": "Нарушени гъвкави желания", + "Every soft wish is kept.": "Всяко гъвкаво желание е спазено.", + "Wish": "Желание", + "Lessons": "Часове", + "Generating: {percent}% of the time budget used": "Генериране: използвани {percent}% от времето", + "Waiting to start": "Изчаква старт", + "Published as draft lessons": "Публикувано като чернови часове", + "Could not read the scenario.": "Сценарият не можа да бъде прочетен.", + "Could not start the run.": "Изпълнението не можа да започне.", + "Scenarios": "Сценарии", + "Timetable scenarios": "Сценарии за разписание", + "Scenario": "Сценарий", + "Take the current timetable": "Вземи текущото разписание", + "Could not take the current timetable.": "Текущото разписание не можа да бъде взето.", + "Broken hard wishes": "Нарушени задължителни желания", + "Not on a period of the week grid": "Не е в час от седмичната мрежа", + "Compare scenarios": "Сравняване на сценарии", + "Scenarios to compare": "Сценарии за сравнение", + "Choose two or three scenarios to compare them.": "Изберете два или три сценария, за да ги сравните.", + "Measure": "Показател", + "Best": "Най-добър", + "Lessons that differ": "Часове с разлика", + "No lesson differs.": "Няма час с разлика.", + "Not placed": "Не е поставен", + "{period} in {room}": "{period} в {room}", + "Lessons placed": "Поставени часове", + "Lessons without a place": "Часове без място", + "Clashes": "Конфликти", + "Hard wishes broken": "Нарушени задължителни желания", + "Soft wishes broken": "Нарушени гъвкави желания", + "Soft wishes broken, weighted": "Нарушени гъвкави желания, претеглени", + "Free periods between lessons, all teachers": "Свободни часове, всички учители", + "Most free periods of one teacher": "Най-много свободни часове на един учител", + "Most lessons of one group on a day": "Най-много часове на една група за ден", + "Room use": "Използване на стаите", + "Publish as draft lessons": "Публикувай като чернови на часове", + "Draft lessons written: {count}": "Записани чернови на часове: {count}", + "Could not publish the scenario.": "Сценарият не можа да бъде публикуван.", + "Rules": "Правила", + "Rules for {column}": "Правила за {column}", + "When a card enters this column": "Когато карта влезе в тази колона", + "Action": "Действие", + "Set the priority": "Задаване на приоритет", + "Assign to": "Възлагане на", + "Assign the person who moved the card": "Възлагане на човека, който премести картата", + "Remove the assignee": "Премахване на отговорника", + "Add a label": "Добавяне на етикет", + "No longer a project member": "Вече не е член на проекта", + "This label no longer exists": "Този етикет вече не съществува", + "Add rule": "Добавяне на правило", + "Remove rule": "Премахване на правило", + "No rules yet. Add one to change a card when it enters this column.": "Все още няма правила. Добавете едно, за да променяте карта, когато тя влезе в тази колона.", + "Could not save the rules. Please try again.": "Правилата не можаха да бъдат запазени. Опитайте отново.", + "1 rule runs when a card enters this column": "1 правило се изпълнява, когато карта влезе в тази колона", + "{count} rules run when a card enters this column": "{count} правила се изпълняват, когато карта влезе в тази колона", + "Rules applied: {changes}": "Приложени правила: {changes}", + "assigned to {name}": "възложена на {name}", + "assignee removed": "отговорникът е премахнат", + "priority {priority}": "приоритет {priority}", + "label {label}": "етикет {label}", + "What happens to a card when it enters this column, applied in list order.": "Какво става с карта, когато влезе в тази колона, по реда на списъка.", + "Value": "Стойност", + "What the rule does to the card.": "Какво прави правилото с картата.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Приоритетът, потребителският id или id на етикета, които действието използва; празно за действия без стойност.", + "is not": "не е", + "{dimension} is not": "{dimension} не е", + "Saved filters": "Запазени филтри", + "No saved filters yet": "Все още няма запазени филтри", + "Save filter": "Запазване на филтъра", + "Rename \"{name}\"": "Преименуване на „{name}“", + "Delete \"{name}\"": "Изтриване на „{name}“", + "Clear filters": "Изчистване на филтрите", + "Showing {shown} of {total} tasks": "Показани {shown} от {total} задачи", + "Me": "Аз", + "No date": "Без дата", + "Rename saved filter": "Преименуване на запазен филтър", + "Share with the project": "Споделяне с проекта", + "Give the filter a name": "Дайте име на филтъра", + "Could not save the filter. Please try again.": "Филтърът не можа да бъде запазен. Опитайте отново.", + "Some labels in \"{name}\" no longer exist and were left out.": "Някои етикети в „{name}“ вече не съществуват и бяха пропуснати.", + "Could not delete the filter. Please try again.": "Филтърът не можа да бъде изтрит. Опитайте отново.", + "Saved filter": "Запазен филтър", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Именуван филтър на таблото на един проект, видим само за човека, който го е запазил, освен ако е споделен с проекта.", + "The project whose board the filter applies to": "Проектът, за чието табло е филтърът", + "The name the filter is listed under": "Името, под което филтърът е в списъка", + "Saved by": "Запазен от", + "Nextcloud user id of the person who saved the filter": "Потребителски id в Nextcloud на човека, който е запазил филтъра", + "Shared with the project": "Споделен с проекта", + "Whether every project member sees and applies the filter": "Дали всеки член на проекта вижда и може да приложи филтъра", + "Criteria": "Критерии", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Филтърът: отговорник, етикет, приоритет и срок, всеки с е или не е и стойностите си", + "Cross-project view": "Междупроектен изглед", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Запазен избор от проекти, чиито задачи се показват заедно в колони по статус, споделен с посочените хора.", + "Shared with": "Споделено с", + "The name the view is listed under": "Името, под което е посочен изгледът", + "Nextcloud user id of the person who saved the view": "Nextcloud потребителски id на човека, който е запазил изгледа", + "Nextcloud user ids of the people the view is shared with": "Nextcloud потребителски id на хората, с които е споделен изгледът", + "The projects whose tasks the view shows, at most twenty": "Проектите, чиито задачи показва изгледът, най-много двадесет", + "1 project in this view is hidden from you.": "1 проект в този изглед е скрит от вас.", + "{count} projects in this view are hidden from you.": "Проекти в този изглед, скрити от вас: {count}.", + "{project} has no column for {status}.": "Проектът {project} няма колона за статус {status}.", + "This view does not exist or is not shared with you.": "Този изглед не съществува или не е споделен с вас.", + "\"{task}\" moved to {status}.": "\"{task}\" е преместена в {status}.", + "Project: {title}": "Проект: {title}", + "Cross-project views": "Междупроектни изгледи", + "New view": "Нов изглед", + "Edit view": "Редактиране на изгледа", + "Delete view": "Изтриване на изгледа", + "Give the view a name": "Дайте име на изгледа", + "Pick at least one project": "Изберете поне един проект", + "A view shows at most {max} projects": "Изгледът показва най-много {max} проекта", + "Could not save the view. Please try again.": "Изгледът не можа да бъде запазен. Опитайте отново.", + "Could not delete the view. Please try again.": "Изгледът не можа да бъде изтрит. Опитайте отново.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Да се изтрие ли „{title}“? Проектите и задачите им остават непроменени.", + "People see the tasks of the projects they are in, never more.": "Всеки вижда само задачите на проектите, в които участва.", + "No views yet. A view shows the tasks of several of your projects together.": "Все още няма изгледи. Изгледът показва заедно задачите на няколко ваши проекта.", + "Projects in view: {count}": "Проекти в изгледа: {count}", + "Notify me when a task is assigned to me": "Уведомявай ме, когато ми бъде възложена задача", + "Also send these to me by email": "Изпращай ми ги и по имейл", + "Add an email address in your Nextcloud personal settings to get mail.": "Добавете имейл адрес в личните си настройки на Nextcloud, за да получавате имейли.", + "Code link": "Връзка към код", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, клон, заявка за сливане или проблем в платформа за код, който се отнася до задача.", + "The task the link belongs to": "Задачата, към която принадлежи връзката", + "The project of the task": "Проектът на задачата", + "Task key": "Ключ на задачата", + "The task key the forge text named, such as VC-12": "Ключът на задачата, посочен в текста на платформата, напр. VC-12", + "What the link points at": "Към какво сочи връзката", + "Link": "Връзка", + "The address of the item in the forge": "Адресът на елемента в платформата за код", + "The commit message, branch name or merge request title": "Съобщението на commit-а, името на клона или заглавието на заявката за сливане", + "Repository": "Хранилище", + "The repository, such as acme/portal": "Хранилището, напр. acme/portal", + "Forge id": "Id в платформата", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Собственият id на елемента в платформата за код, напр. github:acme/portal#42 или hash на commit", + "State": "Състояние", + "The state of a merge request or issue": "Състоянието на заявка за сливане или проблем", + "Who made the commit or opened the merge request": "Кой е направил commit-а или е отворил заявката за сливане", + "When the commit was made or the merge request last changed": "Кога е направен commit-ът или последно се е променила заявката за сливане", + "Added by": "Добавено от", + "Whether a person added the link or the integration wrote it": "Дали връзката е добавена от човек, или е записана от интеграцията", + "Nextcloud user UIDs of project members": "Nextcloud потребителски ID на членовете на проекта", + "Add link": "Добави връзка", + "Added by hand": "Добавено ръчно", + "Branch": "Клон", + "Code": "Код", + "Commit": "Commit", + "From the integration": "От интеграцията", + "Link to a commit, branch or merge request": "Връзка към commit, клон или заявка за сливане", + "Merge request": "Заявка за сливане", + "Merged": "Слята", + "No code linked yet. Name {key} in a commit message or paste a link.": "Все още няма свързан код. Посочете {key} в съобщение на commit или поставете връзка.", + "No code linked yet. Paste a link to a commit or merge request.": "Все още няма свързан код. Поставете връзка към commit или заявка за сливане.", + "Paste a web address that starts with https://.": "Поставете уеб адрес, който започва с https://.", + "Remove link {title}": "Премахни връзката {title}", + "The link could not be added.": "Връзката не можа да бъде добавена.", + "The link could not be removed.": "Връзката не можа да бъде премахната.", + "This link is already on the task.": "Тази връзка вече е към задачата.", + "Code forges": "Платформи за код", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Свържете commit-и и pull request-и от GitHub със задачи. Integriq получава събитията; planninq никога не извиква GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Изтеглете конфигурацията и я импортирайте в Integriq. След това въведете тайна в правилото \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "В GitHub добавете към хранилището webhook с този адрес и същата тайна. Изберете тип съдържание application/json и събитията push и pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Посочете ключа на задачата, напр. VC-12, в съобщение на commit, име на клон или заглавие на pull request. Връзката тогава се появява при тази задача.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq членовете на проекта пак могат да поставят връзка на страницата на задачата.", + "Download the Integriq configuration": "Изтегляне на конфигурацията за Integriq", + "Calendar": "Календар", + "Previous": "Предишен", + "Calendar view": "Изглед на календара", + "Starts:": "Започва:", + "No tasks with a date in this month.": "Няма задачи с дата този месец.", + "Week of {start} to {end}": "Седмица от {start} до {end}", + "My calendar": "Моят календар", + "Show as list": "Покажи като списък", + "Show as calendar": "Покажи като календар", + "Open my calendar": "Отвори моя календар", + "Nextcloud Tasks": "Задачи в Nextcloud", + "Show my tasks in Nextcloud Tasks": "Показвай задачите ми в Задачи в Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Задачите, възложени на вас или споделени с вас, се показват в списък \"Planninq\" в Задачи и Календар на Nextcloud. Промените, направени там, се заменят при следващата промяна в Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Този сървър не може да записва в Задачи в Nextcloud, затова експортът не е наличен.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Управлява се от Planninq. Промените, направени тук, се заменят при следващата промяна в Planninq.", + "Working days and holidays": "Работни дни и празници", + "Dates set on the timeline skip the days that are not working days.": "Датите, зададени на времевата линия, прескачат дните, които не са работни.", + "Working weekdays": "Работни дни от седмицата", + "Non-working days": "Неработни дни", + "No non-working days yet.": "Все още няма неработни дни.", + "Add day": "Добави ден", + "Year": "Година", + "Add Dutch national holidays": "Добави нидерландските национални празници", + "Save working days": "Запази работните дни", + "Choose at least one working weekday.": "Изберете поне един работен ден.", + "Working days saved.": "Работните дни са запазени.", + "Could not save the working days.": "Работните дни не можаха да бъдат запазени.", + "New Year's Day": "Нова година", + "Easter Sunday": "Великден", + "Easter Monday": "Велики понеделник", + "King's Day": "Ден на краля", + "Liberation Day": "Ден на освобождението", + "Ascension Day": "Възнесение Господне", + "Whit Sunday": "Петдесетница", + "Whit Monday": "Духов понеделник", + "Christmas Day": "Коледа", + "Boxing Day": "Втори ден на Коледа", + "Dates of {title}": "Дати на {title}", + "The due date cannot be before the start date.": "Крайният срок не може да е преди началната дата.", + "{title}, from {start} to {end}": "{title}, от {start} до {end}", + "The dates could not be saved.": "Датите не можаха да бъдат запазени.", + "{title} now runs from {start} to {end}": "{title} вече продължава от {start} до {end}", + "Auto-scheduling": "Автоматично планиране", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Когато е включено, по-късен краен срок на времевата линия предлага да премести и задачите, които блокира.", + "Move blocked tasks along when a task slips": "Премествай блокираните задачи, когато задача закъснее", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На времевата линия по-късен срок предлага да премести блокираните задачи. Броят се само връзките \"блокира\", а задачите се местят само напред.", + "Move the tasks that wait for {title}?": "Да се преместят ли задачите, които чакат {title}?", + "These tasks wait for it and would start after its new due date:": "Тези задачи я чакат и биха започнали след новия ѝ срок:", + "{count} tasks would move; the first {limit} are listed.": "Биха се преместили {count} задачи; показани са първите {limit}.", + "Now": "Сега", + "After the move": "След преместването", + "Only this task": "Само тази задача", + "Move all": "Премести всички", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Спряно при {title}: датите не можаха да бъдат запазени. Задачите преди нея бяха преместени.", + "Cumulative flow": "Кумулативен поток", + "Show as chart": "Покажи като диаграма", + "Show as table": "Покажи като таблица", + "Tasks per column per day": "Задачи по колона на ден", + "Tasks without recorded history in this period: {count}": "Задачи без записана история в този период: {count}", + "Lead and cycle time": "Време за изпълнение и време на цикъла", + "No tasks were finished in this period.": "В този период не е завършена нито една задача.", + "Finished tasks": "Завършени задачи", + "Cycle time, average": "Време на цикъла, средно", + "Cycle time, 85th percentile": "Време на цикъла, 85-и перцентил", + "Lead time, average": "Време за изпълнение, средно", + "Tasks whose finish time was estimated from their history: {count}": "Задачи, чието време на завършване е изчислено от историята: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Време на цикъла на всяка завършена задача, със средното и 85-ия перцентил", + "Slowest tasks": "Най-бавни задачи", + "cycle {cycle}, lead {lead}": "цикъл {cycle}, изпълнение {lead}", + "{days} days": "{days} дни", + "Could not load the flow of this project.": "Потокът на този проект не можа да се зареди.", + "Last {days} days": "Последните {days} дни", + "Portfolio flow": "Поток на портфолиото", + "An admin adds portfolios under Projects, Portfolios.": "Администратор добавя портфолиа в Проекти, Портфолиа.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Непоказани проекти, защото наведнъж се показват най-много 50: {count}", + "Could not load the flow of this portfolio.": "Потокът на това портфолио не можа да се зареди.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Кумулативен поток и време на цикъла в проектите на портфолио.", + "Edit report": "Редактиране на отчета", + "Only tasks where": "Само задачи, при които", + "Group by": "Групиране по", + "Display": "Изглед", + "Share with everyone who can read its projects": "Споделяне с всички, които могат да четат проектите му", + "The report could not be saved.": "Отчетът не можа да се запази.", + "Number of tasks": "Брой задачи", + "Bar": "Стълбове", + "Donut": "Пръстен", + "Table": "Таблица", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} от {total} проекта в този отчет не са видими за вас", + "No tasks match this report.": "Нито една задача не отговаря на този отчет.", + "None": "Няма", + "Could not load this report.": "Този отчет не можа да се зареди.", + "Report": "Отчет", + "Your reports": "Вашите отчети", + "My reports": "Моите отчети", + "Shared reports": "Споделени отчети", + "You have not built a report yet.": "Още не сте създали отчет.", + "Nobody has shared a report with you yet.": "Още никой не е споделил отчет с вас.", + "Reports you built over tasks, and the ones shared with you.": "Отчети, които сте създали върху задачи, и споделените с вас.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Запазена заявка върху задачи: кои проекти, кои филтри, групирани по какво, преброени или сумирани, и показани като таблица или диаграма.", + "The name the report is listed under": "Името, под което отчетът е в списъка", + "What the report shows and who it is for": "Какво показва отчетът и за кого е", + "Nextcloud user id of the person who saved the report": "Nextcloud ID на потребителя, който е запазил отчета", + "Who can open the report": "Кой може да отвори отчета", + "Only me": "Само аз", + "Everyone who can read its projects": "Всички, които могат да четат проектите му", + "The projects the report covers, at most fifty": "Проектите, които отчетът обхваща, най-много петдесет", + "Filters": "Филтри", + "Task fields and the value each must equal": "Полета на задачата и стойността, на която всяко трябва да е равно", + "The task field the report groups on": "Полето на задачата, по което отчетът групира", + "Count the tasks, or add up a number on them": "Преброяване на задачите или сумиране на число от тях", + "Sum": "Сума", + "Sum of": "Сума на", + "The number added up when the measure is a sum": "Числото, което се сумира, когато мярката е сума", + "Story points": "Точки за история", + "Estimated duration": "Очаквана продължителност", + "How the report is shown": "Как се показва отчетът", + "Issue type": "Вид заявка", + "Task fields and the value each must equal; empty when the report covers every task": "Полета на задачата и стойността, която всяко трябва да има; празно, когато отчетът обхваща всички задачи", + "The status a task must have": "Статусът, който задачата трябва да има", + "The priority a task must have": "Приоритетът, който задачата трябва да има", + "The user a task must be assigned to": "Потребителят, на когото задачата трябва да е възложена", + "A label a task must carry": "Етикет, който задачата трябва да носи", + "The board column a task must be in": "Колоната на таблото, в която задачата трябва да е", + "The issue type a task must have": "Видът заявка, който задачата трябва да има", + "Manager groups": "Групи ръководители", + "Member groups": "Групи членове", + "Viewer groups": "Групи читатели", + "Viewers": "Читатели", + "Owning group": "Притежаваща група", + "Nextcloud groups whose members manage the project": "Групи в Nextcloud, чиито членове управляват проекта", + "Nextcloud groups whose members work on the project": "Групи в Nextcloud, чиито членове работят по проекта", + "Nextcloud groups whose members may read the project": "Групи в Nextcloud, чиито членове могат да четат проекта", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Потребители в Nextcloud, които управляват проекта: настройки, членове и работа", + "Nextcloud user ids who may read the project and its work but not change it": "Потребители в Nextcloud, които могат да четат проекта и работата му, но не и да ги променят", + "The Nextcloud group that owns the project with its creator, at most one": "Групата в Nextcloud, която притежава проекта заедно със създателя му, най-много една", + "Nextcloud user ids who may read this through the project": "Потребители в Nextcloud, които могат да четат това чрез проекта", + "Nextcloud groups whose members may change this through the project": "Групи в Nextcloud, чиито членове могат да променят това чрез проекта", + "Nextcloud groups whose members may read this through the project": "Групи в Nextcloud, чиито членове могат да четат това чрез проекта", + "Search for a person or a group…": "Търсене на човек или група…", + "No one found. Your admin's sharing settings decide who you can find.": "Никой не е намерен. Настройките за споделяне на администратора определят кого можете да намерите.", + "Type at least two characters": "Въведете поне два знака", + "Everyone in this group": "Всички в тази група", + "Could not search for people. Please try again.": "Търсенето на хора не бе успешно. Опитайте отново.", + "Could not remove the group": "Групата не можа да бъде премахната", + "Only the owner and managers change who is on this project.": "Само собственикът и управителите променят кой е в този проект.", + "Role of {name}": "Роля: {name}", + "Manager": "Управител", + "Member": "Член", + "Viewer": "Читател", + "Could not change the role": "Ролята не можа да бъде променена", + "Owned by group: {name}": "Собственост на групата: {name}", + "No group owns this project.": "Никоя група не притежава този проект.", + "Owned by group": "Собственост на група", + "Search for a group…": "Търсене на група…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Не е намерена група. Настройките за споделяне на администратора определят кои групи можете да намерите.", + "No owning group": "Без група собственик", + "Could not search for groups. Please try again.": "Търсенето на групи не бе успешно. Опитайте отново.", + "Could not change the owning group": "Групата собственик не можа да бъде променена", + "You can read this project. Only its members change it.": "Можете да четете този проект. Само членовете му го променят.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курсът, който се преподава в този час, например избираем предмет, когато училищното приложение за обучение го познава.", + "Online meeting link": "Връзка към онлайн часа", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Къде учениците се присъединяват към този час онлайн. Бутонът Присъедини се се показва само за https връзка." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bg.json b/l10n/bg.json index e5ad5043..848a4ac5 100644 --- a/l10n/bg.json +++ b/l10n/bg.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Активни проекти", + "Archived projects": "Архивирани проекти", + "Boards": "Табла", + "My projects": "Моите проекти", + "Portfolio": "Портфолио", + "Project board": "Табло на проекта", + "Projects I am in": "Проекти, в които участвам", + "Timeline": "Времева линия", + "Timesheet": "Отчет за времето", + "Features & roadmap": "Функции и пътна карта", + "Flow": "Поток", + "Flows": "Потоци", + "Reports": "Отчети", + "Pick a report to open it.": "Изберете отчет, за да го отворите.", + "In progress": "В процес", + "Date": "Дата", + "Due": "Краен срок", + "Assignee": "Възложено на", + "Who": "Кой", + "What": "Какво", + "Minutes": "Минути", + "Entries": "Записи", + "Most recent": "Най-скорошни", + "Per person": "На човек", + "By status": "По статус", + "By priority": "По приоритет", + "Task status": "Статус на задачите", + "Time spent": "Изразходвано време", + "Capacity": "Капацитет", + "Due soonest": "Най-скоро дължими", + "Minutes logged": "Записани минути", + "Nothing is due": "Няма нищо дължимо", + "Nothing logged yet": "Още нищо не е записано", + "What is open, what is blocked, and what is overdue.": "Какво е отворено, какво е блокирано и какво е просрочено.", + "How allocation is spread across the people working on projects.": "Как е разпределено натоварването между хората по проектите.", + "Hours logged, and the projects they went to.": "Записаните часове и проектите, за които са отишли.", + "Billable": "Таксуемо", + "Budget: {amount}": "Бюджет: {amount}", + "Loading projects": "Зареждане на проекти", + "No projects for this client yet": "Все още няма проекти за този клиент", + "Open in Planninq": "Отваряне в Planninq", + "This project could not be found": "Този проект не беше намерен", + "Untitled project": "Проект без име", + "and {count} more": "и още {count}", + "Store": "Магазин", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Инсталирайте регистри, схеми и потоци, публикувани от други организации.", + "Work Date": "Работна дата", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Действия с колоната", + "Columns": "Колони", + "Could not remove the column. Please try again.": "Колоната не можа да бъде премахната. Опитайте отново.", + "Could not save the column. Please try again.": "Колоната не можа да бъде запазена. Опитайте отново.", + "Done column": "Колона за завършени", + "Edit column": "Редактиране на колоната", + "Keep the card's status": "Запазване на статуса на картата", + "Move its cards to": "Преместване на картите в", + "Move left": "Преместване наляво", + "Move right": "Преместване надясно", + "Status of cards moved here": "Статус на картите, преместени тук", + "The last done column cannot be removed.": "Последната колона за завършени не може да бъде премахната.", + "WIP limit": "WIP лимит", + "over limit": "над лимита", + "The status a card gets when it is moved into this column.": "Статусът, който картата получава, когато бъде преместена в тази колона.", + "All priorities": "Всички приоритети", + "Could not create the task. Please try again.": "Задачата не можа да бъде създадена. Опитайте отново.", + "Created": "Създадена", + "Move to backlog": "Към беклога", + "Move to board": "Към таблото", + "New task": "Нова задача", + "Nothing in the backlog": "Няма нищо в беклога", + "Rank": "Ранг", + "Sort by": "Сортиране по", + "Sort by rank to reorder": "Сортирайте по ранг, за да пренаредите", + "Task actions": "Действия със задачата", + "All labels": "Всички етикети", + "Filter tasks by label": "Филтриране на задачите по етикет", + "View timeline": "Преглед на времевата линия", + "Board": "Табло", + "List": "Списък", + "Column": "Колона", + "Board or list": "Табло или списък", + "Log": "Дневник", + "Add entry": "Добавяне на запис", + "Show": "Показване", + "No actions yet": "Все още няма действия", + "Closed": "Затворен", + "Entry actions": "Действия със записа", + "Add action": "Добавяне на действие", + "by {author}": "от {author}", + "saved {time}": "запазено {time}", + "Attendees: {names}": "Присъстващи: {names}", + "Add the first entry": "Добавяне на първия запис", + "Issues": "Проблеми", + "Lessons learned": "Научени уроци", + "Meetings": "Срещи", + "Decisions": "Решения", + "Actions": "Действия", + "Issue": "Проблем", + "Lesson learned": "Научен урок", + "Meeting": "Среща", + "Decision": "Решение", + "About this project": "За този проект", + "No description yet": "Все още няма описание", + "Start date": "Начална дата", + "Not set": "Не е зададено", + "End date": "Крайна дата", + "Progress": "Напредък", + "No tasks yet": "Все още няма задачи", + "Open the board": "Отваряне на таблото", + "People": "Хора", + "Owner": "Собственик", + "Latest log entries": "Последни записи", + "Open the log": "Отваряне на дневника", + "{done} of {total} tasks done": "{done} от {total} задачи са готови", + "Edit entry": "Редактиране на запис", + "Type": "Вид", + "Attendees": "Присъстващи", + "Issue is closed": "Проблемът е затворен", + "Could not save the entry. Please try again.": "Записът не можа да бъде запазен. Опитайте отново.", + "From: {title}": "От: {title}", + "What needs to happen": "Какво трябва да се направи", + "Could not create the action. Please try again.": "Действието не можа да бъде създадено. Опитайте отново.", + "The action was created but could not be linked to the entry.": "Действието е създадено, но не можа да бъде свързано със записа.", + "Project pages": "Страници на проекта", + "Overview": "Преглед", + "Risks": "Рискове", + "Log entry": "Запис в дневника", + "A short name for the entry": "Кратко име за записа", + "Project": "Проект", + "The project this entry belongs to": "Проектът, към който принадлежи този запис", + "What kind of entry this is": "Какъв вид запис е това", + "When it happened": "Кога се е случило", + "What happened, in Markdown": "Какво се е случило, в Markdown", + "Whether an issue is still open": "Дали проблемът все още е отворен", + "The people at a meeting": "Хората на среща", + "Tasks that came out of this entry": "Задачи, произлезли от този запис", + "Add risk": "Добавяне на риск", + "Risk": "Риск", + "Score": "Оценка", + "Response": "Реакция", + "Review date": "Дата за преглед", + "no longer on the project": "вече не е в проекта", + "Edit {title}": "Редактиране на {title}", + "No risks recorded yet": "Все още няма записани рискове", + "Add the first risk": "Добавяне на първия риск", + "Medium": "Среден", + "Mitigating": "Смекчава се", + "Occurred": "Настъпил", + "Avoid": "Избягване", + "Reduce": "Намаляване", + "Transfer": "Прехвърляне", + "Accept": "Приемане", + "Highest open risks": "Най-високи отворени рискове", + "No open risks": "Няма отворени рискове", + "Open the risk register": "Отваряне на регистъра на рисковете", + "Edit risk": "Редактиране на риск", + "What could go wrong": "Какво може да се обърка", + "Likelihood": "Вероятност", + "Impact": "Въздействие", + "Score {score}": "Оценка {score}", + "Countermeasures": "Мерки", + "Could not save the risk. Please try again.": "Рискът не можа да бъде запазен. Опитайте отново.", + "Risks by likelihood and impact": "Рискове по вероятност и въздействие", + "Risk scale": "Скала на риска", + "The levels every project scores its risks on, and where low turns into medium and high": "Нивата, по които всеки проект оценява рисковете си, и къде ниско преминава в средно и високо", + "Number of levels": "Брой нива", + "Likelihood labels": "Етикети за вероятност", + "Impact labels": "Етикети за въздействие", + "Level {level}": "Ниво {level}", + "Medium from score": "Средно от оценка", + "High from score": "Високо от оценка", + "Risk scale saved": "Скалата на риска е запазена", + "1 risk uses level {level}. Change it first.": "1 риск използва ниво {level}. Първо го променете.", + "{count} risks use level {level}. Change them first.": "{count} риска използват ниво {level}. Първо ги променете.", + "Every level needs a label, and high must start above medium.": "Всяко ниво има нужда от етикет, а високо трябва да започва над средно.", + "The project this risk belongs to": "Проектът, към който принадлежи този риск", + "The cause and the effect, in Markdown": "Причината и последицата, в Markdown", + "Category": "Категория", + "A free grouping, such as planning, budget or supplier": "Свободно групиране, например планиране, бюджет или доставчик", + "How likely it is, on the admin's risk scale": "Колко вероятно е, по скалата на риска на администратора", + "How hard it would hit, on the admin's risk scale": "Колко силно би ударило, по скалата на риска на администратора", + "Likelihood times impact, calculated by the server": "Вероятност по въздействие, изчислено от сървъра", + "Where the risk stands": "Докъде е стигнал рискът", + "The person who watches this risk": "Човекът, който следи този риск", + "How the project answers the risk": "Как проектът отговаря на риска", + "What is done to prevent it or soften it, in Markdown": "Какво се прави, за да се предотврати или смекчи, в Markdown", + "When to look at this risk again": "Кога рискът да се прегледа отново", + "Very low": "Много ниско", + "Very high": "Много високо", + "All projects": "Всички проекти", + "Project status report": "Доклад за състоянието на проекта", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датиран доклад за това как стои проектът по пари, организация, време, информация, качество и риск (аспектите GROTIK), всеки с бележка.", + "The project this report is about": "Проектът, за който е докладът", + "Report date": "Дата на доклада", + "The day the report describes": "Денят, който докладът описва", + "Money": "Пари", + "How the project stands on this aspect": "Как стои проектът по този аспект", + "On track": "По план", + "At risk": "В риск", + "Off track": "Извън плана", + "Money note": "Бележка за парите", + "A short explanation of this status": "Кратко обяснение на това състояние", + "Organisation": "Организация", + "Organisation note": "Бележка за организацията", + "Time": "Време", + "Time note": "Бележка за времето", + "Information": "Информация", + "Information note": "Бележка за информацията", + "Quality": "Качество", + "Quality note": "Бележка за качеството", + "Risk note": "Бележка за риска", + "Overall": "Общо", + "The worst of the six statuses, calculated by the server": "Най-лошото от шестте състояния, изчислено от сървъра", + "Health: money": "Състояние: пари", + "Copied from the newest status report": "Копирано от най-новия доклад за състоянието", + "Health: organisation": "Състояние: организация", + "Health: time": "Състояние: време", + "Health: information": "Състояние: информация", + "Health: quality": "Състояние: качество", + "Health: risk": "Състояние: риск", + "Health: overall": "Състояние: общо", + "Health: report date": "Състояние: дата на доклада", + "The date of the newest status report": "Датата на най-новия доклад за състоянието", + "New report": "Нов доклад", + "Only the project owner writes status reports.": "Само собственикът на проекта пише доклади за състоянието.", + "Latest report, {date}": "Последен доклад, {date}", + "Aspect": "Аспект", + "Note": "Бележка", + "Report history": "История на докладите", + "Author": "Автор", + "No status reports yet": "Все още няма доклади за състоянието", + "Write the first report": "Напишете първия доклад", + "Choose a status for every aspect to save the report.": "Изберете състояние за всеки аспект, за да запазите доклада.", + "Suggested: on track.": "Предложение: по план.", + "Suggested: at risk.": "Предложение: в риск.", + "Suggested: off track.": "Предложение: извън плана.", + "1 task is past its due date.": "1 задача е с изтекъл срок.", + "{count} tasks are past their due date.": "Задачи с изтекъл срок: {count}.", + "The end date has passed with 1 open task.": "Крайната дата е минала с 1 отворена задача.", + "The end date has passed with {count} open tasks.": "Крайната дата е минала, отворени задачи: {count}.", + "No open task is past its due date.": "Няма отворена задача с изтекъл срок.", + "The highest open risk, \"{title}\", scores {score}.": "Най-високият отворен риск, \"{title}\", има оценка {score}.", + "There are no open risks.": "Няма отворени рискове.", + "Costs are at {percent}% of the budget.": "Разходите са {percent}% от бюджета.", + "No suggestion: the project has no budget.": "Няма предложение: проектът няма бюджет.", + "No suggestion: no costs are recorded for this project yet.": "Няма предложение: все още няма записани разходи за този проект.", + "The report was not saved. Only the project owner can write status reports.": "Докладът не е запазен. Само собственикът на проекта може да пише доклади за състоянието.", + "No report": "Няма доклад", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Група проекти, водени от едни и същи хора, например отдел или програма. Нейните ръководители четат всеки проект в нея.", + "The name of the portfolio": "Името на портфолиото", + "What the portfolio holds and who runs it": "Какво съдържа портфолиото и кой го води", + "A colour for the portfolio's section in project lists": "Цвят за раздела на портфолиото в списъците с проекти", + "Managers": "Ръководители", + "Nextcloud user UIDs of the people who run the portfolio": "Потребителски ID в Nextcloud на хората, които водят портфолиото", + "Order": "Ред", + "Where the portfolio comes in project lists, lowest first": "Къде е портфолиото в списъците с проекти, най-ниското първо", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Собствената скала за риск на това портфолио като JSON, в същата форма като скалата за цялото приложение. Празно означава скалата на приложението.", + "Portfolio readers": "Читатели на портфолиото", + "Nextcloud user UIDs of the managers of the project's portfolio": "Потребителски ID в Nextcloud на ръководителите на портфолиото на проекта", + "The portfolio this project belongs to": "Портфолиото, към което принадлежи проектът", + "No portfolio": "Без портфолио", + "All portfolios": "Всички портфолиа", + "You read this project as a manager of its portfolio. Only its members change it.": "Четете този проект като ръководител на неговото портфолио. Само членовете му го променят.", + "Portfolios": "Портфолиа", + "Portfolio status": "Състояние на портфейла", + "No portfolios yet": "Все още няма портфейли", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Администратор добавя портфейли в Проекти, Портфейли. Проектите в портфейла са изброени тук със своето състояние.", + "Roll-up": "Обобщение", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} по план, {atRisk} в риск, {offTrack} извън плана, {noReport} без отчет", + "No project in this portfolio that you can read.": "Няма проект в този портфейл, който можете да четете.", + "Start": "Начало", + "End": "Край", + "Budget": "Бюджет", + "Last report": "Последен отчет", + "Out of date": "Остарял", + "Portfolio timeline": "Времева линия на портфейла", + "Zoom": "Мащаб", + "Could not load the timeline": "Времевата линия не можа да се зареди", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Администратор добавя портфейли в Проекти, Портфейли. Проектите в портфейла са показани тук на една времева линия.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Отворете проект, за да видите фазите и задачите му. Времевата линия е само за четене.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Пропуснати, защото не можете да ги четете: {count} проекта", + "Week": "Седмица", + "Day": "Ден", + "Month": "Месец", + "Please try again later.": "Опитайте отново по-късно.", + "Status reports": "Отчети за състояние", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "След колко дни последният отчет за състоянието на проект се отбелязва като остарял в прегледа на портфейла", + "Reporting period (days)": "Отчетен период (дни)", + "The reporting period is a whole number of days from 1 to 365.": "Отчетният период е цял брой дни от 1 до 365.", + "Reporting period saved": "Отчетният период е запазен", + "The reporting period was not saved. Please try again.": "Отчетният период не беше запазен. Опитайте отново.", + "Every project of a portfolio with its status per aspect, rolled up.": "Всеки проект от портфейла със състоянието по аспекти, обобщено.", + "The projects of a portfolio on one timeline.": "Проектите от портфейла на една времева линия.", + "Phases": "Фази", + "Add phase": "Добавяне на фаза", + "No phases yet": "Все още няма фази", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Разделете проекта на фази, например иницииране, дефиниране и изпълнение. Фазата се затваря, когато заключителният ѝ документ е качен.", + "{hours} hours": "{hours} часа", + "Concluding document: {title}": "Заключителен документ: {title}", + "Concluding document missing": "Липсва заключителен документ", + "Move {title} up": "Премести {title} нагоре", + "Move {title} down": "Премести {title} надолу", + "Close phase": "Затваряне на фаза", + "Phase": "Фаза", + "Files": "Файлове", + "Notes": "Бележки", + "Audit trail": "Одитна следа", + "Edit phase": "Редактиране на фаза", + "Name": "Име", + "Budget hours": "Бюджетни часове", + "Could not save the phase. Please try again.": "Фазата не можа да се запази. Опитайте отново.", + "Close phase {title}": "Затваряне на фаза {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фазата се затваря със заключителния си документ: качете го тук или изберете един от файловете на фазата.", + "Concluding document": "Заключителен документ", + "This phase has no files yet.": "Тази фаза все още няма файлове.", + "Upload a document": "Качване на документ", + "The document was not uploaded. Please try again.": "Документът не беше качен. Опитайте отново.", + "Upload the concluding document before you close this phase.": "Качете заключителния документ, преди да затворите тази фаза.", + "This phase cannot be closed from its current status.": "Тази фаза не може да бъде затворена от текущото ѝ състояние.", + "The phase was not closed. Please try again.": "Фазата не беше затворена. Опитайте отново.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID на файла в тази фаза, който я приключва. Фазата може да бъде завършена едва когато е зададен и файлът е прикачен.", + "Import from Microsoft Project": "Импортиране от Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Изберете план, записан от Microsoft Project във формат XML. Нищо не се импортира, докато не потвърдите.", + "Plan file": "Файл на плана", + "What the import creates": "Какво създава импортът", + "Tasks": "Задачи", + "Sub-tasks": "Подзадачи", + "Milestones": "Етапи", + "Links": "Връзки", + "Already imported, updated in place: {count}": "Вече импортирани, обновени на място: {count}", + "What does not carry over": "Какво не се пренася", + "Tasks with resources, which are not imported: {count}": "Задачи с ресурси, които не се импортират: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Задачи по-дълбоко от ниво 3, поставени под своята задача от ниво 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Връзки, различни от край-начало, импортирани като свързани връзки: {count}", + "Link lags, which are dropped: {count}": "Закъснения на връзки, които отпадат: {count}", + "Links to a summary task, which are not imported: {count}": "Връзки към обобщаваща задача, които не се импортират: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Връзки към задачи извън този план, които не се импортират: {count}", + "No longer in the plan": "Вече не е в плана", + "These stay in the project; remove them yourself if they are no longer needed.": "Остават в проекта; премахнете ги сами, ако вече не са нужни.", + "Import": "Импортиране", + "Close": "Затваряне", + "The plan is imported: {created} created, {updated} updated.": "Планът е импортиран: създадени {created}, обновени {updated}.", + "Links that would close a loop were left out: {count}": "Връзките, които биха затворили цикъл, са пропуснати: {count}", + "The import stopped part-way. Run it again to finish it.": "Импортът спря по средата. Пуснете го отново, за да го завършите.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Запишете плана в Microsoft Project чрез Файл, Запиши като, формат XML, и импортирайте този файл.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Този файл декларира DOCTYPE или обекти, които не се приемат.", + "The file is larger than 10 MB.": "Файлът е по-голям от 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Планът има над 2000 задачи, повече, отколкото приема един импорт.", + "This file is not a Microsoft Project plan in XML format.": "Този файл не е план на Microsoft Project във формат XML.", + "Choose a file to import.": "Изберете файл за импортиране.", + "Only the project owner can import a plan.": "Само собственикът на проекта може да импортира план.", + "The plan could not be read. Please try again.": "Планът не можа да бъде прочетен. Опитайте отново.", + "Linked case: {title}": "Свързана преписка: {title}", + "Linked to a case": "Свързано с преписка", + "Hand over to case": "Предаване към преписката", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Копира без промяна всеки файл на проекта и задачите му, както и файл, описващ проекта, в свързаната преписка.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Копирани файлове: {count}", + "Files that failed: {names}": "Неуспешни файлове: {names}", + "The handover failed. Please try again.": "Предаването не успя. Опитайте отново.", + "The linked case could not be found, or you cannot open it.": "Свързаната преписка не е намерена или не можете да я отворите.", + "Case handovers": "Предавания към преписката", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Всяко предаване на файловете и метаданните на проекта към преписката му: кога, от кого, към коя преписка, всеки копиран файл с неговия SHA-256 и неуспешните файлове.", + "Finance": "Финанси", + "Add cost line": "Добавяне на разходен ред", + "Delivery terms": "Условия за доставка", + "Billing model": "Модел на фактуриране", + "Budget in euro": "Бюджет в евро", + "Budget in hours": "Бюджет в часове", + "Hourly rate in euro": "Часова ставка в евро", + "Planned start": "Планирано начало", + "Planned end": "Планиран край", + "Planned dates": "Планирани дати", + "Budget {amount}": "Бюджет {amount}", + "No budget agreed": "Няма договорен бюджет", + "Hours": "Часове", + "Only the project owner and the portfolio managers see the amounts.": "Сумите виждат само собственикът на проекта и мениджърите на портфолиото.", + "Budget against cost per category": "Бюджет спрямо разходи по категория", + "Labour (booked time)": "Труд (отчетено време)", + "No category": "Без категория", + "Hours are not available": "Часовете не са налични", + "Not yet assigned to a category": "Все още не е разпределено към категория", + "Total": "Общо", + "{spent} spent, {remaining} remaining": "{spent} изразходвани, {remaining} остават", + "Budget against cost per phase": "Бюджет спрямо разходи по фаза", + "No phase": "Без фаза", + "Cost lines": "Разходни редове", + "From the finance system": "От финансовата система", + "Edit cost line {amount}": "Редактиране на разходния ред {amount}", + "No cost lines yet": "Все още няма разходни редове", + "Commitments": "Ангажименти", + "Actual cost": "Действителни разходи", + "Forecast": "Прогноза", + "Remaining": "Остават", + "Not planned yet": "Все още не е планирано", + "{start} to {end}": "{start} до {end}", + "The terms were not saved. Please try again.": "Условията не бяха запазени. Опитайте отново.", + "Terms saved": "Условията са запазени", + "Fixed price": "Фиксирана цена", + "Hourly": "На час", + "Not billed": "Не се фактурира", + "Commitment": "Ангажимент", + "Edit cost line": "Редактиране на разходен ред", + "Kind": "Вид", + "Amount in euro": "Сума в евро", + "Remove": "Премахване", + "Could not save the cost line. Only the project owner changes the money of a project.": "Разходният ред не можа да бъде запазен. Само собственикът на проекта променя парите на проекта.", + "Could not remove the cost line. Please try again.": "Разходният ред не можа да бъде премахнат. Опитайте отново.", + "{amount} over budget": "{amount} над бюджета", + "Cost categories": "Категории разходи", + "The categories every project splits its budget and costs into, one per line": "Категориите, на които всеки проект разделя бюджета и разходите си, по една на ред", + "Categories": "Категории", + "Give at least one category, each name once.": "Посочете поне една категория, всяко име веднъж.", + "Cost categories saved": "Категориите разходи са запазени", + "The cost categories were not saved. Please try again.": "Категориите разходи не бяха запазени. Опитайте отново.", + "Finance line": "Финансов ред", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Една парична сума в проект: бюджет, ангажимент, действителен разход или прогноза, в категория разходи и по избор във фаза. Въвежда се от собственика на проекта или от финансовата система чрез приложението за интеграция.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Проектът, към който принадлежи сумата. Празно за ред от финансовата система, чийто номер на проект не съвпада с нито един проект.", + "The phase this amount belongs to, if any": "Фазата, към която принадлежи сумата, ако има такава", + "The cost category, one of the categories the admin set up": "Категорията разходи, една от категориите, зададени от администратора", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Дали сумата е бюджет, ангажимент, действителен разход или прогноза", + "Amount": "Сума", + "The amount in the reporting currency (euro)": "Сумата във валутата на отчитане (евро)", + "The date the amount was booked or is expected": "Датата, на която сумата е осчетоводена или се очаква", + "What the amount is for": "За какво е сумата", + "Whether a person entered the line or the finance system sent it": "Дали ред е въведен от човек или е изпратен от финансовата система", + "Entered by hand": "Въведено ръчно", + "Finance line id": "Идентификатор на финансовия ред", + "The finance system's own id of this line. One imported line per id.": "Собственият идентификатор на този ред във финансовата система. Един импортиран ред за идентификатор.", + "Project number": "Номер на проект", + "The project number the finance system sent, matched against the project key": "Номерът на проект, изпратен от финансовата система, сравнен с ключа на проекта", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Портфолиото на проекта на реда, копирано от проекта, за да изискват сумите на портфолиото един филтър", + "Finance readers": "Читатели на финансите", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID на потребителите на Nextcloud, които могат да виждат сумата: собственикът на проекта и мениджърите на неговото портфолио", + "Project owner": "Собственик на проекта", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID на потребителя на Nextcloud, собственик на проекта, който може да променя и премахва ръчни редове", + "How the client pays: not billed, a fixed price, or by the hour.": "Как плаща клиентът: не се фактурира, фиксирана цена или на час.", + "Portfolio finance": "Финанси на портфолиото", + "You cannot see the money of any project in this portfolio": "Не можете да видите парите на нито един проект в това портфолио", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Сървърът върна разходни редове на проекти извън това портфолио, затова тези суми може да са грешни.", + "Projects left out because you cannot see their money: {count}": "Пропуснати проекти, защото не можете да видите парите им: {count}", + "Unmatched finance lines": "Несвързани финансови редове", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Бюджет, ангажименти, действителни разходи и прогноза, сумирани за портфолио.", + "Subprojects": "Подпроекти", + "{done} of {total}": "{done} от {total}", + "{done} of {total} tasks done, including subprojects": "{done} от {total} задачи изпълнени, включително подпроектите", + "Show the subprojects of {title}": "Показване на подпроектите на {title}", + "Hide the subprojects of {title}": "Скриване на подпроектите на {title}", + "Part of": "Част от", + "No parent project": "Без родителски проект", + "A project cannot sit under one of its own subprojects.": "Проект не може да стои под някой от собствените си подпроекти.", + "Projects nest three levels deep at most: programme, project and subproject.": "Проектите се влагат най-много на три нива: програма, проект и подпроект.", + "Parent project": "Родителски проект", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Проектът, под който стои този проект, например програма. Проектите се влагат най-много на три нива.", + "Yes": "Да", + "No": "Не", + "{label} (required)": "{label} (задължително)", + "{label} is required": "{label} е задължително", + "Project field": "Поле на проект", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поле, което администраторът добавя към всеки проект, например област на политика или стойност на договор.", + "Key": "Ключ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Постоянното име, под което се пази стойността, в lower camel case. Запазете го, щом проектите го използват.", + "Label": "Етикет", + "The name people see next to the field": "Името, което хората виждат до полето", + "What the field holds": "Какво съдържа полето", + "Text": "Текст", + "Number": "Число", + "Choice": "Избор", + "Person": "Лице", + "Yes or no": "Да или не", + "Options": "Опции", + "The choices of a choice field": "Опциите на поле за избор", + "Required": "Задължително", + "Whether a project must fill in the field": "Дали проектът трябва да попълни полето", + "Where the field appears, lowest first": "Къде се показва полето, най-ниското първо", + "Applies to": "Отнася се за", + "What the field is added to": "Към какво се добавя полето", + "Custom fields": "Собствени полета", + "The values of the project fields an admin defined, keyed by the field's key.": "Стойностите на полетата на проекта, зададени от администратор, по ключа на полето.", + "Project fields": "Полета на проекта", + "Related": "Свързани", + "Remove link": "Премахване на връзката", + "Link type": "Вид връзка", + "Relates to": "Свързана с", + "Duplicates": "Дублира", + "Project key": "Ключ на проекта", + "Every task number starts with it, such as VERG-42.": "Всеки номер на задача започва с него, например VERG-42.", + "This key is already used by another project.": "Този ключ вече се използва от друг проект.", + "Use 2 to 10 letters and digits, starting with a letter.": "Използвайте от 2 до 10 букви и цифри, като започнете с буква.", + "The key cannot change once tasks carry it.": "Ключът не може да се промени, след като задачите го носят.", + "Project saved. The existing tasks get their numbers in the background.": "Проектът е запазен. Съществуващите задачи получават номерата си във фонов режим.", + "Next task number": "Номер на следващата задача", + "The number the next task of this project gets in its key. Only the system writes it.": "Номерът, който следващата задача на този проект получава в ключа си. Записва го само системата.", + "Restore {title}": "Възстанови {title}", + "Restore": "Възстанови", + "Project restored": "Проектът е възстановен", + "Could not restore the project": "Проектът не можа да бъде възстановен", + "Bring this project back to the active list.": "Върнете този проект в списъка с активни проекти.", + "Restore project": "Възстанови проекта", + "Request reason": "Причина за заявката", + "Why the requester needs this project. Filled in when the project is requested.": "Защо заявителят се нуждае от този проект. Попълва се при заявката.", + "Reviewed by": "Прегледано от", + "The user who approved or rejected the request.": "Потребителят, който е одобрил или отхвърлил заявката.", + "Reviewed at": "Прегледано на", + "When the request was approved or rejected.": "Кога заявката е одобрена или отхвърлена.", + "Review note": "Бележка от прегледа", + "The reviewer's reason, shown to the requester when a request is not approved.": "Причината на проверяващия, която заявителят вижда, когато заявката не е одобрена.", + "Members of these groups": "Членове на тези групи", + "Groups that may create projects": "Групи, които могат да създават проекти", + "The group {group} no longer exists. Save to remove it.": "Групата {group} вече не съществува. Запазете, за да я премахнете.", + "Review project request": "Преглед на заявка за проект", + "Requested by": "Заявено от", + "Why it is needed": "Защо е необходим", + "Desired start date": "Желана начална дата", + "Why is it not approved?": "Защо не е одобрен?", + "Give a reason. The requester sees it.": "Посочете причина. Заявителят ще я види.", + "Approve": "Одобри", + "Reject": "Отхвърли", + "Reject request": "Отхвърли заявката", + "The review was not saved. Try again.": "Прегледът не е запазен. Опитайте отново.", + "This project is waiting for review": "Този проект чака преглед", + "This request was not approved": "Тази заявка не е одобрена", + "Reason: {note}": "Причина: {note}", + "Review request": "Преглед на заявката", + "Request a project": "Заявете проект", + "Step {step} of 2": "Стъпка {step} от 2", + "Why is this project needed?": "Защо е нужен този проект?", + "Give a reason. The reviewer reads it.": "Посочете причина. Проверяващият ще я прочете.", + "Back": "Назад", + "Next": "Напред", + "Send request": "Изпрати заявка", + "The request was not sent. Try again.": "Заявката не е изпратена. Опитайте отново.", + "Requested": "Заявен", + "Not approved": "Не е одобрен", + "Your request was sent": "Заявката ви е изпратена", + "Let everyone else request a project": "Разрешете на всички останали да заявяват проект", + "Add a task": "Добавяне на задача", + "Delete task": "Изтриване на задачата", + "Edit task": "Редактиране на задачата", + "Write": "Писане", + "Preview": "Преглед", + "Markdown works here: headings, lists and links.": "Тук работи Markdown: заглавия, списъци и връзки.", + "Could not save the task. Please try again.": "Задачата не можа да бъде запазена. Опитайте отново.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "По \"{title}\" има отчетено време, затова не може да бъде изтрита. Вместо това можете да я откажете: записите за време остават.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Да се изтрие ли \"{title}\"? Връзките ѝ с други задачи също се премахват. Това не може да бъде отменено.", + "Keep task": "Запазване на задачата", + "Cancel task": "Отказване на задачата", + "Only the reporter, the project owner or an admin can delete this task.": "Само подателят, собственикът на проекта или администратор може да изтрие тази задача.", + "Could not delete the task. Please try again.": "Задачата не можа да бъде изтрита. Опитайте отново.", + "Could not cancel the task. Please try again.": "Задачата не можа да бъде отказана. Опитайте отново.", + "Responsible": "Отговорник", + "Also working on this": "Работят и по това", + "Labels": "Етикети", + "Could not change the priority. Please try again.": "Приоритетът не можа да бъде променен. Опитайте отново.", + "Other project members who work on this task alongside the person responsible.": "Други членове на проекта, които работят по задачата заедно с отговорника.", + "Duplicate": "Дублиране", + "Could not copy the task. Please try again.": "Задачата не можа да бъде копирана. Опитайте отново.", + "Subtasks": "Подзадачи", + "{done} of {total} done": "Завършени {done} от {total}", + "Add a subtask": "Добавяне на подзадача", + "Checklist": "Контролен списък", + "Checklist item actions": "Действия за елемента от списъка", + "Add a checklist item": "Добавяне на елемент в списъка", + "Subtasks: {estimate} estimated, {logged} logged": "Подзадачи: {estimate} оценка, {logged} отчетено", + "Total estimate: {total}": "Обща оценка: {total}", + "Part of {title}": "Част от {title}", + "Checklist: {count} done": "Контролен списък: {count} завършени", + "This task has subtasks: {count}.": "Тази задача има подзадачи: {count}.", + "Keep subtasks as separate tasks": "Запазване на подзадачите като отделни задачи", + "Delete subtasks too": "Изтриване и на подзадачите", + "Copy of {title}": "Копие на {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Задачата беше копирана, но не всички нейни подзадачи. Проверете копието.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Малки стъпки в задачата. Всеки елемент има id, текст и дали е завършен.", + "Open work per person and per project.": "Отворена работа по човек и по проект.", + "View": "Изглед", + "By person": "По човек", + "By project": "По проект", + "Hours left": "Оставащи часове", + "Tasks without an estimate": "Задачи без оценка", + "Due in 14 days": "Срок до 14 дни", + "Shared": "Споделени", + "Unassigned": "Неразпределени", + "{hours} h": "{hours} ч", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Показва се работата в проектите, които можете да виждате. Часовете се отчитат за отговорния; споделените задачи се броят без часове.", + "No open work in these projects.": "Няма отворена работа в тези проекти.", + "Open work": "Отворена работа", + "{count} open tasks": "{count} отворени задачи", + "Create a project to see capacity here.": "Създайте проект, за да видите капацитета тук.", + "My tasks": "Моите задачи", + "Show all my tasks": "Покажи всички мои задачи", + "No tasks assigned to you": "Нямате възложени задачи", + "Browse projects": "Разгледай проектите", + "Later": "По-късно", + "Due {date}": "Срок {date}", + "Could not change the status. Please try again.": "Статусът не можа да бъде променен. Опитайте отново.", + "Completed today": "Завършени днес", + "My open tasks": "Моите отворени задачи", + "My overdue tasks": "Моите просрочени задачи", + "My tasks in progress": "Моите задачи в процес", + "Pin to the top": "Закачи най-горе", + "Unpin": "Откачи", + "Pinned": "Закачено", + "Actions for {title}": "Действия за {title}", + "Could not save your project order. Please try again.": "Редът на проектите ви не можа да бъде запазен. Опитайте отново.", + "No boards yet": "Все още няма табла", + "Create a project to get a board.": "Създайте проект, за да получите табло.", + "Use the Projects page to create and manage your projects and tasks.": "Използвайте страницата Проекти, за да създавате и управлявате проектите и задачите си.", + "Go to projects": "Към проектите", + "You are not a member of any projects yet.": "Все още не сте член на нито един проект.", + "Could not search for users. Please try again.": "Търсенето на потребители не успя. Опитайте отново.", + "Project creation is restricted to administrators.": "Само администраторите могат да създават проекти.", + "Only the project owner or an administrator can delete this project.": "Само собственикът на проекта или администратор може да изтрие този проект.", + "No projects are available to you yet. Ask an administrator to create one.": "Все още нямате достъпни проекти. Помолете администратор да създаде такъв.", + "Due: {date}": "Срок: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Задачите с начална дата или срок се показват на времевата линия. Добавете дати, за да ги видите тук.", + "You do not have access to this project.": "Нямате достъп до този проект.", + "Zoom level": "Ниво на мащабиране", + "Unscheduled": "Непланирани", + "Start: {date}": "Начало: {date}", + "Today": "Днес", + "No scheduled tasks": "Няма планирани задачи", + "An unexpected error occurred.": "Възникна неочаквана грешка.", + "Column {number} name": "Име на колона {number}", + "Failed to save creation policy": "Правилото за създаване не можа да бъде запазено", + "All authenticated users": "Всички влезли потребители", + "Control who may create new projects": "Определете кой може да създава нови проекти", + "Administrators only": "Само администратори", + "Project creation": "Създаване на проекти", + "Allow project creation": "Разрешаване на създаването на проекти", + "Creation policy saved successfully": "Правилото за създаване е запазено", + "Initializing…": "Стартиране…", + "e.g. 2h 30m, 90m, 1.5h": "напр. 2h 30m, 90m, 1.5h", + "Log time": "Отчитане на време", + "Save estimate": "Запазване на оценката", + "Logged: {logged}": "Отчетено: {logged}", + "over by {amount}": "надвишено с {amount}", + "Time tracking": "Отчитане на времето", + "Estimate": "Оценка", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Въведете валидна оценка (напр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Въведете валидна продължителност (напр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Записът за време не можа да бъде запазен. Опитайте отново.", + "Edit time entry": "Редактиране на запис за време", + "Duration": "Продължителност", + "Date range": "Период", + "Last week": "Миналата седмица", + "No time logged": "Няма отчетено време", + "Log time on a task to see it here.": "Отчетете време по задача, за да го видите тук.", + "To date": "До дата", + "This week": "Тази седмица", + "Total: {total}": "Общо: {total}", + "From date": "От дата", + "Custom range": "Потребителски период", + "All time": "Цялото време", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Задача не можа да бъде изтрита, така че може да останат данни. Изтрийте проекта отново.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Запис за време не можа да бъде изтрит, така че може да останат данни. Изтрийте проекта отново.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Колона не можа да бъде изтрита, така че може да останат данни. Изтрийте проекта отново.", + "Could not delete the project. Please try again.": "Проектът не можа да бъде изтрит. Опитайте отново.", + "Notification settings": "Настройки за известия", + "Configure when due-date reminders are sent": "Задайте кога се изпращат напомняния за срокове", + "Due-date reminder lead time (hours)": "Предварително време за напомняне (часове)", + "Lead time must be between 1 and 336 hours": "Предварителното време трябва да е между 1 и 336 часа", + "Reminder lead time saved successfully": "Предварителното време за напомняне е запазено", + "Failed to save reminder lead time": "Предварителното време за напомняне не можа да бъде запазено", + "Notifications": "Известия", + "Notify me 1 day before a task's due date": "Уведоми ме 1 ден преди срока на задача", + "Draft": "Чернова", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Дали часът е чернова, която вижда само учителят, провежда ли се или е отменен.", + "New release": "Нова версия", + "Roadmap chart. The same releases and epics are listed below.": "Диаграма на пътната карта. Същите версии и епици са изброени по-долу.", + "Nothing on the roadmap yet": "Все още няма нищо в пътната карта", + "Releases with a target date and epics with dated tasks appear here.": "Тук се показват версиите с целева дата и епиците със задачи с дати.", + "Releases": "Версии", + "No releases yet": "Все още няма версии", + "Target date: {date}": "Целева дата: {date}", + "No target date": "Няма целева дата", + "Edit {name}": "Редактиране на {name}", + "Mark {name} as released": "Отбелязване на {name} като издадена", + "Mark as released": "Отбелязване като издадена", + "Epics": "Епици", + "No epics yet. Open a task to make it an epic.": "Все още няма епици. Отворете задача, за да я направите епик.", + "Not scheduled yet": "Все още не е насрочено", + "Planned": "Планирана", + "Released": "Издадена", + "Edit release": "Редактиране на версията", + "Target date": "Целева дата", + "Could not save the release. Please try again.": "Версията не можа да бъде запазена. Опитайте отново.", + "Every task of this release is done or cancelled.": "Всяка задача от тази версия е изпълнена или отменена.", + "Not finished yet: {count}": "Все още незавършени: {count}", + "What happens to these tasks?": "Какво става с тези задачи?", + "Move to {name}": "Преместване в {name}", + "Remove the release": "Премахване на версията", + "Keep it on {name}": "Оставяне в {name}", + "Could not mark the release as released. Please try again.": "Версията не можа да бъде отбелязана като издадена. Опитайте отново.", + "Roadmap": "Пътна карта", + "Tasks or roadmap": "Задачи или пътна карта", + "Release": "Версия", + "Epic": "Епик", + "This task is an epic": "Тази задача е епик", + "A named, dated delivery of a project that its tasks are planned against.": "Именувана доставка на проект с дата, спрямо която се планират задачите му.", + "Name of the release": "Име на версията", + "The project this release belongs to": "Проектът, към който принадлежи тази версия", + "What this release delivers": "Какво доставя тази версия", + "When work on the release starts": "Кога започва работата по версията", + "The date the release is due": "Датата, към която версията трябва да е готова", + "Whether the release is planned, released or archived": "Дали версията е планирана, издадена или архивирана", + "Released on": "Издадена на", + "When the release was marked as released": "Кога версията е отбелязана като издадена", + "The release this task is planned for": "Версията, за която е планирана тази задача", + "Board view options": "Опции за изгледа на таблото", + "Colour cards": "Оцветяване на картите", + "No colour": "Без цвят", + "By label": "По етикет", + "Swimlanes": "Ленти", + "No swimlanes": "Без ленти", + "By assignee": "По отговорник", + "By epic": "По епик", + "No assignee": "Без отговорник", + "No epic": "Без епик", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Картите остават в реда на своя епик. Променете епика на страницата на задачата.", + "Hand over to": "Предаване на", + "Could not save your board view. It applies until you reload.": "Изгледът на таблото не беше запазен. Важи до презареждане.", + "Timetable wish": "Желание за разписание", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Желание, което генераторът взема предвид. Твърдо желание спазва винаги, гъвкаво, където може.", + "Whether the wish is about a teacher, a group, a room or one activity": "Дали желанието засяга учител, група, стая или една дейност", + "Teacher": "Учител", + "Group": "Група", + "Reference": "Препратка", + "The user, group, room or activity the wish is about": "Потребителят, групата, стаята или дейността, за които е желанието", + "What the wish asks for": "Какво иска желанието", + "Not on these periods": "Не в тези часове", + "Preferably not on these periods": "По-добре не в тези часове", + "At most a number of lessons a day": "Най-много определен брой часове на ден", + "No free periods between lessons": "Без прозорци между часовете", + "Always the same room": "Винаги една и съща стая", + "Periods": "Часове", + "The periods of the week the wish is about, such as wed-5": "Часовете от седмицата, за които е желанието, напр. wed-5", + "Limit": "Граница", + "The most lessons a day, for a wish of that kind": "Най-много часове на ден, за желание от този вид", + "Strength": "Сила", + "Whether the generator must keep the wish or should keep it": "Дали генераторът трябва или би трябвало да спази желанието", + "Hard": "Твърдо", + "Soft": "Гъвкаво", + "Weight": "Тежест", + "How much a soft wish counts, from 1 to 3": "Колко тежи гъвкаво желание, от 1 до 3", + "Why the wish exists": "Защо съществува желанието", + "Timetable scenario": "Сценарий за разписание", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Един седмичен модел, създаден от генератора или взет от текущото разписание. Пази входните си данни и колко добре спазва желанията.", + "The name timetablers know the scenario by": "Името, под което съставителите знаят сценария", + "Whether the generator made it or it came from the current timetable": "Дали го е създал генераторът, или идва от текущото разписание", + "Generated": "Генериран", + "From the current timetable": "От текущото разписание", + "Week of": "Седмица от", + "The Monday of the first week of the window": "Понеделникът на първата седмица от периода", + "Window start": "Начало на периода", + "The first day the week pattern applies to": "Първият ден, за който важи седмичният модел", + "Window end": "Край на периода", + "The last day the week pattern applies to": "Последният ден, за който важи седмичният модел", + "Waiting, generating, done, failed, or published as draft lessons": "Чака, генерира се, готов, неуспешен или публикуван като чернови часове", + "Waiting": "Чака", + "Generating": "Генерира се", + "Failed": "Неуспешен", + "Published": "Публикуван", + "Seed": "Начално число", + "The number the generator starts from, so a run can be repeated": "Числото, от което генераторът започва, за да може изпълнението да се повтори", + "Input": "Входни данни", + "The periods, rooms, lessons and wishes the scenario was made from": "Часовете, стаите, уроците и желанията, от които е създаден сценарият", + "Placements": "Разположения", + "Each lesson with the period and room it was given": "Всеки урок с часа и стаята, които е получил", + "Unplaced lessons": "Неразположени уроци", + "Lessons without a place, each with the hard wish that blocked it": "Уроци без място, всеки с твърдото желание, което го е спряло", + "Broken wishes": "Нарушени желания", + "The wishes this scenario breaks, with the lessons that break them": "Желанията, които този сценарий нарушава, с уроците, които ги нарушават", + "Measures": "Показатели", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Разположени уроци, нарушени желания, прозорци на учителите, часове на ден и използване на стаите", + "Reason": "Причина", + "Why the run failed": "Защо изпълнението е неуспешно", + "Published at": "Публикуван на", + "When the scenario was written out as draft lessons": "Кога сценарият е записан като чернови часове", + "Edit wish": "Редактиране на желание", + "New wish": "Ново желание", + "Hard: the generator always keeps it": "Задължително: генераторът винаги го спазва", + "Soft: the generator keeps it where it can": "Гъвкаво: генераторът го спазва, когато може", + "Weight (1 to 3)": "Тежест (от 1 до 3)", + "Most lessons a day": "Най-много часове на ден", + "Period": "Час", + "{day} period {number}": "{day} час {number}", + "Teacher (user name)": "Учител (потребителско име)", + "Activity (group:subject)": "Дейност (група:предмет)", + "Say who or what the wish is about.": "Посочете за кого или за какво е желанието.", + "Choose at least one period.": "Изберете поне един час.", + "The limit is a whole number of 1 or more.": "Лимитът е цяло число от 1 нагоре.", + "Timetable": "Разписание", + "Wishes": "Желания", + "Timetable wishes": "Желания за разписанието", + "Generator run": "Изпълнение на генератора", + "Generator progress": "Напредък на генератора", + "The run failed: {reason}": "Изпълнението е неуспешно: {reason}", + "{placed} of {lessons} lessons placed": "Поставени {placed} от {lessons} часа", + "Generate again": "Генериране отново", + "Generate": "Генериране", + "Every lesson has a place.": "Всеки час има място.", + "Lesson": "Час", + "No free period and room": "Няма свободен час и стая", + "Broken soft wishes": "Нарушени гъвкави желания", + "Every soft wish is kept.": "Всяко гъвкаво желание е спазено.", + "Wish": "Желание", + "Lessons": "Часове", + "Generating: {percent}% of the time budget used": "Генериране: използвани {percent}% от времето", + "Waiting to start": "Изчаква старт", + "Published as draft lessons": "Публикувано като чернови часове", + "Could not read the scenario.": "Сценарият не можа да бъде прочетен.", + "Could not start the run.": "Изпълнението не можа да започне.", + "Scenarios": "Сценарии", + "Timetable scenarios": "Сценарии за разписание", + "Scenario": "Сценарий", + "Take the current timetable": "Вземи текущото разписание", + "Could not take the current timetable.": "Текущото разписание не можа да бъде взето.", + "Broken hard wishes": "Нарушени задължителни желания", + "Not on a period of the week grid": "Не е в час от седмичната мрежа", + "Compare scenarios": "Сравняване на сценарии", + "Scenarios to compare": "Сценарии за сравнение", + "Choose two or three scenarios to compare them.": "Изберете два или три сценария, за да ги сравните.", + "Measure": "Показател", + "Best": "Най-добър", + "Lessons that differ": "Часове с разлика", + "No lesson differs.": "Няма час с разлика.", + "Not placed": "Не е поставен", + "{period} in {room}": "{period} в {room}", + "Lessons placed": "Поставени часове", + "Lessons without a place": "Часове без място", + "Clashes": "Конфликти", + "Hard wishes broken": "Нарушени задължителни желания", + "Soft wishes broken": "Нарушени гъвкави желания", + "Soft wishes broken, weighted": "Нарушени гъвкави желания, претеглени", + "Free periods between lessons, all teachers": "Свободни часове, всички учители", + "Most free periods of one teacher": "Най-много свободни часове на един учител", + "Most lessons of one group on a day": "Най-много часове на една група за ден", + "Room use": "Използване на стаите", + "Publish as draft lessons": "Публикувай като чернови на часове", + "Draft lessons written: {count}": "Записани чернови на часове: {count}", + "Could not publish the scenario.": "Сценарият не можа да бъде публикуван.", + "Rules": "Правила", + "Rules for {column}": "Правила за {column}", + "When a card enters this column": "Когато карта влезе в тази колона", + "Action": "Действие", + "Set the priority": "Задаване на приоритет", + "Assign to": "Възлагане на", + "Assign the person who moved the card": "Възлагане на човека, който премести картата", + "Remove the assignee": "Премахване на отговорника", + "Add a label": "Добавяне на етикет", + "No longer a project member": "Вече не е член на проекта", + "This label no longer exists": "Този етикет вече не съществува", + "Add rule": "Добавяне на правило", + "Remove rule": "Премахване на правило", + "No rules yet. Add one to change a card when it enters this column.": "Все още няма правила. Добавете едно, за да променяте карта, когато тя влезе в тази колона.", + "Could not save the rules. Please try again.": "Правилата не можаха да бъдат запазени. Опитайте отново.", + "1 rule runs when a card enters this column": "1 правило се изпълнява, когато карта влезе в тази колона", + "{count} rules run when a card enters this column": "{count} правила се изпълняват, когато карта влезе в тази колона", + "Rules applied: {changes}": "Приложени правила: {changes}", + "assigned to {name}": "възложена на {name}", + "assignee removed": "отговорникът е премахнат", + "priority {priority}": "приоритет {priority}", + "label {label}": "етикет {label}", + "What happens to a card when it enters this column, applied in list order.": "Какво става с карта, когато влезе в тази колона, по реда на списъка.", + "Value": "Стойност", + "What the rule does to the card.": "Какво прави правилото с картата.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Приоритетът, потребителският id или id на етикета, които действието използва; празно за действия без стойност.", + "is not": "не е", + "{dimension} is not": "{dimension} не е", + "Saved filters": "Запазени филтри", + "No saved filters yet": "Все още няма запазени филтри", + "Save filter": "Запазване на филтъра", + "Rename \"{name}\"": "Преименуване на „{name}“", + "Delete \"{name}\"": "Изтриване на „{name}“", + "Clear filters": "Изчистване на филтрите", + "Showing {shown} of {total} tasks": "Показани {shown} от {total} задачи", + "Me": "Аз", + "No date": "Без дата", + "Rename saved filter": "Преименуване на запазен филтър", + "Share with the project": "Споделяне с проекта", + "Give the filter a name": "Дайте име на филтъра", + "Could not save the filter. Please try again.": "Филтърът не можа да бъде запазен. Опитайте отново.", + "Some labels in \"{name}\" no longer exist and were left out.": "Някои етикети в „{name}“ вече не съществуват и бяха пропуснати.", + "Could not delete the filter. Please try again.": "Филтърът не можа да бъде изтрит. Опитайте отново.", + "Saved filter": "Запазен филтър", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Именуван филтър на таблото на един проект, видим само за човека, който го е запазил, освен ако е споделен с проекта.", + "The project whose board the filter applies to": "Проектът, за чието табло е филтърът", + "The name the filter is listed under": "Името, под което филтърът е в списъка", + "Saved by": "Запазен от", + "Nextcloud user id of the person who saved the filter": "Потребителски id в Nextcloud на човека, който е запазил филтъра", + "Shared with the project": "Споделен с проекта", + "Whether every project member sees and applies the filter": "Дали всеки член на проекта вижда и може да приложи филтъра", + "Criteria": "Критерии", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Филтърът: отговорник, етикет, приоритет и срок, всеки с е или не е и стойностите си", + "Cross-project view": "Междупроектен изглед", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Запазен избор от проекти, чиито задачи се показват заедно в колони по статус, споделен с посочените хора.", + "Shared with": "Споделено с", + "The name the view is listed under": "Името, под което е посочен изгледът", + "Nextcloud user id of the person who saved the view": "Nextcloud потребителски id на човека, който е запазил изгледа", + "Nextcloud user ids of the people the view is shared with": "Nextcloud потребителски id на хората, с които е споделен изгледът", + "The projects whose tasks the view shows, at most twenty": "Проектите, чиито задачи показва изгледът, най-много двадесет", + "1 project in this view is hidden from you.": "1 проект в този изглед е скрит от вас.", + "{count} projects in this view are hidden from you.": "Проекти в този изглед, скрити от вас: {count}.", + "{project} has no column for {status}.": "Проектът {project} няма колона за статус {status}.", + "This view does not exist or is not shared with you.": "Този изглед не съществува или не е споделен с вас.", + "\"{task}\" moved to {status}.": "\"{task}\" е преместена в {status}.", + "Project: {title}": "Проект: {title}", + "Cross-project views": "Междупроектни изгледи", + "New view": "Нов изглед", + "Edit view": "Редактиране на изгледа", + "Delete view": "Изтриване на изгледа", + "Give the view a name": "Дайте име на изгледа", + "Pick at least one project": "Изберете поне един проект", + "A view shows at most {max} projects": "Изгледът показва най-много {max} проекта", + "Could not save the view. Please try again.": "Изгледът не можа да бъде запазен. Опитайте отново.", + "Could not delete the view. Please try again.": "Изгледът не можа да бъде изтрит. Опитайте отново.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Да се изтрие ли „{title}“? Проектите и задачите им остават непроменени.", + "People see the tasks of the projects they are in, never more.": "Всеки вижда само задачите на проектите, в които участва.", + "No views yet. A view shows the tasks of several of your projects together.": "Все още няма изгледи. Изгледът показва заедно задачите на няколко ваши проекта.", + "Projects in view: {count}": "Проекти в изгледа: {count}", + "Notify me when a task is assigned to me": "Уведомявай ме, когато ми бъде възложена задача", + "Also send these to me by email": "Изпращай ми ги и по имейл", + "Add an email address in your Nextcloud personal settings to get mail.": "Добавете имейл адрес в личните си настройки на Nextcloud, за да получавате имейли.", + "Code link": "Връзка към код", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, клон, заявка за сливане или проблем в платформа за код, който се отнася до задача.", + "The task the link belongs to": "Задачата, към която принадлежи връзката", + "The project of the task": "Проектът на задачата", + "Task key": "Ключ на задачата", + "The task key the forge text named, such as VC-12": "Ключът на задачата, посочен в текста на платформата, напр. VC-12", + "What the link points at": "Към какво сочи връзката", + "Link": "Връзка", + "The address of the item in the forge": "Адресът на елемента в платформата за код", + "The commit message, branch name or merge request title": "Съобщението на commit-а, името на клона или заглавието на заявката за сливане", + "Repository": "Хранилище", + "The repository, such as acme/portal": "Хранилището, напр. acme/portal", + "Forge id": "Id в платформата", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Собственият id на елемента в платформата за код, напр. github:acme/portal#42 или hash на commit", + "State": "Състояние", + "The state of a merge request or issue": "Състоянието на заявка за сливане или проблем", + "Who made the commit or opened the merge request": "Кой е направил commit-а или е отворил заявката за сливане", + "When the commit was made or the merge request last changed": "Кога е направен commit-ът или последно се е променила заявката за сливане", + "Added by": "Добавено от", + "Whether a person added the link or the integration wrote it": "Дали връзката е добавена от човек, или е записана от интеграцията", + "Nextcloud user UIDs of project members": "Nextcloud потребителски ID на членовете на проекта", + "Add link": "Добави връзка", + "Added by hand": "Добавено ръчно", + "Branch": "Клон", + "Code": "Код", + "Commit": "Commit", + "From the integration": "От интеграцията", + "Link to a commit, branch or merge request": "Връзка към commit, клон или заявка за сливане", + "Merge request": "Заявка за сливане", + "Merged": "Слята", + "No code linked yet. Name {key} in a commit message or paste a link.": "Все още няма свързан код. Посочете {key} в съобщение на commit или поставете връзка.", + "No code linked yet. Paste a link to a commit or merge request.": "Все още няма свързан код. Поставете връзка към commit или заявка за сливане.", + "Paste a web address that starts with https://.": "Поставете уеб адрес, който започва с https://.", + "Remove link {title}": "Премахни връзката {title}", + "The link could not be added.": "Връзката не можа да бъде добавена.", + "The link could not be removed.": "Връзката не можа да бъде премахната.", + "This link is already on the task.": "Тази връзка вече е към задачата.", + "Code forges": "Платформи за код", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Свържете commit-и и pull request-и от GitHub със задачи. Integriq получава събитията; planninq никога не извиква GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Изтеглете конфигурацията и я импортирайте в Integriq. След това въведете тайна в правилото \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "В GitHub добавете към хранилището webhook с този адрес и същата тайна. Изберете тип съдържание application/json и събитията push и pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Посочете ключа на задачата, напр. VC-12, в съобщение на commit, име на клон или заглавие на pull request. Връзката тогава се появява при тази задача.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq членовете на проекта пак могат да поставят връзка на страницата на задачата.", + "Download the Integriq configuration": "Изтегляне на конфигурацията за Integriq", + "Calendar": "Календар", + "Previous": "Предишен", + "Calendar view": "Изглед на календара", + "Starts:": "Започва:", + "No tasks with a date in this month.": "Няма задачи с дата този месец.", + "Week of {start} to {end}": "Седмица от {start} до {end}", + "My calendar": "Моят календар", + "Show as list": "Покажи като списък", + "Show as calendar": "Покажи като календар", + "Open my calendar": "Отвори моя календар", + "Nextcloud Tasks": "Задачи в Nextcloud", + "Show my tasks in Nextcloud Tasks": "Показвай задачите ми в Задачи в Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Задачите, възложени на вас или споделени с вас, се показват в списък \"Planninq\" в Задачи и Календар на Nextcloud. Промените, направени там, се заменят при следващата промяна в Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Този сървър не може да записва в Задачи в Nextcloud, затова експортът не е наличен.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Управлява се от Planninq. Промените, направени тук, се заменят при следващата промяна в Planninq.", + "Working days and holidays": "Работни дни и празници", + "Dates set on the timeline skip the days that are not working days.": "Датите, зададени на времевата линия, прескачат дните, които не са работни.", + "Working weekdays": "Работни дни от седмицата", + "Non-working days": "Неработни дни", + "No non-working days yet.": "Все още няма неработни дни.", + "Add day": "Добави ден", + "Year": "Година", + "Add Dutch national holidays": "Добави нидерландските национални празници", + "Save working days": "Запази работните дни", + "Choose at least one working weekday.": "Изберете поне един работен ден.", + "Working days saved.": "Работните дни са запазени.", + "Could not save the working days.": "Работните дни не можаха да бъдат запазени.", + "New Year's Day": "Нова година", + "Easter Sunday": "Великден", + "Easter Monday": "Велики понеделник", + "King's Day": "Ден на краля", + "Liberation Day": "Ден на освобождението", + "Ascension Day": "Възнесение Господне", + "Whit Sunday": "Петдесетница", + "Whit Monday": "Духов понеделник", + "Christmas Day": "Коледа", + "Boxing Day": "Втори ден на Коледа", + "Dates of {title}": "Дати на {title}", + "The due date cannot be before the start date.": "Крайният срок не може да е преди началната дата.", + "{title}, from {start} to {end}": "{title}, от {start} до {end}", + "The dates could not be saved.": "Датите не можаха да бъдат запазени.", + "{title} now runs from {start} to {end}": "{title} вече продължава от {start} до {end}", + "Auto-scheduling": "Автоматично планиране", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Когато е включено, по-късен краен срок на времевата линия предлага да премести и задачите, които блокира.", + "Move blocked tasks along when a task slips": "Премествай блокираните задачи, когато задача закъснее", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На времевата линия по-късен срок предлага да премести блокираните задачи. Броят се само връзките \"блокира\", а задачите се местят само напред.", + "Move the tasks that wait for {title}?": "Да се преместят ли задачите, които чакат {title}?", + "These tasks wait for it and would start after its new due date:": "Тези задачи я чакат и биха започнали след новия ѝ срок:", + "{count} tasks would move; the first {limit} are listed.": "Биха се преместили {count} задачи; показани са първите {limit}.", + "Now": "Сега", + "After the move": "След преместването", + "Only this task": "Само тази задача", + "Move all": "Премести всички", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Спряно при {title}: датите не можаха да бъдат запазени. Задачите преди нея бяха преместени.", + "Cumulative flow": "Кумулативен поток", + "Show as chart": "Покажи като диаграма", + "Show as table": "Покажи като таблица", + "Tasks per column per day": "Задачи по колона на ден", + "Tasks without recorded history in this period: {count}": "Задачи без записана история в този период: {count}", + "Lead and cycle time": "Време за изпълнение и време на цикъла", + "No tasks were finished in this period.": "В този период не е завършена нито една задача.", + "Finished tasks": "Завършени задачи", + "Cycle time, average": "Време на цикъла, средно", + "Cycle time, 85th percentile": "Време на цикъла, 85-и перцентил", + "Lead time, average": "Време за изпълнение, средно", + "Tasks whose finish time was estimated from their history: {count}": "Задачи, чието време на завършване е изчислено от историята: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Време на цикъла на всяка завършена задача, със средното и 85-ия перцентил", + "Slowest tasks": "Най-бавни задачи", + "cycle {cycle}, lead {lead}": "цикъл {cycle}, изпълнение {lead}", + "{days} days": "{days} дни", + "Could not load the flow of this project.": "Потокът на този проект не можа да се зареди.", + "Last {days} days": "Последните {days} дни", + "Portfolio flow": "Поток на портфолиото", + "An admin adds portfolios under Projects, Portfolios.": "Администратор добавя портфолиа в Проекти, Портфолиа.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Непоказани проекти, защото наведнъж се показват най-много 50: {count}", + "Could not load the flow of this portfolio.": "Потокът на това портфолио не можа да се зареди.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Кумулативен поток и време на цикъла в проектите на портфолио.", + "Edit report": "Редактиране на отчета", + "Only tasks where": "Само задачи, при които", + "Group by": "Групиране по", + "Display": "Изглед", + "Share with everyone who can read its projects": "Споделяне с всички, които могат да четат проектите му", + "The report could not be saved.": "Отчетът не можа да се запази.", + "Number of tasks": "Брой задачи", + "Bar": "Стълбове", + "Donut": "Пръстен", + "Table": "Таблица", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} от {total} проекта в този отчет не са видими за вас", + "No tasks match this report.": "Нито една задача не отговаря на този отчет.", + "None": "Няма", + "Could not load this report.": "Този отчет не можа да се зареди.", + "Report": "Отчет", + "Your reports": "Вашите отчети", + "My reports": "Моите отчети", + "Shared reports": "Споделени отчети", + "You have not built a report yet.": "Още не сте създали отчет.", + "Nobody has shared a report with you yet.": "Още никой не е споделил отчет с вас.", + "Reports you built over tasks, and the ones shared with you.": "Отчети, които сте създали върху задачи, и споделените с вас.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Запазена заявка върху задачи: кои проекти, кои филтри, групирани по какво, преброени или сумирани, и показани като таблица или диаграма.", + "The name the report is listed under": "Името, под което отчетът е в списъка", + "What the report shows and who it is for": "Какво показва отчетът и за кого е", + "Nextcloud user id of the person who saved the report": "Nextcloud ID на потребителя, който е запазил отчета", + "Who can open the report": "Кой може да отвори отчета", + "Only me": "Само аз", + "Everyone who can read its projects": "Всички, които могат да четат проектите му", + "The projects the report covers, at most fifty": "Проектите, които отчетът обхваща, най-много петдесет", + "Filters": "Филтри", + "Task fields and the value each must equal": "Полета на задачата и стойността, на която всяко трябва да е равно", + "The task field the report groups on": "Полето на задачата, по което отчетът групира", + "Count the tasks, or add up a number on them": "Преброяване на задачите или сумиране на число от тях", + "Sum": "Сума", + "Sum of": "Сума на", + "The number added up when the measure is a sum": "Числото, което се сумира, когато мярката е сума", + "Story points": "Точки за история", + "Estimated duration": "Очаквана продължителност", + "How the report is shown": "Как се показва отчетът", + "Issue type": "Вид заявка", + "Task fields and the value each must equal; empty when the report covers every task": "Полета на задачата и стойността, която всяко трябва да има; празно, когато отчетът обхваща всички задачи", + "The status a task must have": "Статусът, който задачата трябва да има", + "The priority a task must have": "Приоритетът, който задачата трябва да има", + "The user a task must be assigned to": "Потребителят, на когото задачата трябва да е възложена", + "A label a task must carry": "Етикет, който задачата трябва да носи", + "The board column a task must be in": "Колоната на таблото, в която задачата трябва да е", + "The issue type a task must have": "Видът заявка, който задачата трябва да има", + "Manager groups": "Групи ръководители", + "Member groups": "Групи членове", + "Viewer groups": "Групи читатели", + "Viewers": "Читатели", + "Owning group": "Притежаваща група", + "Nextcloud groups whose members manage the project": "Групи в Nextcloud, чиито членове управляват проекта", + "Nextcloud groups whose members work on the project": "Групи в Nextcloud, чиито членове работят по проекта", + "Nextcloud groups whose members may read the project": "Групи в Nextcloud, чиито членове могат да четат проекта", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Потребители в Nextcloud, които управляват проекта: настройки, членове и работа", + "Nextcloud user ids who may read the project and its work but not change it": "Потребители в Nextcloud, които могат да четат проекта и работата му, но не и да ги променят", + "The Nextcloud group that owns the project with its creator, at most one": "Групата в Nextcloud, която притежава проекта заедно със създателя му, най-много една", + "Nextcloud user ids who may read this through the project": "Потребители в Nextcloud, които могат да четат това чрез проекта", + "Nextcloud groups whose members may change this through the project": "Групи в Nextcloud, чиито членове могат да променят това чрез проекта", + "Nextcloud groups whose members may read this through the project": "Групи в Nextcloud, чиито членове могат да четат това чрез проекта", + "Search for a person or a group…": "Търсене на човек или група…", + "No one found. Your admin's sharing settings decide who you can find.": "Никой не е намерен. Настройките за споделяне на администратора определят кого можете да намерите.", + "Type at least two characters": "Въведете поне два знака", + "Everyone in this group": "Всички в тази група", + "Could not search for people. Please try again.": "Търсенето на хора не бе успешно. Опитайте отново.", + "Could not remove the group": "Групата не можа да бъде премахната", + "Only the owner and managers change who is on this project.": "Само собственикът и управителите променят кой е в този проект.", + "Role of {name}": "Роля: {name}", + "Manager": "Управител", + "Member": "Член", + "Viewer": "Читател", + "Could not change the role": "Ролята не можа да бъде променена", + "Owned by group: {name}": "Собственост на групата: {name}", + "No group owns this project.": "Никоя група не притежава този проект.", + "Owned by group": "Собственост на група", + "Search for a group…": "Търсене на група…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Не е намерена група. Настройките за споделяне на администратора определят кои групи можете да намерите.", + "No owning group": "Без група собственик", + "Could not search for groups. Please try again.": "Търсенето на групи не бе успешно. Опитайте отново.", + "Could not change the owning group": "Групата собственик не можа да бъде променена", + "You can read this project. Only its members change it.": "Можете да четете този проект. Само членовете му го променят.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курсът, който се преподава в този час, например избираем предмет, когато училищното приложение за обучение го познава.", + "Online meeting link": "Връзка към онлайн часа", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Къде учениците се присъединяват към този час онлайн. Бутонът Присъедини се се показва само за https връзка." }, "plurals": null } diff --git a/l10n/bs.js b/l10n/bs.js index 62f3c980..eebfa94d 100644 --- a/l10n/bs.js +++ b/l10n/bs.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktivni projekti", + "Archived projects": "Arhivirani projekti", + "Boards": "Table", + "My projects": "Moji projekti", + "Portfolio": "Portfolio", + "Project board": "Tabla projekta", + "Projects I am in": "Projekti u kojima učestvujem", + "Timeline": "Vremenska linija", + "Timesheet": "Evidencija vremena", + "Features & roadmap": "Funkcije i plan razvoja", + "Flow": "Tok", + "Flows": "Tokovi", + "Reports": "Izvještaji", + "Pick a report to open it.": "Odaberite izvještaj da biste ga otvorili.", + "In progress": "U toku", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodijeljeno", + "Who": "Ko", + "What": "Šta", + "Minutes": "Minute", + "Entries": "Unosi", + "Most recent": "Najnovije", + "Per person": "Po osobi", + "By status": "Po statusu", + "By priority": "Po prioritetu", + "Task status": "Status zadataka", + "Time spent": "Utrošeno vrijeme", + "Capacity": "Kapacitet", + "Due soonest": "Najskoriji rok", + "Minutes logged": "Zabilježene minute", + "Nothing is due": "Ništa ne dospijeva", + "Nothing logged yet": "Još ništa nije zabilježeno", + "What is open, what is blocked, and what is overdue.": "Šta je otvoreno, šta blokirano i šta kasni.", + "How allocation is spread across the people working on projects.": "Kako je opterećenje raspoređeno među ljudima na projektima.", + "Hours logged, and the projects they went to.": "Zabilježeni sati i projekti na koje su otišli.", + "Billable": "Naplativo", + "Budget: {amount}": "Budžet: {amount}", + "Loading projects": "Učitavanje projekata", + "No projects for this client yet": "Još nema projekata za ovog klijenta", + "Open in Planninq": "Otvori u Planninq", + "This project could not be found": "Ovaj projekat nije pronađen", + "Untitled project": "Projekat bez naziva", + "and {count} more": "i još {count}", + "Store": "Trgovina", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instalirajte registre, šeme i tokove koje su objavile druge organizacije.", + "Work Date": "Datum rada", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Radnje kolone", + "Columns": "Kolone", + "Could not remove the column. Please try again.": "Kolonu nije moguće ukloniti. Pokušajte ponovo.", + "Could not save the column. Please try again.": "Kolonu nije moguće sačuvati. Pokušajte ponovo.", + "Done column": "Kolona završenih", + "Edit column": "Uredi kolonu", + "Keep the card's status": "Zadrži status kartice", + "Move its cards to": "Premjesti njene kartice u", + "Move left": "Pomjeri lijevo", + "Move right": "Pomjeri desno", + "Status of cards moved here": "Status kartica premještenih ovdje", + "The last done column cannot be removed.": "Posljednja kolona završenih ne može se ukloniti.", + "WIP limit": "WIP ograničenje", + "over limit": "iznad ograničenja", + "The status a card gets when it is moved into this column.": "Status koji kartica dobija kada se premjesti u ovu kolonu.", + "All priorities": "Svi prioriteti", + "Could not create the task. Please try again.": "Zadatak nije moguće kreirati. Pokušajte ponovo.", + "Created": "Kreirano", + "Move to backlog": "U zaostatak", + "Move to board": "Na tablu", + "New task": "Novi zadatak", + "Nothing in the backlog": "Ništa u zaostatku", + "Rank": "Rang", + "Sort by": "Poredaj po", + "Sort by rank to reorder": "Poredajte po rangu da biste promijenili redoslijed", + "Task actions": "Radnje zadatka", + "All labels": "Sve oznake", + "Filter tasks by label": "Filtriraj zadatke po oznaci", + "View timeline": "Prikaži vremensku liniju", + "Board": "Tabla", + "List": "Lista", + "Column": "Kolona", + "Board or list": "Tabla ili lista", + "Log": "Dnevnik", + "Add entry": "Dodaj unos", + "Show": "Prikaži", + "No actions yet": "Još nema radnji", + "Closed": "Zatvoreno", + "Entry actions": "Radnje unosa", + "Add action": "Dodaj radnju", + "by {author}": "autor {author}", + "saved {time}": "sačuvano {time}", + "Attendees: {names}": "Prisutni: {names}", + "Add the first entry": "Dodaj prvi unos", + "Issues": "Problemi", + "Lessons learned": "Naučene lekcije", + "Meetings": "Sastanci", + "Decisions": "Odluke", + "Actions": "Radnje", + "Issue": "Problem", + "Lesson learned": "Naučena lekcija", + "Meeting": "Sastanak", + "Decision": "Odluka", + "About this project": "O ovom projektu", + "No description yet": "Još nema opisa", + "Start date": "Datum početka", + "Not set": "Nije postavljeno", + "End date": "Datum završetka", + "Progress": "Napredak", + "No tasks yet": "Još nema zadataka", + "Open the board": "Otvori tablu", + "People": "Osobe", + "Owner": "Vlasnik", + "Latest log entries": "Najnoviji unosi", + "Open the log": "Otvori dnevnik", + "{done} of {total} tasks done": "Gotovo {done} od {total} zadataka", + "Edit entry": "Uredi unos", + "Type": "Vrsta", + "Attendees": "Prisutni", + "Issue is closed": "Problem je zatvoren", + "Could not save the entry. Please try again.": "Unos nije moguće sačuvati. Pokušajte ponovo.", + "From: {title}": "Iz: {title}", + "What needs to happen": "Šta treba uraditi", + "Could not create the action. Please try again.": "Radnju nije moguće kreirati. Pokušajte ponovo.", + "The action was created but could not be linked to the entry.": "Radnja je kreirana, ali je nije moguće povezati s unosom.", + "Project pages": "Stranice projekta", + "Overview": "Pregled", + "Risks": "Rizici", + "Log entry": "Unos u dnevnik", + "A short name for the entry": "Kratak naziv unosa", + "Project": "Projekat", + "The project this entry belongs to": "Projekat kojem ovaj unos pripada", + "What kind of entry this is": "Koja je ovo vrsta unosa", + "When it happened": "Kada se desilo", + "What happened, in Markdown": "Šta se desilo, u Markdownu", + "Whether an issue is still open": "Da li je problem još otvoren", + "The people at a meeting": "Osobe na sastanku", + "Tasks that came out of this entry": "Zadaci proizašli iz ovog unosa", + "Add risk": "Dodaj rizik", + "Risk": "Rizik", + "Score": "Ocjena", + "Response": "Odgovor", + "Review date": "Datum pregleda", + "no longer on the project": "više nije na projektu", + "Edit {title}": "Uredi {title}", + "No risks recorded yet": "Još nema zabilježenih rizika", + "Add the first risk": "Dodaj prvi rizik", + "Medium": "Srednje", + "Mitigating": "Ublažava se", + "Occurred": "Nastupio", + "Avoid": "Izbjeći", + "Reduce": "Smanjiti", + "Transfer": "Prenijeti", + "Accept": "Prihvatiti", + "Highest open risks": "Najviši otvoreni rizici", + "No open risks": "Nema otvorenih rizika", + "Open the risk register": "Otvori registar rizika", + "Edit risk": "Uredi rizik", + "What could go wrong": "Šta može poći po zlu", + "Likelihood": "Vjerovatnoća", + "Impact": "Utjecaj", + "Score {score}": "Ocjena {score}", + "Countermeasures": "Protumjere", + "Could not save the risk. Please try again.": "Rizik nije moguće sačuvati. Pokušajte ponovo.", + "Risks by likelihood and impact": "Rizici po vjerovatnoći i utjecaju", + "Risk scale": "Skala rizika", + "The levels every project scores its risks on, and where low turns into medium and high": "Nivoi na kojima svaki projekat ocjenjuje svoje rizike, i gdje nisko prelazi u srednje i visoko", + "Number of levels": "Broj nivoa", + "Likelihood labels": "Oznake vjerovatnoće", + "Impact labels": "Oznake utjecaja", + "Level {level}": "Nivo {level}", + "Medium from score": "Srednje od ocjene", + "High from score": "Visoko od ocjene", + "Risk scale saved": "Skala rizika sačuvana", + "1 risk uses level {level}. Change it first.": "1 rizik koristi nivo {level}. Prvo ga promijenite.", + "{count} risks use level {level}. Change them first.": "Rizika koji koriste nivo {level}: {count}. Prvo ih promijenite.", + "Every level needs a label, and high must start above medium.": "Svaki nivo treba oznaku, a visoko mora početi iznad srednjeg.", + "The project this risk belongs to": "Projekat kojem ovaj rizik pripada", + "The cause and the effect, in Markdown": "Uzrok i posljedica, u Markdownu", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Slobodno grupisanje, npr. planiranje, budžet ili dobavljač", + "How likely it is, on the admin's risk scale": "Koliko je vjerovatno, na skali rizika administratora", + "How hard it would hit, on the admin's risk scale": "Koliko bi snažno pogodilo, na skali rizika administratora", + "Likelihood times impact, calculated by the server": "Vjerovatnoća puta utjecaj, izračunava server", + "Where the risk stands": "Gdje je rizik", + "The person who watches this risk": "Osoba koja prati ovaj rizik", + "How the project answers the risk": "Kako projekat odgovara na rizik", + "What is done to prevent it or soften it, in Markdown": "Šta se radi da se spriječi ili ublaži, u Markdownu", + "When to look at this risk again": "Kada ponovo pregledati ovaj rizik", + "Very low": "Vrlo nisko", + "Very high": "Vrlo visoko", + "All projects": "Svi projekti", + "Project status report": "Izvještaj o stanju projekta", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datirani izvještaj o tome kako projekt stoji s novcem, organizacijom, vremenom, informacijama, kvalitetom i rizikom (GROTIK aspekti), svaki s bilješkom.", + "The project this report is about": "Projekt na koji se izvještaj odnosi", + "Report date": "Datum izvještaja", + "The day the report describes": "Dan koji izvještaj opisuje", + "Money": "Novac", + "How the project stands on this aspect": "Kako projekt stoji u ovom aspektu", + "On track": "Prema planu", + "At risk": "Ugroženo", + "Off track": "Izvan plana", + "Money note": "Bilješka o novcu", + "A short explanation of this status": "Kratko objašnjenje ovog stanja", + "Organisation": "Organizacija", + "Organisation note": "Bilješka o organizaciji", + "Time": "Vrijeme", + "Time note": "Bilješka o vremenu", + "Information": "Informacije", + "Information note": "Bilješka o informacijama", + "Quality": "Kvalitet", + "Quality note": "Bilješka o kvalitetu", + "Risk note": "Bilješka o riziku", + "Overall": "Ukupno", + "The worst of the six statuses, calculated by the server": "Najlošije od šest stanja, izračunava ga server", + "Health: money": "Stanje: novac", + "Copied from the newest status report": "Preuzeto iz najnovijeg izvještaja o stanju", + "Health: organisation": "Stanje: organizacija", + "Health: time": "Stanje: vrijeme", + "Health: information": "Stanje: informacije", + "Health: quality": "Stanje: kvalitet", + "Health: risk": "Stanje: rizik", + "Health: overall": "Stanje: ukupno", + "Health: report date": "Stanje: datum izvještaja", + "The date of the newest status report": "Datum najnovijeg izvještaja o stanju", + "New report": "Novi izvještaj", + "Only the project owner writes status reports.": "Izvještaje o stanju piše samo vlasnik projekta.", + "Latest report, {date}": "Posljednji izvještaj, {date}", + "Aspect": "Aspekt", + "Note": "Bilješka", + "Report history": "Historija izvještaja", + "Author": "Autor", + "No status reports yet": "Još nema izvještaja o stanju", + "Write the first report": "Napiši prvi izvještaj", + "Choose a status for every aspect to save the report.": "Za spremanje izvještaja odaberite stanje za svaki aspekt.", + "Suggested: on track.": "Prijedlog: prema planu.", + "Suggested: at risk.": "Prijedlog: ugroženo.", + "Suggested: off track.": "Prijedlog: izvan plana.", + "1 task is past its due date.": "1 zadatak je prekoračio rok.", + "{count} tasks are past their due date.": "Zadaci koji su prekoračili rok: {count}.", + "The end date has passed with 1 open task.": "Datum završetka je prošao s 1 otvorenim zadatkom.", + "The end date has passed with {count} open tasks.": "Datum završetka je prošao, otvoreni zadaci: {count}.", + "No open task is past its due date.": "Nijedan otvoreni zadatak nije prekoračio rok.", + "The highest open risk, \"{title}\", scores {score}.": "Najveći otvoreni rizik, \"{title}\", ima ocjenu {score}.", + "There are no open risks.": "Nema otvorenih rizika.", + "Costs are at {percent}% of the budget.": "Troškovi su na {percent}% budžeta.", + "No suggestion: the project has no budget.": "Nema prijedloga: projekt nema budžet.", + "No suggestion: no costs are recorded for this project yet.": "Nema prijedloga: za ovaj projekt još nisu zabilježeni troškovi.", + "The report was not saved. Only the project owner can write status reports.": "Izvještaj nije spremljen. Izvještaje o stanju može pisati samo vlasnik projekta.", + "No report": "Nema izvještaja", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Grupa projekata koje vode isti ljudi, na primjer odjel ili program. Njeni voditelji čitaju svaki projekt u njoj.", + "The name of the portfolio": "Naziv portfolija", + "What the portfolio holds and who runs it": "Šta portfolio sadrži i ko ga vodi", + "A colour for the portfolio's section in project lists": "Boja odjeljka portfolija u listama projekata", + "Managers": "Voditelji", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud korisnički ID-ovi ljudi koji vode portfolio", + "Order": "Redoslijed", + "Where the portfolio comes in project lists, lowest first": "Gdje je portfolio u listama projekata, najniži prvi", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Vlastita skala rizika ovog portfolija kao JSON, u istom obliku kao skala cijele aplikacije. Prazno znači skalu aplikacije.", + "Portfolio readers": "Čitaoci portfolija", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud korisnički ID-ovi voditelja portfolija projekta", + "The portfolio this project belongs to": "Portfolio kojem ovaj projekt pripada", + "No portfolio": "Bez portfolija", + "All portfolios": "Svi portfoliji", + "You read this project as a manager of its portfolio. Only its members change it.": "Ovaj projekt čitate kao voditelj njegovog portfolija. Mijenjaju ga samo njegovi članovi.", + "Portfolios": "Portfoliji", + "Portfolio status": "Stanje portfelja", + "No portfolios yet": "Još nema portfelja", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administrator dodaje portfelje u Projekti, Portfelji. Projekti u portfelju ovdje su navedeni sa svojim stanjem.", + "Roll-up": "Sažetak", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} prema planu, {atRisk} ugroženo, {offTrack} izvan plana, {noReport} bez izvještaja", + "No project in this portfolio that you can read.": "U ovom portfelju nema projekta koji možete čitati.", + "Start": "Početak", + "End": "Kraj", + "Budget": "Budžet", + "Last report": "Zadnji izvještaj", + "Out of date": "Zastarjelo", + "Portfolio timeline": "Vremenska linija portfelja", + "Zoom": "Zumiranje", + "Could not load the timeline": "Vremensku liniju nije moguće učitati", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administrator dodaje portfelje u Projekti, Portfelji. Projekti u portfelju ovdje su na jednoj vremenskoj liniji.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Otvorite projekat da vidite njegove faze i zadatke. Vremenska linija je samo za čitanje.", + "Phase: {title}": "Faza: {title}", + "Left out because you cannot read them: {count} projects": "Izostavljeno jer ih ne možete čitati: {count} projekata", + "Week": "Sedmica", + "Day": "Dan", + "Month": "Mjesec", + "Please try again later.": "Pokušajte ponovo kasnije.", + "Status reports": "Izvještaji o stanju", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Nakon koliko dana se zadnji izvještaj o stanju projekta u pregledu portfelja označava kao zastario", + "Reporting period (days)": "Period izvještavanja (dani)", + "The reporting period is a whole number of days from 1 to 365.": "Period izvještavanja je cijeli broj dana od 1 do 365.", + "Reporting period saved": "Period izvještavanja sačuvan", + "The reporting period was not saved. Please try again.": "Period izvještavanja nije sačuvan. Pokušajte ponovo.", + "Every project of a portfolio with its status per aspect, rolled up.": "Svaki projekat portfelja sa stanjem po aspektima, sažeto.", + "The projects of a portfolio on one timeline.": "Projekti portfelja na jednoj vremenskoj liniji.", + "Phases": "Faze", + "Add phase": "Dodaj fazu", + "No phases yet": "Još nema faza", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Podijelite projekat u faze, npr. pokretanje, definiciju i realizaciju. Faza se zatvara kad se učita njen završni dokument.", + "{hours} hours": "{hours} sati", + "Concluding document: {title}": "Završni dokument: {title}", + "Concluding document missing": "Nedostaje završni dokument", + "Move {title} up": "Pomjeri {title} gore", + "Move {title} down": "Pomjeri {title} dolje", + "Close phase": "Zatvori fazu", + "Phase": "Faza", + "Files": "Datoteke", + "Notes": "Bilješke", + "Audit trail": "Revizijski trag", + "Edit phase": "Uredi fazu", + "Name": "Naziv", + "Budget hours": "Planirani sati", + "Could not save the phase. Please try again.": "Fazu nije moguće sačuvati. Pokušajte ponovo.", + "Close phase {title}": "Zatvori fazu {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Faza se zatvara završnim dokumentom: učitajte ga ovdje ili odaberite jednu od datoteka faze.", + "Concluding document": "Završni dokument", + "This phase has no files yet.": "Ova faza još nema datoteka.", + "Upload a document": "Učitaj dokument", + "The document was not uploaded. Please try again.": "Dokument nije učitan. Pokušajte ponovo.", + "Upload the concluding document before you close this phase.": "Učitajte završni dokument prije zatvaranja ove faze.", + "This phase cannot be closed from its current status.": "Ova faza se ne može zatvoriti iz trenutnog stanja.", + "The phase was not closed. Please try again.": "Faza nije zatvorena. Pokušajte ponovo.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID datoteke ove faze koja je zatvara. Faza se može završiti tek kad je postavljen i datoteka je priložena.", + "Import from Microsoft Project": "Uvezi iz Microsoft Projecta", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Odaberite plan sačuvan iz Microsoft Projecta u XML formatu. Ništa se ne uvozi dok ne potvrdite.", + "Plan file": "Datoteka plana", + "What the import creates": "Šta uvoz kreira", + "Tasks": "Zadaci", + "Sub-tasks": "Podzadaci", + "Milestones": "Prekretnice", + "Links": "Veze", + "Already imported, updated in place: {count}": "Već uvezeno, ažurirano na mjestu: {count}", + "What does not carry over": "Šta se ne prenosi", + "Tasks with resources, which are not imported: {count}": "Zadaci s resursima, koji se ne uvoze: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Zadaci dublje od nivoa 3, smješteni pod svoj zadatak nivoa 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Veze osim kraj-početak, uvezene kao povezane veze: {count}", + "Link lags, which are dropped: {count}": "Kašnjenja veza, koja se odbacuju: {count}", + "Links to a summary task, which are not imported: {count}": "Veze prema zbirnom zadatku, koje se ne uvoze: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Veze prema zadacima izvan ovog plana, koje se ne uvoze: {count}", + "No longer in the plan": "Više nije u planu", + "These stay in the project; remove them yourself if they are no longer needed.": "Ostaju u projektu; uklonite ih sami ako više nisu potrebni.", + "Import": "Uvezi", + "Close": "Zatvori", + "The plan is imported: {created} created, {updated} updated.": "Plan je uvezen: kreirano {created}, ažurirano {updated}.", + "Links that would close a loop were left out: {count}": "Veze koje bi zatvorile petlju izostavljene su: {count}", + "The import stopped part-way. Run it again to finish it.": "Uvoz je stao na pola puta. Pokrenite ga ponovo da ga završite.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Sačuvajte plan u Microsoft Projectu putem Datoteka, Sačuvaj kao, XML format, i uvezite tu datoteku.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ova datoteka deklariše DOCTYPE ili entitete, koji se ne prihvataju.", + "The file is larger than 10 MB.": "Datoteka je veća od 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plan ima više od 2.000 zadataka, više nego što jedan uvoz prima.", + "This file is not a Microsoft Project plan in XML format.": "Ova datoteka nije plan Microsoft Projecta u XML formatu.", + "Choose a file to import.": "Odaberite datoteku za uvoz.", + "Only the project owner can import a plan.": "Samo vlasnik projekta može uvesti plan.", + "The plan could not be read. Please try again.": "Plan nije moguće pročitati. Pokušajte ponovo.", + "Linked case: {title}": "Povezani predmet: {title}", + "Linked to a case": "Povezano s predmetom", + "Hand over to case": "Predaj predmetu", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Nepromijenjeno kopira svaku datoteku projekta i njegovih zadataka te datoteku koja opisuje projekt u povezani predmet.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopirane datoteke: {count}", + "Files that failed: {names}": "Neuspjele datoteke: {names}", + "The handover failed. Please try again.": "Predaja nije uspjela. Pokušajte ponovo.", + "The linked case could not be found, or you cannot open it.": "Povezani predmet nije pronađen ili ga ne možete otvoriti.", + "Case handovers": "Predaje predmetu", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Svaka predaja datoteka i metapodataka projekta njegovom predmetu: kada, ko, kojem predmetu, svaka kopirana datoteka s njenim SHA-256 i neuspjele datoteke.", + "Finance": "Finansije", + "Add cost line": "Dodaj stavku troška", + "Delivery terms": "Uslovi isporuke", + "Billing model": "Model naplate", + "Budget in euro": "Budžet u eurima", + "Budget in hours": "Budžet u satima", + "Hourly rate in euro": "Satnica u eurima", + "Planned start": "Planirani početak", + "Planned end": "Planirani završetak", + "Planned dates": "Planirani datumi", + "Budget {amount}": "Budžet {amount}", + "No budget agreed": "Budžet nije dogovoren", + "Hours": "Sati", + "Only the project owner and the portfolio managers see the amounts.": "Iznose vide samo vlasnik projekta i upravitelji portfolija.", + "Budget against cost per category": "Budžet naspram troškova po kategoriji", + "Labour (booked time)": "Rad (evidentirani sati)", + "No category": "Bez kategorije", + "Hours are not available": "Sati nisu dostupni", + "Not yet assigned to a category": "Još nije dodijeljeno kategoriji", + "Total": "Ukupno", + "{spent} spent, {remaining} remaining": "{spent} potrošeno, {remaining} preostalo", + "Budget against cost per phase": "Budžet naspram troškova po fazi", + "No phase": "Bez faze", + "Cost lines": "Stavke troška", + "From the finance system": "Iz finansijskog sistema", + "Edit cost line {amount}": "Uredi stavku troška {amount}", + "No cost lines yet": "Još nema stavki troška", + "Commitments": "Obaveze", + "Actual cost": "Stvarni trošak", + "Forecast": "Prognoza", + "Remaining": "Preostalo", + "Not planned yet": "Još nije planirano", + "{start} to {end}": "{start} do {end}", + "The terms were not saved. Please try again.": "Uslovi nisu sačuvani. Pokušajte ponovo.", + "Terms saved": "Uslovi sačuvani", + "Fixed price": "Fiksna cijena", + "Hourly": "Po satu", + "Not billed": "Ne naplaćuje se", + "Commitment": "Obaveza", + "Edit cost line": "Uredi stavku troška", + "Kind": "Vrsta", + "Amount in euro": "Iznos u eurima", + "Remove": "Ukloni", + "Could not save the cost line. Only the project owner changes the money of a project.": "Stavku troška nije moguće sačuvati. Novac projekta mijenja samo vlasnik projekta.", + "Could not remove the cost line. Please try again.": "Stavku troška nije moguće ukloniti. Pokušajte ponovo.", + "{amount} over budget": "{amount} iznad budžeta", + "Cost categories": "Kategorije troškova", + "The categories every project splits its budget and costs into, one per line": "Kategorije na koje svaki projekat dijeli svoj budžet i troškove, jedna po redu", + "Categories": "Kategorije", + "Give at least one category, each name once.": "Navedite barem jednu kategoriju, svaki naziv jednom.", + "Cost categories saved": "Kategorije troškova sačuvane", + "The cost categories were not saved. Please try again.": "Kategorije troškova nisu sačuvane. Pokušajte ponovo.", + "Finance line": "Finansijska stavka", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Jedan novčani iznos projekta: budžet, obaveza, stvarni trošak ili prognoza, u kategoriji troškova i po želji u fazi. Unosi je vlasnik projekta ili je šalje finansijski sistem putem aplikacije za integraciju.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekat kojem iznos pripada. Prazno za stavku iz finansijskog sistema čiji broj projekta ne odgovara nijednom projektu.", + "The phase this amount belongs to, if any": "Faza kojoj iznos pripada, ako postoji", + "The cost category, one of the categories the admin set up": "Kategorija troškova, jedna od kategorija koje je postavio administrator", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Da li je iznos budžet, obaveza, stvarni trošak ili prognoza", + "Amount": "Iznos", + "The amount in the reporting currency (euro)": "Iznos u izvještajnoj valuti (euro)", + "The date the amount was booked or is expected": "Datum kada je iznos knjižen ili se očekuje", + "What the amount is for": "Za šta je iznos", + "Whether a person entered the line or the finance system sent it": "Da li je stavku unijela osoba ili ju je poslao finansijski sistem", + "Entered by hand": "Uneseno ručno", + "Finance line id": "Id finansijske stavke", + "The finance system's own id of this line. One imported line per id.": "Vlastiti id ove stavke u finansijskom sistemu. Jedna uvezena stavka po id-u.", + "Project number": "Broj projekta", + "The project number the finance system sent, matched against the project key": "Broj projekta koji je poslao finansijski sistem, upoređen s ključem projekta", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfolio projekta stavke, preuzet s projekta da bi zbirovi portfolija trebali jedan filter", + "Finance readers": "Čitaoci finansija", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-ovi korisnika Nextclouda koji smiju vidjeti ovaj iznos: vlasnik projekta i upravitelji njegovog portfolija", + "Project owner": "Vlasnik projekta", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID korisnika Nextclouda vlasnika projekta, koji smije mijenjati i uklanjati ručne stavke", + "How the client pays: not billed, a fixed price, or by the hour.": "Kako klijent plaća: ne naplaćuje se, fiksna cijena ili po satu.", + "Portfolio finance": "Finansije portfolija", + "You cannot see the money of any project in this portfolio": "Ne možete vidjeti novac nijednog projekta u ovom portfoliju", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Server je vratio stavke troška projekata izvan ovog portfolija, pa ovi zbirovi mogu biti pogrešni.", + "Projects left out because you cannot see their money: {count}": "Izostavljeni projekti jer ne možete vidjeti njihov novac: {count}", + "Unmatched finance lines": "Nepovezane finansijske stavke", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budžet, obaveze, stvarni trošak i prognoza sabrani za portfolio.", + "Subprojects": "Potprojekti", + "{done} of {total}": "{done} od {total}", + "{done} of {total} tasks done, including subprojects": "{done} od {total} zadataka završeno, uključujući potprojekte", + "Show the subprojects of {title}": "Prikaži potprojekte {title}", + "Hide the subprojects of {title}": "Sakrij potprojekte {title}", + "Part of": "Dio", + "No parent project": "Bez nadređenog projekta", + "A project cannot sit under one of its own subprojects.": "Projekat ne može biti ispod jednog od svojih potprojekata.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekti se ugnježđuju najviše tri nivoa duboko: program, projekat i potprojekat.", + "Parent project": "Nadređeni projekat", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekat ispod kojeg je ovaj projekat, npr. program. Projekti se ugnježđuju najviše tri nivoa duboko.", + "Yes": "Da", + "No": "Ne", + "{label} (required)": "{label} (obavezno)", + "{label} is required": "{label} je obavezno", + "Project field": "Polje projekta", + "A field an admin adds to every project, such as a policy area or a contract value.": "Polje koje administrator dodaje svakom projektu, npr. oblast politike ili vrijednost ugovora.", + "Key": "Ključ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stalni naziv pod kojim se vrijednost čuva, u lower camel case. Zadržite ga kad ga projekti koriste.", + "Label": "Oznaka", + "The name people see next to the field": "Naziv koji ljudi vide pored polja", + "What the field holds": "Šta polje sadrži", + "Text": "Tekst", + "Number": "Broj", + "Choice": "Izbor", + "Person": "Osoba", + "Yes or no": "Da ili ne", + "Options": "Opcije", + "The choices of a choice field": "Opcije polja izbora", + "Required": "Obavezno", + "Whether a project must fill in the field": "Da li projekat mora popuniti polje", + "Where the field appears, lowest first": "Gdje se polje pojavljuje, najniže prvo", + "Applies to": "Važi za", + "What the field is added to": "Čemu se polje dodaje", + "Custom fields": "Vlastita polja", + "The values of the project fields an admin defined, keyed by the field's key.": "Vrijednosti polja projekta koja je definirao administrator, prema ključu polja.", + "Project fields": "Polja projekta", + "Related": "Povezano", + "Remove link": "Ukloni vezu", + "Link type": "Vrsta veze", + "Relates to": "Povezano sa", + "Duplicates": "Duplicira", + "Project key": "Ključ projekta", + "Every task number starts with it, such as VERG-42.": "Svaki broj zadatka počinje njime, na primjer VERG-42.", + "This key is already used by another project.": "Ovaj ključ već koristi drugi projekat.", + "Use 2 to 10 letters and digits, starting with a letter.": "Koristite od 2 do 10 slova i cifara, počevši slovom.", + "The key cannot change once tasks carry it.": "Ključ se ne može promijeniti kada ga zadaci nose.", + "Project saved. The existing tasks get their numbers in the background.": "Projekat je sačuvan. Postojeći zadaci dobijaju brojeve u pozadini.", + "Next task number": "Broj sljedećeg zadatka", + "The number the next task of this project gets in its key. Only the system writes it.": "Broj koji sljedeći zadatak ovog projekta dobija u svom ključu. Upisuje ga samo sistem.", + "Restore {title}": "Vrati {title}", + "Restore": "Vrati", + "Project restored": "Projekat je vraćen", + "Could not restore the project": "Projekat nije moguće vratiti", + "Bring this project back to the active list.": "Vrati ovaj projekat na listu aktivnih projekata.", + "Restore project": "Vrati projekat", + "Request reason": "Razlog zahtjeva", + "Why the requester needs this project. Filled in when the project is requested.": "Zašto podnosiocu treba ovaj projekat. Popunjava se pri zahtjevu.", + "Reviewed by": "Pregledao", + "The user who approved or rejected the request.": "Korisnik koji je odobrio ili odbio zahtjev.", + "Reviewed at": "Pregledano", + "When the request was approved or rejected.": "Kada je zahtjev odobren ili odbijen.", + "Review note": "Napomena pregledača", + "The reviewer's reason, shown to the requester when a request is not approved.": "Razlog pregledača koji podnosilac vidi kada zahtjev nije odobren.", + "Members of these groups": "Članovi ovih grupa", + "Groups that may create projects": "Grupe koje smiju kreirati projekte", + "The group {group} no longer exists. Save to remove it.": "Grupa {group} više ne postoji. Sačuvajte da je uklonite.", + "Review project request": "Pregledaj zahtjev za projekat", + "Requested by": "Zatražio", + "Why it is needed": "Zašto je potreban", + "Desired start date": "Željeni datum početka", + "Why is it not approved?": "Zašto nije odobren?", + "Give a reason. The requester sees it.": "Navedite razlog. Podnosilac će ga vidjeti.", + "Approve": "Odobri", + "Reject": "Odbij", + "Reject request": "Odbij zahtjev", + "The review was not saved. Try again.": "Pregled nije sačuvan. Pokušajte ponovo.", + "This project is waiting for review": "Ovaj projekat čeka pregled", + "This request was not approved": "Ovaj zahtjev nije odobren", + "Reason: {note}": "Razlog: {note}", + "Review request": "Pregledaj zahtjev", + "Request a project": "Zatraži projekat", + "Step {step} of 2": "Korak {step} od 2", + "Why is this project needed?": "Zašto je ovaj projekat potreban?", + "Give a reason. The reviewer reads it.": "Navedite razlog. Pregledač će ga pročitati.", + "Back": "Nazad", + "Next": "Dalje", + "Send request": "Pošalji zahtjev", + "The request was not sent. Try again.": "Zahtjev nije poslan. Pokušajte ponovo.", + "Requested": "Zatraženo", + "Not approved": "Nije odobreno", + "Your request was sent": "Vaš zahtjev je poslan", + "Let everyone else request a project": "Dozvoli svima ostalima da zatraže projekat", + "Add a task": "Dodaj zadatak", + "Delete task": "Izbriši zadatak", + "Edit task": "Uredi zadatak", + "Write": "Piši", + "Preview": "Pregled", + "Markdown works here: headings, lists and links.": "Ovdje radi Markdown: naslovi, liste i linkovi.", + "Could not save the task. Please try again.": "Zadatak nije moguće sačuvati. Pokušajte ponovo.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Na zadatku \"{title}\" je evidentirano vrijeme pa se ne može izbrisati. Umjesto toga ga možete otkazati: zapisi vremena ostaju.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Izbrisati \"{title}\"? Uklonit će se i njegove veze s drugim zadacima. Ovo se ne može poništiti.", + "Keep task": "Zadrži zadatak", + "Cancel task": "Otkaži zadatak", + "Only the reporter, the project owner or an admin can delete this task.": "Ovaj zadatak može izbrisati samo prijavilac, vlasnik projekta ili administrator.", + "Could not delete the task. Please try again.": "Zadatak nije moguće izbrisati. Pokušajte ponovo.", + "Could not cancel the task. Please try again.": "Zadatak nije moguće otkazati. Pokušajte ponovo.", + "Responsible": "Odgovorna osoba", + "Also working on this": "Na ovome rade i", + "Labels": "Oznake", + "Could not change the priority. Please try again.": "Prioritet nije moguće promijeniti. Pokušajte ponovo.", + "Other project members who work on this task alongside the person responsible.": "Ostali članovi projekta koji na ovom zadatku rade zajedno s odgovornom osobom.", + "Duplicate": "Dupliciraj", + "Could not copy the task. Please try again.": "Zadatak nije moguće kopirati. Pokušajte ponovo.", + "Subtasks": "Podzadaci", + "{done} of {total} done": "Gotovo {done} od {total}", + "Add a subtask": "Dodaj podzadatak", + "Checklist": "Kontrolna lista", + "Checklist item actions": "Radnje stavke liste", + "Add a checklist item": "Dodaj stavku liste", + "Subtasks: {estimate} estimated, {logged} logged": "Podzadaci: procjena {estimate}, evidentirano {logged}", + "Total estimate: {total}": "Ukupna procjena: {total}", + "Part of {title}": "Dio zadatka {title}", + "Checklist: {count} done": "Kontrolna lista: gotovo {count}", + "This task has subtasks: {count}.": "Ovaj zadatak ima podzadatke: {count}.", + "Keep subtasks as separate tasks": "Zadrži podzadatke kao zasebne zadatke", + "Delete subtasks too": "Izbriši i podzadatke", + "Copy of {title}": "Kopija: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Zadatak je kopiran, ali ne i svi njegovi podzadaci. Provjerite kopiju.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Mali koraci unutar zadatka. Svaka stavka ima id, tekst i podatak da li je gotova.", + "Open work per person and per project.": "Otvoreni posao po osobi i po projektu.", + "View": "Prikaz", + "By person": "Po osobi", + "By project": "Po projektu", + "Hours left": "Preostali sati", + "Tasks without an estimate": "Zadaci bez procjene", + "Due in 14 days": "Rok u 14 dana", + "Shared": "Dijeljeno", + "Unassigned": "Nedodijeljeno", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Prikazuje se posao u projektima koje možete vidjeti. Sati se računaju odgovornoj osobi; dijeljeni zadaci računaju se bez sati.", + "No open work in these projects.": "Nema otvorenog posla u ovim projektima.", + "Open work": "Otvoreni posao", + "{count} open tasks": "{count} otvorenih zadataka", + "Create a project to see capacity here.": "Kreirajte projekat da biste ovdje vidjeli kapacitet.", + "My tasks": "Moji zadaci", + "Show all my tasks": "Prikaži sve moje zadatke", + "No tasks assigned to you": "Nemate dodijeljenih zadataka", + "Browse projects": "Pregledaj projekte", + "Later": "Kasnije", + "Due {date}": "Rok {date}", + "Could not change the status. Please try again.": "Status nije moguće promijeniti. Pokušajte ponovo.", + "Completed today": "Završeno danas", + "My open tasks": "Moji otvoreni zadaci", + "My overdue tasks": "Moji zakašnjeli zadaci", + "My tasks in progress": "Moji zadaci u toku", + "Pin to the top": "Zakači na vrh", + "Unpin": "Otkači", + "Pinned": "Zakačeno", + "Actions for {title}": "Radnje za {title}", + "Could not save your project order. Please try again.": "Redoslijed projekata nije moguće sačuvati. Pokušajte ponovo.", + "No boards yet": "Još nema ploča", + "Create a project to get a board.": "Kreirajte projekat da biste dobili ploču.", + "Use the Projects page to create and manage your projects and tasks.": "Na stranici Projekti kreirajte i upravljajte svojim projektima i zadacima.", + "Go to projects": "Idi na projekte", + "You are not a member of any projects yet.": "Još niste član nijednog projekta.", + "Could not search for users. Please try again.": "Pretraga korisnika nije uspjela. Pokušajte ponovo.", + "Project creation is restricted to administrators.": "Projekte mogu kreirati samo administratori.", + "Only the project owner or an administrator can delete this project.": "Ovaj projekat može izbrisati samo vlasnik projekta ili administrator.", + "No projects are available to you yet. Ask an administrator to create one.": "Još nemate dostupnih projekata. Zamolite administratora da kreira jedan.", + "Due: {date}": "Rok: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Zadaci s datumom početka ili rokom prikazuju se na vremenskoj liniji. Dodajte datume da biste ih ovdje vidjeli.", + "You do not have access to this project.": "Nemate pristup ovom projektu.", + "Zoom level": "Nivo zumiranja", + "Unscheduled": "Neplanirano", + "Start: {date}": "Početak: {date}", + "Today": "Danas", + "No scheduled tasks": "Nema planiranih zadataka", + "An unexpected error occurred.": "Došlo je do neočekivane greške.", + "Column {number} name": "Naziv kolone {number}", + "Failed to save creation policy": "Pravilo kreiranja nije moguće sačuvati", + "All authenticated users": "Svi prijavljeni korisnici", + "Control who may create new projects": "Odredite ko smije kreirati nove projekte", + "Administrators only": "Samo administratori", + "Project creation": "Kreiranje projekata", + "Allow project creation": "Dozvoli kreiranje projekata", + "Creation policy saved successfully": "Pravilo kreiranja sačuvano", + "Initializing…": "Pokretanje…", + "e.g. 2h 30m, 90m, 1.5h": "npr. 2h 30m, 90m, 1.5h", + "Log time": "Upiši vrijeme", + "Save estimate": "Sačuvaj procjenu", + "Logged: {logged}": "Upisano: {logged}", + "over by {amount}": "prekoračeno za {amount}", + "Time tracking": "Evidencija vremena", + "Estimate": "Procjena", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Unesite ispravnu procjenu (npr. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Unesite ispravno trajanje (npr. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Unos vremena nije moguće sačuvati. Pokušajte ponovo.", + "Edit time entry": "Uredi unos vremena", + "Duration": "Trajanje", + "Date range": "Period", + "Last week": "Prošla sedmica", + "No time logged": "Nema upisanog vremena", + "Log time on a task to see it here.": "Upišite vrijeme na zadatak da biste ga ovdje vidjeli.", + "To date": "Do datuma", + "This week": "Ova sedmica", + "Total: {total}": "Ukupno: {total}", + "From date": "Od datuma", + "Custom range": "Prilagođeni period", + "All time": "Cijelo vrijeme", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Zadatak nije moguće izbrisati pa podaci mogu ostati. Ponovo izbrišite projekat.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Unos vremena nije moguće izbrisati pa podaci mogu ostati. Ponovo izbrišite projekat.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Kolonu nije moguće izbrisati pa podaci mogu ostati. Ponovo izbrišite projekat.", + "Could not delete the project. Please try again.": "Projekat nije moguće izbrisati. Pokušajte ponovo.", + "Notification settings": "Postavke obavještenja", + "Configure when due-date reminders are sent": "Odredite kada se šalju podsjetnici na rokove", + "Due-date reminder lead time (hours)": "Vrijeme podsjetnika prije roka (sati)", + "Lead time must be between 1 and 336 hours": "Vrijeme mora biti između 1 i 336 sati", + "Reminder lead time saved successfully": "Vrijeme podsjetnika sačuvano", + "Failed to save reminder lead time": "Vrijeme podsjetnika nije moguće sačuvati", + "Notifications": "Obavještenja", + "Notify me 1 day before a task's due date": "Obavijesti me 1 dan prije roka zadatka", + "Draft": "Nacrt", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Da li je čas nacrt koji vidi samo njegov nastavnik, održava li se ili je otkazan.", + "New release": "Novo izdanje", + "Roadmap chart. The same releases and epics are listed below.": "Grafikon plana razvoja. Ista izdanja i epovi navedeni su ispod.", + "Nothing on the roadmap yet": "Još ništa na planu razvoja", + "Releases with a target date and epics with dated tasks appear here.": "Ovdje se prikazuju izdanja s ciljnim datumom i epovi sa zadacima koji imaju datum.", + "Releases": "Izdanja", + "No releases yet": "Još nema izdanja", + "Target date: {date}": "Ciljni datum: {date}", + "No target date": "Nema ciljnog datuma", + "Edit {name}": "Uredi {name}", + "Mark {name} as released": "Označi {name} kao objavljeno", + "Mark as released": "Označi kao objavljeno", + "Epics": "Epovi", + "No epics yet. Open a task to make it an epic.": "Još nema epova. Otvorite zadatak da ga pretvorite u ep.", + "Not scheduled yet": "Još nije zakazano", + "Planned": "Planirano", + "Released": "Objavljeno", + "Edit release": "Uredi izdanje", + "Target date": "Ciljni datum", + "Could not save the release. Please try again.": "Izdanje nije moguće sačuvati. Pokušajte ponovo.", + "Every task of this release is done or cancelled.": "Svaki zadatak ovog izdanja je završen ili otkazan.", + "Not finished yet: {count}": "Još nije završeno: {count}", + "What happens to these tasks?": "Šta se dešava s ovim zadacima?", + "Move to {name}": "Premjesti u {name}", + "Remove the release": "Ukloni izdanje", + "Keep it on {name}": "Ostavi ih u {name}", + "Could not mark the release as released. Please try again.": "Izdanje nije moguće označiti kao objavljeno. Pokušajte ponovo.", + "Roadmap": "Plan razvoja", + "Tasks or roadmap": "Zadaci ili plan razvoja", + "Release": "Izdanje", + "Epic": "Ep", + "This task is an epic": "Ovaj zadatak je ep", + "A named, dated delivery of a project that its tasks are planned against.": "Imenovana isporuka projekta s datumom prema kojoj se planiraju njegovi zadaci.", + "Name of the release": "Naziv izdanja", + "The project this release belongs to": "Projekat kojem pripada ovo izdanje", + "What this release delivers": "Šta ovo izdanje isporučuje", + "When work on the release starts": "Kada počinje rad na izdanju", + "The date the release is due": "Datum do kojeg izdanje treba biti gotovo", + "Whether the release is planned, released or archived": "Da li je izdanje planirano, objavljeno ili arhivirano", + "Released on": "Objavljeno", + "When the release was marked as released": "Kada je izdanje označeno kao objavljeno", + "The release this task is planned for": "Izdanje za koje je ovaj zadatak planiran", + "Board view options": "Opcije prikaza ploče", + "Colour cards": "Oboji kartice", + "No colour": "Bez boje", + "By label": "Po oznaci", + "Swimlanes": "Staze", + "No swimlanes": "Bez staza", + "By assignee": "Po zaduženoj osobi", + "By epic": "Po epicu", + "No assignee": "Nije dodijeljeno", + "No epic": "Bez epica", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartice ostaju u redu svog epica. Promijenite epic na stranici zadatka.", + "Hand over to": "Predaj osobi", + "Could not save your board view. It applies until you reload.": "Prikaz ploče nije sačuvan. Vrijedi dok ponovo ne učitate stranicu.", + "Timetable wish": "Želja za raspored", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Želja koju generator uzima u obzir. Čvrstu želju uvijek poštuje, meku gdje može.", + "Whether the wish is about a teacher, a group, a room or one activity": "Da li se želja odnosi na nastavnika, grupu, prostoriju ili jednu aktivnost", + "Teacher": "Nastavnik", + "Group": "Grupa", + "Reference": "Referenca", + "The user, group, room or activity the wish is about": "Korisnik, grupa, prostorija ili aktivnost na koju se želja odnosi", + "What the wish asks for": "Šta želja traži", + "Not on these periods": "Ne u ovim časovima", + "Preferably not on these periods": "Radije ne u ovim časovima", + "At most a number of lessons a day": "Najviše određen broj časova dnevno", + "No free periods between lessons": "Bez rupa između časova", + "Always the same room": "Uvijek ista prostorija", + "Periods": "Časovi", + "The periods of the week the wish is about, such as wed-5": "Časovi u sedmici na koje se želja odnosi, npr. wed-5", + "Limit": "Granica", + "The most lessons a day, for a wish of that kind": "Najviše časova dnevno, za želju te vrste", + "Strength": "Jačina", + "Whether the generator must keep the wish or should keep it": "Da li generator mora ili bi trebao poštovati želju", + "Hard": "Čvrsta", + "Soft": "Meka", + "Weight": "Težina", + "How much a soft wish counts, from 1 to 3": "Koliko meka želja vrijedi, od 1 do 3", + "Why the wish exists": "Zašto želja postoji", + "Timetable scenario": "Scenarij rasporeda", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jedan sedmični obrazac, koji je napravio generator ili je preuzet iz trenutnog rasporeda. Čuva svoj ulaz i koliko dobro poštuje želje.", + "The name timetablers know the scenario by": "Naziv pod kojim sastavljači rasporeda znaju scenarij", + "Whether the generator made it or it came from the current timetable": "Da li ga je napravio generator ili dolazi iz trenutnog rasporeda", + "Generated": "Generisano", + "From the current timetable": "Iz trenutnog rasporeda", + "Week of": "Sedmica od", + "The Monday of the first week of the window": "Ponedjeljak prve sedmice perioda", + "Window start": "Početak perioda", + "The first day the week pattern applies to": "Prvi dan na koji se sedmični obrazac odnosi", + "Window end": "Kraj perioda", + "The last day the week pattern applies to": "Zadnji dan na koji se sedmični obrazac odnosi", + "Waiting, generating, done, failed, or published as draft lessons": "Čeka, generiše se, gotovo, neuspjelo ili objavljeno kao nacrti časova", + "Waiting": "Čeka", + "Generating": "Generiše se", + "Failed": "Neuspjelo", + "Published": "Objavljeno", + "Seed": "Sjeme", + "The number the generator starts from, so a run can be repeated": "Broj od kojeg generator kreće, kako bi se pokretanje moglo ponoviti", + "Input": "Ulaz", + "The periods, rooms, lessons and wishes the scenario was made from": "Časovi, prostorije, predavanja i želje od kojih je nastao scenarij", + "Placements": "Smještaji", + "Each lesson with the period and room it was given": "Svaki čas sa terminom i prostorijom koje je dobio", + "Unplaced lessons": "Nesmješteni časovi", + "Lessons without a place, each with the hard wish that blocked it": "Časovi bez mjesta, svaki sa čvrstom željom koja ga je zaustavila", + "Broken wishes": "Prekršene želje", + "The wishes this scenario breaks, with the lessons that break them": "Želje koje ovaj scenarij krši, sa časovima koji ih krše", + "Measures": "Mjere", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Smješteni časovi, prekršene želje, rupe nastavnika, časovi dnevno i korištenje prostorija", + "Reason": "Razlog", + "Why the run failed": "Zašto pokretanje nije uspjelo", + "Published at": "Objavljeno", + "When the scenario was written out as draft lessons": "Kada je scenarij zapisan kao nacrti časova", + "Edit wish": "Uredi želju", + "New wish": "Nova želja", + "Hard: the generator always keeps it": "Obavezno: generator je uvijek poštuje", + "Soft: the generator keeps it where it can": "Fleksibilno: generator je poštuje gdje može", + "Weight (1 to 3)": "Težina (1 do 3)", + "Most lessons a day": "Najviše časova dnevno", + "Period": "Čas", + "{day} period {number}": "{day} čas {number}", + "Teacher (user name)": "Nastavnik (korisničko ime)", + "Activity (group:subject)": "Aktivnost (grupa:predmet)", + "Say who or what the wish is about.": "Navedite na koga ili šta se želja odnosi.", + "Choose at least one period.": "Odaberite barem jedan čas.", + "The limit is a whole number of 1 or more.": "Ograničenje je cijeli broj od 1 ili više.", + "Timetable": "Raspored", + "Wishes": "Želje", + "Timetable wishes": "Želje za raspored", + "Generator run": "Pokretanje generatora", + "Generator progress": "Napredak generatora", + "The run failed: {reason}": "Pokretanje nije uspjelo: {reason}", + "{placed} of {lessons} lessons placed": "Smješteno {placed} od {lessons} časova", + "Generate again": "Generiši ponovo", + "Generate": "Generiši", + "Every lesson has a place.": "Svaki čas ima mjesto.", + "Lesson": "Čas", + "No free period and room": "Nema slobodnog časa i učionice", + "Broken soft wishes": "Prekršene fleksibilne želje", + "Every soft wish is kept.": "Svaka fleksibilna želja je poštovana.", + "Wish": "Želja", + "Lessons": "Časovi", + "Generating: {percent}% of the time budget used": "Generisanje: iskorišteno {percent}% vremena", + "Waiting to start": "Čeka početak", + "Published as draft lessons": "Objavljeno kao nacrti časova", + "Could not read the scenario.": "Scenarij nije moguće pročitati.", + "Could not start the run.": "Pokretanje nije moguće započeti.", + "Scenarios": "Scenariji", + "Timetable scenarios": "Scenariji rasporeda", + "Scenario": "Scenarij", + "Take the current timetable": "Preuzmi trenutni raspored", + "Could not take the current timetable.": "Trenutni raspored nije moguće preuzeti.", + "Broken hard wishes": "Prekršene obavezne želje", + "Not on a period of the week grid": "Nije na času sedmične mreže", + "Compare scenarios": "Uporedi scenarije", + "Scenarios to compare": "Scenariji za poređenje", + "Choose two or three scenarios to compare them.": "Odaberite dva ili tri scenarija za poređenje.", + "Measure": "Mjera", + "Best": "Najbolje", + "Lessons that differ": "Časovi koji se razlikuju", + "No lesson differs.": "Nijedan čas se ne razlikuje.", + "Not placed": "Nije smješteno", + "{period} in {room}": "{period} u {room}", + "Lessons placed": "Smješteni časovi", + "Lessons without a place": "Časovi bez mjesta", + "Clashes": "Sukobi", + "Hard wishes broken": "Prekršene obavezne želje", + "Soft wishes broken": "Prekršene fleksibilne želje", + "Soft wishes broken, weighted": "Prekršene fleksibilne želje, ponderisano", + "Free periods between lessons, all teachers": "Prazni časovi, svi nastavnici", + "Most free periods of one teacher": "Najviše praznih časova jednog nastavnika", + "Most lessons of one group on a day": "Najviše časova jedne grupe u danu", + "Room use": "Korištenje učionica", + "Publish as draft lessons": "Objavi kao nacrte časova", + "Draft lessons written: {count}": "Zapisani nacrti časova: {count}", + "Could not publish the scenario.": "Scenarij nije moguće objaviti.", + "Rules": "Pravila", + "Rules for {column}": "Pravila za {column}", + "When a card enters this column": "Kada kartica uđe u ovu kolonu", + "Action": "Radnja", + "Set the priority": "Postavi prioritet", + "Assign to": "Dodijeli osobi", + "Assign the person who moved the card": "Dodijeli osobi koja je premjestila karticu", + "Remove the assignee": "Ukloni zaduženu osobu", + "Add a label": "Dodaj oznaku", + "No longer a project member": "Više nije član projekta", + "This label no longer exists": "Ova oznaka više ne postoji", + "Add rule": "Dodaj pravilo", + "Remove rule": "Ukloni pravilo", + "No rules yet. Add one to change a card when it enters this column.": "Još nema pravila. Dodajte jedno da biste mijenjali karticu kada uđe u ovu kolonu.", + "Could not save the rules. Please try again.": "Pravila nije moguće sačuvati. Pokušajte ponovo.", + "1 rule runs when a card enters this column": "1 pravilo se izvršava kada kartica uđe u ovu kolonu", + "{count} rules run when a card enters this column": "Broj pravila koja se izvršavaju kada kartica uđe u ovu kolonu: {count}", + "Rules applied: {changes}": "Primijenjena pravila: {changes}", + "assigned to {name}": "dodijeljeno osobi {name}", + "assignee removed": "zadužena osoba uklonjena", + "priority {priority}": "prioritet {priority}", + "label {label}": "oznaka {label}", + "What happens to a card when it enters this column, applied in list order.": "Šta se dešava s karticom kada uđe u ovu kolonu, redoslijedom liste.", + "Value": "Vrijednost", + "What the rule does to the card.": "Šta pravilo radi s karticom.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioritet, ID korisnika ili ID oznake koji radnja koristi; prazno za radnje bez vrijednosti.", + "is not": "nije", + "{dimension} is not": "{dimension} nije", + "Saved filters": "Sačuvani filteri", + "No saved filters yet": "Još nema sačuvanih filtera", + "Save filter": "Sačuvaj filter", + "Rename \"{name}\"": "Preimenuj „{name}”", + "Delete \"{name}\"": "Izbriši „{name}”", + "Clear filters": "Očisti filtere", + "Showing {shown} of {total} tasks": "Prikazano {shown} od {total} zadataka", + "Me": "Ja", + "No date": "Bez datuma", + "Rename saved filter": "Preimenuj sačuvani filter", + "Share with the project": "Podijeli s projektom", + "Give the filter a name": "Dajte filteru naziv", + "Could not save the filter. Please try again.": "Filter nije moguće sačuvati. Pokušajte ponovo.", + "Some labels in \"{name}\" no longer exist and were left out.": "Neke oznake u „{name}” više ne postoje i izostavljene su.", + "Could not delete the filter. Please try again.": "Filter nije moguće izbrisati. Pokušajte ponovo.", + "Saved filter": "Sačuvani filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Imenovani filter ploče jednog projekta, privatan za osobu koja ga je sačuvala, osim ako je podijeljen s projektom.", + "The project whose board the filter applies to": "Projekt na čijoj se ploči filter primjenjuje", + "The name the filter is listed under": "Naziv pod kojim je filter na listi", + "Saved by": "Sačuvao/la", + "Nextcloud user id of the person who saved the filter": "Nextcloud ID korisnika koji je sačuvao filter", + "Shared with the project": "Podijeljeno s projektom", + "Whether every project member sees and applies the filter": "Da li svaki član projekta vidi filter i može ga primijeniti", + "Criteria": "Kriteriji", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filter: zadužena osoba, oznaka, prioritet i rok, svaki s jeste ili nije i svojim vrijednostima", + "Cross-project view": "Međuprojektni prikaz", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Sačuvan odabir projekata čiji se zadaci prikazuju zajedno u kolonama statusa, podijeljen s navedenim osobama.", + "Shared with": "Podijeljeno s", + "The name the view is listed under": "Naziv pod kojim je prikaz naveden", + "Nextcloud user id of the person who saved the view": "Nextcloud korisnički ID osobe koja je sačuvala prikaz", + "Nextcloud user ids of the people the view is shared with": "Nextcloud korisnički ID-ovi osoba s kojima je prikaz podijeljen", + "The projects whose tasks the view shows, at most twenty": "Projekti čije zadatke prikaz prikazuje, najviše dvadeset", + "1 project in this view is hidden from you.": "1 projekat u ovom prikazu je skriven od vas.", + "{count} projects in this view are hidden from you.": "Projekti u ovom prikazu skriveni od vas: {count}.", + "{project} has no column for {status}.": "Projekat {project} nema kolonu za status {status}.", + "This view does not exist or is not shared with you.": "Ovaj prikaz ne postoji ili nije podijeljen s vama.", + "\"{task}\" moved to {status}.": "\"{task}\" premješteno u {status}.", + "Project: {title}": "Projekat: {title}", + "Cross-project views": "Međuprojektni prikazi", + "New view": "Novi prikaz", + "Edit view": "Uredi prikaz", + "Delete view": "Izbriši prikaz", + "Give the view a name": "Dajte prikazu naziv", + "Pick at least one project": "Odaberite barem jedan projekat", + "A view shows at most {max} projects": "Prikaz prikazuje najviše {max} projekata", + "Could not save the view. Please try again.": "Prikaz nije moguće sačuvati. Pokušajte ponovo.", + "Could not delete the view. Please try again.": "Prikaz nije moguće izbrisati. Pokušajte ponovo.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Izbrisati \"{title}\"? Projekti i njihovi zadaci ostaju kakvi jesu.", + "People see the tasks of the projects they are in, never more.": "Svako vidi samo zadatke projekata u kojima je.", + "No views yet. A view shows the tasks of several of your projects together.": "Još nema prikaza. Prikaz prikazuje zadatke više vaših projekata zajedno.", + "Projects in view: {count}": "Projekti u prikazu: {count}", + "Notify me when a task is assigned to me": "Obavijesti me kad mi se dodijeli zadatak", + "Also send these to me by email": "Šalji mi ih i e-poštom", + "Add an email address in your Nextcloud personal settings to get mail.": "Dodajte adresu e-pošte u ličnim postavkama Nextclouda da biste primali e-poštu.", + "Code link": "Veza na kod", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, grana, zahtjev za spajanje ili prijava na platformi za kod koja se odnosi na zadatak.", + "The task the link belongs to": "Zadatak kojem veza pripada", + "The project of the task": "Projekat zadatka", + "Task key": "Ključ zadatka", + "The task key the forge text named, such as VC-12": "Ključ zadatka naveden u tekstu platforme, npr. VC-12", + "What the link points at": "Na šta veza pokazuje", + "Link": "Veza", + "The address of the item in the forge": "Adresa stavke na platformi za kod", + "The commit message, branch name or merge request title": "Poruka commita, naziv grane ili naslov zahtjeva za spajanje", + "Repository": "Repozitorij", + "The repository, such as acme/portal": "Repozitorij, npr. acme/portal", + "Forge id": "Id na platformi", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Vlastiti id stavke na platformi za kod, npr. github:acme/portal#42 ili hash commita", + "State": "Stanje", + "The state of a merge request or issue": "Stanje zahtjeva za spajanje ili prijave", + "Who made the commit or opened the merge request": "Ko je napravio commit ili otvorio zahtjev za spajanje", + "When the commit was made or the merge request last changed": "Kada je napravljen commit ili se zahtjev za spajanje posljednji put promijenio", + "Added by": "Dodao", + "Whether a person added the link or the integration wrote it": "Da li je vezu dodala osoba ili ju je zapisala integracija", + "Nextcloud user UIDs of project members": "Nextcloud korisnički ID-ovi članova projekta", + "Add link": "Dodaj vezu", + "Added by hand": "Dodano ručno", + "Branch": "Grana", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Iz integracije", + "Link to a commit, branch or merge request": "Veza na commit, granu ili zahtjev za spajanje", + "Merge request": "Zahtjev za spajanje", + "Merged": "Spojeno", + "No code linked yet. Name {key} in a commit message or paste a link.": "Još nema povezanog koda. Navedite {key} u poruci commita ili zalijepite vezu.", + "No code linked yet. Paste a link to a commit or merge request.": "Još nema povezanog koda. Zalijepite vezu na commit ili zahtjev za spajanje.", + "Paste a web address that starts with https://.": "Zalijepite web-adresu koja počinje sa https://.", + "Remove link {title}": "Ukloni vezu {title}", + "The link could not be added.": "Vezu nije bilo moguće dodati.", + "The link could not be removed.": "Vezu nije bilo moguće ukloniti.", + "This link is already on the task.": "Ova veza je već na zadatku.", + "Code forges": "Platforme za kod", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Povežite commitove i pull requestove s GitHuba sa zadacima. Integriq prima događaje; planninq nikad ne poziva GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Preuzmite konfiguraciju i uvezite je u Integriq. Zatim upišite tajnu u pravilo \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "U GitHubu repozitoriju dodajte webhook sa ovom adresom i istom tajnom. Odaberite vrstu sadržaja application/json te događaje push i pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Navedite ključ zadatka, npr. VC-12, u poruci commita, nazivu grane ili naslovu pull requesta. Veza se tada pojavljuje na tom zadatku.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriqa članovi projekta i dalje mogu zalijepiti vezu na stranici zadatka.", + "Download the Integriq configuration": "Preuzmi konfiguraciju za Integriq", + "Calendar": "Kalendar", + "Previous": "Prethodno", + "Calendar view": "Prikaz kalendara", + "Starts:": "Počinje:", + "No tasks with a date in this month.": "Ovaj mjesec nema zadataka s datumom.", + "Week of {start} to {end}": "Sedmica od {start} do {end}", + "My calendar": "Moj kalendar", + "Show as list": "Prikaži kao listu", + "Show as calendar": "Prikaži kao kalendar", + "Open my calendar": "Otvori moj kalendar", + "Nextcloud Tasks": "Nextcloud Zadaci", + "Show my tasks in Nextcloud Tasks": "Prikaži moje zadatke u Nextcloud Zadacima", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Zadaci dodijeljeni vama ili podijeljeni s vama prikazuju se na listi \"Planninq\" u Nextcloud Zadacima i Kalendaru. Promjene napravljene tamo zamjenjuju se sljedećom promjenom u Planninqu.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ovaj server ne može pisati u Nextcloud Zadatke pa izvoz nije dostupan.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Upravlja Planninq. Promjene napravljene ovdje zamjenjuju se sljedećom promjenom u Planninqu.", + "Working days and holidays": "Radni dani i praznici", + "Dates set on the timeline skip the days that are not working days.": "Datumi postavljeni na vremenskoj liniji preskaču dane koji nisu radni.", + "Working weekdays": "Radni dani u sedmici", + "Non-working days": "Neradni dani", + "No non-working days yet.": "Još nema neradnih dana.", + "Add day": "Dodaj dan", + "Year": "Godina", + "Add Dutch national holidays": "Dodaj holandske državne praznike", + "Save working days": "Spremi radne dane", + "Choose at least one working weekday.": "Odaberite barem jedan radni dan.", + "Working days saved.": "Radni dani spremljeni.", + "Could not save the working days.": "Radne dane nije bilo moguće spremiti.", + "New Year's Day": "Nova godina", + "Easter Sunday": "Uskrs", + "Easter Monday": "Uskršnji ponedjeljak", + "King's Day": "Kraljev dan", + "Liberation Day": "Dan oslobođenja", + "Ascension Day": "Spasovdan", + "Whit Sunday": "Duhovi", + "Whit Monday": "Duhovski ponedjeljak", + "Christmas Day": "Božić", + "Boxing Day": "Drugi dan Božića", + "Dates of {title}": "Datumi za {title}", + "The due date cannot be before the start date.": "Rok ne može biti prije datuma početka.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Datume nije bilo moguće spremiti.", + "{title} now runs from {start} to {end}": "{title} sada traje od {start} do {end}", + "Auto-scheduling": "Automatsko planiranje", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kad je uključeno, kasniji rok na vremenskoj liniji nudi pomjeranje zadataka koje blokira.", + "Move blocked tasks along when a task slips": "Pomjeri blokirane zadatke kad zadatak kasni", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na vremenskoj liniji kasniji rok nudi pomjeranje blokiranih zadataka. Broje se samo veze \"blokira\", a zadaci se pomjeraju samo kasnije.", + "Move the tasks that wait for {title}?": "Pomjeriti zadatke koji čekaju {title}?", + "These tasks wait for it and would start after its new due date:": "Ovi zadaci ga čekaju i počeli bi nakon novog roka:", + "{count} tasks would move; the first {limit} are listed.": "Pomjerilo bi se {count} zadataka; prikazano je prvih {limit}.", + "Now": "Sada", + "After the move": "Nakon pomjeranja", + "Only this task": "Samo ovaj zadatak", + "Move all": "Pomjeri sve", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Zaustavljeno kod {title}: datume nije bilo moguće spremiti. Zadaci prije njega su pomjereni.", + "Cumulative flow": "Kumulativni tok", + "Show as chart": "Prikaži kao grafikon", + "Show as table": "Prikaži kao tabelu", + "Tasks per column per day": "Zadaci po koloni po danu", + "Tasks without recorded history in this period: {count}": "Zadaci bez zabilježene historije u ovom periodu: {count}", + "Lead and cycle time": "Vrijeme isporuke i vrijeme ciklusa", + "No tasks were finished in this period.": "U ovom periodu nije završen nijedan zadatak.", + "Finished tasks": "Završeni zadaci", + "Cycle time, average": "Vrijeme ciklusa, prosjek", + "Cycle time, 85th percentile": "Vrijeme ciklusa, 85. percentil", + "Lead time, average": "Vrijeme isporuke, prosjek", + "Tasks whose finish time was estimated from their history: {count}": "Zadaci čije je vrijeme završetka procijenjeno iz historije: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Vrijeme ciklusa svakog završenog zadatka, s prosjekom i 85. percentilom", + "Slowest tasks": "Najsporiji zadaci", + "cycle {cycle}, lead {lead}": "ciklus {cycle}, isporuka {lead}", + "{days} days": "{days} dana", + "Could not load the flow of this project.": "Tok ovog projekta nije moguće učitati.", + "Last {days} days": "Posljednjih {days} dana", + "Portfolio flow": "Tok portfolija", + "An admin adds portfolios under Projects, Portfolios.": "Administrator dodaje portfolije pod Projekti, Portfoliji.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekti koji nisu prikazani jer se odjednom prikazuje najviše 50: {count}", + "Could not load the flow of this portfolio.": "Tok ovog portfolija nije moguće učitati.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativni tok i vrijeme ciklusa kroz projekte portfolija.", + "Edit report": "Uredi izvještaj", + "Only tasks where": "Samo zadaci gdje", + "Group by": "Grupiši po", + "Display": "Prikaz", + "Share with everyone who can read its projects": "Podijeli sa svima koji mogu čitati njegove projekte", + "The report could not be saved.": "Izvještaj nije moguće sačuvati.", + "Number of tasks": "Broj zadataka", + "Bar": "Stubovi", + "Donut": "Prsten", + "Table": "Tabela", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} od {total} projekata u ovom izvještaju nije vidljivo za vas", + "No tasks match this report.": "Nijedan zadatak ne odgovara ovom izvještaju.", + "None": "Ništa", + "Could not load this report.": "Ovaj izvještaj nije moguće učitati.", + "Report": "Izvještaj", + "Your reports": "Vaši izvještaji", + "My reports": "Moji izvještaji", + "Shared reports": "Dijeljeni izvještaji", + "You have not built a report yet.": "Još niste napravili izvještaj.", + "Nobody has shared a report with you yet.": "Još niko nije podijelio izvještaj s vama.", + "Reports you built over tasks, and the ones shared with you.": "Izvještaji koje ste napravili nad zadacima, i oni podijeljeni s vama.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Sačuvani upit nad zadacima: koji projekti, koji filteri, grupisano po čemu, prebrojano ili sabrano, i prikazano kao tabela ili grafikon.", + "The name the report is listed under": "Naziv pod kojim je izvještaj naveden", + "What the report shows and who it is for": "Šta izvještaj prikazuje i kome je namijenjen", + "Nextcloud user id of the person who saved the report": "Nextcloud ID korisnika koji je sačuvao izvještaj", + "Who can open the report": "Ko može otvoriti izvještaj", + "Only me": "Samo ja", + "Everyone who can read its projects": "Svi koji mogu čitati njegove projekte", + "The projects the report covers, at most fifty": "Projekti koje izvještaj obuhvata, najviše pedeset", + "Filters": "Filteri", + "Task fields and the value each must equal": "Polja zadatka i vrijednost kojoj svako mora biti jednako", + "The task field the report groups on": "Polje zadatka po kojem izvještaj grupiše", + "Count the tasks, or add up a number on them": "Prebroji zadatke ili saberi broj na njima", + "Sum": "Zbir", + "Sum of": "Zbir polja", + "The number added up when the measure is a sum": "Broj koji se sabira kada je mjera zbir", + "Story points": "Bodovi priče", + "Estimated duration": "Procijenjeno trajanje", + "How the report is shown": "Kako se izvještaj prikazuje", + "Issue type": "Vrsta zahtjeva", + "Task fields and the value each must equal; empty when the report covers every task": "Polja zadatka i vrijednost koju svako mora imati; prazno kad izvještaj obuhvata sve zadatke", + "The status a task must have": "Status koji zadatak mora imati", + "The priority a task must have": "Prioritet koji zadatak mora imati", + "The user a task must be assigned to": "Korisnik kojem zadatak mora biti dodijeljen", + "A label a task must carry": "Oznaka koju zadatak mora imati", + "The board column a task must be in": "Kolona table u kojoj zadatak mora biti", + "The issue type a task must have": "Vrsta zahtjeva koju zadatak mora imati", + "Manager groups": "Grupe voditelja", + "Member groups": "Grupe članova", + "Viewer groups": "Grupe čitalaca", + "Viewers": "Čitaoci", + "Owning group": "Vlasnička grupa", + "Nextcloud groups whose members manage the project": "Nextcloud grupe čiji članovi vode projekat", + "Nextcloud groups whose members work on the project": "Nextcloud grupe čiji članovi rade na projektu", + "Nextcloud groups whose members may read the project": "Nextcloud grupe čiji članovi smiju čitati projekat", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud korisnici koji vode projekat: postavke, članove i rad", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud korisnici koji smiju čitati projekat i njegov rad, ali ga ne mijenjati", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud grupa koja posjeduje projekat zajedno s njegovim autorom, najviše jedna", + "Nextcloud user ids who may read this through the project": "Nextcloud korisnici koji ovo smiju čitati kroz projekat", + "Nextcloud groups whose members may change this through the project": "Nextcloud grupe čiji članovi ovo smiju mijenjati kroz projekat", + "Nextcloud groups whose members may read this through the project": "Nextcloud grupe čiji članovi ovo smiju čitati kroz projekat", + "Search for a person or a group…": "Traži osobu ili grupu…", + "No one found. Your admin's sharing settings decide who you can find.": "Niko nije pronađen. Postavke dijeljenja vašeg administratora određuju koga možete pronaći.", + "Type at least two characters": "Unesite najmanje dva znaka", + "Everyone in this group": "Svi u ovoj grupi", + "Could not search for people. Please try again.": "Pretraga osoba nije uspjela. Pokušajte ponovo.", + "Could not remove the group": "Grupu nije moguće ukloniti", + "Only the owner and managers change who is on this project.": "Samo vlasnik i upravitelji mijenjaju ko je na ovom projektu.", + "Role of {name}": "Uloga: {name}", + "Manager": "Upravitelj", + "Member": "Član", + "Viewer": "Čitalac", + "Could not change the role": "Ulogu nije moguće promijeniti", + "Owned by group: {name}": "U vlasništvu grupe: {name}", + "No group owns this project.": "Nijedna grupa nije vlasnik ovog projekta.", + "Owned by group": "U vlasništvu grupe", + "Search for a group…": "Potraži grupu…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nije pronađena nijedna grupa. Postavke dijeljenja vašeg administratora određuju koje grupe možete pronaći.", + "No owning group": "Bez grupe vlasnika", + "Could not search for groups. Please try again.": "Pretraga grupa nije uspjela. Pokušajte ponovo.", + "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", + "You can read this project. Only its members change it.": "Ovaj projekat možete čitati. Mijenjaju ga samo njegovi članovi.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet koji se predaje na ovom času, na primjer izborni predmet, kad ga školska aplikacija za učenje poznaje.", + "Online meeting link": "Link za online čas", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdje se učenici pridružuju ovom času online. Dugme Pridruži se prikazuje se samo za https link." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/bs.json b/l10n/bs.json index c4d7f081..745bc60e 100644 --- a/l10n/bs.json +++ b/l10n/bs.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktivni projekti", + "Archived projects": "Arhivirani projekti", + "Boards": "Table", + "My projects": "Moji projekti", + "Portfolio": "Portfolio", + "Project board": "Tabla projekta", + "Projects I am in": "Projekti u kojima učestvujem", + "Timeline": "Vremenska linija", + "Timesheet": "Evidencija vremena", + "Features & roadmap": "Funkcije i plan razvoja", + "Flow": "Tok", + "Flows": "Tokovi", + "Reports": "Izvještaji", + "Pick a report to open it.": "Odaberite izvještaj da biste ga otvorili.", + "In progress": "U toku", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodijeljeno", + "Who": "Ko", + "What": "Šta", + "Minutes": "Minute", + "Entries": "Unosi", + "Most recent": "Najnovije", + "Per person": "Po osobi", + "By status": "Po statusu", + "By priority": "Po prioritetu", + "Task status": "Status zadataka", + "Time spent": "Utrošeno vrijeme", + "Capacity": "Kapacitet", + "Due soonest": "Najskoriji rok", + "Minutes logged": "Zabilježene minute", + "Nothing is due": "Ništa ne dospijeva", + "Nothing logged yet": "Još ništa nije zabilježeno", + "What is open, what is blocked, and what is overdue.": "Šta je otvoreno, šta blokirano i šta kasni.", + "How allocation is spread across the people working on projects.": "Kako je opterećenje raspoređeno među ljudima na projektima.", + "Hours logged, and the projects they went to.": "Zabilježeni sati i projekti na koje su otišli.", + "Billable": "Naplativo", + "Budget: {amount}": "Budžet: {amount}", + "Loading projects": "Učitavanje projekata", + "No projects for this client yet": "Još nema projekata za ovog klijenta", + "Open in Planninq": "Otvori u Planninq", + "This project could not be found": "Ovaj projekat nije pronađen", + "Untitled project": "Projekat bez naziva", + "and {count} more": "i još {count}", + "Store": "Trgovina", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instalirajte registre, šeme i tokove koje su objavile druge organizacije.", + "Work Date": "Datum rada", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Radnje kolone", + "Columns": "Kolone", + "Could not remove the column. Please try again.": "Kolonu nije moguće ukloniti. Pokušajte ponovo.", + "Could not save the column. Please try again.": "Kolonu nije moguće sačuvati. Pokušajte ponovo.", + "Done column": "Kolona završenih", + "Edit column": "Uredi kolonu", + "Keep the card's status": "Zadrži status kartice", + "Move its cards to": "Premjesti njene kartice u", + "Move left": "Pomjeri lijevo", + "Move right": "Pomjeri desno", + "Status of cards moved here": "Status kartica premještenih ovdje", + "The last done column cannot be removed.": "Posljednja kolona završenih ne može se ukloniti.", + "WIP limit": "WIP ograničenje", + "over limit": "iznad ograničenja", + "The status a card gets when it is moved into this column.": "Status koji kartica dobija kada se premjesti u ovu kolonu.", + "All priorities": "Svi prioriteti", + "Could not create the task. Please try again.": "Zadatak nije moguće kreirati. Pokušajte ponovo.", + "Created": "Kreirano", + "Move to backlog": "U zaostatak", + "Move to board": "Na tablu", + "New task": "Novi zadatak", + "Nothing in the backlog": "Ništa u zaostatku", + "Rank": "Rang", + "Sort by": "Poredaj po", + "Sort by rank to reorder": "Poredajte po rangu da biste promijenili redoslijed", + "Task actions": "Radnje zadatka", + "All labels": "Sve oznake", + "Filter tasks by label": "Filtriraj zadatke po oznaci", + "View timeline": "Prikaži vremensku liniju", + "Board": "Tabla", + "List": "Lista", + "Column": "Kolona", + "Board or list": "Tabla ili lista", + "Log": "Dnevnik", + "Add entry": "Dodaj unos", + "Show": "Prikaži", + "No actions yet": "Još nema radnji", + "Closed": "Zatvoreno", + "Entry actions": "Radnje unosa", + "Add action": "Dodaj radnju", + "by {author}": "autor {author}", + "saved {time}": "sačuvano {time}", + "Attendees: {names}": "Prisutni: {names}", + "Add the first entry": "Dodaj prvi unos", + "Issues": "Problemi", + "Lessons learned": "Naučene lekcije", + "Meetings": "Sastanci", + "Decisions": "Odluke", + "Actions": "Radnje", + "Issue": "Problem", + "Lesson learned": "Naučena lekcija", + "Meeting": "Sastanak", + "Decision": "Odluka", + "About this project": "O ovom projektu", + "No description yet": "Još nema opisa", + "Start date": "Datum početka", + "Not set": "Nije postavljeno", + "End date": "Datum završetka", + "Progress": "Napredak", + "No tasks yet": "Još nema zadataka", + "Open the board": "Otvori tablu", + "People": "Osobe", + "Owner": "Vlasnik", + "Latest log entries": "Najnoviji unosi", + "Open the log": "Otvori dnevnik", + "{done} of {total} tasks done": "Gotovo {done} od {total} zadataka", + "Edit entry": "Uredi unos", + "Type": "Vrsta", + "Attendees": "Prisutni", + "Issue is closed": "Problem je zatvoren", + "Could not save the entry. Please try again.": "Unos nije moguće sačuvati. Pokušajte ponovo.", + "From: {title}": "Iz: {title}", + "What needs to happen": "Šta treba uraditi", + "Could not create the action. Please try again.": "Radnju nije moguće kreirati. Pokušajte ponovo.", + "The action was created but could not be linked to the entry.": "Radnja je kreirana, ali je nije moguće povezati s unosom.", + "Project pages": "Stranice projekta", + "Overview": "Pregled", + "Risks": "Rizici", + "Log entry": "Unos u dnevnik", + "A short name for the entry": "Kratak naziv unosa", + "Project": "Projekat", + "The project this entry belongs to": "Projekat kojem ovaj unos pripada", + "What kind of entry this is": "Koja je ovo vrsta unosa", + "When it happened": "Kada se desilo", + "What happened, in Markdown": "Šta se desilo, u Markdownu", + "Whether an issue is still open": "Da li je problem još otvoren", + "The people at a meeting": "Osobe na sastanku", + "Tasks that came out of this entry": "Zadaci proizašli iz ovog unosa", + "Add risk": "Dodaj rizik", + "Risk": "Rizik", + "Score": "Ocjena", + "Response": "Odgovor", + "Review date": "Datum pregleda", + "no longer on the project": "više nije na projektu", + "Edit {title}": "Uredi {title}", + "No risks recorded yet": "Još nema zabilježenih rizika", + "Add the first risk": "Dodaj prvi rizik", + "Medium": "Srednje", + "Mitigating": "Ublažava se", + "Occurred": "Nastupio", + "Avoid": "Izbjeći", + "Reduce": "Smanjiti", + "Transfer": "Prenijeti", + "Accept": "Prihvatiti", + "Highest open risks": "Najviši otvoreni rizici", + "No open risks": "Nema otvorenih rizika", + "Open the risk register": "Otvori registar rizika", + "Edit risk": "Uredi rizik", + "What could go wrong": "Šta može poći po zlu", + "Likelihood": "Vjerovatnoća", + "Impact": "Utjecaj", + "Score {score}": "Ocjena {score}", + "Countermeasures": "Protumjere", + "Could not save the risk. Please try again.": "Rizik nije moguće sačuvati. Pokušajte ponovo.", + "Risks by likelihood and impact": "Rizici po vjerovatnoći i utjecaju", + "Risk scale": "Skala rizika", + "The levels every project scores its risks on, and where low turns into medium and high": "Nivoi na kojima svaki projekat ocjenjuje svoje rizike, i gdje nisko prelazi u srednje i visoko", + "Number of levels": "Broj nivoa", + "Likelihood labels": "Oznake vjerovatnoće", + "Impact labels": "Oznake utjecaja", + "Level {level}": "Nivo {level}", + "Medium from score": "Srednje od ocjene", + "High from score": "Visoko od ocjene", + "Risk scale saved": "Skala rizika sačuvana", + "1 risk uses level {level}. Change it first.": "1 rizik koristi nivo {level}. Prvo ga promijenite.", + "{count} risks use level {level}. Change them first.": "Rizika koji koriste nivo {level}: {count}. Prvo ih promijenite.", + "Every level needs a label, and high must start above medium.": "Svaki nivo treba oznaku, a visoko mora početi iznad srednjeg.", + "The project this risk belongs to": "Projekat kojem ovaj rizik pripada", + "The cause and the effect, in Markdown": "Uzrok i posljedica, u Markdownu", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Slobodno grupisanje, npr. planiranje, budžet ili dobavljač", + "How likely it is, on the admin's risk scale": "Koliko je vjerovatno, na skali rizika administratora", + "How hard it would hit, on the admin's risk scale": "Koliko bi snažno pogodilo, na skali rizika administratora", + "Likelihood times impact, calculated by the server": "Vjerovatnoća puta utjecaj, izračunava server", + "Where the risk stands": "Gdje je rizik", + "The person who watches this risk": "Osoba koja prati ovaj rizik", + "How the project answers the risk": "Kako projekat odgovara na rizik", + "What is done to prevent it or soften it, in Markdown": "Šta se radi da se spriječi ili ublaži, u Markdownu", + "When to look at this risk again": "Kada ponovo pregledati ovaj rizik", + "Very low": "Vrlo nisko", + "Very high": "Vrlo visoko", + "All projects": "Svi projekti", + "Project status report": "Izvještaj o stanju projekta", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datirani izvještaj o tome kako projekt stoji s novcem, organizacijom, vremenom, informacijama, kvalitetom i rizikom (GROTIK aspekti), svaki s bilješkom.", + "The project this report is about": "Projekt na koji se izvještaj odnosi", + "Report date": "Datum izvještaja", + "The day the report describes": "Dan koji izvještaj opisuje", + "Money": "Novac", + "How the project stands on this aspect": "Kako projekt stoji u ovom aspektu", + "On track": "Prema planu", + "At risk": "Ugroženo", + "Off track": "Izvan plana", + "Money note": "Bilješka o novcu", + "A short explanation of this status": "Kratko objašnjenje ovog stanja", + "Organisation": "Organizacija", + "Organisation note": "Bilješka o organizaciji", + "Time": "Vrijeme", + "Time note": "Bilješka o vremenu", + "Information": "Informacije", + "Information note": "Bilješka o informacijama", + "Quality": "Kvalitet", + "Quality note": "Bilješka o kvalitetu", + "Risk note": "Bilješka o riziku", + "Overall": "Ukupno", + "The worst of the six statuses, calculated by the server": "Najlošije od šest stanja, izračunava ga server", + "Health: money": "Stanje: novac", + "Copied from the newest status report": "Preuzeto iz najnovijeg izvještaja o stanju", + "Health: organisation": "Stanje: organizacija", + "Health: time": "Stanje: vrijeme", + "Health: information": "Stanje: informacije", + "Health: quality": "Stanje: kvalitet", + "Health: risk": "Stanje: rizik", + "Health: overall": "Stanje: ukupno", + "Health: report date": "Stanje: datum izvještaja", + "The date of the newest status report": "Datum najnovijeg izvještaja o stanju", + "New report": "Novi izvještaj", + "Only the project owner writes status reports.": "Izvještaje o stanju piše samo vlasnik projekta.", + "Latest report, {date}": "Posljednji izvještaj, {date}", + "Aspect": "Aspekt", + "Note": "Bilješka", + "Report history": "Historija izvještaja", + "Author": "Autor", + "No status reports yet": "Još nema izvještaja o stanju", + "Write the first report": "Napiši prvi izvještaj", + "Choose a status for every aspect to save the report.": "Za spremanje izvještaja odaberite stanje za svaki aspekt.", + "Suggested: on track.": "Prijedlog: prema planu.", + "Suggested: at risk.": "Prijedlog: ugroženo.", + "Suggested: off track.": "Prijedlog: izvan plana.", + "1 task is past its due date.": "1 zadatak je prekoračio rok.", + "{count} tasks are past their due date.": "Zadaci koji su prekoračili rok: {count}.", + "The end date has passed with 1 open task.": "Datum završetka je prošao s 1 otvorenim zadatkom.", + "The end date has passed with {count} open tasks.": "Datum završetka je prošao, otvoreni zadaci: {count}.", + "No open task is past its due date.": "Nijedan otvoreni zadatak nije prekoračio rok.", + "The highest open risk, \"{title}\", scores {score}.": "Najveći otvoreni rizik, \"{title}\", ima ocjenu {score}.", + "There are no open risks.": "Nema otvorenih rizika.", + "Costs are at {percent}% of the budget.": "Troškovi su na {percent}% budžeta.", + "No suggestion: the project has no budget.": "Nema prijedloga: projekt nema budžet.", + "No suggestion: no costs are recorded for this project yet.": "Nema prijedloga: za ovaj projekt još nisu zabilježeni troškovi.", + "The report was not saved. Only the project owner can write status reports.": "Izvještaj nije spremljen. Izvještaje o stanju može pisati samo vlasnik projekta.", + "No report": "Nema izvještaja", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Grupa projekata koje vode isti ljudi, na primjer odjel ili program. Njeni voditelji čitaju svaki projekt u njoj.", + "The name of the portfolio": "Naziv portfolija", + "What the portfolio holds and who runs it": "Šta portfolio sadrži i ko ga vodi", + "A colour for the portfolio's section in project lists": "Boja odjeljka portfolija u listama projekata", + "Managers": "Voditelji", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud korisnički ID-ovi ljudi koji vode portfolio", + "Order": "Redoslijed", + "Where the portfolio comes in project lists, lowest first": "Gdje je portfolio u listama projekata, najniži prvi", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Vlastita skala rizika ovog portfolija kao JSON, u istom obliku kao skala cijele aplikacije. Prazno znači skalu aplikacije.", + "Portfolio readers": "Čitaoci portfolija", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud korisnički ID-ovi voditelja portfolija projekta", + "The portfolio this project belongs to": "Portfolio kojem ovaj projekt pripada", + "No portfolio": "Bez portfolija", + "All portfolios": "Svi portfoliji", + "You read this project as a manager of its portfolio. Only its members change it.": "Ovaj projekt čitate kao voditelj njegovog portfolija. Mijenjaju ga samo njegovi članovi.", + "Portfolios": "Portfoliji", + "Portfolio status": "Stanje portfelja", + "No portfolios yet": "Još nema portfelja", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administrator dodaje portfelje u Projekti, Portfelji. Projekti u portfelju ovdje su navedeni sa svojim stanjem.", + "Roll-up": "Sažetak", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} prema planu, {atRisk} ugroženo, {offTrack} izvan plana, {noReport} bez izvještaja", + "No project in this portfolio that you can read.": "U ovom portfelju nema projekta koji možete čitati.", + "Start": "Početak", + "End": "Kraj", + "Budget": "Budžet", + "Last report": "Zadnji izvještaj", + "Out of date": "Zastarjelo", + "Portfolio timeline": "Vremenska linija portfelja", + "Zoom": "Zumiranje", + "Could not load the timeline": "Vremensku liniju nije moguće učitati", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administrator dodaje portfelje u Projekti, Portfelji. Projekti u portfelju ovdje su na jednoj vremenskoj liniji.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Otvorite projekat da vidite njegove faze i zadatke. Vremenska linija je samo za čitanje.", + "Phase: {title}": "Faza: {title}", + "Left out because you cannot read them: {count} projects": "Izostavljeno jer ih ne možete čitati: {count} projekata", + "Week": "Sedmica", + "Day": "Dan", + "Month": "Mjesec", + "Please try again later.": "Pokušajte ponovo kasnije.", + "Status reports": "Izvještaji o stanju", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Nakon koliko dana se zadnji izvještaj o stanju projekta u pregledu portfelja označava kao zastario", + "Reporting period (days)": "Period izvještavanja (dani)", + "The reporting period is a whole number of days from 1 to 365.": "Period izvještavanja je cijeli broj dana od 1 do 365.", + "Reporting period saved": "Period izvještavanja sačuvan", + "The reporting period was not saved. Please try again.": "Period izvještavanja nije sačuvan. Pokušajte ponovo.", + "Every project of a portfolio with its status per aspect, rolled up.": "Svaki projekat portfelja sa stanjem po aspektima, sažeto.", + "The projects of a portfolio on one timeline.": "Projekti portfelja na jednoj vremenskoj liniji.", + "Phases": "Faze", + "Add phase": "Dodaj fazu", + "No phases yet": "Još nema faza", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Podijelite projekat u faze, npr. pokretanje, definiciju i realizaciju. Faza se zatvara kad se učita njen završni dokument.", + "{hours} hours": "{hours} sati", + "Concluding document: {title}": "Završni dokument: {title}", + "Concluding document missing": "Nedostaje završni dokument", + "Move {title} up": "Pomjeri {title} gore", + "Move {title} down": "Pomjeri {title} dolje", + "Close phase": "Zatvori fazu", + "Phase": "Faza", + "Files": "Datoteke", + "Notes": "Bilješke", + "Audit trail": "Revizijski trag", + "Edit phase": "Uredi fazu", + "Name": "Naziv", + "Budget hours": "Planirani sati", + "Could not save the phase. Please try again.": "Fazu nije moguće sačuvati. Pokušajte ponovo.", + "Close phase {title}": "Zatvori fazu {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Faza se zatvara završnim dokumentom: učitajte ga ovdje ili odaberite jednu od datoteka faze.", + "Concluding document": "Završni dokument", + "This phase has no files yet.": "Ova faza još nema datoteka.", + "Upload a document": "Učitaj dokument", + "The document was not uploaded. Please try again.": "Dokument nije učitan. Pokušajte ponovo.", + "Upload the concluding document before you close this phase.": "Učitajte završni dokument prije zatvaranja ove faze.", + "This phase cannot be closed from its current status.": "Ova faza se ne može zatvoriti iz trenutnog stanja.", + "The phase was not closed. Please try again.": "Faza nije zatvorena. Pokušajte ponovo.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID datoteke ove faze koja je zatvara. Faza se može završiti tek kad je postavljen i datoteka je priložena.", + "Import from Microsoft Project": "Uvezi iz Microsoft Projecta", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Odaberite plan sačuvan iz Microsoft Projecta u XML formatu. Ništa se ne uvozi dok ne potvrdite.", + "Plan file": "Datoteka plana", + "What the import creates": "Šta uvoz kreira", + "Tasks": "Zadaci", + "Sub-tasks": "Podzadaci", + "Milestones": "Prekretnice", + "Links": "Veze", + "Already imported, updated in place: {count}": "Već uvezeno, ažurirano na mjestu: {count}", + "What does not carry over": "Šta se ne prenosi", + "Tasks with resources, which are not imported: {count}": "Zadaci s resursima, koji se ne uvoze: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Zadaci dublje od nivoa 3, smješteni pod svoj zadatak nivoa 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Veze osim kraj-početak, uvezene kao povezane veze: {count}", + "Link lags, which are dropped: {count}": "Kašnjenja veza, koja se odbacuju: {count}", + "Links to a summary task, which are not imported: {count}": "Veze prema zbirnom zadatku, koje se ne uvoze: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Veze prema zadacima izvan ovog plana, koje se ne uvoze: {count}", + "No longer in the plan": "Više nije u planu", + "These stay in the project; remove them yourself if they are no longer needed.": "Ostaju u projektu; uklonite ih sami ako više nisu potrebni.", + "Import": "Uvezi", + "Close": "Zatvori", + "The plan is imported: {created} created, {updated} updated.": "Plan je uvezen: kreirano {created}, ažurirano {updated}.", + "Links that would close a loop were left out: {count}": "Veze koje bi zatvorile petlju izostavljene su: {count}", + "The import stopped part-way. Run it again to finish it.": "Uvoz je stao na pola puta. Pokrenite ga ponovo da ga završite.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Sačuvajte plan u Microsoft Projectu putem Datoteka, Sačuvaj kao, XML format, i uvezite tu datoteku.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ova datoteka deklariše DOCTYPE ili entitete, koji se ne prihvataju.", + "The file is larger than 10 MB.": "Datoteka je veća od 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plan ima više od 2.000 zadataka, više nego što jedan uvoz prima.", + "This file is not a Microsoft Project plan in XML format.": "Ova datoteka nije plan Microsoft Projecta u XML formatu.", + "Choose a file to import.": "Odaberite datoteku za uvoz.", + "Only the project owner can import a plan.": "Samo vlasnik projekta može uvesti plan.", + "The plan could not be read. Please try again.": "Plan nije moguće pročitati. Pokušajte ponovo.", + "Linked case: {title}": "Povezani predmet: {title}", + "Linked to a case": "Povezano s predmetom", + "Hand over to case": "Predaj predmetu", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Nepromijenjeno kopira svaku datoteku projekta i njegovih zadataka te datoteku koja opisuje projekt u povezani predmet.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopirane datoteke: {count}", + "Files that failed: {names}": "Neuspjele datoteke: {names}", + "The handover failed. Please try again.": "Predaja nije uspjela. Pokušajte ponovo.", + "The linked case could not be found, or you cannot open it.": "Povezani predmet nije pronađen ili ga ne možete otvoriti.", + "Case handovers": "Predaje predmetu", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Svaka predaja datoteka i metapodataka projekta njegovom predmetu: kada, ko, kojem predmetu, svaka kopirana datoteka s njenim SHA-256 i neuspjele datoteke.", + "Finance": "Finansije", + "Add cost line": "Dodaj stavku troška", + "Delivery terms": "Uslovi isporuke", + "Billing model": "Model naplate", + "Budget in euro": "Budžet u eurima", + "Budget in hours": "Budžet u satima", + "Hourly rate in euro": "Satnica u eurima", + "Planned start": "Planirani početak", + "Planned end": "Planirani završetak", + "Planned dates": "Planirani datumi", + "Budget {amount}": "Budžet {amount}", + "No budget agreed": "Budžet nije dogovoren", + "Hours": "Sati", + "Only the project owner and the portfolio managers see the amounts.": "Iznose vide samo vlasnik projekta i upravitelji portfolija.", + "Budget against cost per category": "Budžet naspram troškova po kategoriji", + "Labour (booked time)": "Rad (evidentirani sati)", + "No category": "Bez kategorije", + "Hours are not available": "Sati nisu dostupni", + "Not yet assigned to a category": "Još nije dodijeljeno kategoriji", + "Total": "Ukupno", + "{spent} spent, {remaining} remaining": "{spent} potrošeno, {remaining} preostalo", + "Budget against cost per phase": "Budžet naspram troškova po fazi", + "No phase": "Bez faze", + "Cost lines": "Stavke troška", + "From the finance system": "Iz finansijskog sistema", + "Edit cost line {amount}": "Uredi stavku troška {amount}", + "No cost lines yet": "Još nema stavki troška", + "Commitments": "Obaveze", + "Actual cost": "Stvarni trošak", + "Forecast": "Prognoza", + "Remaining": "Preostalo", + "Not planned yet": "Još nije planirano", + "{start} to {end}": "{start} do {end}", + "The terms were not saved. Please try again.": "Uslovi nisu sačuvani. Pokušajte ponovo.", + "Terms saved": "Uslovi sačuvani", + "Fixed price": "Fiksna cijena", + "Hourly": "Po satu", + "Not billed": "Ne naplaćuje se", + "Commitment": "Obaveza", + "Edit cost line": "Uredi stavku troška", + "Kind": "Vrsta", + "Amount in euro": "Iznos u eurima", + "Remove": "Ukloni", + "Could not save the cost line. Only the project owner changes the money of a project.": "Stavku troška nije moguće sačuvati. Novac projekta mijenja samo vlasnik projekta.", + "Could not remove the cost line. Please try again.": "Stavku troška nije moguće ukloniti. Pokušajte ponovo.", + "{amount} over budget": "{amount} iznad budžeta", + "Cost categories": "Kategorije troškova", + "The categories every project splits its budget and costs into, one per line": "Kategorije na koje svaki projekat dijeli svoj budžet i troškove, jedna po redu", + "Categories": "Kategorije", + "Give at least one category, each name once.": "Navedite barem jednu kategoriju, svaki naziv jednom.", + "Cost categories saved": "Kategorije troškova sačuvane", + "The cost categories were not saved. Please try again.": "Kategorije troškova nisu sačuvane. Pokušajte ponovo.", + "Finance line": "Finansijska stavka", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Jedan novčani iznos projekta: budžet, obaveza, stvarni trošak ili prognoza, u kategoriji troškova i po želji u fazi. Unosi je vlasnik projekta ili je šalje finansijski sistem putem aplikacije za integraciju.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekat kojem iznos pripada. Prazno za stavku iz finansijskog sistema čiji broj projekta ne odgovara nijednom projektu.", + "The phase this amount belongs to, if any": "Faza kojoj iznos pripada, ako postoji", + "The cost category, one of the categories the admin set up": "Kategorija troškova, jedna od kategorija koje je postavio administrator", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Da li je iznos budžet, obaveza, stvarni trošak ili prognoza", + "Amount": "Iznos", + "The amount in the reporting currency (euro)": "Iznos u izvještajnoj valuti (euro)", + "The date the amount was booked or is expected": "Datum kada je iznos knjižen ili se očekuje", + "What the amount is for": "Za šta je iznos", + "Whether a person entered the line or the finance system sent it": "Da li je stavku unijela osoba ili ju je poslao finansijski sistem", + "Entered by hand": "Uneseno ručno", + "Finance line id": "Id finansijske stavke", + "The finance system's own id of this line. One imported line per id.": "Vlastiti id ove stavke u finansijskom sistemu. Jedna uvezena stavka po id-u.", + "Project number": "Broj projekta", + "The project number the finance system sent, matched against the project key": "Broj projekta koji je poslao finansijski sistem, upoređen s ključem projekta", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfolio projekta stavke, preuzet s projekta da bi zbirovi portfolija trebali jedan filter", + "Finance readers": "Čitaoci finansija", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-ovi korisnika Nextclouda koji smiju vidjeti ovaj iznos: vlasnik projekta i upravitelji njegovog portfolija", + "Project owner": "Vlasnik projekta", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID korisnika Nextclouda vlasnika projekta, koji smije mijenjati i uklanjati ručne stavke", + "How the client pays: not billed, a fixed price, or by the hour.": "Kako klijent plaća: ne naplaćuje se, fiksna cijena ili po satu.", + "Portfolio finance": "Finansije portfolija", + "You cannot see the money of any project in this portfolio": "Ne možete vidjeti novac nijednog projekta u ovom portfoliju", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Server je vratio stavke troška projekata izvan ovog portfolija, pa ovi zbirovi mogu biti pogrešni.", + "Projects left out because you cannot see their money: {count}": "Izostavljeni projekti jer ne možete vidjeti njihov novac: {count}", + "Unmatched finance lines": "Nepovezane finansijske stavke", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budžet, obaveze, stvarni trošak i prognoza sabrani za portfolio.", + "Subprojects": "Potprojekti", + "{done} of {total}": "{done} od {total}", + "{done} of {total} tasks done, including subprojects": "{done} od {total} zadataka završeno, uključujući potprojekte", + "Show the subprojects of {title}": "Prikaži potprojekte {title}", + "Hide the subprojects of {title}": "Sakrij potprojekte {title}", + "Part of": "Dio", + "No parent project": "Bez nadređenog projekta", + "A project cannot sit under one of its own subprojects.": "Projekat ne može biti ispod jednog od svojih potprojekata.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekti se ugnježđuju najviše tri nivoa duboko: program, projekat i potprojekat.", + "Parent project": "Nadređeni projekat", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekat ispod kojeg je ovaj projekat, npr. program. Projekti se ugnježđuju najviše tri nivoa duboko.", + "Yes": "Da", + "No": "Ne", + "{label} (required)": "{label} (obavezno)", + "{label} is required": "{label} je obavezno", + "Project field": "Polje projekta", + "A field an admin adds to every project, such as a policy area or a contract value.": "Polje koje administrator dodaje svakom projektu, npr. oblast politike ili vrijednost ugovora.", + "Key": "Ključ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stalni naziv pod kojim se vrijednost čuva, u lower camel case. Zadržite ga kad ga projekti koriste.", + "Label": "Oznaka", + "The name people see next to the field": "Naziv koji ljudi vide pored polja", + "What the field holds": "Šta polje sadrži", + "Text": "Tekst", + "Number": "Broj", + "Choice": "Izbor", + "Person": "Osoba", + "Yes or no": "Da ili ne", + "Options": "Opcije", + "The choices of a choice field": "Opcije polja izbora", + "Required": "Obavezno", + "Whether a project must fill in the field": "Da li projekat mora popuniti polje", + "Where the field appears, lowest first": "Gdje se polje pojavljuje, najniže prvo", + "Applies to": "Važi za", + "What the field is added to": "Čemu se polje dodaje", + "Custom fields": "Vlastita polja", + "The values of the project fields an admin defined, keyed by the field's key.": "Vrijednosti polja projekta koja je definirao administrator, prema ključu polja.", + "Project fields": "Polja projekta", + "Related": "Povezano", + "Remove link": "Ukloni vezu", + "Link type": "Vrsta veze", + "Relates to": "Povezano sa", + "Duplicates": "Duplicira", + "Project key": "Ključ projekta", + "Every task number starts with it, such as VERG-42.": "Svaki broj zadatka počinje njime, na primjer VERG-42.", + "This key is already used by another project.": "Ovaj ključ već koristi drugi projekat.", + "Use 2 to 10 letters and digits, starting with a letter.": "Koristite od 2 do 10 slova i cifara, počevši slovom.", + "The key cannot change once tasks carry it.": "Ključ se ne može promijeniti kada ga zadaci nose.", + "Project saved. The existing tasks get their numbers in the background.": "Projekat je sačuvan. Postojeći zadaci dobijaju brojeve u pozadini.", + "Next task number": "Broj sljedećeg zadatka", + "The number the next task of this project gets in its key. Only the system writes it.": "Broj koji sljedeći zadatak ovog projekta dobija u svom ključu. Upisuje ga samo sistem.", + "Restore {title}": "Vrati {title}", + "Restore": "Vrati", + "Project restored": "Projekat je vraćen", + "Could not restore the project": "Projekat nije moguće vratiti", + "Bring this project back to the active list.": "Vrati ovaj projekat na listu aktivnih projekata.", + "Restore project": "Vrati projekat", + "Request reason": "Razlog zahtjeva", + "Why the requester needs this project. Filled in when the project is requested.": "Zašto podnosiocu treba ovaj projekat. Popunjava se pri zahtjevu.", + "Reviewed by": "Pregledao", + "The user who approved or rejected the request.": "Korisnik koji je odobrio ili odbio zahtjev.", + "Reviewed at": "Pregledano", + "When the request was approved or rejected.": "Kada je zahtjev odobren ili odbijen.", + "Review note": "Napomena pregledača", + "The reviewer's reason, shown to the requester when a request is not approved.": "Razlog pregledača koji podnosilac vidi kada zahtjev nije odobren.", + "Members of these groups": "Članovi ovih grupa", + "Groups that may create projects": "Grupe koje smiju kreirati projekte", + "The group {group} no longer exists. Save to remove it.": "Grupa {group} više ne postoji. Sačuvajte da je uklonite.", + "Review project request": "Pregledaj zahtjev za projekat", + "Requested by": "Zatražio", + "Why it is needed": "Zašto je potreban", + "Desired start date": "Željeni datum početka", + "Why is it not approved?": "Zašto nije odobren?", + "Give a reason. The requester sees it.": "Navedite razlog. Podnosilac će ga vidjeti.", + "Approve": "Odobri", + "Reject": "Odbij", + "Reject request": "Odbij zahtjev", + "The review was not saved. Try again.": "Pregled nije sačuvan. Pokušajte ponovo.", + "This project is waiting for review": "Ovaj projekat čeka pregled", + "This request was not approved": "Ovaj zahtjev nije odobren", + "Reason: {note}": "Razlog: {note}", + "Review request": "Pregledaj zahtjev", + "Request a project": "Zatraži projekat", + "Step {step} of 2": "Korak {step} od 2", + "Why is this project needed?": "Zašto je ovaj projekat potreban?", + "Give a reason. The reviewer reads it.": "Navedite razlog. Pregledač će ga pročitati.", + "Back": "Nazad", + "Next": "Dalje", + "Send request": "Pošalji zahtjev", + "The request was not sent. Try again.": "Zahtjev nije poslan. Pokušajte ponovo.", + "Requested": "Zatraženo", + "Not approved": "Nije odobreno", + "Your request was sent": "Vaš zahtjev je poslan", + "Let everyone else request a project": "Dozvoli svima ostalima da zatraže projekat", + "Add a task": "Dodaj zadatak", + "Delete task": "Izbriši zadatak", + "Edit task": "Uredi zadatak", + "Write": "Piši", + "Preview": "Pregled", + "Markdown works here: headings, lists and links.": "Ovdje radi Markdown: naslovi, liste i linkovi.", + "Could not save the task. Please try again.": "Zadatak nije moguće sačuvati. Pokušajte ponovo.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Na zadatku \"{title}\" je evidentirano vrijeme pa se ne može izbrisati. Umjesto toga ga možete otkazati: zapisi vremena ostaju.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Izbrisati \"{title}\"? Uklonit će se i njegove veze s drugim zadacima. Ovo se ne može poništiti.", + "Keep task": "Zadrži zadatak", + "Cancel task": "Otkaži zadatak", + "Only the reporter, the project owner or an admin can delete this task.": "Ovaj zadatak može izbrisati samo prijavilac, vlasnik projekta ili administrator.", + "Could not delete the task. Please try again.": "Zadatak nije moguće izbrisati. Pokušajte ponovo.", + "Could not cancel the task. Please try again.": "Zadatak nije moguće otkazati. Pokušajte ponovo.", + "Responsible": "Odgovorna osoba", + "Also working on this": "Na ovome rade i", + "Labels": "Oznake", + "Could not change the priority. Please try again.": "Prioritet nije moguće promijeniti. Pokušajte ponovo.", + "Other project members who work on this task alongside the person responsible.": "Ostali članovi projekta koji na ovom zadatku rade zajedno s odgovornom osobom.", + "Duplicate": "Dupliciraj", + "Could not copy the task. Please try again.": "Zadatak nije moguće kopirati. Pokušajte ponovo.", + "Subtasks": "Podzadaci", + "{done} of {total} done": "Gotovo {done} od {total}", + "Add a subtask": "Dodaj podzadatak", + "Checklist": "Kontrolna lista", + "Checklist item actions": "Radnje stavke liste", + "Add a checklist item": "Dodaj stavku liste", + "Subtasks: {estimate} estimated, {logged} logged": "Podzadaci: procjena {estimate}, evidentirano {logged}", + "Total estimate: {total}": "Ukupna procjena: {total}", + "Part of {title}": "Dio zadatka {title}", + "Checklist: {count} done": "Kontrolna lista: gotovo {count}", + "This task has subtasks: {count}.": "Ovaj zadatak ima podzadatke: {count}.", + "Keep subtasks as separate tasks": "Zadrži podzadatke kao zasebne zadatke", + "Delete subtasks too": "Izbriši i podzadatke", + "Copy of {title}": "Kopija: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Zadatak je kopiran, ali ne i svi njegovi podzadaci. Provjerite kopiju.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Mali koraci unutar zadatka. Svaka stavka ima id, tekst i podatak da li je gotova.", + "Open work per person and per project.": "Otvoreni posao po osobi i po projektu.", + "View": "Prikaz", + "By person": "Po osobi", + "By project": "Po projektu", + "Hours left": "Preostali sati", + "Tasks without an estimate": "Zadaci bez procjene", + "Due in 14 days": "Rok u 14 dana", + "Shared": "Dijeljeno", + "Unassigned": "Nedodijeljeno", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Prikazuje se posao u projektima koje možete vidjeti. Sati se računaju odgovornoj osobi; dijeljeni zadaci računaju se bez sati.", + "No open work in these projects.": "Nema otvorenog posla u ovim projektima.", + "Open work": "Otvoreni posao", + "{count} open tasks": "{count} otvorenih zadataka", + "Create a project to see capacity here.": "Kreirajte projekat da biste ovdje vidjeli kapacitet.", + "My tasks": "Moji zadaci", + "Show all my tasks": "Prikaži sve moje zadatke", + "No tasks assigned to you": "Nemate dodijeljenih zadataka", + "Browse projects": "Pregledaj projekte", + "Later": "Kasnije", + "Due {date}": "Rok {date}", + "Could not change the status. Please try again.": "Status nije moguće promijeniti. Pokušajte ponovo.", + "Completed today": "Završeno danas", + "My open tasks": "Moji otvoreni zadaci", + "My overdue tasks": "Moji zakašnjeli zadaci", + "My tasks in progress": "Moji zadaci u toku", + "Pin to the top": "Zakači na vrh", + "Unpin": "Otkači", + "Pinned": "Zakačeno", + "Actions for {title}": "Radnje za {title}", + "Could not save your project order. Please try again.": "Redoslijed projekata nije moguće sačuvati. Pokušajte ponovo.", + "No boards yet": "Još nema ploča", + "Create a project to get a board.": "Kreirajte projekat da biste dobili ploču.", + "Use the Projects page to create and manage your projects and tasks.": "Na stranici Projekti kreirajte i upravljajte svojim projektima i zadacima.", + "Go to projects": "Idi na projekte", + "You are not a member of any projects yet.": "Još niste član nijednog projekta.", + "Could not search for users. Please try again.": "Pretraga korisnika nije uspjela. Pokušajte ponovo.", + "Project creation is restricted to administrators.": "Projekte mogu kreirati samo administratori.", + "Only the project owner or an administrator can delete this project.": "Ovaj projekat može izbrisati samo vlasnik projekta ili administrator.", + "No projects are available to you yet. Ask an administrator to create one.": "Još nemate dostupnih projekata. Zamolite administratora da kreira jedan.", + "Due: {date}": "Rok: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Zadaci s datumom početka ili rokom prikazuju se na vremenskoj liniji. Dodajte datume da biste ih ovdje vidjeli.", + "You do not have access to this project.": "Nemate pristup ovom projektu.", + "Zoom level": "Nivo zumiranja", + "Unscheduled": "Neplanirano", + "Start: {date}": "Početak: {date}", + "Today": "Danas", + "No scheduled tasks": "Nema planiranih zadataka", + "An unexpected error occurred.": "Došlo je do neočekivane greške.", + "Column {number} name": "Naziv kolone {number}", + "Failed to save creation policy": "Pravilo kreiranja nije moguće sačuvati", + "All authenticated users": "Svi prijavljeni korisnici", + "Control who may create new projects": "Odredite ko smije kreirati nove projekte", + "Administrators only": "Samo administratori", + "Project creation": "Kreiranje projekata", + "Allow project creation": "Dozvoli kreiranje projekata", + "Creation policy saved successfully": "Pravilo kreiranja sačuvano", + "Initializing…": "Pokretanje…", + "e.g. 2h 30m, 90m, 1.5h": "npr. 2h 30m, 90m, 1.5h", + "Log time": "Upiši vrijeme", + "Save estimate": "Sačuvaj procjenu", + "Logged: {logged}": "Upisano: {logged}", + "over by {amount}": "prekoračeno za {amount}", + "Time tracking": "Evidencija vremena", + "Estimate": "Procjena", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Unesite ispravnu procjenu (npr. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Unesite ispravno trajanje (npr. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Unos vremena nije moguće sačuvati. Pokušajte ponovo.", + "Edit time entry": "Uredi unos vremena", + "Duration": "Trajanje", + "Date range": "Period", + "Last week": "Prošla sedmica", + "No time logged": "Nema upisanog vremena", + "Log time on a task to see it here.": "Upišite vrijeme na zadatak da biste ga ovdje vidjeli.", + "To date": "Do datuma", + "This week": "Ova sedmica", + "Total: {total}": "Ukupno: {total}", + "From date": "Od datuma", + "Custom range": "Prilagođeni period", + "All time": "Cijelo vrijeme", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Zadatak nije moguće izbrisati pa podaci mogu ostati. Ponovo izbrišite projekat.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Unos vremena nije moguće izbrisati pa podaci mogu ostati. Ponovo izbrišite projekat.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Kolonu nije moguće izbrisati pa podaci mogu ostati. Ponovo izbrišite projekat.", + "Could not delete the project. Please try again.": "Projekat nije moguće izbrisati. Pokušajte ponovo.", + "Notification settings": "Postavke obavještenja", + "Configure when due-date reminders are sent": "Odredite kada se šalju podsjetnici na rokove", + "Due-date reminder lead time (hours)": "Vrijeme podsjetnika prije roka (sati)", + "Lead time must be between 1 and 336 hours": "Vrijeme mora biti između 1 i 336 sati", + "Reminder lead time saved successfully": "Vrijeme podsjetnika sačuvano", + "Failed to save reminder lead time": "Vrijeme podsjetnika nije moguće sačuvati", + "Notifications": "Obavještenja", + "Notify me 1 day before a task's due date": "Obavijesti me 1 dan prije roka zadatka", + "Draft": "Nacrt", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Da li je čas nacrt koji vidi samo njegov nastavnik, održava li se ili je otkazan.", + "New release": "Novo izdanje", + "Roadmap chart. The same releases and epics are listed below.": "Grafikon plana razvoja. Ista izdanja i epovi navedeni su ispod.", + "Nothing on the roadmap yet": "Još ništa na planu razvoja", + "Releases with a target date and epics with dated tasks appear here.": "Ovdje se prikazuju izdanja s ciljnim datumom i epovi sa zadacima koji imaju datum.", + "Releases": "Izdanja", + "No releases yet": "Još nema izdanja", + "Target date: {date}": "Ciljni datum: {date}", + "No target date": "Nema ciljnog datuma", + "Edit {name}": "Uredi {name}", + "Mark {name} as released": "Označi {name} kao objavljeno", + "Mark as released": "Označi kao objavljeno", + "Epics": "Epovi", + "No epics yet. Open a task to make it an epic.": "Još nema epova. Otvorite zadatak da ga pretvorite u ep.", + "Not scheduled yet": "Još nije zakazano", + "Planned": "Planirano", + "Released": "Objavljeno", + "Edit release": "Uredi izdanje", + "Target date": "Ciljni datum", + "Could not save the release. Please try again.": "Izdanje nije moguće sačuvati. Pokušajte ponovo.", + "Every task of this release is done or cancelled.": "Svaki zadatak ovog izdanja je završen ili otkazan.", + "Not finished yet: {count}": "Još nije završeno: {count}", + "What happens to these tasks?": "Šta se dešava s ovim zadacima?", + "Move to {name}": "Premjesti u {name}", + "Remove the release": "Ukloni izdanje", + "Keep it on {name}": "Ostavi ih u {name}", + "Could not mark the release as released. Please try again.": "Izdanje nije moguće označiti kao objavljeno. Pokušajte ponovo.", + "Roadmap": "Plan razvoja", + "Tasks or roadmap": "Zadaci ili plan razvoja", + "Release": "Izdanje", + "Epic": "Ep", + "This task is an epic": "Ovaj zadatak je ep", + "A named, dated delivery of a project that its tasks are planned against.": "Imenovana isporuka projekta s datumom prema kojoj se planiraju njegovi zadaci.", + "Name of the release": "Naziv izdanja", + "The project this release belongs to": "Projekat kojem pripada ovo izdanje", + "What this release delivers": "Šta ovo izdanje isporučuje", + "When work on the release starts": "Kada počinje rad na izdanju", + "The date the release is due": "Datum do kojeg izdanje treba biti gotovo", + "Whether the release is planned, released or archived": "Da li je izdanje planirano, objavljeno ili arhivirano", + "Released on": "Objavljeno", + "When the release was marked as released": "Kada je izdanje označeno kao objavljeno", + "The release this task is planned for": "Izdanje za koje je ovaj zadatak planiran", + "Board view options": "Opcije prikaza ploče", + "Colour cards": "Oboji kartice", + "No colour": "Bez boje", + "By label": "Po oznaci", + "Swimlanes": "Staze", + "No swimlanes": "Bez staza", + "By assignee": "Po zaduženoj osobi", + "By epic": "Po epicu", + "No assignee": "Nije dodijeljeno", + "No epic": "Bez epica", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartice ostaju u redu svog epica. Promijenite epic na stranici zadatka.", + "Hand over to": "Predaj osobi", + "Could not save your board view. It applies until you reload.": "Prikaz ploče nije sačuvan. Vrijedi dok ponovo ne učitate stranicu.", + "Timetable wish": "Želja za raspored", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Želja koju generator uzima u obzir. Čvrstu želju uvijek poštuje, meku gdje može.", + "Whether the wish is about a teacher, a group, a room or one activity": "Da li se želja odnosi na nastavnika, grupu, prostoriju ili jednu aktivnost", + "Teacher": "Nastavnik", + "Group": "Grupa", + "Reference": "Referenca", + "The user, group, room or activity the wish is about": "Korisnik, grupa, prostorija ili aktivnost na koju se želja odnosi", + "What the wish asks for": "Šta želja traži", + "Not on these periods": "Ne u ovim časovima", + "Preferably not on these periods": "Radije ne u ovim časovima", + "At most a number of lessons a day": "Najviše određen broj časova dnevno", + "No free periods between lessons": "Bez rupa između časova", + "Always the same room": "Uvijek ista prostorija", + "Periods": "Časovi", + "The periods of the week the wish is about, such as wed-5": "Časovi u sedmici na koje se želja odnosi, npr. wed-5", + "Limit": "Granica", + "The most lessons a day, for a wish of that kind": "Najviše časova dnevno, za želju te vrste", + "Strength": "Jačina", + "Whether the generator must keep the wish or should keep it": "Da li generator mora ili bi trebao poštovati želju", + "Hard": "Čvrsta", + "Soft": "Meka", + "Weight": "Težina", + "How much a soft wish counts, from 1 to 3": "Koliko meka želja vrijedi, od 1 do 3", + "Why the wish exists": "Zašto želja postoji", + "Timetable scenario": "Scenarij rasporeda", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jedan sedmični obrazac, koji je napravio generator ili je preuzet iz trenutnog rasporeda. Čuva svoj ulaz i koliko dobro poštuje želje.", + "The name timetablers know the scenario by": "Naziv pod kojim sastavljači rasporeda znaju scenarij", + "Whether the generator made it or it came from the current timetable": "Da li ga je napravio generator ili dolazi iz trenutnog rasporeda", + "Generated": "Generisano", + "From the current timetable": "Iz trenutnog rasporeda", + "Week of": "Sedmica od", + "The Monday of the first week of the window": "Ponedjeljak prve sedmice perioda", + "Window start": "Početak perioda", + "The first day the week pattern applies to": "Prvi dan na koji se sedmični obrazac odnosi", + "Window end": "Kraj perioda", + "The last day the week pattern applies to": "Zadnji dan na koji se sedmični obrazac odnosi", + "Waiting, generating, done, failed, or published as draft lessons": "Čeka, generiše se, gotovo, neuspjelo ili objavljeno kao nacrti časova", + "Waiting": "Čeka", + "Generating": "Generiše se", + "Failed": "Neuspjelo", + "Published": "Objavljeno", + "Seed": "Sjeme", + "The number the generator starts from, so a run can be repeated": "Broj od kojeg generator kreće, kako bi se pokretanje moglo ponoviti", + "Input": "Ulaz", + "The periods, rooms, lessons and wishes the scenario was made from": "Časovi, prostorije, predavanja i želje od kojih je nastao scenarij", + "Placements": "Smještaji", + "Each lesson with the period and room it was given": "Svaki čas sa terminom i prostorijom koje je dobio", + "Unplaced lessons": "Nesmješteni časovi", + "Lessons without a place, each with the hard wish that blocked it": "Časovi bez mjesta, svaki sa čvrstom željom koja ga je zaustavila", + "Broken wishes": "Prekršene želje", + "The wishes this scenario breaks, with the lessons that break them": "Želje koje ovaj scenarij krši, sa časovima koji ih krše", + "Measures": "Mjere", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Smješteni časovi, prekršene želje, rupe nastavnika, časovi dnevno i korištenje prostorija", + "Reason": "Razlog", + "Why the run failed": "Zašto pokretanje nije uspjelo", + "Published at": "Objavljeno", + "When the scenario was written out as draft lessons": "Kada je scenarij zapisan kao nacrti časova", + "Edit wish": "Uredi želju", + "New wish": "Nova želja", + "Hard: the generator always keeps it": "Obavezno: generator je uvijek poštuje", + "Soft: the generator keeps it where it can": "Fleksibilno: generator je poštuje gdje može", + "Weight (1 to 3)": "Težina (1 do 3)", + "Most lessons a day": "Najviše časova dnevno", + "Period": "Čas", + "{day} period {number}": "{day} čas {number}", + "Teacher (user name)": "Nastavnik (korisničko ime)", + "Activity (group:subject)": "Aktivnost (grupa:predmet)", + "Say who or what the wish is about.": "Navedite na koga ili šta se želja odnosi.", + "Choose at least one period.": "Odaberite barem jedan čas.", + "The limit is a whole number of 1 or more.": "Ograničenje je cijeli broj od 1 ili više.", + "Timetable": "Raspored", + "Wishes": "Želje", + "Timetable wishes": "Želje za raspored", + "Generator run": "Pokretanje generatora", + "Generator progress": "Napredak generatora", + "The run failed: {reason}": "Pokretanje nije uspjelo: {reason}", + "{placed} of {lessons} lessons placed": "Smješteno {placed} od {lessons} časova", + "Generate again": "Generiši ponovo", + "Generate": "Generiši", + "Every lesson has a place.": "Svaki čas ima mjesto.", + "Lesson": "Čas", + "No free period and room": "Nema slobodnog časa i učionice", + "Broken soft wishes": "Prekršene fleksibilne želje", + "Every soft wish is kept.": "Svaka fleksibilna želja je poštovana.", + "Wish": "Želja", + "Lessons": "Časovi", + "Generating: {percent}% of the time budget used": "Generisanje: iskorišteno {percent}% vremena", + "Waiting to start": "Čeka početak", + "Published as draft lessons": "Objavljeno kao nacrti časova", + "Could not read the scenario.": "Scenarij nije moguće pročitati.", + "Could not start the run.": "Pokretanje nije moguće započeti.", + "Scenarios": "Scenariji", + "Timetable scenarios": "Scenariji rasporeda", + "Scenario": "Scenarij", + "Take the current timetable": "Preuzmi trenutni raspored", + "Could not take the current timetable.": "Trenutni raspored nije moguće preuzeti.", + "Broken hard wishes": "Prekršene obavezne želje", + "Not on a period of the week grid": "Nije na času sedmične mreže", + "Compare scenarios": "Uporedi scenarije", + "Scenarios to compare": "Scenariji za poređenje", + "Choose two or three scenarios to compare them.": "Odaberite dva ili tri scenarija za poređenje.", + "Measure": "Mjera", + "Best": "Najbolje", + "Lessons that differ": "Časovi koji se razlikuju", + "No lesson differs.": "Nijedan čas se ne razlikuje.", + "Not placed": "Nije smješteno", + "{period} in {room}": "{period} u {room}", + "Lessons placed": "Smješteni časovi", + "Lessons without a place": "Časovi bez mjesta", + "Clashes": "Sukobi", + "Hard wishes broken": "Prekršene obavezne želje", + "Soft wishes broken": "Prekršene fleksibilne želje", + "Soft wishes broken, weighted": "Prekršene fleksibilne želje, ponderisano", + "Free periods between lessons, all teachers": "Prazni časovi, svi nastavnici", + "Most free periods of one teacher": "Najviše praznih časova jednog nastavnika", + "Most lessons of one group on a day": "Najviše časova jedne grupe u danu", + "Room use": "Korištenje učionica", + "Publish as draft lessons": "Objavi kao nacrte časova", + "Draft lessons written: {count}": "Zapisani nacrti časova: {count}", + "Could not publish the scenario.": "Scenarij nije moguće objaviti.", + "Rules": "Pravila", + "Rules for {column}": "Pravila za {column}", + "When a card enters this column": "Kada kartica uđe u ovu kolonu", + "Action": "Radnja", + "Set the priority": "Postavi prioritet", + "Assign to": "Dodijeli osobi", + "Assign the person who moved the card": "Dodijeli osobi koja je premjestila karticu", + "Remove the assignee": "Ukloni zaduženu osobu", + "Add a label": "Dodaj oznaku", + "No longer a project member": "Više nije član projekta", + "This label no longer exists": "Ova oznaka više ne postoji", + "Add rule": "Dodaj pravilo", + "Remove rule": "Ukloni pravilo", + "No rules yet. Add one to change a card when it enters this column.": "Još nema pravila. Dodajte jedno da biste mijenjali karticu kada uđe u ovu kolonu.", + "Could not save the rules. Please try again.": "Pravila nije moguće sačuvati. Pokušajte ponovo.", + "1 rule runs when a card enters this column": "1 pravilo se izvršava kada kartica uđe u ovu kolonu", + "{count} rules run when a card enters this column": "Broj pravila koja se izvršavaju kada kartica uđe u ovu kolonu: {count}", + "Rules applied: {changes}": "Primijenjena pravila: {changes}", + "assigned to {name}": "dodijeljeno osobi {name}", + "assignee removed": "zadužena osoba uklonjena", + "priority {priority}": "prioritet {priority}", + "label {label}": "oznaka {label}", + "What happens to a card when it enters this column, applied in list order.": "Šta se dešava s karticom kada uđe u ovu kolonu, redoslijedom liste.", + "Value": "Vrijednost", + "What the rule does to the card.": "Šta pravilo radi s karticom.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioritet, ID korisnika ili ID oznake koji radnja koristi; prazno za radnje bez vrijednosti.", + "is not": "nije", + "{dimension} is not": "{dimension} nije", + "Saved filters": "Sačuvani filteri", + "No saved filters yet": "Još nema sačuvanih filtera", + "Save filter": "Sačuvaj filter", + "Rename \"{name}\"": "Preimenuj „{name}”", + "Delete \"{name}\"": "Izbriši „{name}”", + "Clear filters": "Očisti filtere", + "Showing {shown} of {total} tasks": "Prikazano {shown} od {total} zadataka", + "Me": "Ja", + "No date": "Bez datuma", + "Rename saved filter": "Preimenuj sačuvani filter", + "Share with the project": "Podijeli s projektom", + "Give the filter a name": "Dajte filteru naziv", + "Could not save the filter. Please try again.": "Filter nije moguće sačuvati. Pokušajte ponovo.", + "Some labels in \"{name}\" no longer exist and were left out.": "Neke oznake u „{name}” više ne postoje i izostavljene su.", + "Could not delete the filter. Please try again.": "Filter nije moguće izbrisati. Pokušajte ponovo.", + "Saved filter": "Sačuvani filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Imenovani filter ploče jednog projekta, privatan za osobu koja ga je sačuvala, osim ako je podijeljen s projektom.", + "The project whose board the filter applies to": "Projekt na čijoj se ploči filter primjenjuje", + "The name the filter is listed under": "Naziv pod kojim je filter na listi", + "Saved by": "Sačuvao/la", + "Nextcloud user id of the person who saved the filter": "Nextcloud ID korisnika koji je sačuvao filter", + "Shared with the project": "Podijeljeno s projektom", + "Whether every project member sees and applies the filter": "Da li svaki član projekta vidi filter i može ga primijeniti", + "Criteria": "Kriteriji", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filter: zadužena osoba, oznaka, prioritet i rok, svaki s jeste ili nije i svojim vrijednostima", + "Cross-project view": "Međuprojektni prikaz", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Sačuvan odabir projekata čiji se zadaci prikazuju zajedno u kolonama statusa, podijeljen s navedenim osobama.", + "Shared with": "Podijeljeno s", + "The name the view is listed under": "Naziv pod kojim je prikaz naveden", + "Nextcloud user id of the person who saved the view": "Nextcloud korisnički ID osobe koja je sačuvala prikaz", + "Nextcloud user ids of the people the view is shared with": "Nextcloud korisnički ID-ovi osoba s kojima je prikaz podijeljen", + "The projects whose tasks the view shows, at most twenty": "Projekti čije zadatke prikaz prikazuje, najviše dvadeset", + "1 project in this view is hidden from you.": "1 projekat u ovom prikazu je skriven od vas.", + "{count} projects in this view are hidden from you.": "Projekti u ovom prikazu skriveni od vas: {count}.", + "{project} has no column for {status}.": "Projekat {project} nema kolonu za status {status}.", + "This view does not exist or is not shared with you.": "Ovaj prikaz ne postoji ili nije podijeljen s vama.", + "\"{task}\" moved to {status}.": "\"{task}\" premješteno u {status}.", + "Project: {title}": "Projekat: {title}", + "Cross-project views": "Međuprojektni prikazi", + "New view": "Novi prikaz", + "Edit view": "Uredi prikaz", + "Delete view": "Izbriši prikaz", + "Give the view a name": "Dajte prikazu naziv", + "Pick at least one project": "Odaberite barem jedan projekat", + "A view shows at most {max} projects": "Prikaz prikazuje najviše {max} projekata", + "Could not save the view. Please try again.": "Prikaz nije moguće sačuvati. Pokušajte ponovo.", + "Could not delete the view. Please try again.": "Prikaz nije moguće izbrisati. Pokušajte ponovo.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Izbrisati \"{title}\"? Projekti i njihovi zadaci ostaju kakvi jesu.", + "People see the tasks of the projects they are in, never more.": "Svako vidi samo zadatke projekata u kojima je.", + "No views yet. A view shows the tasks of several of your projects together.": "Još nema prikaza. Prikaz prikazuje zadatke više vaših projekata zajedno.", + "Projects in view: {count}": "Projekti u prikazu: {count}", + "Notify me when a task is assigned to me": "Obavijesti me kad mi se dodijeli zadatak", + "Also send these to me by email": "Šalji mi ih i e-poštom", + "Add an email address in your Nextcloud personal settings to get mail.": "Dodajte adresu e-pošte u ličnim postavkama Nextclouda da biste primali e-poštu.", + "Code link": "Veza na kod", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, grana, zahtjev za spajanje ili prijava na platformi za kod koja se odnosi na zadatak.", + "The task the link belongs to": "Zadatak kojem veza pripada", + "The project of the task": "Projekat zadatka", + "Task key": "Ključ zadatka", + "The task key the forge text named, such as VC-12": "Ključ zadatka naveden u tekstu platforme, npr. VC-12", + "What the link points at": "Na šta veza pokazuje", + "Link": "Veza", + "The address of the item in the forge": "Adresa stavke na platformi za kod", + "The commit message, branch name or merge request title": "Poruka commita, naziv grane ili naslov zahtjeva za spajanje", + "Repository": "Repozitorij", + "The repository, such as acme/portal": "Repozitorij, npr. acme/portal", + "Forge id": "Id na platformi", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Vlastiti id stavke na platformi za kod, npr. github:acme/portal#42 ili hash commita", + "State": "Stanje", + "The state of a merge request or issue": "Stanje zahtjeva za spajanje ili prijave", + "Who made the commit or opened the merge request": "Ko je napravio commit ili otvorio zahtjev za spajanje", + "When the commit was made or the merge request last changed": "Kada je napravljen commit ili se zahtjev za spajanje posljednji put promijenio", + "Added by": "Dodao", + "Whether a person added the link or the integration wrote it": "Da li je vezu dodala osoba ili ju je zapisala integracija", + "Nextcloud user UIDs of project members": "Nextcloud korisnički ID-ovi članova projekta", + "Add link": "Dodaj vezu", + "Added by hand": "Dodano ručno", + "Branch": "Grana", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Iz integracije", + "Link to a commit, branch or merge request": "Veza na commit, granu ili zahtjev za spajanje", + "Merge request": "Zahtjev za spajanje", + "Merged": "Spojeno", + "No code linked yet. Name {key} in a commit message or paste a link.": "Još nema povezanog koda. Navedite {key} u poruci commita ili zalijepite vezu.", + "No code linked yet. Paste a link to a commit or merge request.": "Još nema povezanog koda. Zalijepite vezu na commit ili zahtjev za spajanje.", + "Paste a web address that starts with https://.": "Zalijepite web-adresu koja počinje sa https://.", + "Remove link {title}": "Ukloni vezu {title}", + "The link could not be added.": "Vezu nije bilo moguće dodati.", + "The link could not be removed.": "Vezu nije bilo moguće ukloniti.", + "This link is already on the task.": "Ova veza je već na zadatku.", + "Code forges": "Platforme za kod", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Povežite commitove i pull requestove s GitHuba sa zadacima. Integriq prima događaje; planninq nikad ne poziva GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Preuzmite konfiguraciju i uvezite je u Integriq. Zatim upišite tajnu u pravilo \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "U GitHubu repozitoriju dodajte webhook sa ovom adresom i istom tajnom. Odaberite vrstu sadržaja application/json te događaje push i pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Navedite ključ zadatka, npr. VC-12, u poruci commita, nazivu grane ili naslovu pull requesta. Veza se tada pojavljuje na tom zadatku.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriqa članovi projekta i dalje mogu zalijepiti vezu na stranici zadatka.", + "Download the Integriq configuration": "Preuzmi konfiguraciju za Integriq", + "Calendar": "Kalendar", + "Previous": "Prethodno", + "Calendar view": "Prikaz kalendara", + "Starts:": "Počinje:", + "No tasks with a date in this month.": "Ovaj mjesec nema zadataka s datumom.", + "Week of {start} to {end}": "Sedmica od {start} do {end}", + "My calendar": "Moj kalendar", + "Show as list": "Prikaži kao listu", + "Show as calendar": "Prikaži kao kalendar", + "Open my calendar": "Otvori moj kalendar", + "Nextcloud Tasks": "Nextcloud Zadaci", + "Show my tasks in Nextcloud Tasks": "Prikaži moje zadatke u Nextcloud Zadacima", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Zadaci dodijeljeni vama ili podijeljeni s vama prikazuju se na listi \"Planninq\" u Nextcloud Zadacima i Kalendaru. Promjene napravljene tamo zamjenjuju se sljedećom promjenom u Planninqu.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ovaj server ne može pisati u Nextcloud Zadatke pa izvoz nije dostupan.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Upravlja Planninq. Promjene napravljene ovdje zamjenjuju se sljedećom promjenom u Planninqu.", + "Working days and holidays": "Radni dani i praznici", + "Dates set on the timeline skip the days that are not working days.": "Datumi postavljeni na vremenskoj liniji preskaču dane koji nisu radni.", + "Working weekdays": "Radni dani u sedmici", + "Non-working days": "Neradni dani", + "No non-working days yet.": "Još nema neradnih dana.", + "Add day": "Dodaj dan", + "Year": "Godina", + "Add Dutch national holidays": "Dodaj holandske državne praznike", + "Save working days": "Spremi radne dane", + "Choose at least one working weekday.": "Odaberite barem jedan radni dan.", + "Working days saved.": "Radni dani spremljeni.", + "Could not save the working days.": "Radne dane nije bilo moguće spremiti.", + "New Year's Day": "Nova godina", + "Easter Sunday": "Uskrs", + "Easter Monday": "Uskršnji ponedjeljak", + "King's Day": "Kraljev dan", + "Liberation Day": "Dan oslobođenja", + "Ascension Day": "Spasovdan", + "Whit Sunday": "Duhovi", + "Whit Monday": "Duhovski ponedjeljak", + "Christmas Day": "Božić", + "Boxing Day": "Drugi dan Božića", + "Dates of {title}": "Datumi za {title}", + "The due date cannot be before the start date.": "Rok ne može biti prije datuma početka.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Datume nije bilo moguće spremiti.", + "{title} now runs from {start} to {end}": "{title} sada traje od {start} do {end}", + "Auto-scheduling": "Automatsko planiranje", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kad je uključeno, kasniji rok na vremenskoj liniji nudi pomjeranje zadataka koje blokira.", + "Move blocked tasks along when a task slips": "Pomjeri blokirane zadatke kad zadatak kasni", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na vremenskoj liniji kasniji rok nudi pomjeranje blokiranih zadataka. Broje se samo veze \"blokira\", a zadaci se pomjeraju samo kasnije.", + "Move the tasks that wait for {title}?": "Pomjeriti zadatke koji čekaju {title}?", + "These tasks wait for it and would start after its new due date:": "Ovi zadaci ga čekaju i počeli bi nakon novog roka:", + "{count} tasks would move; the first {limit} are listed.": "Pomjerilo bi se {count} zadataka; prikazano je prvih {limit}.", + "Now": "Sada", + "After the move": "Nakon pomjeranja", + "Only this task": "Samo ovaj zadatak", + "Move all": "Pomjeri sve", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Zaustavljeno kod {title}: datume nije bilo moguće spremiti. Zadaci prije njega su pomjereni.", + "Cumulative flow": "Kumulativni tok", + "Show as chart": "Prikaži kao grafikon", + "Show as table": "Prikaži kao tabelu", + "Tasks per column per day": "Zadaci po koloni po danu", + "Tasks without recorded history in this period: {count}": "Zadaci bez zabilježene historije u ovom periodu: {count}", + "Lead and cycle time": "Vrijeme isporuke i vrijeme ciklusa", + "No tasks were finished in this period.": "U ovom periodu nije završen nijedan zadatak.", + "Finished tasks": "Završeni zadaci", + "Cycle time, average": "Vrijeme ciklusa, prosjek", + "Cycle time, 85th percentile": "Vrijeme ciklusa, 85. percentil", + "Lead time, average": "Vrijeme isporuke, prosjek", + "Tasks whose finish time was estimated from their history: {count}": "Zadaci čije je vrijeme završetka procijenjeno iz historije: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Vrijeme ciklusa svakog završenog zadatka, s prosjekom i 85. percentilom", + "Slowest tasks": "Najsporiji zadaci", + "cycle {cycle}, lead {lead}": "ciklus {cycle}, isporuka {lead}", + "{days} days": "{days} dana", + "Could not load the flow of this project.": "Tok ovog projekta nije moguće učitati.", + "Last {days} days": "Posljednjih {days} dana", + "Portfolio flow": "Tok portfolija", + "An admin adds portfolios under Projects, Portfolios.": "Administrator dodaje portfolije pod Projekti, Portfoliji.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekti koji nisu prikazani jer se odjednom prikazuje najviše 50: {count}", + "Could not load the flow of this portfolio.": "Tok ovog portfolija nije moguće učitati.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativni tok i vrijeme ciklusa kroz projekte portfolija.", + "Edit report": "Uredi izvještaj", + "Only tasks where": "Samo zadaci gdje", + "Group by": "Grupiši po", + "Display": "Prikaz", + "Share with everyone who can read its projects": "Podijeli sa svima koji mogu čitati njegove projekte", + "The report could not be saved.": "Izvještaj nije moguće sačuvati.", + "Number of tasks": "Broj zadataka", + "Bar": "Stubovi", + "Donut": "Prsten", + "Table": "Tabela", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} od {total} projekata u ovom izvještaju nije vidljivo za vas", + "No tasks match this report.": "Nijedan zadatak ne odgovara ovom izvještaju.", + "None": "Ništa", + "Could not load this report.": "Ovaj izvještaj nije moguće učitati.", + "Report": "Izvještaj", + "Your reports": "Vaši izvještaji", + "My reports": "Moji izvještaji", + "Shared reports": "Dijeljeni izvještaji", + "You have not built a report yet.": "Još niste napravili izvještaj.", + "Nobody has shared a report with you yet.": "Još niko nije podijelio izvještaj s vama.", + "Reports you built over tasks, and the ones shared with you.": "Izvještaji koje ste napravili nad zadacima, i oni podijeljeni s vama.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Sačuvani upit nad zadacima: koji projekti, koji filteri, grupisano po čemu, prebrojano ili sabrano, i prikazano kao tabela ili grafikon.", + "The name the report is listed under": "Naziv pod kojim je izvještaj naveden", + "What the report shows and who it is for": "Šta izvještaj prikazuje i kome je namijenjen", + "Nextcloud user id of the person who saved the report": "Nextcloud ID korisnika koji je sačuvao izvještaj", + "Who can open the report": "Ko može otvoriti izvještaj", + "Only me": "Samo ja", + "Everyone who can read its projects": "Svi koji mogu čitati njegove projekte", + "The projects the report covers, at most fifty": "Projekti koje izvještaj obuhvata, najviše pedeset", + "Filters": "Filteri", + "Task fields and the value each must equal": "Polja zadatka i vrijednost kojoj svako mora biti jednako", + "The task field the report groups on": "Polje zadatka po kojem izvještaj grupiše", + "Count the tasks, or add up a number on them": "Prebroji zadatke ili saberi broj na njima", + "Sum": "Zbir", + "Sum of": "Zbir polja", + "The number added up when the measure is a sum": "Broj koji se sabira kada je mjera zbir", + "Story points": "Bodovi priče", + "Estimated duration": "Procijenjeno trajanje", + "How the report is shown": "Kako se izvještaj prikazuje", + "Issue type": "Vrsta zahtjeva", + "Task fields and the value each must equal; empty when the report covers every task": "Polja zadatka i vrijednost koju svako mora imati; prazno kad izvještaj obuhvata sve zadatke", + "The status a task must have": "Status koji zadatak mora imati", + "The priority a task must have": "Prioritet koji zadatak mora imati", + "The user a task must be assigned to": "Korisnik kojem zadatak mora biti dodijeljen", + "A label a task must carry": "Oznaka koju zadatak mora imati", + "The board column a task must be in": "Kolona table u kojoj zadatak mora biti", + "The issue type a task must have": "Vrsta zahtjeva koju zadatak mora imati", + "Manager groups": "Grupe voditelja", + "Member groups": "Grupe članova", + "Viewer groups": "Grupe čitalaca", + "Viewers": "Čitaoci", + "Owning group": "Vlasnička grupa", + "Nextcloud groups whose members manage the project": "Nextcloud grupe čiji članovi vode projekat", + "Nextcloud groups whose members work on the project": "Nextcloud grupe čiji članovi rade na projektu", + "Nextcloud groups whose members may read the project": "Nextcloud grupe čiji članovi smiju čitati projekat", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud korisnici koji vode projekat: postavke, članove i rad", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud korisnici koji smiju čitati projekat i njegov rad, ali ga ne mijenjati", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud grupa koja posjeduje projekat zajedno s njegovim autorom, najviše jedna", + "Nextcloud user ids who may read this through the project": "Nextcloud korisnici koji ovo smiju čitati kroz projekat", + "Nextcloud groups whose members may change this through the project": "Nextcloud grupe čiji članovi ovo smiju mijenjati kroz projekat", + "Nextcloud groups whose members may read this through the project": "Nextcloud grupe čiji članovi ovo smiju čitati kroz projekat", + "Search for a person or a group…": "Traži osobu ili grupu…", + "No one found. Your admin's sharing settings decide who you can find.": "Niko nije pronađen. Postavke dijeljenja vašeg administratora određuju koga možete pronaći.", + "Type at least two characters": "Unesite najmanje dva znaka", + "Everyone in this group": "Svi u ovoj grupi", + "Could not search for people. Please try again.": "Pretraga osoba nije uspjela. Pokušajte ponovo.", + "Could not remove the group": "Grupu nije moguće ukloniti", + "Only the owner and managers change who is on this project.": "Samo vlasnik i upravitelji mijenjaju ko je na ovom projektu.", + "Role of {name}": "Uloga: {name}", + "Manager": "Upravitelj", + "Member": "Član", + "Viewer": "Čitalac", + "Could not change the role": "Ulogu nije moguće promijeniti", + "Owned by group: {name}": "U vlasništvu grupe: {name}", + "No group owns this project.": "Nijedna grupa nije vlasnik ovog projekta.", + "Owned by group": "U vlasništvu grupe", + "Search for a group…": "Potraži grupu…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nije pronađena nijedna grupa. Postavke dijeljenja vašeg administratora određuju koje grupe možete pronaći.", + "No owning group": "Bez grupe vlasnika", + "Could not search for groups. Please try again.": "Pretraga grupa nije uspjela. Pokušajte ponovo.", + "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", + "You can read this project. Only its members change it.": "Ovaj projekat možete čitati. Mijenjaju ga samo njegovi članovi.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet koji se predaje na ovom času, na primjer izborni predmet, kad ga školska aplikacija za učenje poznaje.", + "Online meeting link": "Link za online čas", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdje se učenici pridružuju ovom času online. Dugme Pridruži se prikazuje se samo za https link." }, "plurals": null } diff --git a/l10n/ca.js b/l10n/ca.js index 764c6969..833e89a7 100644 --- a/l10n/ca.js +++ b/l10n/ca.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Projectes actius", + "Archived projects": "Projectes arxivats", + "Boards": "Taulers", + "My projects": "Els meus projectes", + "Portfolio": "Cartera", + "Project board": "Tauler del projecte", + "Projects I am in": "Projectes en què participo", + "Timeline": "Cronologia", + "Timesheet": "Full d'hores", + "Features & roadmap": "Funcions i full de ruta", + "Flow": "Flux", + "Flows": "Fluxos", + "Reports": "Informes", + "Pick a report to open it.": "Trieu un informe per obrir-lo.", + "In progress": "En curs", + "Date": "Data", + "Due": "Venciment", + "Assignee": "Assignat a", + "Who": "Qui", + "What": "Què", + "Minutes": "Minuts", + "Entries": "Entrades", + "Most recent": "Més recents", + "Per person": "Per persona", + "By status": "Per estat", + "By priority": "Per prioritat", + "Task status": "Estat de les tasques", + "Time spent": "Temps dedicat", + "Capacity": "Capacitat", + "Due soonest": "Vencen abans", + "Minutes logged": "Minuts registrats", + "Nothing is due": "No hi ha venciments", + "Nothing logged yet": "Encara no hi ha registres", + "What is open, what is blocked, and what is overdue.": "Què està obert, què està bloquejat i què està vençut.", + "How allocation is spread across the people working on projects.": "Com es reparteix l'assignació entre les persones que treballen en projectes.", + "Hours logged, and the projects they went to.": "Les hores registrades i els projectes on han anat.", + "Billable": "Facturable", + "Budget: {amount}": "Pressupost: {amount}", + "Loading projects": "S'estan carregant els projectes", + "No projects for this client yet": "Encara no hi ha projectes per a aquest client", + "Open in Planninq": "Obre a Planninq", + "This project could not be found": "No s'ha trobat aquest projecte", + "Untitled project": "Projecte sense títol", + "and {count} more": "i {count} més", + "Store": "Botiga", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instal·leu registres, esquemes i fluxos publicats per altres organitzacions.", + "Work Date": "Data de treball", + "Zaak UUID": "UUID de Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Accions de la columna", + "Columns": "Columnes", + "Could not remove the column. Please try again.": "No s'ha pogut eliminar la columna. Torneu-ho a provar.", + "Could not save the column. Please try again.": "No s'ha pogut desar la columna. Torneu-ho a provar.", + "Done column": "Columna de fet", + "Edit column": "Edita la columna", + "Keep the card's status": "Mantén l'estat de la targeta", + "Move its cards to": "Mou les seves targetes a", + "Move left": "Mou a l'esquerra", + "Move right": "Mou a la dreta", + "Status of cards moved here": "Estat de les targetes mogudes aquí", + "The last done column cannot be removed.": "L'última columna de fet no es pot eliminar.", + "WIP limit": "Límit WIP", + "over limit": "per sobre del límit", + "The status a card gets when it is moved into this column.": "L'estat que rep una targeta quan es mou a aquesta columna.", + "All priorities": "Totes les prioritats", + "Could not create the task. Please try again.": "No s'ha pogut crear la tasca. Torneu-ho a provar.", + "Created": "Creada", + "Move to backlog": "Al backlog", + "Move to board": "Al tauler", + "New task": "Tasca nova", + "Nothing in the backlog": "No hi ha res al backlog", + "Rank": "Rang", + "Sort by": "Ordena per", + "Sort by rank to reorder": "Ordeneu per rang per reordenar", + "Task actions": "Accions de la tasca", + "All labels": "Totes les etiquetes", + "Filter tasks by label": "Filtra les tasques per etiqueta", + "View timeline": "Mostra la cronologia", + "Board": "Tauler", + "List": "Llista", + "Column": "Columna", + "Board or list": "Tauler o llista", + "Log": "Registre", + "Add entry": "Afegeix una entrada", + "Show": "Mostra", + "No actions yet": "Encara no hi ha accions", + "Closed": "Tancat", + "Entry actions": "Accions de l'entrada", + "Add action": "Afegeix una acció", + "by {author}": "per {author}", + "saved {time}": "desat {time}", + "Attendees: {names}": "Assistents: {names}", + "Add the first entry": "Afegeix la primera entrada", + "Issues": "Incidències", + "Lessons learned": "Lliçons apreses", + "Meetings": "Reunions", + "Decisions": "Decisions", + "Actions": "Accions", + "Issue": "Incidència", + "Lesson learned": "Lliçó apresa", + "Meeting": "Reunió", + "Decision": "Decisió", + "About this project": "Quant a aquest projecte", + "No description yet": "Encara no hi ha descripció", + "Start date": "Data d'inici", + "Not set": "Sense definir", + "End date": "Data de finalització", + "Progress": "Progrés", + "No tasks yet": "Encara no hi ha tasques", + "Open the board": "Obre el tauler", + "People": "Persones", + "Owner": "Propietari", + "Latest log entries": "Darreres entrades", + "Open the log": "Obre el registre", + "{done} of {total} tasks done": "{done} de {total} tasques fetes", + "Edit entry": "Edita l'entrada", + "Type": "Tipus", + "Attendees": "Assistents", + "Issue is closed": "La incidència està tancada", + "Could not save the entry. Please try again.": "No s'ha pogut desar l'entrada. Torneu-ho a provar.", + "From: {title}": "De: {title}", + "What needs to happen": "Què cal fer", + "Could not create the action. Please try again.": "No s'ha pogut crear l'acció. Torneu-ho a provar.", + "The action was created but could not be linked to the entry.": "L'acció s'ha creat, però no s'ha pogut enllaçar amb l'entrada.", + "Project pages": "Pàgines del projecte", + "Overview": "Visió general", + "Risks": "Riscos", + "Log entry": "Entrada del registre", + "A short name for the entry": "Un nom curt per a l'entrada", + "Project": "Projecte", + "The project this entry belongs to": "El projecte al qual pertany aquesta entrada", + "What kind of entry this is": "Quin tipus d'entrada és", + "When it happened": "Quan va passar", + "What happened, in Markdown": "Què va passar, en Markdown", + "Whether an issue is still open": "Si una incidència encara és oberta", + "The people at a meeting": "Les persones en una reunió", + "Tasks that came out of this entry": "Tasques sorgides d'aquesta entrada", + "Add risk": "Afegeix un risc", + "Risk": "Risc", + "Score": "Puntuació", + "Response": "Resposta", + "Review date": "Data de revisió", + "no longer on the project": "ja no és al projecte", + "Edit {title}": "Edita {title}", + "No risks recorded yet": "Encara no hi ha riscos registrats", + "Add the first risk": "Afegeix el primer risc", + "Medium": "Mitjà", + "Mitigating": "En mitigació", + "Occurred": "S'ha produït", + "Avoid": "Evitar", + "Reduce": "Reduir", + "Transfer": "Transferir", + "Accept": "Acceptar", + "Highest open risks": "Riscos oberts més alts", + "No open risks": "No hi ha riscos oberts", + "Open the risk register": "Obre el registre de riscos", + "Edit risk": "Edita el risc", + "What could go wrong": "Què podria sortir malament", + "Likelihood": "Probabilitat", + "Impact": "Impacte", + "Score {score}": "Puntuació {score}", + "Countermeasures": "Contramesures", + "Could not save the risk. Please try again.": "No s'ha pogut desar el risc. Torneu-ho a provar.", + "Risks by likelihood and impact": "Riscos per probabilitat i impacte", + "Risk scale": "Escala de risc", + "The levels every project scores its risks on, and where low turns into medium and high": "Els nivells amb què cada projecte puntua els seus riscos, i on baix passa a mitjà i alt", + "Number of levels": "Nombre de nivells", + "Likelihood labels": "Etiquetes de probabilitat", + "Impact labels": "Etiquetes d'impacte", + "Level {level}": "Nivell {level}", + "Medium from score": "Mitjà a partir de la puntuació", + "High from score": "Alt a partir de la puntuació", + "Risk scale saved": "S'ha desat l'escala de risc", + "1 risk uses level {level}. Change it first.": "1 risc fa servir el nivell {level}. Canvieu-lo primer.", + "{count} risks use level {level}. Change them first.": "{count} riscos fan servir el nivell {level}. Canvieu-los primer.", + "Every level needs a label, and high must start above medium.": "Cada nivell necessita una etiqueta, i alt ha de començar per sobre de mitjà.", + "The project this risk belongs to": "El projecte al qual pertany aquest risc", + "The cause and the effect, in Markdown": "La causa i l'efecte, en Markdown", + "Category": "Categoria", + "A free grouping, such as planning, budget or supplier": "Una agrupació lliure, com planificació, pressupost o proveïdor", + "How likely it is, on the admin's risk scale": "Com de probable és, a l'escala de risc de l'administrador", + "How hard it would hit, on the admin's risk scale": "Com de fort colpejaria, a l'escala de risc de l'administrador", + "Likelihood times impact, calculated by the server": "Probabilitat per impacte, calculat pel servidor", + "Where the risk stands": "On és el risc", + "The person who watches this risk": "La persona que vigila aquest risc", + "How the project answers the risk": "Com respon el projecte al risc", + "What is done to prevent it or soften it, in Markdown": "Què es fa per evitar-lo o suavitzar-lo, en Markdown", + "When to look at this risk again": "Quan cal revisar de nou aquest risc", + "Very low": "Molt baix", + "Very high": "Molt alt", + "All projects": "Tots els projectes", + "Project status report": "Informe d'estat del projecte", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Un informe datat sobre com està un projecte en diners, organització, temps, informació, qualitat i risc (els aspectes GROTIK), cadascun amb una nota.", + "The project this report is about": "El projecte del qual tracta aquest informe", + "Report date": "Data de l'informe", + "The day the report describes": "El dia que descriu l'informe", + "Money": "Diners", + "How the project stands on this aspect": "Com està el projecte en aquest aspecte", + "On track": "En curs", + "At risk": "En risc", + "Off track": "Desviat", + "Money note": "Nota sobre diners", + "A short explanation of this status": "Una breu explicació d'aquest estat", + "Organisation": "Organització", + "Organisation note": "Nota sobre organització", + "Time": "Temps", + "Time note": "Nota sobre temps", + "Information": "Informació", + "Information note": "Nota sobre informació", + "Quality": "Qualitat", + "Quality note": "Nota sobre qualitat", + "Risk note": "Nota sobre risc", + "Overall": "General", + "The worst of the six statuses, calculated by the server": "El pitjor dels sis estats, calculat pel servidor", + "Health: money": "Salut: diners", + "Copied from the newest status report": "Copiat de l'informe d'estat més recent", + "Health: organisation": "Salut: organització", + "Health: time": "Salut: temps", + "Health: information": "Salut: informació", + "Health: quality": "Salut: qualitat", + "Health: risk": "Salut: risc", + "Health: overall": "Salut: general", + "Health: report date": "Salut: data de l'informe", + "The date of the newest status report": "La data de l'informe d'estat més recent", + "New report": "Informe nou", + "Only the project owner writes status reports.": "Només el propietari del projecte escriu informes d'estat.", + "Latest report, {date}": "Últim informe, {date}", + "Aspect": "Aspecte", + "Note": "Nota", + "Report history": "Historial d'informes", + "Author": "Autor", + "No status reports yet": "Encara no hi ha informes d'estat", + "Write the first report": "Escriu el primer informe", + "Choose a status for every aspect to save the report.": "Trieu un estat per a cada aspecte per desar l'informe.", + "Suggested: on track.": "Suggeriment: en curs.", + "Suggested: at risk.": "Suggeriment: en risc.", + "Suggested: off track.": "Suggeriment: desviat.", + "1 task is past its due date.": "1 tasca ha passat la data límit.", + "{count} tasks are past their due date.": "{count} tasques han passat la data límit.", + "The end date has passed with 1 open task.": "La data de fi ha passat amb 1 tasca oberta.", + "The end date has passed with {count} open tasks.": "La data de fi ha passat amb {count} tasques obertes.", + "No open task is past its due date.": "Cap tasca oberta ha passat la data límit.", + "The highest open risk, \"{title}\", scores {score}.": "El risc obert més alt, \"{title}\", puntua {score}.", + "There are no open risks.": "No hi ha riscos oberts.", + "Costs are at {percent}% of the budget.": "Els costos són al {percent}% del pressupost.", + "No suggestion: the project has no budget.": "Sense suggeriment: el projecte no té pressupost.", + "No suggestion: no costs are recorded for this project yet.": "Sense suggeriment: encara no hi ha costos registrats per a aquest projecte.", + "The report was not saved. Only the project owner can write status reports.": "L'informe no s'ha desat. Només el propietari del projecte pot escriure informes d'estat.", + "No report": "Sense informe", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Un grup de projectes portats per les mateixes persones, com un departament o un programa. Els seus responsables llegeixen cada projecte que conté.", + "The name of the portfolio": "El nom de la cartera", + "What the portfolio holds and who runs it": "Què conté la cartera i qui la porta", + "A colour for the portfolio's section in project lists": "Un color per a la secció de la cartera a les llistes de projectes", + "Managers": "Responsables", + "Nextcloud user UIDs of the people who run the portfolio": "Identificadors d'usuari de Nextcloud de les persones que porten la cartera", + "Order": "Ordre", + "Where the portfolio comes in project lists, lowest first": "On apareix la cartera a les llistes de projectes, primer el més baix", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "L'escala de risc pròpia d'aquesta cartera en JSON, amb la mateixa forma que la de tota l'aplicació. Buit vol dir l'escala de l'aplicació.", + "Portfolio readers": "Lectors de la cartera", + "Nextcloud user UIDs of the managers of the project's portfolio": "Identificadors d'usuari de Nextcloud dels responsables de la cartera del projecte", + "The portfolio this project belongs to": "La cartera a la qual pertany aquest projecte", + "No portfolio": "Sense cartera", + "All portfolios": "Totes les carteres", + "You read this project as a manager of its portfolio. Only its members change it.": "Llegiu aquest projecte com a responsable de la seva cartera. Només els membres el canvien.", + "Portfolios": "Carteres", + "Portfolio status": "Estat de la cartera", + "No portfolios yet": "Encara no hi ha carteres", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Un administrador afegeix carteres a Projectes, Carteres. Els projectes d'una cartera apareixen aquí amb el seu estat.", + "Roll-up": "Resum", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} en curs, {atRisk} en risc, {offTrack} desviats, {noReport} sense informe", + "No project in this portfolio that you can read.": "Cap projecte d'aquesta cartera que puguis llegir.", + "Start": "Inici", + "End": "Fi", + "Budget": "Pressupost", + "Last report": "Darrer informe", + "Out of date": "Desactualitzat", + "Portfolio timeline": "Cronograma de la cartera", + "Zoom": "Zoom", + "Could not load the timeline": "No s'ha pogut carregar el cronograma", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Un administrador afegeix carteres a Projectes, Carteres. Els projectes d'una cartera apareixen aquí en un sol cronograma.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Obre un projecte per veure'n les fases i les tasques. El cronograma és només de lectura.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Omesos perquè no els pots llegir: {count} projectes", + "Week": "Setmana", + "Day": "Dia", + "Month": "Mes", + "Please try again later.": "Torna-ho a provar més tard.", + "Status reports": "Informes d'estat", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Després de quants dies el darrer informe d'estat d'un projecte es marca com a desactualitzat a la vista de la cartera", + "Reporting period (days)": "Període d'informe (dies)", + "The reporting period is a whole number of days from 1 to 365.": "El període d'informe és un nombre enter de dies de l'1 al 365.", + "Reporting period saved": "Període d'informe desat", + "The reporting period was not saved. Please try again.": "El període d'informe no s'ha desat. Torna-ho a provar.", + "Every project of a portfolio with its status per aspect, rolled up.": "Cada projecte d'una cartera amb el seu estat per aspecte, resumit.", + "The projects of a portfolio on one timeline.": "Els projectes d'una cartera en un sol cronograma.", + "Phases": "Fases", + "Add phase": "Afegeix una fase", + "No phases yet": "Encara no hi ha fases", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Divideix el projecte en fases, com ara iniciació, definició i execució. Una fase es tanca quan se'n puja el document de tancament.", + "{hours} hours": "{hours} hores", + "Concluding document: {title}": "Document de tancament: {title}", + "Concluding document missing": "Falta el document de tancament", + "Move {title} up": "Puja {title}", + "Move {title} down": "Baixa {title}", + "Close phase": "Tanca la fase", + "Phase": "Fase", + "Files": "Fitxers", + "Notes": "Notes", + "Audit trail": "Registre d'auditoria", + "Edit phase": "Edita la fase", + "Name": "Nom", + "Budget hours": "Hores pressupostades", + "Could not save the phase. Please try again.": "No s'ha pogut desar la fase. Torna-ho a provar.", + "Close phase {title}": "Tanca la fase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Una fase es tanca amb el seu document de tancament: puja'l aquí o tria un dels fitxers de la fase.", + "Concluding document": "Document de tancament", + "This phase has no files yet.": "Aquesta fase encara no té fitxers.", + "Upload a document": "Puja un document", + "The document was not uploaded. Please try again.": "El document no s'ha pujat. Torna-ho a provar.", + "Upload the concluding document before you close this phase.": "Puja el document de tancament abans de tancar aquesta fase.", + "This phase cannot be closed from its current status.": "Aquesta fase no es pot tancar des del seu estat actual.", + "The phase was not closed. Please try again.": "La fase no s'ha tancat. Torna-ho a provar.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "L'id del fitxer d'aquesta fase que la tanca. La fase només es pot completar quan està indicat i el fitxer adjunt.", + "Import from Microsoft Project": "Importa des de Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Trieu un pla desat des de Microsoft Project en format XML. No s'importa res fins que ho confirmeu.", + "Plan file": "Fitxer del pla", + "What the import creates": "Què crea la importació", + "Tasks": "Tasques", + "Sub-tasks": "Subtasques", + "Milestones": "Fites", + "Links": "Vincles", + "Already imported, updated in place: {count}": "Ja importats, actualitzats al seu lloc: {count}", + "What does not carry over": "Què no es trasllada", + "Tasks with resources, which are not imported: {count}": "Tasques amb recursos, que no s'importen: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tasques més enllà del nivell 3, posades sota la seva tasca de nivell 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Vincles diferents de final a inici, importats com a vincles relacionats: {count}", + "Link lags, which are dropped: {count}": "Retards de vincles, que es descarten: {count}", + "Links to a summary task, which are not imported: {count}": "Vincles a una tasca de resum, que no s'importen: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Vincles a tasques fora d'aquest pla, que no s'importen: {count}", + "No longer in the plan": "Ja no és al pla", + "These stay in the project; remove them yourself if they are no longer needed.": "Es queden al projecte; elimineu-les vosaltres si ja no calen.", + "Import": "Importa", + "Close": "Tanca", + "The plan is imported: {created} created, {updated} updated.": "El pla s'ha importat: {created} creats, {updated} actualitzats.", + "Links that would close a loop were left out: {count}": "S'han omès els vincles que tancarien un bucle: {count}", + "The import stopped part-way. Run it again to finish it.": "La importació s'ha aturat a mig camí. Torneu-la a executar per acabar-la.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Deseu el pla a Microsoft Project amb Fitxer, Desa com a, format XML, i importeu aquest fitxer.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Aquest fitxer declara un DOCTYPE o entitats, que no s'accepten.", + "The file is larger than 10 MB.": "El fitxer supera els 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "El pla té més de 2.000 tasques, més de les que admet una importació.", + "This file is not a Microsoft Project plan in XML format.": "Aquest fitxer no és un pla de Microsoft Project en format XML.", + "Choose a file to import.": "Trieu un fitxer per importar.", + "Only the project owner can import a plan.": "Només el propietari del projecte pot importar un pla.", + "The plan could not be read. Please try again.": "No s'ha pogut llegir el pla. Torneu-ho a provar.", + "Linked case: {title}": "Expedient vinculat: {title}", + "Linked to a case": "Vinculat a un expedient", + "Hand over to case": "Lliura a l'expedient", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copia sense canvis cada fitxer del projecte i de les seves tasques, i un fitxer que descriu el projecte, a l'expedient vinculat.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Fitxers copiats: {count}", + "Files that failed: {names}": "Fitxers amb error: {names}", + "The handover failed. Please try again.": "El lliurament ha fallat. Torneu-ho a provar.", + "The linked case could not be found, or you cannot open it.": "No s'ha trobat l'expedient vinculat o no el podeu obrir.", + "Case handovers": "Lliuraments a l'expedient", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Cada lliurament dels fitxers i metadades del projecte al seu expedient: quan, per qui, a quin expedient, cada fitxer copiat amb el seu SHA-256 i els fitxers que han fallat.", + "Finance": "Finances", + "Add cost line": "Afegeix una línia de cost", + "Delivery terms": "Condicions de lliurament", + "Billing model": "Model de facturació", + "Budget in euro": "Pressupost en euros", + "Budget in hours": "Pressupost en hores", + "Hourly rate in euro": "Tarifa horària en euros", + "Planned start": "Inici previst", + "Planned end": "Final previst", + "Planned dates": "Dates previstes", + "Budget {amount}": "Pressupost {amount}", + "No budget agreed": "Sense pressupost acordat", + "Hours": "Hores", + "Only the project owner and the portfolio managers see the amounts.": "Només el propietari del projecte i els gestors de la cartera veuen els imports.", + "Budget against cost per category": "Pressupost davant costos per categoria", + "Labour (booked time)": "Mà d'obra (hores registrades)", + "No category": "Sense categoria", + "Hours are not available": "Les hores no estan disponibles", + "Not yet assigned to a category": "Encara no assignat a cap categoria", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} gastat, {remaining} restant", + "Budget against cost per phase": "Pressupost davant costos per fase", + "No phase": "Sense fase", + "Cost lines": "Línies de cost", + "From the finance system": "Del sistema financer", + "Edit cost line {amount}": "Edita la línia de cost {amount}", + "No cost lines yet": "Encara no hi ha línies de cost", + "Commitments": "Compromisos", + "Actual cost": "Cost real", + "Forecast": "Previsió", + "Remaining": "Restant", + "Not planned yet": "Encara no planificat", + "{start} to {end}": "{start} a {end}", + "The terms were not saved. Please try again.": "Les condicions no s'han desat. Torna-ho a provar.", + "Terms saved": "Condicions desades", + "Fixed price": "Preu fix", + "Hourly": "Per hores", + "Not billed": "Sense facturar", + "Commitment": "Compromís", + "Edit cost line": "Edita la línia de cost", + "Kind": "Tipus", + "Amount in euro": "Import en euros", + "Remove": "Elimina", + "Could not save the cost line. Only the project owner changes the money of a project.": "No s'ha pogut desar la línia de cost. Només el propietari del projecte canvia els diners d'un projecte.", + "Could not remove the cost line. Please try again.": "No s'ha pogut eliminar la línia de cost. Torna-ho a provar.", + "{amount} over budget": "{amount} per sobre del pressupost", + "Cost categories": "Categories de cost", + "The categories every project splits its budget and costs into, one per line": "Les categories en què cada projecte divideix el pressupost i els costos, una per línia", + "Categories": "Categories", + "Give at least one category, each name once.": "Indica almenys una categoria, cada nom una sola vegada.", + "Cost categories saved": "Categories de cost desades", + "The cost categories were not saved. Please try again.": "Les categories de cost no s'han desat. Torna-ho a provar.", + "Finance line": "Línia financera", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Un import d'un projecte: un pressupost, un compromís, un cost real o una previsió, en una categoria de cost i opcionalment una fase. L'introdueix el propietari del projecte o l'envia el sistema financer a través de l'aplicació d'integració.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "El projecte al qual pertany aquest import. Buit per a una línia del sistema financer el número de projecte de la qual no coincideix amb cap projecte.", + "The phase this amount belongs to, if any": "La fase a la qual pertany aquest import, si n'hi ha", + "The cost category, one of the categories the admin set up": "La categoria de cost, una de les que ha configurat l'administrador", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Si l'import és un pressupost, un compromís, un cost real o una previsió", + "Amount": "Import", + "The amount in the reporting currency (euro)": "L'import en la moneda d'informe (euro)", + "The date the amount was booked or is expected": "La data en què l'import es va registrar o s'espera", + "What the amount is for": "Per a què és l'import", + "Whether a person entered the line or the finance system sent it": "Si una persona va introduir la línia o la va enviar el sistema financer", + "Entered by hand": "Introduït a mà", + "Finance line id": "Id de la línia financera", + "The finance system's own id of this line. One imported line per id.": "L'id propi d'aquesta línia al sistema financer. Una línia importada per id.", + "Project number": "Número de projecte", + "The project number the finance system sent, matched against the project key": "El número de projecte que va enviar el sistema financer, comparat amb la clau del projecte", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "La cartera del projecte de la línia, copiada del projecte perquè els totals de la cartera necessitin un sol filtre", + "Finance readers": "Lectors financers", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID de Nextcloud de les persones que poden veure aquest import: el propietari del projecte i els gestors de la seva cartera", + "Project owner": "Propietari del projecte", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID de Nextcloud del propietari del projecte, que pot canviar i eliminar les línies manuals", + "How the client pays: not billed, a fixed price, or by the hour.": "Com paga el client: sense facturar, preu fix o per hores.", + "Portfolio finance": "Finances de la cartera", + "You cannot see the money of any project in this portfolio": "No pots veure els diners de cap projecte d'aquesta cartera", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "El servidor ha retornat línies de cost de projectes de fora d'aquesta cartera, així que aquests totals poden ser erronis.", + "Projects left out because you cannot see their money: {count}": "Projectes omesos perquè no pots veure'n els diners: {count}", + "Unmatched finance lines": "Línies financeres sense assignar", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Pressupost, compromisos, cost real i previsió sumats en una cartera.", + "Subprojects": "Subprojectes", + "{done} of {total}": "{done} de {total}", + "{done} of {total} tasks done, including subprojects": "{done} de {total} tasques fetes, subprojectes inclosos", + "Show the subprojects of {title}": "Mostra els subprojectes de {title}", + "Hide the subprojects of {title}": "Amaga els subprojectes de {title}", + "Part of": "Forma part de", + "No parent project": "Sense projecte superior", + "A project cannot sit under one of its own subprojects.": "Un projecte no pot quedar sota un dels seus propis subprojectes.", + "Projects nest three levels deep at most: programme, project and subproject.": "Els projectes s'imbriquen com a màxim tres nivells: programa, projecte i subprojecte.", + "Parent project": "Projecte superior", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "El projecte sota el qual queda aquest projecte, com un programa. Els projectes s'imbriquen com a màxim tres nivells.", + "Yes": "Sí", + "No": "No", + "{label} (required)": "{label} (obligatori)", + "{label} is required": "{label} és obligatori", + "Project field": "Camp de projecte", + "A field an admin adds to every project, such as a policy area or a contract value.": "Un camp que un administrador afegeix a cada projecte, com un àmbit de política o un valor de contracte.", + "Key": "Clau", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "El nom fix amb què es desa el valor, en lower camel case. Mantén-lo quan els projectes l'utilitzin.", + "Label": "Etiqueta", + "The name people see next to the field": "El nom que la gent veu al costat del camp", + "What the field holds": "Què conté el camp", + "Text": "Text", + "Number": "Nombre", + "Choice": "Opció", + "Person": "Persona", + "Yes or no": "Sí o no", + "Options": "Opcions", + "The choices of a choice field": "Les opcions d'un camp d'elecció", + "Required": "Obligatori", + "Whether a project must fill in the field": "Si un projecte ha d'omplir el camp", + "Where the field appears, lowest first": "On apareix el camp, el més baix primer", + "Applies to": "S'aplica a", + "What the field is added to": "A què s'afegeix el camp", + "Custom fields": "Camps propis", + "The values of the project fields an admin defined, keyed by the field's key.": "Els valors dels camps de projecte que ha definit un administrador, per la clau del camp.", + "Project fields": "Camps de projecte", + "Related": "Relacionades", + "Remove link": "Treu l'enllaç", + "Link type": "Tipus d'enllaç", + "Relates to": "Relacionada amb", + "Duplicates": "Duplica", + "Project key": "Clau del projecte", + "Every task number starts with it, such as VERG-42.": "Cada número de tasca comença per ella, per exemple VERG-42.", + "This key is already used by another project.": "Un altre projecte ja fa servir aquesta clau.", + "Use 2 to 10 letters and digits, starting with a letter.": "Feu servir de 2 a 10 lletres i xifres, començant per una lletra.", + "The key cannot change once tasks carry it.": "La clau no pot canviar un cop les tasques la porten.", + "Project saved. The existing tasks get their numbers in the background.": "Projecte desat. Les tasques existents reben el número en segon pla.", + "Next task number": "Número de la tasca següent", + "The number the next task of this project gets in its key. Only the system writes it.": "El número que rep a la seva clau la tasca següent d’aquest projecte. Només el sistema l’escriu.", + "Restore {title}": "Restaura {title}", + "Restore": "Restaura", + "Project restored": "S’ha restaurat el projecte", + "Could not restore the project": "No s’ha pogut restaurar el projecte", + "Bring this project back to the active list.": "Torna aquest projecte a la llista de projectes actius.", + "Restore project": "Restaura el projecte", + "Request reason": "Motiu de la sol·licitud", + "Why the requester needs this project. Filled in when the project is requested.": "Per què el sol·licitant necessita aquest projecte. S’omple en sol·licitar-lo.", + "Reviewed by": "Revisat per", + "The user who approved or rejected the request.": "L’usuari que va aprovar o rebutjar la sol·licitud.", + "Reviewed at": "Revisat el", + "When the request was approved or rejected.": "Quan es va aprovar o rebutjar la sol·licitud.", + "Review note": "Nota de revisió", + "The reviewer's reason, shown to the requester when a request is not approved.": "El motiu del revisor, que veu el sol·licitant quan una sol·licitud no s’aprova.", + "Members of these groups": "Membres d’aquests grups", + "Groups that may create projects": "Grups que poden crear projectes", + "The group {group} no longer exists. Save to remove it.": "El grup {group} ja no existeix. Deseu per treure’l.", + "Review project request": "Revisa la sol·licitud de projecte", + "Requested by": "Sol·licitat per", + "Why it is needed": "Per què cal", + "Desired start date": "Data d’inici desitjada", + "Why is it not approved?": "Per què no s’aprova?", + "Give a reason. The requester sees it.": "Indiqueu un motiu. El sol·licitant el veurà.", + "Approve": "Aprova", + "Reject": "Rebutja", + "Reject request": "Rebutja la sol·licitud", + "The review was not saved. Try again.": "La revisió no s’ha desat. Torneu-ho a provar.", + "This project is waiting for review": "Aquest projecte espera revisió", + "This request was not approved": "Aquesta sol·licitud no s’ha aprovat", + "Reason: {note}": "Motiu: {note}", + "Review request": "Revisa la sol·licitud", + "Request a project": "Sol·licita un projecte", + "Step {step} of 2": "Pas {step} de 2", + "Why is this project needed?": "Per què cal aquest projecte?", + "Give a reason. The reviewer reads it.": "Indiqueu un motiu. El revisor el llegirà.", + "Back": "Enrere", + "Next": "Següent", + "Send request": "Envia la sol·licitud", + "The request was not sent. Try again.": "La sol·licitud no s’ha enviat. Torneu-ho a provar.", + "Requested": "Sol·licitat", + "Not approved": "No aprovat", + "Your request was sent": "S’ha enviat la vostra sol·licitud", + "Let everyone else request a project": "Permet que tothom més sol·liciti un projecte", + "Add a task": "Afegeix una tasca", + "Delete task": "Suprimeix la tasca", + "Edit task": "Edita la tasca", + "Write": "Escriu", + "Preview": "Previsualització", + "Markdown works here: headings, lists and links.": "Aquí funciona el Markdown: títols, llistes i enllaços.", + "Could not save the task. Please try again.": "No s'ha pogut desar la tasca. Torneu-ho a provar.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "\"{title}\" té temps registrat, per tant no es pot suprimir. En lloc d'això, la podeu cancel·lar: els registres de temps es mantenen.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Voleu suprimir \"{title}\"? També se suprimeixen els enllaços amb altres tasques. Això no es pot desfer.", + "Keep task": "Conserva la tasca", + "Cancel task": "Cancel·la la tasca", + "Only the reporter, the project owner or an admin can delete this task.": "Només qui l'ha informada, el propietari del projecte o un administrador pot suprimir aquesta tasca.", + "Could not delete the task. Please try again.": "No s'ha pogut suprimir la tasca. Torneu-ho a provar.", + "Could not cancel the task. Please try again.": "No s'ha pogut cancel·lar la tasca. Torneu-ho a provar.", + "Responsible": "Responsable", + "Also working on this": "També hi treballen", + "Labels": "Etiquetes", + "Could not change the priority. Please try again.": "No s'ha pogut canviar la prioritat. Torneu-ho a provar.", + "Other project members who work on this task alongside the person responsible.": "Altres membres del projecte que treballen en aquesta tasca amb la persona responsable.", + "Duplicate": "Duplica", + "Could not copy the task. Please try again.": "No s'ha pogut copiar la tasca. Torneu-ho a provar.", + "Subtasks": "Subtasques", + "{done} of {total} done": "{done} de {total} fetes", + "Add a subtask": "Afegeix una subtasca", + "Checklist": "Llista de comprovació", + "Checklist item actions": "Accions de l'element de la llista", + "Add a checklist item": "Afegeix un element a la llista", + "Subtasks: {estimate} estimated, {logged} logged": "Subtasques: {estimate} estimat, {logged} registrat", + "Total estimate: {total}": "Estimació total: {total}", + "Part of {title}": "Part de {title}", + "Checklist: {count} done": "Llista de comprovació: {count} fets", + "This task has subtasks: {count}.": "Aquesta tasca té subtasques: {count}.", + "Keep subtasks as separate tasks": "Conserva les subtasques com a tasques separades", + "Delete subtasks too": "Suprimeix també les subtasques", + "Copy of {title}": "Còpia de {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "La tasca s'ha copiat, però no totes les subtasques. Reviseu la còpia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Passos petits dins de la tasca. Cada element té un id, un text i si està fet.", + "Open work per person and per project.": "Feina oberta per persona i per projecte.", + "View": "Visualització", + "By person": "Per persona", + "By project": "Per projecte", + "Hours left": "Hores restants", + "Tasks without an estimate": "Tasques sense estimació", + "Due in 14 days": "Venç en 14 dies", + "Shared": "Compartides", + "Unassigned": "Sense assignar", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Es mostra la feina dels projectes que podeu veure. Les hores compten per a la persona responsable; les tasques compartides es compten sense hores.", + "No open work in these projects.": "No hi ha feina oberta en aquests projectes.", + "Open work": "Feina oberta", + "{count} open tasks": "{count} tasques obertes", + "Create a project to see capacity here.": "Creeu un projecte per veure aquí la capacitat.", + "My tasks": "Les meves tasques", + "Show all my tasks": "Mostra totes les meves tasques", + "No tasks assigned to you": "No teniu cap tasca assignada", + "Browse projects": "Explora els projectes", + "Later": "Més endavant", + "Due {date}": "Venç {date}", + "Could not change the status. Please try again.": "No s'ha pogut canviar l'estat. Torneu-ho a provar.", + "Completed today": "Completades avui", + "My open tasks": "Les meves tasques obertes", + "My overdue tasks": "Les meves tasques endarrerides", + "My tasks in progress": "Les meves tasques en curs", + "Pin to the top": "Fixa a dalt", + "Unpin": "Deixa de fixar", + "Pinned": "Fixat", + "Actions for {title}": "Accions per a {title}", + "Could not save your project order. Please try again.": "No s'ha pogut desar l'ordre dels vostres projectes. Torneu-ho a provar.", + "No boards yet": "Encara no hi ha taulers", + "Create a project to get a board.": "Creeu un projecte per tenir un tauler.", + "Use the Projects page to create and manage your projects and tasks.": "Feu servir la pàgina Projectes per crear i gestionar els vostres projectes i tasques.", + "Go to projects": "Ves als projectes", + "You are not a member of any projects yet.": "Encara no sou membre de cap projecte.", + "Could not search for users. Please try again.": "No s'han pogut cercar usuaris. Torneu-ho a provar.", + "Project creation is restricted to administrators.": "Només els administradors poden crear projectes.", + "Only the project owner or an administrator can delete this project.": "Només el propietari del projecte o un administrador pot suprimir aquest projecte.", + "No projects are available to you yet. Ask an administrator to create one.": "Encara no teniu projectes disponibles. Demaneu a un administrador que en creï un.", + "Due: {date}": "Venç: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Les tasques amb data d'inici o de venciment apareixen a la cronologia. Afegiu-hi dates per veure-les aquí.", + "You do not have access to this project.": "No teniu accés a aquest projecte.", + "Zoom level": "Nivell de zoom", + "Unscheduled": "Sense planificar", + "Start: {date}": "Inici: {date}", + "Today": "Avui", + "No scheduled tasks": "No hi ha tasques planificades", + "An unexpected error occurred.": "S'ha produït un error inesperat.", + "Column {number} name": "Nom de la columna {number}", + "Failed to save creation policy": "No s'ha pogut desar la política de creació", + "All authenticated users": "Tots els usuaris autenticats", + "Control who may create new projects": "Controleu qui pot crear projectes nous", + "Administrators only": "Només administradors", + "Project creation": "Creació de projectes", + "Allow project creation": "Permet la creació de projectes", + "Creation policy saved successfully": "S'ha desat la política de creació", + "Initializing…": "S'està iniciant…", + "e.g. 2h 30m, 90m, 1.5h": "p. ex. 2h 30m, 90m, 1.5h", + "Log time": "Registra temps", + "Save estimate": "Desa l'estimació", + "Logged: {logged}": "Registrat: {logged}", + "over by {amount}": "excedit en {amount}", + "Time tracking": "Registre de temps", + "Estimate": "Estimació", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Introduïu una estimació vàlida (p. ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Introduïu una durada vàlida (p. ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "No s'ha pogut desar el registre de temps. Torneu-ho a provar.", + "Edit time entry": "Edita el registre de temps", + "Duration": "Durada", + "Date range": "Període", + "Last week": "La setmana passada", + "No time logged": "No hi ha temps registrat", + "Log time on a task to see it here.": "Registreu temps en una tasca per veure'l aquí.", + "To date": "Fins a la data", + "This week": "Aquesta setmana", + "Total: {total}": "Total: {total}", + "From date": "Des de la data", + "Custom range": "Període personalitzat", + "All time": "Tot", + "Could not delete a task, so some data may remain. Try deleting the project again.": "No s'ha pogut suprimir una tasca, per tant poden quedar dades. Torneu a suprimir el projecte.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "No s'ha pogut suprimir un registre de temps, per tant poden quedar dades. Torneu a suprimir el projecte.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "No s'ha pogut suprimir una columna, per tant poden quedar dades. Torneu a suprimir el projecte.", + "Could not delete the project. Please try again.": "No s'ha pogut suprimir el projecte. Torneu-ho a provar.", + "Notification settings": "Configuració de les notificacions", + "Configure when due-date reminders are sent": "Configureu quan s'envien els recordatoris de venciment", + "Due-date reminder lead time (hours)": "Antelació del recordatori de venciment (hores)", + "Lead time must be between 1 and 336 hours": "L'antelació ha d'estar entre 1 i 336 hores", + "Reminder lead time saved successfully": "S'ha desat l'antelació del recordatori", + "Failed to save reminder lead time": "No s'ha pogut desar l'antelació del recordatori", + "Notifications": "Notificacions", + "Notify me 1 day before a task's due date": "Avisa'm 1 dia abans del venciment d'una tasca", + "Draft": "Esborrany", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Si la classe és un esborrany que només veu el seu docent, es fa o està cancel·lada.", + "New release": "Versió nova", + "Roadmap chart. The same releases and epics are listed below.": "Gràfic del full de ruta. Les mateixes versions i èpiques apareixen a la llista de sota.", + "Nothing on the roadmap yet": "Encara no hi ha res al full de ruta", + "Releases with a target date and epics with dated tasks appear here.": "Aquí apareixen les versions amb data objectiu i les èpiques amb tasques datades.", + "Releases": "Versions", + "No releases yet": "Encara no hi ha versions", + "Target date: {date}": "Data objectiu: {date}", + "No target date": "Sense data objectiu", + "Edit {name}": "Edita {name}", + "Mark {name} as released": "Marca {name} com a publicada", + "Mark as released": "Marca com a publicada", + "Epics": "Èpiques", + "No epics yet. Open a task to make it an epic.": "Encara no hi ha èpiques. Obriu una tasca per convertir-la en èpica.", + "Not scheduled yet": "Encara sense programar", + "Planned": "Planificada", + "Released": "Publicada", + "Edit release": "Edita la versió", + "Target date": "Data objectiu", + "Could not save the release. Please try again.": "No s'ha pogut desar la versió. Torneu-ho a provar.", + "Every task of this release is done or cancelled.": "Totes les tasques d'aquesta versió estan fetes o cancel·lades.", + "Not finished yet: {count}": "Encara sense acabar: {count}", + "What happens to these tasks?": "Què passa amb aquestes tasques?", + "Move to {name}": "Mou a {name}", + "Remove the release": "Treu la versió", + "Keep it on {name}": "Deixa-les a {name}", + "Could not mark the release as released. Please try again.": "No s'ha pogut marcar la versió com a publicada. Torneu-ho a provar.", + "Roadmap": "Full de ruta", + "Tasks or roadmap": "Tasques o full de ruta", + "Release": "Versió", + "Epic": "Èpica", + "This task is an epic": "Aquesta tasca és una èpica", + "A named, dated delivery of a project that its tasks are planned against.": "Un lliurament d'un projecte amb nom i data, respecte al qual es planifiquen les seves tasques.", + "Name of the release": "Nom de la versió", + "The project this release belongs to": "El projecte al qual pertany aquesta versió", + "What this release delivers": "Què lliura aquesta versió", + "When work on the release starts": "Quan comença la feina en la versió", + "The date the release is due": "La data en què la versió ha d'estar a punt", + "Whether the release is planned, released or archived": "Si la versió està planificada, publicada o arxivada", + "Released on": "Publicada el", + "When the release was marked as released": "Quan es va marcar la versió com a publicada", + "The release this task is planned for": "La versió per a la qual està planificada aquesta tasca", + "Board view options": "Opcions de visualització del tauler", + "Colour cards": "Acoloreix les targetes", + "No colour": "Sense color", + "By label": "Per etiqueta", + "Swimlanes": "Carrils", + "No swimlanes": "Sense carrils", + "By assignee": "Per persona assignada", + "By epic": "Per èpica", + "No assignee": "Sense assignar", + "No epic": "Sense èpica", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Les targetes es queden a la fila de la seva èpica. Canvieu l'èpica a la pàgina de la tasca.", + "Hand over to": "Traspassa a", + "Could not save your board view. It applies until you reload.": "No s'ha pogut desar la vista del tauler. S'aplica fins que torneu a carregar.", + "Timetable wish": "Desig d'horari", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Un desig que el generador té en compte. Sempre respecta un desig estricte, i un de flexible quan pot.", + "Whether the wish is about a teacher, a group, a room or one activity": "Si el desig tracta d'un docent, un grup, una aula o una activitat", + "Teacher": "Docent", + "Group": "Grup", + "Reference": "Referència", + "The user, group, room or activity the wish is about": "L'usuari, grup, aula o activitat a què es refereix el desig", + "What the wish asks for": "El que demana el desig", + "Not on these periods": "No en aquestes franges", + "Preferably not on these periods": "Preferiblement no en aquestes franges", + "At most a number of lessons a day": "Com a màxim un nombre de classes al dia", + "No free periods between lessons": "Sense hores lliures entre classes", + "Always the same room": "Sempre la mateixa aula", + "Periods": "Franges", + "The periods of the week the wish is about, such as wed-5": "Les franges de la setmana a què es refereix, com wed-5", + "Limit": "Límit", + "The most lessons a day, for a wish of that kind": "El màxim de classes al dia, per a un desig d'aquest tipus", + "Strength": "Força", + "Whether the generator must keep the wish or should keep it": "Si el generador ha de o hauria de respectar el desig", + "Hard": "Estricte", + "Soft": "Flexible", + "Weight": "Pes", + "How much a soft wish counts, from 1 to 3": "Quant compta un desig flexible, d'1 a 3", + "Why the wish exists": "Per què existeix el desig", + "Timetable scenario": "Escenari d'horari", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Un patró setmanal, fet pel generador o pres de l'horari actual. Desa les dades d'entrada i com respecta els desigs.", + "The name timetablers know the scenario by": "El nom amb què els planificadors coneixen l'escenari", + "Whether the generator made it or it came from the current timetable": "Si l'ha fet el generador o ve de l'horari actual", + "Generated": "Generat", + "From the current timetable": "De l'horari actual", + "Week of": "Setmana del", + "The Monday of the first week of the window": "El dilluns de la primera setmana del període", + "Window start": "Inici del període", + "The first day the week pattern applies to": "El primer dia en què s'aplica el patró setmanal", + "Window end": "Fi del període", + "The last day the week pattern applies to": "L'últim dia en què s'aplica el patró setmanal", + "Waiting, generating, done, failed, or published as draft lessons": "En espera, generant, llest, fallit o publicat com a classes esborrany", + "Waiting": "En espera", + "Generating": "Generant", + "Failed": "Fallit", + "Published": "Publicat", + "Seed": "Llavor", + "The number the generator starts from, so a run can be repeated": "El nombre amb què comença el generador, per poder repetir una execució", + "Input": "Entrada", + "The periods, rooms, lessons and wishes the scenario was made from": "Les franges, aules, classes i desigs d'on surt l'escenari", + "Placements": "Ubicacions", + "Each lesson with the period and room it was given": "Cada classe amb la franja i l'aula que ha rebut", + "Unplaced lessons": "Classes sense ubicar", + "Lessons without a place, each with the hard wish that blocked it": "Classes sense lloc, cadascuna amb el desig estricte que la va bloquejar", + "Broken wishes": "Desigs incomplerts", + "The wishes this scenario breaks, with the lessons that break them": "Els desigs que aquest escenari incompleix, amb les classes implicades", + "Measures": "Mesures", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Classes ubicades, desigs incomplerts, forats docents, classes al dia i ús de les aules", + "Reason": "Motiu", + "Why the run failed": "Per què ha fallat l'execució", + "Published at": "Publicat el", + "When the scenario was written out as draft lessons": "Quan es va escriure l'escenari com a classes esborrany", + "Edit wish": "Edita el desig", + "New wish": "Desig nou", + "Hard: the generator always keeps it": "Estricte: el generador sempre el respecta", + "Soft: the generator keeps it where it can": "Flexible: el generador el respecta quan pot", + "Weight (1 to 3)": "Pes (d'1 a 3)", + "Most lessons a day": "Màxim de classes al dia", + "Period": "Franja", + "{day} period {number}": "{day} franja {number}", + "Teacher (user name)": "Docent (nom d'usuari)", + "Activity (group:subject)": "Activitat (grup:assignatura)", + "Say who or what the wish is about.": "Indiqueu a qui o a què es refereix el desig.", + "Choose at least one period.": "Trieu almenys una franja.", + "The limit is a whole number of 1 or more.": "El límit és un nombre enter d'1 o més.", + "Timetable": "Horari", + "Wishes": "Desitjos", + "Timetable wishes": "Desitjos d'horari", + "Generator run": "Execució del generador", + "Generator progress": "Progrés del generador", + "The run failed: {reason}": "L'execució ha fallat: {reason}", + "{placed} of {lessons} lessons placed": "{placed} de {lessons} classes col·locades", + "Generate again": "Genera de nou", + "Generate": "Genera", + "Every lesson has a place.": "Cada classe té un lloc.", + "Lesson": "Classe", + "No free period and room": "Cap franja ni aula lliure", + "Broken soft wishes": "Desitjos flexibles incomplerts", + "Every soft wish is kept.": "Es respecta cada desig flexible.", + "Wish": "Desig", + "Lessons": "Classes", + "Generating: {percent}% of the time budget used": "S'està generant: {percent}% del temps usat", + "Waiting to start": "Esperant per començar", + "Published as draft lessons": "Publicat com a classes en esborrany", + "Could not read the scenario.": "No s'ha pogut llegir l'escenari.", + "Could not start the run.": "No s'ha pogut iniciar l'execució.", + "Scenarios": "Escenaris", + "Timetable scenarios": "Escenaris d'horari", + "Scenario": "Escenari", + "Take the current timetable": "Agafa l'horari actual", + "Could not take the current timetable.": "No s'ha pogut agafar l'horari actual.", + "Broken hard wishes": "Desitjos obligatoris incomplerts", + "Not on a period of the week grid": "No és en una franja de la graella setmanal", + "Compare scenarios": "Compara escenaris", + "Scenarios to compare": "Escenaris per comparar", + "Choose two or three scenarios to compare them.": "Trieu dos o tres escenaris per comparar-los.", + "Measure": "Mesura", + "Best": "El millor", + "Lessons that differ": "Classes que difereixen", + "No lesson differs.": "Cap classe no difereix.", + "Not placed": "Sense col·locar", + "{period} in {room}": "{period} a {room}", + "Lessons placed": "Classes col·locades", + "Lessons without a place": "Classes sense lloc", + "Clashes": "Conflictes", + "Hard wishes broken": "Desitjos estrictes incomplerts", + "Soft wishes broken": "Desitjos flexibles incomplerts", + "Soft wishes broken, weighted": "Desitjos flexibles incomplerts, ponderats", + "Free periods between lessons, all teachers": "Hores lliures, tots els docents", + "Most free periods of one teacher": "Més hores lliures d'un docent", + "Most lessons of one group on a day": "Més classes d'un grup en un dia", + "Room use": "Ús de les aules", + "Publish as draft lessons": "Publica com a classes esborrany", + "Draft lessons written: {count}": "Classes esborrany escrites: {count}", + "Could not publish the scenario.": "No s'ha pogut publicar l'escenari.", + "Rules": "Regles", + "Rules for {column}": "Regles de {column}", + "When a card enters this column": "Quan una targeta entra en aquesta columna", + "Action": "Acció", + "Set the priority": "Defineix la prioritat", + "Assign to": "Assigna a", + "Assign the person who moved the card": "Assigna a la persona que ha mogut la targeta", + "Remove the assignee": "Treu la persona assignada", + "Add a label": "Afegeix una etiqueta", + "No longer a project member": "Ja no és membre del projecte", + "This label no longer exists": "Aquesta etiqueta ja no existeix", + "Add rule": "Afegeix una regla", + "Remove rule": "Treu la regla", + "No rules yet. Add one to change a card when it enters this column.": "Encara no hi ha regles. Afegiu-ne una per canviar una targeta quan entri en aquesta columna.", + "Could not save the rules. Please try again.": "No s'han pogut desar les regles. Torneu-ho a provar.", + "1 rule runs when a card enters this column": "1 regla s'aplica quan una targeta entra en aquesta columna", + "{count} rules run when a card enters this column": "{count} regles s'apliquen quan una targeta entra en aquesta columna", + "Rules applied: {changes}": "Regles aplicades: {changes}", + "assigned to {name}": "assignada a {name}", + "assignee removed": "persona assignada treta", + "priority {priority}": "prioritat {priority}", + "label {label}": "etiqueta {label}", + "What happens to a card when it enters this column, applied in list order.": "Què passa amb una targeta quan entra en aquesta columna, en l'ordre de la llista.", + "Value": "Valor", + "What the rule does to the card.": "El que la regla fa amb la targeta.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "La prioritat, l'id d'usuari o l'id d'etiqueta que fa servir l'acció; buit per a accions sense valor.", + "is not": "no és", + "{dimension} is not": "{dimension} no és", + "Saved filters": "Filtres desats", + "No saved filters yet": "Encara no hi ha filtres desats", + "Save filter": "Desa el filtre", + "Rename \"{name}\"": "Canvia el nom de «{name}»", + "Delete \"{name}\"": "Suprimeix «{name}»", + "Clear filters": "Esborra els filtres", + "Showing {shown} of {total} tasks": "Es mostren {shown} de {total} tasques", + "Me": "Jo", + "No date": "Sense data", + "Rename saved filter": "Canvia el nom del filtre desat", + "Share with the project": "Comparteix amb el projecte", + "Give the filter a name": "Poseu un nom al filtre", + "Could not save the filter. Please try again.": "No s'ha pogut desar el filtre. Torneu-ho a provar.", + "Some labels in \"{name}\" no longer exist and were left out.": "Algunes etiquetes de «{name}» ja no existeixen i s'han omès.", + "Could not delete the filter. Please try again.": "No s'ha pogut suprimir el filtre. Torneu-ho a provar.", + "Saved filter": "Filtre desat", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Un filtre de tauler amb nom d'un projecte, privat per a qui el va desar, tret que es comparteixi amb el projecte.", + "The project whose board the filter applies to": "El projecte al tauler del qual s'aplica el filtre", + "The name the filter is listed under": "El nom amb què surt el filtre a la llista", + "Saved by": "Desat per", + "Nextcloud user id of the person who saved the filter": "Id d'usuari de Nextcloud de qui va desar el filtre", + "Shared with the project": "Compartit amb el projecte", + "Whether every project member sees and applies the filter": "Si cada membre del projecte veu i pot aplicar el filtre", + "Criteria": "Criteris", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "El filtre: persona assignada, etiqueta, prioritat i venciment, cadascun amb és o no és i els seus valors", + "Cross-project view": "Vista entre projectes", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Una selecció desada de projectes les tasques dels quals es mostren juntes en carrils d'estat, compartida amb les persones que indica.", + "Shared with": "Compartida amb", + "The name the view is listed under": "El nom amb què apareix la vista", + "Nextcloud user id of the person who saved the view": "Id d'usuari de Nextcloud de la persona que va desar la vista", + "Nextcloud user ids of the people the view is shared with": "Ids d'usuari de Nextcloud de les persones amb qui es comparteix la vista", + "The projects whose tasks the view shows, at most twenty": "Els projectes les tasques dels quals mostra la vista, com a màxim vint", + "1 project in this view is hidden from you.": "1 projecte d'aquesta vista t'és ocult.", + "{count} projects in this view are hidden from you.": "{count} projectes d'aquesta vista et són ocults.", + "{project} has no column for {status}.": "{project} no té cap columna per a {status}.", + "This view does not exist or is not shared with you.": "Aquesta vista no existeix o no s'ha compartit amb tu.", + "\"{task}\" moved to {status}.": "\"{task}\" s'ha mogut a {status}.", + "Project: {title}": "Projecte: {title}", + "Cross-project views": "Vistes entre projectes", + "New view": "Vista nova", + "Edit view": "Edita la vista", + "Delete view": "Suprimeix la vista", + "Give the view a name": "Posa un nom a la vista", + "Pick at least one project": "Tria almenys un projecte", + "A view shows at most {max} projects": "Una vista mostra com a màxim {max} projectes", + "Could not save the view. Please try again.": "No s'ha pogut desar la vista. Torna-ho a provar.", + "Could not delete the view. Please try again.": "No s'ha pogut suprimir la vista. Torna-ho a provar.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Vols suprimir \"{title}\"? Els projectes i les seves tasques queden com estan.", + "People see the tasks of the projects they are in, never more.": "Cadascú veu les tasques dels projectes on és, mai més.", + "No views yet. A view shows the tasks of several of your projects together.": "Encara no hi ha vistes. Una vista mostra juntes les tasques de diversos dels teus projectes.", + "Projects in view: {count}": "Projectes a la vista: {count}", + "Notify me when a task is assigned to me": "Avisa'm quan se m'assigni una tasca", + "Also send these to me by email": "Envia-me'ls també per correu", + "Add an email address in your Nextcloud personal settings to get mail.": "Afegeix una adreça de correu a la configuració personal de Nextcloud per rebre correu.", + "Code link": "Enllaç de codi", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Un commit, branca, sol·licitud de fusió o incidència en una forja de codi que treballa en una tasca.", + "The task the link belongs to": "La tasca a la qual pertany l'enllaç", + "The project of the task": "El projecte de la tasca", + "Task key": "Clau de la tasca", + "The task key the forge text named, such as VC-12": "La clau de tasca que citava el text de la forja, com VC-12", + "What the link points at": "On apunta l'enllaç", + "Link": "Enllaç", + "The address of the item in the forge": "L'adreça de l'element a la forja", + "The commit message, branch name or merge request title": "El missatge del commit, el nom de la branca o el títol de la sol·licitud de fusió", + "Repository": "Repositori", + "The repository, such as acme/portal": "El repositori, com acme/portal", + "Forge id": "Id a la forja", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "L'id propi de l'element a la forja, com github:acme/portal#42 o un hash de commit", + "State": "Estat", + "The state of a merge request or issue": "L'estat d'una sol·licitud de fusió o incidència", + "Who made the commit or opened the merge request": "Qui va fer el commit o va obrir la sol·licitud de fusió", + "When the commit was made or the merge request last changed": "Quan es va fer el commit o va canviar per última vegada la sol·licitud de fusió", + "Added by": "Afegit per", + "Whether a person added the link or the integration wrote it": "Si una persona va afegir l'enllaç o el va escriure la integració", + "Nextcloud user UIDs of project members": "UID d'usuari de Nextcloud dels membres del projecte", + "Add link": "Afegeix un enllaç", + "Added by hand": "Afegit a mà", + "Branch": "Branca", + "Code": "Codi", + "Commit": "Commit", + "From the integration": "Des de la integració", + "Link to a commit, branch or merge request": "Enllaç a un commit, branca o sol·licitud de fusió", + "Merge request": "Sol·licitud de fusió", + "Merged": "Fusionada", + "No code linked yet. Name {key} in a commit message or paste a link.": "Encara no hi ha codi enllaçat. Esmenta {key} en un missatge de commit o enganxa un enllaç.", + "No code linked yet. Paste a link to a commit or merge request.": "Encara no hi ha codi enllaçat. Enganxa un enllaç a un commit o sol·licitud de fusió.", + "Paste a web address that starts with https://.": "Enganxa una adreça web que comenci per https://.", + "Remove link {title}": "Treu l'enllaç {title}", + "The link could not be added.": "No s'ha pogut afegir l'enllaç.", + "The link could not be removed.": "No s'ha pogut treure l'enllaç.", + "This link is already on the task.": "Aquest enllaç ja és a la tasca.", + "Code forges": "Forges de codi", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Enllaça commits i pull requests de GitHub amb tasques. Integriq rep els esdeveniments; planninq mai no crida GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Baixa la configuració i importa-la a Integriq. Després escriu un secret a la regla \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "A GitHub, afegeix al repositori un webhook amb aquesta adreça i el mateix secret. Tria el tipus de contingut application/json i els esdeveniments push i pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Esmenta la clau de la tasca, com VC-12, en un missatge de commit, un nom de branca o el títol d'una pull request. L'enllaç apareix llavors a aquesta tasca.", + "Without Integriq, project members can still paste a link on the task page.": "Sense Integriq, els membres del projecte encara poden enganxar un enllaç a la pàgina de la tasca.", + "Download the Integriq configuration": "Baixa la configuració d'Integriq", + "Calendar": "Calendari", + "Previous": "Anterior", + "Calendar view": "Vista del calendari", + "Starts:": "Comença:", + "No tasks with a date in this month.": "No hi ha tasques amb data aquest mes.", + "Week of {start} to {end}": "Setmana del {start} al {end}", + "My calendar": "El meu calendari", + "Show as list": "Mostra com a llista", + "Show as calendar": "Mostra com a calendari", + "Open my calendar": "Obre el meu calendari", + "Nextcloud Tasks": "Tasques de Nextcloud", + "Show my tasks in Nextcloud Tasks": "Mostra les meves tasques a Tasques de Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Les tasques que tens assignades o compartides amb tu apareixen en una llista \"Planninq\" a Tasques i Calendari de Nextcloud. Els canvis que hi facis se substitueixen amb el següent canvi a Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Aquest servidor no pot escriure a Tasques de Nextcloud, per tant l'exportació no està disponible.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Gestionat per Planninq. Els canvis fets aquí se substitueixen amb el següent canvi a Planninq.", + "Working days and holidays": "Dies laborables i festius", + "Dates set on the timeline skip the days that are not working days.": "Les dates fixades a la cronologia salten els dies que no són laborables.", + "Working weekdays": "Dies laborables de la setmana", + "Non-working days": "Dies no laborables", + "No non-working days yet.": "Encara no hi ha dies no laborables.", + "Add day": "Afegeix un dia", + "Year": "Any", + "Add Dutch national holidays": "Afegeix els festius nacionals neerlandesos", + "Save working days": "Desa els dies laborables", + "Choose at least one working weekday.": "Tria almenys un dia laborable.", + "Working days saved.": "Dies laborables desats.", + "Could not save the working days.": "No s'han pogut desar els dies laborables.", + "New Year's Day": "Cap d'Any", + "Easter Sunday": "Diumenge de Pasqua", + "Easter Monday": "Dilluns de Pasqua", + "King's Day": "Dia del Rei", + "Liberation Day": "Dia de l'Alliberament", + "Ascension Day": "Ascensió", + "Whit Sunday": "Diumenge de Pentecosta", + "Whit Monday": "Dilluns de Pentecosta", + "Christmas Day": "Nadal", + "Boxing Day": "Sant Esteve", + "Dates of {title}": "Dates de {title}", + "The due date cannot be before the start date.": "La data de venciment no pot ser anterior a la d'inici.", + "{title}, from {start} to {end}": "{title}, del {start} al {end}", + "The dates could not be saved.": "No s'han pogut desar les dates.", + "{title} now runs from {start} to {end}": "{title} ara va del {start} al {end}", + "Auto-scheduling": "Planificació automàtica", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Si està activada, endarrerir un venciment a la cronologia ofereix moure també les tasques que bloqueja.", + "Move blocked tasks along when a task slips": "Mou les tasques bloquejades quan una tasca s'endarrereix", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "A la cronologia, un venciment posterior ofereix moure les tasques bloquejades. Només compten els enllaços \"bloqueja\", i les tasques només es mouen més tard.", + "Move the tasks that wait for {title}?": "Voleu moure les tasques que esperen {title}?", + "These tasks wait for it and would start after its new due date:": "Aquestes tasques l'esperen i començarien després del nou venciment:", + "{count} tasks would move; the first {limit} are listed.": "Es mourien {count} tasques; es mostren les primeres {limit}.", + "Now": "Ara", + "After the move": "Després del canvi", + "Only this task": "Només aquesta tasca", + "Move all": "Mou-les totes", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Aturat a {title}: no s'han pogut desar les dates. Les tasques anteriors s'han mogut.", + "Cumulative flow": "Flux acumulat", + "Show as chart": "Mostra com a gràfic", + "Show as table": "Mostra com a taula", + "Tasks per column per day": "Tasques per columna i dia", + "Tasks without recorded history in this period: {count}": "Tasques sense historial registrat en aquest període: {count}", + "Lead and cycle time": "Termini de lliurament i temps de cicle", + "No tasks were finished in this period.": "No s'ha acabat cap tasca en aquest període.", + "Finished tasks": "Tasques acabades", + "Cycle time, average": "Temps de cicle, mitjana", + "Cycle time, 85th percentile": "Temps de cicle, percentil 85", + "Lead time, average": "Termini de lliurament, mitjana", + "Tasks whose finish time was estimated from their history: {count}": "Tasques l'hora de finalització de les quals s'ha estimat a partir de l'historial: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Temps de cicle de cada tasca acabada, amb la mitjana i el percentil 85", + "Slowest tasks": "Tasques més lentes", + "cycle {cycle}, lead {lead}": "cicle {cycle}, termini {lead}", + "{days} days": "{days} dies", + "Could not load the flow of this project.": "No s'ha pogut carregar el flux d'aquest projecte.", + "Last {days} days": "Darrers {days} dies", + "Portfolio flow": "Flux de la cartera", + "An admin adds portfolios under Projects, Portfolios.": "Un administrador afegeix carteres a Projectes, Carteres.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projectes no mostrats, perquè se'n mostren com a màxim 50 alhora: {count}", + "Could not load the flow of this portfolio.": "No s'ha pogut carregar el flux d'aquesta cartera.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flux acumulat i temps de cicle dels projectes d'una cartera.", + "Edit report": "Edita l'informe", + "Only tasks where": "Només tasques on", + "Group by": "Agrupa per", + "Display": "Visualització", + "Share with everyone who can read its projects": "Comparteix amb tothom qui pot llegir-ne els projectes", + "The report could not be saved.": "No s'ha pogut desar l'informe.", + "Number of tasks": "Nombre de tasques", + "Bar": "Barres", + "Donut": "Anell", + "Table": "Taula", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} de {total} projectes d'aquest informe no són visibles per a tu", + "No tasks match this report.": "Cap tasca no coincideix amb aquest informe.", + "None": "Cap", + "Could not load this report.": "No s'ha pogut carregar aquest informe.", + "Report": "Informe", + "Your reports": "Els teus informes", + "My reports": "Els meus informes", + "Shared reports": "Informes compartits", + "You have not built a report yet.": "Encara no has creat cap informe.", + "Nobody has shared a report with you yet.": "Encara ningú no ha compartit cap informe amb tu.", + "Reports you built over tasks, and the ones shared with you.": "Informes que has creat sobre tasques, i els compartits amb tu.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Una consulta desada sobre tasques: quins projectes, quins filtres, agrupada per què, comptada o sumada, i mostrada com a taula o gràfic.", + "The name the report is listed under": "El nom amb què apareix l'informe a la llista", + "What the report shows and who it is for": "Què mostra l'informe i per a qui és", + "Nextcloud user id of the person who saved the report": "Id d'usuari de Nextcloud de qui ha desat l'informe", + "Who can open the report": "Qui pot obrir l'informe", + "Only me": "Només jo", + "Everyone who can read its projects": "Tothom qui pot llegir-ne els projectes", + "The projects the report covers, at most fifty": "Els projectes que cobreix l'informe, com a màxim cinquanta", + "Filters": "Filtres", + "Task fields and the value each must equal": "Camps de la tasca i el valor al qual ha de ser igual cadascun", + "The task field the report groups on": "El camp de la tasca pel qual agrupa l'informe", + "Count the tasks, or add up a number on them": "Comptar les tasques, o sumar-ne un nombre", + "Sum": "Suma", + "Sum of": "Suma de", + "The number added up when the measure is a sum": "El nombre que se suma quan la mesura és una suma", + "Story points": "Punts d'història", + "Estimated duration": "Durada estimada", + "How the report is shown": "Com es mostra l'informe", + "Issue type": "Tipus d'incidència", + "Task fields and the value each must equal; empty when the report covers every task": "Camps de la tasca i el valor que ha de tenir cadascun; buit si l'informe abasta totes les tasques", + "The status a task must have": "L'estat que ha de tenir una tasca", + "The priority a task must have": "La prioritat que ha de tenir una tasca", + "The user a task must be assigned to": "L'usuari a qui ha d'estar assignada una tasca", + "A label a task must carry": "Una etiqueta que ha de portar una tasca", + "The board column a task must be in": "La columna del tauler on ha de ser una tasca", + "The issue type a task must have": "El tipus d'incidència que ha de tenir una tasca", + "Manager groups": "Grups gestors", + "Member groups": "Grups membres", + "Viewer groups": "Grups lectors", + "Viewers": "Lectors", + "Owning group": "Grup propietari", + "Nextcloud groups whose members manage the project": "Grups de Nextcloud els membres dels quals gestionen el projecte", + "Nextcloud groups whose members work on the project": "Grups de Nextcloud els membres dels quals treballen en el projecte", + "Nextcloud groups whose members may read the project": "Grups de Nextcloud els membres dels quals poden llegir el projecte", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Usuaris de Nextcloud que gestionen el projecte: configuració, membres i feina", + "Nextcloud user ids who may read the project and its work but not change it": "Usuaris de Nextcloud que poden llegir el projecte i la seva feina però no canviar-los", + "The Nextcloud group that owns the project with its creator, at most one": "El grup de Nextcloud que posseeix el projecte amb qui l'ha creat, com a màxim un", + "Nextcloud user ids who may read this through the project": "Usuaris de Nextcloud que poden llegir això a través del projecte", + "Nextcloud groups whose members may change this through the project": "Grups de Nextcloud els membres dels quals poden canviar això a través del projecte", + "Nextcloud groups whose members may read this through the project": "Grups de Nextcloud els membres dels quals poden llegir això a través del projecte", + "Search for a person or a group…": "Cerca una persona o un grup…", + "No one found. Your admin's sharing settings decide who you can find.": "No s'ha trobat ningú. La configuració de compartició del teu administrador decideix qui pots trobar.", + "Type at least two characters": "Escriu almenys dos caràcters", + "Everyone in this group": "Tothom en aquest grup", + "Could not search for people. Please try again.": "No s'han pogut cercar persones. Torna-ho a provar.", + "Could not remove the group": "No s'ha pogut treure el grup", + "Only the owner and managers change who is on this project.": "Només el propietari i els gestors canvien qui és en aquest projecte.", + "Role of {name}": "Rol de {name}", + "Manager": "Gestor", + "Member": "Membre", + "Viewer": "Lector", + "Could not change the role": "No s'ha pogut canviar el rol", + "Owned by group: {name}": "Propietat del grup: {name}", + "No group owns this project.": "Cap grup és propietari d'aquest projecte.", + "Owned by group": "Propietat del grup", + "Search for a group…": "Cerca un grup…", + "No group found. Your admin's sharing settings decide which groups you can find.": "No s'ha trobat cap grup. La configuració de compartició del vostre administrador decideix quins grups podeu trobar.", + "No owning group": "Sense grup propietari", + "Could not search for groups. Please try again.": "No s'han pogut cercar grups. Torneu-ho a provar.", + "Could not change the owning group": "No s'ha pogut canviar el grup propietari", + "You can read this project. Only its members change it.": "Pots llegir aquest projecte. Només els seus membres el canvien.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "El curs que s'imparteix en aquesta classe, com una optativa, quan l'aplicació d'aprenentatge de l'escola el coneix.", + "Online meeting link": "Enllaç de la classe en línia", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "On els alumnes s'uneixen a aquesta classe en línia. El botó Uneix-te només apareix amb un enllaç https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ca.json b/l10n/ca.json index b67e8c0e..dbcd2789 100644 --- a/l10n/ca.json +++ b/l10n/ca.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Projectes actius", + "Archived projects": "Projectes arxivats", + "Boards": "Taulers", + "My projects": "Els meus projectes", + "Portfolio": "Cartera", + "Project board": "Tauler del projecte", + "Projects I am in": "Projectes en què participo", + "Timeline": "Cronologia", + "Timesheet": "Full d'hores", + "Features & roadmap": "Funcions i full de ruta", + "Flow": "Flux", + "Flows": "Fluxos", + "Reports": "Informes", + "Pick a report to open it.": "Trieu un informe per obrir-lo.", + "In progress": "En curs", + "Date": "Data", + "Due": "Venciment", + "Assignee": "Assignat a", + "Who": "Qui", + "What": "Què", + "Minutes": "Minuts", + "Entries": "Entrades", + "Most recent": "Més recents", + "Per person": "Per persona", + "By status": "Per estat", + "By priority": "Per prioritat", + "Task status": "Estat de les tasques", + "Time spent": "Temps dedicat", + "Capacity": "Capacitat", + "Due soonest": "Vencen abans", + "Minutes logged": "Minuts registrats", + "Nothing is due": "No hi ha venciments", + "Nothing logged yet": "Encara no hi ha registres", + "What is open, what is blocked, and what is overdue.": "Què està obert, què està bloquejat i què està vençut.", + "How allocation is spread across the people working on projects.": "Com es reparteix l'assignació entre les persones que treballen en projectes.", + "Hours logged, and the projects they went to.": "Les hores registrades i els projectes on han anat.", + "Billable": "Facturable", + "Budget: {amount}": "Pressupost: {amount}", + "Loading projects": "S'estan carregant els projectes", + "No projects for this client yet": "Encara no hi ha projectes per a aquest client", + "Open in Planninq": "Obre a Planninq", + "This project could not be found": "No s'ha trobat aquest projecte", + "Untitled project": "Projecte sense títol", + "and {count} more": "i {count} més", + "Store": "Botiga", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instal·leu registres, esquemes i fluxos publicats per altres organitzacions.", + "Work Date": "Data de treball", + "Zaak UUID": "UUID de Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Accions de la columna", + "Columns": "Columnes", + "Could not remove the column. Please try again.": "No s'ha pogut eliminar la columna. Torneu-ho a provar.", + "Could not save the column. Please try again.": "No s'ha pogut desar la columna. Torneu-ho a provar.", + "Done column": "Columna de fet", + "Edit column": "Edita la columna", + "Keep the card's status": "Mantén l'estat de la targeta", + "Move its cards to": "Mou les seves targetes a", + "Move left": "Mou a l'esquerra", + "Move right": "Mou a la dreta", + "Status of cards moved here": "Estat de les targetes mogudes aquí", + "The last done column cannot be removed.": "L'última columna de fet no es pot eliminar.", + "WIP limit": "Límit WIP", + "over limit": "per sobre del límit", + "The status a card gets when it is moved into this column.": "L'estat que rep una targeta quan es mou a aquesta columna.", + "All priorities": "Totes les prioritats", + "Could not create the task. Please try again.": "No s'ha pogut crear la tasca. Torneu-ho a provar.", + "Created": "Creada", + "Move to backlog": "Al backlog", + "Move to board": "Al tauler", + "New task": "Tasca nova", + "Nothing in the backlog": "No hi ha res al backlog", + "Rank": "Rang", + "Sort by": "Ordena per", + "Sort by rank to reorder": "Ordeneu per rang per reordenar", + "Task actions": "Accions de la tasca", + "All labels": "Totes les etiquetes", + "Filter tasks by label": "Filtra les tasques per etiqueta", + "View timeline": "Mostra la cronologia", + "Board": "Tauler", + "List": "Llista", + "Column": "Columna", + "Board or list": "Tauler o llista", + "Log": "Registre", + "Add entry": "Afegeix una entrada", + "Show": "Mostra", + "No actions yet": "Encara no hi ha accions", + "Closed": "Tancat", + "Entry actions": "Accions de l'entrada", + "Add action": "Afegeix una acció", + "by {author}": "per {author}", + "saved {time}": "desat {time}", + "Attendees: {names}": "Assistents: {names}", + "Add the first entry": "Afegeix la primera entrada", + "Issues": "Incidències", + "Lessons learned": "Lliçons apreses", + "Meetings": "Reunions", + "Decisions": "Decisions", + "Actions": "Accions", + "Issue": "Incidència", + "Lesson learned": "Lliçó apresa", + "Meeting": "Reunió", + "Decision": "Decisió", + "About this project": "Quant a aquest projecte", + "No description yet": "Encara no hi ha descripció", + "Start date": "Data d'inici", + "Not set": "Sense definir", + "End date": "Data de finalització", + "Progress": "Progrés", + "No tasks yet": "Encara no hi ha tasques", + "Open the board": "Obre el tauler", + "People": "Persones", + "Owner": "Propietari", + "Latest log entries": "Darreres entrades", + "Open the log": "Obre el registre", + "{done} of {total} tasks done": "{done} de {total} tasques fetes", + "Edit entry": "Edita l'entrada", + "Type": "Tipus", + "Attendees": "Assistents", + "Issue is closed": "La incidència està tancada", + "Could not save the entry. Please try again.": "No s'ha pogut desar l'entrada. Torneu-ho a provar.", + "From: {title}": "De: {title}", + "What needs to happen": "Què cal fer", + "Could not create the action. Please try again.": "No s'ha pogut crear l'acció. Torneu-ho a provar.", + "The action was created but could not be linked to the entry.": "L'acció s'ha creat, però no s'ha pogut enllaçar amb l'entrada.", + "Project pages": "Pàgines del projecte", + "Overview": "Visió general", + "Risks": "Riscos", + "Log entry": "Entrada del registre", + "A short name for the entry": "Un nom curt per a l'entrada", + "Project": "Projecte", + "The project this entry belongs to": "El projecte al qual pertany aquesta entrada", + "What kind of entry this is": "Quin tipus d'entrada és", + "When it happened": "Quan va passar", + "What happened, in Markdown": "Què va passar, en Markdown", + "Whether an issue is still open": "Si una incidència encara és oberta", + "The people at a meeting": "Les persones en una reunió", + "Tasks that came out of this entry": "Tasques sorgides d'aquesta entrada", + "Add risk": "Afegeix un risc", + "Risk": "Risc", + "Score": "Puntuació", + "Response": "Resposta", + "Review date": "Data de revisió", + "no longer on the project": "ja no és al projecte", + "Edit {title}": "Edita {title}", + "No risks recorded yet": "Encara no hi ha riscos registrats", + "Add the first risk": "Afegeix el primer risc", + "Medium": "Mitjà", + "Mitigating": "En mitigació", + "Occurred": "S'ha produït", + "Avoid": "Evitar", + "Reduce": "Reduir", + "Transfer": "Transferir", + "Accept": "Acceptar", + "Highest open risks": "Riscos oberts més alts", + "No open risks": "No hi ha riscos oberts", + "Open the risk register": "Obre el registre de riscos", + "Edit risk": "Edita el risc", + "What could go wrong": "Què podria sortir malament", + "Likelihood": "Probabilitat", + "Impact": "Impacte", + "Score {score}": "Puntuació {score}", + "Countermeasures": "Contramesures", + "Could not save the risk. Please try again.": "No s'ha pogut desar el risc. Torneu-ho a provar.", + "Risks by likelihood and impact": "Riscos per probabilitat i impacte", + "Risk scale": "Escala de risc", + "The levels every project scores its risks on, and where low turns into medium and high": "Els nivells amb què cada projecte puntua els seus riscos, i on baix passa a mitjà i alt", + "Number of levels": "Nombre de nivells", + "Likelihood labels": "Etiquetes de probabilitat", + "Impact labels": "Etiquetes d'impacte", + "Level {level}": "Nivell {level}", + "Medium from score": "Mitjà a partir de la puntuació", + "High from score": "Alt a partir de la puntuació", + "Risk scale saved": "S'ha desat l'escala de risc", + "1 risk uses level {level}. Change it first.": "1 risc fa servir el nivell {level}. Canvieu-lo primer.", + "{count} risks use level {level}. Change them first.": "{count} riscos fan servir el nivell {level}. Canvieu-los primer.", + "Every level needs a label, and high must start above medium.": "Cada nivell necessita una etiqueta, i alt ha de començar per sobre de mitjà.", + "The project this risk belongs to": "El projecte al qual pertany aquest risc", + "The cause and the effect, in Markdown": "La causa i l'efecte, en Markdown", + "Category": "Categoria", + "A free grouping, such as planning, budget or supplier": "Una agrupació lliure, com planificació, pressupost o proveïdor", + "How likely it is, on the admin's risk scale": "Com de probable és, a l'escala de risc de l'administrador", + "How hard it would hit, on the admin's risk scale": "Com de fort colpejaria, a l'escala de risc de l'administrador", + "Likelihood times impact, calculated by the server": "Probabilitat per impacte, calculat pel servidor", + "Where the risk stands": "On és el risc", + "The person who watches this risk": "La persona que vigila aquest risc", + "How the project answers the risk": "Com respon el projecte al risc", + "What is done to prevent it or soften it, in Markdown": "Què es fa per evitar-lo o suavitzar-lo, en Markdown", + "When to look at this risk again": "Quan cal revisar de nou aquest risc", + "Very low": "Molt baix", + "Very high": "Molt alt", + "All projects": "Tots els projectes", + "Project status report": "Informe d'estat del projecte", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Un informe datat sobre com està un projecte en diners, organització, temps, informació, qualitat i risc (els aspectes GROTIK), cadascun amb una nota.", + "The project this report is about": "El projecte del qual tracta aquest informe", + "Report date": "Data de l'informe", + "The day the report describes": "El dia que descriu l'informe", + "Money": "Diners", + "How the project stands on this aspect": "Com està el projecte en aquest aspecte", + "On track": "En curs", + "At risk": "En risc", + "Off track": "Desviat", + "Money note": "Nota sobre diners", + "A short explanation of this status": "Una breu explicació d'aquest estat", + "Organisation": "Organització", + "Organisation note": "Nota sobre organització", + "Time": "Temps", + "Time note": "Nota sobre temps", + "Information": "Informació", + "Information note": "Nota sobre informació", + "Quality": "Qualitat", + "Quality note": "Nota sobre qualitat", + "Risk note": "Nota sobre risc", + "Overall": "General", + "The worst of the six statuses, calculated by the server": "El pitjor dels sis estats, calculat pel servidor", + "Health: money": "Salut: diners", + "Copied from the newest status report": "Copiat de l'informe d'estat més recent", + "Health: organisation": "Salut: organització", + "Health: time": "Salut: temps", + "Health: information": "Salut: informació", + "Health: quality": "Salut: qualitat", + "Health: risk": "Salut: risc", + "Health: overall": "Salut: general", + "Health: report date": "Salut: data de l'informe", + "The date of the newest status report": "La data de l'informe d'estat més recent", + "New report": "Informe nou", + "Only the project owner writes status reports.": "Només el propietari del projecte escriu informes d'estat.", + "Latest report, {date}": "Últim informe, {date}", + "Aspect": "Aspecte", + "Note": "Nota", + "Report history": "Historial d'informes", + "Author": "Autor", + "No status reports yet": "Encara no hi ha informes d'estat", + "Write the first report": "Escriu el primer informe", + "Choose a status for every aspect to save the report.": "Trieu un estat per a cada aspecte per desar l'informe.", + "Suggested: on track.": "Suggeriment: en curs.", + "Suggested: at risk.": "Suggeriment: en risc.", + "Suggested: off track.": "Suggeriment: desviat.", + "1 task is past its due date.": "1 tasca ha passat la data límit.", + "{count} tasks are past their due date.": "{count} tasques han passat la data límit.", + "The end date has passed with 1 open task.": "La data de fi ha passat amb 1 tasca oberta.", + "The end date has passed with {count} open tasks.": "La data de fi ha passat amb {count} tasques obertes.", + "No open task is past its due date.": "Cap tasca oberta ha passat la data límit.", + "The highest open risk, \"{title}\", scores {score}.": "El risc obert més alt, \"{title}\", puntua {score}.", + "There are no open risks.": "No hi ha riscos oberts.", + "Costs are at {percent}% of the budget.": "Els costos són al {percent}% del pressupost.", + "No suggestion: the project has no budget.": "Sense suggeriment: el projecte no té pressupost.", + "No suggestion: no costs are recorded for this project yet.": "Sense suggeriment: encara no hi ha costos registrats per a aquest projecte.", + "The report was not saved. Only the project owner can write status reports.": "L'informe no s'ha desat. Només el propietari del projecte pot escriure informes d'estat.", + "No report": "Sense informe", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Un grup de projectes portats per les mateixes persones, com un departament o un programa. Els seus responsables llegeixen cada projecte que conté.", + "The name of the portfolio": "El nom de la cartera", + "What the portfolio holds and who runs it": "Què conté la cartera i qui la porta", + "A colour for the portfolio's section in project lists": "Un color per a la secció de la cartera a les llistes de projectes", + "Managers": "Responsables", + "Nextcloud user UIDs of the people who run the portfolio": "Identificadors d'usuari de Nextcloud de les persones que porten la cartera", + "Order": "Ordre", + "Where the portfolio comes in project lists, lowest first": "On apareix la cartera a les llistes de projectes, primer el més baix", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "L'escala de risc pròpia d'aquesta cartera en JSON, amb la mateixa forma que la de tota l'aplicació. Buit vol dir l'escala de l'aplicació.", + "Portfolio readers": "Lectors de la cartera", + "Nextcloud user UIDs of the managers of the project's portfolio": "Identificadors d'usuari de Nextcloud dels responsables de la cartera del projecte", + "The portfolio this project belongs to": "La cartera a la qual pertany aquest projecte", + "No portfolio": "Sense cartera", + "All portfolios": "Totes les carteres", + "You read this project as a manager of its portfolio. Only its members change it.": "Llegiu aquest projecte com a responsable de la seva cartera. Només els membres el canvien.", + "Portfolios": "Carteres", + "Portfolio status": "Estat de la cartera", + "No portfolios yet": "Encara no hi ha carteres", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Un administrador afegeix carteres a Projectes, Carteres. Els projectes d'una cartera apareixen aquí amb el seu estat.", + "Roll-up": "Resum", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} en curs, {atRisk} en risc, {offTrack} desviats, {noReport} sense informe", + "No project in this portfolio that you can read.": "Cap projecte d'aquesta cartera que puguis llegir.", + "Start": "Inici", + "End": "Fi", + "Budget": "Pressupost", + "Last report": "Darrer informe", + "Out of date": "Desactualitzat", + "Portfolio timeline": "Cronograma de la cartera", + "Zoom": "Zoom", + "Could not load the timeline": "No s'ha pogut carregar el cronograma", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Un administrador afegeix carteres a Projectes, Carteres. Els projectes d'una cartera apareixen aquí en un sol cronograma.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Obre un projecte per veure'n les fases i les tasques. El cronograma és només de lectura.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Omesos perquè no els pots llegir: {count} projectes", + "Week": "Setmana", + "Day": "Dia", + "Month": "Mes", + "Please try again later.": "Torna-ho a provar més tard.", + "Status reports": "Informes d'estat", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Després de quants dies el darrer informe d'estat d'un projecte es marca com a desactualitzat a la vista de la cartera", + "Reporting period (days)": "Període d'informe (dies)", + "The reporting period is a whole number of days from 1 to 365.": "El període d'informe és un nombre enter de dies de l'1 al 365.", + "Reporting period saved": "Període d'informe desat", + "The reporting period was not saved. Please try again.": "El període d'informe no s'ha desat. Torna-ho a provar.", + "Every project of a portfolio with its status per aspect, rolled up.": "Cada projecte d'una cartera amb el seu estat per aspecte, resumit.", + "The projects of a portfolio on one timeline.": "Els projectes d'una cartera en un sol cronograma.", + "Phases": "Fases", + "Add phase": "Afegeix una fase", + "No phases yet": "Encara no hi ha fases", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Divideix el projecte en fases, com ara iniciació, definició i execució. Una fase es tanca quan se'n puja el document de tancament.", + "{hours} hours": "{hours} hores", + "Concluding document: {title}": "Document de tancament: {title}", + "Concluding document missing": "Falta el document de tancament", + "Move {title} up": "Puja {title}", + "Move {title} down": "Baixa {title}", + "Close phase": "Tanca la fase", + "Phase": "Fase", + "Files": "Fitxers", + "Notes": "Notes", + "Audit trail": "Registre d'auditoria", + "Edit phase": "Edita la fase", + "Name": "Nom", + "Budget hours": "Hores pressupostades", + "Could not save the phase. Please try again.": "No s'ha pogut desar la fase. Torna-ho a provar.", + "Close phase {title}": "Tanca la fase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Una fase es tanca amb el seu document de tancament: puja'l aquí o tria un dels fitxers de la fase.", + "Concluding document": "Document de tancament", + "This phase has no files yet.": "Aquesta fase encara no té fitxers.", + "Upload a document": "Puja un document", + "The document was not uploaded. Please try again.": "El document no s'ha pujat. Torna-ho a provar.", + "Upload the concluding document before you close this phase.": "Puja el document de tancament abans de tancar aquesta fase.", + "This phase cannot be closed from its current status.": "Aquesta fase no es pot tancar des del seu estat actual.", + "The phase was not closed. Please try again.": "La fase no s'ha tancat. Torna-ho a provar.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "L'id del fitxer d'aquesta fase que la tanca. La fase només es pot completar quan està indicat i el fitxer adjunt.", + "Import from Microsoft Project": "Importa des de Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Trieu un pla desat des de Microsoft Project en format XML. No s'importa res fins que ho confirmeu.", + "Plan file": "Fitxer del pla", + "What the import creates": "Què crea la importació", + "Tasks": "Tasques", + "Sub-tasks": "Subtasques", + "Milestones": "Fites", + "Links": "Vincles", + "Already imported, updated in place: {count}": "Ja importats, actualitzats al seu lloc: {count}", + "What does not carry over": "Què no es trasllada", + "Tasks with resources, which are not imported: {count}": "Tasques amb recursos, que no s'importen: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tasques més enllà del nivell 3, posades sota la seva tasca de nivell 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Vincles diferents de final a inici, importats com a vincles relacionats: {count}", + "Link lags, which are dropped: {count}": "Retards de vincles, que es descarten: {count}", + "Links to a summary task, which are not imported: {count}": "Vincles a una tasca de resum, que no s'importen: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Vincles a tasques fora d'aquest pla, que no s'importen: {count}", + "No longer in the plan": "Ja no és al pla", + "These stay in the project; remove them yourself if they are no longer needed.": "Es queden al projecte; elimineu-les vosaltres si ja no calen.", + "Import": "Importa", + "Close": "Tanca", + "The plan is imported: {created} created, {updated} updated.": "El pla s'ha importat: {created} creats, {updated} actualitzats.", + "Links that would close a loop were left out: {count}": "S'han omès els vincles que tancarien un bucle: {count}", + "The import stopped part-way. Run it again to finish it.": "La importació s'ha aturat a mig camí. Torneu-la a executar per acabar-la.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Deseu el pla a Microsoft Project amb Fitxer, Desa com a, format XML, i importeu aquest fitxer.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Aquest fitxer declara un DOCTYPE o entitats, que no s'accepten.", + "The file is larger than 10 MB.": "El fitxer supera els 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "El pla té més de 2.000 tasques, més de les que admet una importació.", + "This file is not a Microsoft Project plan in XML format.": "Aquest fitxer no és un pla de Microsoft Project en format XML.", + "Choose a file to import.": "Trieu un fitxer per importar.", + "Only the project owner can import a plan.": "Només el propietari del projecte pot importar un pla.", + "The plan could not be read. Please try again.": "No s'ha pogut llegir el pla. Torneu-ho a provar.", + "Linked case: {title}": "Expedient vinculat: {title}", + "Linked to a case": "Vinculat a un expedient", + "Hand over to case": "Lliura a l'expedient", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copia sense canvis cada fitxer del projecte i de les seves tasques, i un fitxer que descriu el projecte, a l'expedient vinculat.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Fitxers copiats: {count}", + "Files that failed: {names}": "Fitxers amb error: {names}", + "The handover failed. Please try again.": "El lliurament ha fallat. Torneu-ho a provar.", + "The linked case could not be found, or you cannot open it.": "No s'ha trobat l'expedient vinculat o no el podeu obrir.", + "Case handovers": "Lliuraments a l'expedient", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Cada lliurament dels fitxers i metadades del projecte al seu expedient: quan, per qui, a quin expedient, cada fitxer copiat amb el seu SHA-256 i els fitxers que han fallat.", + "Finance": "Finances", + "Add cost line": "Afegeix una línia de cost", + "Delivery terms": "Condicions de lliurament", + "Billing model": "Model de facturació", + "Budget in euro": "Pressupost en euros", + "Budget in hours": "Pressupost en hores", + "Hourly rate in euro": "Tarifa horària en euros", + "Planned start": "Inici previst", + "Planned end": "Final previst", + "Planned dates": "Dates previstes", + "Budget {amount}": "Pressupost {amount}", + "No budget agreed": "Sense pressupost acordat", + "Hours": "Hores", + "Only the project owner and the portfolio managers see the amounts.": "Només el propietari del projecte i els gestors de la cartera veuen els imports.", + "Budget against cost per category": "Pressupost davant costos per categoria", + "Labour (booked time)": "Mà d'obra (hores registrades)", + "No category": "Sense categoria", + "Hours are not available": "Les hores no estan disponibles", + "Not yet assigned to a category": "Encara no assignat a cap categoria", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} gastat, {remaining} restant", + "Budget against cost per phase": "Pressupost davant costos per fase", + "No phase": "Sense fase", + "Cost lines": "Línies de cost", + "From the finance system": "Del sistema financer", + "Edit cost line {amount}": "Edita la línia de cost {amount}", + "No cost lines yet": "Encara no hi ha línies de cost", + "Commitments": "Compromisos", + "Actual cost": "Cost real", + "Forecast": "Previsió", + "Remaining": "Restant", + "Not planned yet": "Encara no planificat", + "{start} to {end}": "{start} a {end}", + "The terms were not saved. Please try again.": "Les condicions no s'han desat. Torna-ho a provar.", + "Terms saved": "Condicions desades", + "Fixed price": "Preu fix", + "Hourly": "Per hores", + "Not billed": "Sense facturar", + "Commitment": "Compromís", + "Edit cost line": "Edita la línia de cost", + "Kind": "Tipus", + "Amount in euro": "Import en euros", + "Remove": "Elimina", + "Could not save the cost line. Only the project owner changes the money of a project.": "No s'ha pogut desar la línia de cost. Només el propietari del projecte canvia els diners d'un projecte.", + "Could not remove the cost line. Please try again.": "No s'ha pogut eliminar la línia de cost. Torna-ho a provar.", + "{amount} over budget": "{amount} per sobre del pressupost", + "Cost categories": "Categories de cost", + "The categories every project splits its budget and costs into, one per line": "Les categories en què cada projecte divideix el pressupost i els costos, una per línia", + "Categories": "Categories", + "Give at least one category, each name once.": "Indica almenys una categoria, cada nom una sola vegada.", + "Cost categories saved": "Categories de cost desades", + "The cost categories were not saved. Please try again.": "Les categories de cost no s'han desat. Torna-ho a provar.", + "Finance line": "Línia financera", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Un import d'un projecte: un pressupost, un compromís, un cost real o una previsió, en una categoria de cost i opcionalment una fase. L'introdueix el propietari del projecte o l'envia el sistema financer a través de l'aplicació d'integració.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "El projecte al qual pertany aquest import. Buit per a una línia del sistema financer el número de projecte de la qual no coincideix amb cap projecte.", + "The phase this amount belongs to, if any": "La fase a la qual pertany aquest import, si n'hi ha", + "The cost category, one of the categories the admin set up": "La categoria de cost, una de les que ha configurat l'administrador", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Si l'import és un pressupost, un compromís, un cost real o una previsió", + "Amount": "Import", + "The amount in the reporting currency (euro)": "L'import en la moneda d'informe (euro)", + "The date the amount was booked or is expected": "La data en què l'import es va registrar o s'espera", + "What the amount is for": "Per a què és l'import", + "Whether a person entered the line or the finance system sent it": "Si una persona va introduir la línia o la va enviar el sistema financer", + "Entered by hand": "Introduït a mà", + "Finance line id": "Id de la línia financera", + "The finance system's own id of this line. One imported line per id.": "L'id propi d'aquesta línia al sistema financer. Una línia importada per id.", + "Project number": "Número de projecte", + "The project number the finance system sent, matched against the project key": "El número de projecte que va enviar el sistema financer, comparat amb la clau del projecte", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "La cartera del projecte de la línia, copiada del projecte perquè els totals de la cartera necessitin un sol filtre", + "Finance readers": "Lectors financers", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID de Nextcloud de les persones que poden veure aquest import: el propietari del projecte i els gestors de la seva cartera", + "Project owner": "Propietari del projecte", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID de Nextcloud del propietari del projecte, que pot canviar i eliminar les línies manuals", + "How the client pays: not billed, a fixed price, or by the hour.": "Com paga el client: sense facturar, preu fix o per hores.", + "Portfolio finance": "Finances de la cartera", + "You cannot see the money of any project in this portfolio": "No pots veure els diners de cap projecte d'aquesta cartera", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "El servidor ha retornat línies de cost de projectes de fora d'aquesta cartera, així que aquests totals poden ser erronis.", + "Projects left out because you cannot see their money: {count}": "Projectes omesos perquè no pots veure'n els diners: {count}", + "Unmatched finance lines": "Línies financeres sense assignar", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Pressupost, compromisos, cost real i previsió sumats en una cartera.", + "Subprojects": "Subprojectes", + "{done} of {total}": "{done} de {total}", + "{done} of {total} tasks done, including subprojects": "{done} de {total} tasques fetes, subprojectes inclosos", + "Show the subprojects of {title}": "Mostra els subprojectes de {title}", + "Hide the subprojects of {title}": "Amaga els subprojectes de {title}", + "Part of": "Forma part de", + "No parent project": "Sense projecte superior", + "A project cannot sit under one of its own subprojects.": "Un projecte no pot quedar sota un dels seus propis subprojectes.", + "Projects nest three levels deep at most: programme, project and subproject.": "Els projectes s'imbriquen com a màxim tres nivells: programa, projecte i subprojecte.", + "Parent project": "Projecte superior", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "El projecte sota el qual queda aquest projecte, com un programa. Els projectes s'imbriquen com a màxim tres nivells.", + "Yes": "Sí", + "No": "No", + "{label} (required)": "{label} (obligatori)", + "{label} is required": "{label} és obligatori", + "Project field": "Camp de projecte", + "A field an admin adds to every project, such as a policy area or a contract value.": "Un camp que un administrador afegeix a cada projecte, com un àmbit de política o un valor de contracte.", + "Key": "Clau", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "El nom fix amb què es desa el valor, en lower camel case. Mantén-lo quan els projectes l'utilitzin.", + "Label": "Etiqueta", + "The name people see next to the field": "El nom que la gent veu al costat del camp", + "What the field holds": "Què conté el camp", + "Text": "Text", + "Number": "Nombre", + "Choice": "Opció", + "Person": "Persona", + "Yes or no": "Sí o no", + "Options": "Opcions", + "The choices of a choice field": "Les opcions d'un camp d'elecció", + "Required": "Obligatori", + "Whether a project must fill in the field": "Si un projecte ha d'omplir el camp", + "Where the field appears, lowest first": "On apareix el camp, el més baix primer", + "Applies to": "S'aplica a", + "What the field is added to": "A què s'afegeix el camp", + "Custom fields": "Camps propis", + "The values of the project fields an admin defined, keyed by the field's key.": "Els valors dels camps de projecte que ha definit un administrador, per la clau del camp.", + "Project fields": "Camps de projecte", + "Related": "Relacionades", + "Remove link": "Treu l'enllaç", + "Link type": "Tipus d'enllaç", + "Relates to": "Relacionada amb", + "Duplicates": "Duplica", + "Project key": "Clau del projecte", + "Every task number starts with it, such as VERG-42.": "Cada número de tasca comença per ella, per exemple VERG-42.", + "This key is already used by another project.": "Un altre projecte ja fa servir aquesta clau.", + "Use 2 to 10 letters and digits, starting with a letter.": "Feu servir de 2 a 10 lletres i xifres, començant per una lletra.", + "The key cannot change once tasks carry it.": "La clau no pot canviar un cop les tasques la porten.", + "Project saved. The existing tasks get their numbers in the background.": "Projecte desat. Les tasques existents reben el número en segon pla.", + "Next task number": "Número de la tasca següent", + "The number the next task of this project gets in its key. Only the system writes it.": "El número que rep a la seva clau la tasca següent d’aquest projecte. Només el sistema l’escriu.", + "Restore {title}": "Restaura {title}", + "Restore": "Restaura", + "Project restored": "S’ha restaurat el projecte", + "Could not restore the project": "No s’ha pogut restaurar el projecte", + "Bring this project back to the active list.": "Torna aquest projecte a la llista de projectes actius.", + "Restore project": "Restaura el projecte", + "Request reason": "Motiu de la sol·licitud", + "Why the requester needs this project. Filled in when the project is requested.": "Per què el sol·licitant necessita aquest projecte. S’omple en sol·licitar-lo.", + "Reviewed by": "Revisat per", + "The user who approved or rejected the request.": "L’usuari que va aprovar o rebutjar la sol·licitud.", + "Reviewed at": "Revisat el", + "When the request was approved or rejected.": "Quan es va aprovar o rebutjar la sol·licitud.", + "Review note": "Nota de revisió", + "The reviewer's reason, shown to the requester when a request is not approved.": "El motiu del revisor, que veu el sol·licitant quan una sol·licitud no s’aprova.", + "Members of these groups": "Membres d’aquests grups", + "Groups that may create projects": "Grups que poden crear projectes", + "The group {group} no longer exists. Save to remove it.": "El grup {group} ja no existeix. Deseu per treure’l.", + "Review project request": "Revisa la sol·licitud de projecte", + "Requested by": "Sol·licitat per", + "Why it is needed": "Per què cal", + "Desired start date": "Data d’inici desitjada", + "Why is it not approved?": "Per què no s’aprova?", + "Give a reason. The requester sees it.": "Indiqueu un motiu. El sol·licitant el veurà.", + "Approve": "Aprova", + "Reject": "Rebutja", + "Reject request": "Rebutja la sol·licitud", + "The review was not saved. Try again.": "La revisió no s’ha desat. Torneu-ho a provar.", + "This project is waiting for review": "Aquest projecte espera revisió", + "This request was not approved": "Aquesta sol·licitud no s’ha aprovat", + "Reason: {note}": "Motiu: {note}", + "Review request": "Revisa la sol·licitud", + "Request a project": "Sol·licita un projecte", + "Step {step} of 2": "Pas {step} de 2", + "Why is this project needed?": "Per què cal aquest projecte?", + "Give a reason. The reviewer reads it.": "Indiqueu un motiu. El revisor el llegirà.", + "Back": "Enrere", + "Next": "Següent", + "Send request": "Envia la sol·licitud", + "The request was not sent. Try again.": "La sol·licitud no s’ha enviat. Torneu-ho a provar.", + "Requested": "Sol·licitat", + "Not approved": "No aprovat", + "Your request was sent": "S’ha enviat la vostra sol·licitud", + "Let everyone else request a project": "Permet que tothom més sol·liciti un projecte", + "Add a task": "Afegeix una tasca", + "Delete task": "Suprimeix la tasca", + "Edit task": "Edita la tasca", + "Write": "Escriu", + "Preview": "Previsualització", + "Markdown works here: headings, lists and links.": "Aquí funciona el Markdown: títols, llistes i enllaços.", + "Could not save the task. Please try again.": "No s'ha pogut desar la tasca. Torneu-ho a provar.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "\"{title}\" té temps registrat, per tant no es pot suprimir. En lloc d'això, la podeu cancel·lar: els registres de temps es mantenen.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Voleu suprimir \"{title}\"? També se suprimeixen els enllaços amb altres tasques. Això no es pot desfer.", + "Keep task": "Conserva la tasca", + "Cancel task": "Cancel·la la tasca", + "Only the reporter, the project owner or an admin can delete this task.": "Només qui l'ha informada, el propietari del projecte o un administrador pot suprimir aquesta tasca.", + "Could not delete the task. Please try again.": "No s'ha pogut suprimir la tasca. Torneu-ho a provar.", + "Could not cancel the task. Please try again.": "No s'ha pogut cancel·lar la tasca. Torneu-ho a provar.", + "Responsible": "Responsable", + "Also working on this": "També hi treballen", + "Labels": "Etiquetes", + "Could not change the priority. Please try again.": "No s'ha pogut canviar la prioritat. Torneu-ho a provar.", + "Other project members who work on this task alongside the person responsible.": "Altres membres del projecte que treballen en aquesta tasca amb la persona responsable.", + "Duplicate": "Duplica", + "Could not copy the task. Please try again.": "No s'ha pogut copiar la tasca. Torneu-ho a provar.", + "Subtasks": "Subtasques", + "{done} of {total} done": "{done} de {total} fetes", + "Add a subtask": "Afegeix una subtasca", + "Checklist": "Llista de comprovació", + "Checklist item actions": "Accions de l'element de la llista", + "Add a checklist item": "Afegeix un element a la llista", + "Subtasks: {estimate} estimated, {logged} logged": "Subtasques: {estimate} estimat, {logged} registrat", + "Total estimate: {total}": "Estimació total: {total}", + "Part of {title}": "Part de {title}", + "Checklist: {count} done": "Llista de comprovació: {count} fets", + "This task has subtasks: {count}.": "Aquesta tasca té subtasques: {count}.", + "Keep subtasks as separate tasks": "Conserva les subtasques com a tasques separades", + "Delete subtasks too": "Suprimeix també les subtasques", + "Copy of {title}": "Còpia de {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "La tasca s'ha copiat, però no totes les subtasques. Reviseu la còpia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Passos petits dins de la tasca. Cada element té un id, un text i si està fet.", + "Open work per person and per project.": "Feina oberta per persona i per projecte.", + "View": "Visualització", + "By person": "Per persona", + "By project": "Per projecte", + "Hours left": "Hores restants", + "Tasks without an estimate": "Tasques sense estimació", + "Due in 14 days": "Venç en 14 dies", + "Shared": "Compartides", + "Unassigned": "Sense assignar", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Es mostra la feina dels projectes que podeu veure. Les hores compten per a la persona responsable; les tasques compartides es compten sense hores.", + "No open work in these projects.": "No hi ha feina oberta en aquests projectes.", + "Open work": "Feina oberta", + "{count} open tasks": "{count} tasques obertes", + "Create a project to see capacity here.": "Creeu un projecte per veure aquí la capacitat.", + "My tasks": "Les meves tasques", + "Show all my tasks": "Mostra totes les meves tasques", + "No tasks assigned to you": "No teniu cap tasca assignada", + "Browse projects": "Explora els projectes", + "Later": "Més endavant", + "Due {date}": "Venç {date}", + "Could not change the status. Please try again.": "No s'ha pogut canviar l'estat. Torneu-ho a provar.", + "Completed today": "Completades avui", + "My open tasks": "Les meves tasques obertes", + "My overdue tasks": "Les meves tasques endarrerides", + "My tasks in progress": "Les meves tasques en curs", + "Pin to the top": "Fixa a dalt", + "Unpin": "Deixa de fixar", + "Pinned": "Fixat", + "Actions for {title}": "Accions per a {title}", + "Could not save your project order. Please try again.": "No s'ha pogut desar l'ordre dels vostres projectes. Torneu-ho a provar.", + "No boards yet": "Encara no hi ha taulers", + "Create a project to get a board.": "Creeu un projecte per tenir un tauler.", + "Use the Projects page to create and manage your projects and tasks.": "Feu servir la pàgina Projectes per crear i gestionar els vostres projectes i tasques.", + "Go to projects": "Ves als projectes", + "You are not a member of any projects yet.": "Encara no sou membre de cap projecte.", + "Could not search for users. Please try again.": "No s'han pogut cercar usuaris. Torneu-ho a provar.", + "Project creation is restricted to administrators.": "Només els administradors poden crear projectes.", + "Only the project owner or an administrator can delete this project.": "Només el propietari del projecte o un administrador pot suprimir aquest projecte.", + "No projects are available to you yet. Ask an administrator to create one.": "Encara no teniu projectes disponibles. Demaneu a un administrador que en creï un.", + "Due: {date}": "Venç: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Les tasques amb data d'inici o de venciment apareixen a la cronologia. Afegiu-hi dates per veure-les aquí.", + "You do not have access to this project.": "No teniu accés a aquest projecte.", + "Zoom level": "Nivell de zoom", + "Unscheduled": "Sense planificar", + "Start: {date}": "Inici: {date}", + "Today": "Avui", + "No scheduled tasks": "No hi ha tasques planificades", + "An unexpected error occurred.": "S'ha produït un error inesperat.", + "Column {number} name": "Nom de la columna {number}", + "Failed to save creation policy": "No s'ha pogut desar la política de creació", + "All authenticated users": "Tots els usuaris autenticats", + "Control who may create new projects": "Controleu qui pot crear projectes nous", + "Administrators only": "Només administradors", + "Project creation": "Creació de projectes", + "Allow project creation": "Permet la creació de projectes", + "Creation policy saved successfully": "S'ha desat la política de creació", + "Initializing…": "S'està iniciant…", + "e.g. 2h 30m, 90m, 1.5h": "p. ex. 2h 30m, 90m, 1.5h", + "Log time": "Registra temps", + "Save estimate": "Desa l'estimació", + "Logged: {logged}": "Registrat: {logged}", + "over by {amount}": "excedit en {amount}", + "Time tracking": "Registre de temps", + "Estimate": "Estimació", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Introduïu una estimació vàlida (p. ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Introduïu una durada vàlida (p. ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "No s'ha pogut desar el registre de temps. Torneu-ho a provar.", + "Edit time entry": "Edita el registre de temps", + "Duration": "Durada", + "Date range": "Període", + "Last week": "La setmana passada", + "No time logged": "No hi ha temps registrat", + "Log time on a task to see it here.": "Registreu temps en una tasca per veure'l aquí.", + "To date": "Fins a la data", + "This week": "Aquesta setmana", + "Total: {total}": "Total: {total}", + "From date": "Des de la data", + "Custom range": "Període personalitzat", + "All time": "Tot", + "Could not delete a task, so some data may remain. Try deleting the project again.": "No s'ha pogut suprimir una tasca, per tant poden quedar dades. Torneu a suprimir el projecte.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "No s'ha pogut suprimir un registre de temps, per tant poden quedar dades. Torneu a suprimir el projecte.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "No s'ha pogut suprimir una columna, per tant poden quedar dades. Torneu a suprimir el projecte.", + "Could not delete the project. Please try again.": "No s'ha pogut suprimir el projecte. Torneu-ho a provar.", + "Notification settings": "Configuració de les notificacions", + "Configure when due-date reminders are sent": "Configureu quan s'envien els recordatoris de venciment", + "Due-date reminder lead time (hours)": "Antelació del recordatori de venciment (hores)", + "Lead time must be between 1 and 336 hours": "L'antelació ha d'estar entre 1 i 336 hores", + "Reminder lead time saved successfully": "S'ha desat l'antelació del recordatori", + "Failed to save reminder lead time": "No s'ha pogut desar l'antelació del recordatori", + "Notifications": "Notificacions", + "Notify me 1 day before a task's due date": "Avisa'm 1 dia abans del venciment d'una tasca", + "Draft": "Esborrany", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Si la classe és un esborrany que només veu el seu docent, es fa o està cancel·lada.", + "New release": "Versió nova", + "Roadmap chart. The same releases and epics are listed below.": "Gràfic del full de ruta. Les mateixes versions i èpiques apareixen a la llista de sota.", + "Nothing on the roadmap yet": "Encara no hi ha res al full de ruta", + "Releases with a target date and epics with dated tasks appear here.": "Aquí apareixen les versions amb data objectiu i les èpiques amb tasques datades.", + "Releases": "Versions", + "No releases yet": "Encara no hi ha versions", + "Target date: {date}": "Data objectiu: {date}", + "No target date": "Sense data objectiu", + "Edit {name}": "Edita {name}", + "Mark {name} as released": "Marca {name} com a publicada", + "Mark as released": "Marca com a publicada", + "Epics": "Èpiques", + "No epics yet. Open a task to make it an epic.": "Encara no hi ha èpiques. Obriu una tasca per convertir-la en èpica.", + "Not scheduled yet": "Encara sense programar", + "Planned": "Planificada", + "Released": "Publicada", + "Edit release": "Edita la versió", + "Target date": "Data objectiu", + "Could not save the release. Please try again.": "No s'ha pogut desar la versió. Torneu-ho a provar.", + "Every task of this release is done or cancelled.": "Totes les tasques d'aquesta versió estan fetes o cancel·lades.", + "Not finished yet: {count}": "Encara sense acabar: {count}", + "What happens to these tasks?": "Què passa amb aquestes tasques?", + "Move to {name}": "Mou a {name}", + "Remove the release": "Treu la versió", + "Keep it on {name}": "Deixa-les a {name}", + "Could not mark the release as released. Please try again.": "No s'ha pogut marcar la versió com a publicada. Torneu-ho a provar.", + "Roadmap": "Full de ruta", + "Tasks or roadmap": "Tasques o full de ruta", + "Release": "Versió", + "Epic": "Èpica", + "This task is an epic": "Aquesta tasca és una èpica", + "A named, dated delivery of a project that its tasks are planned against.": "Un lliurament d'un projecte amb nom i data, respecte al qual es planifiquen les seves tasques.", + "Name of the release": "Nom de la versió", + "The project this release belongs to": "El projecte al qual pertany aquesta versió", + "What this release delivers": "Què lliura aquesta versió", + "When work on the release starts": "Quan comença la feina en la versió", + "The date the release is due": "La data en què la versió ha d'estar a punt", + "Whether the release is planned, released or archived": "Si la versió està planificada, publicada o arxivada", + "Released on": "Publicada el", + "When the release was marked as released": "Quan es va marcar la versió com a publicada", + "The release this task is planned for": "La versió per a la qual està planificada aquesta tasca", + "Board view options": "Opcions de visualització del tauler", + "Colour cards": "Acoloreix les targetes", + "No colour": "Sense color", + "By label": "Per etiqueta", + "Swimlanes": "Carrils", + "No swimlanes": "Sense carrils", + "By assignee": "Per persona assignada", + "By epic": "Per èpica", + "No assignee": "Sense assignar", + "No epic": "Sense èpica", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Les targetes es queden a la fila de la seva èpica. Canvieu l'èpica a la pàgina de la tasca.", + "Hand over to": "Traspassa a", + "Could not save your board view. It applies until you reload.": "No s'ha pogut desar la vista del tauler. S'aplica fins que torneu a carregar.", + "Timetable wish": "Desig d'horari", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Un desig que el generador té en compte. Sempre respecta un desig estricte, i un de flexible quan pot.", + "Whether the wish is about a teacher, a group, a room or one activity": "Si el desig tracta d'un docent, un grup, una aula o una activitat", + "Teacher": "Docent", + "Group": "Grup", + "Reference": "Referència", + "The user, group, room or activity the wish is about": "L'usuari, grup, aula o activitat a què es refereix el desig", + "What the wish asks for": "El que demana el desig", + "Not on these periods": "No en aquestes franges", + "Preferably not on these periods": "Preferiblement no en aquestes franges", + "At most a number of lessons a day": "Com a màxim un nombre de classes al dia", + "No free periods between lessons": "Sense hores lliures entre classes", + "Always the same room": "Sempre la mateixa aula", + "Periods": "Franges", + "The periods of the week the wish is about, such as wed-5": "Les franges de la setmana a què es refereix, com wed-5", + "Limit": "Límit", + "The most lessons a day, for a wish of that kind": "El màxim de classes al dia, per a un desig d'aquest tipus", + "Strength": "Força", + "Whether the generator must keep the wish or should keep it": "Si el generador ha de o hauria de respectar el desig", + "Hard": "Estricte", + "Soft": "Flexible", + "Weight": "Pes", + "How much a soft wish counts, from 1 to 3": "Quant compta un desig flexible, d'1 a 3", + "Why the wish exists": "Per què existeix el desig", + "Timetable scenario": "Escenari d'horari", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Un patró setmanal, fet pel generador o pres de l'horari actual. Desa les dades d'entrada i com respecta els desigs.", + "The name timetablers know the scenario by": "El nom amb què els planificadors coneixen l'escenari", + "Whether the generator made it or it came from the current timetable": "Si l'ha fet el generador o ve de l'horari actual", + "Generated": "Generat", + "From the current timetable": "De l'horari actual", + "Week of": "Setmana del", + "The Monday of the first week of the window": "El dilluns de la primera setmana del període", + "Window start": "Inici del període", + "The first day the week pattern applies to": "El primer dia en què s'aplica el patró setmanal", + "Window end": "Fi del període", + "The last day the week pattern applies to": "L'últim dia en què s'aplica el patró setmanal", + "Waiting, generating, done, failed, or published as draft lessons": "En espera, generant, llest, fallit o publicat com a classes esborrany", + "Waiting": "En espera", + "Generating": "Generant", + "Failed": "Fallit", + "Published": "Publicat", + "Seed": "Llavor", + "The number the generator starts from, so a run can be repeated": "El nombre amb què comença el generador, per poder repetir una execució", + "Input": "Entrada", + "The periods, rooms, lessons and wishes the scenario was made from": "Les franges, aules, classes i desigs d'on surt l'escenari", + "Placements": "Ubicacions", + "Each lesson with the period and room it was given": "Cada classe amb la franja i l'aula que ha rebut", + "Unplaced lessons": "Classes sense ubicar", + "Lessons without a place, each with the hard wish that blocked it": "Classes sense lloc, cadascuna amb el desig estricte que la va bloquejar", + "Broken wishes": "Desigs incomplerts", + "The wishes this scenario breaks, with the lessons that break them": "Els desigs que aquest escenari incompleix, amb les classes implicades", + "Measures": "Mesures", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Classes ubicades, desigs incomplerts, forats docents, classes al dia i ús de les aules", + "Reason": "Motiu", + "Why the run failed": "Per què ha fallat l'execució", + "Published at": "Publicat el", + "When the scenario was written out as draft lessons": "Quan es va escriure l'escenari com a classes esborrany", + "Edit wish": "Edita el desig", + "New wish": "Desig nou", + "Hard: the generator always keeps it": "Estricte: el generador sempre el respecta", + "Soft: the generator keeps it where it can": "Flexible: el generador el respecta quan pot", + "Weight (1 to 3)": "Pes (d'1 a 3)", + "Most lessons a day": "Màxim de classes al dia", + "Period": "Franja", + "{day} period {number}": "{day} franja {number}", + "Teacher (user name)": "Docent (nom d'usuari)", + "Activity (group:subject)": "Activitat (grup:assignatura)", + "Say who or what the wish is about.": "Indiqueu a qui o a què es refereix el desig.", + "Choose at least one period.": "Trieu almenys una franja.", + "The limit is a whole number of 1 or more.": "El límit és un nombre enter d'1 o més.", + "Timetable": "Horari", + "Wishes": "Desitjos", + "Timetable wishes": "Desitjos d'horari", + "Generator run": "Execució del generador", + "Generator progress": "Progrés del generador", + "The run failed: {reason}": "L'execució ha fallat: {reason}", + "{placed} of {lessons} lessons placed": "{placed} de {lessons} classes col·locades", + "Generate again": "Genera de nou", + "Generate": "Genera", + "Every lesson has a place.": "Cada classe té un lloc.", + "Lesson": "Classe", + "No free period and room": "Cap franja ni aula lliure", + "Broken soft wishes": "Desitjos flexibles incomplerts", + "Every soft wish is kept.": "Es respecta cada desig flexible.", + "Wish": "Desig", + "Lessons": "Classes", + "Generating: {percent}% of the time budget used": "S'està generant: {percent}% del temps usat", + "Waiting to start": "Esperant per començar", + "Published as draft lessons": "Publicat com a classes en esborrany", + "Could not read the scenario.": "No s'ha pogut llegir l'escenari.", + "Could not start the run.": "No s'ha pogut iniciar l'execució.", + "Scenarios": "Escenaris", + "Timetable scenarios": "Escenaris d'horari", + "Scenario": "Escenari", + "Take the current timetable": "Agafa l'horari actual", + "Could not take the current timetable.": "No s'ha pogut agafar l'horari actual.", + "Broken hard wishes": "Desitjos obligatoris incomplerts", + "Not on a period of the week grid": "No és en una franja de la graella setmanal", + "Compare scenarios": "Compara escenaris", + "Scenarios to compare": "Escenaris per comparar", + "Choose two or three scenarios to compare them.": "Trieu dos o tres escenaris per comparar-los.", + "Measure": "Mesura", + "Best": "El millor", + "Lessons that differ": "Classes que difereixen", + "No lesson differs.": "Cap classe no difereix.", + "Not placed": "Sense col·locar", + "{period} in {room}": "{period} a {room}", + "Lessons placed": "Classes col·locades", + "Lessons without a place": "Classes sense lloc", + "Clashes": "Conflictes", + "Hard wishes broken": "Desitjos estrictes incomplerts", + "Soft wishes broken": "Desitjos flexibles incomplerts", + "Soft wishes broken, weighted": "Desitjos flexibles incomplerts, ponderats", + "Free periods between lessons, all teachers": "Hores lliures, tots els docents", + "Most free periods of one teacher": "Més hores lliures d'un docent", + "Most lessons of one group on a day": "Més classes d'un grup en un dia", + "Room use": "Ús de les aules", + "Publish as draft lessons": "Publica com a classes esborrany", + "Draft lessons written: {count}": "Classes esborrany escrites: {count}", + "Could not publish the scenario.": "No s'ha pogut publicar l'escenari.", + "Rules": "Regles", + "Rules for {column}": "Regles de {column}", + "When a card enters this column": "Quan una targeta entra en aquesta columna", + "Action": "Acció", + "Set the priority": "Defineix la prioritat", + "Assign to": "Assigna a", + "Assign the person who moved the card": "Assigna a la persona que ha mogut la targeta", + "Remove the assignee": "Treu la persona assignada", + "Add a label": "Afegeix una etiqueta", + "No longer a project member": "Ja no és membre del projecte", + "This label no longer exists": "Aquesta etiqueta ja no existeix", + "Add rule": "Afegeix una regla", + "Remove rule": "Treu la regla", + "No rules yet. Add one to change a card when it enters this column.": "Encara no hi ha regles. Afegiu-ne una per canviar una targeta quan entri en aquesta columna.", + "Could not save the rules. Please try again.": "No s'han pogut desar les regles. Torneu-ho a provar.", + "1 rule runs when a card enters this column": "1 regla s'aplica quan una targeta entra en aquesta columna", + "{count} rules run when a card enters this column": "{count} regles s'apliquen quan una targeta entra en aquesta columna", + "Rules applied: {changes}": "Regles aplicades: {changes}", + "assigned to {name}": "assignada a {name}", + "assignee removed": "persona assignada treta", + "priority {priority}": "prioritat {priority}", + "label {label}": "etiqueta {label}", + "What happens to a card when it enters this column, applied in list order.": "Què passa amb una targeta quan entra en aquesta columna, en l'ordre de la llista.", + "Value": "Valor", + "What the rule does to the card.": "El que la regla fa amb la targeta.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "La prioritat, l'id d'usuari o l'id d'etiqueta que fa servir l'acció; buit per a accions sense valor.", + "is not": "no és", + "{dimension} is not": "{dimension} no és", + "Saved filters": "Filtres desats", + "No saved filters yet": "Encara no hi ha filtres desats", + "Save filter": "Desa el filtre", + "Rename \"{name}\"": "Canvia el nom de «{name}»", + "Delete \"{name}\"": "Suprimeix «{name}»", + "Clear filters": "Esborra els filtres", + "Showing {shown} of {total} tasks": "Es mostren {shown} de {total} tasques", + "Me": "Jo", + "No date": "Sense data", + "Rename saved filter": "Canvia el nom del filtre desat", + "Share with the project": "Comparteix amb el projecte", + "Give the filter a name": "Poseu un nom al filtre", + "Could not save the filter. Please try again.": "No s'ha pogut desar el filtre. Torneu-ho a provar.", + "Some labels in \"{name}\" no longer exist and were left out.": "Algunes etiquetes de «{name}» ja no existeixen i s'han omès.", + "Could not delete the filter. Please try again.": "No s'ha pogut suprimir el filtre. Torneu-ho a provar.", + "Saved filter": "Filtre desat", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Un filtre de tauler amb nom d'un projecte, privat per a qui el va desar, tret que es comparteixi amb el projecte.", + "The project whose board the filter applies to": "El projecte al tauler del qual s'aplica el filtre", + "The name the filter is listed under": "El nom amb què surt el filtre a la llista", + "Saved by": "Desat per", + "Nextcloud user id of the person who saved the filter": "Id d'usuari de Nextcloud de qui va desar el filtre", + "Shared with the project": "Compartit amb el projecte", + "Whether every project member sees and applies the filter": "Si cada membre del projecte veu i pot aplicar el filtre", + "Criteria": "Criteris", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "El filtre: persona assignada, etiqueta, prioritat i venciment, cadascun amb és o no és i els seus valors", + "Cross-project view": "Vista entre projectes", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Una selecció desada de projectes les tasques dels quals es mostren juntes en carrils d'estat, compartida amb les persones que indica.", + "Shared with": "Compartida amb", + "The name the view is listed under": "El nom amb què apareix la vista", + "Nextcloud user id of the person who saved the view": "Id d'usuari de Nextcloud de la persona que va desar la vista", + "Nextcloud user ids of the people the view is shared with": "Ids d'usuari de Nextcloud de les persones amb qui es comparteix la vista", + "The projects whose tasks the view shows, at most twenty": "Els projectes les tasques dels quals mostra la vista, com a màxim vint", + "1 project in this view is hidden from you.": "1 projecte d'aquesta vista t'és ocult.", + "{count} projects in this view are hidden from you.": "{count} projectes d'aquesta vista et són ocults.", + "{project} has no column for {status}.": "{project} no té cap columna per a {status}.", + "This view does not exist or is not shared with you.": "Aquesta vista no existeix o no s'ha compartit amb tu.", + "\"{task}\" moved to {status}.": "\"{task}\" s'ha mogut a {status}.", + "Project: {title}": "Projecte: {title}", + "Cross-project views": "Vistes entre projectes", + "New view": "Vista nova", + "Edit view": "Edita la vista", + "Delete view": "Suprimeix la vista", + "Give the view a name": "Posa un nom a la vista", + "Pick at least one project": "Tria almenys un projecte", + "A view shows at most {max} projects": "Una vista mostra com a màxim {max} projectes", + "Could not save the view. Please try again.": "No s'ha pogut desar la vista. Torna-ho a provar.", + "Could not delete the view. Please try again.": "No s'ha pogut suprimir la vista. Torna-ho a provar.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Vols suprimir \"{title}\"? Els projectes i les seves tasques queden com estan.", + "People see the tasks of the projects they are in, never more.": "Cadascú veu les tasques dels projectes on és, mai més.", + "No views yet. A view shows the tasks of several of your projects together.": "Encara no hi ha vistes. Una vista mostra juntes les tasques de diversos dels teus projectes.", + "Projects in view: {count}": "Projectes a la vista: {count}", + "Notify me when a task is assigned to me": "Avisa'm quan se m'assigni una tasca", + "Also send these to me by email": "Envia-me'ls també per correu", + "Add an email address in your Nextcloud personal settings to get mail.": "Afegeix una adreça de correu a la configuració personal de Nextcloud per rebre correu.", + "Code link": "Enllaç de codi", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Un commit, branca, sol·licitud de fusió o incidència en una forja de codi que treballa en una tasca.", + "The task the link belongs to": "La tasca a la qual pertany l'enllaç", + "The project of the task": "El projecte de la tasca", + "Task key": "Clau de la tasca", + "The task key the forge text named, such as VC-12": "La clau de tasca que citava el text de la forja, com VC-12", + "What the link points at": "On apunta l'enllaç", + "Link": "Enllaç", + "The address of the item in the forge": "L'adreça de l'element a la forja", + "The commit message, branch name or merge request title": "El missatge del commit, el nom de la branca o el títol de la sol·licitud de fusió", + "Repository": "Repositori", + "The repository, such as acme/portal": "El repositori, com acme/portal", + "Forge id": "Id a la forja", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "L'id propi de l'element a la forja, com github:acme/portal#42 o un hash de commit", + "State": "Estat", + "The state of a merge request or issue": "L'estat d'una sol·licitud de fusió o incidència", + "Who made the commit or opened the merge request": "Qui va fer el commit o va obrir la sol·licitud de fusió", + "When the commit was made or the merge request last changed": "Quan es va fer el commit o va canviar per última vegada la sol·licitud de fusió", + "Added by": "Afegit per", + "Whether a person added the link or the integration wrote it": "Si una persona va afegir l'enllaç o el va escriure la integració", + "Nextcloud user UIDs of project members": "UID d'usuari de Nextcloud dels membres del projecte", + "Add link": "Afegeix un enllaç", + "Added by hand": "Afegit a mà", + "Branch": "Branca", + "Code": "Codi", + "Commit": "Commit", + "From the integration": "Des de la integració", + "Link to a commit, branch or merge request": "Enllaç a un commit, branca o sol·licitud de fusió", + "Merge request": "Sol·licitud de fusió", + "Merged": "Fusionada", + "No code linked yet. Name {key} in a commit message or paste a link.": "Encara no hi ha codi enllaçat. Esmenta {key} en un missatge de commit o enganxa un enllaç.", + "No code linked yet. Paste a link to a commit or merge request.": "Encara no hi ha codi enllaçat. Enganxa un enllaç a un commit o sol·licitud de fusió.", + "Paste a web address that starts with https://.": "Enganxa una adreça web que comenci per https://.", + "Remove link {title}": "Treu l'enllaç {title}", + "The link could not be added.": "No s'ha pogut afegir l'enllaç.", + "The link could not be removed.": "No s'ha pogut treure l'enllaç.", + "This link is already on the task.": "Aquest enllaç ja és a la tasca.", + "Code forges": "Forges de codi", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Enllaça commits i pull requests de GitHub amb tasques. Integriq rep els esdeveniments; planninq mai no crida GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Baixa la configuració i importa-la a Integriq. Després escriu un secret a la regla \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "A GitHub, afegeix al repositori un webhook amb aquesta adreça i el mateix secret. Tria el tipus de contingut application/json i els esdeveniments push i pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Esmenta la clau de la tasca, com VC-12, en un missatge de commit, un nom de branca o el títol d'una pull request. L'enllaç apareix llavors a aquesta tasca.", + "Without Integriq, project members can still paste a link on the task page.": "Sense Integriq, els membres del projecte encara poden enganxar un enllaç a la pàgina de la tasca.", + "Download the Integriq configuration": "Baixa la configuració d'Integriq", + "Calendar": "Calendari", + "Previous": "Anterior", + "Calendar view": "Vista del calendari", + "Starts:": "Comença:", + "No tasks with a date in this month.": "No hi ha tasques amb data aquest mes.", + "Week of {start} to {end}": "Setmana del {start} al {end}", + "My calendar": "El meu calendari", + "Show as list": "Mostra com a llista", + "Show as calendar": "Mostra com a calendari", + "Open my calendar": "Obre el meu calendari", + "Nextcloud Tasks": "Tasques de Nextcloud", + "Show my tasks in Nextcloud Tasks": "Mostra les meves tasques a Tasques de Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Les tasques que tens assignades o compartides amb tu apareixen en una llista \"Planninq\" a Tasques i Calendari de Nextcloud. Els canvis que hi facis se substitueixen amb el següent canvi a Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Aquest servidor no pot escriure a Tasques de Nextcloud, per tant l'exportació no està disponible.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Gestionat per Planninq. Els canvis fets aquí se substitueixen amb el següent canvi a Planninq.", + "Working days and holidays": "Dies laborables i festius", + "Dates set on the timeline skip the days that are not working days.": "Les dates fixades a la cronologia salten els dies que no són laborables.", + "Working weekdays": "Dies laborables de la setmana", + "Non-working days": "Dies no laborables", + "No non-working days yet.": "Encara no hi ha dies no laborables.", + "Add day": "Afegeix un dia", + "Year": "Any", + "Add Dutch national holidays": "Afegeix els festius nacionals neerlandesos", + "Save working days": "Desa els dies laborables", + "Choose at least one working weekday.": "Tria almenys un dia laborable.", + "Working days saved.": "Dies laborables desats.", + "Could not save the working days.": "No s'han pogut desar els dies laborables.", + "New Year's Day": "Cap d'Any", + "Easter Sunday": "Diumenge de Pasqua", + "Easter Monday": "Dilluns de Pasqua", + "King's Day": "Dia del Rei", + "Liberation Day": "Dia de l'Alliberament", + "Ascension Day": "Ascensió", + "Whit Sunday": "Diumenge de Pentecosta", + "Whit Monday": "Dilluns de Pentecosta", + "Christmas Day": "Nadal", + "Boxing Day": "Sant Esteve", + "Dates of {title}": "Dates de {title}", + "The due date cannot be before the start date.": "La data de venciment no pot ser anterior a la d'inici.", + "{title}, from {start} to {end}": "{title}, del {start} al {end}", + "The dates could not be saved.": "No s'han pogut desar les dates.", + "{title} now runs from {start} to {end}": "{title} ara va del {start} al {end}", + "Auto-scheduling": "Planificació automàtica", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Si està activada, endarrerir un venciment a la cronologia ofereix moure també les tasques que bloqueja.", + "Move blocked tasks along when a task slips": "Mou les tasques bloquejades quan una tasca s'endarrereix", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "A la cronologia, un venciment posterior ofereix moure les tasques bloquejades. Només compten els enllaços \"bloqueja\", i les tasques només es mouen més tard.", + "Move the tasks that wait for {title}?": "Voleu moure les tasques que esperen {title}?", + "These tasks wait for it and would start after its new due date:": "Aquestes tasques l'esperen i començarien després del nou venciment:", + "{count} tasks would move; the first {limit} are listed.": "Es mourien {count} tasques; es mostren les primeres {limit}.", + "Now": "Ara", + "After the move": "Després del canvi", + "Only this task": "Només aquesta tasca", + "Move all": "Mou-les totes", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Aturat a {title}: no s'han pogut desar les dates. Les tasques anteriors s'han mogut.", + "Cumulative flow": "Flux acumulat", + "Show as chart": "Mostra com a gràfic", + "Show as table": "Mostra com a taula", + "Tasks per column per day": "Tasques per columna i dia", + "Tasks without recorded history in this period: {count}": "Tasques sense historial registrat en aquest període: {count}", + "Lead and cycle time": "Termini de lliurament i temps de cicle", + "No tasks were finished in this period.": "No s'ha acabat cap tasca en aquest període.", + "Finished tasks": "Tasques acabades", + "Cycle time, average": "Temps de cicle, mitjana", + "Cycle time, 85th percentile": "Temps de cicle, percentil 85", + "Lead time, average": "Termini de lliurament, mitjana", + "Tasks whose finish time was estimated from their history: {count}": "Tasques l'hora de finalització de les quals s'ha estimat a partir de l'historial: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Temps de cicle de cada tasca acabada, amb la mitjana i el percentil 85", + "Slowest tasks": "Tasques més lentes", + "cycle {cycle}, lead {lead}": "cicle {cycle}, termini {lead}", + "{days} days": "{days} dies", + "Could not load the flow of this project.": "No s'ha pogut carregar el flux d'aquest projecte.", + "Last {days} days": "Darrers {days} dies", + "Portfolio flow": "Flux de la cartera", + "An admin adds portfolios under Projects, Portfolios.": "Un administrador afegeix carteres a Projectes, Carteres.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projectes no mostrats, perquè se'n mostren com a màxim 50 alhora: {count}", + "Could not load the flow of this portfolio.": "No s'ha pogut carregar el flux d'aquesta cartera.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flux acumulat i temps de cicle dels projectes d'una cartera.", + "Edit report": "Edita l'informe", + "Only tasks where": "Només tasques on", + "Group by": "Agrupa per", + "Display": "Visualització", + "Share with everyone who can read its projects": "Comparteix amb tothom qui pot llegir-ne els projectes", + "The report could not be saved.": "No s'ha pogut desar l'informe.", + "Number of tasks": "Nombre de tasques", + "Bar": "Barres", + "Donut": "Anell", + "Table": "Taula", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} de {total} projectes d'aquest informe no són visibles per a tu", + "No tasks match this report.": "Cap tasca no coincideix amb aquest informe.", + "None": "Cap", + "Could not load this report.": "No s'ha pogut carregar aquest informe.", + "Report": "Informe", + "Your reports": "Els teus informes", + "My reports": "Els meus informes", + "Shared reports": "Informes compartits", + "You have not built a report yet.": "Encara no has creat cap informe.", + "Nobody has shared a report with you yet.": "Encara ningú no ha compartit cap informe amb tu.", + "Reports you built over tasks, and the ones shared with you.": "Informes que has creat sobre tasques, i els compartits amb tu.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Una consulta desada sobre tasques: quins projectes, quins filtres, agrupada per què, comptada o sumada, i mostrada com a taula o gràfic.", + "The name the report is listed under": "El nom amb què apareix l'informe a la llista", + "What the report shows and who it is for": "Què mostra l'informe i per a qui és", + "Nextcloud user id of the person who saved the report": "Id d'usuari de Nextcloud de qui ha desat l'informe", + "Who can open the report": "Qui pot obrir l'informe", + "Only me": "Només jo", + "Everyone who can read its projects": "Tothom qui pot llegir-ne els projectes", + "The projects the report covers, at most fifty": "Els projectes que cobreix l'informe, com a màxim cinquanta", + "Filters": "Filtres", + "Task fields and the value each must equal": "Camps de la tasca i el valor al qual ha de ser igual cadascun", + "The task field the report groups on": "El camp de la tasca pel qual agrupa l'informe", + "Count the tasks, or add up a number on them": "Comptar les tasques, o sumar-ne un nombre", + "Sum": "Suma", + "Sum of": "Suma de", + "The number added up when the measure is a sum": "El nombre que se suma quan la mesura és una suma", + "Story points": "Punts d'història", + "Estimated duration": "Durada estimada", + "How the report is shown": "Com es mostra l'informe", + "Issue type": "Tipus d'incidència", + "Task fields and the value each must equal; empty when the report covers every task": "Camps de la tasca i el valor que ha de tenir cadascun; buit si l'informe abasta totes les tasques", + "The status a task must have": "L'estat que ha de tenir una tasca", + "The priority a task must have": "La prioritat que ha de tenir una tasca", + "The user a task must be assigned to": "L'usuari a qui ha d'estar assignada una tasca", + "A label a task must carry": "Una etiqueta que ha de portar una tasca", + "The board column a task must be in": "La columna del tauler on ha de ser una tasca", + "The issue type a task must have": "El tipus d'incidència que ha de tenir una tasca", + "Manager groups": "Grups gestors", + "Member groups": "Grups membres", + "Viewer groups": "Grups lectors", + "Viewers": "Lectors", + "Owning group": "Grup propietari", + "Nextcloud groups whose members manage the project": "Grups de Nextcloud els membres dels quals gestionen el projecte", + "Nextcloud groups whose members work on the project": "Grups de Nextcloud els membres dels quals treballen en el projecte", + "Nextcloud groups whose members may read the project": "Grups de Nextcloud els membres dels quals poden llegir el projecte", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Usuaris de Nextcloud que gestionen el projecte: configuració, membres i feina", + "Nextcloud user ids who may read the project and its work but not change it": "Usuaris de Nextcloud que poden llegir el projecte i la seva feina però no canviar-los", + "The Nextcloud group that owns the project with its creator, at most one": "El grup de Nextcloud que posseeix el projecte amb qui l'ha creat, com a màxim un", + "Nextcloud user ids who may read this through the project": "Usuaris de Nextcloud que poden llegir això a través del projecte", + "Nextcloud groups whose members may change this through the project": "Grups de Nextcloud els membres dels quals poden canviar això a través del projecte", + "Nextcloud groups whose members may read this through the project": "Grups de Nextcloud els membres dels quals poden llegir això a través del projecte", + "Search for a person or a group…": "Cerca una persona o un grup…", + "No one found. Your admin's sharing settings decide who you can find.": "No s'ha trobat ningú. La configuració de compartició del teu administrador decideix qui pots trobar.", + "Type at least two characters": "Escriu almenys dos caràcters", + "Everyone in this group": "Tothom en aquest grup", + "Could not search for people. Please try again.": "No s'han pogut cercar persones. Torna-ho a provar.", + "Could not remove the group": "No s'ha pogut treure el grup", + "Only the owner and managers change who is on this project.": "Només el propietari i els gestors canvien qui és en aquest projecte.", + "Role of {name}": "Rol de {name}", + "Manager": "Gestor", + "Member": "Membre", + "Viewer": "Lector", + "Could not change the role": "No s'ha pogut canviar el rol", + "Owned by group: {name}": "Propietat del grup: {name}", + "No group owns this project.": "Cap grup és propietari d'aquest projecte.", + "Owned by group": "Propietat del grup", + "Search for a group…": "Cerca un grup…", + "No group found. Your admin's sharing settings decide which groups you can find.": "No s'ha trobat cap grup. La configuració de compartició del vostre administrador decideix quins grups podeu trobar.", + "No owning group": "Sense grup propietari", + "Could not search for groups. Please try again.": "No s'han pogut cercar grups. Torneu-ho a provar.", + "Could not change the owning group": "No s'ha pogut canviar el grup propietari", + "You can read this project. Only its members change it.": "Pots llegir aquest projecte. Només els seus membres el canvien.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "El curs que s'imparteix en aquesta classe, com una optativa, quan l'aplicació d'aprenentatge de l'escola el coneix.", + "Online meeting link": "Enllaç de la classe en línia", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "On els alumnes s'uneixen a aquesta classe en línia. El botó Uneix-te només apareix amb un enllaç https." }, "plurals": null } diff --git a/l10n/cs.js b/l10n/cs.js index dbf5f99d..ce5d98ca 100644 --- a/l10n/cs.js +++ b/l10n/cs.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktivní projekty", + "Archived projects": "Archivované projekty", + "Boards": "Nástěnky", + "My projects": "Moje projekty", + "Portfolio": "Portfolio", + "Project board": "Nástěnka projektu", + "Projects I am in": "Projekty, kterých se účastním", + "Timeline": "Časová osa", + "Timesheet": "Výkaz práce", + "Features & roadmap": "Funkce a plán vývoje", + "Flow": "Tok", + "Flows": "Toky", + "Reports": "Sestavy", + "Pick a report to open it.": "Vyberte sestavu, kterou chcete otevřít.", + "In progress": "Probíhá", + "Date": "Datum", + "Due": "Termín", + "Assignee": "Přiřazeno", + "Who": "Kdo", + "What": "Co", + "Minutes": "Minuty", + "Entries": "Záznamy", + "Most recent": "Nejnovější", + "Per person": "Na osobu", + "By status": "Podle stavu", + "By priority": "Podle priority", + "Task status": "Stav úkolů", + "Time spent": "Strávený čas", + "Capacity": "Kapacita", + "Due soonest": "Nejdříve splatné", + "Minutes logged": "Zaznamenané minuty", + "Nothing is due": "Nic není splatné", + "Nothing logged yet": "Zatím nic nezaznamenáno", + "What is open, what is blocked, and what is overdue.": "Co je otevřené, co blokované a co po termínu.", + "How allocation is spread across the people working on projects.": "Jak je vytížení rozloženo mezi lidi pracující na projektech.", + "Hours logged, and the projects they went to.": "Zaznamenané hodiny a projekty, do kterých šly.", + "Billable": "Fakturovatelné", + "Budget: {amount}": "Rozpočet: {amount}", + "Loading projects": "Načítání projektů", + "No projects for this client yet": "Pro tohoto klienta zatím nejsou žádné projekty", + "Open in Planninq": "Otevřít v Planninq", + "This project could not be found": "Tento projekt nebyl nalezen", + "Untitled project": "Projekt bez názvu", + "and {count} more": "a další {count}", + "Store": "Obchod", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Nainstalujte registry, schémata a toky zveřejněné jinými organizacemi.", + "Work Date": "Datum práce", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Akce sloupce", + "Columns": "Sloupce", + "Could not remove the column. Please try again.": "Sloupec se nepodařilo odebrat. Zkuste to znovu.", + "Could not save the column. Please try again.": "Sloupec se nepodařilo uložit. Zkuste to znovu.", + "Done column": "Sloupec hotovo", + "Edit column": "Upravit sloupec", + "Keep the card's status": "Zachovat stav karty", + "Move its cards to": "Přesunout jeho karty do", + "Move left": "Posunout doleva", + "Move right": "Posunout doprava", + "Status of cards moved here": "Stav karet přesunutých sem", + "The last done column cannot be removed.": "Poslední sloupec hotovo nelze odebrat.", + "WIP limit": "Limit WIP", + "over limit": "nad limitem", + "The status a card gets when it is moved into this column.": "Stav, který karta získá po přesunutí do tohoto sloupce.", + "All priorities": "Všechny priority", + "Could not create the task. Please try again.": "Úkol se nepodařilo vytvořit. Zkuste to znovu.", + "Created": "Vytvořeno", + "Move to backlog": "Do backlogu", + "Move to board": "Na nástěnku", + "New task": "Nový úkol", + "Nothing in the backlog": "Backlog je prázdný", + "Rank": "Pořadí", + "Sort by": "Seřadit podle", + "Sort by rank to reorder": "Pro změnu pořadí seřaďte podle pořadí", + "Task actions": "Akce úkolu", + "All labels": "Všechny štítky", + "Filter tasks by label": "Filtrovat úkoly podle štítku", + "View timeline": "Zobrazit časovou osu", + "Board": "Nástěnka", + "List": "Seznam", + "Column": "Sloupec", + "Board or list": "Nástěnka nebo seznam", + "Log": "Deník", + "Add entry": "Přidat záznam", + "Show": "Zobrazit", + "No actions yet": "Zatím žádné akce", + "Closed": "Uzavřeno", + "Entry actions": "Akce záznamu", + "Add action": "Přidat akci", + "by {author}": "autor {author}", + "saved {time}": "uloženo {time}", + "Attendees: {names}": "Účastníci: {names}", + "Add the first entry": "Přidat první záznam", + "Issues": "Problémy", + "Lessons learned": "Poučení", + "Meetings": "Schůzky", + "Decisions": "Rozhodnutí", + "Actions": "Akce", + "Issue": "Problém", + "Lesson learned": "Poučení", + "Meeting": "Schůzka", + "Decision": "Rozhodnutí", + "About this project": "O tomto projektu", + "No description yet": "Zatím bez popisu", + "Start date": "Datum zahájení", + "Not set": "Nenastaveno", + "End date": "Datum ukončení", + "Progress": "Postup", + "No tasks yet": "Zatím žádné úkoly", + "Open the board": "Otevřít nástěnku", + "People": "Lidé", + "Owner": "Vlastník", + "Latest log entries": "Nejnovější záznamy", + "Open the log": "Otevřít deník", + "{done} of {total} tasks done": "Hotovo {done} z {total} úkolů", + "Edit entry": "Upravit záznam", + "Type": "Druh", + "Attendees": "Účastníci", + "Issue is closed": "Problém je uzavřen", + "Could not save the entry. Please try again.": "Záznam se nepodařilo uložit. Zkuste to znovu.", + "From: {title}": "Z: {title}", + "What needs to happen": "Co je třeba udělat", + "Could not create the action. Please try again.": "Akci se nepodařilo vytvořit. Zkuste to znovu.", + "The action was created but could not be linked to the entry.": "Akce byla vytvořena, ale nepodařilo se ji propojit se záznamem.", + "Project pages": "Stránky projektu", + "Overview": "Přehled", + "Risks": "Rizika", + "Log entry": "Záznam deníku", + "A short name for the entry": "Krátký název záznamu", + "Project": "Projekt", + "The project this entry belongs to": "Projekt, ke kterému záznam patří", + "What kind of entry this is": "Jaký je to druh záznamu", + "When it happened": "Kdy se to stalo", + "What happened, in Markdown": "Co se stalo, v Markdownu", + "Whether an issue is still open": "Zda je problém stále otevřený", + "The people at a meeting": "Lidé na schůzce", + "Tasks that came out of this entry": "Úkoly, které vzešly z tohoto záznamu", + "Add risk": "Přidat riziko", + "Risk": "Riziko", + "Score": "Skóre", + "Response": "Reakce", + "Review date": "Datum revize", + "no longer on the project": "už není v projektu", + "Edit {title}": "Upravit {title}", + "No risks recorded yet": "Zatím žádná zaznamenaná rizika", + "Add the first risk": "Přidat první riziko", + "Medium": "Střední", + "Mitigating": "Zmírňuje se", + "Occurred": "Nastalo", + "Avoid": "Vyhnout se", + "Reduce": "Snížit", + "Transfer": "Přenést", + "Accept": "Přijmout", + "Highest open risks": "Nejvyšší otevřená rizika", + "No open risks": "Žádná otevřená rizika", + "Open the risk register": "Otevřít registr rizik", + "Edit risk": "Upravit riziko", + "What could go wrong": "Co se může pokazit", + "Likelihood": "Pravděpodobnost", + "Impact": "Dopad", + "Score {score}": "Skóre {score}", + "Countermeasures": "Protiopatření", + "Could not save the risk. Please try again.": "Riziko se nepodařilo uložit. Zkuste to znovu.", + "Risks by likelihood and impact": "Rizika podle pravděpodobnosti a dopadu", + "Risk scale": "Škála rizik", + "The levels every project scores its risks on, and where low turns into medium and high": "Úrovně, na kterých každý projekt hodnotí svá rizika, a kde nízké přechází ve střední a vysoké", + "Number of levels": "Počet úrovní", + "Likelihood labels": "Popisky pravděpodobnosti", + "Impact labels": "Popisky dopadu", + "Level {level}": "Úroveň {level}", + "Medium from score": "Střední od skóre", + "High from score": "Vysoké od skóre", + "Risk scale saved": "Škála rizik uložena", + "1 risk uses level {level}. Change it first.": "1 riziko používá úroveň {level}. Nejprve ho změňte.", + "{count} risks use level {level}. Change them first.": "{count} rizik používá úroveň {level}. Nejprve je změňte.", + "Every level needs a label, and high must start above medium.": "Každá úroveň potřebuje popisek a vysoké musí začínat nad středním.", + "The project this risk belongs to": "Projekt, ke kterému riziko patří", + "The cause and the effect, in Markdown": "Příčina a následek, v Markdownu", + "Category": "Kategorie", + "A free grouping, such as planning, budget or supplier": "Volné seskupení, např. plánování, rozpočet nebo dodavatel", + "How likely it is, on the admin's risk scale": "Jak je pravděpodobné, na škále rizik správce", + "How hard it would hit, on the admin's risk scale": "Jak tvrdě by zasáhlo, na škále rizik správce", + "Likelihood times impact, calculated by the server": "Pravděpodobnost krát dopad, spočítané serverem", + "Where the risk stands": "Jak na tom riziko je", + "The person who watches this risk": "Osoba, která riziko sleduje", + "How the project answers the risk": "Jak projekt na riziko odpovídá", + "What is done to prevent it or soften it, in Markdown": "Co se dělá pro jeho prevenci nebo zmírnění, v Markdownu", + "When to look at this risk again": "Kdy riziko znovu posoudit", + "Very low": "Velmi nízké", + "Very high": "Velmi vysoké", + "All projects": "Všechny projekty", + "Project status report": "Zpráva o stavu projektu", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datovaná zpráva o tom, jak si projekt stojí v penězích, organizaci, čase, informacích, kvalitě a riziku (aspekty GROTIK), každý s poznámkou.", + "The project this report is about": "Projekt, kterého se zpráva týká", + "Report date": "Datum zprávy", + "The day the report describes": "Den, který zpráva popisuje", + "Money": "Peníze", + "How the project stands on this aspect": "Jak si projekt stojí v tomto aspektu", + "On track": "Podle plánu", + "At risk": "Ohroženo", + "Off track": "Mimo plán", + "Money note": "Poznámka k penězům", + "A short explanation of this status": "Krátké vysvětlení tohoto stavu", + "Organisation": "Organizace", + "Organisation note": "Poznámka k organizaci", + "Time": "Čas", + "Time note": "Poznámka k času", + "Information": "Informace", + "Information note": "Poznámka k informacím", + "Quality": "Kvalita", + "Quality note": "Poznámka ke kvalitě", + "Risk note": "Poznámka k riziku", + "Overall": "Celkově", + "The worst of the six statuses, calculated by the server": "Nejhorší ze šesti stavů, vypočtený serverem", + "Health: money": "Stav: peníze", + "Copied from the newest status report": "Převzato z nejnovější zprávy o stavu", + "Health: organisation": "Stav: organizace", + "Health: time": "Stav: čas", + "Health: information": "Stav: informace", + "Health: quality": "Stav: kvalita", + "Health: risk": "Stav: riziko", + "Health: overall": "Stav: celkově", + "Health: report date": "Stav: datum zprávy", + "The date of the newest status report": "Datum nejnovější zprávy o stavu", + "New report": "Nová zpráva", + "Only the project owner writes status reports.": "Zprávy o stavu píše jen vlastník projektu.", + "Latest report, {date}": "Poslední zpráva, {date}", + "Aspect": "Aspekt", + "Note": "Poznámka", + "Report history": "Historie zpráv", + "Author": "Autor", + "No status reports yet": "Zatím žádné zprávy o stavu", + "Write the first report": "Napsat první zprávu", + "Choose a status for every aspect to save the report.": "Pro uložení zprávy zvolte stav u každého aspektu.", + "Suggested: on track.": "Návrh: podle plánu.", + "Suggested: at risk.": "Návrh: ohroženo.", + "Suggested: off track.": "Návrh: mimo plán.", + "1 task is past its due date.": "1 úkol je po termínu.", + "{count} tasks are past their due date.": "Úkoly po termínu: {count}.", + "The end date has passed with 1 open task.": "Datum konce uplynulo s 1 otevřeným úkolem.", + "The end date has passed with {count} open tasks.": "Datum konce uplynulo, otevřené úkoly: {count}.", + "No open task is past its due date.": "Žádný otevřený úkol není po termínu.", + "The highest open risk, \"{title}\", scores {score}.": "Nejvyšší otevřené riziko, \"{title}\", má skóre {score}.", + "There are no open risks.": "Nejsou žádná otevřená rizika.", + "Costs are at {percent}% of the budget.": "Náklady jsou na {percent}% rozpočtu.", + "No suggestion: the project has no budget.": "Bez návrhu: projekt nemá rozpočet.", + "No suggestion: no costs are recorded for this project yet.": "Bez návrhu: pro tento projekt zatím nejsou zaznamenány žádné náklady.", + "The report was not saved. Only the project owner can write status reports.": "Zpráva nebyla uložena. Zprávy o stavu může psát jen vlastník projektu.", + "No report": "Žádná zpráva", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Skupina projektů vedených stejnými lidmi, například oddělení nebo program. Její správci čtou každý projekt v ní.", + "The name of the portfolio": "Název portfolia", + "What the portfolio holds and who runs it": "Co portfolio obsahuje a kdo ho vede", + "A colour for the portfolio's section in project lists": "Barva sekce portfolia v seznamech projektů", + "Managers": "Správci", + "Nextcloud user UIDs of the people who run the portfolio": "ID uživatelů Nextcloud lidí, kteří portfolio vedou", + "Order": "Pořadí", + "Where the portfolio comes in project lists, lowest first": "Kde je portfolio v seznamech projektů, od nejnižšího", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Vlastní škála rizik tohoto portfolia jako JSON, ve stejném tvaru jako škála celé aplikace. Prázdné znamená škálu aplikace.", + "Portfolio readers": "Čtenáři portfolia", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID uživatelů Nextcloud správců portfolia projektu", + "The portfolio this project belongs to": "Portfolio, do kterého projekt patří", + "No portfolio": "Bez portfolia", + "All portfolios": "Všechna portfolia", + "You read this project as a manager of its portfolio. Only its members change it.": "Tento projekt čtete jako správce jeho portfolia. Mění ho jen jeho členové.", + "Portfolios": "Portfolia", + "Portfolio status": "Stav portfolia", + "No portfolios yet": "Zatím žádná portfolia", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Správce přidává portfolia v Projekty, Portfolia. Projekty v portfoliu jsou zde uvedeny se svým stavem.", + "Roll-up": "Souhrn", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} podle plánu, {atRisk} ohroženo, {offTrack} mimo plán, {noReport} bez zprávy", + "No project in this portfolio that you can read.": "V tomto portfoliu není projekt, který můžete číst.", + "Start": "Začátek", + "End": "Konec", + "Budget": "Rozpočet", + "Last report": "Poslední zpráva", + "Out of date": "Zastaralé", + "Portfolio timeline": "Časová osa portfolia", + "Zoom": "Přiblížení", + "Could not load the timeline": "Časovou osu se nepodařilo načíst", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Správce přidává portfolia v Projekty, Portfolia. Projekty v portfoliu jsou zde na jedné časové ose.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Otevřete projekt a uvidíte jeho fáze a úkoly. Časová osa je jen pro čtení.", + "Phase: {title}": "Fáze: {title}", + "Left out because you cannot read them: {count} projects": "Vynecháno, protože je nemůžete číst: {count} projektů", + "Week": "Týden", + "Day": "Den", + "Month": "Měsíc", + "Please try again later.": "Zkuste to prosím později.", + "Status reports": "Zprávy o stavu", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Po kolika dnech je poslední zpráva o stavu projektu označena v přehledu portfolia jako zastaralá", + "Reporting period (days)": "Období vykazování (dny)", + "The reporting period is a whole number of days from 1 to 365.": "Období vykazování je celý počet dní od 1 do 365.", + "Reporting period saved": "Období vykazování uloženo", + "The reporting period was not saved. Please try again.": "Období vykazování nebylo uloženo. Zkuste to znovu.", + "Every project of a portfolio with its status per aspect, rolled up.": "Každý projekt portfolia se stavem podle aspektů, shrnutý.", + "The projects of a portfolio on one timeline.": "Projekty portfolia na jedné časové ose.", + "Phases": "Fáze", + "Add phase": "Přidat fázi", + "No phases yet": "Zatím žádné fáze", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Rozdělte projekt do fází, například zahájení, definice a realizace. Fáze se uzavře, jakmile je nahrán její závěrečný dokument.", + "{hours} hours": "{hours} hodin", + "Concluding document: {title}": "Závěrečný dokument: {title}", + "Concluding document missing": "Chybí závěrečný dokument", + "Move {title} up": "Posunout {title} nahoru", + "Move {title} down": "Posunout {title} dolů", + "Close phase": "Uzavřít fázi", + "Phase": "Fáze", + "Files": "Soubory", + "Notes": "Poznámky", + "Audit trail": "Auditní záznam", + "Edit phase": "Upravit fázi", + "Name": "Název", + "Budget hours": "Rozpočtované hodiny", + "Could not save the phase. Please try again.": "Fázi se nepodařilo uložit. Zkuste to znovu.", + "Close phase {title}": "Uzavřít fázi {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Fáze se uzavírá závěrečným dokumentem: nahrajte ho sem nebo vyberte některý ze souborů fáze.", + "Concluding document": "Závěrečný dokument", + "This phase has no files yet.": "Tato fáze zatím nemá žádné soubory.", + "Upload a document": "Nahrát dokument", + "The document was not uploaded. Please try again.": "Dokument nebyl nahrán. Zkuste to znovu.", + "Upload the concluding document before you close this phase.": "Než tuto fázi uzavřete, nahrajte závěrečný dokument.", + "This phase cannot be closed from its current status.": "Tuto fázi nelze uzavřít z jejího současného stavu.", + "The phase was not closed. Please try again.": "Fáze nebyla uzavřena. Zkuste to znovu.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID souboru této fáze, který ji uzavírá. Fázi lze dokončit, až když je vyplněno a soubor je připojen.", + "Import from Microsoft Project": "Importovat z Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Vyberte plán uložený z Microsoft Project ve formátu XML. Nic se neimportuje, dokud nepotvrdíte.", + "Plan file": "Soubor plánu", + "What the import creates": "Co import vytvoří", + "Tasks": "Úkoly", + "Sub-tasks": "Dílčí úkoly", + "Milestones": "Milníky", + "Links": "Vazby", + "Already imported, updated in place: {count}": "Již importováno, aktualizováno na místě: {count}", + "What does not carry over": "Co se nepřenese", + "Tasks with resources, which are not imported: {count}": "Úkoly se zdroji, které se neimportují: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Úkoly hlouběji než úroveň 3, umístěné pod svůj úkol úrovně 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Vazby jiné než konec-začátek, importované jako související vazby: {count}", + "Link lags, which are dropped: {count}": "Prodlevy vazeb, které se vypouštějí: {count}", + "Links to a summary task, which are not imported: {count}": "Vazby na souhrnný úkol, které se neimportují: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Vazby na úkoly mimo tento plán, které se neimportují: {count}", + "No longer in the plan": "Již není v plánu", + "These stay in the project; remove them yourself if they are no longer needed.": "Zůstávají v projektu; odstraňte je sami, pokud už nejsou potřeba.", + "Import": "Importovat", + "Close": "Zavřít", + "The plan is imported: {created} created, {updated} updated.": "Plán je importován: vytvořeno {created}, aktualizováno {updated}.", + "Links that would close a loop were left out: {count}": "Vazby, které by uzavřely smyčku, byly vynechány: {count}", + "The import stopped part-way. Run it again to finish it.": "Import se zastavil v polovině. Spusťte ho znovu, abyste ho dokončili.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Uložte plán v Microsoft Project přes Soubor, Uložit jako, formát XML, a importujte tento soubor.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Tento soubor deklaruje DOCTYPE nebo entity, které nejsou přijímány.", + "The file is larger than 10 MB.": "Soubor je větší než 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plán má více než 2 000 úkolů, víc, než jeden import přijme.", + "This file is not a Microsoft Project plan in XML format.": "Tento soubor není plán Microsoft Project ve formátu XML.", + "Choose a file to import.": "Vyberte soubor k importu.", + "Only the project owner can import a plan.": "Plán může importovat jen vlastník projektu.", + "The plan could not be read. Please try again.": "Plán se nepodařilo přečíst. Zkuste to znovu.", + "Linked case: {title}": "Propojený spis: {title}", + "Linked to a case": "Propojeno se spisem", + "Hand over to case": "Předat do spisu", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Beze změny zkopíruje každý soubor projektu a jeho úkolů a soubor popisující projekt do propojeného spisu.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Zkopírované soubory: {count}", + "Files that failed: {names}": "Neúspěšné soubory: {names}", + "The handover failed. Please try again.": "Předání se nezdařilo. Zkuste to znovu.", + "The linked case could not be found, or you cannot open it.": "Propojený spis nebyl nalezen, nebo ho nemůžete otevřít.", + "Case handovers": "Předání do spisu", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Každé předání souborů a metadat projektu do jeho spisu: kdy, kým, do kterého spisu, každý zkopírovaný soubor s jeho SHA-256 a neúspěšné soubory.", + "Finance": "Finance", + "Add cost line": "Přidat nákladovou položku", + "Delivery terms": "Dodací podmínky", + "Billing model": "Model fakturace", + "Budget in euro": "Rozpočet v eurech", + "Budget in hours": "Rozpočet v hodinách", + "Hourly rate in euro": "Hodinová sazba v eurech", + "Planned start": "Plánovaný začátek", + "Planned end": "Plánovaný konec", + "Planned dates": "Plánovaná data", + "Budget {amount}": "Rozpočet {amount}", + "No budget agreed": "Rozpočet nebyl dohodnut", + "Hours": "Hodiny", + "Only the project owner and the portfolio managers see the amounts.": "Částky vidí jen vlastník projektu a správci portfolia.", + "Budget against cost per category": "Rozpočet proti nákladům podle kategorie", + "Labour (booked time)": "Práce (vykázaný čas)", + "No category": "Bez kategorie", + "Hours are not available": "Hodiny nejsou k dispozici", + "Not yet assigned to a category": "Zatím nepřiřazeno ke kategorii", + "Total": "Celkem", + "{spent} spent, {remaining} remaining": "{spent} utraceno, {remaining} zbývá", + "Budget against cost per phase": "Rozpočet proti nákladům podle fáze", + "No phase": "Bez fáze", + "Cost lines": "Nákladové položky", + "From the finance system": "Z finančního systému", + "Edit cost line {amount}": "Upravit nákladovou položku {amount}", + "No cost lines yet": "Zatím žádné nákladové položky", + "Commitments": "Závazky", + "Actual cost": "Skutečné náklady", + "Forecast": "Prognóza", + "Remaining": "Zbývá", + "Not planned yet": "Zatím nenaplánováno", + "{start} to {end}": "{start} až {end}", + "The terms were not saved. Please try again.": "Podmínky nebyly uloženy. Zkuste to znovu.", + "Terms saved": "Podmínky uloženy", + "Fixed price": "Pevná cena", + "Hourly": "Hodinově", + "Not billed": "Nefakturováno", + "Commitment": "Závazek", + "Edit cost line": "Upravit nákladovou položku", + "Kind": "Druh", + "Amount in euro": "Částka v eurech", + "Remove": "Odebrat", + "Could not save the cost line. Only the project owner changes the money of a project.": "Nákladovou položku nelze uložit. Peníze projektu mění jen vlastník projektu.", + "Could not remove the cost line. Please try again.": "Nákladovou položku nelze odebrat. Zkuste to znovu.", + "{amount} over budget": "{amount} nad rozpočet", + "Cost categories": "Kategorie nákladů", + "The categories every project splits its budget and costs into, one per line": "Kategorie, do kterých každý projekt dělí svůj rozpočet a náklady, jedna na řádek", + "Categories": "Kategorie", + "Give at least one category, each name once.": "Zadejte aspoň jednu kategorii, každý název jednou.", + "Cost categories saved": "Kategorie nákladů uloženy", + "The cost categories were not saved. Please try again.": "Kategorie nákladů nebyly uloženy. Zkuste to znovu.", + "Finance line": "Finanční položka", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Jedna částka peněz v projektu: rozpočet, závazek, skutečný náklad nebo prognóza, v kategorii nákladů a případně ve fázi. Zadaná vlastníkem projektu nebo finančním systémem přes integrační aplikaci.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt, ke kterému částka patří. Prázdné u položky z finančního systému, jejíž číslo projektu neodpovídá žádnému projektu.", + "The phase this amount belongs to, if any": "Fáze, ke které částka patří, pokud existuje", + "The cost category, one of the categories the admin set up": "Kategorie nákladů, jedna z kategorií nastavených správcem", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Zda je částka rozpočet, závazek, skutečný náklad nebo prognóza", + "Amount": "Částka", + "The amount in the reporting currency (euro)": "Částka v měně výkaznictví (euro)", + "The date the amount was booked or is expected": "Datum, kdy byla částka zaúčtována nebo se očekává", + "What the amount is for": "Na co částka je", + "Whether a person entered the line or the finance system sent it": "Zda položku zadal člověk, nebo ji poslal finanční systém", + "Entered by hand": "Zadáno ručně", + "Finance line id": "Id finanční položky", + "The finance system's own id of this line. One imported line per id.": "Vlastní id této položky ve finančním systému. Jedna importovaná položka na id.", + "Project number": "Číslo projektu", + "The project number the finance system sent, matched against the project key": "Číslo projektu zaslané finančním systémem, porovnané s klíčem projektu", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfolio projektu položky, převzaté z projektu, aby součty portfolia potřebovaly jeden filtr", + "Finance readers": "Čtenáři financí", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID uživatelů Nextcloud, kteří smějí vidět tuto částku: vlastník projektu a správci jeho portfolia", + "Project owner": "Vlastník projektu", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID uživatele Nextcloud vlastníka projektu, který smí měnit a odebírat ruční položky", + "How the client pays: not billed, a fixed price, or by the hour.": "Jak klient platí: nefakturováno, pevná cena nebo hodinově.", + "Portfolio finance": "Finance portfolia", + "You cannot see the money of any project in this portfolio": "Nevidíte peníze žádného projektu v tomto portfoliu", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Server vrátil nákladové položky projektů mimo toto portfolio, takže tyto součty mohou být chybné.", + "Projects left out because you cannot see their money: {count}": "Vynechané projekty, protože nevidíte jejich peníze: {count}", + "Unmatched finance lines": "Nepřiřazené finanční položky", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Rozpočet, závazky, skutečné náklady a prognóza sečtené za portfolio.", + "Subprojects": "Podprojekty", + "{done} of {total}": "{done} z {total}", + "{done} of {total} tasks done, including subprojects": "{done} z {total} úkolů hotovo, včetně podprojektů", + "Show the subprojects of {title}": "Zobrazit podprojekty {title}", + "Hide the subprojects of {title}": "Skrýt podprojekty {title}", + "Part of": "Součást", + "No parent project": "Bez nadřazeného projektu", + "A project cannot sit under one of its own subprojects.": "Projekt nemůže ležet pod jedním ze svých vlastních podprojektů.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekty se vnořují nejvýše do tří úrovní: program, projekt a podprojekt.", + "Parent project": "Nadřazený projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt, pod kterým tento projekt leží, například program. Projekty se vnořují nejvýše do tří úrovní.", + "Yes": "Ano", + "No": "Ne", + "{label} (required)": "{label} (povinné)", + "{label} is required": "{label} je povinné", + "Project field": "Pole projektu", + "A field an admin adds to every project, such as a policy area or a contract value.": "Pole, které správce přidá ke každému projektu, například oblast politiky nebo hodnotu zakázky.", + "Key": "Klíč", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stálý název, pod kterým se hodnota ukládá, v lower camel case. Neměňte ho, jakmile ho projekty používají.", + "Label": "Popisek", + "The name people see next to the field": "Název, který lidé vidí u pole", + "What the field holds": "Co pole obsahuje", + "Text": "Text", + "Number": "Číslo", + "Choice": "Volba", + "Person": "Osoba", + "Yes or no": "Ano nebo ne", + "Options": "Možnosti", + "The choices of a choice field": "Možnosti výběrového pole", + "Required": "Povinné", + "Whether a project must fill in the field": "Zda projekt musí pole vyplnit", + "Where the field appears, lowest first": "Kde se pole zobrazí, nejnižší první", + "Applies to": "Platí pro", + "What the field is added to": "K čemu se pole přidává", + "Custom fields": "Vlastní pole", + "The values of the project fields an admin defined, keyed by the field's key.": "Hodnoty polí projektu, která definoval správce, podle klíče pole.", + "Project fields": "Pole projektu", + "Related": "Související", + "Remove link": "Odebrat odkaz", + "Link type": "Typ odkazu", + "Relates to": "Souvisí s", + "Duplicates": "Duplikuje", + "Project key": "Klíč projektu", + "Every task number starts with it, such as VERG-42.": "Každé číslo úkolu jím začíná, například VERG-42.", + "This key is already used by another project.": "Tento klíč už používá jiný projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Použijte 2 až 10 písmen a číslic, začínající písmenem.", + "The key cannot change once tasks carry it.": "Klíč se nemůže změnit, jakmile ho nesou úkoly.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt uložen. Stávající úkoly dostanou svá čísla na pozadí.", + "Next task number": "Číslo dalšího úkolu", + "The number the next task of this project gets in its key. Only the system writes it.": "Číslo, které další úkol tohoto projektu dostane ve svém klíči. Zapisuje ho jen systém.", + "Restore {title}": "Obnovit {title}", + "Restore": "Obnovit", + "Project restored": "Projekt obnoven", + "Could not restore the project": "Projekt se nepodařilo obnovit", + "Bring this project back to the active list.": "Vrátit projekt do seznamu aktivních projektů.", + "Restore project": "Obnovit projekt", + "Request reason": "Důvod žádosti", + "Why the requester needs this project. Filled in when the project is requested.": "Proč žadatel tento projekt potřebuje. Vyplňuje se při žádosti.", + "Reviewed by": "Posoudil", + "The user who approved or rejected the request.": "Uživatel, který žádost schválil nebo zamítl.", + "Reviewed at": "Posouzeno", + "When the request was approved or rejected.": "Kdy byla žádost schválena nebo zamítnuta.", + "Review note": "Poznámka k posouzení", + "The reviewer's reason, shown to the requester when a request is not approved.": "Důvod posuzovatele, který žadatel uvidí, když žádost není schválena.", + "Members of these groups": "Členové těchto skupin", + "Groups that may create projects": "Skupiny, které smějí zakládat projekty", + "The group {group} no longer exists. Save to remove it.": "Skupina {group} už neexistuje. Uložením ji odeberete.", + "Review project request": "Posoudit žádost o projekt", + "Requested by": "Požádal", + "Why it is needed": "Proč je potřeba", + "Desired start date": "Požadované datum zahájení", + "Why is it not approved?": "Proč není schválen?", + "Give a reason. The requester sees it.": "Uveďte důvod. Žadatel ho uvidí.", + "Approve": "Schválit", + "Reject": "Zamítnout", + "Reject request": "Zamítnout žádost", + "The review was not saved. Try again.": "Posouzení se neuložilo. Zkuste to znovu.", + "This project is waiting for review": "Tento projekt čeká na posouzení", + "This request was not approved": "Tato žádost nebyla schválena", + "Reason: {note}": "Důvod: {note}", + "Review request": "Posoudit žádost", + "Request a project": "Požádat o projekt", + "Step {step} of 2": "Krok {step} ze 2", + "Why is this project needed?": "Proč je tento projekt potřeba?", + "Give a reason. The reviewer reads it.": "Uveďte důvod. Posuzovatel ho přečte.", + "Back": "Zpět", + "Next": "Další", + "Send request": "Odeslat žádost", + "The request was not sent. Try again.": "Žádost se neodeslala. Zkuste to znovu.", + "Requested": "Požadováno", + "Not approved": "Neschváleno", + "Your request was sent": "Vaše žádost byla odeslána", + "Let everyone else request a project": "Umožnit všem ostatním požádat o projekt", + "Add a task": "Přidat úkol", + "Delete task": "Smazat úkol", + "Edit task": "Upravit úkol", + "Write": "Psát", + "Preview": "Náhled", + "Markdown works here: headings, lists and links.": "Zde funguje Markdown: nadpisy, seznamy a odkazy.", + "Could not save the task. Please try again.": "Úkol se nepodařilo uložit. Zkuste to znovu.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Na úkolu \"{title}\" je zapsaný čas, proto ho nelze smazat. Místo toho ho můžete zrušit: záznamy času zůstanou.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Smazat \"{title}\"? Odstraní se také jeho odkazy na jiné úkoly. Tuto akci nelze vrátit zpět.", + "Keep task": "Ponechat úkol", + "Cancel task": "Zrušit úkol", + "Only the reporter, the project owner or an admin can delete this task.": "Tento úkol může smazat jen ten, kdo ho nahlásil, vlastník projektu nebo správce.", + "Could not delete the task. Please try again.": "Úkol se nepodařilo smazat. Zkuste to znovu.", + "Could not cancel the task. Please try again.": "Úkol se nepodařilo zrušit. Zkuste to znovu.", + "Responsible": "Odpovědná osoba", + "Also working on this": "Pracují na tom také", + "Labels": "Štítky", + "Could not change the priority. Please try again.": "Prioritu se nepodařilo změnit. Zkuste to znovu.", + "Other project members who work on this task alongside the person responsible.": "Další členové projektu, kteří na úkolu pracují spolu s odpovědnou osobou.", + "Duplicate": "Duplikovat", + "Could not copy the task. Please try again.": "Úkol se nepodařilo zkopírovat. Zkuste to znovu.", + "Subtasks": "Podúkoly", + "{done} of {total} done": "Hotovo {done} z {total}", + "Add a subtask": "Přidat podúkol", + "Checklist": "Kontrolní seznam", + "Checklist item actions": "Akce položky seznamu", + "Add a checklist item": "Přidat položku seznamu", + "Subtasks: {estimate} estimated, {logged} logged": "Podúkoly: odhad {estimate}, zapsáno {logged}", + "Total estimate: {total}": "Celkový odhad: {total}", + "Part of {title}": "Součást úkolu {title}", + "Checklist: {count} done": "Kontrolní seznam: hotovo {count}", + "This task has subtasks: {count}.": "Tento úkol má podúkoly: {count}.", + "Keep subtasks as separate tasks": "Ponechat podúkoly jako samostatné úkoly", + "Delete subtasks too": "Smazat i podúkoly", + "Copy of {title}": "Kopie: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Úkol byl zkopírován, ale ne všechny jeho podúkoly. Zkontrolujte kopii.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Malé kroky v rámci úkolu. Každá položka má id, text a informaci, zda je hotová.", + "Open work per person and per project.": "Otevřená práce podle osob a projektů.", + "View": "Zobrazení", + "By person": "Podle osoby", + "By project": "Podle projektu", + "Hours left": "Zbývající hodiny", + "Tasks without an estimate": "Úkoly bez odhadu", + "Due in 14 days": "Termín do 14 dnů", + "Shared": "Sdílené", + "Unassigned": "Nepřiřazené", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Zobrazuje se práce v projektech, které vidíte. Hodiny se počítají odpovědné osobě; sdílené úkoly se počítají bez hodin.", + "No open work in these projects.": "V těchto projektech není žádná otevřená práce.", + "Open work": "Otevřená práce", + "{count} open tasks": "{count} otevřených úkolů", + "Create a project to see capacity here.": "Vytvořte projekt, abyste zde viděli kapacitu.", + "My tasks": "Moje úkoly", + "Show all my tasks": "Zobrazit všechny moje úkoly", + "No tasks assigned to you": "Nemáte přiřazené žádné úkoly", + "Browse projects": "Procházet projekty", + "Later": "Později", + "Due {date}": "Termín {date}", + "Could not change the status. Please try again.": "Stav se nepodařilo změnit. Zkuste to znovu.", + "Completed today": "Dokončeno dnes", + "My open tasks": "Moje otevřené úkoly", + "My overdue tasks": "Moje úkoly po termínu", + "My tasks in progress": "Moje rozpracované úkoly", + "Pin to the top": "Připnout nahoru", + "Unpin": "Odepnout", + "Pinned": "Připnuto", + "Actions for {title}": "Akce pro {title}", + "Could not save your project order. Please try again.": "Pořadí projektů se nepodařilo uložit. Zkuste to znovu.", + "No boards yet": "Zatím žádné tabule", + "Create a project to get a board.": "Vytvořte projekt, abyste měli tabuli.", + "Use the Projects page to create and manage your projects and tasks.": "Na stránce Projekty vytvářejte a spravujte své projekty a úkoly.", + "Go to projects": "Přejít na projekty", + "You are not a member of any projects yet.": "Zatím nejste členem žádného projektu.", + "Could not search for users. Please try again.": "Uživatele se nepodařilo vyhledat. Zkuste to znovu.", + "Project creation is restricted to administrators.": "Projekty mohou vytvářet pouze správci.", + "Only the project owner or an administrator can delete this project.": "Tento projekt může smazat pouze vlastník projektu nebo správce.", + "No projects are available to you yet. Ask an administrator to create one.": "Zatím pro vás nejsou dostupné žádné projekty. Požádejte správce o vytvoření.", + "Due: {date}": "Termín: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Úkoly s datem zahájení nebo termínem se zobrazují na časové ose. Přidejte data, abyste je zde viděli.", + "You do not have access to this project.": "K tomuto projektu nemáte přístup.", + "Zoom level": "Úroveň přiblížení", + "Unscheduled": "Nenaplánované", + "Start: {date}": "Začátek: {date}", + "Today": "Dnes", + "No scheduled tasks": "Žádné naplánované úkoly", + "An unexpected error occurred.": "Došlo k neočekávané chybě.", + "Column {number} name": "Název sloupce {number}", + "Failed to save creation policy": "Pravidlo pro vytváření se nepodařilo uložit", + "All authenticated users": "Všichni přihlášení uživatelé", + "Control who may create new projects": "Určete, kdo smí vytvářet nové projekty", + "Administrators only": "Pouze správci", + "Project creation": "Vytváření projektů", + "Allow project creation": "Povolit vytváření projektů", + "Creation policy saved successfully": "Pravidlo pro vytváření uloženo", + "Initializing…": "Spouštění…", + "e.g. 2h 30m, 90m, 1.5h": "např. 2h 30m, 90m, 1.5h", + "Log time": "Zapsat čas", + "Save estimate": "Uložit odhad", + "Logged: {logged}": "Zapsáno: {logged}", + "over by {amount}": "překročeno o {amount}", + "Time tracking": "Evidence času", + "Estimate": "Odhad", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Zadejte platný odhad (např. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Zadejte platnou dobu trvání (např. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Záznam času se nepodařilo uložit. Zkuste to znovu.", + "Edit time entry": "Upravit záznam času", + "Duration": "Doba trvání", + "Date range": "Období", + "Last week": "Minulý týden", + "No time logged": "Žádný zapsaný čas", + "Log time on a task to see it here.": "Zapište čas k úkolu, abyste ho zde viděli.", + "To date": "Do data", + "This week": "Tento týden", + "Total: {total}": "Celkem: {total}", + "From date": "Od data", + "Custom range": "Vlastní období", + "All time": "Celé období", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Úkol se nepodařilo smazat, takže mohou zůstat data. Smažte projekt znovu.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Záznam času se nepodařilo smazat, takže mohou zůstat data. Smažte projekt znovu.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Sloupec se nepodařilo smazat, takže mohou zůstat data. Smažte projekt znovu.", + "Could not delete the project. Please try again.": "Projekt se nepodařilo smazat. Zkuste to znovu.", + "Notification settings": "Nastavení oznámení", + "Configure when due-date reminders are sent": "Nastavte, kdy se posílají připomínky termínů", + "Due-date reminder lead time (hours)": "Předstih připomínky termínu (hodiny)", + "Lead time must be between 1 and 336 hours": "Předstih musí být mezi 1 a 336 hodinami", + "Reminder lead time saved successfully": "Předstih připomínky uložen", + "Failed to save reminder lead time": "Předstih připomínky se nepodařilo uložit", + "Notifications": "Oznámení", + "Notify me 1 day before a task's due date": "Upozornit mě 1 den před termínem úkolu", + "Draft": "Koncept", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Zda je hodina koncept, který vidí jen její učitel, koná se, nebo je zrušena.", + "New release": "Nové vydání", + "Roadmap chart. The same releases and epics are listed below.": "Graf plánu. Stejná vydání a eposy jsou vypsány níže.", + "Nothing on the roadmap yet": "Na plánu zatím nic není", + "Releases with a target date and epics with dated tasks appear here.": "Zde se zobrazují vydání s cílovým datem a eposy s úkoly, které mají datum.", + "Releases": "Vydání", + "No releases yet": "Zatím žádná vydání", + "Target date: {date}": "Cílové datum: {date}", + "No target date": "Bez cílového data", + "Edit {name}": "Upravit {name}", + "Mark {name} as released": "Označit {name} jako vydané", + "Mark as released": "Označit jako vydané", + "Epics": "Eposy", + "No epics yet. Open a task to make it an epic.": "Zatím žádné eposy. Otevřete úkol a udělejte z něj epos.", + "Not scheduled yet": "Zatím nenaplánováno", + "Planned": "Plánováno", + "Released": "Vydáno", + "Edit release": "Upravit vydání", + "Target date": "Cílové datum", + "Could not save the release. Please try again.": "Vydání se nepodařilo uložit. Zkuste to znovu.", + "Every task of this release is done or cancelled.": "Každý úkol tohoto vydání je hotový nebo zrušený.", + "Not finished yet: {count}": "Zatím nedokončeno: {count}", + "What happens to these tasks?": "Co se stane s těmito úkoly?", + "Move to {name}": "Přesunout do {name}", + "Remove the release": "Odebrat vydání", + "Keep it on {name}": "Ponechat v {name}", + "Could not mark the release as released. Please try again.": "Vydání se nepodařilo označit jako vydané. Zkuste to znovu.", + "Roadmap": "Plán", + "Tasks or roadmap": "Úkoly nebo plán", + "Release": "Vydání", + "Epic": "Epos", + "This task is an epic": "Tento úkol je epos", + "A named, dated delivery of a project that its tasks are planned against.": "Pojmenovaná dodávka projektu s datem, na kterou se plánují jeho úkoly.", + "Name of the release": "Název vydání", + "The project this release belongs to": "Projekt, ke kterému toto vydání patří", + "What this release delivers": "Co toto vydání dodává", + "When work on the release starts": "Kdy začíná práce na vydání", + "The date the release is due": "Datum, kdy má být vydání hotové", + "Whether the release is planned, released or archived": "Zda je vydání plánované, vydané nebo archivované", + "Released on": "Vydáno dne", + "When the release was marked as released": "Kdy bylo vydání označeno jako vydané", + "The release this task is planned for": "Vydání, pro které je tento úkol naplánován", + "Board view options": "Možnosti zobrazení nástěnky", + "Colour cards": "Obarvit karty", + "No colour": "Bez barvy", + "By label": "Podle štítku", + "Swimlanes": "Plavecké dráhy", + "No swimlanes": "Bez plaveckých drah", + "By assignee": "Podle řešitele", + "By epic": "Podle eposu", + "No assignee": "Nepřiřazeno", + "No epic": "Bez eposu", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Karty zůstávají v řádku svého eposu. Epos změňte na stránce úkolu.", + "Hand over to": "Předat", + "Could not save your board view. It applies until you reload.": "Zobrazení nástěnky se nepodařilo uložit. Platí do opětovného načtení.", + "Timetable wish": "Přání k rozvrhu", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Přání, které generátor zohledňuje. Pevné přání dodrží vždy, měkké tam, kde může.", + "Whether the wish is about a teacher, a group, a room or one activity": "Zda se přání týká učitele, skupiny, místnosti nebo jedné činnosti", + "Teacher": "Učitel", + "Group": "Skupina", + "Reference": "Odkaz", + "The user, group, room or activity the wish is about": "Uživatel, skupina, místnost nebo činnost, které se přání týká", + "What the wish asks for": "Co přání žádá", + "Not on these periods": "Ne v těchto hodinách", + "Preferably not on these periods": "Raději ne v těchto hodinách", + "At most a number of lessons a day": "Nejvýše určitý počet hodin denně", + "No free periods between lessons": "Žádné volné hodiny mezi hodinami", + "Always the same room": "Vždy stejná místnost", + "Periods": "Hodiny", + "The periods of the week the wish is about, such as wed-5": "Hodiny týdne, kterých se přání týká, např. wed-5", + "Limit": "Limit", + "The most lessons a day, for a wish of that kind": "Nejvíce hodin denně, pro přání tohoto druhu", + "Strength": "Síla", + "Whether the generator must keep the wish or should keep it": "Zda generátor musí, nebo by měl přání dodržet", + "Hard": "Pevné", + "Soft": "Měkké", + "Weight": "Váha", + "How much a soft wish counts, from 1 to 3": "Jak moc měkké přání váží, od 1 do 3", + "Why the wish exists": "Proč přání existuje", + "Timetable scenario": "Scénář rozvrhu", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jeden týdenní vzor, vytvořený generátorem nebo převzatý ze současného rozvrhu. Uchovává svůj vstup a jak dobře dodržuje přání.", + "The name timetablers know the scenario by": "Název, pod kterým tvůrci rozvrhu scénář znají", + "Whether the generator made it or it came from the current timetable": "Zda ho vytvořil generátor, nebo pochází ze současného rozvrhu", + "Generated": "Vygenerováno", + "From the current timetable": "Ze současného rozvrhu", + "Week of": "Týden od", + "The Monday of the first week of the window": "Pondělí prvního týdne období", + "Window start": "Začátek období", + "The first day the week pattern applies to": "První den, pro který týdenní vzor platí", + "Window end": "Konec období", + "The last day the week pattern applies to": "Poslední den, pro který týdenní vzor platí", + "Waiting, generating, done, failed, or published as draft lessons": "Čeká, generuje se, hotovo, selhalo nebo zveřejněno jako koncepty hodin", + "Waiting": "Čeká", + "Generating": "Generuje se", + "Failed": "Selhalo", + "Published": "Zveřejněno", + "Seed": "Semínko", + "The number the generator starts from, so a run can be repeated": "Číslo, od kterého generátor začíná, aby šel běh zopakovat", + "Input": "Vstup", + "The periods, rooms, lessons and wishes the scenario was made from": "Hodiny, místnosti, vyučovací hodiny a přání, ze kterých scénář vznikl", + "Placements": "Umístění", + "Each lesson with the period and room it was given": "Každá vyučovací hodina s hodinou a místností, které dostala", + "Unplaced lessons": "Neumístěné hodiny", + "Lessons without a place, each with the hard wish that blocked it": "Hodiny bez místa, každá s pevným přáním, které ji zablokovalo", + "Broken wishes": "Porušená přání", + "The wishes this scenario breaks, with the lessons that break them": "Přání, která tento scénář porušuje, s hodinami, které je porušují", + "Measures": "Ukazatele", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Umístěné hodiny, porušená přání, volné hodiny učitelů, hodiny denně a využití místností", + "Reason": "Důvod", + "Why the run failed": "Proč běh selhal", + "Published at": "Zveřejněno", + "When the scenario was written out as draft lessons": "Kdy byl scénář zapsán jako koncepty hodin", + "Edit wish": "Upravit přání", + "New wish": "Nové přání", + "Hard: the generator always keeps it": "Pevné: generátor je vždy dodrží", + "Soft: the generator keeps it where it can": "Měkké: generátor je dodrží, kde to jde", + "Weight (1 to 3)": "Váha (1 až 3)", + "Most lessons a day": "Nejvýše hodin denně", + "Period": "Hodina", + "{day} period {number}": "{day} hodina {number}", + "Teacher (user name)": "Učitel (uživatelské jméno)", + "Activity (group:subject)": "Aktivita (skupina:předmět)", + "Say who or what the wish is about.": "Uveďte, koho nebo čeho se přání týká.", + "Choose at least one period.": "Vyberte alespoň jednu hodinu.", + "The limit is a whole number of 1 or more.": "Limit je celé číslo 1 nebo vyšší.", + "Timetable": "Rozvrh", + "Wishes": "Přání", + "Timetable wishes": "Přání k rozvrhu", + "Generator run": "Běh generátoru", + "Generator progress": "Průběh generátoru", + "The run failed: {reason}": "Běh selhal: {reason}", + "{placed} of {lessons} lessons placed": "Umístěno {placed} z {lessons} hodin", + "Generate again": "Generovat znovu", + "Generate": "Generovat", + "Every lesson has a place.": "Každá hodina má místo.", + "Lesson": "Hodina", + "No free period and room": "Žádná volná hodina a učebna", + "Broken soft wishes": "Porušená měkká přání", + "Every soft wish is kept.": "Každé měkké přání je dodrženo.", + "Wish": "Přání", + "Lessons": "Hodiny", + "Generating: {percent}% of the time budget used": "Generování: využito {percent} % času", + "Waiting to start": "Čeká na spuštění", + "Published as draft lessons": "Zveřejněno jako koncepty hodin", + "Could not read the scenario.": "Scénář se nepodařilo načíst.", + "Could not start the run.": "Běh se nepodařilo spustit.", + "Scenarios": "Scénáře", + "Timetable scenarios": "Scénáře rozvrhu", + "Scenario": "Scénář", + "Take the current timetable": "Převzít aktuální rozvrh", + "Could not take the current timetable.": "Aktuální rozvrh se nepodařilo převzít.", + "Broken hard wishes": "Porušená závazná přání", + "Not on a period of the week grid": "Není na hodině týdenní mřížky", + "Compare scenarios": "Porovnat scénáře", + "Scenarios to compare": "Scénáře k porovnání", + "Choose two or three scenarios to compare them.": "Vyberte dva nebo tři scénáře k porovnání.", + "Measure": "Ukazatel", + "Best": "Nejlepší", + "Lessons that differ": "Hodiny, které se liší", + "No lesson differs.": "Žádná hodina se neliší.", + "Not placed": "Neumístěno", + "{period} in {room}": "{period} v {room}", + "Lessons placed": "Umístěné hodiny", + "Lessons without a place": "Hodiny bez místa", + "Clashes": "Kolize", + "Hard wishes broken": "Porušená pevná přání", + "Soft wishes broken": "Porušená měkká přání", + "Soft wishes broken, weighted": "Porušená měkká přání, vážená", + "Free periods between lessons, all teachers": "Volné hodiny, všichni učitelé", + "Most free periods of one teacher": "Nejvíc volných hodin jednoho učitele", + "Most lessons of one group on a day": "Nejvíc hodin jedné skupiny za den", + "Room use": "Využití učeben", + "Publish as draft lessons": "Zveřejnit jako koncepty hodin", + "Draft lessons written: {count}": "Zapsané koncepty hodin: {count}", + "Could not publish the scenario.": "Scénář se nepodařilo zveřejnit.", + "Rules": "Pravidla", + "Rules for {column}": "Pravidla pro {column}", + "When a card enters this column": "Když karta vstoupí do tohoto sloupce", + "Action": "Akce", + "Set the priority": "Nastavit prioritu", + "Assign to": "Přiřadit", + "Assign the person who moved the card": "Přiřadit osobě, která kartu přesunula", + "Remove the assignee": "Odebrat řešitele", + "Add a label": "Přidat štítek", + "No longer a project member": "Již není členem projektu", + "This label no longer exists": "Tento štítek již neexistuje", + "Add rule": "Přidat pravidlo", + "Remove rule": "Odebrat pravidlo", + "No rules yet. Add one to change a card when it enters this column.": "Zatím žádná pravidla. Přidejte pravidlo, které změní kartu, když vstoupí do tohoto sloupce.", + "Could not save the rules. Please try again.": "Pravidla se nepodařilo uložit. Zkuste to znovu.", + "1 rule runs when a card enters this column": "1 pravidlo se spustí, když karta vstoupí do tohoto sloupce", + "{count} rules run when a card enters this column": "Počet pravidel, která se spustí, když karta vstoupí do tohoto sloupce: {count}", + "Rules applied: {changes}": "Použitá pravidla: {changes}", + "assigned to {name}": "přiřazeno: {name}", + "assignee removed": "řešitel odebrán", + "priority {priority}": "priorita {priority}", + "label {label}": "štítek {label}", + "What happens to a card when it enters this column, applied in list order.": "Co se stane s kartou, když vstoupí do tohoto sloupce, v pořadí seznamu.", + "Value": "Hodnota", + "What the rule does to the card.": "Co pravidlo udělá s kartou.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Priorita, ID uživatele nebo ID štítku, které akce používá; prázdné u akcí bez hodnoty.", + "is not": "není", + "{dimension} is not": "{dimension} není", + "Saved filters": "Uložené filtry", + "No saved filters yet": "Zatím žádné uložené filtry", + "Save filter": "Uložit filtr", + "Rename \"{name}\"": "Přejmenovat „{name}“", + "Delete \"{name}\"": "Smazat „{name}“", + "Clear filters": "Zrušit filtry", + "Showing {shown} of {total} tasks": "Zobrazeno {shown} z {total} úkolů", + "Me": "Já", + "No date": "Bez data", + "Rename saved filter": "Přejmenovat uložený filtr", + "Share with the project": "Sdílet s projektem", + "Give the filter a name": "Pojmenujte filtr", + "Could not save the filter. Please try again.": "Filtr se nepodařilo uložit. Zkuste to znovu.", + "Some labels in \"{name}\" no longer exist and were left out.": "Některé štítky ve „{name}“ již neexistují a byly vynechány.", + "Could not delete the filter. Please try again.": "Filtr se nepodařilo smazat. Zkuste to znovu.", + "Saved filter": "Uložený filtr", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Pojmenovaný filtr nástěnky jednoho projektu, soukromý pro toho, kdo jej uložil, pokud není sdílen s projektem.", + "The project whose board the filter applies to": "Projekt, na jehož nástěnku se filtr vztahuje", + "The name the filter is listed under": "Název, pod kterým je filtr uveden", + "Saved by": "Uložil(a)", + "Nextcloud user id of the person who saved the filter": "ID uživatele Nextcloud, který filtr uložil", + "Shared with the project": "Sdíleno s projektem", + "Whether every project member sees and applies the filter": "Zda každý člen projektu filtr vidí a může jej použít", + "Criteria": "Kritéria", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtr: řešitel, štítek, priorita a termín, každý s je nebo není a hodnotami", + "Cross-project view": "Meziprojektový pohled", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Uložený výběr projektů, jejichž úkoly se zobrazují společně ve sloupcích podle stavu, sdílený s uvedenými lidmi.", + "Shared with": "Sdíleno s", + "The name the view is listed under": "Název, pod kterým je pohled uveden", + "Nextcloud user id of the person who saved the view": "ID uživatele Nextcloud osoby, která pohled uložila", + "Nextcloud user ids of the people the view is shared with": "ID uživatelů Nextcloud osob, se kterými je pohled sdílen", + "The projects whose tasks the view shows, at most twenty": "Projekty, jejichž úkoly pohled zobrazuje, nejvýše dvacet", + "1 project in this view is hidden from you.": "1 projekt v tomto pohledu je před vámi skrytý.", + "{count} projects in this view are hidden from you.": "Projekty v tomto pohledu skryté před vámi: {count}.", + "{project} has no column for {status}.": "Projekt {project} nemá sloupec pro stav {status}.", + "This view does not exist or is not shared with you.": "Tento pohled neexistuje nebo s vámi není sdílen.", + "\"{task}\" moved to {status}.": "\"{task}\" přesunuto do {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Meziprojektové pohledy", + "New view": "Nový pohled", + "Edit view": "Upravit pohled", + "Delete view": "Smazat pohled", + "Give the view a name": "Pojmenujte pohled", + "Pick at least one project": "Vyberte alespoň jeden projekt", + "A view shows at most {max} projects": "Pohled zobrazuje nejvýše {max} projektů", + "Could not save the view. Please try again.": "Pohled se nepodařilo uložit. Zkuste to znovu.", + "Could not delete the view. Please try again.": "Pohled se nepodařilo smazat. Zkuste to znovu.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Smazat „{title}“? Projekty a jejich úkoly zůstanou beze změny.", + "People see the tasks of the projects they are in, never more.": "Každý vidí jen úkoly projektů, ve kterých je.", + "No views yet. A view shows the tasks of several of your projects together.": "Zatím žádné pohledy. Pohled zobrazuje úkoly několika vašich projektů společně.", + "Projects in view: {count}": "Projekty v pohledu: {count}", + "Notify me when a task is assigned to me": "Upozornit mě, když mi bude přidělen úkol", + "Also send these to me by email": "Posílat mi je také e-mailem", + "Add an email address in your Nextcloud personal settings to get mail.": "Pro příjem e-mailů přidejte e-mailovou adresu v osobním nastavení Nextcloud.", + "Code link": "Odkaz na kód", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, větev, žádost o sloučení nebo úkol v platformě pro kód, který se týká úkolu.", + "The task the link belongs to": "Úkol, ke kterému odkaz patří", + "The project of the task": "Projekt úkolu", + "Task key": "Klíč úkolu", + "The task key the forge text named, such as VC-12": "Klíč úkolu uvedený v textu platformy, například VC-12", + "What the link points at": "Kam odkaz vede", + "Link": "Odkaz", + "The address of the item in the forge": "Adresa položky v platformě pro kód", + "The commit message, branch name or merge request title": "Zpráva commitu, název větve nebo název žádosti o sloučení", + "Repository": "Repozitář", + "The repository, such as acme/portal": "Repozitář, například acme/portal", + "Forge id": "Id v platformě", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Vlastní id položky v platformě pro kód, například github:acme/portal#42 nebo hash commitu", + "State": "Stav", + "The state of a merge request or issue": "Stav žádosti o sloučení nebo úkolu", + "Who made the commit or opened the merge request": "Kdo vytvořil commit nebo otevřel žádost o sloučení", + "When the commit was made or the merge request last changed": "Kdy byl commit vytvořen nebo se žádost o sloučení naposledy změnila", + "Added by": "Přidal", + "Whether a person added the link or the integration wrote it": "Zda odkaz přidala osoba, nebo ho zapsala integrace", + "Nextcloud user UIDs of project members": "ID uživatelů Nextcloud členů projektu", + "Add link": "Přidat odkaz", + "Added by hand": "Přidáno ručně", + "Branch": "Větev", + "Code": "Kód", + "Commit": "Commit", + "From the integration": "Z integrace", + "Link to a commit, branch or merge request": "Odkaz na commit, větev nebo žádost o sloučení", + "Merge request": "Žádost o sloučení", + "Merged": "Sloučeno", + "No code linked yet. Name {key} in a commit message or paste a link.": "Zatím není propojen žádný kód. Uveďte {key} ve zprávě commitu nebo vložte odkaz.", + "No code linked yet. Paste a link to a commit or merge request.": "Zatím není propojen žádný kód. Vložte odkaz na commit nebo žádost o sloučení.", + "Paste a web address that starts with https://.": "Vložte webovou adresu začínající https://.", + "Remove link {title}": "Odebrat odkaz {title}", + "The link could not be added.": "Odkaz se nepodařilo přidat.", + "The link could not be removed.": "Odkaz se nepodařilo odebrat.", + "This link is already on the task.": "Tento odkaz už u úkolu je.", + "Code forges": "Platformy pro kód", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Propojte commity a pull requesty z GitHubu s úkoly. Integriq přijímá události; planninq GitHub nikdy nevolá.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Stáhněte konfiguraci a importujte ji do Integriq. Potom vyplňte tajemství v pravidle \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "V GitHubu přidejte do repozitáře webhook s touto adresou a stejným tajemstvím. Zvolte typ obsahu application/json a události push a pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Uveďte klíč úkolu, například VC-12, ve zprávě commitu, názvu větve nebo názvu pull requestu. Odkaz se pak zobrazí u tohoto úkolu.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriq mohou členové projektu stále vložit odkaz na stránce úkolu.", + "Download the Integriq configuration": "Stáhnout konfiguraci Integriq", + "Calendar": "Kalendář", + "Previous": "Předchozí", + "Calendar view": "Zobrazení kalendáře", + "Starts:": "Začíná:", + "No tasks with a date in this month.": "V tomto měsíci nejsou žádné úkoly s datem.", + "Week of {start} to {end}": "Týden od {start} do {end}", + "My calendar": "Můj kalendář", + "Show as list": "Zobrazit jako seznam", + "Show as calendar": "Zobrazit jako kalendář", + "Open my calendar": "Otevřít můj kalendář", + "Nextcloud Tasks": "Úkoly Nextcloud", + "Show my tasks in Nextcloud Tasks": "Zobrazit mé úkoly v Úkolech Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Úkoly přidělené vám nebo s vámi sdílené se zobrazí v seznamu \"Planninq\" v Úkolech a Kalendáři Nextcloud. Změny provedené tam se nahradí při další změně v Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Tento server nemůže zapisovat do Úkolů Nextcloud, proto export není k dispozici.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Spravováno aplikací Planninq. Změny provedené zde se nahradí při další změně v Planninq.", + "Working days and holidays": "Pracovní dny a svátky", + "Dates set on the timeline skip the days that are not working days.": "Data nastavená na časové ose přeskakují dny, které nejsou pracovní.", + "Working weekdays": "Pracovní dny v týdnu", + "Non-working days": "Nepracovní dny", + "No non-working days yet.": "Zatím žádné nepracovní dny.", + "Add day": "Přidat den", + "Year": "Rok", + "Add Dutch national holidays": "Přidat nizozemské státní svátky", + "Save working days": "Uložit pracovní dny", + "Choose at least one working weekday.": "Vyberte alespoň jeden pracovní den.", + "Working days saved.": "Pracovní dny uloženy.", + "Could not save the working days.": "Pracovní dny se nepodařilo uložit.", + "New Year's Day": "Nový rok", + "Easter Sunday": "Velikonoční neděle", + "Easter Monday": "Velikonoční pondělí", + "King's Day": "Den krále", + "Liberation Day": "Den osvobození", + "Ascension Day": "Nanebevstoupení Páně", + "Whit Sunday": "Letnice", + "Whit Monday": "Svatodušní pondělí", + "Christmas Day": "1. svátek vánoční", + "Boxing Day": "2. svátek vánoční", + "Dates of {title}": "Data úkolu {title}", + "The due date cannot be before the start date.": "Termín nemůže být před datem zahájení.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Data se nepodařilo uložit.", + "{title} now runs from {start} to {end}": "{title} nyní probíhá od {start} do {end}", + "Auto-scheduling": "Automatické plánování", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Je-li zapnuto, posunutí termínu na časové ose nabídne posunout i úkoly, které blokuje.", + "Move blocked tasks along when a task slips": "Posouvat blokované úkoly, když se úkol zpozdí", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na časové ose pozdější termín nabídne posunout blokované úkoly. Počítají se jen vazby \"blokuje\" a úkoly se posouvají jen později.", + "Move the tasks that wait for {title}?": "Posunout úkoly, které čekají na {title}?", + "These tasks wait for it and would start after its new due date:": "Tyto úkoly na něj čekají a začaly by po novém termínu:", + "{count} tasks would move; the first {limit} are listed.": "Posunulo by se {count} úkolů; zobrazeno je prvních {limit}.", + "Now": "Nyní", + "After the move": "Po posunutí", + "Only this task": "Jen tento úkol", + "Move all": "Posunout vše", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Zastaveno u {title}: data se nepodařilo uložit. Úkoly před ním byly posunuty.", + "Cumulative flow": "Kumulativní tok", + "Show as chart": "Zobrazit jako graf", + "Show as table": "Zobrazit jako tabulku", + "Tasks per column per day": "Úkoly ve sloupci za den", + "Tasks without recorded history in this period: {count}": "Úkoly bez zaznamenané historie v tomto období: {count}", + "Lead and cycle time": "Doba dodání a doba cyklu", + "No tasks were finished in this period.": "V tomto období nebyl dokončen žádný úkol.", + "Finished tasks": "Dokončené úkoly", + "Cycle time, average": "Doba cyklu, průměr", + "Cycle time, 85th percentile": "Doba cyklu, 85. percentil", + "Lead time, average": "Doba dodání, průměr", + "Tasks whose finish time was estimated from their history: {count}": "Úkoly, jejichž čas dokončení byl odhadnut z historie: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Doba cyklu každého dokončeného úkolu s průměrem a 85. percentilem", + "Slowest tasks": "Nejpomalejší úkoly", + "cycle {cycle}, lead {lead}": "cyklus {cycle}, dodání {lead}", + "{days} days": "{days} dní", + "Could not load the flow of this project.": "Tok tohoto projektu se nepodařilo načíst.", + "Last {days} days": "Posledních {days} dní", + "Portfolio flow": "Tok portfolia", + "An admin adds portfolios under Projects, Portfolios.": "Správce přidává portfolia v Projekty, Portfolia.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Nezobrazené projekty, protože se najednou zobrazuje nejvýše 50: {count}", + "Could not load the flow of this portfolio.": "Tok tohoto portfolia se nepodařilo načíst.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativní tok a doba cyklu napříč projekty portfolia.", + "Edit report": "Upravit přehled", + "Only tasks where": "Jen úkoly, kde", + "Group by": "Seskupit podle", + "Display": "Zobrazení", + "Share with everyone who can read its projects": "Sdílet se všemi, kdo mohou číst jeho projekty", + "The report could not be saved.": "Přehled se nepodařilo uložit.", + "Number of tasks": "Počet úkolů", + "Bar": "Sloupce", + "Donut": "Prstenec", + "Table": "Tabulka", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} z {total} projektů v tomto přehledu pro vás není viditelných", + "No tasks match this report.": "Tomuto přehledu neodpovídá žádný úkol.", + "None": "Žádné", + "Could not load this report.": "Tento přehled se nepodařilo načíst.", + "Report": "Přehled", + "Your reports": "Vaše přehledy", + "My reports": "Moje přehledy", + "Shared reports": "Sdílené přehledy", + "You have not built a report yet.": "Zatím jste nevytvořili žádný přehled.", + "Nobody has shared a report with you yet.": "Zatím s vámi nikdo nesdílel přehled.", + "Reports you built over tasks, and the ones shared with you.": "Přehledy, které jste vytvořili nad úkoly, a ty, které s vámi sdíleli.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Uložený dotaz nad úkoly: které projekty, které filtry, seskupení podle čeho, počet nebo součet, zobrazený jako tabulka nebo graf.", + "The name the report is listed under": "Název, pod kterým je přehled uveden", + "What the report shows and who it is for": "Co přehled ukazuje a pro koho je", + "Nextcloud user id of the person who saved the report": "ID uživatele Nextcloud, který přehled uložil", + "Who can open the report": "Kdo může přehled otevřít", + "Only me": "Jen já", + "Everyone who can read its projects": "Všichni, kdo mohou číst jeho projekty", + "The projects the report covers, at most fifty": "Projekty, které přehled zahrnuje, nejvýše padesát", + "Filters": "Filtry", + "Task fields and the value each must equal": "Pole úkolu a hodnota, které se každé musí rovnat", + "The task field the report groups on": "Pole úkolu, podle kterého přehled seskupuje", + "Count the tasks, or add up a number on them": "Spočítat úkoly, nebo sečíst číslo na nich", + "Sum": "Součet", + "Sum of": "Součet pole", + "The number added up when the measure is a sum": "Číslo, které se sčítá, když je míra součet", + "Story points": "Body příběhu", + "Estimated duration": "Odhadovaná doba", + "How the report is shown": "Jak se přehled zobrazuje", + "Issue type": "Typ požadavku", + "Task fields and the value each must equal; empty when the report covers every task": "Pole úkolu a hodnota, kterou musí každé mít; prázdné, když přehled zahrnuje všechny úkoly", + "The status a task must have": "Stav, který musí úkol mít", + "The priority a task must have": "Priorita, kterou musí úkol mít", + "The user a task must be assigned to": "Uživatel, kterému musí být úkol přidělen", + "A label a task must carry": "Štítek, který musí úkol mít", + "The board column a task must be in": "Sloupec tabule, ve kterém musí úkol být", + "The issue type a task must have": "Typ požadavku, který musí úkol mít", + "Manager groups": "Skupiny správců", + "Member groups": "Skupiny členů", + "Viewer groups": "Skupiny čtenářů", + "Viewers": "Čtenáři", + "Owning group": "Vlastnická skupina", + "Nextcloud groups whose members manage the project": "Skupiny Nextcloud, jejichž členové spravují projekt", + "Nextcloud groups whose members work on the project": "Skupiny Nextcloud, jejichž členové na projektu pracují", + "Nextcloud groups whose members may read the project": "Skupiny Nextcloud, jejichž členové mohou projekt číst", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Uživatelé Nextcloud, kteří spravují projekt: nastavení, členy a práci", + "Nextcloud user ids who may read the project and its work but not change it": "Uživatelé Nextcloud, kteří mohou číst projekt a jeho práci, ale ne měnit", + "The Nextcloud group that owns the project with its creator, at most one": "Skupina Nextcloud, která vlastní projekt spolu s jeho tvůrcem, nejvýše jedna", + "Nextcloud user ids who may read this through the project": "Uživatelé Nextcloud, kteří to mohou číst přes projekt", + "Nextcloud groups whose members may change this through the project": "Skupiny Nextcloud, jejichž členové to mohou měnit přes projekt", + "Nextcloud groups whose members may read this through the project": "Skupiny Nextcloud, jejichž členové to mohou číst přes projekt", + "Search for a person or a group…": "Hledat osobu nebo skupinu…", + "No one found. Your admin's sharing settings decide who you can find.": "Nikdo nenalezen. Nastavení sdílení vašeho správce určuje, koho můžete najít.", + "Type at least two characters": "Zadejte alespoň dva znaky", + "Everyone in this group": "Všichni v této skupině", + "Could not search for people. Please try again.": "Hledání osob se nezdařilo. Zkuste to znovu.", + "Could not remove the group": "Skupinu se nepodařilo odebrat", + "Only the owner and managers change who is on this project.": "Kdo je v tomto projektu, mění jen vlastník a správci.", + "Role of {name}": "Role: {name}", + "Manager": "Správce", + "Member": "Člen", + "Viewer": "Čtenář", + "Could not change the role": "Roli se nepodařilo změnit", + "Owned by group: {name}": "Ve vlastnictví skupiny: {name}", + "No group owns this project.": "Tento projekt nevlastní žádná skupina.", + "Owned by group": "Ve vlastnictví skupiny", + "Search for a group…": "Hledat skupinu…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Žádná skupina nenalezena. Nastavení sdílení vašeho správce určuje, které skupiny můžete najít.", + "No owning group": "Žádná vlastnická skupina", + "Could not search for groups. Please try again.": "Skupiny se nepodařilo vyhledat. Zkuste to znovu.", + "Could not change the owning group": "Vlastnickou skupinu se nepodařilo změnit", + "You can read this project. Only its members change it.": "Tento projekt můžete číst. Měnit ho mohou jen jeho členové.", + "Course": "Kurz", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurz, který se v této hodině vyučuje, například volitelný předmět, pokud ho školní výuková aplikace zná.", + "Online meeting link": "Odkaz na online hodinu", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kde se žáci k této hodině připojí online. Tlačítko Připojit se zobrazí jen u odkazu https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/cs.json b/l10n/cs.json index c8e667ef..fd178501 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktivní projekty", + "Archived projects": "Archivované projekty", + "Boards": "Nástěnky", + "My projects": "Moje projekty", + "Portfolio": "Portfolio", + "Project board": "Nástěnka projektu", + "Projects I am in": "Projekty, kterých se účastním", + "Timeline": "Časová osa", + "Timesheet": "Výkaz práce", + "Features & roadmap": "Funkce a plán vývoje", + "Flow": "Tok", + "Flows": "Toky", + "Reports": "Sestavy", + "Pick a report to open it.": "Vyberte sestavu, kterou chcete otevřít.", + "In progress": "Probíhá", + "Date": "Datum", + "Due": "Termín", + "Assignee": "Přiřazeno", + "Who": "Kdo", + "What": "Co", + "Minutes": "Minuty", + "Entries": "Záznamy", + "Most recent": "Nejnovější", + "Per person": "Na osobu", + "By status": "Podle stavu", + "By priority": "Podle priority", + "Task status": "Stav úkolů", + "Time spent": "Strávený čas", + "Capacity": "Kapacita", + "Due soonest": "Nejdříve splatné", + "Minutes logged": "Zaznamenané minuty", + "Nothing is due": "Nic není splatné", + "Nothing logged yet": "Zatím nic nezaznamenáno", + "What is open, what is blocked, and what is overdue.": "Co je otevřené, co blokované a co po termínu.", + "How allocation is spread across the people working on projects.": "Jak je vytížení rozloženo mezi lidi pracující na projektech.", + "Hours logged, and the projects they went to.": "Zaznamenané hodiny a projekty, do kterých šly.", + "Billable": "Fakturovatelné", + "Budget: {amount}": "Rozpočet: {amount}", + "Loading projects": "Načítání projektů", + "No projects for this client yet": "Pro tohoto klienta zatím nejsou žádné projekty", + "Open in Planninq": "Otevřít v Planninq", + "This project could not be found": "Tento projekt nebyl nalezen", + "Untitled project": "Projekt bez názvu", + "and {count} more": "a další {count}", + "Store": "Obchod", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Nainstalujte registry, schémata a toky zveřejněné jinými organizacemi.", + "Work Date": "Datum práce", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Akce sloupce", + "Columns": "Sloupce", + "Could not remove the column. Please try again.": "Sloupec se nepodařilo odebrat. Zkuste to znovu.", + "Could not save the column. Please try again.": "Sloupec se nepodařilo uložit. Zkuste to znovu.", + "Done column": "Sloupec hotovo", + "Edit column": "Upravit sloupec", + "Keep the card's status": "Zachovat stav karty", + "Move its cards to": "Přesunout jeho karty do", + "Move left": "Posunout doleva", + "Move right": "Posunout doprava", + "Status of cards moved here": "Stav karet přesunutých sem", + "The last done column cannot be removed.": "Poslední sloupec hotovo nelze odebrat.", + "WIP limit": "Limit WIP", + "over limit": "nad limitem", + "The status a card gets when it is moved into this column.": "Stav, který karta získá po přesunutí do tohoto sloupce.", + "All priorities": "Všechny priority", + "Could not create the task. Please try again.": "Úkol se nepodařilo vytvořit. Zkuste to znovu.", + "Created": "Vytvořeno", + "Move to backlog": "Do backlogu", + "Move to board": "Na nástěnku", + "New task": "Nový úkol", + "Nothing in the backlog": "Backlog je prázdný", + "Rank": "Pořadí", + "Sort by": "Seřadit podle", + "Sort by rank to reorder": "Pro změnu pořadí seřaďte podle pořadí", + "Task actions": "Akce úkolu", + "All labels": "Všechny štítky", + "Filter tasks by label": "Filtrovat úkoly podle štítku", + "View timeline": "Zobrazit časovou osu", + "Board": "Nástěnka", + "List": "Seznam", + "Column": "Sloupec", + "Board or list": "Nástěnka nebo seznam", + "Log": "Deník", + "Add entry": "Přidat záznam", + "Show": "Zobrazit", + "No actions yet": "Zatím žádné akce", + "Closed": "Uzavřeno", + "Entry actions": "Akce záznamu", + "Add action": "Přidat akci", + "by {author}": "autor {author}", + "saved {time}": "uloženo {time}", + "Attendees: {names}": "Účastníci: {names}", + "Add the first entry": "Přidat první záznam", + "Issues": "Problémy", + "Lessons learned": "Poučení", + "Meetings": "Schůzky", + "Decisions": "Rozhodnutí", + "Actions": "Akce", + "Issue": "Problém", + "Lesson learned": "Poučení", + "Meeting": "Schůzka", + "Decision": "Rozhodnutí", + "About this project": "O tomto projektu", + "No description yet": "Zatím bez popisu", + "Start date": "Datum zahájení", + "Not set": "Nenastaveno", + "End date": "Datum ukončení", + "Progress": "Postup", + "No tasks yet": "Zatím žádné úkoly", + "Open the board": "Otevřít nástěnku", + "People": "Lidé", + "Owner": "Vlastník", + "Latest log entries": "Nejnovější záznamy", + "Open the log": "Otevřít deník", + "{done} of {total} tasks done": "Hotovo {done} z {total} úkolů", + "Edit entry": "Upravit záznam", + "Type": "Druh", + "Attendees": "Účastníci", + "Issue is closed": "Problém je uzavřen", + "Could not save the entry. Please try again.": "Záznam se nepodařilo uložit. Zkuste to znovu.", + "From: {title}": "Z: {title}", + "What needs to happen": "Co je třeba udělat", + "Could not create the action. Please try again.": "Akci se nepodařilo vytvořit. Zkuste to znovu.", + "The action was created but could not be linked to the entry.": "Akce byla vytvořena, ale nepodařilo se ji propojit se záznamem.", + "Project pages": "Stránky projektu", + "Overview": "Přehled", + "Risks": "Rizika", + "Log entry": "Záznam deníku", + "A short name for the entry": "Krátký název záznamu", + "Project": "Projekt", + "The project this entry belongs to": "Projekt, ke kterému záznam patří", + "What kind of entry this is": "Jaký je to druh záznamu", + "When it happened": "Kdy se to stalo", + "What happened, in Markdown": "Co se stalo, v Markdownu", + "Whether an issue is still open": "Zda je problém stále otevřený", + "The people at a meeting": "Lidé na schůzce", + "Tasks that came out of this entry": "Úkoly, které vzešly z tohoto záznamu", + "Add risk": "Přidat riziko", + "Risk": "Riziko", + "Score": "Skóre", + "Response": "Reakce", + "Review date": "Datum revize", + "no longer on the project": "už není v projektu", + "Edit {title}": "Upravit {title}", + "No risks recorded yet": "Zatím žádná zaznamenaná rizika", + "Add the first risk": "Přidat první riziko", + "Medium": "Střední", + "Mitigating": "Zmírňuje se", + "Occurred": "Nastalo", + "Avoid": "Vyhnout se", + "Reduce": "Snížit", + "Transfer": "Přenést", + "Accept": "Přijmout", + "Highest open risks": "Nejvyšší otevřená rizika", + "No open risks": "Žádná otevřená rizika", + "Open the risk register": "Otevřít registr rizik", + "Edit risk": "Upravit riziko", + "What could go wrong": "Co se může pokazit", + "Likelihood": "Pravděpodobnost", + "Impact": "Dopad", + "Score {score}": "Skóre {score}", + "Countermeasures": "Protiopatření", + "Could not save the risk. Please try again.": "Riziko se nepodařilo uložit. Zkuste to znovu.", + "Risks by likelihood and impact": "Rizika podle pravděpodobnosti a dopadu", + "Risk scale": "Škála rizik", + "The levels every project scores its risks on, and where low turns into medium and high": "Úrovně, na kterých každý projekt hodnotí svá rizika, a kde nízké přechází ve střední a vysoké", + "Number of levels": "Počet úrovní", + "Likelihood labels": "Popisky pravděpodobnosti", + "Impact labels": "Popisky dopadu", + "Level {level}": "Úroveň {level}", + "Medium from score": "Střední od skóre", + "High from score": "Vysoké od skóre", + "Risk scale saved": "Škála rizik uložena", + "1 risk uses level {level}. Change it first.": "1 riziko používá úroveň {level}. Nejprve ho změňte.", + "{count} risks use level {level}. Change them first.": "{count} rizik používá úroveň {level}. Nejprve je změňte.", + "Every level needs a label, and high must start above medium.": "Každá úroveň potřebuje popisek a vysoké musí začínat nad středním.", + "The project this risk belongs to": "Projekt, ke kterému riziko patří", + "The cause and the effect, in Markdown": "Příčina a následek, v Markdownu", + "Category": "Kategorie", + "A free grouping, such as planning, budget or supplier": "Volné seskupení, např. plánování, rozpočet nebo dodavatel", + "How likely it is, on the admin's risk scale": "Jak je pravděpodobné, na škále rizik správce", + "How hard it would hit, on the admin's risk scale": "Jak tvrdě by zasáhlo, na škále rizik správce", + "Likelihood times impact, calculated by the server": "Pravděpodobnost krát dopad, spočítané serverem", + "Where the risk stands": "Jak na tom riziko je", + "The person who watches this risk": "Osoba, která riziko sleduje", + "How the project answers the risk": "Jak projekt na riziko odpovídá", + "What is done to prevent it or soften it, in Markdown": "Co se dělá pro jeho prevenci nebo zmírnění, v Markdownu", + "When to look at this risk again": "Kdy riziko znovu posoudit", + "Very low": "Velmi nízké", + "Very high": "Velmi vysoké", + "All projects": "Všechny projekty", + "Project status report": "Zpráva o stavu projektu", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datovaná zpráva o tom, jak si projekt stojí v penězích, organizaci, čase, informacích, kvalitě a riziku (aspekty GROTIK), každý s poznámkou.", + "The project this report is about": "Projekt, kterého se zpráva týká", + "Report date": "Datum zprávy", + "The day the report describes": "Den, který zpráva popisuje", + "Money": "Peníze", + "How the project stands on this aspect": "Jak si projekt stojí v tomto aspektu", + "On track": "Podle plánu", + "At risk": "Ohroženo", + "Off track": "Mimo plán", + "Money note": "Poznámka k penězům", + "A short explanation of this status": "Krátké vysvětlení tohoto stavu", + "Organisation": "Organizace", + "Organisation note": "Poznámka k organizaci", + "Time": "Čas", + "Time note": "Poznámka k času", + "Information": "Informace", + "Information note": "Poznámka k informacím", + "Quality": "Kvalita", + "Quality note": "Poznámka ke kvalitě", + "Risk note": "Poznámka k riziku", + "Overall": "Celkově", + "The worst of the six statuses, calculated by the server": "Nejhorší ze šesti stavů, vypočtený serverem", + "Health: money": "Stav: peníze", + "Copied from the newest status report": "Převzato z nejnovější zprávy o stavu", + "Health: organisation": "Stav: organizace", + "Health: time": "Stav: čas", + "Health: information": "Stav: informace", + "Health: quality": "Stav: kvalita", + "Health: risk": "Stav: riziko", + "Health: overall": "Stav: celkově", + "Health: report date": "Stav: datum zprávy", + "The date of the newest status report": "Datum nejnovější zprávy o stavu", + "New report": "Nová zpráva", + "Only the project owner writes status reports.": "Zprávy o stavu píše jen vlastník projektu.", + "Latest report, {date}": "Poslední zpráva, {date}", + "Aspect": "Aspekt", + "Note": "Poznámka", + "Report history": "Historie zpráv", + "Author": "Autor", + "No status reports yet": "Zatím žádné zprávy o stavu", + "Write the first report": "Napsat první zprávu", + "Choose a status for every aspect to save the report.": "Pro uložení zprávy zvolte stav u každého aspektu.", + "Suggested: on track.": "Návrh: podle plánu.", + "Suggested: at risk.": "Návrh: ohroženo.", + "Suggested: off track.": "Návrh: mimo plán.", + "1 task is past its due date.": "1 úkol je po termínu.", + "{count} tasks are past their due date.": "Úkoly po termínu: {count}.", + "The end date has passed with 1 open task.": "Datum konce uplynulo s 1 otevřeným úkolem.", + "The end date has passed with {count} open tasks.": "Datum konce uplynulo, otevřené úkoly: {count}.", + "No open task is past its due date.": "Žádný otevřený úkol není po termínu.", + "The highest open risk, \"{title}\", scores {score}.": "Nejvyšší otevřené riziko, \"{title}\", má skóre {score}.", + "There are no open risks.": "Nejsou žádná otevřená rizika.", + "Costs are at {percent}% of the budget.": "Náklady jsou na {percent}% rozpočtu.", + "No suggestion: the project has no budget.": "Bez návrhu: projekt nemá rozpočet.", + "No suggestion: no costs are recorded for this project yet.": "Bez návrhu: pro tento projekt zatím nejsou zaznamenány žádné náklady.", + "The report was not saved. Only the project owner can write status reports.": "Zpráva nebyla uložena. Zprávy o stavu může psát jen vlastník projektu.", + "No report": "Žádná zpráva", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Skupina projektů vedených stejnými lidmi, například oddělení nebo program. Její správci čtou každý projekt v ní.", + "The name of the portfolio": "Název portfolia", + "What the portfolio holds and who runs it": "Co portfolio obsahuje a kdo ho vede", + "A colour for the portfolio's section in project lists": "Barva sekce portfolia v seznamech projektů", + "Managers": "Správci", + "Nextcloud user UIDs of the people who run the portfolio": "ID uživatelů Nextcloud lidí, kteří portfolio vedou", + "Order": "Pořadí", + "Where the portfolio comes in project lists, lowest first": "Kde je portfolio v seznamech projektů, od nejnižšího", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Vlastní škála rizik tohoto portfolia jako JSON, ve stejném tvaru jako škála celé aplikace. Prázdné znamená škálu aplikace.", + "Portfolio readers": "Čtenáři portfolia", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID uživatelů Nextcloud správců portfolia projektu", + "The portfolio this project belongs to": "Portfolio, do kterého projekt patří", + "No portfolio": "Bez portfolia", + "All portfolios": "Všechna portfolia", + "You read this project as a manager of its portfolio. Only its members change it.": "Tento projekt čtete jako správce jeho portfolia. Mění ho jen jeho členové.", + "Portfolios": "Portfolia", + "Portfolio status": "Stav portfolia", + "No portfolios yet": "Zatím žádná portfolia", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Správce přidává portfolia v Projekty, Portfolia. Projekty v portfoliu jsou zde uvedeny se svým stavem.", + "Roll-up": "Souhrn", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} podle plánu, {atRisk} ohroženo, {offTrack} mimo plán, {noReport} bez zprávy", + "No project in this portfolio that you can read.": "V tomto portfoliu není projekt, který můžete číst.", + "Start": "Začátek", + "End": "Konec", + "Budget": "Rozpočet", + "Last report": "Poslední zpráva", + "Out of date": "Zastaralé", + "Portfolio timeline": "Časová osa portfolia", + "Zoom": "Přiblížení", + "Could not load the timeline": "Časovou osu se nepodařilo načíst", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Správce přidává portfolia v Projekty, Portfolia. Projekty v portfoliu jsou zde na jedné časové ose.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Otevřete projekt a uvidíte jeho fáze a úkoly. Časová osa je jen pro čtení.", + "Phase: {title}": "Fáze: {title}", + "Left out because you cannot read them: {count} projects": "Vynecháno, protože je nemůžete číst: {count} projektů", + "Week": "Týden", + "Day": "Den", + "Month": "Měsíc", + "Please try again later.": "Zkuste to prosím později.", + "Status reports": "Zprávy o stavu", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Po kolika dnech je poslední zpráva o stavu projektu označena v přehledu portfolia jako zastaralá", + "Reporting period (days)": "Období vykazování (dny)", + "The reporting period is a whole number of days from 1 to 365.": "Období vykazování je celý počet dní od 1 do 365.", + "Reporting period saved": "Období vykazování uloženo", + "The reporting period was not saved. Please try again.": "Období vykazování nebylo uloženo. Zkuste to znovu.", + "Every project of a portfolio with its status per aspect, rolled up.": "Každý projekt portfolia se stavem podle aspektů, shrnutý.", + "The projects of a portfolio on one timeline.": "Projekty portfolia na jedné časové ose.", + "Phases": "Fáze", + "Add phase": "Přidat fázi", + "No phases yet": "Zatím žádné fáze", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Rozdělte projekt do fází, například zahájení, definice a realizace. Fáze se uzavře, jakmile je nahrán její závěrečný dokument.", + "{hours} hours": "{hours} hodin", + "Concluding document: {title}": "Závěrečný dokument: {title}", + "Concluding document missing": "Chybí závěrečný dokument", + "Move {title} up": "Posunout {title} nahoru", + "Move {title} down": "Posunout {title} dolů", + "Close phase": "Uzavřít fázi", + "Phase": "Fáze", + "Files": "Soubory", + "Notes": "Poznámky", + "Audit trail": "Auditní záznam", + "Edit phase": "Upravit fázi", + "Name": "Název", + "Budget hours": "Rozpočtované hodiny", + "Could not save the phase. Please try again.": "Fázi se nepodařilo uložit. Zkuste to znovu.", + "Close phase {title}": "Uzavřít fázi {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Fáze se uzavírá závěrečným dokumentem: nahrajte ho sem nebo vyberte některý ze souborů fáze.", + "Concluding document": "Závěrečný dokument", + "This phase has no files yet.": "Tato fáze zatím nemá žádné soubory.", + "Upload a document": "Nahrát dokument", + "The document was not uploaded. Please try again.": "Dokument nebyl nahrán. Zkuste to znovu.", + "Upload the concluding document before you close this phase.": "Než tuto fázi uzavřete, nahrajte závěrečný dokument.", + "This phase cannot be closed from its current status.": "Tuto fázi nelze uzavřít z jejího současného stavu.", + "The phase was not closed. Please try again.": "Fáze nebyla uzavřena. Zkuste to znovu.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID souboru této fáze, který ji uzavírá. Fázi lze dokončit, až když je vyplněno a soubor je připojen.", + "Import from Microsoft Project": "Importovat z Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Vyberte plán uložený z Microsoft Project ve formátu XML. Nic se neimportuje, dokud nepotvrdíte.", + "Plan file": "Soubor plánu", + "What the import creates": "Co import vytvoří", + "Tasks": "Úkoly", + "Sub-tasks": "Dílčí úkoly", + "Milestones": "Milníky", + "Links": "Vazby", + "Already imported, updated in place: {count}": "Již importováno, aktualizováno na místě: {count}", + "What does not carry over": "Co se nepřenese", + "Tasks with resources, which are not imported: {count}": "Úkoly se zdroji, které se neimportují: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Úkoly hlouběji než úroveň 3, umístěné pod svůj úkol úrovně 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Vazby jiné než konec-začátek, importované jako související vazby: {count}", + "Link lags, which are dropped: {count}": "Prodlevy vazeb, které se vypouštějí: {count}", + "Links to a summary task, which are not imported: {count}": "Vazby na souhrnný úkol, které se neimportují: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Vazby na úkoly mimo tento plán, které se neimportují: {count}", + "No longer in the plan": "Již není v plánu", + "These stay in the project; remove them yourself if they are no longer needed.": "Zůstávají v projektu; odstraňte je sami, pokud už nejsou potřeba.", + "Import": "Importovat", + "Close": "Zavřít", + "The plan is imported: {created} created, {updated} updated.": "Plán je importován: vytvořeno {created}, aktualizováno {updated}.", + "Links that would close a loop were left out: {count}": "Vazby, které by uzavřely smyčku, byly vynechány: {count}", + "The import stopped part-way. Run it again to finish it.": "Import se zastavil v polovině. Spusťte ho znovu, abyste ho dokončili.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Uložte plán v Microsoft Project přes Soubor, Uložit jako, formát XML, a importujte tento soubor.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Tento soubor deklaruje DOCTYPE nebo entity, které nejsou přijímány.", + "The file is larger than 10 MB.": "Soubor je větší než 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plán má více než 2 000 úkolů, víc, než jeden import přijme.", + "This file is not a Microsoft Project plan in XML format.": "Tento soubor není plán Microsoft Project ve formátu XML.", + "Choose a file to import.": "Vyberte soubor k importu.", + "Only the project owner can import a plan.": "Plán může importovat jen vlastník projektu.", + "The plan could not be read. Please try again.": "Plán se nepodařilo přečíst. Zkuste to znovu.", + "Linked case: {title}": "Propojený spis: {title}", + "Linked to a case": "Propojeno se spisem", + "Hand over to case": "Předat do spisu", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Beze změny zkopíruje každý soubor projektu a jeho úkolů a soubor popisující projekt do propojeného spisu.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Zkopírované soubory: {count}", + "Files that failed: {names}": "Neúspěšné soubory: {names}", + "The handover failed. Please try again.": "Předání se nezdařilo. Zkuste to znovu.", + "The linked case could not be found, or you cannot open it.": "Propojený spis nebyl nalezen, nebo ho nemůžete otevřít.", + "Case handovers": "Předání do spisu", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Každé předání souborů a metadat projektu do jeho spisu: kdy, kým, do kterého spisu, každý zkopírovaný soubor s jeho SHA-256 a neúspěšné soubory.", + "Finance": "Finance", + "Add cost line": "Přidat nákladovou položku", + "Delivery terms": "Dodací podmínky", + "Billing model": "Model fakturace", + "Budget in euro": "Rozpočet v eurech", + "Budget in hours": "Rozpočet v hodinách", + "Hourly rate in euro": "Hodinová sazba v eurech", + "Planned start": "Plánovaný začátek", + "Planned end": "Plánovaný konec", + "Planned dates": "Plánovaná data", + "Budget {amount}": "Rozpočet {amount}", + "No budget agreed": "Rozpočet nebyl dohodnut", + "Hours": "Hodiny", + "Only the project owner and the portfolio managers see the amounts.": "Částky vidí jen vlastník projektu a správci portfolia.", + "Budget against cost per category": "Rozpočet proti nákladům podle kategorie", + "Labour (booked time)": "Práce (vykázaný čas)", + "No category": "Bez kategorie", + "Hours are not available": "Hodiny nejsou k dispozici", + "Not yet assigned to a category": "Zatím nepřiřazeno ke kategorii", + "Total": "Celkem", + "{spent} spent, {remaining} remaining": "{spent} utraceno, {remaining} zbývá", + "Budget against cost per phase": "Rozpočet proti nákladům podle fáze", + "No phase": "Bez fáze", + "Cost lines": "Nákladové položky", + "From the finance system": "Z finančního systému", + "Edit cost line {amount}": "Upravit nákladovou položku {amount}", + "No cost lines yet": "Zatím žádné nákladové položky", + "Commitments": "Závazky", + "Actual cost": "Skutečné náklady", + "Forecast": "Prognóza", + "Remaining": "Zbývá", + "Not planned yet": "Zatím nenaplánováno", + "{start} to {end}": "{start} až {end}", + "The terms were not saved. Please try again.": "Podmínky nebyly uloženy. Zkuste to znovu.", + "Terms saved": "Podmínky uloženy", + "Fixed price": "Pevná cena", + "Hourly": "Hodinově", + "Not billed": "Nefakturováno", + "Commitment": "Závazek", + "Edit cost line": "Upravit nákladovou položku", + "Kind": "Druh", + "Amount in euro": "Částka v eurech", + "Remove": "Odebrat", + "Could not save the cost line. Only the project owner changes the money of a project.": "Nákladovou položku nelze uložit. Peníze projektu mění jen vlastník projektu.", + "Could not remove the cost line. Please try again.": "Nákladovou položku nelze odebrat. Zkuste to znovu.", + "{amount} over budget": "{amount} nad rozpočet", + "Cost categories": "Kategorie nákladů", + "The categories every project splits its budget and costs into, one per line": "Kategorie, do kterých každý projekt dělí svůj rozpočet a náklady, jedna na řádek", + "Categories": "Kategorie", + "Give at least one category, each name once.": "Zadejte aspoň jednu kategorii, každý název jednou.", + "Cost categories saved": "Kategorie nákladů uloženy", + "The cost categories were not saved. Please try again.": "Kategorie nákladů nebyly uloženy. Zkuste to znovu.", + "Finance line": "Finanční položka", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Jedna částka peněz v projektu: rozpočet, závazek, skutečný náklad nebo prognóza, v kategorii nákladů a případně ve fázi. Zadaná vlastníkem projektu nebo finančním systémem přes integrační aplikaci.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt, ke kterému částka patří. Prázdné u položky z finančního systému, jejíž číslo projektu neodpovídá žádnému projektu.", + "The phase this amount belongs to, if any": "Fáze, ke které částka patří, pokud existuje", + "The cost category, one of the categories the admin set up": "Kategorie nákladů, jedna z kategorií nastavených správcem", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Zda je částka rozpočet, závazek, skutečný náklad nebo prognóza", + "Amount": "Částka", + "The amount in the reporting currency (euro)": "Částka v měně výkaznictví (euro)", + "The date the amount was booked or is expected": "Datum, kdy byla částka zaúčtována nebo se očekává", + "What the amount is for": "Na co částka je", + "Whether a person entered the line or the finance system sent it": "Zda položku zadal člověk, nebo ji poslal finanční systém", + "Entered by hand": "Zadáno ručně", + "Finance line id": "Id finanční položky", + "The finance system's own id of this line. One imported line per id.": "Vlastní id této položky ve finančním systému. Jedna importovaná položka na id.", + "Project number": "Číslo projektu", + "The project number the finance system sent, matched against the project key": "Číslo projektu zaslané finančním systémem, porovnané s klíčem projektu", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfolio projektu položky, převzaté z projektu, aby součty portfolia potřebovaly jeden filtr", + "Finance readers": "Čtenáři financí", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID uživatelů Nextcloud, kteří smějí vidět tuto částku: vlastník projektu a správci jeho portfolia", + "Project owner": "Vlastník projektu", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID uživatele Nextcloud vlastníka projektu, který smí měnit a odebírat ruční položky", + "How the client pays: not billed, a fixed price, or by the hour.": "Jak klient platí: nefakturováno, pevná cena nebo hodinově.", + "Portfolio finance": "Finance portfolia", + "You cannot see the money of any project in this portfolio": "Nevidíte peníze žádného projektu v tomto portfoliu", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Server vrátil nákladové položky projektů mimo toto portfolio, takže tyto součty mohou být chybné.", + "Projects left out because you cannot see their money: {count}": "Vynechané projekty, protože nevidíte jejich peníze: {count}", + "Unmatched finance lines": "Nepřiřazené finanční položky", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Rozpočet, závazky, skutečné náklady a prognóza sečtené za portfolio.", + "Subprojects": "Podprojekty", + "{done} of {total}": "{done} z {total}", + "{done} of {total} tasks done, including subprojects": "{done} z {total} úkolů hotovo, včetně podprojektů", + "Show the subprojects of {title}": "Zobrazit podprojekty {title}", + "Hide the subprojects of {title}": "Skrýt podprojekty {title}", + "Part of": "Součást", + "No parent project": "Bez nadřazeného projektu", + "A project cannot sit under one of its own subprojects.": "Projekt nemůže ležet pod jedním ze svých vlastních podprojektů.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekty se vnořují nejvýše do tří úrovní: program, projekt a podprojekt.", + "Parent project": "Nadřazený projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt, pod kterým tento projekt leží, například program. Projekty se vnořují nejvýše do tří úrovní.", + "Yes": "Ano", + "No": "Ne", + "{label} (required)": "{label} (povinné)", + "{label} is required": "{label} je povinné", + "Project field": "Pole projektu", + "A field an admin adds to every project, such as a policy area or a contract value.": "Pole, které správce přidá ke každému projektu, například oblast politiky nebo hodnotu zakázky.", + "Key": "Klíč", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stálý název, pod kterým se hodnota ukládá, v lower camel case. Neměňte ho, jakmile ho projekty používají.", + "Label": "Popisek", + "The name people see next to the field": "Název, který lidé vidí u pole", + "What the field holds": "Co pole obsahuje", + "Text": "Text", + "Number": "Číslo", + "Choice": "Volba", + "Person": "Osoba", + "Yes or no": "Ano nebo ne", + "Options": "Možnosti", + "The choices of a choice field": "Možnosti výběrového pole", + "Required": "Povinné", + "Whether a project must fill in the field": "Zda projekt musí pole vyplnit", + "Where the field appears, lowest first": "Kde se pole zobrazí, nejnižší první", + "Applies to": "Platí pro", + "What the field is added to": "K čemu se pole přidává", + "Custom fields": "Vlastní pole", + "The values of the project fields an admin defined, keyed by the field's key.": "Hodnoty polí projektu, která definoval správce, podle klíče pole.", + "Project fields": "Pole projektu", + "Related": "Související", + "Remove link": "Odebrat odkaz", + "Link type": "Typ odkazu", + "Relates to": "Souvisí s", + "Duplicates": "Duplikuje", + "Project key": "Klíč projektu", + "Every task number starts with it, such as VERG-42.": "Každé číslo úkolu jím začíná, například VERG-42.", + "This key is already used by another project.": "Tento klíč už používá jiný projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Použijte 2 až 10 písmen a číslic, začínající písmenem.", + "The key cannot change once tasks carry it.": "Klíč se nemůže změnit, jakmile ho nesou úkoly.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt uložen. Stávající úkoly dostanou svá čísla na pozadí.", + "Next task number": "Číslo dalšího úkolu", + "The number the next task of this project gets in its key. Only the system writes it.": "Číslo, které další úkol tohoto projektu dostane ve svém klíči. Zapisuje ho jen systém.", + "Restore {title}": "Obnovit {title}", + "Restore": "Obnovit", + "Project restored": "Projekt obnoven", + "Could not restore the project": "Projekt se nepodařilo obnovit", + "Bring this project back to the active list.": "Vrátit projekt do seznamu aktivních projektů.", + "Restore project": "Obnovit projekt", + "Request reason": "Důvod žádosti", + "Why the requester needs this project. Filled in when the project is requested.": "Proč žadatel tento projekt potřebuje. Vyplňuje se při žádosti.", + "Reviewed by": "Posoudil", + "The user who approved or rejected the request.": "Uživatel, který žádost schválil nebo zamítl.", + "Reviewed at": "Posouzeno", + "When the request was approved or rejected.": "Kdy byla žádost schválena nebo zamítnuta.", + "Review note": "Poznámka k posouzení", + "The reviewer's reason, shown to the requester when a request is not approved.": "Důvod posuzovatele, který žadatel uvidí, když žádost není schválena.", + "Members of these groups": "Členové těchto skupin", + "Groups that may create projects": "Skupiny, které smějí zakládat projekty", + "The group {group} no longer exists. Save to remove it.": "Skupina {group} už neexistuje. Uložením ji odeberete.", + "Review project request": "Posoudit žádost o projekt", + "Requested by": "Požádal", + "Why it is needed": "Proč je potřeba", + "Desired start date": "Požadované datum zahájení", + "Why is it not approved?": "Proč není schválen?", + "Give a reason. The requester sees it.": "Uveďte důvod. Žadatel ho uvidí.", + "Approve": "Schválit", + "Reject": "Zamítnout", + "Reject request": "Zamítnout žádost", + "The review was not saved. Try again.": "Posouzení se neuložilo. Zkuste to znovu.", + "This project is waiting for review": "Tento projekt čeká na posouzení", + "This request was not approved": "Tato žádost nebyla schválena", + "Reason: {note}": "Důvod: {note}", + "Review request": "Posoudit žádost", + "Request a project": "Požádat o projekt", + "Step {step} of 2": "Krok {step} ze 2", + "Why is this project needed?": "Proč je tento projekt potřeba?", + "Give a reason. The reviewer reads it.": "Uveďte důvod. Posuzovatel ho přečte.", + "Back": "Zpět", + "Next": "Další", + "Send request": "Odeslat žádost", + "The request was not sent. Try again.": "Žádost se neodeslala. Zkuste to znovu.", + "Requested": "Požadováno", + "Not approved": "Neschváleno", + "Your request was sent": "Vaše žádost byla odeslána", + "Let everyone else request a project": "Umožnit všem ostatním požádat o projekt", + "Add a task": "Přidat úkol", + "Delete task": "Smazat úkol", + "Edit task": "Upravit úkol", + "Write": "Psát", + "Preview": "Náhled", + "Markdown works here: headings, lists and links.": "Zde funguje Markdown: nadpisy, seznamy a odkazy.", + "Could not save the task. Please try again.": "Úkol se nepodařilo uložit. Zkuste to znovu.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Na úkolu \"{title}\" je zapsaný čas, proto ho nelze smazat. Místo toho ho můžete zrušit: záznamy času zůstanou.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Smazat \"{title}\"? Odstraní se také jeho odkazy na jiné úkoly. Tuto akci nelze vrátit zpět.", + "Keep task": "Ponechat úkol", + "Cancel task": "Zrušit úkol", + "Only the reporter, the project owner or an admin can delete this task.": "Tento úkol může smazat jen ten, kdo ho nahlásil, vlastník projektu nebo správce.", + "Could not delete the task. Please try again.": "Úkol se nepodařilo smazat. Zkuste to znovu.", + "Could not cancel the task. Please try again.": "Úkol se nepodařilo zrušit. Zkuste to znovu.", + "Responsible": "Odpovědná osoba", + "Also working on this": "Pracují na tom také", + "Labels": "Štítky", + "Could not change the priority. Please try again.": "Prioritu se nepodařilo změnit. Zkuste to znovu.", + "Other project members who work on this task alongside the person responsible.": "Další členové projektu, kteří na úkolu pracují spolu s odpovědnou osobou.", + "Duplicate": "Duplikovat", + "Could not copy the task. Please try again.": "Úkol se nepodařilo zkopírovat. Zkuste to znovu.", + "Subtasks": "Podúkoly", + "{done} of {total} done": "Hotovo {done} z {total}", + "Add a subtask": "Přidat podúkol", + "Checklist": "Kontrolní seznam", + "Checklist item actions": "Akce položky seznamu", + "Add a checklist item": "Přidat položku seznamu", + "Subtasks: {estimate} estimated, {logged} logged": "Podúkoly: odhad {estimate}, zapsáno {logged}", + "Total estimate: {total}": "Celkový odhad: {total}", + "Part of {title}": "Součást úkolu {title}", + "Checklist: {count} done": "Kontrolní seznam: hotovo {count}", + "This task has subtasks: {count}.": "Tento úkol má podúkoly: {count}.", + "Keep subtasks as separate tasks": "Ponechat podúkoly jako samostatné úkoly", + "Delete subtasks too": "Smazat i podúkoly", + "Copy of {title}": "Kopie: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Úkol byl zkopírován, ale ne všechny jeho podúkoly. Zkontrolujte kopii.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Malé kroky v rámci úkolu. Každá položka má id, text a informaci, zda je hotová.", + "Open work per person and per project.": "Otevřená práce podle osob a projektů.", + "View": "Zobrazení", + "By person": "Podle osoby", + "By project": "Podle projektu", + "Hours left": "Zbývající hodiny", + "Tasks without an estimate": "Úkoly bez odhadu", + "Due in 14 days": "Termín do 14 dnů", + "Shared": "Sdílené", + "Unassigned": "Nepřiřazené", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Zobrazuje se práce v projektech, které vidíte. Hodiny se počítají odpovědné osobě; sdílené úkoly se počítají bez hodin.", + "No open work in these projects.": "V těchto projektech není žádná otevřená práce.", + "Open work": "Otevřená práce", + "{count} open tasks": "{count} otevřených úkolů", + "Create a project to see capacity here.": "Vytvořte projekt, abyste zde viděli kapacitu.", + "My tasks": "Moje úkoly", + "Show all my tasks": "Zobrazit všechny moje úkoly", + "No tasks assigned to you": "Nemáte přiřazené žádné úkoly", + "Browse projects": "Procházet projekty", + "Later": "Později", + "Due {date}": "Termín {date}", + "Could not change the status. Please try again.": "Stav se nepodařilo změnit. Zkuste to znovu.", + "Completed today": "Dokončeno dnes", + "My open tasks": "Moje otevřené úkoly", + "My overdue tasks": "Moje úkoly po termínu", + "My tasks in progress": "Moje rozpracované úkoly", + "Pin to the top": "Připnout nahoru", + "Unpin": "Odepnout", + "Pinned": "Připnuto", + "Actions for {title}": "Akce pro {title}", + "Could not save your project order. Please try again.": "Pořadí projektů se nepodařilo uložit. Zkuste to znovu.", + "No boards yet": "Zatím žádné tabule", + "Create a project to get a board.": "Vytvořte projekt, abyste měli tabuli.", + "Use the Projects page to create and manage your projects and tasks.": "Na stránce Projekty vytvářejte a spravujte své projekty a úkoly.", + "Go to projects": "Přejít na projekty", + "You are not a member of any projects yet.": "Zatím nejste členem žádného projektu.", + "Could not search for users. Please try again.": "Uživatele se nepodařilo vyhledat. Zkuste to znovu.", + "Project creation is restricted to administrators.": "Projekty mohou vytvářet pouze správci.", + "Only the project owner or an administrator can delete this project.": "Tento projekt může smazat pouze vlastník projektu nebo správce.", + "No projects are available to you yet. Ask an administrator to create one.": "Zatím pro vás nejsou dostupné žádné projekty. Požádejte správce o vytvoření.", + "Due: {date}": "Termín: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Úkoly s datem zahájení nebo termínem se zobrazují na časové ose. Přidejte data, abyste je zde viděli.", + "You do not have access to this project.": "K tomuto projektu nemáte přístup.", + "Zoom level": "Úroveň přiblížení", + "Unscheduled": "Nenaplánované", + "Start: {date}": "Začátek: {date}", + "Today": "Dnes", + "No scheduled tasks": "Žádné naplánované úkoly", + "An unexpected error occurred.": "Došlo k neočekávané chybě.", + "Column {number} name": "Název sloupce {number}", + "Failed to save creation policy": "Pravidlo pro vytváření se nepodařilo uložit", + "All authenticated users": "Všichni přihlášení uživatelé", + "Control who may create new projects": "Určete, kdo smí vytvářet nové projekty", + "Administrators only": "Pouze správci", + "Project creation": "Vytváření projektů", + "Allow project creation": "Povolit vytváření projektů", + "Creation policy saved successfully": "Pravidlo pro vytváření uloženo", + "Initializing…": "Spouštění…", + "e.g. 2h 30m, 90m, 1.5h": "např. 2h 30m, 90m, 1.5h", + "Log time": "Zapsat čas", + "Save estimate": "Uložit odhad", + "Logged: {logged}": "Zapsáno: {logged}", + "over by {amount}": "překročeno o {amount}", + "Time tracking": "Evidence času", + "Estimate": "Odhad", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Zadejte platný odhad (např. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Zadejte platnou dobu trvání (např. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Záznam času se nepodařilo uložit. Zkuste to znovu.", + "Edit time entry": "Upravit záznam času", + "Duration": "Doba trvání", + "Date range": "Období", + "Last week": "Minulý týden", + "No time logged": "Žádný zapsaný čas", + "Log time on a task to see it here.": "Zapište čas k úkolu, abyste ho zde viděli.", + "To date": "Do data", + "This week": "Tento týden", + "Total: {total}": "Celkem: {total}", + "From date": "Od data", + "Custom range": "Vlastní období", + "All time": "Celé období", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Úkol se nepodařilo smazat, takže mohou zůstat data. Smažte projekt znovu.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Záznam času se nepodařilo smazat, takže mohou zůstat data. Smažte projekt znovu.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Sloupec se nepodařilo smazat, takže mohou zůstat data. Smažte projekt znovu.", + "Could not delete the project. Please try again.": "Projekt se nepodařilo smazat. Zkuste to znovu.", + "Notification settings": "Nastavení oznámení", + "Configure when due-date reminders are sent": "Nastavte, kdy se posílají připomínky termínů", + "Due-date reminder lead time (hours)": "Předstih připomínky termínu (hodiny)", + "Lead time must be between 1 and 336 hours": "Předstih musí být mezi 1 a 336 hodinami", + "Reminder lead time saved successfully": "Předstih připomínky uložen", + "Failed to save reminder lead time": "Předstih připomínky se nepodařilo uložit", + "Notifications": "Oznámení", + "Notify me 1 day before a task's due date": "Upozornit mě 1 den před termínem úkolu", + "Draft": "Koncept", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Zda je hodina koncept, který vidí jen její učitel, koná se, nebo je zrušena.", + "New release": "Nové vydání", + "Roadmap chart. The same releases and epics are listed below.": "Graf plánu. Stejná vydání a eposy jsou vypsány níže.", + "Nothing on the roadmap yet": "Na plánu zatím nic není", + "Releases with a target date and epics with dated tasks appear here.": "Zde se zobrazují vydání s cílovým datem a eposy s úkoly, které mají datum.", + "Releases": "Vydání", + "No releases yet": "Zatím žádná vydání", + "Target date: {date}": "Cílové datum: {date}", + "No target date": "Bez cílového data", + "Edit {name}": "Upravit {name}", + "Mark {name} as released": "Označit {name} jako vydané", + "Mark as released": "Označit jako vydané", + "Epics": "Eposy", + "No epics yet. Open a task to make it an epic.": "Zatím žádné eposy. Otevřete úkol a udělejte z něj epos.", + "Not scheduled yet": "Zatím nenaplánováno", + "Planned": "Plánováno", + "Released": "Vydáno", + "Edit release": "Upravit vydání", + "Target date": "Cílové datum", + "Could not save the release. Please try again.": "Vydání se nepodařilo uložit. Zkuste to znovu.", + "Every task of this release is done or cancelled.": "Každý úkol tohoto vydání je hotový nebo zrušený.", + "Not finished yet: {count}": "Zatím nedokončeno: {count}", + "What happens to these tasks?": "Co se stane s těmito úkoly?", + "Move to {name}": "Přesunout do {name}", + "Remove the release": "Odebrat vydání", + "Keep it on {name}": "Ponechat v {name}", + "Could not mark the release as released. Please try again.": "Vydání se nepodařilo označit jako vydané. Zkuste to znovu.", + "Roadmap": "Plán", + "Tasks or roadmap": "Úkoly nebo plán", + "Release": "Vydání", + "Epic": "Epos", + "This task is an epic": "Tento úkol je epos", + "A named, dated delivery of a project that its tasks are planned against.": "Pojmenovaná dodávka projektu s datem, na kterou se plánují jeho úkoly.", + "Name of the release": "Název vydání", + "The project this release belongs to": "Projekt, ke kterému toto vydání patří", + "What this release delivers": "Co toto vydání dodává", + "When work on the release starts": "Kdy začíná práce na vydání", + "The date the release is due": "Datum, kdy má být vydání hotové", + "Whether the release is planned, released or archived": "Zda je vydání plánované, vydané nebo archivované", + "Released on": "Vydáno dne", + "When the release was marked as released": "Kdy bylo vydání označeno jako vydané", + "The release this task is planned for": "Vydání, pro které je tento úkol naplánován", + "Board view options": "Možnosti zobrazení nástěnky", + "Colour cards": "Obarvit karty", + "No colour": "Bez barvy", + "By label": "Podle štítku", + "Swimlanes": "Plavecké dráhy", + "No swimlanes": "Bez plaveckých drah", + "By assignee": "Podle řešitele", + "By epic": "Podle eposu", + "No assignee": "Nepřiřazeno", + "No epic": "Bez eposu", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Karty zůstávají v řádku svého eposu. Epos změňte na stránce úkolu.", + "Hand over to": "Předat", + "Could not save your board view. It applies until you reload.": "Zobrazení nástěnky se nepodařilo uložit. Platí do opětovného načtení.", + "Timetable wish": "Přání k rozvrhu", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Přání, které generátor zohledňuje. Pevné přání dodrží vždy, měkké tam, kde může.", + "Whether the wish is about a teacher, a group, a room or one activity": "Zda se přání týká učitele, skupiny, místnosti nebo jedné činnosti", + "Teacher": "Učitel", + "Group": "Skupina", + "Reference": "Odkaz", + "The user, group, room or activity the wish is about": "Uživatel, skupina, místnost nebo činnost, které se přání týká", + "What the wish asks for": "Co přání žádá", + "Not on these periods": "Ne v těchto hodinách", + "Preferably not on these periods": "Raději ne v těchto hodinách", + "At most a number of lessons a day": "Nejvýše určitý počet hodin denně", + "No free periods between lessons": "Žádné volné hodiny mezi hodinami", + "Always the same room": "Vždy stejná místnost", + "Periods": "Hodiny", + "The periods of the week the wish is about, such as wed-5": "Hodiny týdne, kterých se přání týká, např. wed-5", + "Limit": "Limit", + "The most lessons a day, for a wish of that kind": "Nejvíce hodin denně, pro přání tohoto druhu", + "Strength": "Síla", + "Whether the generator must keep the wish or should keep it": "Zda generátor musí, nebo by měl přání dodržet", + "Hard": "Pevné", + "Soft": "Měkké", + "Weight": "Váha", + "How much a soft wish counts, from 1 to 3": "Jak moc měkké přání váží, od 1 do 3", + "Why the wish exists": "Proč přání existuje", + "Timetable scenario": "Scénář rozvrhu", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jeden týdenní vzor, vytvořený generátorem nebo převzatý ze současného rozvrhu. Uchovává svůj vstup a jak dobře dodržuje přání.", + "The name timetablers know the scenario by": "Název, pod kterým tvůrci rozvrhu scénář znají", + "Whether the generator made it or it came from the current timetable": "Zda ho vytvořil generátor, nebo pochází ze současného rozvrhu", + "Generated": "Vygenerováno", + "From the current timetable": "Ze současného rozvrhu", + "Week of": "Týden od", + "The Monday of the first week of the window": "Pondělí prvního týdne období", + "Window start": "Začátek období", + "The first day the week pattern applies to": "První den, pro který týdenní vzor platí", + "Window end": "Konec období", + "The last day the week pattern applies to": "Poslední den, pro který týdenní vzor platí", + "Waiting, generating, done, failed, or published as draft lessons": "Čeká, generuje se, hotovo, selhalo nebo zveřejněno jako koncepty hodin", + "Waiting": "Čeká", + "Generating": "Generuje se", + "Failed": "Selhalo", + "Published": "Zveřejněno", + "Seed": "Semínko", + "The number the generator starts from, so a run can be repeated": "Číslo, od kterého generátor začíná, aby šel běh zopakovat", + "Input": "Vstup", + "The periods, rooms, lessons and wishes the scenario was made from": "Hodiny, místnosti, vyučovací hodiny a přání, ze kterých scénář vznikl", + "Placements": "Umístění", + "Each lesson with the period and room it was given": "Každá vyučovací hodina s hodinou a místností, které dostala", + "Unplaced lessons": "Neumístěné hodiny", + "Lessons without a place, each with the hard wish that blocked it": "Hodiny bez místa, každá s pevným přáním, které ji zablokovalo", + "Broken wishes": "Porušená přání", + "The wishes this scenario breaks, with the lessons that break them": "Přání, která tento scénář porušuje, s hodinami, které je porušují", + "Measures": "Ukazatele", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Umístěné hodiny, porušená přání, volné hodiny učitelů, hodiny denně a využití místností", + "Reason": "Důvod", + "Why the run failed": "Proč běh selhal", + "Published at": "Zveřejněno", + "When the scenario was written out as draft lessons": "Kdy byl scénář zapsán jako koncepty hodin", + "Edit wish": "Upravit přání", + "New wish": "Nové přání", + "Hard: the generator always keeps it": "Pevné: generátor je vždy dodrží", + "Soft: the generator keeps it where it can": "Měkké: generátor je dodrží, kde to jde", + "Weight (1 to 3)": "Váha (1 až 3)", + "Most lessons a day": "Nejvýše hodin denně", + "Period": "Hodina", + "{day} period {number}": "{day} hodina {number}", + "Teacher (user name)": "Učitel (uživatelské jméno)", + "Activity (group:subject)": "Aktivita (skupina:předmět)", + "Say who or what the wish is about.": "Uveďte, koho nebo čeho se přání týká.", + "Choose at least one period.": "Vyberte alespoň jednu hodinu.", + "The limit is a whole number of 1 or more.": "Limit je celé číslo 1 nebo vyšší.", + "Timetable": "Rozvrh", + "Wishes": "Přání", + "Timetable wishes": "Přání k rozvrhu", + "Generator run": "Běh generátoru", + "Generator progress": "Průběh generátoru", + "The run failed: {reason}": "Běh selhal: {reason}", + "{placed} of {lessons} lessons placed": "Umístěno {placed} z {lessons} hodin", + "Generate again": "Generovat znovu", + "Generate": "Generovat", + "Every lesson has a place.": "Každá hodina má místo.", + "Lesson": "Hodina", + "No free period and room": "Žádná volná hodina a učebna", + "Broken soft wishes": "Porušená měkká přání", + "Every soft wish is kept.": "Každé měkké přání je dodrženo.", + "Wish": "Přání", + "Lessons": "Hodiny", + "Generating: {percent}% of the time budget used": "Generování: využito {percent} % času", + "Waiting to start": "Čeká na spuštění", + "Published as draft lessons": "Zveřejněno jako koncepty hodin", + "Could not read the scenario.": "Scénář se nepodařilo načíst.", + "Could not start the run.": "Běh se nepodařilo spustit.", + "Scenarios": "Scénáře", + "Timetable scenarios": "Scénáře rozvrhu", + "Scenario": "Scénář", + "Take the current timetable": "Převzít aktuální rozvrh", + "Could not take the current timetable.": "Aktuální rozvrh se nepodařilo převzít.", + "Broken hard wishes": "Porušená závazná přání", + "Not on a period of the week grid": "Není na hodině týdenní mřížky", + "Compare scenarios": "Porovnat scénáře", + "Scenarios to compare": "Scénáře k porovnání", + "Choose two or three scenarios to compare them.": "Vyberte dva nebo tři scénáře k porovnání.", + "Measure": "Ukazatel", + "Best": "Nejlepší", + "Lessons that differ": "Hodiny, které se liší", + "No lesson differs.": "Žádná hodina se neliší.", + "Not placed": "Neumístěno", + "{period} in {room}": "{period} v {room}", + "Lessons placed": "Umístěné hodiny", + "Lessons without a place": "Hodiny bez místa", + "Clashes": "Kolize", + "Hard wishes broken": "Porušená pevná přání", + "Soft wishes broken": "Porušená měkká přání", + "Soft wishes broken, weighted": "Porušená měkká přání, vážená", + "Free periods between lessons, all teachers": "Volné hodiny, všichni učitelé", + "Most free periods of one teacher": "Nejvíc volných hodin jednoho učitele", + "Most lessons of one group on a day": "Nejvíc hodin jedné skupiny za den", + "Room use": "Využití učeben", + "Publish as draft lessons": "Zveřejnit jako koncepty hodin", + "Draft lessons written: {count}": "Zapsané koncepty hodin: {count}", + "Could not publish the scenario.": "Scénář se nepodařilo zveřejnit.", + "Rules": "Pravidla", + "Rules for {column}": "Pravidla pro {column}", + "When a card enters this column": "Když karta vstoupí do tohoto sloupce", + "Action": "Akce", + "Set the priority": "Nastavit prioritu", + "Assign to": "Přiřadit", + "Assign the person who moved the card": "Přiřadit osobě, která kartu přesunula", + "Remove the assignee": "Odebrat řešitele", + "Add a label": "Přidat štítek", + "No longer a project member": "Již není členem projektu", + "This label no longer exists": "Tento štítek již neexistuje", + "Add rule": "Přidat pravidlo", + "Remove rule": "Odebrat pravidlo", + "No rules yet. Add one to change a card when it enters this column.": "Zatím žádná pravidla. Přidejte pravidlo, které změní kartu, když vstoupí do tohoto sloupce.", + "Could not save the rules. Please try again.": "Pravidla se nepodařilo uložit. Zkuste to znovu.", + "1 rule runs when a card enters this column": "1 pravidlo se spustí, když karta vstoupí do tohoto sloupce", + "{count} rules run when a card enters this column": "Počet pravidel, která se spustí, když karta vstoupí do tohoto sloupce: {count}", + "Rules applied: {changes}": "Použitá pravidla: {changes}", + "assigned to {name}": "přiřazeno: {name}", + "assignee removed": "řešitel odebrán", + "priority {priority}": "priorita {priority}", + "label {label}": "štítek {label}", + "What happens to a card when it enters this column, applied in list order.": "Co se stane s kartou, když vstoupí do tohoto sloupce, v pořadí seznamu.", + "Value": "Hodnota", + "What the rule does to the card.": "Co pravidlo udělá s kartou.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Priorita, ID uživatele nebo ID štítku, které akce používá; prázdné u akcí bez hodnoty.", + "is not": "není", + "{dimension} is not": "{dimension} není", + "Saved filters": "Uložené filtry", + "No saved filters yet": "Zatím žádné uložené filtry", + "Save filter": "Uložit filtr", + "Rename \"{name}\"": "Přejmenovat „{name}“", + "Delete \"{name}\"": "Smazat „{name}“", + "Clear filters": "Zrušit filtry", + "Showing {shown} of {total} tasks": "Zobrazeno {shown} z {total} úkolů", + "Me": "Já", + "No date": "Bez data", + "Rename saved filter": "Přejmenovat uložený filtr", + "Share with the project": "Sdílet s projektem", + "Give the filter a name": "Pojmenujte filtr", + "Could not save the filter. Please try again.": "Filtr se nepodařilo uložit. Zkuste to znovu.", + "Some labels in \"{name}\" no longer exist and were left out.": "Některé štítky ve „{name}“ již neexistují a byly vynechány.", + "Could not delete the filter. Please try again.": "Filtr se nepodařilo smazat. Zkuste to znovu.", + "Saved filter": "Uložený filtr", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Pojmenovaný filtr nástěnky jednoho projektu, soukromý pro toho, kdo jej uložil, pokud není sdílen s projektem.", + "The project whose board the filter applies to": "Projekt, na jehož nástěnku se filtr vztahuje", + "The name the filter is listed under": "Název, pod kterým je filtr uveden", + "Saved by": "Uložil(a)", + "Nextcloud user id of the person who saved the filter": "ID uživatele Nextcloud, který filtr uložil", + "Shared with the project": "Sdíleno s projektem", + "Whether every project member sees and applies the filter": "Zda každý člen projektu filtr vidí a může jej použít", + "Criteria": "Kritéria", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtr: řešitel, štítek, priorita a termín, každý s je nebo není a hodnotami", + "Cross-project view": "Meziprojektový pohled", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Uložený výběr projektů, jejichž úkoly se zobrazují společně ve sloupcích podle stavu, sdílený s uvedenými lidmi.", + "Shared with": "Sdíleno s", + "The name the view is listed under": "Název, pod kterým je pohled uveden", + "Nextcloud user id of the person who saved the view": "ID uživatele Nextcloud osoby, která pohled uložila", + "Nextcloud user ids of the people the view is shared with": "ID uživatelů Nextcloud osob, se kterými je pohled sdílen", + "The projects whose tasks the view shows, at most twenty": "Projekty, jejichž úkoly pohled zobrazuje, nejvýše dvacet", + "1 project in this view is hidden from you.": "1 projekt v tomto pohledu je před vámi skrytý.", + "{count} projects in this view are hidden from you.": "Projekty v tomto pohledu skryté před vámi: {count}.", + "{project} has no column for {status}.": "Projekt {project} nemá sloupec pro stav {status}.", + "This view does not exist or is not shared with you.": "Tento pohled neexistuje nebo s vámi není sdílen.", + "\"{task}\" moved to {status}.": "\"{task}\" přesunuto do {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Meziprojektové pohledy", + "New view": "Nový pohled", + "Edit view": "Upravit pohled", + "Delete view": "Smazat pohled", + "Give the view a name": "Pojmenujte pohled", + "Pick at least one project": "Vyberte alespoň jeden projekt", + "A view shows at most {max} projects": "Pohled zobrazuje nejvýše {max} projektů", + "Could not save the view. Please try again.": "Pohled se nepodařilo uložit. Zkuste to znovu.", + "Could not delete the view. Please try again.": "Pohled se nepodařilo smazat. Zkuste to znovu.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Smazat „{title}“? Projekty a jejich úkoly zůstanou beze změny.", + "People see the tasks of the projects they are in, never more.": "Každý vidí jen úkoly projektů, ve kterých je.", + "No views yet. A view shows the tasks of several of your projects together.": "Zatím žádné pohledy. Pohled zobrazuje úkoly několika vašich projektů společně.", + "Projects in view: {count}": "Projekty v pohledu: {count}", + "Notify me when a task is assigned to me": "Upozornit mě, když mi bude přidělen úkol", + "Also send these to me by email": "Posílat mi je také e-mailem", + "Add an email address in your Nextcloud personal settings to get mail.": "Pro příjem e-mailů přidejte e-mailovou adresu v osobním nastavení Nextcloud.", + "Code link": "Odkaz na kód", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, větev, žádost o sloučení nebo úkol v platformě pro kód, který se týká úkolu.", + "The task the link belongs to": "Úkol, ke kterému odkaz patří", + "The project of the task": "Projekt úkolu", + "Task key": "Klíč úkolu", + "The task key the forge text named, such as VC-12": "Klíč úkolu uvedený v textu platformy, například VC-12", + "What the link points at": "Kam odkaz vede", + "Link": "Odkaz", + "The address of the item in the forge": "Adresa položky v platformě pro kód", + "The commit message, branch name or merge request title": "Zpráva commitu, název větve nebo název žádosti o sloučení", + "Repository": "Repozitář", + "The repository, such as acme/portal": "Repozitář, například acme/portal", + "Forge id": "Id v platformě", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Vlastní id položky v platformě pro kód, například github:acme/portal#42 nebo hash commitu", + "State": "Stav", + "The state of a merge request or issue": "Stav žádosti o sloučení nebo úkolu", + "Who made the commit or opened the merge request": "Kdo vytvořil commit nebo otevřel žádost o sloučení", + "When the commit was made or the merge request last changed": "Kdy byl commit vytvořen nebo se žádost o sloučení naposledy změnila", + "Added by": "Přidal", + "Whether a person added the link or the integration wrote it": "Zda odkaz přidala osoba, nebo ho zapsala integrace", + "Nextcloud user UIDs of project members": "ID uživatelů Nextcloud členů projektu", + "Add link": "Přidat odkaz", + "Added by hand": "Přidáno ručně", + "Branch": "Větev", + "Code": "Kód", + "Commit": "Commit", + "From the integration": "Z integrace", + "Link to a commit, branch or merge request": "Odkaz na commit, větev nebo žádost o sloučení", + "Merge request": "Žádost o sloučení", + "Merged": "Sloučeno", + "No code linked yet. Name {key} in a commit message or paste a link.": "Zatím není propojen žádný kód. Uveďte {key} ve zprávě commitu nebo vložte odkaz.", + "No code linked yet. Paste a link to a commit or merge request.": "Zatím není propojen žádný kód. Vložte odkaz na commit nebo žádost o sloučení.", + "Paste a web address that starts with https://.": "Vložte webovou adresu začínající https://.", + "Remove link {title}": "Odebrat odkaz {title}", + "The link could not be added.": "Odkaz se nepodařilo přidat.", + "The link could not be removed.": "Odkaz se nepodařilo odebrat.", + "This link is already on the task.": "Tento odkaz už u úkolu je.", + "Code forges": "Platformy pro kód", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Propojte commity a pull requesty z GitHubu s úkoly. Integriq přijímá události; planninq GitHub nikdy nevolá.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Stáhněte konfiguraci a importujte ji do Integriq. Potom vyplňte tajemství v pravidle \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "V GitHubu přidejte do repozitáře webhook s touto adresou a stejným tajemstvím. Zvolte typ obsahu application/json a události push a pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Uveďte klíč úkolu, například VC-12, ve zprávě commitu, názvu větve nebo názvu pull requestu. Odkaz se pak zobrazí u tohoto úkolu.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriq mohou členové projektu stále vložit odkaz na stránce úkolu.", + "Download the Integriq configuration": "Stáhnout konfiguraci Integriq", + "Calendar": "Kalendář", + "Previous": "Předchozí", + "Calendar view": "Zobrazení kalendáře", + "Starts:": "Začíná:", + "No tasks with a date in this month.": "V tomto měsíci nejsou žádné úkoly s datem.", + "Week of {start} to {end}": "Týden od {start} do {end}", + "My calendar": "Můj kalendář", + "Show as list": "Zobrazit jako seznam", + "Show as calendar": "Zobrazit jako kalendář", + "Open my calendar": "Otevřít můj kalendář", + "Nextcloud Tasks": "Úkoly Nextcloud", + "Show my tasks in Nextcloud Tasks": "Zobrazit mé úkoly v Úkolech Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Úkoly přidělené vám nebo s vámi sdílené se zobrazí v seznamu \"Planninq\" v Úkolech a Kalendáři Nextcloud. Změny provedené tam se nahradí při další změně v Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Tento server nemůže zapisovat do Úkolů Nextcloud, proto export není k dispozici.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Spravováno aplikací Planninq. Změny provedené zde se nahradí při další změně v Planninq.", + "Working days and holidays": "Pracovní dny a svátky", + "Dates set on the timeline skip the days that are not working days.": "Data nastavená na časové ose přeskakují dny, které nejsou pracovní.", + "Working weekdays": "Pracovní dny v týdnu", + "Non-working days": "Nepracovní dny", + "No non-working days yet.": "Zatím žádné nepracovní dny.", + "Add day": "Přidat den", + "Year": "Rok", + "Add Dutch national holidays": "Přidat nizozemské státní svátky", + "Save working days": "Uložit pracovní dny", + "Choose at least one working weekday.": "Vyberte alespoň jeden pracovní den.", + "Working days saved.": "Pracovní dny uloženy.", + "Could not save the working days.": "Pracovní dny se nepodařilo uložit.", + "New Year's Day": "Nový rok", + "Easter Sunday": "Velikonoční neděle", + "Easter Monday": "Velikonoční pondělí", + "King's Day": "Den krále", + "Liberation Day": "Den osvobození", + "Ascension Day": "Nanebevstoupení Páně", + "Whit Sunday": "Letnice", + "Whit Monday": "Svatodušní pondělí", + "Christmas Day": "1. svátek vánoční", + "Boxing Day": "2. svátek vánoční", + "Dates of {title}": "Data úkolu {title}", + "The due date cannot be before the start date.": "Termín nemůže být před datem zahájení.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Data se nepodařilo uložit.", + "{title} now runs from {start} to {end}": "{title} nyní probíhá od {start} do {end}", + "Auto-scheduling": "Automatické plánování", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Je-li zapnuto, posunutí termínu na časové ose nabídne posunout i úkoly, které blokuje.", + "Move blocked tasks along when a task slips": "Posouvat blokované úkoly, když se úkol zpozdí", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na časové ose pozdější termín nabídne posunout blokované úkoly. Počítají se jen vazby \"blokuje\" a úkoly se posouvají jen později.", + "Move the tasks that wait for {title}?": "Posunout úkoly, které čekají na {title}?", + "These tasks wait for it and would start after its new due date:": "Tyto úkoly na něj čekají a začaly by po novém termínu:", + "{count} tasks would move; the first {limit} are listed.": "Posunulo by se {count} úkolů; zobrazeno je prvních {limit}.", + "Now": "Nyní", + "After the move": "Po posunutí", + "Only this task": "Jen tento úkol", + "Move all": "Posunout vše", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Zastaveno u {title}: data se nepodařilo uložit. Úkoly před ním byly posunuty.", + "Cumulative flow": "Kumulativní tok", + "Show as chart": "Zobrazit jako graf", + "Show as table": "Zobrazit jako tabulku", + "Tasks per column per day": "Úkoly ve sloupci za den", + "Tasks without recorded history in this period: {count}": "Úkoly bez zaznamenané historie v tomto období: {count}", + "Lead and cycle time": "Doba dodání a doba cyklu", + "No tasks were finished in this period.": "V tomto období nebyl dokončen žádný úkol.", + "Finished tasks": "Dokončené úkoly", + "Cycle time, average": "Doba cyklu, průměr", + "Cycle time, 85th percentile": "Doba cyklu, 85. percentil", + "Lead time, average": "Doba dodání, průměr", + "Tasks whose finish time was estimated from their history: {count}": "Úkoly, jejichž čas dokončení byl odhadnut z historie: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Doba cyklu každého dokončeného úkolu s průměrem a 85. percentilem", + "Slowest tasks": "Nejpomalejší úkoly", + "cycle {cycle}, lead {lead}": "cyklus {cycle}, dodání {lead}", + "{days} days": "{days} dní", + "Could not load the flow of this project.": "Tok tohoto projektu se nepodařilo načíst.", + "Last {days} days": "Posledních {days} dní", + "Portfolio flow": "Tok portfolia", + "An admin adds portfolios under Projects, Portfolios.": "Správce přidává portfolia v Projekty, Portfolia.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Nezobrazené projekty, protože se najednou zobrazuje nejvýše 50: {count}", + "Could not load the flow of this portfolio.": "Tok tohoto portfolia se nepodařilo načíst.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativní tok a doba cyklu napříč projekty portfolia.", + "Edit report": "Upravit přehled", + "Only tasks where": "Jen úkoly, kde", + "Group by": "Seskupit podle", + "Display": "Zobrazení", + "Share with everyone who can read its projects": "Sdílet se všemi, kdo mohou číst jeho projekty", + "The report could not be saved.": "Přehled se nepodařilo uložit.", + "Number of tasks": "Počet úkolů", + "Bar": "Sloupce", + "Donut": "Prstenec", + "Table": "Tabulka", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} z {total} projektů v tomto přehledu pro vás není viditelných", + "No tasks match this report.": "Tomuto přehledu neodpovídá žádný úkol.", + "None": "Žádné", + "Could not load this report.": "Tento přehled se nepodařilo načíst.", + "Report": "Přehled", + "Your reports": "Vaše přehledy", + "My reports": "Moje přehledy", + "Shared reports": "Sdílené přehledy", + "You have not built a report yet.": "Zatím jste nevytvořili žádný přehled.", + "Nobody has shared a report with you yet.": "Zatím s vámi nikdo nesdílel přehled.", + "Reports you built over tasks, and the ones shared with you.": "Přehledy, které jste vytvořili nad úkoly, a ty, které s vámi sdíleli.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Uložený dotaz nad úkoly: které projekty, které filtry, seskupení podle čeho, počet nebo součet, zobrazený jako tabulka nebo graf.", + "The name the report is listed under": "Název, pod kterým je přehled uveden", + "What the report shows and who it is for": "Co přehled ukazuje a pro koho je", + "Nextcloud user id of the person who saved the report": "ID uživatele Nextcloud, který přehled uložil", + "Who can open the report": "Kdo může přehled otevřít", + "Only me": "Jen já", + "Everyone who can read its projects": "Všichni, kdo mohou číst jeho projekty", + "The projects the report covers, at most fifty": "Projekty, které přehled zahrnuje, nejvýše padesát", + "Filters": "Filtry", + "Task fields and the value each must equal": "Pole úkolu a hodnota, které se každé musí rovnat", + "The task field the report groups on": "Pole úkolu, podle kterého přehled seskupuje", + "Count the tasks, or add up a number on them": "Spočítat úkoly, nebo sečíst číslo na nich", + "Sum": "Součet", + "Sum of": "Součet pole", + "The number added up when the measure is a sum": "Číslo, které se sčítá, když je míra součet", + "Story points": "Body příběhu", + "Estimated duration": "Odhadovaná doba", + "How the report is shown": "Jak se přehled zobrazuje", + "Issue type": "Typ požadavku", + "Task fields and the value each must equal; empty when the report covers every task": "Pole úkolu a hodnota, kterou musí každé mít; prázdné, když přehled zahrnuje všechny úkoly", + "The status a task must have": "Stav, který musí úkol mít", + "The priority a task must have": "Priorita, kterou musí úkol mít", + "The user a task must be assigned to": "Uživatel, kterému musí být úkol přidělen", + "A label a task must carry": "Štítek, který musí úkol mít", + "The board column a task must be in": "Sloupec tabule, ve kterém musí úkol být", + "The issue type a task must have": "Typ požadavku, který musí úkol mít", + "Manager groups": "Skupiny správců", + "Member groups": "Skupiny členů", + "Viewer groups": "Skupiny čtenářů", + "Viewers": "Čtenáři", + "Owning group": "Vlastnická skupina", + "Nextcloud groups whose members manage the project": "Skupiny Nextcloud, jejichž členové spravují projekt", + "Nextcloud groups whose members work on the project": "Skupiny Nextcloud, jejichž členové na projektu pracují", + "Nextcloud groups whose members may read the project": "Skupiny Nextcloud, jejichž členové mohou projekt číst", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Uživatelé Nextcloud, kteří spravují projekt: nastavení, členy a práci", + "Nextcloud user ids who may read the project and its work but not change it": "Uživatelé Nextcloud, kteří mohou číst projekt a jeho práci, ale ne měnit", + "The Nextcloud group that owns the project with its creator, at most one": "Skupina Nextcloud, která vlastní projekt spolu s jeho tvůrcem, nejvýše jedna", + "Nextcloud user ids who may read this through the project": "Uživatelé Nextcloud, kteří to mohou číst přes projekt", + "Nextcloud groups whose members may change this through the project": "Skupiny Nextcloud, jejichž členové to mohou měnit přes projekt", + "Nextcloud groups whose members may read this through the project": "Skupiny Nextcloud, jejichž členové to mohou číst přes projekt", + "Search for a person or a group…": "Hledat osobu nebo skupinu…", + "No one found. Your admin's sharing settings decide who you can find.": "Nikdo nenalezen. Nastavení sdílení vašeho správce určuje, koho můžete najít.", + "Type at least two characters": "Zadejte alespoň dva znaky", + "Everyone in this group": "Všichni v této skupině", + "Could not search for people. Please try again.": "Hledání osob se nezdařilo. Zkuste to znovu.", + "Could not remove the group": "Skupinu se nepodařilo odebrat", + "Only the owner and managers change who is on this project.": "Kdo je v tomto projektu, mění jen vlastník a správci.", + "Role of {name}": "Role: {name}", + "Manager": "Správce", + "Member": "Člen", + "Viewer": "Čtenář", + "Could not change the role": "Roli se nepodařilo změnit", + "Owned by group: {name}": "Ve vlastnictví skupiny: {name}", + "No group owns this project.": "Tento projekt nevlastní žádná skupina.", + "Owned by group": "Ve vlastnictví skupiny", + "Search for a group…": "Hledat skupinu…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Žádná skupina nenalezena. Nastavení sdílení vašeho správce určuje, které skupiny můžete najít.", + "No owning group": "Žádná vlastnická skupina", + "Could not search for groups. Please try again.": "Skupiny se nepodařilo vyhledat. Zkuste to znovu.", + "Could not change the owning group": "Vlastnickou skupinu se nepodařilo změnit", + "You can read this project. Only its members change it.": "Tento projekt můžete číst. Měnit ho mohou jen jeho členové.", + "Course": "Kurz", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurz, který se v této hodině vyučuje, například volitelný předmět, pokud ho školní výuková aplikace zná.", + "Online meeting link": "Odkaz na online hodinu", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kde se žáci k této hodině připojí online. Tlačítko Připojit se zobrazí jen u odkazu https." }, "plurals": null } diff --git a/l10n/da.js b/l10n/da.js index c2fdda9c..611a508a 100644 --- a/l10n/da.js +++ b/l10n/da.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktive projekter", + "Archived projects": "Arkiverede projekter", + "Boards": "Tavler", + "My projects": "Mine projekter", + "Portfolio": "Portefølje", + "Project board": "Projekttavle", + "Projects I am in": "Projekter jeg er med i", + "Timeline": "Tidslinje", + "Timesheet": "Timeseddel", + "Features & roadmap": "Funktioner og køreplan", + "Flow": "Flow", + "Flows": "Flows", + "Reports": "Rapporter", + "Pick a report to open it.": "Vælg en rapport for at åbne den.", + "In progress": "I gang", + "Date": "Dato", + "Due": "Forfalder", + "Assignee": "Tildelt", + "Who": "Hvem", + "What": "Hvad", + "Minutes": "Minutter", + "Entries": "Poster", + "Most recent": "Nyeste", + "Per person": "Per person", + "By status": "Efter status", + "By priority": "Efter prioritet", + "Task status": "Opgavestatus", + "Time spent": "Brugt tid", + "Capacity": "Kapacitet", + "Due soonest": "Forfalder først", + "Minutes logged": "Registrerede minutter", + "Nothing is due": "Intet forfalder", + "Nothing logged yet": "Intet registreret endnu", + "What is open, what is blocked, and what is overdue.": "Hvad er åbent, hvad er blokeret, og hvad er forsinket.", + "How allocation is spread across the people working on projects.": "Hvordan belastningen er fordelt mellem dem, der arbejder på projekter.", + "Hours logged, and the projects they went to.": "Registrerede timer og de projekter, de gik til.", + "Billable": "Fakturerbar", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Indlæser projekter", + "No projects for this client yet": "Ingen projekter for denne kunde endnu", + "Open in Planninq": "Åbn i Planninq", + "This project could not be found": "Dette projekt blev ikke fundet", + "Untitled project": "Projekt uden titel", + "and {count} more": "og {count} mere", + "Store": "Butik", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installer registre, skemaer og flows, som andre organisationer har udgivet.", + "Work Date": "Arbejdsdato", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Kolonnehandlinger", + "Columns": "Kolonner", + "Could not remove the column. Please try again.": "Kolonnen kunne ikke fjernes. Prøv igen.", + "Could not save the column. Please try again.": "Kolonnen kunne ikke gemmes. Prøv igen.", + "Done column": "Færdig-kolonne", + "Edit column": "Rediger kolonne", + "Keep the card's status": "Behold kortets status", + "Move its cards to": "Flyt dens kort til", + "Move left": "Flyt til venstre", + "Move right": "Flyt til højre", + "Status of cards moved here": "Status for kort flyttet hertil", + "The last done column cannot be removed.": "Den sidste færdig-kolonne kan ikke fjernes.", + "WIP limit": "WIP-grænse", + "over limit": "over grænsen", + "The status a card gets when it is moved into this column.": "Den status et kort får, når det flyttes til denne kolonne.", + "All priorities": "Alle prioriteter", + "Could not create the task. Please try again.": "Opgaven kunne ikke oprettes. Prøv igen.", + "Created": "Oprettet", + "Move to backlog": "Til backlog", + "Move to board": "Til tavlen", + "New task": "Ny opgave", + "Nothing in the backlog": "Intet i backloggen", + "Rank": "Rang", + "Sort by": "Sorter efter", + "Sort by rank to reorder": "Sorter efter rang for at ændre rækkefølgen", + "Task actions": "Opgavehandlinger", + "All labels": "Alle etiketter", + "Filter tasks by label": "Filtrer opgaver efter etiket", + "View timeline": "Vis tidslinje", + "Board": "Tavle", + "List": "Liste", + "Column": "Kolonne", + "Board or list": "Tavle eller liste", + "Log": "Log", + "Add entry": "Tilføj post", + "Show": "Vis", + "No actions yet": "Ingen handlinger endnu", + "Closed": "Lukket", + "Entry actions": "Posthandlinger", + "Add action": "Tilføj handling", + "by {author}": "af {author}", + "saved {time}": "gemt {time}", + "Attendees: {names}": "Deltagere: {names}", + "Add the first entry": "Tilføj den første post", + "Issues": "Problemer", + "Lessons learned": "Erfaringer", + "Meetings": "Møder", + "Decisions": "Beslutninger", + "Actions": "Handlinger", + "Issue": "Problem", + "Lesson learned": "Erfaring", + "Meeting": "Møde", + "Decision": "Beslutning", + "About this project": "Om dette projekt", + "No description yet": "Ingen beskrivelse endnu", + "Start date": "Startdato", + "Not set": "Ikke angivet", + "End date": "Slutdato", + "Progress": "Fremdrift", + "No tasks yet": "Ingen opgaver endnu", + "Open the board": "Åbn tavlen", + "People": "Personer", + "Owner": "Ejer", + "Latest log entries": "Seneste poster", + "Open the log": "Åbn loggen", + "{done} of {total} tasks done": "{done} af {total} opgaver udført", + "Edit entry": "Rediger post", + "Type": "Type", + "Attendees": "Deltagere", + "Issue is closed": "Problemet er lukket", + "Could not save the entry. Please try again.": "Posten kunne ikke gemmes. Prøv igen.", + "From: {title}": "Fra: {title}", + "What needs to happen": "Hvad der skal ske", + "Could not create the action. Please try again.": "Handlingen kunne ikke oprettes. Prøv igen.", + "The action was created but could not be linked to the entry.": "Handlingen blev oprettet, men kunne ikke knyttes til posten.", + "Project pages": "Projektsider", + "Overview": "Oversigt", + "Risks": "Risici", + "Log entry": "Logpost", + "A short name for the entry": "Et kort navn til posten", + "Project": "Projekt", + "The project this entry belongs to": "Det projekt, posten hører til", + "What kind of entry this is": "Hvilken slags post dette er", + "When it happened": "Hvornår det skete", + "What happened, in Markdown": "Hvad der skete, i Markdown", + "Whether an issue is still open": "Om et problem stadig er åbent", + "The people at a meeting": "Personerne ved et møde", + "Tasks that came out of this entry": "Opgaver, der kom ud af denne post", + "Add risk": "Tilføj risiko", + "Risk": "Risiko", + "Score": "Score", + "Response": "Håndtering", + "Review date": "Revisionsdato", + "no longer on the project": "er ikke længere med i projektet", + "Edit {title}": "Rediger {title}", + "No risks recorded yet": "Ingen risici registreret endnu", + "Add the first risk": "Tilføj den første risiko", + "Medium": "Mellem", + "Mitigating": "Afbødes", + "Occurred": "Indtruffet", + "Avoid": "Undgå", + "Reduce": "Reducere", + "Transfer": "Overføre", + "Accept": "Acceptere", + "Highest open risks": "Højeste åbne risici", + "No open risks": "Ingen åbne risici", + "Open the risk register": "Åbn risikoregistret", + "Edit risk": "Rediger risiko", + "What could go wrong": "Hvad der kan gå galt", + "Likelihood": "Sandsynlighed", + "Impact": "Konsekvens", + "Score {score}": "Score {score}", + "Countermeasures": "Modforanstaltninger", + "Could not save the risk. Please try again.": "Risikoen kunne ikke gemmes. Prøv igen.", + "Risks by likelihood and impact": "Risici efter sandsynlighed og konsekvens", + "Risk scale": "Risikoskala", + "The levels every project scores its risks on, and where low turns into medium and high": "De niveauer, hvert projekt scorer sine risici på, og hvor lav går over i mellem og høj", + "Number of levels": "Antal niveauer", + "Likelihood labels": "Etiketter for sandsynlighed", + "Impact labels": "Etiketter for konsekvens", + "Level {level}": "Niveau {level}", + "Medium from score": "Mellem fra score", + "High from score": "Høj fra score", + "Risk scale saved": "Risikoskala gemt", + "1 risk uses level {level}. Change it first.": "1 risiko bruger niveau {level}. Ret den først.", + "{count} risks use level {level}. Change them first.": "{count} risici bruger niveau {level}. Ret dem først.", + "Every level needs a label, and high must start above medium.": "Hvert niveau skal have en etiket, og høj skal starte over mellem.", + "The project this risk belongs to": "Det projekt, risikoen hører til", + "The cause and the effect, in Markdown": "Årsag og virkning, i Markdown", + "Category": "Kategori", + "A free grouping, such as planning, budget or supplier": "En fri gruppering, fx planlægning, budget eller leverandør", + "How likely it is, on the admin's risk scale": "Hvor sandsynligt det er, på administratorens risikoskala", + "How hard it would hit, on the admin's risk scale": "Hvor hårdt det ville ramme, på administratorens risikoskala", + "Likelihood times impact, calculated by the server": "Sandsynlighed gange konsekvens, beregnet af serveren", + "Where the risk stands": "Hvor risikoen står", + "The person who watches this risk": "Den person, der holder øje med risikoen", + "How the project answers the risk": "Hvordan projektet håndterer risikoen", + "What is done to prevent it or soften it, in Markdown": "Hvad der gøres for at forhindre eller mildne den, i Markdown", + "When to look at this risk again": "Hvornår risikoen skal ses på igen", + "Very low": "Meget lav", + "Very high": "Meget høj", + "All projects": "Alle projekter", + "Project status report": "Projektstatusrapport", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "En dateret rapport om, hvordan et projekt står med penge, organisation, tid, information, kvalitet og risiko (GROTIK-aspekterne), hver med en note.", + "The project this report is about": "Projektet, som rapporten handler om", + "Report date": "Rapportdato", + "The day the report describes": "Den dag, rapporten beskriver", + "Money": "Penge", + "How the project stands on this aspect": "Hvordan projektet står på dette aspekt", + "On track": "På sporet", + "At risk": "I risiko", + "Off track": "Af sporet", + "Money note": "Note om penge", + "A short explanation of this status": "En kort forklaring på denne status", + "Organisation": "Organisation", + "Organisation note": "Note om organisation", + "Time": "Tid", + "Time note": "Note om tid", + "Information": "Information", + "Information note": "Note om information", + "Quality": "Kvalitet", + "Quality note": "Note om kvalitet", + "Risk note": "Note om risiko", + "Overall": "Samlet", + "The worst of the six statuses, calculated by the server": "Den dårligste af de seks statusser, beregnet af serveren", + "Health: money": "Tilstand: penge", + "Copied from the newest status report": "Kopieret fra den nyeste statusrapport", + "Health: organisation": "Tilstand: organisation", + "Health: time": "Tilstand: tid", + "Health: information": "Tilstand: information", + "Health: quality": "Tilstand: kvalitet", + "Health: risk": "Tilstand: risiko", + "Health: overall": "Tilstand: samlet", + "Health: report date": "Tilstand: rapportdato", + "The date of the newest status report": "Datoen for den nyeste statusrapport", + "New report": "Ny rapport", + "Only the project owner writes status reports.": "Kun projektets ejer skriver statusrapporter.", + "Latest report, {date}": "Seneste rapport, {date}", + "Aspect": "Aspekt", + "Note": "Note", + "Report history": "Rapporthistorik", + "Author": "Forfatter", + "No status reports yet": "Ingen statusrapporter endnu", + "Write the first report": "Skriv den første rapport", + "Choose a status for every aspect to save the report.": "Vælg en status for hvert aspekt for at gemme rapporten.", + "Suggested: on track.": "Forslag: på sporet.", + "Suggested: at risk.": "Forslag: i risiko.", + "Suggested: off track.": "Forslag: af sporet.", + "1 task is past its due date.": "1 opgave er over sin frist.", + "{count} tasks are past their due date.": "{count} opgaver er over deres frist.", + "The end date has passed with 1 open task.": "Slutdatoen er passeret med 1 åben opgave.", + "The end date has passed with {count} open tasks.": "Slutdatoen er passeret med {count} åbne opgaver.", + "No open task is past its due date.": "Ingen åben opgave er over sin frist.", + "The highest open risk, \"{title}\", scores {score}.": "Den højeste åbne risiko, \"{title}\", scorer {score}.", + "There are no open risks.": "Der er ingen åbne risici.", + "Costs are at {percent}% of the budget.": "Omkostningerne er på {percent}% af budgettet.", + "No suggestion: the project has no budget.": "Intet forslag: projektet har intet budget.", + "No suggestion: no costs are recorded for this project yet.": "Intet forslag: der er endnu ikke registreret omkostninger for dette projekt.", + "The report was not saved. Only the project owner can write status reports.": "Rapporten blev ikke gemt. Kun projektets ejer kan skrive statusrapporter.", + "No report": "Ingen rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "En gruppe projekter, der drives af de samme personer, for eksempel en afdeling eller et program. Dens ansvarlige læser alle projekter i den.", + "The name of the portfolio": "Porteføljens navn", + "What the portfolio holds and who runs it": "Hvad porteføljen rummer, og hvem der driver den", + "A colour for the portfolio's section in project lists": "En farve til porteføljens afsnit i projektlister", + "Managers": "Ansvarlige", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-bruger-id'er for de personer, der driver porteføljen", + "Order": "Rækkefølge", + "Where the portfolio comes in project lists, lowest first": "Hvor porteføljen står i projektlister, laveste først", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Porteføljens egen risikoskala som JSON, i samme form som den for hele appen. Tom betyder skalaen for hele appen.", + "Portfolio readers": "Porteføljelæsere", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-bruger-id'er for de ansvarlige for projektets portefølje", + "The portfolio this project belongs to": "Den portefølje, projektet hører til", + "No portfolio": "Ingen portefølje", + "All portfolios": "Alle porteføljer", + "You read this project as a manager of its portfolio. Only its members change it.": "Du læser dette projekt som ansvarlig for dets portefølje. Kun medlemmerne ændrer det.", + "Portfolios": "Porteføljer", + "Portfolio status": "Porteføljestatus", + "No portfolios yet": "Ingen porteføljer endnu", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "En administrator tilføjer porteføljer under Projekter, Porteføljer. Projekter i en portefølje vises her med deres status.", + "Roll-up": "Opsummering", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} på sporet, {atRisk} i risiko, {offTrack} ude af sporet, {noReport} uden rapport", + "No project in this portfolio that you can read.": "Intet projekt i denne portefølje, som du kan læse.", + "Start": "Start", + "End": "Slut", + "Budget": "Budget", + "Last report": "Seneste rapport", + "Out of date": "Forældet", + "Portfolio timeline": "Porteføljetidslinje", + "Zoom": "Zoom", + "Could not load the timeline": "Tidslinjen kunne ikke indlæses", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "En administrator tilføjer porteføljer under Projekter, Porteføljer. Projekter i en portefølje vises her på én tidslinje.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Åbn et projekt for at se dets faser og opgaver. Tidslinjen er skrivebeskyttet.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Udeladt, fordi du ikke kan læse dem: {count} projekter", + "Week": "Uge", + "Day": "Dag", + "Month": "Måned", + "Please try again later.": "Prøv igen senere.", + "Status reports": "Statusrapporter", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Efter hvor mange dage et projekts seneste statusrapport markeres som forældet i porteføljeoversigten", + "Reporting period (days)": "Rapporteringsperiode (dage)", + "The reporting period is a whole number of days from 1 to 365.": "Rapporteringsperioden er et helt antal dage fra 1 til 365.", + "Reporting period saved": "Rapporteringsperiode gemt", + "The reporting period was not saved. Please try again.": "Rapporteringsperioden blev ikke gemt. Prøv igen.", + "Every project of a portfolio with its status per aspect, rolled up.": "Hvert projekt i en portefølje med status pr. aspekt, opsummeret.", + "The projects of a portfolio on one timeline.": "Projekterne i en portefølje på én tidslinje.", + "Phases": "Faser", + "Add phase": "Tilføj fase", + "No phases yet": "Ingen faser endnu", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Del projektet op i faser, fx initiering, definition og udførelse. En fase lukkes, når dens afsluttende dokument er uploadet.", + "{hours} hours": "{hours} timer", + "Concluding document: {title}": "Afsluttende dokument: {title}", + "Concluding document missing": "Afsluttende dokument mangler", + "Move {title} up": "Flyt {title} op", + "Move {title} down": "Flyt {title} ned", + "Close phase": "Luk fase", + "Phase": "Fase", + "Files": "Filer", + "Notes": "Noter", + "Audit trail": "Revisionsspor", + "Edit phase": "Rediger fase", + "Name": "Navn", + "Budget hours": "Budgettimer", + "Could not save the phase. Please try again.": "Fasen kunne ikke gemmes. Prøv igen.", + "Close phase {title}": "Luk fasen {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "En fase lukkes med sit afsluttende dokument: upload det her, eller vælg en af fasens filer.", + "Concluding document": "Afsluttende dokument", + "This phase has no files yet.": "Denne fase har ingen filer endnu.", + "Upload a document": "Upload et dokument", + "The document was not uploaded. Please try again.": "Dokumentet blev ikke uploadet. Prøv igen.", + "Upload the concluding document before you close this phase.": "Upload det afsluttende dokument, før du lukker denne fase.", + "This phase cannot be closed from its current status.": "Denne fase kan ikke lukkes fra sin nuværende status.", + "The phase was not closed. Please try again.": "Fasen blev ikke lukket. Prøv igen.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Id'et for filen på denne fase, der afslutter den. Fasen kan først fuldføres, når det er angivet og filen er vedhæftet.", + "Import from Microsoft Project": "Importér fra Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Vælg en plan, der er gemt fra Microsoft Project i XML-format. Intet importeres, før du bekræfter.", + "Plan file": "Planfil", + "What the import creates": "Hvad importen opretter", + "Tasks": "Opgaver", + "Sub-tasks": "Underopgaver", + "Milestones": "Milepæle", + "Links": "Kæder", + "Already imported, updated in place: {count}": "Allerede importeret, opdateret på stedet: {count}", + "What does not carry over": "Hvad der ikke overføres", + "Tasks with resources, which are not imported: {count}": "Opgaver med ressourcer, som ikke importeres: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Opgaver dybere end niveau 3, placeret under deres opgave på niveau 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Kæder ud over slut-til-start, importeret som relaterede kæder: {count}", + "Link lags, which are dropped: {count}": "Forsinkelser på kæder, som udelades: {count}", + "Links to a summary task, which are not imported: {count}": "Kæder til en sammenfatningsopgave, som ikke importeres: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Kæder til opgaver uden for denne plan, som ikke importeres: {count}", + "No longer in the plan": "Ikke længere i planen", + "These stay in the project; remove them yourself if they are no longer needed.": "De bliver i projektet; fjern dem selv, hvis de ikke længere er nødvendige.", + "Import": "Importér", + "Close": "Luk", + "The plan is imported: {created} created, {updated} updated.": "Planen er importeret: {created} oprettet, {updated} opdateret.", + "Links that would close a loop were left out: {count}": "Kæder, der ville danne en løkke, er udeladt: {count}", + "The import stopped part-way. Run it again to finish it.": "Importen stoppede undervejs. Kør den igen for at gøre den færdig.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Gem planen i Microsoft Project med Filer, Gem som, XML-format, og importér den fil.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Denne fil erklærer en DOCTYPE eller entiteter, som ikke accepteres.", + "The file is larger than 10 MB.": "Filen er større end 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Planen har mere end 2.000 opgaver, flere end én import kan tage.", + "This file is not a Microsoft Project plan in XML format.": "Denne fil er ikke en Microsoft Project-plan i XML-format.", + "Choose a file to import.": "Vælg en fil at importere.", + "Only the project owner can import a plan.": "Kun projektets ejer kan importere en plan.", + "The plan could not be read. Please try again.": "Planen kunne ikke læses. Prøv igen.", + "Linked case: {title}": "Tilknyttet sag: {title}", + "Linked to a case": "Tilknyttet en sag", + "Hand over to case": "Overdrag til sag", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopierer hver fil på projektet og dets opgaver samt en fil, der beskriver projektet, uændret til den tilknyttede sag.", + "{date} by {user}": "{date} af {user}", + "Files copied: {count}": "Kopierede filer: {count}", + "Files that failed: {names}": "Filer, der fejlede: {names}", + "The handover failed. Please try again.": "Overdragelsen mislykkedes. Prøv igen.", + "The linked case could not be found, or you cannot open it.": "Den tilknyttede sag blev ikke fundet, eller du kan ikke åbne den.", + "Case handovers": "Overdragelser til sagen", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Hver gang projektets filer og metadata blev overdraget til sagen: hvornår, af hvem, til hvilken sag, hver kopieret fil med dens SHA-256 og de filer, der fejlede.", + "Finance": "Økonomi", + "Add cost line": "Tilføj omkostningslinje", + "Delivery terms": "Leveringsbetingelser", + "Billing model": "Faktureringsmodel", + "Budget in euro": "Budget i euro", + "Budget in hours": "Budget i timer", + "Hourly rate in euro": "Timepris i euro", + "Planned start": "Planlagt start", + "Planned end": "Planlagt slut", + "Planned dates": "Planlagte datoer", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Intet budget aftalt", + "Hours": "Timer", + "Only the project owner and the portfolio managers see the amounts.": "Kun projektejeren og porteføljelederne ser beløbene.", + "Budget against cost per category": "Budget mod omkostninger pr. kategori", + "Labour (booked time)": "Arbejde (registreret tid)", + "No category": "Ingen kategori", + "Hours are not available": "Timerne er ikke tilgængelige", + "Not yet assigned to a category": "Endnu ikke tildelt en kategori", + "Total": "I alt", + "{spent} spent, {remaining} remaining": "{spent} brugt, {remaining} tilbage", + "Budget against cost per phase": "Budget mod omkostninger pr. fase", + "No phase": "Ingen fase", + "Cost lines": "Omkostningslinjer", + "From the finance system": "Fra økonomisystemet", + "Edit cost line {amount}": "Rediger omkostningslinjen {amount}", + "No cost lines yet": "Ingen omkostningslinjer endnu", + "Commitments": "Forpligtelser", + "Actual cost": "Faktiske omkostninger", + "Forecast": "Prognose", + "Remaining": "Tilbage", + "Not planned yet": "Endnu ikke planlagt", + "{start} to {end}": "{start} til {end}", + "The terms were not saved. Please try again.": "Betingelserne blev ikke gemt. Prøv igen.", + "Terms saved": "Betingelser gemt", + "Fixed price": "Fast pris", + "Hourly": "Pr. time", + "Not billed": "Faktureres ikke", + "Commitment": "Forpligtelse", + "Edit cost line": "Rediger omkostningslinje", + "Kind": "Type", + "Amount in euro": "Beløb i euro", + "Remove": "Fjern", + "Could not save the cost line. Only the project owner changes the money of a project.": "Omkostningslinjen kunne ikke gemmes. Kun projektejeren ændrer et projekts penge.", + "Could not remove the cost line. Please try again.": "Omkostningslinjen kunne ikke fjernes. Prøv igen.", + "{amount} over budget": "{amount} over budget", + "Cost categories": "Omkostningskategorier", + "The categories every project splits its budget and costs into, one per line": "Kategorierne som hvert projekt fordeler sit budget og sine omkostninger på, én pr. linje", + "Categories": "Kategorier", + "Give at least one category, each name once.": "Angiv mindst én kategori, hvert navn én gang.", + "Cost categories saved": "Omkostningskategorier gemt", + "The cost categories were not saved. Please try again.": "Omkostningskategorierne blev ikke gemt. Prøv igen.", + "Finance line": "Økonomilinje", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Et pengebeløb på et projekt: et budget, en forpligtelse, en faktisk omkostning eller en prognose, i en omkostningskategori og eventuelt en fase. Indtastet af projektejeren eller sendt af økonomisystemet via integrationsappen.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projektet, beløbet hører til. Tomt for en linje fra økonomisystemet, hvis projektnummer ikke passer til noget projekt.", + "The phase this amount belongs to, if any": "Fasen, beløbet hører til, hvis nogen", + "The cost category, one of the categories the admin set up": "Omkostningskategorien, en af de kategorier administratoren har oprettet", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Om beløbet er et budget, en forpligtelse, en faktisk omkostning eller en prognose", + "Amount": "Beløb", + "The amount in the reporting currency (euro)": "Beløbet i rapporteringsvalutaen (euro)", + "The date the amount was booked or is expected": "Datoen, hvor beløbet blev bogført eller forventes", + "What the amount is for": "Hvad beløbet er til", + "Whether a person entered the line or the finance system sent it": "Om en person indtastede linjen, eller økonomisystemet sendte den", + "Entered by hand": "Indtastet manuelt", + "Finance line id": "Økonomilinjens id", + "The finance system's own id of this line. One imported line per id.": "Linjens eget id i økonomisystemet. Én importeret linje pr. id.", + "Project number": "Projektnummer", + "The project number the finance system sent, matched against the project key": "Projektnummeret fra økonomisystemet, sammenholdt med projektnøglen", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Porteføljen for linjens projekt, kopieret fra projektet, så porteføljetotaler kræver ét filter", + "Finance readers": "Økonomilæsere", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-bruger-UID'er for de personer, der må se beløbet: projektejeren og porteføljens ledere", + "Project owner": "Projektejer", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-bruger-UID for projektejeren, der må ændre og fjerne manuelle linjer", + "How the client pays: not billed, a fixed price, or by the hour.": "Hvordan kunden betaler: ikke faktureret, fast pris eller pr. time.", + "Portfolio finance": "Porteføljeøkonomi", + "You cannot see the money of any project in this portfolio": "Du kan ikke se pengene for noget projekt i denne portefølje", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serveren returnerede omkostningslinjer fra projekter uden for denne portefølje, så disse totaler kan være forkerte.", + "Projects left out because you cannot see their money: {count}": "Projekter udeladt, fordi du ikke kan se deres penge: {count}", + "Unmatched finance lines": "Ikke-matchede økonomilinjer", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, forpligtelser, faktiske omkostninger og prognose lagt sammen for en portefølje.", + "Subprojects": "Delprojekter", + "{done} of {total}": "{done} af {total}", + "{done} of {total} tasks done, including subprojects": "{done} af {total} opgaver udført, inklusive delprojekter", + "Show the subprojects of {title}": "Vis delprojekterne under {title}", + "Hide the subprojects of {title}": "Skjul delprojekterne under {title}", + "Part of": "Del af", + "No parent project": "Intet overordnet projekt", + "A project cannot sit under one of its own subprojects.": "Et projekt kan ikke ligge under et af sine egne delprojekter.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekter kan højst ligge tre niveauer dybt: program, projekt og delprojekt.", + "Parent project": "Overordnet projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projektet, som dette projekt ligger under, fx et program. Projekter kan højst ligge tre niveauer dybt.", + "Yes": "Ja", + "No": "Nej", + "{label} (required)": "{label} (påkrævet)", + "{label} is required": "{label} er påkrævet", + "Project field": "Projektfelt", + "A field an admin adds to every project, such as a policy area or a contract value.": "Et felt, som en administrator tilføjer til alle projekter, fx et politikområde eller en kontraktværdi.", + "Key": "Nøgle", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Det faste navn, værdien gemmes under, i lower camel case. Behold det, når projekter bruger det.", + "Label": "Etiket", + "The name people see next to the field": "Navnet, folk ser ved feltet", + "What the field holds": "Hvad feltet indeholder", + "Text": "Tekst", + "Number": "Tal", + "Choice": "Valg", + "Person": "Person", + "Yes or no": "Ja eller nej", + "Options": "Muligheder", + "The choices of a choice field": "Mulighederne i et valgfelt", + "Required": "Påkrævet", + "Whether a project must fill in the field": "Om et projekt skal udfylde feltet", + "Where the field appears, lowest first": "Hvor feltet vises, laveste først", + "Applies to": "Gælder for", + "What the field is added to": "Hvad feltet tilføjes til", + "Custom fields": "Egne felter", + "The values of the project fields an admin defined, keyed by the field's key.": "Værdierne af de projektfelter, en administrator har oprettet, efter feltets nøgle.", + "Project fields": "Projektfelter", + "Related": "Relaterede", + "Remove link": "Fjern link", + "Link type": "Linktype", + "Relates to": "Relaterer til", + "Duplicates": "Duplikerer", + "Project key": "Projektnøgle", + "Every task number starts with it, such as VERG-42.": "Hvert opgavenummer begynder med den, fx VERG-42.", + "This key is already used by another project.": "Denne nøgle bruges allerede af et andet projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Brug 2 til 10 bogstaver og cifre, der begynder med et bogstav.", + "The key cannot change once tasks carry it.": "Nøglen kan ikke ændres, når opgaver bærer den.", + "Project saved. The existing tasks get their numbers in the background.": "Projektet er gemt. De eksisterende opgaver får deres numre i baggrunden.", + "Next task number": "Næste opgavenummer", + "The number the next task of this project gets in its key. Only the system writes it.": "Det nummer, den næste opgave i dette projekt får i sin nøgle. Kun systemet skriver det.", + "Restore {title}": "Gendan {title}", + "Restore": "Gendan", + "Project restored": "Projektet er gendannet", + "Could not restore the project": "Projektet kunne ikke gendannes", + "Bring this project back to the active list.": "Flyt projektet tilbage til listen over aktive projekter.", + "Restore project": "Gendan projekt", + "Request reason": "Begrundelse for anmodningen", + "Why the requester needs this project. Filled in when the project is requested.": "Hvorfor ansøgeren har brug for projektet. Udfyldes ved anmodningen.", + "Reviewed by": "Gennemgået af", + "The user who approved or rejected the request.": "Brugeren, der godkendte eller afviste anmodningen.", + "Reviewed at": "Gennemgået den", + "When the request was approved or rejected.": "Hvornår anmodningen blev godkendt eller afvist.", + "Review note": "Bemærkning fra gennemgangen", + "The reviewer's reason, shown to the requester when a request is not approved.": "Begrundelsen fra den, der gennemgik, som ansøgeren ser, når en anmodning ikke godkendes.", + "Members of these groups": "Medlemmer af disse grupper", + "Groups that may create projects": "Grupper, der må oprette projekter", + "The group {group} no longer exists. Save to remove it.": "Gruppen {group} findes ikke længere. Gem for at fjerne den.", + "Review project request": "Gennemgå projektanmodning", + "Requested by": "Anmodet af", + "Why it is needed": "Hvorfor det er nødvendigt", + "Desired start date": "Ønsket startdato", + "Why is it not approved?": "Hvorfor godkendes det ikke?", + "Give a reason. The requester sees it.": "Angiv en begrundelse. Ansøgeren kan se den.", + "Approve": "Godkend", + "Reject": "Afvis", + "Reject request": "Afvis anmodning", + "The review was not saved. Try again.": "Gennemgangen blev ikke gemt. Prøv igen.", + "This project is waiting for review": "Projektet venter på gennemgang", + "This request was not approved": "Anmodningen blev ikke godkendt", + "Reason: {note}": "Begrundelse: {note}", + "Review request": "Gennemgå anmodning", + "Request a project": "Anmod om et projekt", + "Step {step} of 2": "Trin {step} af 2", + "Why is this project needed?": "Hvorfor er projektet nødvendigt?", + "Give a reason. The reviewer reads it.": "Angiv en begrundelse. Den, der gennemgår, læser den.", + "Back": "Tilbage", + "Next": "Næste", + "Send request": "Send anmodning", + "The request was not sent. Try again.": "Anmodningen blev ikke sendt. Prøv igen.", + "Requested": "Anmodet", + "Not approved": "Ikke godkendt", + "Your request was sent": "Din anmodning er sendt", + "Let everyone else request a project": "Lad alle andre anmode om et projekt", + "Add a task": "Tilføj en opgave", + "Delete task": "Slet opgave", + "Edit task": "Rediger opgave", + "Write": "Skriv", + "Preview": "Forhåndsvisning", + "Markdown works here: headings, lists and links.": "Markdown virker her: overskrifter, lister og links.", + "Could not save the task. Please try again.": "Opgaven kunne ikke gemmes. Prøv igen.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Der er registreret tid på \"{title}\", så den kan ikke slettes. Du kan annullere den i stedet: tidsregistreringerne bevares.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Slet \"{title}\"? Dens links til andre opgaver fjernes også. Dette kan ikke fortrydes.", + "Keep task": "Behold opgave", + "Cancel task": "Annuller opgave", + "Only the reporter, the project owner or an admin can delete this task.": "Kun den der oprettede den, projektejeren eller en administrator kan slette denne opgave.", + "Could not delete the task. Please try again.": "Opgaven kunne ikke slettes. Prøv igen.", + "Could not cancel the task. Please try again.": "Opgaven kunne ikke annulleres. Prøv igen.", + "Responsible": "Ansvarlig", + "Also working on this": "Arbejder også på dette", + "Labels": "Etiketter", + "Could not change the priority. Please try again.": "Prioriteten kunne ikke ændres. Prøv igen.", + "Other project members who work on this task alongside the person responsible.": "Andre projektmedlemmer, der arbejder på opgaven sammen med den ansvarlige.", + "Duplicate": "Dupliker", + "Could not copy the task. Please try again.": "Opgaven kunne ikke kopieres. Prøv igen.", + "Subtasks": "Underopgaver", + "{done} of {total} done": "{done} af {total} færdige", + "Add a subtask": "Tilføj en underopgave", + "Checklist": "Tjekliste", + "Checklist item actions": "Handlinger for tjeklistepunkt", + "Add a checklist item": "Tilføj et tjeklistepunkt", + "Subtasks: {estimate} estimated, {logged} logged": "Underopgaver: {estimate} estimeret, {logged} registreret", + "Total estimate: {total}": "Samlet estimat: {total}", + "Part of {title}": "Del af {title}", + "Checklist: {count} done": "Tjekliste: {count} færdige", + "This task has subtasks: {count}.": "Denne opgave har underopgaver: {count}.", + "Keep subtasks as separate tasks": "Behold underopgaver som separate opgaver", + "Delete subtasks too": "Slet også underopgaver", + "Copy of {title}": "Kopi af {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Opgaven blev kopieret, men ikke alle dens underopgaver. Tjek kopien.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Små trin i opgaven. Hvert punkt har et id, en tekst og om det er færdigt.", + "Open work per person and per project.": "Åbent arbejde pr. person og pr. projekt.", + "View": "Visning", + "By person": "Pr. person", + "By project": "Pr. projekt", + "Hours left": "Timer tilbage", + "Tasks without an estimate": "Opgaver uden estimat", + "Due in 14 days": "Forfalder inden for 14 dage", + "Shared": "Delt", + "Unassigned": "Ikke tildelt", + "{hours} h": "{hours} t", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Viser arbejde i de projekter, du kan se. Timer tæller for den ansvarlige; delte opgaver tælles uden timer.", + "No open work in these projects.": "Intet åbent arbejde i disse projekter.", + "Open work": "Åbent arbejde", + "{count} open tasks": "{count} åbne opgaver", + "Create a project to see capacity here.": "Opret et projekt for at se kapaciteten her.", + "My tasks": "Mine opgaver", + "Show all my tasks": "Vis alle mine opgaver", + "No tasks assigned to you": "Du har ingen tildelte opgaver", + "Browse projects": "Gennemse projekter", + "Later": "Senere", + "Due {date}": "Forfalder {date}", + "Could not change the status. Please try again.": "Status kunne ikke ændres. Prøv igen.", + "Completed today": "Fuldført i dag", + "My open tasks": "Mine åbne opgaver", + "My overdue tasks": "Mine forfaldne opgaver", + "My tasks in progress": "Mine opgaver i gang", + "Pin to the top": "Fastgør øverst", + "Unpin": "Frigør", + "Pinned": "Fastgjort", + "Actions for {title}": "Handlinger for {title}", + "Could not save your project order. Please try again.": "Din projektrækkefølge kunne ikke gemmes. Prøv igen.", + "No boards yet": "Ingen tavler endnu", + "Create a project to get a board.": "Opret et projekt for at få en tavle.", + "Use the Projects page to create and manage your projects and tasks.": "Brug siden Projekter til at oprette og administrere dine projekter og opgaver.", + "Go to projects": "Gå til projekter", + "You are not a member of any projects yet.": "Du er endnu ikke medlem af noget projekt.", + "Could not search for users. Please try again.": "Brugere kunne ikke søges. Prøv igen.", + "Project creation is restricted to administrators.": "Kun administratorer kan oprette projekter.", + "Only the project owner or an administrator can delete this project.": "Kun projektejeren eller en administrator kan slette dette projekt.", + "No projects are available to you yet. Ask an administrator to create one.": "Der er endnu ingen projekter tilgængelige for dig. Bed en administrator om at oprette et.", + "Due: {date}": "Forfalder: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Opgaver med en start- eller forfaldsdato vises på tidslinjen. Tilføj datoer for at se dem her.", + "You do not have access to this project.": "Du har ikke adgang til dette projekt.", + "Zoom level": "Zoomniveau", + "Unscheduled": "Ikke planlagt", + "Start: {date}": "Start: {date}", + "Today": "I dag", + "No scheduled tasks": "Ingen planlagte opgaver", + "An unexpected error occurred.": "Der opstod en uventet fejl.", + "Column {number} name": "Navn på kolonne {number}", + "Failed to save creation policy": "Oprettelsespolitikken kunne ikke gemmes", + "All authenticated users": "Alle godkendte brugere", + "Control who may create new projects": "Styr hvem der må oprette nye projekter", + "Administrators only": "Kun administratorer", + "Project creation": "Oprettelse af projekter", + "Allow project creation": "Tillad oprettelse af projekter", + "Creation policy saved successfully": "Oprettelsespolitik gemt", + "Initializing…": "Starter…", + "e.g. 2h 30m, 90m, 1.5h": "f.eks. 2h 30m, 90m, 1.5h", + "Log time": "Registrer tid", + "Save estimate": "Gem estimat", + "Logged: {logged}": "Registreret: {logged}", + "over by {amount}": "{amount} over", + "Time tracking": "Tidsregistrering", + "Estimate": "Estimat", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Angiv et gyldigt estimat (f.eks. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Angiv en gyldig varighed (f.eks. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Tidsregistreringen kunne ikke gemmes. Prøv igen.", + "Edit time entry": "Rediger tidsregistrering", + "Duration": "Varighed", + "Date range": "Periode", + "Last week": "Sidste uge", + "No time logged": "Ingen tid registreret", + "Log time on a task to see it here.": "Registrer tid på en opgave for at se den her.", + "To date": "Til dato", + "This week": "Denne uge", + "Total: {total}": "I alt: {total}", + "From date": "Fra dato", + "Custom range": "Egen periode", + "All time": "Hele perioden", + "Could not delete a task, so some data may remain. Try deleting the project again.": "En opgave kunne ikke slettes, så der kan være data tilbage. Slet projektet igen.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "En tidsregistrering kunne ikke slettes, så der kan være data tilbage. Slet projektet igen.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "En kolonne kunne ikke slettes, så der kan være data tilbage. Slet projektet igen.", + "Could not delete the project. Please try again.": "Projektet kunne ikke slettes. Prøv igen.", + "Notification settings": "Notifikationsindstillinger", + "Configure when due-date reminders are sent": "Angiv hvornår påmindelser om forfaldsdatoer sendes", + "Due-date reminder lead time (hours)": "Varsel for påmindelse om forfaldsdato (timer)", + "Lead time must be between 1 and 336 hours": "Varslet skal være mellem 1 og 336 timer", + "Reminder lead time saved successfully": "Varsel for påmindelse gemt", + "Failed to save reminder lead time": "Varslet for påmindelsen kunne ikke gemmes", + "Notifications": "Notifikationer", + "Notify me 1 day before a task's due date": "Giv mig besked 1 dag før en opgaves forfaldsdato", + "Draft": "Kladde", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Om lektionen er en kladde, som kun læreren ser, gennemføres eller er aflyst.", + "New release": "Ny udgivelse", + "Roadmap chart. The same releases and epics are listed below.": "Køreplansdiagram. De samme udgivelser og epics står i listen nedenfor.", + "Nothing on the roadmap yet": "Intet på køreplanen endnu", + "Releases with a target date and epics with dated tasks appear here.": "Udgivelser med en måldato og epics med daterede opgaver vises her.", + "Releases": "Udgivelser", + "No releases yet": "Ingen udgivelser endnu", + "Target date: {date}": "Måldato: {date}", + "No target date": "Ingen måldato", + "Edit {name}": "Rediger {name}", + "Mark {name} as released": "Markér {name} som udgivet", + "Mark as released": "Markér som udgivet", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Ingen epics endnu. Åbn en opgave for at gøre den til en epic.", + "Not scheduled yet": "Ikke planlagt endnu", + "Planned": "Planlagt", + "Released": "Udgivet", + "Edit release": "Rediger udgivelse", + "Target date": "Måldato", + "Could not save the release. Please try again.": "Udgivelsen kunne ikke gemmes. Prøv igen.", + "Every task of this release is done or cancelled.": "Alle opgaver i denne udgivelse er færdige eller annulleret.", + "Not finished yet: {count}": "Ikke færdige endnu: {count}", + "What happens to these tasks?": "Hvad sker der med disse opgaver?", + "Move to {name}": "Flyt til {name}", + "Remove the release": "Fjern udgivelsen", + "Keep it on {name}": "Behold dem på {name}", + "Could not mark the release as released. Please try again.": "Udgivelsen kunne ikke markeres som udgivet. Prøv igen.", + "Roadmap": "Køreplan", + "Tasks or roadmap": "Opgaver eller køreplan", + "Release": "Udgivelse", + "Epic": "Epic", + "This task is an epic": "Denne opgave er en epic", + "A named, dated delivery of a project that its tasks are planned against.": "En navngiven, dateret leverance fra et projekt, som projektets opgaver planlægges mod.", + "Name of the release": "Udgivelsens navn", + "The project this release belongs to": "Det projekt, udgivelsen hører til", + "What this release delivers": "Hvad udgivelsen leverer", + "When work on the release starts": "Hvornår arbejdet på udgivelsen starter", + "The date the release is due": "Datoen, hvor udgivelsen skal være klar", + "Whether the release is planned, released or archived": "Om udgivelsen er planlagt, udgivet eller arkiveret", + "Released on": "Udgivet den", + "When the release was marked as released": "Hvornår udgivelsen blev markeret som udgivet", + "The release this task is planned for": "Den udgivelse, opgaven er planlagt til", + "Board view options": "Visningsindstillinger for tavlen", + "Colour cards": "Farv kort", + "No colour": "Ingen farve", + "By label": "Efter etiket", + "Swimlanes": "Svømmebaner", + "No swimlanes": "Ingen svømmebaner", + "By assignee": "Efter ansvarlig", + "By epic": "Efter epic", + "No assignee": "Ikke tildelt", + "No epic": "Intet epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kort bliver i deres epic-række. Skift epic på opgavesiden.", + "Hand over to": "Overdrag til", + "Could not save your board view. It applies until you reload.": "Din tavlevisning kunne ikke gemmes. Den gælder, indtil du genindlæser.", + "Timetable wish": "Skemaønske", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Et ønske, som generatoren tager hensyn til. Et hårdt ønske holder den altid, et blødt ønske hvor den kan.", + "Whether the wish is about a teacher, a group, a room or one activity": "Om ønsket gælder en lærer, en gruppe, et lokale eller én aktivitet", + "Teacher": "Lærer", + "Group": "Gruppe", + "Reference": "Reference", + "The user, group, room or activity the wish is about": "Brugeren, gruppen, lokalet eller aktiviteten, ønsket gælder", + "What the wish asks for": "Hvad ønsket beder om", + "Not on these periods": "Ikke i disse moduler", + "Preferably not on these periods": "Helst ikke i disse moduler", + "At most a number of lessons a day": "Højst et antal lektioner om dagen", + "No free periods between lessons": "Ingen huller mellem lektionerne", + "Always the same room": "Altid samme lokale", + "Periods": "Moduler", + "The periods of the week the wish is about, such as wed-5": "Ugens moduler, ønsket gælder, fx wed-5", + "Limit": "Grænse", + "The most lessons a day, for a wish of that kind": "Flest lektioner om dagen, for et ønske af den slags", + "Strength": "Styrke", + "Whether the generator must keep the wish or should keep it": "Om generatoren skal eller bør holde ønsket", + "Hard": "Hårdt", + "Soft": "Blødt", + "Weight": "Vægt", + "How much a soft wish counts, from 1 to 3": "Hvor meget et blødt ønske tæller, fra 1 til 3", + "Why the wish exists": "Hvorfor ønsket findes", + "Timetable scenario": "Skemascenarie", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Ét ugemønster, lavet af generatoren eller taget fra det nuværende skema. Det gemmer sine inddata og hvor godt det holder ønskerne.", + "The name timetablers know the scenario by": "Navnet, skemalæggerne kender scenariet under", + "Whether the generator made it or it came from the current timetable": "Om generatoren lavede det, eller det kommer fra det nuværende skema", + "Generated": "Genereret", + "From the current timetable": "Fra det nuværende skema", + "Week of": "Uge fra", + "The Monday of the first week of the window": "Mandagen i periodens første uge", + "Window start": "Periodens start", + "The first day the week pattern applies to": "Den første dag, ugemønstret gælder for", + "Window end": "Periodens slutning", + "The last day the week pattern applies to": "Den sidste dag, ugemønstret gælder for", + "Waiting, generating, done, failed, or published as draft lessons": "Venter, genereres, færdig, mislykket eller udgivet som kladdelektioner", + "Waiting": "Venter", + "Generating": "Genereres", + "Failed": "Mislykket", + "Published": "Udgivet", + "Seed": "Frø", + "The number the generator starts from, so a run can be repeated": "Tallet, generatoren starter fra, så en kørsel kan gentages", + "Input": "Inddata", + "The periods, rooms, lessons and wishes the scenario was made from": "Modulerne, lokalerne, lektionerne og ønskerne, scenariet blev lavet ud fra", + "Placements": "Placeringer", + "Each lesson with the period and room it was given": "Hver lektion med det modul og lokale, den fik", + "Unplaced lessons": "Uplacerede lektioner", + "Lessons without a place, each with the hard wish that blocked it": "Lektioner uden plads, hver med det hårde ønske, der blokerede den", + "Broken wishes": "Brudte ønsker", + "The wishes this scenario breaks, with the lessons that break them": "De ønsker, dette scenarie bryder, med de lektioner, der bryder dem", + "Measures": "Mål", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Placerede lektioner, brudte ønsker, lærerhuller, lektioner om dagen og lokalebrug", + "Reason": "Årsag", + "Why the run failed": "Hvorfor kørslen mislykkedes", + "Published at": "Udgivet", + "When the scenario was written out as draft lessons": "Hvornår scenariet blev skrevet ud som kladdelektioner", + "Edit wish": "Rediger ønske", + "New wish": "Nyt ønske", + "Hard: the generator always keeps it": "Hårdt: generatoren overholder det altid", + "Soft: the generator keeps it where it can": "Blødt: generatoren overholder det, hvor den kan", + "Weight (1 to 3)": "Vægt (1 til 3)", + "Most lessons a day": "Højst antal lektioner om dagen", + "Period": "Lektion", + "{day} period {number}": "{day} lektion {number}", + "Teacher (user name)": "Lærer (brugernavn)", + "Activity (group:subject)": "Aktivitet (gruppe:fag)", + "Say who or what the wish is about.": "Angiv hvem eller hvad ønsket gælder.", + "Choose at least one period.": "Vælg mindst én lektion.", + "The limit is a whole number of 1 or more.": "Grænsen er et helt tal på 1 eller mere.", + "Timetable": "Skema", + "Wishes": "Ønsker", + "Timetable wishes": "Skemaønsker", + "Generator run": "Generatorkørsel", + "Generator progress": "Generatorens fremskridt", + "The run failed: {reason}": "Kørslen mislykkedes: {reason}", + "{placed} of {lessons} lessons placed": "{placed} af {lessons} lektioner placeret", + "Generate again": "Generér igen", + "Generate": "Generér", + "Every lesson has a place.": "Hver lektion har en plads.", + "Lesson": "Lektion", + "No free period and room": "Ingen ledig lektion og lokale", + "Broken soft wishes": "Brudte bløde ønsker", + "Every soft wish is kept.": "Hvert blødt ønske er overholdt.", + "Wish": "Ønske", + "Lessons": "Lektioner", + "Generating: {percent}% of the time budget used": "Genererer: {percent}% af tiden brugt", + "Waiting to start": "Venter på start", + "Published as draft lessons": "Udgivet som kladdelektioner", + "Could not read the scenario.": "Scenariet kunne ikke læses.", + "Could not start the run.": "Kørslen kunne ikke startes.", + "Scenarios": "Scenarier", + "Timetable scenarios": "Skemascenarier", + "Scenario": "Scenarie", + "Take the current timetable": "Brug det nuværende skema", + "Could not take the current timetable.": "Det nuværende skema kunne ikke hentes.", + "Broken hard wishes": "Brudte hårde ønsker", + "Not on a period of the week grid": "Ikke på en lektion i ugeskemaet", + "Compare scenarios": "Sammenlign scenarier", + "Scenarios to compare": "Scenarier at sammenligne", + "Choose two or three scenarios to compare them.": "Vælg to eller tre scenarier for at sammenligne dem.", + "Measure": "Måling", + "Best": "Bedst", + "Lessons that differ": "Lektioner der er forskellige", + "No lesson differs.": "Ingen lektion er forskellig.", + "Not placed": "Ikke placeret", + "{period} in {room}": "{period} i {room}", + "Lessons placed": "Placerede lektioner", + "Lessons without a place": "Lektioner uden plads", + "Clashes": "Konflikter", + "Hard wishes broken": "Brudte hårde ønsker", + "Soft wishes broken": "Brudte bløde ønsker", + "Soft wishes broken, weighted": "Brudte bløde ønsker, vægtet", + "Free periods between lessons, all teachers": "Mellemtimer, alle lærere", + "Most free periods of one teacher": "Flest mellemtimer for én lærer", + "Most lessons of one group on a day": "Flest lektioner for én gruppe på en dag", + "Room use": "Lokalebrug", + "Publish as draft lessons": "Udgiv som kladdelektioner", + "Draft lessons written: {count}": "Kladdelektioner skrevet: {count}", + "Could not publish the scenario.": "Scenariet kunne ikke udgives.", + "Rules": "Regler", + "Rules for {column}": "Regler for {column}", + "When a card enters this column": "Når et kort kommer ind i denne kolonne", + "Action": "Handling", + "Set the priority": "Sæt prioriteten", + "Assign to": "Tildel til", + "Assign the person who moved the card": "Tildel den person, der flyttede kortet", + "Remove the assignee": "Fjern den ansvarlige", + "Add a label": "Tilføj en etiket", + "No longer a project member": "Ikke længere projektmedlem", + "This label no longer exists": "Denne etiket findes ikke længere", + "Add rule": "Tilføj regel", + "Remove rule": "Fjern regel", + "No rules yet. Add one to change a card when it enters this column.": "Ingen regler endnu. Tilføj en for at ændre et kort, når det kommer ind i denne kolonne.", + "Could not save the rules. Please try again.": "Reglerne kunne ikke gemmes. Prøv igen.", + "1 rule runs when a card enters this column": "1 regel kører, når et kort kommer ind i denne kolonne", + "{count} rules run when a card enters this column": "{count} regler kører, når et kort kommer ind i denne kolonne", + "Rules applied: {changes}": "Regler anvendt: {changes}", + "assigned to {name}": "tildelt {name}", + "assignee removed": "ansvarlig fjernet", + "priority {priority}": "prioritet {priority}", + "label {label}": "etiket {label}", + "What happens to a card when it enters this column, applied in list order.": "Hvad der sker med et kort, når det kommer ind i denne kolonne, i listens rækkefølge.", + "Value": "Værdi", + "What the rule does to the card.": "Hvad reglen gør ved kortet.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioriteten, bruger-id'et eller etiket-id'et, som handlingen bruger; tom for handlinger uden værdi.", + "is not": "er ikke", + "{dimension} is not": "{dimension} er ikke", + "Saved filters": "Gemte filtre", + "No saved filters yet": "Ingen gemte filtre endnu", + "Save filter": "Gem filter", + "Rename \"{name}\"": "Omdøb \"{name}\"", + "Delete \"{name}\"": "Slet \"{name}\"", + "Clear filters": "Ryd filtre", + "Showing {shown} of {total} tasks": "Viser {shown} af {total} opgaver", + "Me": "Mig", + "No date": "Ingen dato", + "Rename saved filter": "Omdøb gemt filter", + "Share with the project": "Del med projektet", + "Give the filter a name": "Giv filteret et navn", + "Could not save the filter. Please try again.": "Filteret kunne ikke gemmes. Prøv igen.", + "Some labels in \"{name}\" no longer exist and were left out.": "Nogle etiketter i \"{name}\" findes ikke længere og er udeladt.", + "Could not delete the filter. Please try again.": "Filteret kunne ikke slettes. Prøv igen.", + "Saved filter": "Gemt filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Et navngivet tavlefilter for ét projekt, privat for den, der gemte det, medmindre det deles med projektet.", + "The project whose board the filter applies to": "Projektet, hvis tavle filteret gælder", + "The name the filter is listed under": "Navnet, filteret vises under", + "Saved by": "Gemt af", + "Nextcloud user id of the person who saved the filter": "Nextcloud-bruger-id for den, der gemte filteret", + "Shared with the project": "Delt med projektet", + "Whether every project member sees and applies the filter": "Om alle projektmedlemmer ser og kan bruge filteret", + "Criteria": "Kriterier", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filteret: ansvarlig, etiket, prioritet og forfaldsdato, hver med er eller er ikke og dens værdier", + "Cross-project view": "Tværgående projektvisning", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Et gemt udvalg af projekter, hvis opgaver vises samlet i statusbaner, delt med de personer det nævner.", + "Shared with": "Delt med", + "The name the view is listed under": "Navnet visningen står under", + "Nextcloud user id of the person who saved the view": "Nextcloud-bruger-id for den person, der gemte visningen", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-bruger-id'er for de personer, visningen er delt med", + "The projects whose tasks the view shows, at most twenty": "De projekter, hvis opgaver visningen viser, højst tyve", + "1 project in this view is hidden from you.": "1 projekt i denne visning er skjult for dig.", + "{count} projects in this view are hidden from you.": "{count} projekter i denne visning er skjult for dig.", + "{project} has no column for {status}.": "{project} har ingen kolonne for {status}.", + "This view does not exist or is not shared with you.": "Denne visning findes ikke eller er ikke delt med dig.", + "\"{task}\" moved to {status}.": "\"{task}\" flyttet til {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Tværgående projektvisninger", + "New view": "Ny visning", + "Edit view": "Rediger visning", + "Delete view": "Slet visning", + "Give the view a name": "Giv visningen et navn", + "Pick at least one project": "Vælg mindst ét projekt", + "A view shows at most {max} projects": "En visning viser højst {max} projekter", + "Could not save the view. Please try again.": "Kunne ikke gemme visningen. Prøv igen.", + "Could not delete the view. Please try again.": "Kunne ikke slette visningen. Prøv igen.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Slet \"{title}\"? Projekterne og deres opgaver forbliver, som de er.", + "People see the tasks of the projects they are in, never more.": "Folk ser opgaverne i de projekter, de er med i, aldrig mere.", + "No views yet. A view shows the tasks of several of your projects together.": "Ingen visninger endnu. En visning viser opgaverne fra flere af dine projekter samlet.", + "Projects in view: {count}": "Projekter i visningen: {count}", + "Notify me when a task is assigned to me": "Giv mig besked, når en opgave tildeles mig", + "Also send these to me by email": "Send dem også til mig pr. e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Tilføj en e-mailadresse i dine personlige Nextcloud-indstillinger for at få e-mail.", + "Code link": "Kodelink", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Et commit, en branch, en merge request eller et issue i en kodeplatform, der arbejder på en opgave.", + "The task the link belongs to": "Opgaven, linket hører til", + "The project of the task": "Opgavens projekt", + "Task key": "Opgavenøgle", + "The task key the forge text named, such as VC-12": "Opgavenøglen, som teksten i kodeplatformen nævnte, fx VC-12", + "What the link points at": "Hvad linket peger på", + "Link": "Link", + "The address of the item in the forge": "Elementets adresse i kodeplatformen", + "The commit message, branch name or merge request title": "Commit-beskeden, branch-navnet eller titlen på merge requesten", + "Repository": "Repository", + "The repository, such as acme/portal": "Repositoryet, fx acme/portal", + "Forge id": "Id i platformen", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Elementets eget id i kodeplatformen, fx github:acme/portal#42 eller en commit-hash", + "State": "Status", + "The state of a merge request or issue": "Status for en merge request eller et issue", + "Who made the commit or opened the merge request": "Hvem der lavede committet eller åbnede merge requesten", + "When the commit was made or the merge request last changed": "Hvornår committet blev lavet, eller merge requesten sidst ændrede sig", + "Added by": "Tilføjet af", + "Whether a person added the link or the integration wrote it": "Om en person tilføjede linket, eller integrationen skrev det", + "Nextcloud user UIDs of project members": "Nextcloud-bruger-id'er for projektmedlemmer", + "Add link": "Tilføj link", + "Added by hand": "Tilføjet manuelt", + "Branch": "Branch", + "Code": "Kode", + "Commit": "Commit", + "From the integration": "Fra integrationen", + "Link to a commit, branch or merge request": "Link til et commit, en branch eller en merge request", + "Merge request": "Merge request", + "Merged": "Flettet", + "No code linked yet. Name {key} in a commit message or paste a link.": "Ingen kode linket endnu. Nævn {key} i en commit-besked, eller indsæt et link.", + "No code linked yet. Paste a link to a commit or merge request.": "Ingen kode linket endnu. Indsæt et link til et commit eller en merge request.", + "Paste a web address that starts with https://.": "Indsæt en webadresse, der starter med https://.", + "Remove link {title}": "Fjern linket {title}", + "The link could not be added.": "Linket kunne ikke tilføjes.", + "The link could not be removed.": "Linket kunne ikke fjernes.", + "This link is already on the task.": "Dette link er allerede på opgaven.", + "Code forges": "Kodeplatforme", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Link GitHub-commits og pull requests til opgaver. Integriq modtager hændelserne; planninq kalder aldrig GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Download konfigurationen, og importér den i Integriq. Udfyld derefter en hemmelighed i reglen \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Tilføj i GitHub en webhook til repositoryet med denne adresse og samme hemmelighed. Vælg indholdstypen application/json og hændelserne push og pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nævn opgavenøglen, fx VC-12, i en commit-besked, et branch-navn eller titlen på en pull request. Linket vises så på den opgave.", + "Without Integriq, project members can still paste a link on the task page.": "Uden Integriq kan projektmedlemmer stadig indsætte et link på opgavesiden.", + "Download the Integriq configuration": "Download Integriq-konfigurationen", + "Calendar": "Kalender", + "Previous": "Forrige", + "Calendar view": "Kalendervisning", + "Starts:": "Starter:", + "No tasks with a date in this month.": "Ingen opgaver med en dato i denne måned.", + "Week of {start} to {end}": "Uge fra {start} til {end}", + "My calendar": "Min kalender", + "Show as list": "Vis som liste", + "Show as calendar": "Vis som kalender", + "Open my calendar": "Åbn min kalender", + "Nextcloud Tasks": "Nextcloud Opgaver", + "Show my tasks in Nextcloud Tasks": "Vis mine opgaver i Nextcloud Opgaver", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "De opgaver, der er tildelt dig eller delt med dig, vises på en liste \"Planninq\" i Nextcloud Opgaver og Kalender. Ændringer, du laver der, erstattes ved næste ændring i Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Denne server kan ikke skrive til Nextcloud Opgaver, så eksporten er ikke tilgængelig.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Administreres af Planninq. Ændringer, du laver her, erstattes ved næste ændring i Planninq.", + "Working days and holidays": "Arbejdsdage og helligdage", + "Dates set on the timeline skip the days that are not working days.": "Datoer sat på tidslinjen springer de dage over, der ikke er arbejdsdage.", + "Working weekdays": "Ugens arbejdsdage", + "Non-working days": "Fridage", + "No non-working days yet.": "Ingen fridage endnu.", + "Add day": "Tilføj dag", + "Year": "År", + "Add Dutch national holidays": "Tilføj nederlandske helligdage", + "Save working days": "Gem arbejdsdage", + "Choose at least one working weekday.": "Vælg mindst én arbejdsdag.", + "Working days saved.": "Arbejdsdage gemt.", + "Could not save the working days.": "Arbejdsdagene kunne ikke gemmes.", + "New Year's Day": "Nytårsdag", + "Easter Sunday": "Påskedag", + "Easter Monday": "2. påskedag", + "King's Day": "Kongens dag", + "Liberation Day": "Befrielsesdag", + "Ascension Day": "Kristi himmelfartsdag", + "Whit Sunday": "Pinsedag", + "Whit Monday": "2. pinsedag", + "Christmas Day": "Juledag", + "Boxing Day": "2. juledag", + "Dates of {title}": "Datoer for {title}", + "The due date cannot be before the start date.": "Forfaldsdatoen kan ikke ligge før startdatoen.", + "{title}, from {start} to {end}": "{title}, fra {start} til {end}", + "The dates could not be saved.": "Datoerne kunne ikke gemmes.", + "{title} now runs from {start} to {end}": "{title} løber nu fra {start} til {end}", + "Auto-scheduling": "Automatisk planlægning", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Når den er slået til, tilbyder en senere forfaldsdato på tidslinjen at flytte de opgaver, den blokerer, med.", + "Move blocked tasks along when a task slips": "Flyt blokerede opgaver med, når en opgave skrider", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "På tidslinjen tilbyder en senere forfaldsdato at flytte de blokerede opgaver med. Kun \"blokerer\"-links tæller, og opgaver flyttes kun senere.", + "Move the tasks that wait for {title}?": "Flyt de opgaver, der venter på {title}?", + "These tasks wait for it and would start after its new due date:": "Disse opgaver venter på den og ville starte efter den nye forfaldsdato:", + "{count} tasks would move; the first {limit} are listed.": "{count} opgaver ville blive flyttet; de første {limit} vises.", + "Now": "Nu", + "After the move": "Efter flytningen", + "Only this task": "Kun denne opgave", + "Move all": "Flyt alle", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stoppet ved {title}: datoerne kunne ikke gemmes. Opgaverne før den blev flyttet.", + "Cumulative flow": "Kumulativt flow", + "Show as chart": "Vis som diagram", + "Show as table": "Vis som tabel", + "Tasks per column per day": "Opgaver pr. kolonne pr. dag", + "Tasks without recorded history in this period: {count}": "Opgaver uden registreret historik i denne periode: {count}", + "Lead and cycle time": "Gennemløbstid og cyklustid", + "No tasks were finished in this period.": "Ingen opgaver blev afsluttet i denne periode.", + "Finished tasks": "Afsluttede opgaver", + "Cycle time, average": "Cyklustid, gennemsnit", + "Cycle time, 85th percentile": "Cyklustid, 85. percentil", + "Lead time, average": "Gennemløbstid, gennemsnit", + "Tasks whose finish time was estimated from their history: {count}": "Opgaver hvis sluttidspunkt blev anslået ud fra historikken: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Cyklustid for hver afsluttet opgave, med gennemsnit og 85. percentil", + "Slowest tasks": "Langsomste opgaver", + "cycle {cycle}, lead {lead}": "cyklus {cycle}, gennemløb {lead}", + "{days} days": "{days} dage", + "Could not load the flow of this project.": "Projektets flow kunne ikke indlæses.", + "Last {days} days": "Seneste {days} dage", + "Portfolio flow": "Porteføljeflow", + "An admin adds portfolios under Projects, Portfolios.": "En administrator tilføjer porteføljer under Projekter, Porteføljer.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekter der ikke vises, fordi højst 50 vises ad gangen: {count}", + "Could not load the flow of this portfolio.": "Porteføljens flow kunne ikke indlæses.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativt flow og cyklustid på tværs af en porteføljes projekter.", + "Edit report": "Rediger rapport", + "Only tasks where": "Kun opgaver hvor", + "Group by": "Gruppér efter", + "Display": "Visning", + "Share with everyone who can read its projects": "Del med alle der kan læse dens projekter", + "The report could not be saved.": "Rapporten kunne ikke gemmes.", + "Number of tasks": "Antal opgaver", + "Bar": "Søjle", + "Donut": "Ring", + "Table": "Tabel", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} af {total} projekter i denne rapport er ikke synlige for dig", + "No tasks match this report.": "Ingen opgaver passer til denne rapport.", + "None": "Ingen", + "Could not load this report.": "Rapporten kunne ikke indlæses.", + "Report": "Rapport", + "Your reports": "Dine rapporter", + "My reports": "Mine rapporter", + "Shared reports": "Delte rapporter", + "You have not built a report yet.": "Du har ikke lavet en rapport endnu.", + "Nobody has shared a report with you yet.": "Ingen har delt en rapport med dig endnu.", + "Reports you built over tasks, and the ones shared with you.": "Rapporter du har lavet over opgaver, og dem der er delt med dig.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "En gemt forespørgsel over opgaver: hvilke projekter, hvilke filtre, grupperet efter hvad, talt eller summeret, og vist som tabel eller diagram.", + "The name the report is listed under": "Navnet rapporten står under", + "What the report shows and who it is for": "Hvad rapporten viser, og hvem den er til", + "Nextcloud user id of the person who saved the report": "Nextcloud-bruger-id for den der gemte rapporten", + "Who can open the report": "Hvem der kan åbne rapporten", + "Only me": "Kun mig", + "Everyone who can read its projects": "Alle der kan læse dens projekter", + "The projects the report covers, at most fifty": "Projekterne rapporten dækker, højst halvtreds", + "Filters": "Filtre", + "Task fields and the value each must equal": "Opgavefelter og den værdi hvert skal være lig med", + "The task field the report groups on": "Opgavefeltet rapporten grupperer på", + "Count the tasks, or add up a number on them": "Tæl opgaverne, eller læg et tal på dem sammen", + "Sum": "Sum", + "Sum of": "Sum af", + "The number added up when the measure is a sum": "Tallet der lægges sammen, når målet er en sum", + "Story points": "Story points", + "Estimated duration": "Anslået varighed", + "How the report is shown": "Hvordan rapporten vises", + "Issue type": "Sagstype", + "Task fields and the value each must equal; empty when the report covers every task": "Opgavefelter og den værdi, hvert felt skal have; tom når rapporten dækker alle opgaver", + "The status a task must have": "Den status en opgave skal have", + "The priority a task must have": "Den prioritet en opgave skal have", + "The user a task must be assigned to": "Den bruger en opgave skal være tildelt", + "A label a task must carry": "En etiket en opgave skal have", + "The board column a task must be in": "Den tavlekolonne en opgave skal stå i", + "The issue type a task must have": "Den sagstype en opgave skal have", + "Manager groups": "Ledergrupper", + "Member groups": "Medlemsgrupper", + "Viewer groups": "Læsergrupper", + "Viewers": "Læsere", + "Owning group": "Ejergruppe", + "Nextcloud groups whose members manage the project": "Nextcloud-grupper hvis medlemmer leder projektet", + "Nextcloud groups whose members work on the project": "Nextcloud-grupper hvis medlemmer arbejder på projektet", + "Nextcloud groups whose members may read the project": "Nextcloud-grupper hvis medlemmer må læse projektet", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-brugere der leder projektet: indstillinger, medlemmer og arbejde", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-brugere der må læse projektet og dets arbejde, men ikke ændre det", + "The Nextcloud group that owns the project with its creator, at most one": "Den Nextcloud-gruppe der ejer projektet sammen med dets opretter, højst én", + "Nextcloud user ids who may read this through the project": "Nextcloud-brugere der må læse dette gennem projektet", + "Nextcloud groups whose members may change this through the project": "Nextcloud-grupper hvis medlemmer må ændre dette gennem projektet", + "Nextcloud groups whose members may read this through the project": "Nextcloud-grupper hvis medlemmer må læse dette gennem projektet", + "Search for a person or a group…": "Søg efter en person eller en gruppe…", + "No one found. Your admin's sharing settings decide who you can find.": "Ingen fundet. Din administrators delingsindstillinger bestemmer, hvem du kan finde.", + "Type at least two characters": "Skriv mindst to tegn", + "Everyone in this group": "Alle i denne gruppe", + "Could not search for people. Please try again.": "Kunne ikke søge efter personer. Prøv igen.", + "Could not remove the group": "Kunne ikke fjerne gruppen", + "Only the owner and managers change who is on this project.": "Kun ejeren og administratorerne ændrer, hvem der er med i dette projekt.", + "Role of {name}": "Rolle for {name}", + "Manager": "Administrator", + "Member": "Medlem", + "Viewer": "Læser", + "Could not change the role": "Kunne ikke ændre rollen", + "Owned by group: {name}": "Ejet af gruppen: {name}", + "No group owns this project.": "Ingen gruppe ejer dette projekt.", + "Owned by group": "Ejet af gruppe", + "Search for a group…": "Søg efter en gruppe…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen gruppe fundet. Din administrators delingsindstillinger bestemmer, hvilke grupper du kan finde.", + "No owning group": "Ingen ejergruppe", + "Could not search for groups. Please try again.": "Kunne ikke søge efter grupper. Prøv igen.", + "Could not change the owning group": "Kunne ikke ændre ejergruppen", + "You can read this project. Only its members change it.": "Du kan læse dette projekt. Kun dets medlemmer ændrer det.", + "Course": "Kursus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Det kursus, timen underviser i, fx et valgfag, når skolens læringsapp kender det.", + "Online meeting link": "Link til onlinetimen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvor eleverne deltager i timen online. Knappen Deltag vises kun ved et https-link." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/da.json b/l10n/da.json index 346d7fa9..85cfe601 100644 --- a/l10n/da.json +++ b/l10n/da.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktive projekter", + "Archived projects": "Arkiverede projekter", + "Boards": "Tavler", + "My projects": "Mine projekter", + "Portfolio": "Portefølje", + "Project board": "Projekttavle", + "Projects I am in": "Projekter jeg er med i", + "Timeline": "Tidslinje", + "Timesheet": "Timeseddel", + "Features & roadmap": "Funktioner og køreplan", + "Flow": "Flow", + "Flows": "Flows", + "Reports": "Rapporter", + "Pick a report to open it.": "Vælg en rapport for at åbne den.", + "In progress": "I gang", + "Date": "Dato", + "Due": "Forfalder", + "Assignee": "Tildelt", + "Who": "Hvem", + "What": "Hvad", + "Minutes": "Minutter", + "Entries": "Poster", + "Most recent": "Nyeste", + "Per person": "Per person", + "By status": "Efter status", + "By priority": "Efter prioritet", + "Task status": "Opgavestatus", + "Time spent": "Brugt tid", + "Capacity": "Kapacitet", + "Due soonest": "Forfalder først", + "Minutes logged": "Registrerede minutter", + "Nothing is due": "Intet forfalder", + "Nothing logged yet": "Intet registreret endnu", + "What is open, what is blocked, and what is overdue.": "Hvad er åbent, hvad er blokeret, og hvad er forsinket.", + "How allocation is spread across the people working on projects.": "Hvordan belastningen er fordelt mellem dem, der arbejder på projekter.", + "Hours logged, and the projects they went to.": "Registrerede timer og de projekter, de gik til.", + "Billable": "Fakturerbar", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Indlæser projekter", + "No projects for this client yet": "Ingen projekter for denne kunde endnu", + "Open in Planninq": "Åbn i Planninq", + "This project could not be found": "Dette projekt blev ikke fundet", + "Untitled project": "Projekt uden titel", + "and {count} more": "og {count} mere", + "Store": "Butik", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installer registre, skemaer og flows, som andre organisationer har udgivet.", + "Work Date": "Arbejdsdato", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Kolonnehandlinger", + "Columns": "Kolonner", + "Could not remove the column. Please try again.": "Kolonnen kunne ikke fjernes. Prøv igen.", + "Could not save the column. Please try again.": "Kolonnen kunne ikke gemmes. Prøv igen.", + "Done column": "Færdig-kolonne", + "Edit column": "Rediger kolonne", + "Keep the card's status": "Behold kortets status", + "Move its cards to": "Flyt dens kort til", + "Move left": "Flyt til venstre", + "Move right": "Flyt til højre", + "Status of cards moved here": "Status for kort flyttet hertil", + "The last done column cannot be removed.": "Den sidste færdig-kolonne kan ikke fjernes.", + "WIP limit": "WIP-grænse", + "over limit": "over grænsen", + "The status a card gets when it is moved into this column.": "Den status et kort får, når det flyttes til denne kolonne.", + "All priorities": "Alle prioriteter", + "Could not create the task. Please try again.": "Opgaven kunne ikke oprettes. Prøv igen.", + "Created": "Oprettet", + "Move to backlog": "Til backlog", + "Move to board": "Til tavlen", + "New task": "Ny opgave", + "Nothing in the backlog": "Intet i backloggen", + "Rank": "Rang", + "Sort by": "Sorter efter", + "Sort by rank to reorder": "Sorter efter rang for at ændre rækkefølgen", + "Task actions": "Opgavehandlinger", + "All labels": "Alle etiketter", + "Filter tasks by label": "Filtrer opgaver efter etiket", + "View timeline": "Vis tidslinje", + "Board": "Tavle", + "List": "Liste", + "Column": "Kolonne", + "Board or list": "Tavle eller liste", + "Log": "Log", + "Add entry": "Tilføj post", + "Show": "Vis", + "No actions yet": "Ingen handlinger endnu", + "Closed": "Lukket", + "Entry actions": "Posthandlinger", + "Add action": "Tilføj handling", + "by {author}": "af {author}", + "saved {time}": "gemt {time}", + "Attendees: {names}": "Deltagere: {names}", + "Add the first entry": "Tilføj den første post", + "Issues": "Problemer", + "Lessons learned": "Erfaringer", + "Meetings": "Møder", + "Decisions": "Beslutninger", + "Actions": "Handlinger", + "Issue": "Problem", + "Lesson learned": "Erfaring", + "Meeting": "Møde", + "Decision": "Beslutning", + "About this project": "Om dette projekt", + "No description yet": "Ingen beskrivelse endnu", + "Start date": "Startdato", + "Not set": "Ikke angivet", + "End date": "Slutdato", + "Progress": "Fremdrift", + "No tasks yet": "Ingen opgaver endnu", + "Open the board": "Åbn tavlen", + "People": "Personer", + "Owner": "Ejer", + "Latest log entries": "Seneste poster", + "Open the log": "Åbn loggen", + "{done} of {total} tasks done": "{done} af {total} opgaver udført", + "Edit entry": "Rediger post", + "Type": "Type", + "Attendees": "Deltagere", + "Issue is closed": "Problemet er lukket", + "Could not save the entry. Please try again.": "Posten kunne ikke gemmes. Prøv igen.", + "From: {title}": "Fra: {title}", + "What needs to happen": "Hvad der skal ske", + "Could not create the action. Please try again.": "Handlingen kunne ikke oprettes. Prøv igen.", + "The action was created but could not be linked to the entry.": "Handlingen blev oprettet, men kunne ikke knyttes til posten.", + "Project pages": "Projektsider", + "Overview": "Oversigt", + "Risks": "Risici", + "Log entry": "Logpost", + "A short name for the entry": "Et kort navn til posten", + "Project": "Projekt", + "The project this entry belongs to": "Det projekt, posten hører til", + "What kind of entry this is": "Hvilken slags post dette er", + "When it happened": "Hvornår det skete", + "What happened, in Markdown": "Hvad der skete, i Markdown", + "Whether an issue is still open": "Om et problem stadig er åbent", + "The people at a meeting": "Personerne ved et møde", + "Tasks that came out of this entry": "Opgaver, der kom ud af denne post", + "Add risk": "Tilføj risiko", + "Risk": "Risiko", + "Score": "Score", + "Response": "Håndtering", + "Review date": "Revisionsdato", + "no longer on the project": "er ikke længere med i projektet", + "Edit {title}": "Rediger {title}", + "No risks recorded yet": "Ingen risici registreret endnu", + "Add the first risk": "Tilføj den første risiko", + "Medium": "Mellem", + "Mitigating": "Afbødes", + "Occurred": "Indtruffet", + "Avoid": "Undgå", + "Reduce": "Reducere", + "Transfer": "Overføre", + "Accept": "Acceptere", + "Highest open risks": "Højeste åbne risici", + "No open risks": "Ingen åbne risici", + "Open the risk register": "Åbn risikoregistret", + "Edit risk": "Rediger risiko", + "What could go wrong": "Hvad der kan gå galt", + "Likelihood": "Sandsynlighed", + "Impact": "Konsekvens", + "Score {score}": "Score {score}", + "Countermeasures": "Modforanstaltninger", + "Could not save the risk. Please try again.": "Risikoen kunne ikke gemmes. Prøv igen.", + "Risks by likelihood and impact": "Risici efter sandsynlighed og konsekvens", + "Risk scale": "Risikoskala", + "The levels every project scores its risks on, and where low turns into medium and high": "De niveauer, hvert projekt scorer sine risici på, og hvor lav går over i mellem og høj", + "Number of levels": "Antal niveauer", + "Likelihood labels": "Etiketter for sandsynlighed", + "Impact labels": "Etiketter for konsekvens", + "Level {level}": "Niveau {level}", + "Medium from score": "Mellem fra score", + "High from score": "Høj fra score", + "Risk scale saved": "Risikoskala gemt", + "1 risk uses level {level}. Change it first.": "1 risiko bruger niveau {level}. Ret den først.", + "{count} risks use level {level}. Change them first.": "{count} risici bruger niveau {level}. Ret dem først.", + "Every level needs a label, and high must start above medium.": "Hvert niveau skal have en etiket, og høj skal starte over mellem.", + "The project this risk belongs to": "Det projekt, risikoen hører til", + "The cause and the effect, in Markdown": "Årsag og virkning, i Markdown", + "Category": "Kategori", + "A free grouping, such as planning, budget or supplier": "En fri gruppering, fx planlægning, budget eller leverandør", + "How likely it is, on the admin's risk scale": "Hvor sandsynligt det er, på administratorens risikoskala", + "How hard it would hit, on the admin's risk scale": "Hvor hårdt det ville ramme, på administratorens risikoskala", + "Likelihood times impact, calculated by the server": "Sandsynlighed gange konsekvens, beregnet af serveren", + "Where the risk stands": "Hvor risikoen står", + "The person who watches this risk": "Den person, der holder øje med risikoen", + "How the project answers the risk": "Hvordan projektet håndterer risikoen", + "What is done to prevent it or soften it, in Markdown": "Hvad der gøres for at forhindre eller mildne den, i Markdown", + "When to look at this risk again": "Hvornår risikoen skal ses på igen", + "Very low": "Meget lav", + "Very high": "Meget høj", + "All projects": "Alle projekter", + "Project status report": "Projektstatusrapport", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "En dateret rapport om, hvordan et projekt står med penge, organisation, tid, information, kvalitet og risiko (GROTIK-aspekterne), hver med en note.", + "The project this report is about": "Projektet, som rapporten handler om", + "Report date": "Rapportdato", + "The day the report describes": "Den dag, rapporten beskriver", + "Money": "Penge", + "How the project stands on this aspect": "Hvordan projektet står på dette aspekt", + "On track": "På sporet", + "At risk": "I risiko", + "Off track": "Af sporet", + "Money note": "Note om penge", + "A short explanation of this status": "En kort forklaring på denne status", + "Organisation": "Organisation", + "Organisation note": "Note om organisation", + "Time": "Tid", + "Time note": "Note om tid", + "Information": "Information", + "Information note": "Note om information", + "Quality": "Kvalitet", + "Quality note": "Note om kvalitet", + "Risk note": "Note om risiko", + "Overall": "Samlet", + "The worst of the six statuses, calculated by the server": "Den dårligste af de seks statusser, beregnet af serveren", + "Health: money": "Tilstand: penge", + "Copied from the newest status report": "Kopieret fra den nyeste statusrapport", + "Health: organisation": "Tilstand: organisation", + "Health: time": "Tilstand: tid", + "Health: information": "Tilstand: information", + "Health: quality": "Tilstand: kvalitet", + "Health: risk": "Tilstand: risiko", + "Health: overall": "Tilstand: samlet", + "Health: report date": "Tilstand: rapportdato", + "The date of the newest status report": "Datoen for den nyeste statusrapport", + "New report": "Ny rapport", + "Only the project owner writes status reports.": "Kun projektets ejer skriver statusrapporter.", + "Latest report, {date}": "Seneste rapport, {date}", + "Aspect": "Aspekt", + "Note": "Note", + "Report history": "Rapporthistorik", + "Author": "Forfatter", + "No status reports yet": "Ingen statusrapporter endnu", + "Write the first report": "Skriv den første rapport", + "Choose a status for every aspect to save the report.": "Vælg en status for hvert aspekt for at gemme rapporten.", + "Suggested: on track.": "Forslag: på sporet.", + "Suggested: at risk.": "Forslag: i risiko.", + "Suggested: off track.": "Forslag: af sporet.", + "1 task is past its due date.": "1 opgave er over sin frist.", + "{count} tasks are past their due date.": "{count} opgaver er over deres frist.", + "The end date has passed with 1 open task.": "Slutdatoen er passeret med 1 åben opgave.", + "The end date has passed with {count} open tasks.": "Slutdatoen er passeret med {count} åbne opgaver.", + "No open task is past its due date.": "Ingen åben opgave er over sin frist.", + "The highest open risk, \"{title}\", scores {score}.": "Den højeste åbne risiko, \"{title}\", scorer {score}.", + "There are no open risks.": "Der er ingen åbne risici.", + "Costs are at {percent}% of the budget.": "Omkostningerne er på {percent}% af budgettet.", + "No suggestion: the project has no budget.": "Intet forslag: projektet har intet budget.", + "No suggestion: no costs are recorded for this project yet.": "Intet forslag: der er endnu ikke registreret omkostninger for dette projekt.", + "The report was not saved. Only the project owner can write status reports.": "Rapporten blev ikke gemt. Kun projektets ejer kan skrive statusrapporter.", + "No report": "Ingen rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "En gruppe projekter, der drives af de samme personer, for eksempel en afdeling eller et program. Dens ansvarlige læser alle projekter i den.", + "The name of the portfolio": "Porteføljens navn", + "What the portfolio holds and who runs it": "Hvad porteføljen rummer, og hvem der driver den", + "A colour for the portfolio's section in project lists": "En farve til porteføljens afsnit i projektlister", + "Managers": "Ansvarlige", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-bruger-id'er for de personer, der driver porteføljen", + "Order": "Rækkefølge", + "Where the portfolio comes in project lists, lowest first": "Hvor porteføljen står i projektlister, laveste først", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Porteføljens egen risikoskala som JSON, i samme form som den for hele appen. Tom betyder skalaen for hele appen.", + "Portfolio readers": "Porteføljelæsere", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-bruger-id'er for de ansvarlige for projektets portefølje", + "The portfolio this project belongs to": "Den portefølje, projektet hører til", + "No portfolio": "Ingen portefølje", + "All portfolios": "Alle porteføljer", + "You read this project as a manager of its portfolio. Only its members change it.": "Du læser dette projekt som ansvarlig for dets portefølje. Kun medlemmerne ændrer det.", + "Portfolios": "Porteføljer", + "Portfolio status": "Porteføljestatus", + "No portfolios yet": "Ingen porteføljer endnu", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "En administrator tilføjer porteføljer under Projekter, Porteføljer. Projekter i en portefølje vises her med deres status.", + "Roll-up": "Opsummering", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} på sporet, {atRisk} i risiko, {offTrack} ude af sporet, {noReport} uden rapport", + "No project in this portfolio that you can read.": "Intet projekt i denne portefølje, som du kan læse.", + "Start": "Start", + "End": "Slut", + "Budget": "Budget", + "Last report": "Seneste rapport", + "Out of date": "Forældet", + "Portfolio timeline": "Porteføljetidslinje", + "Zoom": "Zoom", + "Could not load the timeline": "Tidslinjen kunne ikke indlæses", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "En administrator tilføjer porteføljer under Projekter, Porteføljer. Projekter i en portefølje vises her på én tidslinje.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Åbn et projekt for at se dets faser og opgaver. Tidslinjen er skrivebeskyttet.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Udeladt, fordi du ikke kan læse dem: {count} projekter", + "Week": "Uge", + "Day": "Dag", + "Month": "Måned", + "Please try again later.": "Prøv igen senere.", + "Status reports": "Statusrapporter", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Efter hvor mange dage et projekts seneste statusrapport markeres som forældet i porteføljeoversigten", + "Reporting period (days)": "Rapporteringsperiode (dage)", + "The reporting period is a whole number of days from 1 to 365.": "Rapporteringsperioden er et helt antal dage fra 1 til 365.", + "Reporting period saved": "Rapporteringsperiode gemt", + "The reporting period was not saved. Please try again.": "Rapporteringsperioden blev ikke gemt. Prøv igen.", + "Every project of a portfolio with its status per aspect, rolled up.": "Hvert projekt i en portefølje med status pr. aspekt, opsummeret.", + "The projects of a portfolio on one timeline.": "Projekterne i en portefølje på én tidslinje.", + "Phases": "Faser", + "Add phase": "Tilføj fase", + "No phases yet": "Ingen faser endnu", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Del projektet op i faser, fx initiering, definition og udførelse. En fase lukkes, når dens afsluttende dokument er uploadet.", + "{hours} hours": "{hours} timer", + "Concluding document: {title}": "Afsluttende dokument: {title}", + "Concluding document missing": "Afsluttende dokument mangler", + "Move {title} up": "Flyt {title} op", + "Move {title} down": "Flyt {title} ned", + "Close phase": "Luk fase", + "Phase": "Fase", + "Files": "Filer", + "Notes": "Noter", + "Audit trail": "Revisionsspor", + "Edit phase": "Rediger fase", + "Name": "Navn", + "Budget hours": "Budgettimer", + "Could not save the phase. Please try again.": "Fasen kunne ikke gemmes. Prøv igen.", + "Close phase {title}": "Luk fasen {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "En fase lukkes med sit afsluttende dokument: upload det her, eller vælg en af fasens filer.", + "Concluding document": "Afsluttende dokument", + "This phase has no files yet.": "Denne fase har ingen filer endnu.", + "Upload a document": "Upload et dokument", + "The document was not uploaded. Please try again.": "Dokumentet blev ikke uploadet. Prøv igen.", + "Upload the concluding document before you close this phase.": "Upload det afsluttende dokument, før du lukker denne fase.", + "This phase cannot be closed from its current status.": "Denne fase kan ikke lukkes fra sin nuværende status.", + "The phase was not closed. Please try again.": "Fasen blev ikke lukket. Prøv igen.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Id'et for filen på denne fase, der afslutter den. Fasen kan først fuldføres, når det er angivet og filen er vedhæftet.", + "Import from Microsoft Project": "Importér fra Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Vælg en plan, der er gemt fra Microsoft Project i XML-format. Intet importeres, før du bekræfter.", + "Plan file": "Planfil", + "What the import creates": "Hvad importen opretter", + "Tasks": "Opgaver", + "Sub-tasks": "Underopgaver", + "Milestones": "Milepæle", + "Links": "Kæder", + "Already imported, updated in place: {count}": "Allerede importeret, opdateret på stedet: {count}", + "What does not carry over": "Hvad der ikke overføres", + "Tasks with resources, which are not imported: {count}": "Opgaver med ressourcer, som ikke importeres: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Opgaver dybere end niveau 3, placeret under deres opgave på niveau 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Kæder ud over slut-til-start, importeret som relaterede kæder: {count}", + "Link lags, which are dropped: {count}": "Forsinkelser på kæder, som udelades: {count}", + "Links to a summary task, which are not imported: {count}": "Kæder til en sammenfatningsopgave, som ikke importeres: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Kæder til opgaver uden for denne plan, som ikke importeres: {count}", + "No longer in the plan": "Ikke længere i planen", + "These stay in the project; remove them yourself if they are no longer needed.": "De bliver i projektet; fjern dem selv, hvis de ikke længere er nødvendige.", + "Import": "Importér", + "Close": "Luk", + "The plan is imported: {created} created, {updated} updated.": "Planen er importeret: {created} oprettet, {updated} opdateret.", + "Links that would close a loop were left out: {count}": "Kæder, der ville danne en løkke, er udeladt: {count}", + "The import stopped part-way. Run it again to finish it.": "Importen stoppede undervejs. Kør den igen for at gøre den færdig.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Gem planen i Microsoft Project med Filer, Gem som, XML-format, og importér den fil.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Denne fil erklærer en DOCTYPE eller entiteter, som ikke accepteres.", + "The file is larger than 10 MB.": "Filen er større end 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Planen har mere end 2.000 opgaver, flere end én import kan tage.", + "This file is not a Microsoft Project plan in XML format.": "Denne fil er ikke en Microsoft Project-plan i XML-format.", + "Choose a file to import.": "Vælg en fil at importere.", + "Only the project owner can import a plan.": "Kun projektets ejer kan importere en plan.", + "The plan could not be read. Please try again.": "Planen kunne ikke læses. Prøv igen.", + "Linked case: {title}": "Tilknyttet sag: {title}", + "Linked to a case": "Tilknyttet en sag", + "Hand over to case": "Overdrag til sag", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopierer hver fil på projektet og dets opgaver samt en fil, der beskriver projektet, uændret til den tilknyttede sag.", + "{date} by {user}": "{date} af {user}", + "Files copied: {count}": "Kopierede filer: {count}", + "Files that failed: {names}": "Filer, der fejlede: {names}", + "The handover failed. Please try again.": "Overdragelsen mislykkedes. Prøv igen.", + "The linked case could not be found, or you cannot open it.": "Den tilknyttede sag blev ikke fundet, eller du kan ikke åbne den.", + "Case handovers": "Overdragelser til sagen", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Hver gang projektets filer og metadata blev overdraget til sagen: hvornår, af hvem, til hvilken sag, hver kopieret fil med dens SHA-256 og de filer, der fejlede.", + "Finance": "Økonomi", + "Add cost line": "Tilføj omkostningslinje", + "Delivery terms": "Leveringsbetingelser", + "Billing model": "Faktureringsmodel", + "Budget in euro": "Budget i euro", + "Budget in hours": "Budget i timer", + "Hourly rate in euro": "Timepris i euro", + "Planned start": "Planlagt start", + "Planned end": "Planlagt slut", + "Planned dates": "Planlagte datoer", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Intet budget aftalt", + "Hours": "Timer", + "Only the project owner and the portfolio managers see the amounts.": "Kun projektejeren og porteføljelederne ser beløbene.", + "Budget against cost per category": "Budget mod omkostninger pr. kategori", + "Labour (booked time)": "Arbejde (registreret tid)", + "No category": "Ingen kategori", + "Hours are not available": "Timerne er ikke tilgængelige", + "Not yet assigned to a category": "Endnu ikke tildelt en kategori", + "Total": "I alt", + "{spent} spent, {remaining} remaining": "{spent} brugt, {remaining} tilbage", + "Budget against cost per phase": "Budget mod omkostninger pr. fase", + "No phase": "Ingen fase", + "Cost lines": "Omkostningslinjer", + "From the finance system": "Fra økonomisystemet", + "Edit cost line {amount}": "Rediger omkostningslinjen {amount}", + "No cost lines yet": "Ingen omkostningslinjer endnu", + "Commitments": "Forpligtelser", + "Actual cost": "Faktiske omkostninger", + "Forecast": "Prognose", + "Remaining": "Tilbage", + "Not planned yet": "Endnu ikke planlagt", + "{start} to {end}": "{start} til {end}", + "The terms were not saved. Please try again.": "Betingelserne blev ikke gemt. Prøv igen.", + "Terms saved": "Betingelser gemt", + "Fixed price": "Fast pris", + "Hourly": "Pr. time", + "Not billed": "Faktureres ikke", + "Commitment": "Forpligtelse", + "Edit cost line": "Rediger omkostningslinje", + "Kind": "Type", + "Amount in euro": "Beløb i euro", + "Remove": "Fjern", + "Could not save the cost line. Only the project owner changes the money of a project.": "Omkostningslinjen kunne ikke gemmes. Kun projektejeren ændrer et projekts penge.", + "Could not remove the cost line. Please try again.": "Omkostningslinjen kunne ikke fjernes. Prøv igen.", + "{amount} over budget": "{amount} over budget", + "Cost categories": "Omkostningskategorier", + "The categories every project splits its budget and costs into, one per line": "Kategorierne som hvert projekt fordeler sit budget og sine omkostninger på, én pr. linje", + "Categories": "Kategorier", + "Give at least one category, each name once.": "Angiv mindst én kategori, hvert navn én gang.", + "Cost categories saved": "Omkostningskategorier gemt", + "The cost categories were not saved. Please try again.": "Omkostningskategorierne blev ikke gemt. Prøv igen.", + "Finance line": "Økonomilinje", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Et pengebeløb på et projekt: et budget, en forpligtelse, en faktisk omkostning eller en prognose, i en omkostningskategori og eventuelt en fase. Indtastet af projektejeren eller sendt af økonomisystemet via integrationsappen.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projektet, beløbet hører til. Tomt for en linje fra økonomisystemet, hvis projektnummer ikke passer til noget projekt.", + "The phase this amount belongs to, if any": "Fasen, beløbet hører til, hvis nogen", + "The cost category, one of the categories the admin set up": "Omkostningskategorien, en af de kategorier administratoren har oprettet", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Om beløbet er et budget, en forpligtelse, en faktisk omkostning eller en prognose", + "Amount": "Beløb", + "The amount in the reporting currency (euro)": "Beløbet i rapporteringsvalutaen (euro)", + "The date the amount was booked or is expected": "Datoen, hvor beløbet blev bogført eller forventes", + "What the amount is for": "Hvad beløbet er til", + "Whether a person entered the line or the finance system sent it": "Om en person indtastede linjen, eller økonomisystemet sendte den", + "Entered by hand": "Indtastet manuelt", + "Finance line id": "Økonomilinjens id", + "The finance system's own id of this line. One imported line per id.": "Linjens eget id i økonomisystemet. Én importeret linje pr. id.", + "Project number": "Projektnummer", + "The project number the finance system sent, matched against the project key": "Projektnummeret fra økonomisystemet, sammenholdt med projektnøglen", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Porteføljen for linjens projekt, kopieret fra projektet, så porteføljetotaler kræver ét filter", + "Finance readers": "Økonomilæsere", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-bruger-UID'er for de personer, der må se beløbet: projektejeren og porteføljens ledere", + "Project owner": "Projektejer", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-bruger-UID for projektejeren, der må ændre og fjerne manuelle linjer", + "How the client pays: not billed, a fixed price, or by the hour.": "Hvordan kunden betaler: ikke faktureret, fast pris eller pr. time.", + "Portfolio finance": "Porteføljeøkonomi", + "You cannot see the money of any project in this portfolio": "Du kan ikke se pengene for noget projekt i denne portefølje", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serveren returnerede omkostningslinjer fra projekter uden for denne portefølje, så disse totaler kan være forkerte.", + "Projects left out because you cannot see their money: {count}": "Projekter udeladt, fordi du ikke kan se deres penge: {count}", + "Unmatched finance lines": "Ikke-matchede økonomilinjer", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, forpligtelser, faktiske omkostninger og prognose lagt sammen for en portefølje.", + "Subprojects": "Delprojekter", + "{done} of {total}": "{done} af {total}", + "{done} of {total} tasks done, including subprojects": "{done} af {total} opgaver udført, inklusive delprojekter", + "Show the subprojects of {title}": "Vis delprojekterne under {title}", + "Hide the subprojects of {title}": "Skjul delprojekterne under {title}", + "Part of": "Del af", + "No parent project": "Intet overordnet projekt", + "A project cannot sit under one of its own subprojects.": "Et projekt kan ikke ligge under et af sine egne delprojekter.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekter kan højst ligge tre niveauer dybt: program, projekt og delprojekt.", + "Parent project": "Overordnet projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projektet, som dette projekt ligger under, fx et program. Projekter kan højst ligge tre niveauer dybt.", + "Yes": "Ja", + "No": "Nej", + "{label} (required)": "{label} (påkrævet)", + "{label} is required": "{label} er påkrævet", + "Project field": "Projektfelt", + "A field an admin adds to every project, such as a policy area or a contract value.": "Et felt, som en administrator tilføjer til alle projekter, fx et politikområde eller en kontraktværdi.", + "Key": "Nøgle", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Det faste navn, værdien gemmes under, i lower camel case. Behold det, når projekter bruger det.", + "Label": "Etiket", + "The name people see next to the field": "Navnet, folk ser ved feltet", + "What the field holds": "Hvad feltet indeholder", + "Text": "Tekst", + "Number": "Tal", + "Choice": "Valg", + "Person": "Person", + "Yes or no": "Ja eller nej", + "Options": "Muligheder", + "The choices of a choice field": "Mulighederne i et valgfelt", + "Required": "Påkrævet", + "Whether a project must fill in the field": "Om et projekt skal udfylde feltet", + "Where the field appears, lowest first": "Hvor feltet vises, laveste først", + "Applies to": "Gælder for", + "What the field is added to": "Hvad feltet tilføjes til", + "Custom fields": "Egne felter", + "The values of the project fields an admin defined, keyed by the field's key.": "Værdierne af de projektfelter, en administrator har oprettet, efter feltets nøgle.", + "Project fields": "Projektfelter", + "Related": "Relaterede", + "Remove link": "Fjern link", + "Link type": "Linktype", + "Relates to": "Relaterer til", + "Duplicates": "Duplikerer", + "Project key": "Projektnøgle", + "Every task number starts with it, such as VERG-42.": "Hvert opgavenummer begynder med den, fx VERG-42.", + "This key is already used by another project.": "Denne nøgle bruges allerede af et andet projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Brug 2 til 10 bogstaver og cifre, der begynder med et bogstav.", + "The key cannot change once tasks carry it.": "Nøglen kan ikke ændres, når opgaver bærer den.", + "Project saved. The existing tasks get their numbers in the background.": "Projektet er gemt. De eksisterende opgaver får deres numre i baggrunden.", + "Next task number": "Næste opgavenummer", + "The number the next task of this project gets in its key. Only the system writes it.": "Det nummer, den næste opgave i dette projekt får i sin nøgle. Kun systemet skriver det.", + "Restore {title}": "Gendan {title}", + "Restore": "Gendan", + "Project restored": "Projektet er gendannet", + "Could not restore the project": "Projektet kunne ikke gendannes", + "Bring this project back to the active list.": "Flyt projektet tilbage til listen over aktive projekter.", + "Restore project": "Gendan projekt", + "Request reason": "Begrundelse for anmodningen", + "Why the requester needs this project. Filled in when the project is requested.": "Hvorfor ansøgeren har brug for projektet. Udfyldes ved anmodningen.", + "Reviewed by": "Gennemgået af", + "The user who approved or rejected the request.": "Brugeren, der godkendte eller afviste anmodningen.", + "Reviewed at": "Gennemgået den", + "When the request was approved or rejected.": "Hvornår anmodningen blev godkendt eller afvist.", + "Review note": "Bemærkning fra gennemgangen", + "The reviewer's reason, shown to the requester when a request is not approved.": "Begrundelsen fra den, der gennemgik, som ansøgeren ser, når en anmodning ikke godkendes.", + "Members of these groups": "Medlemmer af disse grupper", + "Groups that may create projects": "Grupper, der må oprette projekter", + "The group {group} no longer exists. Save to remove it.": "Gruppen {group} findes ikke længere. Gem for at fjerne den.", + "Review project request": "Gennemgå projektanmodning", + "Requested by": "Anmodet af", + "Why it is needed": "Hvorfor det er nødvendigt", + "Desired start date": "Ønsket startdato", + "Why is it not approved?": "Hvorfor godkendes det ikke?", + "Give a reason. The requester sees it.": "Angiv en begrundelse. Ansøgeren kan se den.", + "Approve": "Godkend", + "Reject": "Afvis", + "Reject request": "Afvis anmodning", + "The review was not saved. Try again.": "Gennemgangen blev ikke gemt. Prøv igen.", + "This project is waiting for review": "Projektet venter på gennemgang", + "This request was not approved": "Anmodningen blev ikke godkendt", + "Reason: {note}": "Begrundelse: {note}", + "Review request": "Gennemgå anmodning", + "Request a project": "Anmod om et projekt", + "Step {step} of 2": "Trin {step} af 2", + "Why is this project needed?": "Hvorfor er projektet nødvendigt?", + "Give a reason. The reviewer reads it.": "Angiv en begrundelse. Den, der gennemgår, læser den.", + "Back": "Tilbage", + "Next": "Næste", + "Send request": "Send anmodning", + "The request was not sent. Try again.": "Anmodningen blev ikke sendt. Prøv igen.", + "Requested": "Anmodet", + "Not approved": "Ikke godkendt", + "Your request was sent": "Din anmodning er sendt", + "Let everyone else request a project": "Lad alle andre anmode om et projekt", + "Add a task": "Tilføj en opgave", + "Delete task": "Slet opgave", + "Edit task": "Rediger opgave", + "Write": "Skriv", + "Preview": "Forhåndsvisning", + "Markdown works here: headings, lists and links.": "Markdown virker her: overskrifter, lister og links.", + "Could not save the task. Please try again.": "Opgaven kunne ikke gemmes. Prøv igen.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Der er registreret tid på \"{title}\", så den kan ikke slettes. Du kan annullere den i stedet: tidsregistreringerne bevares.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Slet \"{title}\"? Dens links til andre opgaver fjernes også. Dette kan ikke fortrydes.", + "Keep task": "Behold opgave", + "Cancel task": "Annuller opgave", + "Only the reporter, the project owner or an admin can delete this task.": "Kun den der oprettede den, projektejeren eller en administrator kan slette denne opgave.", + "Could not delete the task. Please try again.": "Opgaven kunne ikke slettes. Prøv igen.", + "Could not cancel the task. Please try again.": "Opgaven kunne ikke annulleres. Prøv igen.", + "Responsible": "Ansvarlig", + "Also working on this": "Arbejder også på dette", + "Labels": "Etiketter", + "Could not change the priority. Please try again.": "Prioriteten kunne ikke ændres. Prøv igen.", + "Other project members who work on this task alongside the person responsible.": "Andre projektmedlemmer, der arbejder på opgaven sammen med den ansvarlige.", + "Duplicate": "Dupliker", + "Could not copy the task. Please try again.": "Opgaven kunne ikke kopieres. Prøv igen.", + "Subtasks": "Underopgaver", + "{done} of {total} done": "{done} af {total} færdige", + "Add a subtask": "Tilføj en underopgave", + "Checklist": "Tjekliste", + "Checklist item actions": "Handlinger for tjeklistepunkt", + "Add a checklist item": "Tilføj et tjeklistepunkt", + "Subtasks: {estimate} estimated, {logged} logged": "Underopgaver: {estimate} estimeret, {logged} registreret", + "Total estimate: {total}": "Samlet estimat: {total}", + "Part of {title}": "Del af {title}", + "Checklist: {count} done": "Tjekliste: {count} færdige", + "This task has subtasks: {count}.": "Denne opgave har underopgaver: {count}.", + "Keep subtasks as separate tasks": "Behold underopgaver som separate opgaver", + "Delete subtasks too": "Slet også underopgaver", + "Copy of {title}": "Kopi af {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Opgaven blev kopieret, men ikke alle dens underopgaver. Tjek kopien.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Små trin i opgaven. Hvert punkt har et id, en tekst og om det er færdigt.", + "Open work per person and per project.": "Åbent arbejde pr. person og pr. projekt.", + "View": "Visning", + "By person": "Pr. person", + "By project": "Pr. projekt", + "Hours left": "Timer tilbage", + "Tasks without an estimate": "Opgaver uden estimat", + "Due in 14 days": "Forfalder inden for 14 dage", + "Shared": "Delt", + "Unassigned": "Ikke tildelt", + "{hours} h": "{hours} t", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Viser arbejde i de projekter, du kan se. Timer tæller for den ansvarlige; delte opgaver tælles uden timer.", + "No open work in these projects.": "Intet åbent arbejde i disse projekter.", + "Open work": "Åbent arbejde", + "{count} open tasks": "{count} åbne opgaver", + "Create a project to see capacity here.": "Opret et projekt for at se kapaciteten her.", + "My tasks": "Mine opgaver", + "Show all my tasks": "Vis alle mine opgaver", + "No tasks assigned to you": "Du har ingen tildelte opgaver", + "Browse projects": "Gennemse projekter", + "Later": "Senere", + "Due {date}": "Forfalder {date}", + "Could not change the status. Please try again.": "Status kunne ikke ændres. Prøv igen.", + "Completed today": "Fuldført i dag", + "My open tasks": "Mine åbne opgaver", + "My overdue tasks": "Mine forfaldne opgaver", + "My tasks in progress": "Mine opgaver i gang", + "Pin to the top": "Fastgør øverst", + "Unpin": "Frigør", + "Pinned": "Fastgjort", + "Actions for {title}": "Handlinger for {title}", + "Could not save your project order. Please try again.": "Din projektrækkefølge kunne ikke gemmes. Prøv igen.", + "No boards yet": "Ingen tavler endnu", + "Create a project to get a board.": "Opret et projekt for at få en tavle.", + "Use the Projects page to create and manage your projects and tasks.": "Brug siden Projekter til at oprette og administrere dine projekter og opgaver.", + "Go to projects": "Gå til projekter", + "You are not a member of any projects yet.": "Du er endnu ikke medlem af noget projekt.", + "Could not search for users. Please try again.": "Brugere kunne ikke søges. Prøv igen.", + "Project creation is restricted to administrators.": "Kun administratorer kan oprette projekter.", + "Only the project owner or an administrator can delete this project.": "Kun projektejeren eller en administrator kan slette dette projekt.", + "No projects are available to you yet. Ask an administrator to create one.": "Der er endnu ingen projekter tilgængelige for dig. Bed en administrator om at oprette et.", + "Due: {date}": "Forfalder: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Opgaver med en start- eller forfaldsdato vises på tidslinjen. Tilføj datoer for at se dem her.", + "You do not have access to this project.": "Du har ikke adgang til dette projekt.", + "Zoom level": "Zoomniveau", + "Unscheduled": "Ikke planlagt", + "Start: {date}": "Start: {date}", + "Today": "I dag", + "No scheduled tasks": "Ingen planlagte opgaver", + "An unexpected error occurred.": "Der opstod en uventet fejl.", + "Column {number} name": "Navn på kolonne {number}", + "Failed to save creation policy": "Oprettelsespolitikken kunne ikke gemmes", + "All authenticated users": "Alle godkendte brugere", + "Control who may create new projects": "Styr hvem der må oprette nye projekter", + "Administrators only": "Kun administratorer", + "Project creation": "Oprettelse af projekter", + "Allow project creation": "Tillad oprettelse af projekter", + "Creation policy saved successfully": "Oprettelsespolitik gemt", + "Initializing…": "Starter…", + "e.g. 2h 30m, 90m, 1.5h": "f.eks. 2h 30m, 90m, 1.5h", + "Log time": "Registrer tid", + "Save estimate": "Gem estimat", + "Logged: {logged}": "Registreret: {logged}", + "over by {amount}": "{amount} over", + "Time tracking": "Tidsregistrering", + "Estimate": "Estimat", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Angiv et gyldigt estimat (f.eks. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Angiv en gyldig varighed (f.eks. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Tidsregistreringen kunne ikke gemmes. Prøv igen.", + "Edit time entry": "Rediger tidsregistrering", + "Duration": "Varighed", + "Date range": "Periode", + "Last week": "Sidste uge", + "No time logged": "Ingen tid registreret", + "Log time on a task to see it here.": "Registrer tid på en opgave for at se den her.", + "To date": "Til dato", + "This week": "Denne uge", + "Total: {total}": "I alt: {total}", + "From date": "Fra dato", + "Custom range": "Egen periode", + "All time": "Hele perioden", + "Could not delete a task, so some data may remain. Try deleting the project again.": "En opgave kunne ikke slettes, så der kan være data tilbage. Slet projektet igen.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "En tidsregistrering kunne ikke slettes, så der kan være data tilbage. Slet projektet igen.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "En kolonne kunne ikke slettes, så der kan være data tilbage. Slet projektet igen.", + "Could not delete the project. Please try again.": "Projektet kunne ikke slettes. Prøv igen.", + "Notification settings": "Notifikationsindstillinger", + "Configure when due-date reminders are sent": "Angiv hvornår påmindelser om forfaldsdatoer sendes", + "Due-date reminder lead time (hours)": "Varsel for påmindelse om forfaldsdato (timer)", + "Lead time must be between 1 and 336 hours": "Varslet skal være mellem 1 og 336 timer", + "Reminder lead time saved successfully": "Varsel for påmindelse gemt", + "Failed to save reminder lead time": "Varslet for påmindelsen kunne ikke gemmes", + "Notifications": "Notifikationer", + "Notify me 1 day before a task's due date": "Giv mig besked 1 dag før en opgaves forfaldsdato", + "Draft": "Kladde", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Om lektionen er en kladde, som kun læreren ser, gennemføres eller er aflyst.", + "New release": "Ny udgivelse", + "Roadmap chart. The same releases and epics are listed below.": "Køreplansdiagram. De samme udgivelser og epics står i listen nedenfor.", + "Nothing on the roadmap yet": "Intet på køreplanen endnu", + "Releases with a target date and epics with dated tasks appear here.": "Udgivelser med en måldato og epics med daterede opgaver vises her.", + "Releases": "Udgivelser", + "No releases yet": "Ingen udgivelser endnu", + "Target date: {date}": "Måldato: {date}", + "No target date": "Ingen måldato", + "Edit {name}": "Rediger {name}", + "Mark {name} as released": "Markér {name} som udgivet", + "Mark as released": "Markér som udgivet", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Ingen epics endnu. Åbn en opgave for at gøre den til en epic.", + "Not scheduled yet": "Ikke planlagt endnu", + "Planned": "Planlagt", + "Released": "Udgivet", + "Edit release": "Rediger udgivelse", + "Target date": "Måldato", + "Could not save the release. Please try again.": "Udgivelsen kunne ikke gemmes. Prøv igen.", + "Every task of this release is done or cancelled.": "Alle opgaver i denne udgivelse er færdige eller annulleret.", + "Not finished yet: {count}": "Ikke færdige endnu: {count}", + "What happens to these tasks?": "Hvad sker der med disse opgaver?", + "Move to {name}": "Flyt til {name}", + "Remove the release": "Fjern udgivelsen", + "Keep it on {name}": "Behold dem på {name}", + "Could not mark the release as released. Please try again.": "Udgivelsen kunne ikke markeres som udgivet. Prøv igen.", + "Roadmap": "Køreplan", + "Tasks or roadmap": "Opgaver eller køreplan", + "Release": "Udgivelse", + "Epic": "Epic", + "This task is an epic": "Denne opgave er en epic", + "A named, dated delivery of a project that its tasks are planned against.": "En navngiven, dateret leverance fra et projekt, som projektets opgaver planlægges mod.", + "Name of the release": "Udgivelsens navn", + "The project this release belongs to": "Det projekt, udgivelsen hører til", + "What this release delivers": "Hvad udgivelsen leverer", + "When work on the release starts": "Hvornår arbejdet på udgivelsen starter", + "The date the release is due": "Datoen, hvor udgivelsen skal være klar", + "Whether the release is planned, released or archived": "Om udgivelsen er planlagt, udgivet eller arkiveret", + "Released on": "Udgivet den", + "When the release was marked as released": "Hvornår udgivelsen blev markeret som udgivet", + "The release this task is planned for": "Den udgivelse, opgaven er planlagt til", + "Board view options": "Visningsindstillinger for tavlen", + "Colour cards": "Farv kort", + "No colour": "Ingen farve", + "By label": "Efter etiket", + "Swimlanes": "Svømmebaner", + "No swimlanes": "Ingen svømmebaner", + "By assignee": "Efter ansvarlig", + "By epic": "Efter epic", + "No assignee": "Ikke tildelt", + "No epic": "Intet epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kort bliver i deres epic-række. Skift epic på opgavesiden.", + "Hand over to": "Overdrag til", + "Could not save your board view. It applies until you reload.": "Din tavlevisning kunne ikke gemmes. Den gælder, indtil du genindlæser.", + "Timetable wish": "Skemaønske", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Et ønske, som generatoren tager hensyn til. Et hårdt ønske holder den altid, et blødt ønske hvor den kan.", + "Whether the wish is about a teacher, a group, a room or one activity": "Om ønsket gælder en lærer, en gruppe, et lokale eller én aktivitet", + "Teacher": "Lærer", + "Group": "Gruppe", + "Reference": "Reference", + "The user, group, room or activity the wish is about": "Brugeren, gruppen, lokalet eller aktiviteten, ønsket gælder", + "What the wish asks for": "Hvad ønsket beder om", + "Not on these periods": "Ikke i disse moduler", + "Preferably not on these periods": "Helst ikke i disse moduler", + "At most a number of lessons a day": "Højst et antal lektioner om dagen", + "No free periods between lessons": "Ingen huller mellem lektionerne", + "Always the same room": "Altid samme lokale", + "Periods": "Moduler", + "The periods of the week the wish is about, such as wed-5": "Ugens moduler, ønsket gælder, fx wed-5", + "Limit": "Grænse", + "The most lessons a day, for a wish of that kind": "Flest lektioner om dagen, for et ønske af den slags", + "Strength": "Styrke", + "Whether the generator must keep the wish or should keep it": "Om generatoren skal eller bør holde ønsket", + "Hard": "Hårdt", + "Soft": "Blødt", + "Weight": "Vægt", + "How much a soft wish counts, from 1 to 3": "Hvor meget et blødt ønske tæller, fra 1 til 3", + "Why the wish exists": "Hvorfor ønsket findes", + "Timetable scenario": "Skemascenarie", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Ét ugemønster, lavet af generatoren eller taget fra det nuværende skema. Det gemmer sine inddata og hvor godt det holder ønskerne.", + "The name timetablers know the scenario by": "Navnet, skemalæggerne kender scenariet under", + "Whether the generator made it or it came from the current timetable": "Om generatoren lavede det, eller det kommer fra det nuværende skema", + "Generated": "Genereret", + "From the current timetable": "Fra det nuværende skema", + "Week of": "Uge fra", + "The Monday of the first week of the window": "Mandagen i periodens første uge", + "Window start": "Periodens start", + "The first day the week pattern applies to": "Den første dag, ugemønstret gælder for", + "Window end": "Periodens slutning", + "The last day the week pattern applies to": "Den sidste dag, ugemønstret gælder for", + "Waiting, generating, done, failed, or published as draft lessons": "Venter, genereres, færdig, mislykket eller udgivet som kladdelektioner", + "Waiting": "Venter", + "Generating": "Genereres", + "Failed": "Mislykket", + "Published": "Udgivet", + "Seed": "Frø", + "The number the generator starts from, so a run can be repeated": "Tallet, generatoren starter fra, så en kørsel kan gentages", + "Input": "Inddata", + "The periods, rooms, lessons and wishes the scenario was made from": "Modulerne, lokalerne, lektionerne og ønskerne, scenariet blev lavet ud fra", + "Placements": "Placeringer", + "Each lesson with the period and room it was given": "Hver lektion med det modul og lokale, den fik", + "Unplaced lessons": "Uplacerede lektioner", + "Lessons without a place, each with the hard wish that blocked it": "Lektioner uden plads, hver med det hårde ønske, der blokerede den", + "Broken wishes": "Brudte ønsker", + "The wishes this scenario breaks, with the lessons that break them": "De ønsker, dette scenarie bryder, med de lektioner, der bryder dem", + "Measures": "Mål", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Placerede lektioner, brudte ønsker, lærerhuller, lektioner om dagen og lokalebrug", + "Reason": "Årsag", + "Why the run failed": "Hvorfor kørslen mislykkedes", + "Published at": "Udgivet", + "When the scenario was written out as draft lessons": "Hvornår scenariet blev skrevet ud som kladdelektioner", + "Edit wish": "Rediger ønske", + "New wish": "Nyt ønske", + "Hard: the generator always keeps it": "Hårdt: generatoren overholder det altid", + "Soft: the generator keeps it where it can": "Blødt: generatoren overholder det, hvor den kan", + "Weight (1 to 3)": "Vægt (1 til 3)", + "Most lessons a day": "Højst antal lektioner om dagen", + "Period": "Lektion", + "{day} period {number}": "{day} lektion {number}", + "Teacher (user name)": "Lærer (brugernavn)", + "Activity (group:subject)": "Aktivitet (gruppe:fag)", + "Say who or what the wish is about.": "Angiv hvem eller hvad ønsket gælder.", + "Choose at least one period.": "Vælg mindst én lektion.", + "The limit is a whole number of 1 or more.": "Grænsen er et helt tal på 1 eller mere.", + "Timetable": "Skema", + "Wishes": "Ønsker", + "Timetable wishes": "Skemaønsker", + "Generator run": "Generatorkørsel", + "Generator progress": "Generatorens fremskridt", + "The run failed: {reason}": "Kørslen mislykkedes: {reason}", + "{placed} of {lessons} lessons placed": "{placed} af {lessons} lektioner placeret", + "Generate again": "Generér igen", + "Generate": "Generér", + "Every lesson has a place.": "Hver lektion har en plads.", + "Lesson": "Lektion", + "No free period and room": "Ingen ledig lektion og lokale", + "Broken soft wishes": "Brudte bløde ønsker", + "Every soft wish is kept.": "Hvert blødt ønske er overholdt.", + "Wish": "Ønske", + "Lessons": "Lektioner", + "Generating: {percent}% of the time budget used": "Genererer: {percent}% af tiden brugt", + "Waiting to start": "Venter på start", + "Published as draft lessons": "Udgivet som kladdelektioner", + "Could not read the scenario.": "Scenariet kunne ikke læses.", + "Could not start the run.": "Kørslen kunne ikke startes.", + "Scenarios": "Scenarier", + "Timetable scenarios": "Skemascenarier", + "Scenario": "Scenarie", + "Take the current timetable": "Brug det nuværende skema", + "Could not take the current timetable.": "Det nuværende skema kunne ikke hentes.", + "Broken hard wishes": "Brudte hårde ønsker", + "Not on a period of the week grid": "Ikke på en lektion i ugeskemaet", + "Compare scenarios": "Sammenlign scenarier", + "Scenarios to compare": "Scenarier at sammenligne", + "Choose two or three scenarios to compare them.": "Vælg to eller tre scenarier for at sammenligne dem.", + "Measure": "Måling", + "Best": "Bedst", + "Lessons that differ": "Lektioner der er forskellige", + "No lesson differs.": "Ingen lektion er forskellig.", + "Not placed": "Ikke placeret", + "{period} in {room}": "{period} i {room}", + "Lessons placed": "Placerede lektioner", + "Lessons without a place": "Lektioner uden plads", + "Clashes": "Konflikter", + "Hard wishes broken": "Brudte hårde ønsker", + "Soft wishes broken": "Brudte bløde ønsker", + "Soft wishes broken, weighted": "Brudte bløde ønsker, vægtet", + "Free periods between lessons, all teachers": "Mellemtimer, alle lærere", + "Most free periods of one teacher": "Flest mellemtimer for én lærer", + "Most lessons of one group on a day": "Flest lektioner for én gruppe på en dag", + "Room use": "Lokalebrug", + "Publish as draft lessons": "Udgiv som kladdelektioner", + "Draft lessons written: {count}": "Kladdelektioner skrevet: {count}", + "Could not publish the scenario.": "Scenariet kunne ikke udgives.", + "Rules": "Regler", + "Rules for {column}": "Regler for {column}", + "When a card enters this column": "Når et kort kommer ind i denne kolonne", + "Action": "Handling", + "Set the priority": "Sæt prioriteten", + "Assign to": "Tildel til", + "Assign the person who moved the card": "Tildel den person, der flyttede kortet", + "Remove the assignee": "Fjern den ansvarlige", + "Add a label": "Tilføj en etiket", + "No longer a project member": "Ikke længere projektmedlem", + "This label no longer exists": "Denne etiket findes ikke længere", + "Add rule": "Tilføj regel", + "Remove rule": "Fjern regel", + "No rules yet. Add one to change a card when it enters this column.": "Ingen regler endnu. Tilføj en for at ændre et kort, når det kommer ind i denne kolonne.", + "Could not save the rules. Please try again.": "Reglerne kunne ikke gemmes. Prøv igen.", + "1 rule runs when a card enters this column": "1 regel kører, når et kort kommer ind i denne kolonne", + "{count} rules run when a card enters this column": "{count} regler kører, når et kort kommer ind i denne kolonne", + "Rules applied: {changes}": "Regler anvendt: {changes}", + "assigned to {name}": "tildelt {name}", + "assignee removed": "ansvarlig fjernet", + "priority {priority}": "prioritet {priority}", + "label {label}": "etiket {label}", + "What happens to a card when it enters this column, applied in list order.": "Hvad der sker med et kort, når det kommer ind i denne kolonne, i listens rækkefølge.", + "Value": "Værdi", + "What the rule does to the card.": "Hvad reglen gør ved kortet.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioriteten, bruger-id'et eller etiket-id'et, som handlingen bruger; tom for handlinger uden værdi.", + "is not": "er ikke", + "{dimension} is not": "{dimension} er ikke", + "Saved filters": "Gemte filtre", + "No saved filters yet": "Ingen gemte filtre endnu", + "Save filter": "Gem filter", + "Rename \"{name}\"": "Omdøb \"{name}\"", + "Delete \"{name}\"": "Slet \"{name}\"", + "Clear filters": "Ryd filtre", + "Showing {shown} of {total} tasks": "Viser {shown} af {total} opgaver", + "Me": "Mig", + "No date": "Ingen dato", + "Rename saved filter": "Omdøb gemt filter", + "Share with the project": "Del med projektet", + "Give the filter a name": "Giv filteret et navn", + "Could not save the filter. Please try again.": "Filteret kunne ikke gemmes. Prøv igen.", + "Some labels in \"{name}\" no longer exist and were left out.": "Nogle etiketter i \"{name}\" findes ikke længere og er udeladt.", + "Could not delete the filter. Please try again.": "Filteret kunne ikke slettes. Prøv igen.", + "Saved filter": "Gemt filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Et navngivet tavlefilter for ét projekt, privat for den, der gemte det, medmindre det deles med projektet.", + "The project whose board the filter applies to": "Projektet, hvis tavle filteret gælder", + "The name the filter is listed under": "Navnet, filteret vises under", + "Saved by": "Gemt af", + "Nextcloud user id of the person who saved the filter": "Nextcloud-bruger-id for den, der gemte filteret", + "Shared with the project": "Delt med projektet", + "Whether every project member sees and applies the filter": "Om alle projektmedlemmer ser og kan bruge filteret", + "Criteria": "Kriterier", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filteret: ansvarlig, etiket, prioritet og forfaldsdato, hver med er eller er ikke og dens værdier", + "Cross-project view": "Tværgående projektvisning", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Et gemt udvalg af projekter, hvis opgaver vises samlet i statusbaner, delt med de personer det nævner.", + "Shared with": "Delt med", + "The name the view is listed under": "Navnet visningen står under", + "Nextcloud user id of the person who saved the view": "Nextcloud-bruger-id for den person, der gemte visningen", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-bruger-id'er for de personer, visningen er delt med", + "The projects whose tasks the view shows, at most twenty": "De projekter, hvis opgaver visningen viser, højst tyve", + "1 project in this view is hidden from you.": "1 projekt i denne visning er skjult for dig.", + "{count} projects in this view are hidden from you.": "{count} projekter i denne visning er skjult for dig.", + "{project} has no column for {status}.": "{project} har ingen kolonne for {status}.", + "This view does not exist or is not shared with you.": "Denne visning findes ikke eller er ikke delt med dig.", + "\"{task}\" moved to {status}.": "\"{task}\" flyttet til {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Tværgående projektvisninger", + "New view": "Ny visning", + "Edit view": "Rediger visning", + "Delete view": "Slet visning", + "Give the view a name": "Giv visningen et navn", + "Pick at least one project": "Vælg mindst ét projekt", + "A view shows at most {max} projects": "En visning viser højst {max} projekter", + "Could not save the view. Please try again.": "Kunne ikke gemme visningen. Prøv igen.", + "Could not delete the view. Please try again.": "Kunne ikke slette visningen. Prøv igen.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Slet \"{title}\"? Projekterne og deres opgaver forbliver, som de er.", + "People see the tasks of the projects they are in, never more.": "Folk ser opgaverne i de projekter, de er med i, aldrig mere.", + "No views yet. A view shows the tasks of several of your projects together.": "Ingen visninger endnu. En visning viser opgaverne fra flere af dine projekter samlet.", + "Projects in view: {count}": "Projekter i visningen: {count}", + "Notify me when a task is assigned to me": "Giv mig besked, når en opgave tildeles mig", + "Also send these to me by email": "Send dem også til mig pr. e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Tilføj en e-mailadresse i dine personlige Nextcloud-indstillinger for at få e-mail.", + "Code link": "Kodelink", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Et commit, en branch, en merge request eller et issue i en kodeplatform, der arbejder på en opgave.", + "The task the link belongs to": "Opgaven, linket hører til", + "The project of the task": "Opgavens projekt", + "Task key": "Opgavenøgle", + "The task key the forge text named, such as VC-12": "Opgavenøglen, som teksten i kodeplatformen nævnte, fx VC-12", + "What the link points at": "Hvad linket peger på", + "Link": "Link", + "The address of the item in the forge": "Elementets adresse i kodeplatformen", + "The commit message, branch name or merge request title": "Commit-beskeden, branch-navnet eller titlen på merge requesten", + "Repository": "Repository", + "The repository, such as acme/portal": "Repositoryet, fx acme/portal", + "Forge id": "Id i platformen", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Elementets eget id i kodeplatformen, fx github:acme/portal#42 eller en commit-hash", + "State": "Status", + "The state of a merge request or issue": "Status for en merge request eller et issue", + "Who made the commit or opened the merge request": "Hvem der lavede committet eller åbnede merge requesten", + "When the commit was made or the merge request last changed": "Hvornår committet blev lavet, eller merge requesten sidst ændrede sig", + "Added by": "Tilføjet af", + "Whether a person added the link or the integration wrote it": "Om en person tilføjede linket, eller integrationen skrev det", + "Nextcloud user UIDs of project members": "Nextcloud-bruger-id'er for projektmedlemmer", + "Add link": "Tilføj link", + "Added by hand": "Tilføjet manuelt", + "Branch": "Branch", + "Code": "Kode", + "Commit": "Commit", + "From the integration": "Fra integrationen", + "Link to a commit, branch or merge request": "Link til et commit, en branch eller en merge request", + "Merge request": "Merge request", + "Merged": "Flettet", + "No code linked yet. Name {key} in a commit message or paste a link.": "Ingen kode linket endnu. Nævn {key} i en commit-besked, eller indsæt et link.", + "No code linked yet. Paste a link to a commit or merge request.": "Ingen kode linket endnu. Indsæt et link til et commit eller en merge request.", + "Paste a web address that starts with https://.": "Indsæt en webadresse, der starter med https://.", + "Remove link {title}": "Fjern linket {title}", + "The link could not be added.": "Linket kunne ikke tilføjes.", + "The link could not be removed.": "Linket kunne ikke fjernes.", + "This link is already on the task.": "Dette link er allerede på opgaven.", + "Code forges": "Kodeplatforme", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Link GitHub-commits og pull requests til opgaver. Integriq modtager hændelserne; planninq kalder aldrig GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Download konfigurationen, og importér den i Integriq. Udfyld derefter en hemmelighed i reglen \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Tilføj i GitHub en webhook til repositoryet med denne adresse og samme hemmelighed. Vælg indholdstypen application/json og hændelserne push og pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nævn opgavenøglen, fx VC-12, i en commit-besked, et branch-navn eller titlen på en pull request. Linket vises så på den opgave.", + "Without Integriq, project members can still paste a link on the task page.": "Uden Integriq kan projektmedlemmer stadig indsætte et link på opgavesiden.", + "Download the Integriq configuration": "Download Integriq-konfigurationen", + "Calendar": "Kalender", + "Previous": "Forrige", + "Calendar view": "Kalendervisning", + "Starts:": "Starter:", + "No tasks with a date in this month.": "Ingen opgaver med en dato i denne måned.", + "Week of {start} to {end}": "Uge fra {start} til {end}", + "My calendar": "Min kalender", + "Show as list": "Vis som liste", + "Show as calendar": "Vis som kalender", + "Open my calendar": "Åbn min kalender", + "Nextcloud Tasks": "Nextcloud Opgaver", + "Show my tasks in Nextcloud Tasks": "Vis mine opgaver i Nextcloud Opgaver", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "De opgaver, der er tildelt dig eller delt med dig, vises på en liste \"Planninq\" i Nextcloud Opgaver og Kalender. Ændringer, du laver der, erstattes ved næste ændring i Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Denne server kan ikke skrive til Nextcloud Opgaver, så eksporten er ikke tilgængelig.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Administreres af Planninq. Ændringer, du laver her, erstattes ved næste ændring i Planninq.", + "Working days and holidays": "Arbejdsdage og helligdage", + "Dates set on the timeline skip the days that are not working days.": "Datoer sat på tidslinjen springer de dage over, der ikke er arbejdsdage.", + "Working weekdays": "Ugens arbejdsdage", + "Non-working days": "Fridage", + "No non-working days yet.": "Ingen fridage endnu.", + "Add day": "Tilføj dag", + "Year": "År", + "Add Dutch national holidays": "Tilføj nederlandske helligdage", + "Save working days": "Gem arbejdsdage", + "Choose at least one working weekday.": "Vælg mindst én arbejdsdag.", + "Working days saved.": "Arbejdsdage gemt.", + "Could not save the working days.": "Arbejdsdagene kunne ikke gemmes.", + "New Year's Day": "Nytårsdag", + "Easter Sunday": "Påskedag", + "Easter Monday": "2. påskedag", + "King's Day": "Kongens dag", + "Liberation Day": "Befrielsesdag", + "Ascension Day": "Kristi himmelfartsdag", + "Whit Sunday": "Pinsedag", + "Whit Monday": "2. pinsedag", + "Christmas Day": "Juledag", + "Boxing Day": "2. juledag", + "Dates of {title}": "Datoer for {title}", + "The due date cannot be before the start date.": "Forfaldsdatoen kan ikke ligge før startdatoen.", + "{title}, from {start} to {end}": "{title}, fra {start} til {end}", + "The dates could not be saved.": "Datoerne kunne ikke gemmes.", + "{title} now runs from {start} to {end}": "{title} løber nu fra {start} til {end}", + "Auto-scheduling": "Automatisk planlægning", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Når den er slået til, tilbyder en senere forfaldsdato på tidslinjen at flytte de opgaver, den blokerer, med.", + "Move blocked tasks along when a task slips": "Flyt blokerede opgaver med, når en opgave skrider", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "På tidslinjen tilbyder en senere forfaldsdato at flytte de blokerede opgaver med. Kun \"blokerer\"-links tæller, og opgaver flyttes kun senere.", + "Move the tasks that wait for {title}?": "Flyt de opgaver, der venter på {title}?", + "These tasks wait for it and would start after its new due date:": "Disse opgaver venter på den og ville starte efter den nye forfaldsdato:", + "{count} tasks would move; the first {limit} are listed.": "{count} opgaver ville blive flyttet; de første {limit} vises.", + "Now": "Nu", + "After the move": "Efter flytningen", + "Only this task": "Kun denne opgave", + "Move all": "Flyt alle", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stoppet ved {title}: datoerne kunne ikke gemmes. Opgaverne før den blev flyttet.", + "Cumulative flow": "Kumulativt flow", + "Show as chart": "Vis som diagram", + "Show as table": "Vis som tabel", + "Tasks per column per day": "Opgaver pr. kolonne pr. dag", + "Tasks without recorded history in this period: {count}": "Opgaver uden registreret historik i denne periode: {count}", + "Lead and cycle time": "Gennemløbstid og cyklustid", + "No tasks were finished in this period.": "Ingen opgaver blev afsluttet i denne periode.", + "Finished tasks": "Afsluttede opgaver", + "Cycle time, average": "Cyklustid, gennemsnit", + "Cycle time, 85th percentile": "Cyklustid, 85. percentil", + "Lead time, average": "Gennemløbstid, gennemsnit", + "Tasks whose finish time was estimated from their history: {count}": "Opgaver hvis sluttidspunkt blev anslået ud fra historikken: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Cyklustid for hver afsluttet opgave, med gennemsnit og 85. percentil", + "Slowest tasks": "Langsomste opgaver", + "cycle {cycle}, lead {lead}": "cyklus {cycle}, gennemløb {lead}", + "{days} days": "{days} dage", + "Could not load the flow of this project.": "Projektets flow kunne ikke indlæses.", + "Last {days} days": "Seneste {days} dage", + "Portfolio flow": "Porteføljeflow", + "An admin adds portfolios under Projects, Portfolios.": "En administrator tilføjer porteføljer under Projekter, Porteføljer.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekter der ikke vises, fordi højst 50 vises ad gangen: {count}", + "Could not load the flow of this portfolio.": "Porteføljens flow kunne ikke indlæses.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativt flow og cyklustid på tværs af en porteføljes projekter.", + "Edit report": "Rediger rapport", + "Only tasks where": "Kun opgaver hvor", + "Group by": "Gruppér efter", + "Display": "Visning", + "Share with everyone who can read its projects": "Del med alle der kan læse dens projekter", + "The report could not be saved.": "Rapporten kunne ikke gemmes.", + "Number of tasks": "Antal opgaver", + "Bar": "Søjle", + "Donut": "Ring", + "Table": "Tabel", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} af {total} projekter i denne rapport er ikke synlige for dig", + "No tasks match this report.": "Ingen opgaver passer til denne rapport.", + "None": "Ingen", + "Could not load this report.": "Rapporten kunne ikke indlæses.", + "Report": "Rapport", + "Your reports": "Dine rapporter", + "My reports": "Mine rapporter", + "Shared reports": "Delte rapporter", + "You have not built a report yet.": "Du har ikke lavet en rapport endnu.", + "Nobody has shared a report with you yet.": "Ingen har delt en rapport med dig endnu.", + "Reports you built over tasks, and the ones shared with you.": "Rapporter du har lavet over opgaver, og dem der er delt med dig.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "En gemt forespørgsel over opgaver: hvilke projekter, hvilke filtre, grupperet efter hvad, talt eller summeret, og vist som tabel eller diagram.", + "The name the report is listed under": "Navnet rapporten står under", + "What the report shows and who it is for": "Hvad rapporten viser, og hvem den er til", + "Nextcloud user id of the person who saved the report": "Nextcloud-bruger-id for den der gemte rapporten", + "Who can open the report": "Hvem der kan åbne rapporten", + "Only me": "Kun mig", + "Everyone who can read its projects": "Alle der kan læse dens projekter", + "The projects the report covers, at most fifty": "Projekterne rapporten dækker, højst halvtreds", + "Filters": "Filtre", + "Task fields and the value each must equal": "Opgavefelter og den værdi hvert skal være lig med", + "The task field the report groups on": "Opgavefeltet rapporten grupperer på", + "Count the tasks, or add up a number on them": "Tæl opgaverne, eller læg et tal på dem sammen", + "Sum": "Sum", + "Sum of": "Sum af", + "The number added up when the measure is a sum": "Tallet der lægges sammen, når målet er en sum", + "Story points": "Story points", + "Estimated duration": "Anslået varighed", + "How the report is shown": "Hvordan rapporten vises", + "Issue type": "Sagstype", + "Task fields and the value each must equal; empty when the report covers every task": "Opgavefelter og den værdi, hvert felt skal have; tom når rapporten dækker alle opgaver", + "The status a task must have": "Den status en opgave skal have", + "The priority a task must have": "Den prioritet en opgave skal have", + "The user a task must be assigned to": "Den bruger en opgave skal være tildelt", + "A label a task must carry": "En etiket en opgave skal have", + "The board column a task must be in": "Den tavlekolonne en opgave skal stå i", + "The issue type a task must have": "Den sagstype en opgave skal have", + "Manager groups": "Ledergrupper", + "Member groups": "Medlemsgrupper", + "Viewer groups": "Læsergrupper", + "Viewers": "Læsere", + "Owning group": "Ejergruppe", + "Nextcloud groups whose members manage the project": "Nextcloud-grupper hvis medlemmer leder projektet", + "Nextcloud groups whose members work on the project": "Nextcloud-grupper hvis medlemmer arbejder på projektet", + "Nextcloud groups whose members may read the project": "Nextcloud-grupper hvis medlemmer må læse projektet", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-brugere der leder projektet: indstillinger, medlemmer og arbejde", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-brugere der må læse projektet og dets arbejde, men ikke ændre det", + "The Nextcloud group that owns the project with its creator, at most one": "Den Nextcloud-gruppe der ejer projektet sammen med dets opretter, højst én", + "Nextcloud user ids who may read this through the project": "Nextcloud-brugere der må læse dette gennem projektet", + "Nextcloud groups whose members may change this through the project": "Nextcloud-grupper hvis medlemmer må ændre dette gennem projektet", + "Nextcloud groups whose members may read this through the project": "Nextcloud-grupper hvis medlemmer må læse dette gennem projektet", + "Search for a person or a group…": "Søg efter en person eller en gruppe…", + "No one found. Your admin's sharing settings decide who you can find.": "Ingen fundet. Din administrators delingsindstillinger bestemmer, hvem du kan finde.", + "Type at least two characters": "Skriv mindst to tegn", + "Everyone in this group": "Alle i denne gruppe", + "Could not search for people. Please try again.": "Kunne ikke søge efter personer. Prøv igen.", + "Could not remove the group": "Kunne ikke fjerne gruppen", + "Only the owner and managers change who is on this project.": "Kun ejeren og administratorerne ændrer, hvem der er med i dette projekt.", + "Role of {name}": "Rolle for {name}", + "Manager": "Administrator", + "Member": "Medlem", + "Viewer": "Læser", + "Could not change the role": "Kunne ikke ændre rollen", + "Owned by group: {name}": "Ejet af gruppen: {name}", + "No group owns this project.": "Ingen gruppe ejer dette projekt.", + "Owned by group": "Ejet af gruppe", + "Search for a group…": "Søg efter en gruppe…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen gruppe fundet. Din administrators delingsindstillinger bestemmer, hvilke grupper du kan finde.", + "No owning group": "Ingen ejergruppe", + "Could not search for groups. Please try again.": "Kunne ikke søge efter grupper. Prøv igen.", + "Could not change the owning group": "Kunne ikke ændre ejergruppen", + "You can read this project. Only its members change it.": "Du kan læse dette projekt. Kun dets medlemmer ændrer det.", + "Course": "Kursus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Det kursus, timen underviser i, fx et valgfag, når skolens læringsapp kender det.", + "Online meeting link": "Link til onlinetimen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvor eleverne deltager i timen online. Knappen Deltag vises kun ved et https-link." }, "plurals": null } diff --git a/l10n/de.js b/l10n/de.js index 6eb98e95..f5af5d22 100644 --- a/l10n/de.js +++ b/l10n/de.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Label konnte nicht gelöscht werden", "Delete label \"{title}\"? It will be removed from {count} task.": "Label \"{title}\" löschen? Es wird aus {count} Aufgaben entfernt.", "Label deleted and removed from {count} task": "Label gelöscht und aus {count} Aufgaben entfernt", - "used by {count} task": "verwendet von {count} Aufgaben" + "used by {count} task": "verwendet von {count} Aufgaben", + "Active projects": "Aktive Projekte", + "Archived projects": "Archivierte Projekte", + "Boards": "Boards", + "My projects": "Meine Projekte", + "Portfolio": "Portfolio", + "Project board": "Projekt-Board", + "Projects I am in": "Projekte, an denen ich beteiligt bin", + "Timeline": "Zeitleiste", + "Timesheet": "Zeiterfassung", + "Features & roadmap": "Funktionen und Roadmap", + "Flow": "Ablauf", + "Flows": "Abläufe", + "Reports": "Berichte", + "Pick a report to open it.": "Wählen Sie einen Bericht, um ihn zu öffnen.", + "In progress": "In Bearbeitung", + "Date": "Datum", + "Due": "Fällig", + "Assignee": "Zugewiesen an", + "Who": "Wer", + "What": "Was", + "Minutes": "Minuten", + "Entries": "Einträge", + "Most recent": "Zuletzt", + "Per person": "Pro Person", + "By status": "Nach Status", + "By priority": "Nach Priorität", + "Task status": "Aufgabenstatus", + "Time spent": "Aufgewendete Zeit", + "Capacity": "Kapazität", + "Due soonest": "Als Nächstes fällig", + "Minutes logged": "Erfasste Minuten", + "Nothing is due": "Nichts ist fällig", + "Nothing logged yet": "Noch nichts erfasst", + "What is open, what is blocked, and what is overdue.": "Was offen ist, was blockiert ist und was überfällig ist.", + "How allocation is spread across the people working on projects.": "Wie sich die Auslastung auf die Projektbeteiligten verteilt.", + "Hours logged, and the projects they went to.": "Erfasste Stunden und die Projekte, in die sie geflossen sind.", + "Billable": "Abrechenbar", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Projekte werden geladen", + "No projects for this client yet": "Noch keine Projekte für diesen Kunden", + "Open in Planninq": "In Planninq öffnen", + "This project could not be found": "Dieses Projekt wurde nicht gefunden", + "Untitled project": "Unbenanntes Projekt", + "and {count} more": "und {count} weitere", + "Store": "Store", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installieren Sie Register, Schemata und Flows, die andere Organisationen veröffentlicht haben.", + "Work Date": "Arbeitsdatum", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Spaltenaktionen", + "Columns": "Spalten", + "Could not remove the column. Please try again.": "Die Spalte konnte nicht entfernt werden. Bitte versuchen Sie es erneut.", + "Could not save the column. Please try again.": "Die Spalte konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "Done column": "Erledigt-Spalte", + "Edit column": "Spalte bearbeiten", + "Keep the card's status": "Status der Karte beibehalten", + "Move its cards to": "Karten verschieben nach", + "Move left": "Nach links", + "Move right": "Nach rechts", + "Status of cards moved here": "Status der hierher verschobenen Karten", + "The last done column cannot be removed.": "Die letzte Erledigt-Spalte kann nicht entfernt werden.", + "WIP limit": "WIP-Limit", + "over limit": "über dem Limit", + "The status a card gets when it is moved into this column.": "Der Status, den eine Karte erhält, wenn sie in diese Spalte verschoben wird.", + "All priorities": "Alle Prioritäten", + "Could not create the task. Please try again.": "Die Aufgabe konnte nicht erstellt werden. Bitte versuchen Sie es erneut.", + "Created": "Erstellt", + "Move to backlog": "In den Backlog", + "Move to board": "Aufs Board", + "New task": "Neue Aufgabe", + "Nothing in the backlog": "Nichts im Backlog", + "Rank": "Rang", + "Sort by": "Sortieren nach", + "Sort by rank to reorder": "Nach Rang sortieren, um neu anzuordnen", + "Task actions": "Aufgabenaktionen", + "All labels": "Alle Labels", + "Filter tasks by label": "Aufgaben nach Label filtern", + "View timeline": "Zeitleiste anzeigen", + "Board": "Board", + "List": "Liste", + "Column": "Spalte", + "Board or list": "Board oder Liste", + "Log": "Protokoll", + "Add entry": "Eintrag hinzufügen", + "Show": "Anzeigen", + "No actions yet": "Noch keine Aktionen", + "Closed": "Geschlossen", + "Entry actions": "Eintragsaktionen", + "Add action": "Aktion hinzufügen", + "by {author}": "von {author}", + "saved {time}": "gespeichert {time}", + "Attendees: {names}": "Teilnehmende: {names}", + "Add the first entry": "Ersten Eintrag hinzufügen", + "Issues": "Probleme", + "Lessons learned": "Erkenntnisse", + "Meetings": "Besprechungen", + "Decisions": "Entscheidungen", + "Actions": "Aktionen", + "Issue": "Problem", + "Lesson learned": "Erkenntnis", + "Meeting": "Besprechung", + "Decision": "Entscheidung", + "About this project": "Über dieses Projekt", + "No description yet": "Noch keine Beschreibung", + "Start date": "Startdatum", + "Not set": "Nicht festgelegt", + "End date": "Enddatum", + "Progress": "Fortschritt", + "No tasks yet": "Noch keine Aufgaben", + "Open the board": "Board öffnen", + "People": "Personen", + "Owner": "Eigentümer", + "Latest log entries": "Neueste Einträge", + "Open the log": "Protokoll öffnen", + "{done} of {total} tasks done": "{done} von {total} Aufgaben erledigt", + "Edit entry": "Eintrag bearbeiten", + "Type": "Art", + "Attendees": "Teilnehmende", + "Issue is closed": "Problem ist geschlossen", + "Could not save the entry. Please try again.": "Der Eintrag konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "From: {title}": "Aus: {title}", + "What needs to happen": "Was passieren muss", + "Could not create the action. Please try again.": "Die Aktion konnte nicht erstellt werden. Bitte versuchen Sie es erneut.", + "The action was created but could not be linked to the entry.": "Die Aktion wurde erstellt, konnte aber nicht mit dem Eintrag verknüpft werden.", + "Project pages": "Projektseiten", + "Overview": "Übersicht", + "Risks": "Risiken", + "Log entry": "Protokolleintrag", + "A short name for the entry": "Ein kurzer Name für den Eintrag", + "Project": "Projekt", + "The project this entry belongs to": "Das Projekt, zu dem dieser Eintrag gehört", + "What kind of entry this is": "Welche Art Eintrag dies ist", + "When it happened": "Wann es passiert ist", + "What happened, in Markdown": "Was passiert ist, in Markdown", + "Whether an issue is still open": "Ob ein Problem noch offen ist", + "The people at a meeting": "Die Personen bei einer Besprechung", + "Tasks that came out of this entry": "Aufgaben, die aus diesem Eintrag entstanden sind", + "Add risk": "Risiko hinzufügen", + "Risk": "Risiko", + "Score": "Wert", + "Response": "Reaktion", + "Review date": "Prüfdatum", + "no longer on the project": "nicht mehr im Projekt", + "Edit {title}": "{title} bearbeiten", + "No risks recorded yet": "Noch keine Risiken erfasst", + "Add the first risk": "Erstes Risiko hinzufügen", + "Medium": "Mittel", + "Mitigating": "Wird gemindert", + "Occurred": "Eingetreten", + "Avoid": "Vermeiden", + "Reduce": "Mindern", + "Transfer": "Übertragen", + "Accept": "Akzeptieren", + "Highest open risks": "Höchste offene Risiken", + "No open risks": "Keine offenen Risiken", + "Open the risk register": "Risikoregister öffnen", + "Edit risk": "Risiko bearbeiten", + "What could go wrong": "Was schiefgehen kann", + "Likelihood": "Wahrscheinlichkeit", + "Impact": "Auswirkung", + "Score {score}": "Wert {score}", + "Countermeasures": "Gegenmaßnahmen", + "Could not save the risk. Please try again.": "Das Risiko konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "Risks by likelihood and impact": "Risiken nach Wahrscheinlichkeit und Auswirkung", + "Risk scale": "Risikoskala", + "The levels every project scores its risks on, and where low turns into medium and high": "Die Stufen, auf denen jedes Projekt seine Risiken bewertet, und wo niedrig in mittel und hoch übergeht", + "Number of levels": "Anzahl der Stufen", + "Likelihood labels": "Bezeichnungen für Wahrscheinlichkeit", + "Impact labels": "Bezeichnungen für Auswirkung", + "Level {level}": "Stufe {level}", + "Medium from score": "Mittel ab Wert", + "High from score": "Hoch ab Wert", + "Risk scale saved": "Risikoskala gespeichert", + "1 risk uses level {level}. Change it first.": "1 Risiko nutzt Stufe {level}. Ändern Sie es zuerst.", + "{count} risks use level {level}. Change them first.": "{count} Risiken nutzen Stufe {level}. Ändern Sie diese zuerst.", + "Every level needs a label, and high must start above medium.": "Jede Stufe braucht eine Bezeichnung, und hoch muss über mittel beginnen.", + "The project this risk belongs to": "Das Projekt, zu dem dieses Risiko gehört", + "The cause and the effect, in Markdown": "Ursache und Wirkung, in Markdown", + "Category": "Kategorie", + "A free grouping, such as planning, budget or supplier": "Eine freie Einteilung, etwa Planung, Budget oder Lieferant", + "How likely it is, on the admin's risk scale": "Wie wahrscheinlich es ist, auf der Risikoskala der Administration", + "How hard it would hit, on the admin's risk scale": "Wie hart es treffen würde, auf der Risikoskala der Administration", + "Likelihood times impact, calculated by the server": "Wahrscheinlichkeit mal Auswirkung, vom Server berechnet", + "Where the risk stands": "Wo das Risiko steht", + "The person who watches this risk": "Die Person, die dieses Risiko beobachtet", + "How the project answers the risk": "Wie das Projekt auf das Risiko reagiert", + "What is done to prevent it or soften it, in Markdown": "Was getan wird, um es zu verhindern oder abzuschwächen, in Markdown", + "When to look at this risk again": "Wann dieses Risiko erneut geprüft wird", + "Very low": "Sehr niedrig", + "Very high": "Sehr hoch", + "All projects": "Alle Projekte", + "Project status report": "Projektstatusbericht", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Ein datierter Bericht, wie ein Projekt bei Geld, Organisation, Zeit, Information, Qualität und Risiko (den GROTIK-Aspekten) steht, jeweils mit einer Notiz.", + "The project this report is about": "Das Projekt, um das es in diesem Bericht geht", + "Report date": "Berichtsdatum", + "The day the report describes": "Der Tag, den der Bericht beschreibt", + "Money": "Geld", + "How the project stands on this aspect": "Wie das Projekt bei diesem Aspekt steht", + "On track": "Im Plan", + "At risk": "Gefährdet", + "Off track": "Außer Plan", + "Money note": "Notiz zu Geld", + "A short explanation of this status": "Eine kurze Erläuterung dieses Status", + "Organisation": "Organisation", + "Organisation note": "Notiz zur Organisation", + "Time": "Zeit", + "Time note": "Notiz zur Zeit", + "Information": "Information", + "Information note": "Notiz zur Information", + "Quality": "Qualität", + "Quality note": "Notiz zur Qualität", + "Risk note": "Notiz zum Risiko", + "Overall": "Gesamt", + "The worst of the six statuses, calculated by the server": "Der schlechteste der sechs Status, vom Server berechnet", + "Health: money": "Zustand: Geld", + "Copied from the newest status report": "Aus dem neuesten Statusbericht übernommen", + "Health: organisation": "Zustand: Organisation", + "Health: time": "Zustand: Zeit", + "Health: information": "Zustand: Information", + "Health: quality": "Zustand: Qualität", + "Health: risk": "Zustand: Risiko", + "Health: overall": "Zustand: gesamt", + "Health: report date": "Zustand: Berichtsdatum", + "The date of the newest status report": "Das Datum des neuesten Statusberichts", + "New report": "Neuer Bericht", + "Only the project owner writes status reports.": "Nur der Projekteigentümer schreibt Statusberichte.", + "Latest report, {date}": "Letzter Bericht, {date}", + "Aspect": "Aspekt", + "Note": "Notiz", + "Report history": "Berichtsverlauf", + "Author": "Autor", + "No status reports yet": "Noch keine Statusberichte", + "Write the first report": "Den ersten Bericht schreiben", + "Choose a status for every aspect to save the report.": "Wählen Sie für jeden Aspekt einen Status, um den Bericht zu speichern.", + "Suggested: on track.": "Vorschlag: im Plan.", + "Suggested: at risk.": "Vorschlag: gefährdet.", + "Suggested: off track.": "Vorschlag: außer Plan.", + "1 task is past its due date.": "1 Aufgabe ist überfällig.", + "{count} tasks are past their due date.": "{count} Aufgaben sind überfällig.", + "The end date has passed with 1 open task.": "Das Enddatum ist mit 1 offenen Aufgabe überschritten.", + "The end date has passed with {count} open tasks.": "Das Enddatum ist mit {count} offenen Aufgaben überschritten.", + "No open task is past its due date.": "Keine offene Aufgabe ist überfällig.", + "The highest open risk, \"{title}\", scores {score}.": "Das höchste offene Risiko, \"{title}\", hat {score} Punkte.", + "There are no open risks.": "Es gibt keine offenen Risiken.", + "Costs are at {percent}% of the budget.": "Die Kosten liegen bei {percent}% des Budgets.", + "No suggestion: the project has no budget.": "Kein Vorschlag: Das Projekt hat kein Budget.", + "No suggestion: no costs are recorded for this project yet.": "Kein Vorschlag: Für dieses Projekt sind noch keine Kosten erfasst.", + "The report was not saved. Only the project owner can write status reports.": "Der Bericht wurde nicht gespeichert. Nur der Projekteigentümer kann Statusberichte schreiben.", + "No report": "Kein Bericht", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Eine Gruppe von Projekten, die von denselben Personen geführt wird, etwa eine Abteilung oder ein Programm. Die Verantwortlichen lesen jedes Projekt darin.", + "The name of the portfolio": "Der Name des Portfolios", + "What the portfolio holds and who runs it": "Was das Portfolio enthält und wer es führt", + "A colour for the portfolio's section in project lists": "Eine Farbe für den Abschnitt des Portfolios in Projektlisten", + "Managers": "Verantwortliche", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-Benutzer-IDs der Personen, die das Portfolio führen", + "Order": "Reihenfolge", + "Where the portfolio comes in project lists, lowest first": "Wo das Portfolio in Projektlisten steht, niedrigste zuerst", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Die eigene Risikoskala dieses Portfolios als JSON, in derselben Form wie die appweite. Leer bedeutet die appweite Skala.", + "Portfolio readers": "Portfolio-Leser", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-Benutzer-IDs der Verantwortlichen des Portfolios des Projekts", + "The portfolio this project belongs to": "Das Portfolio, zu dem dieses Projekt gehört", + "No portfolio": "Kein Portfolio", + "All portfolios": "Alle Portfolios", + "You read this project as a manager of its portfolio. Only its members change it.": "Sie lesen dieses Projekt als Verantwortliche des Portfolios. Nur seine Mitglieder ändern es.", + "Portfolios": "Portfolios", + "Portfolio status": "Portfoliostatus", + "No portfolios yet": "Noch keine Portfolios", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Eine Administratorin fügt Portfolios unter Projekte, Portfolios hinzu. Projekte eines Portfolios stehen hier mit ihrem Status.", + "Roll-up": "Zusammenfassung", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} im Plan, {atRisk} gefährdet, {offTrack} nicht im Plan, {noReport} ohne Bericht", + "No project in this portfolio that you can read.": "Kein Projekt in diesem Portfolio, das du lesen kannst.", + "Start": "Beginn", + "End": "Ende", + "Budget": "Budget", + "Last report": "Letzter Bericht", + "Out of date": "Veraltet", + "Portfolio timeline": "Portfolio-Zeitachse", + "Zoom": "Zoom", + "Could not load the timeline": "Die Zeitachse konnte nicht geladen werden", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Eine Administratorin fügt Portfolios unter Projekte, Portfolios hinzu. Projekte eines Portfolios stehen hier auf einer Zeitachse.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Öffne ein Projekt, um seine Phasen und Aufgaben zu sehen. Die Zeitachse ist schreibgeschützt.", + "Phase: {title}": "Phase: {title}", + "Left out because you cannot read them: {count} projects": "Ausgelassen, weil du sie nicht lesen kannst: {count} Projekte", + "Week": "Woche", + "Day": "Tag", + "Month": "Monat", + "Please try again later.": "Bitte versuche es später erneut.", + "Status reports": "Statusberichte", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Nach wie vielen Tagen der letzte Statusbericht eines Projekts in der Portfolioübersicht als veraltet markiert wird", + "Reporting period (days)": "Berichtszeitraum (Tage)", + "The reporting period is a whole number of days from 1 to 365.": "Der Berichtszeitraum ist eine ganze Zahl von Tagen von 1 bis 365.", + "Reporting period saved": "Berichtszeitraum gespeichert", + "The reporting period was not saved. Please try again.": "Der Berichtszeitraum wurde nicht gespeichert. Bitte versuche es erneut.", + "Every project of a portfolio with its status per aspect, rolled up.": "Jedes Projekt eines Portfolios mit seinem Status je Aspekt, zusammengefasst.", + "The projects of a portfolio on one timeline.": "Die Projekte eines Portfolios auf einer Zeitachse.", + "Phases": "Phasen", + "Add phase": "Phase hinzufügen", + "No phases yet": "Noch keine Phasen", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Teile das Projekt in Phasen auf, etwa Initiierung, Definition und Umsetzung. Eine Phase schließt, sobald ihr Abschlussdokument hochgeladen ist.", + "{hours} hours": "{hours} Stunden", + "Concluding document: {title}": "Abschlussdokument: {title}", + "Concluding document missing": "Abschlussdokument fehlt", + "Move {title} up": "{title} nach oben", + "Move {title} down": "{title} nach unten", + "Close phase": "Phase abschließen", + "Phase": "Phase", + "Files": "Dateien", + "Notes": "Notizen", + "Audit trail": "Prüfprotokoll", + "Edit phase": "Phase bearbeiten", + "Name": "Name", + "Budget hours": "Budgetstunden", + "Could not save the phase. Please try again.": "Die Phase konnte nicht gespeichert werden. Bitte versuche es erneut.", + "Close phase {title}": "Phase {title} abschließen", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Eine Phase schließt mit ihrem Abschlussdokument: Lade es hier hoch oder wähle eine der Dateien der Phase.", + "Concluding document": "Abschlussdokument", + "This phase has no files yet.": "Diese Phase hat noch keine Dateien.", + "Upload a document": "Dokument hochladen", + "The document was not uploaded. Please try again.": "Das Dokument wurde nicht hochgeladen. Bitte versuche es erneut.", + "Upload the concluding document before you close this phase.": "Lade das Abschlussdokument hoch, bevor du diese Phase abschließt.", + "This phase cannot be closed from its current status.": "Diese Phase kann aus ihrem aktuellen Status nicht abgeschlossen werden.", + "The phase was not closed. Please try again.": "Die Phase wurde nicht abgeschlossen. Bitte versuche es erneut.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Die ID der Datei dieser Phase, die sie abschließt. Die Phase kann erst abgeschlossen werden, wenn sie gesetzt und die Datei angehängt ist.", + "Import from Microsoft Project": "Aus Microsoft Project importieren", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Wählen Sie einen Plan, der in Microsoft Project im XML-Format gespeichert wurde. Nichts wird importiert, bevor Sie bestätigen.", + "Plan file": "Plandatei", + "What the import creates": "Was der Import anlegt", + "Tasks": "Aufgaben", + "Sub-tasks": "Unteraufgaben", + "Milestones": "Meilensteine", + "Links": "Verknüpfungen", + "Already imported, updated in place: {count}": "Bereits importiert, an Ort und Stelle aktualisiert: {count}", + "What does not carry over": "Was nicht übernommen wird", + "Tasks with resources, which are not imported: {count}": "Aufgaben mit Ressourcen, die nicht importiert werden: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Aufgaben tiefer als Ebene 3, unter ihre Aufgabe der Ebene 2 gestellt: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Verknüpfungen außer Ende-Anfang, als verwandte Verknüpfungen importiert: {count}", + "Link lags, which are dropped: {count}": "Zeitabstände von Verknüpfungen, die entfallen: {count}", + "Links to a summary task, which are not imported: {count}": "Verknüpfungen zu einem Sammelvorgang, die nicht importiert werden: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Verknüpfungen zu Aufgaben außerhalb dieses Plans, die nicht importiert werden: {count}", + "No longer in the plan": "Nicht mehr im Plan", + "These stay in the project; remove them yourself if they are no longer needed.": "Diese bleiben im Projekt; entfernen Sie sie selbst, wenn sie nicht mehr gebraucht werden.", + "Import": "Importieren", + "Close": "Schließen", + "The plan is imported: {created} created, {updated} updated.": "Der Plan ist importiert: {created} angelegt, {updated} aktualisiert.", + "Links that would close a loop were left out: {count}": "Verknüpfungen, die eine Schleife bilden würden, wurden ausgelassen: {count}", + "The import stopped part-way. Run it again to finish it.": "Der Import wurde unterwegs abgebrochen. Führen Sie ihn erneut aus, um ihn abzuschließen.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Speichern Sie den Plan in Microsoft Project über Datei, Speichern unter, XML-Format, und importieren Sie diese Datei.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Diese Datei deklariert einen DOCTYPE oder Entitäten, die nicht akzeptiert werden.", + "The file is larger than 10 MB.": "Die Datei ist größer als 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Der Plan hat mehr als 2.000 Aufgaben, mehr als ein Import verarbeitet.", + "This file is not a Microsoft Project plan in XML format.": "Diese Datei ist kein Microsoft-Project-Plan im XML-Format.", + "Choose a file to import.": "Wählen Sie eine Datei zum Importieren.", + "Only the project owner can import a plan.": "Nur der Projektinhaber kann einen Plan importieren.", + "The plan could not be read. Please try again.": "Der Plan konnte nicht gelesen werden. Bitte versuchen Sie es erneut.", + "Linked case: {title}": "Verknüpfter Vorgang: {title}", + "Linked to a case": "Mit einem Vorgang verknüpft", + "Hand over to case": "An Vorgang übergeben", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopiert jede Datei des Projekts und seiner Aufgaben sowie eine Datei, die das Projekt beschreibt, unverändert in den verknüpften Vorgang.", + "{date} by {user}": "{date} von {user}", + "Files copied: {count}": "Kopierte Dateien: {count}", + "Files that failed: {names}": "Fehlgeschlagene Dateien: {names}", + "The handover failed. Please try again.": "Die Übergabe ist fehlgeschlagen. Bitte versuchen Sie es erneut.", + "The linked case could not be found, or you cannot open it.": "Der verknüpfte Vorgang wurde nicht gefunden, oder Sie können ihn nicht öffnen.", + "Case handovers": "Übergaben an den Vorgang", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Jede Übergabe der Dateien und Metadaten des Projekts an seinen Vorgang: wann, durch wen, an welchen Vorgang, jede kopierte Datei mit ihrem SHA-256 und die fehlgeschlagenen Dateien.", + "Finance": "Finanzen", + "Add cost line": "Kostenzeile hinzufügen", + "Delivery terms": "Lieferbedingungen", + "Billing model": "Abrechnungsmodell", + "Budget in euro": "Budget in Euro", + "Budget in hours": "Budget in Stunden", + "Hourly rate in euro": "Stundensatz in Euro", + "Planned start": "Geplanter Beginn", + "Planned end": "Geplantes Ende", + "Planned dates": "Geplante Termine", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Kein Budget vereinbart", + "Hours": "Stunden", + "Only the project owner and the portfolio managers see the amounts.": "Nur der Projektinhaber und die Portfoliomanager sehen die Beträge.", + "Budget against cost per category": "Budget gegenüber Kosten je Kategorie", + "Labour (booked time)": "Arbeit (gebuchte Zeit)", + "No category": "Keine Kategorie", + "Hours are not available": "Stunden sind nicht verfügbar", + "Not yet assigned to a category": "Noch keiner Kategorie zugeordnet", + "Total": "Summe", + "{spent} spent, {remaining} remaining": "{spent} ausgegeben, {remaining} übrig", + "Budget against cost per phase": "Budget gegenüber Kosten je Phase", + "No phase": "Keine Phase", + "Cost lines": "Kostenzeilen", + "From the finance system": "Aus dem Finanzsystem", + "Edit cost line {amount}": "Kostenzeile {amount} bearbeiten", + "No cost lines yet": "Noch keine Kostenzeilen", + "Commitments": "Verpflichtungen", + "Actual cost": "Ist-Kosten", + "Forecast": "Prognose", + "Remaining": "Verbleibend", + "Not planned yet": "Noch nicht geplant", + "{start} to {end}": "{start} bis {end}", + "The terms were not saved. Please try again.": "Die Bedingungen wurden nicht gespeichert. Bitte versuche es erneut.", + "Terms saved": "Bedingungen gespeichert", + "Fixed price": "Festpreis", + "Hourly": "Stündlich", + "Not billed": "Nicht abgerechnet", + "Commitment": "Verpflichtung", + "Edit cost line": "Kostenzeile bearbeiten", + "Kind": "Art", + "Amount in euro": "Betrag in Euro", + "Remove": "Entfernen", + "Could not save the cost line. Only the project owner changes the money of a project.": "Die Kostenzeile konnte nicht gespeichert werden. Nur der Projektinhaber ändert das Geld eines Projekts.", + "Could not remove the cost line. Please try again.": "Die Kostenzeile konnte nicht entfernt werden. Bitte versuche es erneut.", + "{amount} over budget": "{amount} über Budget", + "Cost categories": "Kostenkategorien", + "The categories every project splits its budget and costs into, one per line": "Die Kategorien, in die jedes Projekt sein Budget und seine Kosten aufteilt, eine pro Zeile", + "Categories": "Kategorien", + "Give at least one category, each name once.": "Gib mindestens eine Kategorie an, jeden Namen nur einmal.", + "Cost categories saved": "Kostenkategorien gespeichert", + "The cost categories were not saved. Please try again.": "Die Kostenkategorien wurden nicht gespeichert. Bitte versuche es erneut.", + "Finance line": "Finanzzeile", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Ein Geldbetrag eines Projekts: ein Budget, eine Verpflichtung, Ist-Kosten oder eine Prognose, in einer Kostenkategorie und optional einer Phase. Erfasst vom Projektinhaber oder vom Finanzsystem über die Integrations-App.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Das Projekt, zu dem dieser Betrag gehört. Leer bei einer Zeile aus dem Finanzsystem, deren Projektnummer zu keinem Projekt passt.", + "The phase this amount belongs to, if any": "Die Phase, zu der dieser Betrag gehört, falls vorhanden", + "The cost category, one of the categories the admin set up": "Die Kostenkategorie, eine der vom Admin eingerichteten Kategorien", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Ob der Betrag ein Budget, eine Verpflichtung, Ist-Kosten oder eine Prognose ist", + "Amount": "Betrag", + "The amount in the reporting currency (euro)": "Der Betrag in der Berichtswährung (Euro)", + "The date the amount was booked or is expected": "Das Datum, an dem der Betrag gebucht wurde oder erwartet wird", + "What the amount is for": "Wofür der Betrag ist", + "Whether a person entered the line or the finance system sent it": "Ob eine Person die Zeile erfasst oder das Finanzsystem sie gesendet hat", + "Entered by hand": "Von Hand erfasst", + "Finance line id": "ID der Finanzzeile", + "The finance system's own id of this line. One imported line per id.": "Die eigene ID dieser Zeile im Finanzsystem. Eine importierte Zeile pro ID.", + "Project number": "Projektnummer", + "The project number the finance system sent, matched against the project key": "Die vom Finanzsystem gesendete Projektnummer, abgeglichen mit dem Projektschlüssel", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Das Portfolio des Projekts der Zeile, vom Projekt übernommen, damit Portfoliosummen einen Filter brauchen", + "Finance readers": "Finanzleser", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-Benutzer-UIDs der Personen, die diesen Betrag sehen dürfen: der Projektinhaber und die Manager seines Portfolios", + "Project owner": "Projektinhaber", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-Benutzer-UID des Projektinhabers, der manuelle Zeilen ändern und entfernen darf", + "How the client pays: not billed, a fixed price, or by the hour.": "Wie der Kunde zahlt: nicht abgerechnet, Festpreis oder stündlich.", + "Portfolio finance": "Portfoliofinanzen", + "You cannot see the money of any project in this portfolio": "Du kannst das Geld keines Projekts in diesem Portfolio sehen", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Der Server hat Kostenzeilen von Projekten außerhalb dieses Portfolios geliefert, daher können diese Summen falsch sein.", + "Projects left out because you cannot see their money: {count}": "Ausgelassene Projekte, weil du ihr Geld nicht sehen kannst: {count}", + "Unmatched finance lines": "Nicht zugeordnete Finanzzeilen", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, Verpflichtungen, Ist-Kosten und Prognose, über ein Portfolio summiert.", + "Subprojects": "Teilprojekte", + "{done} of {total}": "{done} von {total}", + "{done} of {total} tasks done, including subprojects": "{done} von {total} Aufgaben erledigt, einschließlich Teilprojekte", + "Show the subprojects of {title}": "Teilprojekte von {title} anzeigen", + "Hide the subprojects of {title}": "Teilprojekte von {title} ausblenden", + "Part of": "Teil von", + "No parent project": "Kein übergeordnetes Projekt", + "A project cannot sit under one of its own subprojects.": "Ein Projekt kann nicht unter einem seiner eigenen Teilprojekte liegen.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekte verschachteln sich höchstens drei Ebenen tief: Programm, Projekt und Teilprojekt.", + "Parent project": "Übergeordnetes Projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Das Projekt, unter dem dieses Projekt liegt, etwa ein Programm. Projekte verschachteln sich höchstens drei Ebenen tief.", + "Yes": "Ja", + "No": "Nein", + "{label} (required)": "{label} (Pflicht)", + "{label} is required": "{label} ist ein Pflichtfeld", + "Project field": "Projektfeld", + "A field an admin adds to every project, such as a policy area or a contract value.": "Ein Feld, das ein Admin jedem Projekt hinzufügt, etwa ein Politikfeld oder ein Auftragswert.", + "Key": "Schlüssel", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Der feste Name, unter dem der Wert gespeichert wird, in lower camel case. Behalte ihn, sobald Projekte ihn nutzen.", + "Label": "Bezeichnung", + "The name people see next to the field": "Der Name, den Personen neben dem Feld sehen", + "What the field holds": "Was das Feld enthält", + "Text": "Text", + "Number": "Zahl", + "Choice": "Auswahl", + "Person": "Person", + "Yes or no": "Ja oder nein", + "Options": "Optionen", + "The choices of a choice field": "Die Auswahlmöglichkeiten eines Auswahlfelds", + "Required": "Pflichtfeld", + "Whether a project must fill in the field": "Ob ein Projekt das Feld ausfüllen muss", + "Where the field appears, lowest first": "Wo das Feld erscheint, niedrigste zuerst", + "Applies to": "Gilt für", + "What the field is added to": "Wozu das Feld hinzugefügt wird", + "Custom fields": "Eigene Felder", + "The values of the project fields an admin defined, keyed by the field's key.": "Die Werte der vom Admin festgelegten Projektfelder, nach dem Schlüssel des Felds.", + "Project fields": "Projektfelder", + "Related": "Verwandt", + "Remove link": "Verknüpfung entfernen", + "Link type": "Art der Verknüpfung", + "Relates to": "Hängt zusammen mit", + "Duplicates": "Dupliziert", + "Project key": "Projektschlüssel", + "Every task number starts with it, such as VERG-42.": "Jede Aufgabennummer beginnt damit, zum Beispiel VERG-42.", + "This key is already used by another project.": "Dieser Schlüssel wird bereits von einem anderen Projekt verwendet.", + "Use 2 to 10 letters and digits, starting with a letter.": "Verwenden Sie 2 bis 10 Buchstaben und Ziffern, beginnend mit einem Buchstaben.", + "The key cannot change once tasks carry it.": "Der Schlüssel kann sich nicht mehr ändern, sobald Aufgaben ihn tragen.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt gespeichert. Die vorhandenen Aufgaben erhalten ihre Nummern im Hintergrund.", + "Next task number": "Nächste Aufgabennummer", + "The number the next task of this project gets in its key. Only the system writes it.": "Die Nummer, die die nächste Aufgabe dieses Projekts in ihrem Schlüssel erhält. Nur das System schreibt sie.", + "Restore {title}": "{title} wiederherstellen", + "Restore": "Wiederherstellen", + "Project restored": "Projekt wiederhergestellt", + "Could not restore the project": "Das Projekt konnte nicht wiederhergestellt werden", + "Bring this project back to the active list.": "Dieses Projekt zurück in die Liste der aktiven Projekte holen.", + "Restore project": "Projekt wiederherstellen", + "Request reason": "Grund der Anfrage", + "Why the requester needs this project. Filled in when the project is requested.": "Warum der Antragsteller dieses Projekt braucht. Wird bei der Anfrage ausgefüllt.", + "Reviewed by": "Geprüft von", + "The user who approved or rejected the request.": "Der Benutzer, der die Anfrage genehmigt oder abgelehnt hat.", + "Reviewed at": "Geprüft am", + "When the request was approved or rejected.": "Wann die Anfrage genehmigt oder abgelehnt wurde.", + "Review note": "Prüfvermerk", + "The reviewer's reason, shown to the requester when a request is not approved.": "Die Begründung des Prüfers, die der Antragsteller sieht, wenn eine Anfrage nicht genehmigt wird.", + "Members of these groups": "Mitglieder dieser Gruppen", + "Groups that may create projects": "Gruppen, die Projekte anlegen dürfen", + "The group {group} no longer exists. Save to remove it.": "Die Gruppe {group} existiert nicht mehr. Speichern Sie, um sie zu entfernen.", + "Review project request": "Projektanfrage prüfen", + "Requested by": "Angefragt von", + "Why it is needed": "Warum es gebraucht wird", + "Desired start date": "Gewünschtes Startdatum", + "Why is it not approved?": "Warum wird es nicht genehmigt?", + "Give a reason. The requester sees it.": "Geben Sie einen Grund an. Der Antragsteller sieht ihn.", + "Approve": "Genehmigen", + "Reject": "Ablehnen", + "Reject request": "Anfrage ablehnen", + "The review was not saved. Try again.": "Die Prüfung wurde nicht gespeichert. Versuchen Sie es erneut.", + "This project is waiting for review": "Dieses Projekt wartet auf die Prüfung", + "This request was not approved": "Diese Anfrage wurde nicht genehmigt", + "Reason: {note}": "Grund: {note}", + "Review request": "Anfrage prüfen", + "Request a project": "Ein Projekt anfragen", + "Step {step} of 2": "Schritt {step} von 2", + "Why is this project needed?": "Warum wird dieses Projekt gebraucht?", + "Give a reason. The reviewer reads it.": "Geben Sie einen Grund an. Der Prüfer liest ihn.", + "Back": "Zurück", + "Next": "Weiter", + "Send request": "Anfrage senden", + "The request was not sent. Try again.": "Die Anfrage wurde nicht gesendet. Versuchen Sie es erneut.", + "Requested": "Angefragt", + "Not approved": "Nicht genehmigt", + "Your request was sent": "Ihre Anfrage wurde gesendet", + "Let everyone else request a project": "Alle anderen dürfen ein Projekt anfragen", + "Add a task": "Aufgabe hinzufügen", + "Delete task": "Aufgabe löschen", + "Edit task": "Aufgabe bearbeiten", + "Write": "Schreiben", + "Preview": "Vorschau", + "Markdown works here: headings, lists and links.": "Hier funktioniert Markdown: Überschriften, Listen und Links.", + "Could not save the task. Please try again.": "Die Aufgabe konnte nicht gespeichert werden. Bitte versuche es erneut.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Auf \"{title}\" wurde Zeit gebucht, daher kann sie nicht gelöscht werden. Du kannst sie stattdessen abbrechen: Die Zeiteinträge bleiben erhalten.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "\"{title}\" löschen? Die Verknüpfungen zu anderen Aufgaben werden ebenfalls entfernt. Dies kann nicht rückgängig gemacht werden.", + "Keep task": "Aufgabe behalten", + "Cancel task": "Aufgabe abbrechen", + "Only the reporter, the project owner or an admin can delete this task.": "Nur die meldende Person, der Projektinhaber oder ein Admin kann diese Aufgabe löschen.", + "Could not delete the task. Please try again.": "Die Aufgabe konnte nicht gelöscht werden. Bitte versuche es erneut.", + "Could not cancel the task. Please try again.": "Die Aufgabe konnte nicht abgebrochen werden. Bitte versuche es erneut.", + "Responsible": "Verantwortlich", + "Also working on this": "Arbeitet auch daran", + "Labels": "Labels", + "Could not change the priority. Please try again.": "Die Priorität konnte nicht geändert werden. Bitte versuche es erneut.", + "Other project members who work on this task alongside the person responsible.": "Weitere Projektmitglieder, die mit der verantwortlichen Person an dieser Aufgabe arbeiten.", + "Duplicate": "Duplizieren", + "Could not copy the task. Please try again.": "Die Aufgabe konnte nicht kopiert werden. Bitte versuche es erneut.", + "Subtasks": "Unteraufgaben", + "{done} of {total} done": "{done} von {total} erledigt", + "Add a subtask": "Unteraufgabe hinzufügen", + "Checklist": "Checkliste", + "Checklist item actions": "Aktionen für Checklisteneintrag", + "Add a checklist item": "Checklisteneintrag hinzufügen", + "Subtasks: {estimate} estimated, {logged} logged": "Unteraufgaben: {estimate} geschätzt, {logged} gebucht", + "Total estimate: {total}": "Gesamtschätzung: {total}", + "Part of {title}": "Teil von {title}", + "Checklist: {count} done": "Checkliste: {count} erledigt", + "This task has subtasks: {count}.": "Diese Aufgabe hat Unteraufgaben: {count}.", + "Keep subtasks as separate tasks": "Unteraufgaben als eigene Aufgaben behalten", + "Delete subtasks too": "Unteraufgaben ebenfalls löschen", + "Copy of {title}": "Kopie von {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Die Aufgabe wurde kopiert, aber nicht alle Unteraufgaben. Bitte prüfe die Kopie.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Kleine Schritte innerhalb der Aufgabe. Jeder Eintrag hat eine ID, einen Text und ob er erledigt ist.", + "Open work per person and per project.": "Offene Arbeit pro Person und pro Projekt.", + "View": "Ansicht", + "By person": "Nach Person", + "By project": "Nach Projekt", + "Hours left": "Verbleibende Stunden", + "Tasks without an estimate": "Aufgaben ohne Schätzung", + "Due in 14 days": "Fällig in 14 Tagen", + "Shared": "Geteilt", + "Unassigned": "Nicht zugewiesen", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Angezeigt wird die Arbeit in den Projekten, die du sehen kannst. Stunden zählen für die verantwortliche Person; geteilte Aufgaben zählen ohne Stunden.", + "No open work in these projects.": "Keine offene Arbeit in diesen Projekten.", + "Open work": "Offene Arbeit", + "{count} open tasks": "{count} offene Aufgaben", + "Create a project to see capacity here.": "Lege ein Projekt an, um hier die Kapazität zu sehen.", + "My tasks": "Meine Aufgaben", + "Show all my tasks": "Alle meine Aufgaben anzeigen", + "No tasks assigned to you": "Dir sind keine Aufgaben zugewiesen", + "Browse projects": "Projekte durchsuchen", + "Later": "Später", + "Due {date}": "Fällig {date}", + "Could not change the status. Please try again.": "Der Status konnte nicht geändert werden. Bitte versuche es erneut.", + "Completed today": "Heute erledigt", + "My open tasks": "Meine offenen Aufgaben", + "My overdue tasks": "Meine überfälligen Aufgaben", + "My tasks in progress": "Meine Aufgaben in Bearbeitung", + "Pin to the top": "Oben anheften", + "Unpin": "Lösen", + "Pinned": "Angeheftet", + "Actions for {title}": "Aktionen für {title}", + "Could not save your project order. Please try again.": "Deine Projektreihenfolge konnte nicht gespeichert werden. Bitte versuche es erneut.", + "No boards yet": "Noch keine Boards", + "Create a project to get a board.": "Lege ein Projekt an, um ein Board zu erhalten.", + "Use the Projects page to create and manage your projects and tasks.": "Nutze die Seite Projekte, um deine Projekte und Aufgaben anzulegen und zu verwalten.", + "Go to projects": "Zu den Projekten", + "You are not a member of any projects yet.": "Du bist noch in keinem Projekt Mitglied.", + "Could not search for users. Please try again.": "Benutzer konnten nicht gesucht werden. Bitte versuche es erneut.", + "Project creation is restricted to administrators.": "Nur Administratoren können Projekte anlegen.", + "Only the project owner or an administrator can delete this project.": "Nur der Projektinhaber oder ein Administrator kann dieses Projekt löschen.", + "No projects are available to you yet. Ask an administrator to create one.": "Für dich sind noch keine Projekte verfügbar. Bitte einen Administrator, eines anzulegen.", + "Due: {date}": "Fällig: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Aufgaben mit Start- oder Fälligkeitsdatum erscheinen auf der Zeitleiste. Füge Daten hinzu, um sie hier zu sehen.", + "You do not have access to this project.": "Du hast keinen Zugriff auf dieses Projekt.", + "Zoom level": "Zoomstufe", + "Unscheduled": "Nicht geplant", + "Start: {date}": "Start: {date}", + "Today": "Heute", + "No scheduled tasks": "Keine geplanten Aufgaben", + "An unexpected error occurred.": "Ein unerwarteter Fehler ist aufgetreten.", + "Column {number} name": "Name der Spalte {number}", + "Failed to save creation policy": "Die Richtlinie zum Anlegen konnte nicht gespeichert werden", + "All authenticated users": "Alle angemeldeten Benutzer", + "Control who may create new projects": "Lege fest, wer neue Projekte anlegen darf", + "Administrators only": "Nur Administratoren", + "Project creation": "Projekte anlegen", + "Allow project creation": "Anlegen von Projekten erlauben", + "Creation policy saved successfully": "Richtlinie zum Anlegen gespeichert", + "Initializing…": "Wird gestartet…", + "e.g. 2h 30m, 90m, 1.5h": "z. B. 2h 30m, 90m, 1.5h", + "Log time": "Zeit buchen", + "Save estimate": "Schätzung speichern", + "Logged: {logged}": "Gebucht: {logged}", + "over by {amount}": "{amount} darüber", + "Time tracking": "Zeiterfassung", + "Estimate": "Schätzung", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Gib eine gültige Schätzung ein (z. B. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Gib eine gültige Dauer ein (z. B. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Der Zeiteintrag konnte nicht gespeichert werden. Bitte versuche es erneut.", + "Edit time entry": "Zeiteintrag bearbeiten", + "Duration": "Dauer", + "Date range": "Zeitraum", + "Last week": "Letzte Woche", + "No time logged": "Keine Zeit gebucht", + "Log time on a task to see it here.": "Buche Zeit auf eine Aufgabe, um sie hier zu sehen.", + "To date": "Bis Datum", + "This week": "Diese Woche", + "Total: {total}": "Gesamt: {total}", + "From date": "Ab Datum", + "Custom range": "Eigener Zeitraum", + "All time": "Gesamte Zeit", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Eine Aufgabe konnte nicht gelöscht werden, daher können Daten zurückbleiben. Lösche das Projekt erneut.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Ein Zeiteintrag konnte nicht gelöscht werden, daher können Daten zurückbleiben. Lösche das Projekt erneut.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Eine Spalte konnte nicht gelöscht werden, daher können Daten zurückbleiben. Lösche das Projekt erneut.", + "Could not delete the project. Please try again.": "Das Projekt konnte nicht gelöscht werden. Bitte versuche es erneut.", + "Notification settings": "Benachrichtigungseinstellungen", + "Configure when due-date reminders are sent": "Lege fest, wann Erinnerungen an Fälligkeitsdaten gesendet werden", + "Due-date reminder lead time (hours)": "Vorlaufzeit der Erinnerung (Stunden)", + "Lead time must be between 1 and 336 hours": "Die Vorlaufzeit muss zwischen 1 und 336 Stunden liegen", + "Reminder lead time saved successfully": "Vorlaufzeit der Erinnerung gespeichert", + "Failed to save reminder lead time": "Die Vorlaufzeit der Erinnerung konnte nicht gespeichert werden", + "Notifications": "Benachrichtigungen", + "Notify me 1 day before a task's due date": "Benachrichtige mich 1 Tag vor dem Fälligkeitsdatum einer Aufgabe", + "Draft": "Entwurf", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Ob die Stunde ein Entwurf ist, den nur die Lehrkraft sieht, stattfindet oder ausfällt.", + "New release": "Neues Release", + "Roadmap chart. The same releases and epics are listed below.": "Roadmap-Diagramm. Dieselben Releases und Epics stehen unten in einer Liste.", + "Nothing on the roadmap yet": "Noch nichts auf der Roadmap", + "Releases with a target date and epics with dated tasks appear here.": "Releases mit Zieldatum und Epics mit datierten Aufgaben erscheinen hier.", + "Releases": "Releases", + "No releases yet": "Noch keine Releases", + "Target date: {date}": "Zieldatum: {date}", + "No target date": "Kein Zieldatum", + "Edit {name}": "{name} bearbeiten", + "Mark {name} as released": "{name} als veröffentlicht markieren", + "Mark as released": "Als veröffentlicht markieren", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Noch keine Epics. Öffnen Sie eine Aufgabe, um sie zu einem Epic zu machen.", + "Not scheduled yet": "Noch nicht geplant", + "Planned": "Geplant", + "Released": "Veröffentlicht", + "Edit release": "Release bearbeiten", + "Target date": "Zieldatum", + "Could not save the release. Please try again.": "Das Release konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "Every task of this release is done or cancelled.": "Jede Aufgabe dieses Releases ist erledigt oder abgebrochen.", + "Not finished yet: {count}": "Noch nicht fertig: {count}", + "What happens to these tasks?": "Was passiert mit diesen Aufgaben?", + "Move to {name}": "Nach {name} verschieben", + "Remove the release": "Das Release entfernen", + "Keep it on {name}": "Bei {name} belassen", + "Could not mark the release as released. Please try again.": "Das Release konnte nicht als veröffentlicht markiert werden. Bitte versuchen Sie es erneut.", + "Roadmap": "Roadmap", + "Tasks or roadmap": "Aufgaben oder Roadmap", + "Release": "Release", + "Epic": "Epic", + "This task is an epic": "Diese Aufgabe ist ein Epic", + "A named, dated delivery of a project that its tasks are planned against.": "Eine benannte, datierte Auslieferung eines Projekts, auf die seine Aufgaben geplant werden.", + "Name of the release": "Name des Releases", + "The project this release belongs to": "Das Projekt, zu dem dieses Release gehört", + "What this release delivers": "Was dieses Release liefert", + "When work on the release starts": "Wann die Arbeit am Release beginnt", + "The date the release is due": "Das Datum, an dem das Release fällig ist", + "Whether the release is planned, released or archived": "Ob das Release geplant, veröffentlicht oder archiviert ist", + "Released on": "Veröffentlicht am", + "When the release was marked as released": "Wann das Release als veröffentlicht markiert wurde", + "The release this task is planned for": "Das Release, für das diese Aufgabe geplant ist", + "Board view options": "Board-Ansichtsoptionen", + "Colour cards": "Karten einfärben", + "No colour": "Keine Farbe", + "By label": "Nach Label", + "Swimlanes": "Swimlanes", + "No swimlanes": "Keine Swimlanes", + "By assignee": "Nach zugewiesener Person", + "By epic": "Nach Epic", + "No assignee": "Nicht zugewiesen", + "No epic": "Kein Epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Karten bleiben in ihrer Epic-Zeile. Ändern Sie das Epic auf der Aufgabenseite.", + "Hand over to": "Übergeben an", + "Could not save your board view. It applies until you reload.": "Ihre Board-Ansicht wurde nicht gespeichert. Sie gilt bis zum Neuladen.", + "Timetable wish": "Stundenplanwunsch", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Ein Wunsch, den der Generator berücksichtigt. Einen harten Wunsch hält er immer ein, einen weichen, wo es geht.", + "Whether the wish is about a teacher, a group, a room or one activity": "Ob der Wunsch eine Lehrkraft, eine Gruppe, einen Raum oder eine Aktivität betrifft", + "Teacher": "Lehrkraft", + "Group": "Gruppe", + "Reference": "Verweis", + "The user, group, room or activity the wish is about": "Die Person, Gruppe, der Raum oder die Aktivität, um die es geht", + "What the wish asks for": "Was der Wunsch verlangt", + "Not on these periods": "Nicht in diesen Stunden", + "Preferably not on these periods": "Möglichst nicht in diesen Stunden", + "At most a number of lessons a day": "Höchstens eine Anzahl Stunden pro Tag", + "No free periods between lessons": "Keine Freistunden zwischen den Stunden", + "Always the same room": "Immer derselbe Raum", + "Periods": "Stunden", + "The periods of the week the wish is about, such as wed-5": "Die Stunden der Woche, um die es geht, etwa wed-5", + "Limit": "Grenze", + "The most lessons a day, for a wish of that kind": "Die meisten Stunden pro Tag, für einen Wunsch dieser Art", + "Strength": "Stärke", + "Whether the generator must keep the wish or should keep it": "Ob der Generator den Wunsch einhalten muss oder sollte", + "Hard": "Hart", + "Soft": "Weich", + "Weight": "Gewicht", + "How much a soft wish counts, from 1 to 3": "Wie stark ein weicher Wunsch zählt, von 1 bis 3", + "Why the wish exists": "Warum es den Wunsch gibt", + "Timetable scenario": "Stundenplanszenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Ein Wochenmuster, vom Generator erstellt oder aus dem aktuellen Stundenplan übernommen. Es behält seine Eingabe und wie gut es die Wünsche einhält.", + "The name timetablers know the scenario by": "Der Name, unter dem Planende das Szenario kennen", + "Whether the generator made it or it came from the current timetable": "Ob der Generator es erstellt hat oder es aus dem aktuellen Stundenplan stammt", + "Generated": "Generiert", + "From the current timetable": "Aus dem aktuellen Stundenplan", + "Week of": "Woche vom", + "The Monday of the first week of the window": "Der Montag der ersten Woche des Zeitraums", + "Window start": "Beginn des Zeitraums", + "The first day the week pattern applies to": "Der erste Tag, für den das Wochenmuster gilt", + "Window end": "Ende des Zeitraums", + "The last day the week pattern applies to": "Der letzte Tag, für den das Wochenmuster gilt", + "Waiting, generating, done, failed, or published as draft lessons": "Wartend, wird erstellt, fertig, fehlgeschlagen oder als Entwurfsstunden veröffentlicht", + "Waiting": "Wartend", + "Generating": "Wird erstellt", + "Failed": "Fehlgeschlagen", + "Published": "Veröffentlicht", + "Seed": "Startwert", + "The number the generator starts from, so a run can be repeated": "Die Zahl, mit der der Generator beginnt, damit ein Lauf wiederholbar ist", + "Input": "Eingabe", + "The periods, rooms, lessons and wishes the scenario was made from": "Die Stunden, Räume, Unterrichtsstunden und Wünsche, aus denen das Szenario entstand", + "Placements": "Platzierungen", + "Each lesson with the period and room it was given": "Jede Unterrichtsstunde mit der Stunde und dem Raum, die sie bekam", + "Unplaced lessons": "Nicht platzierte Stunden", + "Lessons without a place, each with the hard wish that blocked it": "Stunden ohne Platz, jeweils mit dem harten Wunsch, der sie blockierte", + "Broken wishes": "Verletzte Wünsche", + "The wishes this scenario breaks, with the lessons that break them": "Die Wünsche, die dieses Szenario verletzt, mit den verletzenden Stunden", + "Measures": "Kennzahlen", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Platzierte Stunden, verletzte Wünsche, Freistunden, Stunden pro Tag und Raumnutzung", + "Reason": "Grund", + "Why the run failed": "Warum der Lauf fehlschlug", + "Published at": "Veröffentlicht am", + "When the scenario was written out as draft lessons": "Wann das Szenario als Entwurfsstunden geschrieben wurde", + "Edit wish": "Wunsch bearbeiten", + "New wish": "Neuer Wunsch", + "Hard: the generator always keeps it": "Hart: der Generator hält ihn immer ein", + "Soft: the generator keeps it where it can": "Weich: der Generator hält ihn ein, wo er kann", + "Weight (1 to 3)": "Gewicht (1 bis 3)", + "Most lessons a day": "Höchstens Stunden pro Tag", + "Period": "Stunde", + "{day} period {number}": "{day} Stunde {number}", + "Teacher (user name)": "Lehrkraft (Benutzername)", + "Activity (group:subject)": "Aktivität (Gruppe:Fach)", + "Say who or what the wish is about.": "Geben Sie an, wen oder was der Wunsch betrifft.", + "Choose at least one period.": "Wählen Sie mindestens eine Stunde.", + "The limit is a whole number of 1 or more.": "Das Limit ist eine ganze Zahl ab 1.", + "Timetable": "Stundenplan", + "Wishes": "Wünsche", + "Timetable wishes": "Stundenplanwünsche", + "Generator run": "Generatorlauf", + "Generator progress": "Fortschritt des Generators", + "The run failed: {reason}": "Der Lauf ist fehlgeschlagen: {reason}", + "{placed} of {lessons} lessons placed": "{placed} von {lessons} Stunden platziert", + "Generate again": "Erneut generieren", + "Generate": "Generieren", + "Every lesson has a place.": "Jede Stunde hat einen Platz.", + "Lesson": "Stunde", + "No free period and room": "Keine freie Stunde und kein freier Raum", + "Broken soft wishes": "Verletzte weiche Wünsche", + "Every soft wish is kept.": "Jeder weiche Wunsch ist eingehalten.", + "Wish": "Wunsch", + "Lessons": "Stunden", + "Generating: {percent}% of the time budget used": "Wird generiert: {percent}% der Zeit verbraucht", + "Waiting to start": "Wartet auf den Start", + "Published as draft lessons": "Als Entwurfsstunden veröffentlicht", + "Could not read the scenario.": "Das Szenario konnte nicht gelesen werden.", + "Could not start the run.": "Der Lauf konnte nicht gestartet werden.", + "Scenarios": "Szenarien", + "Timetable scenarios": "Stundenplanszenarien", + "Scenario": "Szenario", + "Take the current timetable": "Aktuellen Stundenplan übernehmen", + "Could not take the current timetable.": "Der aktuelle Stundenplan konnte nicht übernommen werden.", + "Broken hard wishes": "Verletzte harte Wünsche", + "Not on a period of the week grid": "Nicht auf einer Stunde des Wochenrasters", + "Compare scenarios": "Szenarien vergleichen", + "Scenarios to compare": "Zu vergleichende Szenarien", + "Choose two or three scenarios to compare them.": "Wählen Sie zwei oder drei Szenarien zum Vergleich.", + "Measure": "Kennzahl", + "Best": "Bester Wert", + "Lessons that differ": "Abweichende Stunden", + "No lesson differs.": "Keine Stunde weicht ab.", + "Not placed": "Nicht platziert", + "{period} in {room}": "{period} in {room}", + "Lessons placed": "Platzierte Stunden", + "Lessons without a place": "Stunden ohne Platz", + "Clashes": "Konflikte", + "Hard wishes broken": "Verletzte harte Wünsche", + "Soft wishes broken": "Verletzte weiche Wünsche", + "Soft wishes broken, weighted": "Verletzte weiche Wünsche, gewichtet", + "Free periods between lessons, all teachers": "Freistunden, alle Lehrkräfte", + "Most free periods of one teacher": "Meiste Freistunden einer Lehrkraft", + "Most lessons of one group on a day": "Meiste Stunden einer Gruppe an einem Tag", + "Room use": "Raumnutzung", + "Publish as draft lessons": "Als Entwurfsstunden veröffentlichen", + "Draft lessons written: {count}": "Entwurfsstunden geschrieben: {count}", + "Could not publish the scenario.": "Das Szenario konnte nicht veröffentlicht werden.", + "Rules": "Regeln", + "Rules for {column}": "Regeln für {column}", + "When a card enters this column": "Wenn eine Karte diese Spalte erreicht", + "Action": "Aktion", + "Set the priority": "Priorität setzen", + "Assign to": "Zuweisen an", + "Assign the person who moved the card": "Die Person zuweisen, die die Karte verschoben hat", + "Remove the assignee": "Zuweisung entfernen", + "Add a label": "Label hinzufügen", + "No longer a project member": "Kein Projektmitglied mehr", + "This label no longer exists": "Dieses Label gibt es nicht mehr", + "Add rule": "Regel hinzufügen", + "Remove rule": "Regel entfernen", + "No rules yet. Add one to change a card when it enters this column.": "Noch keine Regeln. Fügen Sie eine hinzu, um eine Karte zu ändern, wenn sie diese Spalte erreicht.", + "Could not save the rules. Please try again.": "Die Regeln konnten nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "1 rule runs when a card enters this column": "1 Regel wird ausgeführt, wenn eine Karte diese Spalte erreicht", + "{count} rules run when a card enters this column": "{count} Regeln werden ausgeführt, wenn eine Karte diese Spalte erreicht", + "Rules applied: {changes}": "Regeln angewendet: {changes}", + "assigned to {name}": "zugewiesen an {name}", + "assignee removed": "Zuweisung entfernt", + "priority {priority}": "Priorität {priority}", + "label {label}": "Label {label}", + "What happens to a card when it enters this column, applied in list order.": "Was mit einer Karte geschieht, wenn sie diese Spalte erreicht, in der Reihenfolge der Liste.", + "Value": "Wert", + "What the rule does to the card.": "Was die Regel mit der Karte macht.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Die Priorität, die Benutzer-ID oder die Label-ID, die die Aktion verwendet; leer bei Aktionen ohne Wert.", + "is not": "ist nicht", + "{dimension} is not": "{dimension} ist nicht", + "Saved filters": "Gespeicherte Filter", + "No saved filters yet": "Noch keine gespeicherten Filter", + "Save filter": "Filter speichern", + "Rename \"{name}\"": "„{name}“ umbenennen", + "Delete \"{name}\"": "„{name}“ löschen", + "Clear filters": "Filter zurücksetzen", + "Showing {shown} of {total} tasks": "{shown} von {total} Aufgaben angezeigt", + "Me": "Ich", + "No date": "Kein Datum", + "Rename saved filter": "Gespeicherten Filter umbenennen", + "Share with the project": "Mit dem Projekt teilen", + "Give the filter a name": "Geben Sie dem Filter einen Namen", + "Could not save the filter. Please try again.": "Der Filter konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "Some labels in \"{name}\" no longer exist and were left out.": "Einige Labels in „{name}“ gibt es nicht mehr; sie wurden weggelassen.", + "Could not delete the filter. Please try again.": "Der Filter konnte nicht gelöscht werden. Bitte versuchen Sie es erneut.", + "Saved filter": "Gespeicherter Filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Ein benannter Board-Filter eines Projekts, nur für die Person sichtbar, die ihn gespeichert hat, außer er wird mit dem Projekt geteilt.", + "The project whose board the filter applies to": "Das Projekt, auf dessen Board der Filter wirkt", + "The name the filter is listed under": "Der Name, unter dem der Filter aufgeführt wird", + "Saved by": "Gespeichert von", + "Nextcloud user id of the person who saved the filter": "Nextcloud-Benutzer-ID der Person, die den Filter gespeichert hat", + "Shared with the project": "Mit dem Projekt geteilt", + "Whether every project member sees and applies the filter": "Ob jedes Projektmitglied den Filter sieht und anwenden kann", + "Criteria": "Kriterien", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Der Filter: Zuweisung, Label, Priorität und Fälligkeit, jeweils mit ist oder ist nicht und den Werten", + "Cross-project view": "Projektübergreifende Ansicht", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Eine gespeicherte Auswahl von Projekten, deren Aufgaben gemeinsam in Statusspalten angezeigt werden, geteilt mit den genannten Personen.", + "Shared with": "Geteilt mit", + "The name the view is listed under": "Der Name, unter dem die Ansicht aufgeführt wird", + "Nextcloud user id of the person who saved the view": "Nextcloud-Benutzer-ID der Person, die die Ansicht gespeichert hat", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-Benutzer-IDs der Personen, mit denen die Ansicht geteilt ist", + "The projects whose tasks the view shows, at most twenty": "Die Projekte, deren Aufgaben die Ansicht zeigt, höchstens zwanzig", + "1 project in this view is hidden from you.": "1 Projekt in dieser Ansicht ist für dich verborgen.", + "{count} projects in this view are hidden from you.": "{count} Projekte in dieser Ansicht sind für dich verborgen.", + "{project} has no column for {status}.": "{project} hat keine Spalte für {status}.", + "This view does not exist or is not shared with you.": "Diese Ansicht existiert nicht oder ist nicht mit dir geteilt.", + "\"{task}\" moved to {status}.": "\"{task}\" wurde nach {status} verschoben.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Projektübergreifende Ansichten", + "New view": "Neue Ansicht", + "Edit view": "Ansicht bearbeiten", + "Delete view": "Ansicht löschen", + "Give the view a name": "Gib der Ansicht einen Namen", + "Pick at least one project": "Wähle mindestens ein Projekt", + "A view shows at most {max} projects": "Eine Ansicht zeigt höchstens {max} Projekte", + "Could not save the view. Please try again.": "Die Ansicht konnte nicht gespeichert werden. Bitte versuche es erneut.", + "Could not delete the view. Please try again.": "Die Ansicht konnte nicht gelöscht werden. Bitte versuche es erneut.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "\"{title}\" löschen? Die Projekte und ihre Aufgaben bleiben, wie sie sind.", + "People see the tasks of the projects they are in, never more.": "Personen sehen die Aufgaben der Projekte, in denen sie sind, nie mehr.", + "No views yet. A view shows the tasks of several of your projects together.": "Noch keine Ansichten. Eine Ansicht zeigt die Aufgaben mehrerer deiner Projekte zusammen.", + "Projects in view: {count}": "Projekte in der Ansicht: {count}", + "Notify me when a task is assigned to me": "Benachrichtige mich, wenn mir eine Aufgabe zugewiesen wird", + "Also send these to me by email": "Sende mir diese auch per E-Mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Füge in deinen persönlichen Nextcloud-Einstellungen eine E-Mail-Adresse hinzu, um E-Mails zu erhalten.", + "Code link": "Code-Verknüpfung", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Ein Commit, Branch, Merge Request oder Issue auf einer Code-Plattform, das an einer Aufgabe arbeitet.", + "The task the link belongs to": "Die Aufgabe, zu der die Verknüpfung gehört", + "The project of the task": "Das Projekt der Aufgabe", + "Task key": "Aufgabenschlüssel", + "The task key the forge text named, such as VC-12": "Der Aufgabenschlüssel aus dem Text der Code-Plattform, etwa VC-12", + "What the link points at": "Worauf die Verknüpfung zeigt", + "Link": "Link", + "The address of the item in the forge": "Die Adresse des Elements auf der Code-Plattform", + "The commit message, branch name or merge request title": "Die Commit-Nachricht, der Branch-Name oder der Titel des Merge Requests", + "Repository": "Repository", + "The repository, such as acme/portal": "Das Repository, etwa acme/portal", + "Forge id": "ID auf der Plattform", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Die eigene ID des Elements auf der Code-Plattform, etwa github:acme/portal#42 oder ein Commit-Hash", + "State": "Status", + "The state of a merge request or issue": "Der Status eines Merge Requests oder Issues", + "Who made the commit or opened the merge request": "Wer den Commit erstellt oder den Merge Request eröffnet hat", + "When the commit was made or the merge request last changed": "Wann der Commit erstellt wurde oder sich der Merge Request zuletzt geändert hat", + "Added by": "Hinzugefügt von", + "Whether a person added the link or the integration wrote it": "Ob eine Person die Verknüpfung hinzugefügt oder die Integration sie geschrieben hat", + "Nextcloud user UIDs of project members": "Nextcloud-Benutzer-IDs der Projektmitglieder", + "Add link": "Link hinzufügen", + "Added by hand": "Von Hand hinzugefügt", + "Branch": "Branch", + "Code": "Code", + "Commit": "Commit", + "From the integration": "Über die Integration", + "Link to a commit, branch or merge request": "Link zu einem Commit, Branch oder Merge Request", + "Merge request": "Merge Request", + "Merged": "Zusammengeführt", + "No code linked yet. Name {key} in a commit message or paste a link.": "Noch kein Code verknüpft. Nenne {key} in einer Commit-Nachricht oder füge einen Link ein.", + "No code linked yet. Paste a link to a commit or merge request.": "Noch kein Code verknüpft. Füge einen Link zu einem Commit oder Merge Request ein.", + "Paste a web address that starts with https://.": "Füge eine Webadresse ein, die mit https:// beginnt.", + "Remove link {title}": "Link {title} entfernen", + "The link could not be added.": "Der Link konnte nicht hinzugefügt werden.", + "The link could not be removed.": "Der Link konnte nicht entfernt werden.", + "This link is already on the task.": "Dieser Link ist bereits bei der Aufgabe.", + "Code forges": "Code-Plattformen", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Verknüpfe GitHub-Commits und Pull Requests mit Aufgaben. Integriq empfängt die Ereignisse; planninq ruft GitHub nie auf.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Lade die Konfiguration herunter und importiere sie in Integriq. Trage dann ein Geheimnis in der Regel \"Check the GitHub signature\" ein.", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Füge in GitHub dem Repository einen Webhook mit dieser Adresse und demselben Geheimnis hinzu. Wähle den Inhaltstyp application/json und die Ereignisse Push und Pull Request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nenne den Aufgabenschlüssel, etwa VC-12, in einer Commit-Nachricht, einem Branch-Namen oder dem Titel eines Pull Requests. Der Link erscheint dann bei dieser Aufgabe.", + "Without Integriq, project members can still paste a link on the task page.": "Ohne Integriq können Projektmitglieder weiterhin einen Link auf der Aufgabenseite einfügen.", + "Download the Integriq configuration": "Integriq-Konfiguration herunterladen", + "Calendar": "Kalender", + "Previous": "Zurück", + "Calendar view": "Kalenderansicht", + "Starts:": "Beginnt:", + "No tasks with a date in this month.": "Keine Aufgaben mit einem Datum in diesem Monat.", + "Week of {start} to {end}": "Woche vom {start} bis {end}", + "My calendar": "Mein Kalender", + "Show as list": "Als Liste anzeigen", + "Show as calendar": "Als Kalender anzeigen", + "Open my calendar": "Meinen Kalender öffnen", + "Nextcloud Tasks": "Nextcloud Aufgaben", + "Show my tasks in Nextcloud Tasks": "Meine Aufgaben in Nextcloud Aufgaben anzeigen", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Die Aufgaben, die dir zugewiesen oder mit dir geteilt sind, erscheinen in einer Liste \"Planninq\" in Nextcloud Aufgaben und Kalender. Änderungen dort werden bei der nächsten Änderung in Planninq ersetzt.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Dieser Server kann nicht in Nextcloud Aufgaben schreiben, daher ist der Export nicht verfügbar.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Von Planninq verwaltet. Änderungen hier werden bei der nächsten Änderung in Planninq ersetzt.", + "Working days and holidays": "Arbeitstage und Feiertage", + "Dates set on the timeline skip the days that are not working days.": "Auf der Zeitleiste gesetzte Daten überspringen die Tage, die keine Arbeitstage sind.", + "Working weekdays": "Arbeitstage der Woche", + "Non-working days": "Arbeitsfreie Tage", + "No non-working days yet.": "Noch keine arbeitsfreien Tage.", + "Add day": "Tag hinzufügen", + "Year": "Jahr", + "Add Dutch national holidays": "Niederländische Feiertage hinzufügen", + "Save working days": "Arbeitstage speichern", + "Choose at least one working weekday.": "Wähle mindestens einen Arbeitstag.", + "Working days saved.": "Arbeitstage gespeichert.", + "Could not save the working days.": "Die Arbeitstage konnten nicht gespeichert werden.", + "New Year's Day": "Neujahr", + "Easter Sunday": "Ostersonntag", + "Easter Monday": "Ostermontag", + "King's Day": "Königstag", + "Liberation Day": "Befreiungstag", + "Ascension Day": "Christi Himmelfahrt", + "Whit Sunday": "Pfingstsonntag", + "Whit Monday": "Pfingstmontag", + "Christmas Day": "Erster Weihnachtstag", + "Boxing Day": "Zweiter Weihnachtstag", + "Dates of {title}": "Daten von {title}", + "The due date cannot be before the start date.": "Das Fälligkeitsdatum darf nicht vor dem Startdatum liegen.", + "{title}, from {start} to {end}": "{title}, vom {start} bis {end}", + "The dates could not be saved.": "Die Daten konnten nicht gespeichert werden.", + "{title} now runs from {start} to {end}": "{title} läuft jetzt vom {start} bis {end}", + "Auto-scheduling": "Automatische Planung", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Wenn aktiv, bietet ein späteres Fälligkeitsdatum auf der Zeitleiste an, die davon blockierten Aufgaben mitzuverschieben.", + "Move blocked tasks along when a task slips": "Blockierte Aufgaben mitverschieben, wenn eine Aufgabe sich verzögert", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Auf der Zeitleiste bietet ein späteres Fälligkeitsdatum an, die blockierten Aufgaben mitzuverschieben. Nur \"blockiert\"-Verknüpfungen zählen, und Aufgaben werden nur nach hinten verschoben.", + "Move the tasks that wait for {title}?": "Die Aufgaben verschieben, die auf {title} warten?", + "These tasks wait for it and would start after its new due date:": "Diese Aufgaben warten darauf und würden nach dem neuen Fälligkeitsdatum beginnen:", + "{count} tasks would move; the first {limit} are listed.": "{count} Aufgaben würden verschoben; die ersten {limit} stehen hier.", + "Now": "Jetzt", + "After the move": "Nach dem Verschieben", + "Only this task": "Nur diese Aufgabe", + "Move all": "Alle verschieben", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Bei {title} angehalten: die Daten konnten nicht gespeichert werden. Die Aufgaben davor wurden verschoben.", + "Cumulative flow": "Kumulativer Fluss", + "Show as chart": "Als Diagramm anzeigen", + "Show as table": "Als Tabelle anzeigen", + "Tasks per column per day": "Aufgaben pro Spalte pro Tag", + "Tasks without recorded history in this period: {count}": "Aufgaben ohne aufgezeichnete Historie in diesem Zeitraum: {count}", + "Lead and cycle time": "Durchlauf- und Zykluszeit", + "No tasks were finished in this period.": "In diesem Zeitraum wurden keine Aufgaben abgeschlossen.", + "Finished tasks": "Abgeschlossene Aufgaben", + "Cycle time, average": "Zykluszeit, Durchschnitt", + "Cycle time, 85th percentile": "Zykluszeit, 85. Perzentil", + "Lead time, average": "Durchlaufzeit, Durchschnitt", + "Tasks whose finish time was estimated from their history: {count}": "Aufgaben, deren Endzeit aus der Historie geschätzt wurde: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Zykluszeit jeder abgeschlossenen Aufgabe, mit Durchschnitt und 85. Perzentil", + "Slowest tasks": "Langsamste Aufgaben", + "cycle {cycle}, lead {lead}": "Zyklus {cycle}, Durchlauf {lead}", + "{days} days": "{days} Tage", + "Could not load the flow of this project.": "Der Fluss dieses Projekts konnte nicht geladen werden.", + "Last {days} days": "Letzte {days} Tage", + "Portfolio flow": "Portfolio-Fluss", + "An admin adds portfolios under Projects, Portfolios.": "Eine Administratorin fügt Portfolios unter Projekte, Portfolios hinzu.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Nicht angezeigte Projekte, da höchstens 50 gleichzeitig angezeigt werden: {count}", + "Could not load the flow of this portfolio.": "Der Fluss dieses Portfolios konnte nicht geladen werden.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativer Fluss und Zykluszeit über die Projekte eines Portfolios.", + "Edit report": "Bericht bearbeiten", + "Only tasks where": "Nur Aufgaben, bei denen", + "Group by": "Gruppieren nach", + "Display": "Darstellung", + "Share with everyone who can read its projects": "Mit allen teilen, die die Projekte lesen dürfen", + "The report could not be saved.": "Der Bericht konnte nicht gespeichert werden.", + "Number of tasks": "Anzahl Aufgaben", + "Bar": "Balken", + "Donut": "Ring", + "Table": "Tabelle", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} von {total} Projekten in diesem Bericht sind für dich nicht sichtbar", + "No tasks match this report.": "Keine Aufgaben passen zu diesem Bericht.", + "None": "Keine", + "Could not load this report.": "Dieser Bericht konnte nicht geladen werden.", + "Report": "Bericht", + "Your reports": "Deine Berichte", + "My reports": "Meine Berichte", + "Shared reports": "Geteilte Berichte", + "You have not built a report yet.": "Du hast noch keinen Bericht erstellt.", + "Nobody has shared a report with you yet.": "Noch niemand hat einen Bericht mit dir geteilt.", + "Reports you built over tasks, and the ones shared with you.": "Berichte, die du über Aufgaben erstellt hast, und die mit dir geteilten.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Eine gespeicherte Abfrage über Aufgaben: welche Projekte, welche Filter, wonach gruppiert, gezählt oder summiert, und als Tabelle oder Diagramm gezeigt.", + "The name the report is listed under": "Der Name, unter dem der Bericht aufgeführt wird", + "What the report shows and who it is for": "Was der Bericht zeigt und für wen er ist", + "Nextcloud user id of the person who saved the report": "Nextcloud-Benutzer-ID der Person, die den Bericht gespeichert hat", + "Who can open the report": "Wer den Bericht öffnen kann", + "Only me": "Nur ich", + "Everyone who can read its projects": "Alle, die seine Projekte lesen dürfen", + "The projects the report covers, at most fifty": "Die Projekte, die der Bericht umfasst, höchstens fünfzig", + "Filters": "Filter", + "Task fields and the value each must equal": "Aufgabenfelder und der Wert, dem jedes gleichen muss", + "The task field the report groups on": "Das Aufgabenfeld, nach dem der Bericht gruppiert", + "Count the tasks, or add up a number on them": "Die Aufgaben zählen oder eine Zahl auf ihnen summieren", + "Sum": "Summe", + "Sum of": "Summe von", + "The number added up when the measure is a sum": "Die summierte Zahl, wenn das Maß eine Summe ist", + "Story points": "Story Points", + "Estimated duration": "Geschätzte Dauer", + "How the report is shown": "Wie der Bericht gezeigt wird", + "Issue type": "Vorgangstyp", + "Task fields and the value each must equal; empty when the report covers every task": "Aufgabenfelder und der Wert, dem jedes entsprechen muss; leer, wenn der Bericht alle Aufgaben umfasst", + "The status a task must have": "Der Status, den eine Aufgabe haben muss", + "The priority a task must have": "Die Priorität, die eine Aufgabe haben muss", + "The user a task must be assigned to": "Die Person, der eine Aufgabe zugewiesen sein muss", + "A label a task must carry": "Ein Label, das eine Aufgabe tragen muss", + "The board column a task must be in": "Die Board-Spalte, in der eine Aufgabe stehen muss", + "The issue type a task must have": "Der Vorgangstyp, den eine Aufgabe haben muss", + "Manager groups": "Verwaltungsgruppen", + "Member groups": "Mitgliedsgruppen", + "Viewer groups": "Lesegruppen", + "Viewers": "Lesende", + "Owning group": "Besitzende Gruppe", + "Nextcloud groups whose members manage the project": "Nextcloud-Gruppen, deren Mitglieder das Projekt verwalten", + "Nextcloud groups whose members work on the project": "Nextcloud-Gruppen, deren Mitglieder am Projekt arbeiten", + "Nextcloud groups whose members may read the project": "Nextcloud-Gruppen, deren Mitglieder das Projekt lesen dürfen", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-Personen, die das Projekt verwalten: Einstellungen, Mitglieder und Arbeit", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-Personen, die das Projekt und seine Arbeit lesen, aber nicht ändern dürfen", + "The Nextcloud group that owns the project with its creator, at most one": "Die Nextcloud-Gruppe, der das Projekt mit seiner Erstellerin oder seinem Ersteller gehört, höchstens eine", + "Nextcloud user ids who may read this through the project": "Nextcloud-Personen, die dies über das Projekt lesen dürfen", + "Nextcloud groups whose members may change this through the project": "Nextcloud-Gruppen, deren Mitglieder dies über das Projekt ändern dürfen", + "Nextcloud groups whose members may read this through the project": "Nextcloud-Gruppen, deren Mitglieder dies über das Projekt lesen dürfen", + "Search for a person or a group…": "Nach einer Person oder Gruppe suchen…", + "No one found. Your admin's sharing settings decide who you can find.": "Niemand gefunden. Die Freigabeeinstellungen deiner Administration bestimmen, wen du finden kannst.", + "Type at least two characters": "Gib mindestens zwei Zeichen ein", + "Everyone in this group": "Alle in dieser Gruppe", + "Could not search for people. Please try again.": "Die Suche nach Personen ist fehlgeschlagen. Bitte versuche es erneut.", + "Could not remove the group": "Die Gruppe konnte nicht entfernt werden", + "Only the owner and managers change who is on this project.": "Nur die Eigentümerin und die Verwaltenden ändern, wer zu diesem Projekt gehört.", + "Role of {name}": "Rolle von {name}", + "Manager": "Verwaltung", + "Member": "Mitglied", + "Viewer": "Lesend", + "Could not change the role": "Die Rolle konnte nicht geändert werden", + "Owned by group: {name}": "Im Besitz der Gruppe: {name}", + "No group owns this project.": "Keine Gruppe besitzt dieses Projekt.", + "Owned by group": "Im Besitz der Gruppe", + "Search for a group…": "Nach einer Gruppe suchen…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Keine Gruppe gefunden. Die Freigabeeinstellungen deiner Administration bestimmen, welche Gruppen du finden kannst.", + "No owning group": "Keine besitzende Gruppe", + "Could not search for groups. Please try again.": "Gruppensuche fehlgeschlagen. Bitte versuche es erneut.", + "Could not change the owning group": "Die besitzende Gruppe konnte nicht geändert werden", + "You can read this project. Only its members change it.": "Du kannst dieses Projekt lesen. Nur seine Mitglieder ändern es.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Der Kurs, den diese Stunde unterrichtet, etwa ein Wahlfach, wenn die Lern-App der Schule ihn kennt.", + "Online meeting link": "Link zur Online-Stunde", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Wo Schüler online an dieser Stunde teilnehmen. Die Schaltfläche Teilnehmen erscheint nur bei einem https-Link." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/de.json b/l10n/de.json index 86cd7702..54ded581 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -199,7 +199,1167 @@ "Could not delete label": "Label konnte nicht gelöscht werden", "Delete label \"{title}\"? It will be removed from {count} task.": "Label \"{title}\" löschen? Es wird aus {count} Aufgaben entfernt.", "Label deleted and removed from {count} task": "Label gelöscht und aus {count} Aufgaben entfernt", - "used by {count} task": "verwendet von {count} Aufgaben" + "used by {count} task": "verwendet von {count} Aufgaben", + "Active projects": "Aktive Projekte", + "Archived projects": "Archivierte Projekte", + "Boards": "Boards", + "My projects": "Meine Projekte", + "Portfolio": "Portfolio", + "Project board": "Projekt-Board", + "Projects I am in": "Projekte, an denen ich beteiligt bin", + "Timeline": "Zeitleiste", + "Timesheet": "Zeiterfassung", + "Features & roadmap": "Funktionen und Roadmap", + "Flow": "Ablauf", + "Flows": "Abläufe", + "Reports": "Berichte", + "Pick a report to open it.": "Wählen Sie einen Bericht, um ihn zu öffnen.", + "In progress": "In Bearbeitung", + "Date": "Datum", + "Due": "Fällig", + "Assignee": "Zugewiesen an", + "Who": "Wer", + "What": "Was", + "Minutes": "Minuten", + "Entries": "Einträge", + "Most recent": "Zuletzt", + "Per person": "Pro Person", + "By status": "Nach Status", + "By priority": "Nach Priorität", + "Task status": "Aufgabenstatus", + "Time spent": "Aufgewendete Zeit", + "Capacity": "Kapazität", + "Due soonest": "Als Nächstes fällig", + "Minutes logged": "Erfasste Minuten", + "Nothing is due": "Nichts ist fällig", + "Nothing logged yet": "Noch nichts erfasst", + "What is open, what is blocked, and what is overdue.": "Was offen ist, was blockiert ist und was überfällig ist.", + "How allocation is spread across the people working on projects.": "Wie sich die Auslastung auf die Projektbeteiligten verteilt.", + "Hours logged, and the projects they went to.": "Erfasste Stunden und die Projekte, in die sie geflossen sind.", + "Billable": "Abrechenbar", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Projekte werden geladen", + "No projects for this client yet": "Noch keine Projekte für diesen Kunden", + "Open in Planninq": "In Planninq öffnen", + "This project could not be found": "Dieses Projekt wurde nicht gefunden", + "Untitled project": "Unbenanntes Projekt", + "and {count} more": "und {count} weitere", + "Store": "Store", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installieren Sie Register, Schemata und Flows, die andere Organisationen veröffentlicht haben.", + "Work Date": "Arbeitsdatum", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Spaltenaktionen", + "Columns": "Spalten", + "Could not remove the column. Please try again.": "Die Spalte konnte nicht entfernt werden. Bitte versuchen Sie es erneut.", + "Could not save the column. Please try again.": "Die Spalte konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "Done column": "Erledigt-Spalte", + "Edit column": "Spalte bearbeiten", + "Keep the card's status": "Status der Karte beibehalten", + "Move its cards to": "Karten verschieben nach", + "Move left": "Nach links", + "Move right": "Nach rechts", + "Status of cards moved here": "Status der hierher verschobenen Karten", + "The last done column cannot be removed.": "Die letzte Erledigt-Spalte kann nicht entfernt werden.", + "WIP limit": "WIP-Limit", + "over limit": "über dem Limit", + "The status a card gets when it is moved into this column.": "Der Status, den eine Karte erhält, wenn sie in diese Spalte verschoben wird.", + "All priorities": "Alle Prioritäten", + "Could not create the task. Please try again.": "Die Aufgabe konnte nicht erstellt werden. Bitte versuchen Sie es erneut.", + "Created": "Erstellt", + "Move to backlog": "In den Backlog", + "Move to board": "Aufs Board", + "New task": "Neue Aufgabe", + "Nothing in the backlog": "Nichts im Backlog", + "Rank": "Rang", + "Sort by": "Sortieren nach", + "Sort by rank to reorder": "Nach Rang sortieren, um neu anzuordnen", + "Task actions": "Aufgabenaktionen", + "All labels": "Alle Labels", + "Filter tasks by label": "Aufgaben nach Label filtern", + "View timeline": "Zeitleiste anzeigen", + "Board": "Board", + "List": "Liste", + "Column": "Spalte", + "Board or list": "Board oder Liste", + "Log": "Protokoll", + "Add entry": "Eintrag hinzufügen", + "Show": "Anzeigen", + "No actions yet": "Noch keine Aktionen", + "Closed": "Geschlossen", + "Entry actions": "Eintragsaktionen", + "Add action": "Aktion hinzufügen", + "by {author}": "von {author}", + "saved {time}": "gespeichert {time}", + "Attendees: {names}": "Teilnehmende: {names}", + "Add the first entry": "Ersten Eintrag hinzufügen", + "Issues": "Probleme", + "Lessons learned": "Erkenntnisse", + "Meetings": "Besprechungen", + "Decisions": "Entscheidungen", + "Actions": "Aktionen", + "Issue": "Problem", + "Lesson learned": "Erkenntnis", + "Meeting": "Besprechung", + "Decision": "Entscheidung", + "About this project": "Über dieses Projekt", + "No description yet": "Noch keine Beschreibung", + "Start date": "Startdatum", + "Not set": "Nicht festgelegt", + "End date": "Enddatum", + "Progress": "Fortschritt", + "No tasks yet": "Noch keine Aufgaben", + "Open the board": "Board öffnen", + "People": "Personen", + "Owner": "Eigentümer", + "Latest log entries": "Neueste Einträge", + "Open the log": "Protokoll öffnen", + "{done} of {total} tasks done": "{done} von {total} Aufgaben erledigt", + "Edit entry": "Eintrag bearbeiten", + "Type": "Art", + "Attendees": "Teilnehmende", + "Issue is closed": "Problem ist geschlossen", + "Could not save the entry. Please try again.": "Der Eintrag konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "From: {title}": "Aus: {title}", + "What needs to happen": "Was passieren muss", + "Could not create the action. Please try again.": "Die Aktion konnte nicht erstellt werden. Bitte versuchen Sie es erneut.", + "The action was created but could not be linked to the entry.": "Die Aktion wurde erstellt, konnte aber nicht mit dem Eintrag verknüpft werden.", + "Project pages": "Projektseiten", + "Overview": "Übersicht", + "Risks": "Risiken", + "Log entry": "Protokolleintrag", + "A short name for the entry": "Ein kurzer Name für den Eintrag", + "Project": "Projekt", + "The project this entry belongs to": "Das Projekt, zu dem dieser Eintrag gehört", + "What kind of entry this is": "Welche Art Eintrag dies ist", + "When it happened": "Wann es passiert ist", + "What happened, in Markdown": "Was passiert ist, in Markdown", + "Whether an issue is still open": "Ob ein Problem noch offen ist", + "The people at a meeting": "Die Personen bei einer Besprechung", + "Tasks that came out of this entry": "Aufgaben, die aus diesem Eintrag entstanden sind", + "Add risk": "Risiko hinzufügen", + "Risk": "Risiko", + "Score": "Wert", + "Response": "Reaktion", + "Review date": "Prüfdatum", + "no longer on the project": "nicht mehr im Projekt", + "Edit {title}": "{title} bearbeiten", + "No risks recorded yet": "Noch keine Risiken erfasst", + "Add the first risk": "Erstes Risiko hinzufügen", + "Medium": "Mittel", + "Mitigating": "Wird gemindert", + "Occurred": "Eingetreten", + "Avoid": "Vermeiden", + "Reduce": "Mindern", + "Transfer": "Übertragen", + "Accept": "Akzeptieren", + "Highest open risks": "Höchste offene Risiken", + "No open risks": "Keine offenen Risiken", + "Open the risk register": "Risikoregister öffnen", + "Edit risk": "Risiko bearbeiten", + "What could go wrong": "Was schiefgehen kann", + "Likelihood": "Wahrscheinlichkeit", + "Impact": "Auswirkung", + "Score {score}": "Wert {score}", + "Countermeasures": "Gegenmaßnahmen", + "Could not save the risk. Please try again.": "Das Risiko konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "Risks by likelihood and impact": "Risiken nach Wahrscheinlichkeit und Auswirkung", + "Risk scale": "Risikoskala", + "The levels every project scores its risks on, and where low turns into medium and high": "Die Stufen, auf denen jedes Projekt seine Risiken bewertet, und wo niedrig in mittel und hoch übergeht", + "Number of levels": "Anzahl der Stufen", + "Likelihood labels": "Bezeichnungen für Wahrscheinlichkeit", + "Impact labels": "Bezeichnungen für Auswirkung", + "Level {level}": "Stufe {level}", + "Medium from score": "Mittel ab Wert", + "High from score": "Hoch ab Wert", + "Risk scale saved": "Risikoskala gespeichert", + "1 risk uses level {level}. Change it first.": "1 Risiko nutzt Stufe {level}. Ändern Sie es zuerst.", + "{count} risks use level {level}. Change them first.": "{count} Risiken nutzen Stufe {level}. Ändern Sie diese zuerst.", + "Every level needs a label, and high must start above medium.": "Jede Stufe braucht eine Bezeichnung, und hoch muss über mittel beginnen.", + "The project this risk belongs to": "Das Projekt, zu dem dieses Risiko gehört", + "The cause and the effect, in Markdown": "Ursache und Wirkung, in Markdown", + "Category": "Kategorie", + "A free grouping, such as planning, budget or supplier": "Eine freie Einteilung, etwa Planung, Budget oder Lieferant", + "How likely it is, on the admin's risk scale": "Wie wahrscheinlich es ist, auf der Risikoskala der Administration", + "How hard it would hit, on the admin's risk scale": "Wie hart es treffen würde, auf der Risikoskala der Administration", + "Likelihood times impact, calculated by the server": "Wahrscheinlichkeit mal Auswirkung, vom Server berechnet", + "Where the risk stands": "Wo das Risiko steht", + "The person who watches this risk": "Die Person, die dieses Risiko beobachtet", + "How the project answers the risk": "Wie das Projekt auf das Risiko reagiert", + "What is done to prevent it or soften it, in Markdown": "Was getan wird, um es zu verhindern oder abzuschwächen, in Markdown", + "When to look at this risk again": "Wann dieses Risiko erneut geprüft wird", + "Very low": "Sehr niedrig", + "Very high": "Sehr hoch", + "All projects": "Alle Projekte", + "Project status report": "Projektstatusbericht", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Ein datierter Bericht, wie ein Projekt bei Geld, Organisation, Zeit, Information, Qualität und Risiko (den GROTIK-Aspekten) steht, jeweils mit einer Notiz.", + "The project this report is about": "Das Projekt, um das es in diesem Bericht geht", + "Report date": "Berichtsdatum", + "The day the report describes": "Der Tag, den der Bericht beschreibt", + "Money": "Geld", + "How the project stands on this aspect": "Wie das Projekt bei diesem Aspekt steht", + "On track": "Im Plan", + "At risk": "Gefährdet", + "Off track": "Außer Plan", + "Money note": "Notiz zu Geld", + "A short explanation of this status": "Eine kurze Erläuterung dieses Status", + "Organisation": "Organisation", + "Organisation note": "Notiz zur Organisation", + "Time": "Zeit", + "Time note": "Notiz zur Zeit", + "Information": "Information", + "Information note": "Notiz zur Information", + "Quality": "Qualität", + "Quality note": "Notiz zur Qualität", + "Risk note": "Notiz zum Risiko", + "Overall": "Gesamt", + "The worst of the six statuses, calculated by the server": "Der schlechteste der sechs Status, vom Server berechnet", + "Health: money": "Zustand: Geld", + "Copied from the newest status report": "Aus dem neuesten Statusbericht übernommen", + "Health: organisation": "Zustand: Organisation", + "Health: time": "Zustand: Zeit", + "Health: information": "Zustand: Information", + "Health: quality": "Zustand: Qualität", + "Health: risk": "Zustand: Risiko", + "Health: overall": "Zustand: gesamt", + "Health: report date": "Zustand: Berichtsdatum", + "The date of the newest status report": "Das Datum des neuesten Statusberichts", + "New report": "Neuer Bericht", + "Only the project owner writes status reports.": "Nur der Projekteigentümer schreibt Statusberichte.", + "Latest report, {date}": "Letzter Bericht, {date}", + "Aspect": "Aspekt", + "Note": "Notiz", + "Report history": "Berichtsverlauf", + "Author": "Autor", + "No status reports yet": "Noch keine Statusberichte", + "Write the first report": "Den ersten Bericht schreiben", + "Choose a status for every aspect to save the report.": "Wählen Sie für jeden Aspekt einen Status, um den Bericht zu speichern.", + "Suggested: on track.": "Vorschlag: im Plan.", + "Suggested: at risk.": "Vorschlag: gefährdet.", + "Suggested: off track.": "Vorschlag: außer Plan.", + "1 task is past its due date.": "1 Aufgabe ist überfällig.", + "{count} tasks are past their due date.": "{count} Aufgaben sind überfällig.", + "The end date has passed with 1 open task.": "Das Enddatum ist mit 1 offenen Aufgabe überschritten.", + "The end date has passed with {count} open tasks.": "Das Enddatum ist mit {count} offenen Aufgaben überschritten.", + "No open task is past its due date.": "Keine offene Aufgabe ist überfällig.", + "The highest open risk, \"{title}\", scores {score}.": "Das höchste offene Risiko, \"{title}\", hat {score} Punkte.", + "There are no open risks.": "Es gibt keine offenen Risiken.", + "Costs are at {percent}% of the budget.": "Die Kosten liegen bei {percent}% des Budgets.", + "No suggestion: the project has no budget.": "Kein Vorschlag: Das Projekt hat kein Budget.", + "No suggestion: no costs are recorded for this project yet.": "Kein Vorschlag: Für dieses Projekt sind noch keine Kosten erfasst.", + "The report was not saved. Only the project owner can write status reports.": "Der Bericht wurde nicht gespeichert. Nur der Projekteigentümer kann Statusberichte schreiben.", + "No report": "Kein Bericht", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Eine Gruppe von Projekten, die von denselben Personen geführt wird, etwa eine Abteilung oder ein Programm. Die Verantwortlichen lesen jedes Projekt darin.", + "The name of the portfolio": "Der Name des Portfolios", + "What the portfolio holds and who runs it": "Was das Portfolio enthält und wer es führt", + "A colour for the portfolio's section in project lists": "Eine Farbe für den Abschnitt des Portfolios in Projektlisten", + "Managers": "Verantwortliche", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-Benutzer-IDs der Personen, die das Portfolio führen", + "Order": "Reihenfolge", + "Where the portfolio comes in project lists, lowest first": "Wo das Portfolio in Projektlisten steht, niedrigste zuerst", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Die eigene Risikoskala dieses Portfolios als JSON, in derselben Form wie die appweite. Leer bedeutet die appweite Skala.", + "Portfolio readers": "Portfolio-Leser", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-Benutzer-IDs der Verantwortlichen des Portfolios des Projekts", + "The portfolio this project belongs to": "Das Portfolio, zu dem dieses Projekt gehört", + "No portfolio": "Kein Portfolio", + "All portfolios": "Alle Portfolios", + "You read this project as a manager of its portfolio. Only its members change it.": "Sie lesen dieses Projekt als Verantwortliche des Portfolios. Nur seine Mitglieder ändern es.", + "Portfolios": "Portfolios", + "Portfolio status": "Portfoliostatus", + "No portfolios yet": "Noch keine Portfolios", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Eine Administratorin fügt Portfolios unter Projekte, Portfolios hinzu. Projekte eines Portfolios stehen hier mit ihrem Status.", + "Roll-up": "Zusammenfassung", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} im Plan, {atRisk} gefährdet, {offTrack} nicht im Plan, {noReport} ohne Bericht", + "No project in this portfolio that you can read.": "Kein Projekt in diesem Portfolio, das du lesen kannst.", + "Start": "Beginn", + "End": "Ende", + "Budget": "Budget", + "Last report": "Letzter Bericht", + "Out of date": "Veraltet", + "Portfolio timeline": "Portfolio-Zeitachse", + "Zoom": "Zoom", + "Could not load the timeline": "Die Zeitachse konnte nicht geladen werden", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Eine Administratorin fügt Portfolios unter Projekte, Portfolios hinzu. Projekte eines Portfolios stehen hier auf einer Zeitachse.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Öffne ein Projekt, um seine Phasen und Aufgaben zu sehen. Die Zeitachse ist schreibgeschützt.", + "Phase: {title}": "Phase: {title}", + "Left out because you cannot read them: {count} projects": "Ausgelassen, weil du sie nicht lesen kannst: {count} Projekte", + "Week": "Woche", + "Day": "Tag", + "Month": "Monat", + "Please try again later.": "Bitte versuche es später erneut.", + "Status reports": "Statusberichte", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Nach wie vielen Tagen der letzte Statusbericht eines Projekts in der Portfolioübersicht als veraltet markiert wird", + "Reporting period (days)": "Berichtszeitraum (Tage)", + "The reporting period is a whole number of days from 1 to 365.": "Der Berichtszeitraum ist eine ganze Zahl von Tagen von 1 bis 365.", + "Reporting period saved": "Berichtszeitraum gespeichert", + "The reporting period was not saved. Please try again.": "Der Berichtszeitraum wurde nicht gespeichert. Bitte versuche es erneut.", + "Every project of a portfolio with its status per aspect, rolled up.": "Jedes Projekt eines Portfolios mit seinem Status je Aspekt, zusammengefasst.", + "The projects of a portfolio on one timeline.": "Die Projekte eines Portfolios auf einer Zeitachse.", + "Phases": "Phasen", + "Add phase": "Phase hinzufügen", + "No phases yet": "Noch keine Phasen", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Teile das Projekt in Phasen auf, etwa Initiierung, Definition und Umsetzung. Eine Phase schließt, sobald ihr Abschlussdokument hochgeladen ist.", + "{hours} hours": "{hours} Stunden", + "Concluding document: {title}": "Abschlussdokument: {title}", + "Concluding document missing": "Abschlussdokument fehlt", + "Move {title} up": "{title} nach oben", + "Move {title} down": "{title} nach unten", + "Close phase": "Phase abschließen", + "Phase": "Phase", + "Files": "Dateien", + "Notes": "Notizen", + "Audit trail": "Prüfprotokoll", + "Edit phase": "Phase bearbeiten", + "Name": "Name", + "Budget hours": "Budgetstunden", + "Could not save the phase. Please try again.": "Die Phase konnte nicht gespeichert werden. Bitte versuche es erneut.", + "Close phase {title}": "Phase {title} abschließen", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Eine Phase schließt mit ihrem Abschlussdokument: Lade es hier hoch oder wähle eine der Dateien der Phase.", + "Concluding document": "Abschlussdokument", + "This phase has no files yet.": "Diese Phase hat noch keine Dateien.", + "Upload a document": "Dokument hochladen", + "The document was not uploaded. Please try again.": "Das Dokument wurde nicht hochgeladen. Bitte versuche es erneut.", + "Upload the concluding document before you close this phase.": "Lade das Abschlussdokument hoch, bevor du diese Phase abschließt.", + "This phase cannot be closed from its current status.": "Diese Phase kann aus ihrem aktuellen Status nicht abgeschlossen werden.", + "The phase was not closed. Please try again.": "Die Phase wurde nicht abgeschlossen. Bitte versuche es erneut.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Die ID der Datei dieser Phase, die sie abschließt. Die Phase kann erst abgeschlossen werden, wenn sie gesetzt und die Datei angehängt ist.", + "Import from Microsoft Project": "Aus Microsoft Project importieren", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Wählen Sie einen Plan, der in Microsoft Project im XML-Format gespeichert wurde. Nichts wird importiert, bevor Sie bestätigen.", + "Plan file": "Plandatei", + "What the import creates": "Was der Import anlegt", + "Tasks": "Aufgaben", + "Sub-tasks": "Unteraufgaben", + "Milestones": "Meilensteine", + "Links": "Verknüpfungen", + "Already imported, updated in place: {count}": "Bereits importiert, an Ort und Stelle aktualisiert: {count}", + "What does not carry over": "Was nicht übernommen wird", + "Tasks with resources, which are not imported: {count}": "Aufgaben mit Ressourcen, die nicht importiert werden: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Aufgaben tiefer als Ebene 3, unter ihre Aufgabe der Ebene 2 gestellt: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Verknüpfungen außer Ende-Anfang, als verwandte Verknüpfungen importiert: {count}", + "Link lags, which are dropped: {count}": "Zeitabstände von Verknüpfungen, die entfallen: {count}", + "Links to a summary task, which are not imported: {count}": "Verknüpfungen zu einem Sammelvorgang, die nicht importiert werden: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Verknüpfungen zu Aufgaben außerhalb dieses Plans, die nicht importiert werden: {count}", + "No longer in the plan": "Nicht mehr im Plan", + "These stay in the project; remove them yourself if they are no longer needed.": "Diese bleiben im Projekt; entfernen Sie sie selbst, wenn sie nicht mehr gebraucht werden.", + "Import": "Importieren", + "Close": "Schließen", + "The plan is imported: {created} created, {updated} updated.": "Der Plan ist importiert: {created} angelegt, {updated} aktualisiert.", + "Links that would close a loop were left out: {count}": "Verknüpfungen, die eine Schleife bilden würden, wurden ausgelassen: {count}", + "The import stopped part-way. Run it again to finish it.": "Der Import wurde unterwegs abgebrochen. Führen Sie ihn erneut aus, um ihn abzuschließen.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Speichern Sie den Plan in Microsoft Project über Datei, Speichern unter, XML-Format, und importieren Sie diese Datei.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Diese Datei deklariert einen DOCTYPE oder Entitäten, die nicht akzeptiert werden.", + "The file is larger than 10 MB.": "Die Datei ist größer als 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Der Plan hat mehr als 2.000 Aufgaben, mehr als ein Import verarbeitet.", + "This file is not a Microsoft Project plan in XML format.": "Diese Datei ist kein Microsoft-Project-Plan im XML-Format.", + "Choose a file to import.": "Wählen Sie eine Datei zum Importieren.", + "Only the project owner can import a plan.": "Nur der Projektinhaber kann einen Plan importieren.", + "The plan could not be read. Please try again.": "Der Plan konnte nicht gelesen werden. Bitte versuchen Sie es erneut.", + "Linked case: {title}": "Verknüpfter Vorgang: {title}", + "Linked to a case": "Mit einem Vorgang verknüpft", + "Hand over to case": "An Vorgang übergeben", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopiert jede Datei des Projekts und seiner Aufgaben sowie eine Datei, die das Projekt beschreibt, unverändert in den verknüpften Vorgang.", + "{date} by {user}": "{date} von {user}", + "Files copied: {count}": "Kopierte Dateien: {count}", + "Files that failed: {names}": "Fehlgeschlagene Dateien: {names}", + "The handover failed. Please try again.": "Die Übergabe ist fehlgeschlagen. Bitte versuchen Sie es erneut.", + "The linked case could not be found, or you cannot open it.": "Der verknüpfte Vorgang wurde nicht gefunden, oder Sie können ihn nicht öffnen.", + "Case handovers": "Übergaben an den Vorgang", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Jede Übergabe der Dateien und Metadaten des Projekts an seinen Vorgang: wann, durch wen, an welchen Vorgang, jede kopierte Datei mit ihrem SHA-256 und die fehlgeschlagenen Dateien.", + "Finance": "Finanzen", + "Add cost line": "Kostenzeile hinzufügen", + "Delivery terms": "Lieferbedingungen", + "Billing model": "Abrechnungsmodell", + "Budget in euro": "Budget in Euro", + "Budget in hours": "Budget in Stunden", + "Hourly rate in euro": "Stundensatz in Euro", + "Planned start": "Geplanter Beginn", + "Planned end": "Geplantes Ende", + "Planned dates": "Geplante Termine", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Kein Budget vereinbart", + "Hours": "Stunden", + "Only the project owner and the portfolio managers see the amounts.": "Nur der Projektinhaber und die Portfoliomanager sehen die Beträge.", + "Budget against cost per category": "Budget gegenüber Kosten je Kategorie", + "Labour (booked time)": "Arbeit (gebuchte Zeit)", + "No category": "Keine Kategorie", + "Hours are not available": "Stunden sind nicht verfügbar", + "Not yet assigned to a category": "Noch keiner Kategorie zugeordnet", + "Total": "Summe", + "{spent} spent, {remaining} remaining": "{spent} ausgegeben, {remaining} übrig", + "Budget against cost per phase": "Budget gegenüber Kosten je Phase", + "No phase": "Keine Phase", + "Cost lines": "Kostenzeilen", + "From the finance system": "Aus dem Finanzsystem", + "Edit cost line {amount}": "Kostenzeile {amount} bearbeiten", + "No cost lines yet": "Noch keine Kostenzeilen", + "Commitments": "Verpflichtungen", + "Actual cost": "Ist-Kosten", + "Forecast": "Prognose", + "Remaining": "Verbleibend", + "Not planned yet": "Noch nicht geplant", + "{start} to {end}": "{start} bis {end}", + "The terms were not saved. Please try again.": "Die Bedingungen wurden nicht gespeichert. Bitte versuche es erneut.", + "Terms saved": "Bedingungen gespeichert", + "Fixed price": "Festpreis", + "Hourly": "Stündlich", + "Not billed": "Nicht abgerechnet", + "Commitment": "Verpflichtung", + "Edit cost line": "Kostenzeile bearbeiten", + "Kind": "Art", + "Amount in euro": "Betrag in Euro", + "Remove": "Entfernen", + "Could not save the cost line. Only the project owner changes the money of a project.": "Die Kostenzeile konnte nicht gespeichert werden. Nur der Projektinhaber ändert das Geld eines Projekts.", + "Could not remove the cost line. Please try again.": "Die Kostenzeile konnte nicht entfernt werden. Bitte versuche es erneut.", + "{amount} over budget": "{amount} über Budget", + "Cost categories": "Kostenkategorien", + "The categories every project splits its budget and costs into, one per line": "Die Kategorien, in die jedes Projekt sein Budget und seine Kosten aufteilt, eine pro Zeile", + "Categories": "Kategorien", + "Give at least one category, each name once.": "Gib mindestens eine Kategorie an, jeden Namen nur einmal.", + "Cost categories saved": "Kostenkategorien gespeichert", + "The cost categories were not saved. Please try again.": "Die Kostenkategorien wurden nicht gespeichert. Bitte versuche es erneut.", + "Finance line": "Finanzzeile", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Ein Geldbetrag eines Projekts: ein Budget, eine Verpflichtung, Ist-Kosten oder eine Prognose, in einer Kostenkategorie und optional einer Phase. Erfasst vom Projektinhaber oder vom Finanzsystem über die Integrations-App.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Das Projekt, zu dem dieser Betrag gehört. Leer bei einer Zeile aus dem Finanzsystem, deren Projektnummer zu keinem Projekt passt.", + "The phase this amount belongs to, if any": "Die Phase, zu der dieser Betrag gehört, falls vorhanden", + "The cost category, one of the categories the admin set up": "Die Kostenkategorie, eine der vom Admin eingerichteten Kategorien", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Ob der Betrag ein Budget, eine Verpflichtung, Ist-Kosten oder eine Prognose ist", + "Amount": "Betrag", + "The amount in the reporting currency (euro)": "Der Betrag in der Berichtswährung (Euro)", + "The date the amount was booked or is expected": "Das Datum, an dem der Betrag gebucht wurde oder erwartet wird", + "What the amount is for": "Wofür der Betrag ist", + "Whether a person entered the line or the finance system sent it": "Ob eine Person die Zeile erfasst oder das Finanzsystem sie gesendet hat", + "Entered by hand": "Von Hand erfasst", + "Finance line id": "ID der Finanzzeile", + "The finance system's own id of this line. One imported line per id.": "Die eigene ID dieser Zeile im Finanzsystem. Eine importierte Zeile pro ID.", + "Project number": "Projektnummer", + "The project number the finance system sent, matched against the project key": "Die vom Finanzsystem gesendete Projektnummer, abgeglichen mit dem Projektschlüssel", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Das Portfolio des Projekts der Zeile, vom Projekt übernommen, damit Portfoliosummen einen Filter brauchen", + "Finance readers": "Finanzleser", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-Benutzer-UIDs der Personen, die diesen Betrag sehen dürfen: der Projektinhaber und die Manager seines Portfolios", + "Project owner": "Projektinhaber", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-Benutzer-UID des Projektinhabers, der manuelle Zeilen ändern und entfernen darf", + "How the client pays: not billed, a fixed price, or by the hour.": "Wie der Kunde zahlt: nicht abgerechnet, Festpreis oder stündlich.", + "Portfolio finance": "Portfoliofinanzen", + "You cannot see the money of any project in this portfolio": "Du kannst das Geld keines Projekts in diesem Portfolio sehen", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Der Server hat Kostenzeilen von Projekten außerhalb dieses Portfolios geliefert, daher können diese Summen falsch sein.", + "Projects left out because you cannot see their money: {count}": "Ausgelassene Projekte, weil du ihr Geld nicht sehen kannst: {count}", + "Unmatched finance lines": "Nicht zugeordnete Finanzzeilen", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, Verpflichtungen, Ist-Kosten und Prognose, über ein Portfolio summiert.", + "Subprojects": "Teilprojekte", + "{done} of {total}": "{done} von {total}", + "{done} of {total} tasks done, including subprojects": "{done} von {total} Aufgaben erledigt, einschließlich Teilprojekte", + "Show the subprojects of {title}": "Teilprojekte von {title} anzeigen", + "Hide the subprojects of {title}": "Teilprojekte von {title} ausblenden", + "Part of": "Teil von", + "No parent project": "Kein übergeordnetes Projekt", + "A project cannot sit under one of its own subprojects.": "Ein Projekt kann nicht unter einem seiner eigenen Teilprojekte liegen.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekte verschachteln sich höchstens drei Ebenen tief: Programm, Projekt und Teilprojekt.", + "Parent project": "Übergeordnetes Projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Das Projekt, unter dem dieses Projekt liegt, etwa ein Programm. Projekte verschachteln sich höchstens drei Ebenen tief.", + "Yes": "Ja", + "No": "Nein", + "{label} (required)": "{label} (Pflicht)", + "{label} is required": "{label} ist ein Pflichtfeld", + "Project field": "Projektfeld", + "A field an admin adds to every project, such as a policy area or a contract value.": "Ein Feld, das ein Admin jedem Projekt hinzufügt, etwa ein Politikfeld oder ein Auftragswert.", + "Key": "Schlüssel", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Der feste Name, unter dem der Wert gespeichert wird, in lower camel case. Behalte ihn, sobald Projekte ihn nutzen.", + "Label": "Bezeichnung", + "The name people see next to the field": "Der Name, den Personen neben dem Feld sehen", + "What the field holds": "Was das Feld enthält", + "Text": "Text", + "Number": "Zahl", + "Choice": "Auswahl", + "Person": "Person", + "Yes or no": "Ja oder nein", + "Options": "Optionen", + "The choices of a choice field": "Die Auswahlmöglichkeiten eines Auswahlfelds", + "Required": "Pflichtfeld", + "Whether a project must fill in the field": "Ob ein Projekt das Feld ausfüllen muss", + "Where the field appears, lowest first": "Wo das Feld erscheint, niedrigste zuerst", + "Applies to": "Gilt für", + "What the field is added to": "Wozu das Feld hinzugefügt wird", + "Custom fields": "Eigene Felder", + "The values of the project fields an admin defined, keyed by the field's key.": "Die Werte der vom Admin festgelegten Projektfelder, nach dem Schlüssel des Felds.", + "Project fields": "Projektfelder", + "Related": "Verwandt", + "Remove link": "Verknüpfung entfernen", + "Link type": "Art der Verknüpfung", + "Relates to": "Hängt zusammen mit", + "Duplicates": "Dupliziert", + "Project key": "Projektschlüssel", + "Every task number starts with it, such as VERG-42.": "Jede Aufgabennummer beginnt damit, zum Beispiel VERG-42.", + "This key is already used by another project.": "Dieser Schlüssel wird bereits von einem anderen Projekt verwendet.", + "Use 2 to 10 letters and digits, starting with a letter.": "Verwenden Sie 2 bis 10 Buchstaben und Ziffern, beginnend mit einem Buchstaben.", + "The key cannot change once tasks carry it.": "Der Schlüssel kann sich nicht mehr ändern, sobald Aufgaben ihn tragen.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt gespeichert. Die vorhandenen Aufgaben erhalten ihre Nummern im Hintergrund.", + "Next task number": "Nächste Aufgabennummer", + "The number the next task of this project gets in its key. Only the system writes it.": "Die Nummer, die die nächste Aufgabe dieses Projekts in ihrem Schlüssel erhält. Nur das System schreibt sie.", + "Restore {title}": "{title} wiederherstellen", + "Restore": "Wiederherstellen", + "Project restored": "Projekt wiederhergestellt", + "Could not restore the project": "Das Projekt konnte nicht wiederhergestellt werden", + "Bring this project back to the active list.": "Dieses Projekt zurück in die Liste der aktiven Projekte holen.", + "Restore project": "Projekt wiederherstellen", + "Request reason": "Grund der Anfrage", + "Why the requester needs this project. Filled in when the project is requested.": "Warum der Antragsteller dieses Projekt braucht. Wird bei der Anfrage ausgefüllt.", + "Reviewed by": "Geprüft von", + "The user who approved or rejected the request.": "Der Benutzer, der die Anfrage genehmigt oder abgelehnt hat.", + "Reviewed at": "Geprüft am", + "When the request was approved or rejected.": "Wann die Anfrage genehmigt oder abgelehnt wurde.", + "Review note": "Prüfvermerk", + "The reviewer's reason, shown to the requester when a request is not approved.": "Die Begründung des Prüfers, die der Antragsteller sieht, wenn eine Anfrage nicht genehmigt wird.", + "Members of these groups": "Mitglieder dieser Gruppen", + "Groups that may create projects": "Gruppen, die Projekte anlegen dürfen", + "The group {group} no longer exists. Save to remove it.": "Die Gruppe {group} existiert nicht mehr. Speichern Sie, um sie zu entfernen.", + "Review project request": "Projektanfrage prüfen", + "Requested by": "Angefragt von", + "Why it is needed": "Warum es gebraucht wird", + "Desired start date": "Gewünschtes Startdatum", + "Why is it not approved?": "Warum wird es nicht genehmigt?", + "Give a reason. The requester sees it.": "Geben Sie einen Grund an. Der Antragsteller sieht ihn.", + "Approve": "Genehmigen", + "Reject": "Ablehnen", + "Reject request": "Anfrage ablehnen", + "The review was not saved. Try again.": "Die Prüfung wurde nicht gespeichert. Versuchen Sie es erneut.", + "This project is waiting for review": "Dieses Projekt wartet auf die Prüfung", + "This request was not approved": "Diese Anfrage wurde nicht genehmigt", + "Reason: {note}": "Grund: {note}", + "Review request": "Anfrage prüfen", + "Request a project": "Ein Projekt anfragen", + "Step {step} of 2": "Schritt {step} von 2", + "Why is this project needed?": "Warum wird dieses Projekt gebraucht?", + "Give a reason. The reviewer reads it.": "Geben Sie einen Grund an. Der Prüfer liest ihn.", + "Back": "Zurück", + "Next": "Weiter", + "Send request": "Anfrage senden", + "The request was not sent. Try again.": "Die Anfrage wurde nicht gesendet. Versuchen Sie es erneut.", + "Requested": "Angefragt", + "Not approved": "Nicht genehmigt", + "Your request was sent": "Ihre Anfrage wurde gesendet", + "Let everyone else request a project": "Alle anderen dürfen ein Projekt anfragen", + "Add a task": "Aufgabe hinzufügen", + "Delete task": "Aufgabe löschen", + "Edit task": "Aufgabe bearbeiten", + "Write": "Schreiben", + "Preview": "Vorschau", + "Markdown works here: headings, lists and links.": "Hier funktioniert Markdown: Überschriften, Listen und Links.", + "Could not save the task. Please try again.": "Die Aufgabe konnte nicht gespeichert werden. Bitte versuche es erneut.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Auf \"{title}\" wurde Zeit gebucht, daher kann sie nicht gelöscht werden. Du kannst sie stattdessen abbrechen: Die Zeiteinträge bleiben erhalten.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "\"{title}\" löschen? Die Verknüpfungen zu anderen Aufgaben werden ebenfalls entfernt. Dies kann nicht rückgängig gemacht werden.", + "Keep task": "Aufgabe behalten", + "Cancel task": "Aufgabe abbrechen", + "Only the reporter, the project owner or an admin can delete this task.": "Nur die meldende Person, der Projektinhaber oder ein Admin kann diese Aufgabe löschen.", + "Could not delete the task. Please try again.": "Die Aufgabe konnte nicht gelöscht werden. Bitte versuche es erneut.", + "Could not cancel the task. Please try again.": "Die Aufgabe konnte nicht abgebrochen werden. Bitte versuche es erneut.", + "Responsible": "Verantwortlich", + "Also working on this": "Arbeitet auch daran", + "Labels": "Labels", + "Could not change the priority. Please try again.": "Die Priorität konnte nicht geändert werden. Bitte versuche es erneut.", + "Other project members who work on this task alongside the person responsible.": "Weitere Projektmitglieder, die mit der verantwortlichen Person an dieser Aufgabe arbeiten.", + "Duplicate": "Duplizieren", + "Could not copy the task. Please try again.": "Die Aufgabe konnte nicht kopiert werden. Bitte versuche es erneut.", + "Subtasks": "Unteraufgaben", + "{done} of {total} done": "{done} von {total} erledigt", + "Add a subtask": "Unteraufgabe hinzufügen", + "Checklist": "Checkliste", + "Checklist item actions": "Aktionen für Checklisteneintrag", + "Add a checklist item": "Checklisteneintrag hinzufügen", + "Subtasks: {estimate} estimated, {logged} logged": "Unteraufgaben: {estimate} geschätzt, {logged} gebucht", + "Total estimate: {total}": "Gesamtschätzung: {total}", + "Part of {title}": "Teil von {title}", + "Checklist: {count} done": "Checkliste: {count} erledigt", + "This task has subtasks: {count}.": "Diese Aufgabe hat Unteraufgaben: {count}.", + "Keep subtasks as separate tasks": "Unteraufgaben als eigene Aufgaben behalten", + "Delete subtasks too": "Unteraufgaben ebenfalls löschen", + "Copy of {title}": "Kopie von {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Die Aufgabe wurde kopiert, aber nicht alle Unteraufgaben. Bitte prüfe die Kopie.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Kleine Schritte innerhalb der Aufgabe. Jeder Eintrag hat eine ID, einen Text und ob er erledigt ist.", + "Open work per person and per project.": "Offene Arbeit pro Person und pro Projekt.", + "View": "Ansicht", + "By person": "Nach Person", + "By project": "Nach Projekt", + "Hours left": "Verbleibende Stunden", + "Tasks without an estimate": "Aufgaben ohne Schätzung", + "Due in 14 days": "Fällig in 14 Tagen", + "Shared": "Geteilt", + "Unassigned": "Nicht zugewiesen", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Angezeigt wird die Arbeit in den Projekten, die du sehen kannst. Stunden zählen für die verantwortliche Person; geteilte Aufgaben zählen ohne Stunden.", + "No open work in these projects.": "Keine offene Arbeit in diesen Projekten.", + "Open work": "Offene Arbeit", + "{count} open tasks": "{count} offene Aufgaben", + "Create a project to see capacity here.": "Lege ein Projekt an, um hier die Kapazität zu sehen.", + "My tasks": "Meine Aufgaben", + "Show all my tasks": "Alle meine Aufgaben anzeigen", + "No tasks assigned to you": "Dir sind keine Aufgaben zugewiesen", + "Browse projects": "Projekte durchsuchen", + "Later": "Später", + "Due {date}": "Fällig {date}", + "Could not change the status. Please try again.": "Der Status konnte nicht geändert werden. Bitte versuche es erneut.", + "Completed today": "Heute erledigt", + "My open tasks": "Meine offenen Aufgaben", + "My overdue tasks": "Meine überfälligen Aufgaben", + "My tasks in progress": "Meine Aufgaben in Bearbeitung", + "Pin to the top": "Oben anheften", + "Unpin": "Lösen", + "Pinned": "Angeheftet", + "Actions for {title}": "Aktionen für {title}", + "Could not save your project order. Please try again.": "Deine Projektreihenfolge konnte nicht gespeichert werden. Bitte versuche es erneut.", + "No boards yet": "Noch keine Boards", + "Create a project to get a board.": "Lege ein Projekt an, um ein Board zu erhalten.", + "Use the Projects page to create and manage your projects and tasks.": "Nutze die Seite Projekte, um deine Projekte und Aufgaben anzulegen und zu verwalten.", + "Go to projects": "Zu den Projekten", + "You are not a member of any projects yet.": "Du bist noch in keinem Projekt Mitglied.", + "Could not search for users. Please try again.": "Benutzer konnten nicht gesucht werden. Bitte versuche es erneut.", + "Project creation is restricted to administrators.": "Nur Administratoren können Projekte anlegen.", + "Only the project owner or an administrator can delete this project.": "Nur der Projektinhaber oder ein Administrator kann dieses Projekt löschen.", + "No projects are available to you yet. Ask an administrator to create one.": "Für dich sind noch keine Projekte verfügbar. Bitte einen Administrator, eines anzulegen.", + "Due: {date}": "Fällig: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Aufgaben mit Start- oder Fälligkeitsdatum erscheinen auf der Zeitleiste. Füge Daten hinzu, um sie hier zu sehen.", + "You do not have access to this project.": "Du hast keinen Zugriff auf dieses Projekt.", + "Zoom level": "Zoomstufe", + "Unscheduled": "Nicht geplant", + "Start: {date}": "Start: {date}", + "Today": "Heute", + "No scheduled tasks": "Keine geplanten Aufgaben", + "An unexpected error occurred.": "Ein unerwarteter Fehler ist aufgetreten.", + "Column {number} name": "Name der Spalte {number}", + "Failed to save creation policy": "Die Richtlinie zum Anlegen konnte nicht gespeichert werden", + "All authenticated users": "Alle angemeldeten Benutzer", + "Control who may create new projects": "Lege fest, wer neue Projekte anlegen darf", + "Administrators only": "Nur Administratoren", + "Project creation": "Projekte anlegen", + "Allow project creation": "Anlegen von Projekten erlauben", + "Creation policy saved successfully": "Richtlinie zum Anlegen gespeichert", + "Initializing…": "Wird gestartet…", + "e.g. 2h 30m, 90m, 1.5h": "z. B. 2h 30m, 90m, 1.5h", + "Log time": "Zeit buchen", + "Save estimate": "Schätzung speichern", + "Logged: {logged}": "Gebucht: {logged}", + "over by {amount}": "{amount} darüber", + "Time tracking": "Zeiterfassung", + "Estimate": "Schätzung", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Gib eine gültige Schätzung ein (z. B. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Gib eine gültige Dauer ein (z. B. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Der Zeiteintrag konnte nicht gespeichert werden. Bitte versuche es erneut.", + "Edit time entry": "Zeiteintrag bearbeiten", + "Duration": "Dauer", + "Date range": "Zeitraum", + "Last week": "Letzte Woche", + "No time logged": "Keine Zeit gebucht", + "Log time on a task to see it here.": "Buche Zeit auf eine Aufgabe, um sie hier zu sehen.", + "To date": "Bis Datum", + "This week": "Diese Woche", + "Total: {total}": "Gesamt: {total}", + "From date": "Ab Datum", + "Custom range": "Eigener Zeitraum", + "All time": "Gesamte Zeit", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Eine Aufgabe konnte nicht gelöscht werden, daher können Daten zurückbleiben. Lösche das Projekt erneut.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Ein Zeiteintrag konnte nicht gelöscht werden, daher können Daten zurückbleiben. Lösche das Projekt erneut.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Eine Spalte konnte nicht gelöscht werden, daher können Daten zurückbleiben. Lösche das Projekt erneut.", + "Could not delete the project. Please try again.": "Das Projekt konnte nicht gelöscht werden. Bitte versuche es erneut.", + "Notification settings": "Benachrichtigungseinstellungen", + "Configure when due-date reminders are sent": "Lege fest, wann Erinnerungen an Fälligkeitsdaten gesendet werden", + "Due-date reminder lead time (hours)": "Vorlaufzeit der Erinnerung (Stunden)", + "Lead time must be between 1 and 336 hours": "Die Vorlaufzeit muss zwischen 1 und 336 Stunden liegen", + "Reminder lead time saved successfully": "Vorlaufzeit der Erinnerung gespeichert", + "Failed to save reminder lead time": "Die Vorlaufzeit der Erinnerung konnte nicht gespeichert werden", + "Notifications": "Benachrichtigungen", + "Notify me 1 day before a task's due date": "Benachrichtige mich 1 Tag vor dem Fälligkeitsdatum einer Aufgabe", + "Draft": "Entwurf", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Ob die Stunde ein Entwurf ist, den nur die Lehrkraft sieht, stattfindet oder ausfällt.", + "New release": "Neues Release", + "Roadmap chart. The same releases and epics are listed below.": "Roadmap-Diagramm. Dieselben Releases und Epics stehen unten in einer Liste.", + "Nothing on the roadmap yet": "Noch nichts auf der Roadmap", + "Releases with a target date and epics with dated tasks appear here.": "Releases mit Zieldatum und Epics mit datierten Aufgaben erscheinen hier.", + "Releases": "Releases", + "No releases yet": "Noch keine Releases", + "Target date: {date}": "Zieldatum: {date}", + "No target date": "Kein Zieldatum", + "Edit {name}": "{name} bearbeiten", + "Mark {name} as released": "{name} als veröffentlicht markieren", + "Mark as released": "Als veröffentlicht markieren", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Noch keine Epics. Öffnen Sie eine Aufgabe, um sie zu einem Epic zu machen.", + "Not scheduled yet": "Noch nicht geplant", + "Planned": "Geplant", + "Released": "Veröffentlicht", + "Edit release": "Release bearbeiten", + "Target date": "Zieldatum", + "Could not save the release. Please try again.": "Das Release konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "Every task of this release is done or cancelled.": "Jede Aufgabe dieses Releases ist erledigt oder abgebrochen.", + "Not finished yet: {count}": "Noch nicht fertig: {count}", + "What happens to these tasks?": "Was passiert mit diesen Aufgaben?", + "Move to {name}": "Nach {name} verschieben", + "Remove the release": "Das Release entfernen", + "Keep it on {name}": "Bei {name} belassen", + "Could not mark the release as released. Please try again.": "Das Release konnte nicht als veröffentlicht markiert werden. Bitte versuchen Sie es erneut.", + "Roadmap": "Roadmap", + "Tasks or roadmap": "Aufgaben oder Roadmap", + "Release": "Release", + "Epic": "Epic", + "This task is an epic": "Diese Aufgabe ist ein Epic", + "A named, dated delivery of a project that its tasks are planned against.": "Eine benannte, datierte Auslieferung eines Projekts, auf die seine Aufgaben geplant werden.", + "Name of the release": "Name des Releases", + "The project this release belongs to": "Das Projekt, zu dem dieses Release gehört", + "What this release delivers": "Was dieses Release liefert", + "When work on the release starts": "Wann die Arbeit am Release beginnt", + "The date the release is due": "Das Datum, an dem das Release fällig ist", + "Whether the release is planned, released or archived": "Ob das Release geplant, veröffentlicht oder archiviert ist", + "Released on": "Veröffentlicht am", + "When the release was marked as released": "Wann das Release als veröffentlicht markiert wurde", + "The release this task is planned for": "Das Release, für das diese Aufgabe geplant ist", + "Board view options": "Board-Ansichtsoptionen", + "Colour cards": "Karten einfärben", + "No colour": "Keine Farbe", + "By label": "Nach Label", + "Swimlanes": "Swimlanes", + "No swimlanes": "Keine Swimlanes", + "By assignee": "Nach zugewiesener Person", + "By epic": "Nach Epic", + "No assignee": "Nicht zugewiesen", + "No epic": "Kein Epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Karten bleiben in ihrer Epic-Zeile. Ändern Sie das Epic auf der Aufgabenseite.", + "Hand over to": "Übergeben an", + "Could not save your board view. It applies until you reload.": "Ihre Board-Ansicht wurde nicht gespeichert. Sie gilt bis zum Neuladen.", + "Timetable wish": "Stundenplanwunsch", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Ein Wunsch, den der Generator berücksichtigt. Einen harten Wunsch hält er immer ein, einen weichen, wo es geht.", + "Whether the wish is about a teacher, a group, a room or one activity": "Ob der Wunsch eine Lehrkraft, eine Gruppe, einen Raum oder eine Aktivität betrifft", + "Teacher": "Lehrkraft", + "Group": "Gruppe", + "Reference": "Verweis", + "The user, group, room or activity the wish is about": "Die Person, Gruppe, der Raum oder die Aktivität, um die es geht", + "What the wish asks for": "Was der Wunsch verlangt", + "Not on these periods": "Nicht in diesen Stunden", + "Preferably not on these periods": "Möglichst nicht in diesen Stunden", + "At most a number of lessons a day": "Höchstens eine Anzahl Stunden pro Tag", + "No free periods between lessons": "Keine Freistunden zwischen den Stunden", + "Always the same room": "Immer derselbe Raum", + "Periods": "Stunden", + "The periods of the week the wish is about, such as wed-5": "Die Stunden der Woche, um die es geht, etwa wed-5", + "Limit": "Grenze", + "The most lessons a day, for a wish of that kind": "Die meisten Stunden pro Tag, für einen Wunsch dieser Art", + "Strength": "Stärke", + "Whether the generator must keep the wish or should keep it": "Ob der Generator den Wunsch einhalten muss oder sollte", + "Hard": "Hart", + "Soft": "Weich", + "Weight": "Gewicht", + "How much a soft wish counts, from 1 to 3": "Wie stark ein weicher Wunsch zählt, von 1 bis 3", + "Why the wish exists": "Warum es den Wunsch gibt", + "Timetable scenario": "Stundenplanszenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Ein Wochenmuster, vom Generator erstellt oder aus dem aktuellen Stundenplan übernommen. Es behält seine Eingabe und wie gut es die Wünsche einhält.", + "The name timetablers know the scenario by": "Der Name, unter dem Planende das Szenario kennen", + "Whether the generator made it or it came from the current timetable": "Ob der Generator es erstellt hat oder es aus dem aktuellen Stundenplan stammt", + "Generated": "Generiert", + "From the current timetable": "Aus dem aktuellen Stundenplan", + "Week of": "Woche vom", + "The Monday of the first week of the window": "Der Montag der ersten Woche des Zeitraums", + "Window start": "Beginn des Zeitraums", + "The first day the week pattern applies to": "Der erste Tag, für den das Wochenmuster gilt", + "Window end": "Ende des Zeitraums", + "The last day the week pattern applies to": "Der letzte Tag, für den das Wochenmuster gilt", + "Waiting, generating, done, failed, or published as draft lessons": "Wartend, wird erstellt, fertig, fehlgeschlagen oder als Entwurfsstunden veröffentlicht", + "Waiting": "Wartend", + "Generating": "Wird erstellt", + "Failed": "Fehlgeschlagen", + "Published": "Veröffentlicht", + "Seed": "Startwert", + "The number the generator starts from, so a run can be repeated": "Die Zahl, mit der der Generator beginnt, damit ein Lauf wiederholbar ist", + "Input": "Eingabe", + "The periods, rooms, lessons and wishes the scenario was made from": "Die Stunden, Räume, Unterrichtsstunden und Wünsche, aus denen das Szenario entstand", + "Placements": "Platzierungen", + "Each lesson with the period and room it was given": "Jede Unterrichtsstunde mit der Stunde und dem Raum, die sie bekam", + "Unplaced lessons": "Nicht platzierte Stunden", + "Lessons without a place, each with the hard wish that blocked it": "Stunden ohne Platz, jeweils mit dem harten Wunsch, der sie blockierte", + "Broken wishes": "Verletzte Wünsche", + "The wishes this scenario breaks, with the lessons that break them": "Die Wünsche, die dieses Szenario verletzt, mit den verletzenden Stunden", + "Measures": "Kennzahlen", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Platzierte Stunden, verletzte Wünsche, Freistunden, Stunden pro Tag und Raumnutzung", + "Reason": "Grund", + "Why the run failed": "Warum der Lauf fehlschlug", + "Published at": "Veröffentlicht am", + "When the scenario was written out as draft lessons": "Wann das Szenario als Entwurfsstunden geschrieben wurde", + "Edit wish": "Wunsch bearbeiten", + "New wish": "Neuer Wunsch", + "Hard: the generator always keeps it": "Hart: der Generator hält ihn immer ein", + "Soft: the generator keeps it where it can": "Weich: der Generator hält ihn ein, wo er kann", + "Weight (1 to 3)": "Gewicht (1 bis 3)", + "Most lessons a day": "Höchstens Stunden pro Tag", + "Period": "Stunde", + "{day} period {number}": "{day} Stunde {number}", + "Teacher (user name)": "Lehrkraft (Benutzername)", + "Activity (group:subject)": "Aktivität (Gruppe:Fach)", + "Say who or what the wish is about.": "Geben Sie an, wen oder was der Wunsch betrifft.", + "Choose at least one period.": "Wählen Sie mindestens eine Stunde.", + "The limit is a whole number of 1 or more.": "Das Limit ist eine ganze Zahl ab 1.", + "Timetable": "Stundenplan", + "Wishes": "Wünsche", + "Timetable wishes": "Stundenplanwünsche", + "Generator run": "Generatorlauf", + "Generator progress": "Fortschritt des Generators", + "The run failed: {reason}": "Der Lauf ist fehlgeschlagen: {reason}", + "{placed} of {lessons} lessons placed": "{placed} von {lessons} Stunden platziert", + "Generate again": "Erneut generieren", + "Generate": "Generieren", + "Every lesson has a place.": "Jede Stunde hat einen Platz.", + "Lesson": "Stunde", + "No free period and room": "Keine freie Stunde und kein freier Raum", + "Broken soft wishes": "Verletzte weiche Wünsche", + "Every soft wish is kept.": "Jeder weiche Wunsch ist eingehalten.", + "Wish": "Wunsch", + "Lessons": "Stunden", + "Generating: {percent}% of the time budget used": "Wird generiert: {percent}% der Zeit verbraucht", + "Waiting to start": "Wartet auf den Start", + "Published as draft lessons": "Als Entwurfsstunden veröffentlicht", + "Could not read the scenario.": "Das Szenario konnte nicht gelesen werden.", + "Could not start the run.": "Der Lauf konnte nicht gestartet werden.", + "Scenarios": "Szenarien", + "Timetable scenarios": "Stundenplanszenarien", + "Scenario": "Szenario", + "Take the current timetable": "Aktuellen Stundenplan übernehmen", + "Could not take the current timetable.": "Der aktuelle Stundenplan konnte nicht übernommen werden.", + "Broken hard wishes": "Verletzte harte Wünsche", + "Not on a period of the week grid": "Nicht auf einer Stunde des Wochenrasters", + "Compare scenarios": "Szenarien vergleichen", + "Scenarios to compare": "Zu vergleichende Szenarien", + "Choose two or three scenarios to compare them.": "Wählen Sie zwei oder drei Szenarien zum Vergleich.", + "Measure": "Kennzahl", + "Best": "Bester Wert", + "Lessons that differ": "Abweichende Stunden", + "No lesson differs.": "Keine Stunde weicht ab.", + "Not placed": "Nicht platziert", + "{period} in {room}": "{period} in {room}", + "Lessons placed": "Platzierte Stunden", + "Lessons without a place": "Stunden ohne Platz", + "Clashes": "Konflikte", + "Hard wishes broken": "Verletzte harte Wünsche", + "Soft wishes broken": "Verletzte weiche Wünsche", + "Soft wishes broken, weighted": "Verletzte weiche Wünsche, gewichtet", + "Free periods between lessons, all teachers": "Freistunden, alle Lehrkräfte", + "Most free periods of one teacher": "Meiste Freistunden einer Lehrkraft", + "Most lessons of one group on a day": "Meiste Stunden einer Gruppe an einem Tag", + "Room use": "Raumnutzung", + "Publish as draft lessons": "Als Entwurfsstunden veröffentlichen", + "Draft lessons written: {count}": "Entwurfsstunden geschrieben: {count}", + "Could not publish the scenario.": "Das Szenario konnte nicht veröffentlicht werden.", + "Rules": "Regeln", + "Rules for {column}": "Regeln für {column}", + "When a card enters this column": "Wenn eine Karte diese Spalte erreicht", + "Action": "Aktion", + "Set the priority": "Priorität setzen", + "Assign to": "Zuweisen an", + "Assign the person who moved the card": "Die Person zuweisen, die die Karte verschoben hat", + "Remove the assignee": "Zuweisung entfernen", + "Add a label": "Label hinzufügen", + "No longer a project member": "Kein Projektmitglied mehr", + "This label no longer exists": "Dieses Label gibt es nicht mehr", + "Add rule": "Regel hinzufügen", + "Remove rule": "Regel entfernen", + "No rules yet. Add one to change a card when it enters this column.": "Noch keine Regeln. Fügen Sie eine hinzu, um eine Karte zu ändern, wenn sie diese Spalte erreicht.", + "Could not save the rules. Please try again.": "Die Regeln konnten nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "1 rule runs when a card enters this column": "1 Regel wird ausgeführt, wenn eine Karte diese Spalte erreicht", + "{count} rules run when a card enters this column": "{count} Regeln werden ausgeführt, wenn eine Karte diese Spalte erreicht", + "Rules applied: {changes}": "Regeln angewendet: {changes}", + "assigned to {name}": "zugewiesen an {name}", + "assignee removed": "Zuweisung entfernt", + "priority {priority}": "Priorität {priority}", + "label {label}": "Label {label}", + "What happens to a card when it enters this column, applied in list order.": "Was mit einer Karte geschieht, wenn sie diese Spalte erreicht, in der Reihenfolge der Liste.", + "Value": "Wert", + "What the rule does to the card.": "Was die Regel mit der Karte macht.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Die Priorität, die Benutzer-ID oder die Label-ID, die die Aktion verwendet; leer bei Aktionen ohne Wert.", + "is not": "ist nicht", + "{dimension} is not": "{dimension} ist nicht", + "Saved filters": "Gespeicherte Filter", + "No saved filters yet": "Noch keine gespeicherten Filter", + "Save filter": "Filter speichern", + "Rename \"{name}\"": "„{name}“ umbenennen", + "Delete \"{name}\"": "„{name}“ löschen", + "Clear filters": "Filter zurücksetzen", + "Showing {shown} of {total} tasks": "{shown} von {total} Aufgaben angezeigt", + "Me": "Ich", + "No date": "Kein Datum", + "Rename saved filter": "Gespeicherten Filter umbenennen", + "Share with the project": "Mit dem Projekt teilen", + "Give the filter a name": "Geben Sie dem Filter einen Namen", + "Could not save the filter. Please try again.": "Der Filter konnte nicht gespeichert werden. Bitte versuchen Sie es erneut.", + "Some labels in \"{name}\" no longer exist and were left out.": "Einige Labels in „{name}“ gibt es nicht mehr; sie wurden weggelassen.", + "Could not delete the filter. Please try again.": "Der Filter konnte nicht gelöscht werden. Bitte versuchen Sie es erneut.", + "Saved filter": "Gespeicherter Filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Ein benannter Board-Filter eines Projekts, nur für die Person sichtbar, die ihn gespeichert hat, außer er wird mit dem Projekt geteilt.", + "The project whose board the filter applies to": "Das Projekt, auf dessen Board der Filter wirkt", + "The name the filter is listed under": "Der Name, unter dem der Filter aufgeführt wird", + "Saved by": "Gespeichert von", + "Nextcloud user id of the person who saved the filter": "Nextcloud-Benutzer-ID der Person, die den Filter gespeichert hat", + "Shared with the project": "Mit dem Projekt geteilt", + "Whether every project member sees and applies the filter": "Ob jedes Projektmitglied den Filter sieht und anwenden kann", + "Criteria": "Kriterien", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Der Filter: Zuweisung, Label, Priorität und Fälligkeit, jeweils mit ist oder ist nicht und den Werten", + "Cross-project view": "Projektübergreifende Ansicht", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Eine gespeicherte Auswahl von Projekten, deren Aufgaben gemeinsam in Statusspalten angezeigt werden, geteilt mit den genannten Personen.", + "Shared with": "Geteilt mit", + "The name the view is listed under": "Der Name, unter dem die Ansicht aufgeführt wird", + "Nextcloud user id of the person who saved the view": "Nextcloud-Benutzer-ID der Person, die die Ansicht gespeichert hat", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-Benutzer-IDs der Personen, mit denen die Ansicht geteilt ist", + "The projects whose tasks the view shows, at most twenty": "Die Projekte, deren Aufgaben die Ansicht zeigt, höchstens zwanzig", + "1 project in this view is hidden from you.": "1 Projekt in dieser Ansicht ist für dich verborgen.", + "{count} projects in this view are hidden from you.": "{count} Projekte in dieser Ansicht sind für dich verborgen.", + "{project} has no column for {status}.": "{project} hat keine Spalte für {status}.", + "This view does not exist or is not shared with you.": "Diese Ansicht existiert nicht oder ist nicht mit dir geteilt.", + "\"{task}\" moved to {status}.": "\"{task}\" wurde nach {status} verschoben.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Projektübergreifende Ansichten", + "New view": "Neue Ansicht", + "Edit view": "Ansicht bearbeiten", + "Delete view": "Ansicht löschen", + "Give the view a name": "Gib der Ansicht einen Namen", + "Pick at least one project": "Wähle mindestens ein Projekt", + "A view shows at most {max} projects": "Eine Ansicht zeigt höchstens {max} Projekte", + "Could not save the view. Please try again.": "Die Ansicht konnte nicht gespeichert werden. Bitte versuche es erneut.", + "Could not delete the view. Please try again.": "Die Ansicht konnte nicht gelöscht werden. Bitte versuche es erneut.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "\"{title}\" löschen? Die Projekte und ihre Aufgaben bleiben, wie sie sind.", + "People see the tasks of the projects they are in, never more.": "Personen sehen die Aufgaben der Projekte, in denen sie sind, nie mehr.", + "No views yet. A view shows the tasks of several of your projects together.": "Noch keine Ansichten. Eine Ansicht zeigt die Aufgaben mehrerer deiner Projekte zusammen.", + "Projects in view: {count}": "Projekte in der Ansicht: {count}", + "Notify me when a task is assigned to me": "Benachrichtige mich, wenn mir eine Aufgabe zugewiesen wird", + "Also send these to me by email": "Sende mir diese auch per E-Mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Füge in deinen persönlichen Nextcloud-Einstellungen eine E-Mail-Adresse hinzu, um E-Mails zu erhalten.", + "Code link": "Code-Verknüpfung", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Ein Commit, Branch, Merge Request oder Issue auf einer Code-Plattform, das an einer Aufgabe arbeitet.", + "The task the link belongs to": "Die Aufgabe, zu der die Verknüpfung gehört", + "The project of the task": "Das Projekt der Aufgabe", + "Task key": "Aufgabenschlüssel", + "The task key the forge text named, such as VC-12": "Der Aufgabenschlüssel aus dem Text der Code-Plattform, etwa VC-12", + "What the link points at": "Worauf die Verknüpfung zeigt", + "Link": "Link", + "The address of the item in the forge": "Die Adresse des Elements auf der Code-Plattform", + "The commit message, branch name or merge request title": "Die Commit-Nachricht, der Branch-Name oder der Titel des Merge Requests", + "Repository": "Repository", + "The repository, such as acme/portal": "Das Repository, etwa acme/portal", + "Forge id": "ID auf der Plattform", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Die eigene ID des Elements auf der Code-Plattform, etwa github:acme/portal#42 oder ein Commit-Hash", + "State": "Status", + "The state of a merge request or issue": "Der Status eines Merge Requests oder Issues", + "Who made the commit or opened the merge request": "Wer den Commit erstellt oder den Merge Request eröffnet hat", + "When the commit was made or the merge request last changed": "Wann der Commit erstellt wurde oder sich der Merge Request zuletzt geändert hat", + "Added by": "Hinzugefügt von", + "Whether a person added the link or the integration wrote it": "Ob eine Person die Verknüpfung hinzugefügt oder die Integration sie geschrieben hat", + "Nextcloud user UIDs of project members": "Nextcloud-Benutzer-IDs der Projektmitglieder", + "Add link": "Link hinzufügen", + "Added by hand": "Von Hand hinzugefügt", + "Branch": "Branch", + "Code": "Code", + "Commit": "Commit", + "From the integration": "Über die Integration", + "Link to a commit, branch or merge request": "Link zu einem Commit, Branch oder Merge Request", + "Merge request": "Merge Request", + "Merged": "Zusammengeführt", + "No code linked yet. Name {key} in a commit message or paste a link.": "Noch kein Code verknüpft. Nenne {key} in einer Commit-Nachricht oder füge einen Link ein.", + "No code linked yet. Paste a link to a commit or merge request.": "Noch kein Code verknüpft. Füge einen Link zu einem Commit oder Merge Request ein.", + "Paste a web address that starts with https://.": "Füge eine Webadresse ein, die mit https:// beginnt.", + "Remove link {title}": "Link {title} entfernen", + "The link could not be added.": "Der Link konnte nicht hinzugefügt werden.", + "The link could not be removed.": "Der Link konnte nicht entfernt werden.", + "This link is already on the task.": "Dieser Link ist bereits bei der Aufgabe.", + "Code forges": "Code-Plattformen", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Verknüpfe GitHub-Commits und Pull Requests mit Aufgaben. Integriq empfängt die Ereignisse; planninq ruft GitHub nie auf.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Lade die Konfiguration herunter und importiere sie in Integriq. Trage dann ein Geheimnis in der Regel \"Check the GitHub signature\" ein.", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Füge in GitHub dem Repository einen Webhook mit dieser Adresse und demselben Geheimnis hinzu. Wähle den Inhaltstyp application/json und die Ereignisse Push und Pull Request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nenne den Aufgabenschlüssel, etwa VC-12, in einer Commit-Nachricht, einem Branch-Namen oder dem Titel eines Pull Requests. Der Link erscheint dann bei dieser Aufgabe.", + "Without Integriq, project members can still paste a link on the task page.": "Ohne Integriq können Projektmitglieder weiterhin einen Link auf der Aufgabenseite einfügen.", + "Download the Integriq configuration": "Integriq-Konfiguration herunterladen", + "Calendar": "Kalender", + "Previous": "Zurück", + "Calendar view": "Kalenderansicht", + "Starts:": "Beginnt:", + "No tasks with a date in this month.": "Keine Aufgaben mit einem Datum in diesem Monat.", + "Week of {start} to {end}": "Woche vom {start} bis {end}", + "My calendar": "Mein Kalender", + "Show as list": "Als Liste anzeigen", + "Show as calendar": "Als Kalender anzeigen", + "Open my calendar": "Meinen Kalender öffnen", + "Nextcloud Tasks": "Nextcloud Aufgaben", + "Show my tasks in Nextcloud Tasks": "Meine Aufgaben in Nextcloud Aufgaben anzeigen", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Die Aufgaben, die dir zugewiesen oder mit dir geteilt sind, erscheinen in einer Liste \"Planninq\" in Nextcloud Aufgaben und Kalender. Änderungen dort werden bei der nächsten Änderung in Planninq ersetzt.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Dieser Server kann nicht in Nextcloud Aufgaben schreiben, daher ist der Export nicht verfügbar.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Von Planninq verwaltet. Änderungen hier werden bei der nächsten Änderung in Planninq ersetzt.", + "Working days and holidays": "Arbeitstage und Feiertage", + "Dates set on the timeline skip the days that are not working days.": "Auf der Zeitleiste gesetzte Daten überspringen die Tage, die keine Arbeitstage sind.", + "Working weekdays": "Arbeitstage der Woche", + "Non-working days": "Arbeitsfreie Tage", + "No non-working days yet.": "Noch keine arbeitsfreien Tage.", + "Add day": "Tag hinzufügen", + "Year": "Jahr", + "Add Dutch national holidays": "Niederländische Feiertage hinzufügen", + "Save working days": "Arbeitstage speichern", + "Choose at least one working weekday.": "Wähle mindestens einen Arbeitstag.", + "Working days saved.": "Arbeitstage gespeichert.", + "Could not save the working days.": "Die Arbeitstage konnten nicht gespeichert werden.", + "New Year's Day": "Neujahr", + "Easter Sunday": "Ostersonntag", + "Easter Monday": "Ostermontag", + "King's Day": "Königstag", + "Liberation Day": "Befreiungstag", + "Ascension Day": "Christi Himmelfahrt", + "Whit Sunday": "Pfingstsonntag", + "Whit Monday": "Pfingstmontag", + "Christmas Day": "Erster Weihnachtstag", + "Boxing Day": "Zweiter Weihnachtstag", + "Dates of {title}": "Daten von {title}", + "The due date cannot be before the start date.": "Das Fälligkeitsdatum darf nicht vor dem Startdatum liegen.", + "{title}, from {start} to {end}": "{title}, vom {start} bis {end}", + "The dates could not be saved.": "Die Daten konnten nicht gespeichert werden.", + "{title} now runs from {start} to {end}": "{title} läuft jetzt vom {start} bis {end}", + "Auto-scheduling": "Automatische Planung", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Wenn aktiv, bietet ein späteres Fälligkeitsdatum auf der Zeitleiste an, die davon blockierten Aufgaben mitzuverschieben.", + "Move blocked tasks along when a task slips": "Blockierte Aufgaben mitverschieben, wenn eine Aufgabe sich verzögert", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Auf der Zeitleiste bietet ein späteres Fälligkeitsdatum an, die blockierten Aufgaben mitzuverschieben. Nur \"blockiert\"-Verknüpfungen zählen, und Aufgaben werden nur nach hinten verschoben.", + "Move the tasks that wait for {title}?": "Die Aufgaben verschieben, die auf {title} warten?", + "These tasks wait for it and would start after its new due date:": "Diese Aufgaben warten darauf und würden nach dem neuen Fälligkeitsdatum beginnen:", + "{count} tasks would move; the first {limit} are listed.": "{count} Aufgaben würden verschoben; die ersten {limit} stehen hier.", + "Now": "Jetzt", + "After the move": "Nach dem Verschieben", + "Only this task": "Nur diese Aufgabe", + "Move all": "Alle verschieben", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Bei {title} angehalten: die Daten konnten nicht gespeichert werden. Die Aufgaben davor wurden verschoben.", + "Cumulative flow": "Kumulativer Fluss", + "Show as chart": "Als Diagramm anzeigen", + "Show as table": "Als Tabelle anzeigen", + "Tasks per column per day": "Aufgaben pro Spalte pro Tag", + "Tasks without recorded history in this period: {count}": "Aufgaben ohne aufgezeichnete Historie in diesem Zeitraum: {count}", + "Lead and cycle time": "Durchlauf- und Zykluszeit", + "No tasks were finished in this period.": "In diesem Zeitraum wurden keine Aufgaben abgeschlossen.", + "Finished tasks": "Abgeschlossene Aufgaben", + "Cycle time, average": "Zykluszeit, Durchschnitt", + "Cycle time, 85th percentile": "Zykluszeit, 85. Perzentil", + "Lead time, average": "Durchlaufzeit, Durchschnitt", + "Tasks whose finish time was estimated from their history: {count}": "Aufgaben, deren Endzeit aus der Historie geschätzt wurde: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Zykluszeit jeder abgeschlossenen Aufgabe, mit Durchschnitt und 85. Perzentil", + "Slowest tasks": "Langsamste Aufgaben", + "cycle {cycle}, lead {lead}": "Zyklus {cycle}, Durchlauf {lead}", + "{days} days": "{days} Tage", + "Could not load the flow of this project.": "Der Fluss dieses Projekts konnte nicht geladen werden.", + "Last {days} days": "Letzte {days} Tage", + "Portfolio flow": "Portfolio-Fluss", + "An admin adds portfolios under Projects, Portfolios.": "Eine Administratorin fügt Portfolios unter Projekte, Portfolios hinzu.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Nicht angezeigte Projekte, da höchstens 50 gleichzeitig angezeigt werden: {count}", + "Could not load the flow of this portfolio.": "Der Fluss dieses Portfolios konnte nicht geladen werden.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativer Fluss und Zykluszeit über die Projekte eines Portfolios.", + "Edit report": "Bericht bearbeiten", + "Only tasks where": "Nur Aufgaben, bei denen", + "Group by": "Gruppieren nach", + "Display": "Darstellung", + "Share with everyone who can read its projects": "Mit allen teilen, die die Projekte lesen dürfen", + "The report could not be saved.": "Der Bericht konnte nicht gespeichert werden.", + "Number of tasks": "Anzahl Aufgaben", + "Bar": "Balken", + "Donut": "Ring", + "Table": "Tabelle", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} von {total} Projekten in diesem Bericht sind für dich nicht sichtbar", + "No tasks match this report.": "Keine Aufgaben passen zu diesem Bericht.", + "None": "Keine", + "Could not load this report.": "Dieser Bericht konnte nicht geladen werden.", + "Report": "Bericht", + "Your reports": "Deine Berichte", + "My reports": "Meine Berichte", + "Shared reports": "Geteilte Berichte", + "You have not built a report yet.": "Du hast noch keinen Bericht erstellt.", + "Nobody has shared a report with you yet.": "Noch niemand hat einen Bericht mit dir geteilt.", + "Reports you built over tasks, and the ones shared with you.": "Berichte, die du über Aufgaben erstellt hast, und die mit dir geteilten.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Eine gespeicherte Abfrage über Aufgaben: welche Projekte, welche Filter, wonach gruppiert, gezählt oder summiert, und als Tabelle oder Diagramm gezeigt.", + "The name the report is listed under": "Der Name, unter dem der Bericht aufgeführt wird", + "What the report shows and who it is for": "Was der Bericht zeigt und für wen er ist", + "Nextcloud user id of the person who saved the report": "Nextcloud-Benutzer-ID der Person, die den Bericht gespeichert hat", + "Who can open the report": "Wer den Bericht öffnen kann", + "Only me": "Nur ich", + "Everyone who can read its projects": "Alle, die seine Projekte lesen dürfen", + "The projects the report covers, at most fifty": "Die Projekte, die der Bericht umfasst, höchstens fünfzig", + "Filters": "Filter", + "Task fields and the value each must equal": "Aufgabenfelder und der Wert, dem jedes gleichen muss", + "The task field the report groups on": "Das Aufgabenfeld, nach dem der Bericht gruppiert", + "Count the tasks, or add up a number on them": "Die Aufgaben zählen oder eine Zahl auf ihnen summieren", + "Sum": "Summe", + "Sum of": "Summe von", + "The number added up when the measure is a sum": "Die summierte Zahl, wenn das Maß eine Summe ist", + "Story points": "Story Points", + "Estimated duration": "Geschätzte Dauer", + "How the report is shown": "Wie der Bericht gezeigt wird", + "Issue type": "Vorgangstyp", + "Task fields and the value each must equal; empty when the report covers every task": "Aufgabenfelder und der Wert, dem jedes entsprechen muss; leer, wenn der Bericht alle Aufgaben umfasst", + "The status a task must have": "Der Status, den eine Aufgabe haben muss", + "The priority a task must have": "Die Priorität, die eine Aufgabe haben muss", + "The user a task must be assigned to": "Die Person, der eine Aufgabe zugewiesen sein muss", + "A label a task must carry": "Ein Label, das eine Aufgabe tragen muss", + "The board column a task must be in": "Die Board-Spalte, in der eine Aufgabe stehen muss", + "The issue type a task must have": "Der Vorgangstyp, den eine Aufgabe haben muss", + "Manager groups": "Verwaltungsgruppen", + "Member groups": "Mitgliedsgruppen", + "Viewer groups": "Lesegruppen", + "Viewers": "Lesende", + "Owning group": "Besitzende Gruppe", + "Nextcloud groups whose members manage the project": "Nextcloud-Gruppen, deren Mitglieder das Projekt verwalten", + "Nextcloud groups whose members work on the project": "Nextcloud-Gruppen, deren Mitglieder am Projekt arbeiten", + "Nextcloud groups whose members may read the project": "Nextcloud-Gruppen, deren Mitglieder das Projekt lesen dürfen", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-Personen, die das Projekt verwalten: Einstellungen, Mitglieder und Arbeit", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-Personen, die das Projekt und seine Arbeit lesen, aber nicht ändern dürfen", + "The Nextcloud group that owns the project with its creator, at most one": "Die Nextcloud-Gruppe, der das Projekt mit seiner Erstellerin oder seinem Ersteller gehört, höchstens eine", + "Nextcloud user ids who may read this through the project": "Nextcloud-Personen, die dies über das Projekt lesen dürfen", + "Nextcloud groups whose members may change this through the project": "Nextcloud-Gruppen, deren Mitglieder dies über das Projekt ändern dürfen", + "Nextcloud groups whose members may read this through the project": "Nextcloud-Gruppen, deren Mitglieder dies über das Projekt lesen dürfen", + "Search for a person or a group…": "Nach einer Person oder Gruppe suchen…", + "No one found. Your admin's sharing settings decide who you can find.": "Niemand gefunden. Die Freigabeeinstellungen deiner Administration bestimmen, wen du finden kannst.", + "Type at least two characters": "Gib mindestens zwei Zeichen ein", + "Everyone in this group": "Alle in dieser Gruppe", + "Could not search for people. Please try again.": "Die Suche nach Personen ist fehlgeschlagen. Bitte versuche es erneut.", + "Could not remove the group": "Die Gruppe konnte nicht entfernt werden", + "Only the owner and managers change who is on this project.": "Nur die Eigentümerin und die Verwaltenden ändern, wer zu diesem Projekt gehört.", + "Role of {name}": "Rolle von {name}", + "Manager": "Verwaltung", + "Member": "Mitglied", + "Viewer": "Lesend", + "Could not change the role": "Die Rolle konnte nicht geändert werden", + "Owned by group: {name}": "Im Besitz der Gruppe: {name}", + "No group owns this project.": "Keine Gruppe besitzt dieses Projekt.", + "Owned by group": "Im Besitz der Gruppe", + "Search for a group…": "Nach einer Gruppe suchen…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Keine Gruppe gefunden. Die Freigabeeinstellungen deiner Administration bestimmen, welche Gruppen du finden kannst.", + "No owning group": "Keine besitzende Gruppe", + "Could not search for groups. Please try again.": "Gruppensuche fehlgeschlagen. Bitte versuche es erneut.", + "Could not change the owning group": "Die besitzende Gruppe konnte nicht geändert werden", + "You can read this project. Only its members change it.": "Du kannst dieses Projekt lesen. Nur seine Mitglieder ändern es.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Der Kurs, den diese Stunde unterrichtet, etwa ein Wahlfach, wenn die Lern-App der Schule ihn kennt.", + "Online meeting link": "Link zur Online-Stunde", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Wo Schüler online an dieser Stunde teilnehmen. Die Schaltfläche Teilnehmen erscheint nur bei einem https-Link." }, "plurals": null } diff --git a/l10n/el.js b/l10n/el.js index 070269e0..5149fd15 100644 --- a/l10n/el.js +++ b/l10n/el.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Ενεργά έργα", + "Archived projects": "Αρχειοθετημένα έργα", + "Boards": "Πίνακες", + "My projects": "Τα έργα μου", + "Portfolio": "Χαρτοφυλάκιο", + "Project board": "Πίνακας έργου", + "Projects I am in": "Έργα στα οποία συμμετέχω", + "Timeline": "Χρονολόγιο", + "Timesheet": "Φύλλο χρόνου", + "Features & roadmap": "Λειτουργίες και οδικός χάρτης", + "Flow": "Ροή", + "Flows": "Ροές", + "Reports": "Αναφορές", + "Pick a report to open it.": "Επιλέξτε μια αναφορά για να την ανοίξετε.", + "In progress": "Σε εξέλιξη", + "Date": "Ημερομηνία", + "Due": "Προθεσμία", + "Assignee": "Ανατέθηκε σε", + "Who": "Ποιος", + "What": "Τι", + "Minutes": "Λεπτά", + "Entries": "Καταχωρίσεις", + "Most recent": "Πιο πρόσφατα", + "Per person": "Ανά άτομο", + "By status": "Ανά κατάσταση", + "By priority": "Ανά προτεραιότητα", + "Task status": "Κατάσταση εργασιών", + "Time spent": "Χρόνος που δαπανήθηκε", + "Capacity": "Χωρητικότητα", + "Due soonest": "Λήγουν πρώτα", + "Minutes logged": "Καταγεγραμμένα λεπτά", + "Nothing is due": "Δεν λήγει τίποτα", + "Nothing logged yet": "Δεν έχει καταγραφεί τίποτα ακόμη", + "What is open, what is blocked, and what is overdue.": "Τι είναι ανοιχτό, τι μπλοκαρισμένο και τι εκπρόθεσμο.", + "How allocation is spread across the people working on projects.": "Πώς κατανέμεται ο φόρτος στα άτομα που εργάζονται σε έργα.", + "Hours logged, and the projects they went to.": "Οι καταγεγραμμένες ώρες και τα έργα στα οποία πήγαν.", + "Billable": "Χρεώσιμο", + "Budget: {amount}": "Προϋπολογισμός: {amount}", + "Loading projects": "Φόρτωση έργων", + "No projects for this client yet": "Δεν υπάρχουν ακόμη έργα για αυτόν τον πελάτη", + "Open in Planninq": "Άνοιγμα στο Planninq", + "This project could not be found": "Αυτό το έργο δεν βρέθηκε", + "Untitled project": "Έργο χωρίς τίτλο", + "and {count} more": "και {count} ακόμη", + "Store": "Κατάστημα", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Εγκαταστήστε μητρώα, σχήματα και ροές που έχουν δημοσιεύσει άλλοι οργανισμοί.", + "Work Date": "Ημερομηνία εργασίας", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Ενέργειες στήλης", + "Columns": "Στήλες", + "Could not remove the column. Please try again.": "Δεν ήταν δυνατή η αφαίρεση της στήλης. Δοκιμάστε ξανά.", + "Could not save the column. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της στήλης. Δοκιμάστε ξανά.", + "Done column": "Στήλη ολοκληρωμένων", + "Edit column": "Επεξεργασία στήλης", + "Keep the card's status": "Διατήρηση της κατάστασης της κάρτας", + "Move its cards to": "Μετακίνηση των καρτών της σε", + "Move left": "Μετακίνηση αριστερά", + "Move right": "Μετακίνηση δεξιά", + "Status of cards moved here": "Κατάσταση καρτών που μετακινούνται εδώ", + "The last done column cannot be removed.": "Η τελευταία στήλη ολοκληρωμένων δεν μπορεί να αφαιρεθεί.", + "WIP limit": "Όριο WIP", + "over limit": "πάνω από το όριο", + "The status a card gets when it is moved into this column.": "Η κατάσταση που παίρνει μια κάρτα όταν μετακινείται σε αυτή τη στήλη.", + "All priorities": "Όλες οι προτεραιότητες", + "Could not create the task. Please try again.": "Δεν ήταν δυνατή η δημιουργία της εργασίας. Δοκιμάστε ξανά.", + "Created": "Δημιουργήθηκε", + "Move to backlog": "Στο backlog", + "Move to board": "Στον πίνακα", + "New task": "Νέα εργασία", + "Nothing in the backlog": "Τίποτα στο backlog", + "Rank": "Κατάταξη", + "Sort by": "Ταξινόμηση κατά", + "Sort by rank to reorder": "Ταξινομήστε κατά κατάταξη για αναδιάταξη", + "Task actions": "Ενέργειες εργασίας", + "All labels": "Όλες οι ετικέτες", + "Filter tasks by label": "Φιλτράρισμα εργασιών κατά ετικέτα", + "View timeline": "Προβολή χρονολογίου", + "Board": "Πίνακας", + "List": "Λίστα", + "Column": "Στήλη", + "Board or list": "Πίνακας ή λίστα", + "Log": "Ημερολόγιο", + "Add entry": "Προσθήκη καταχώρισης", + "Show": "Εμφάνιση", + "No actions yet": "Δεν υπάρχουν ακόμη ενέργειες", + "Closed": "Κλειστό", + "Entry actions": "Ενέργειες καταχώρισης", + "Add action": "Προσθήκη ενέργειας", + "by {author}": "από {author}", + "saved {time}": "αποθηκεύτηκε {time}", + "Attendees: {names}": "Συμμετέχοντες: {names}", + "Add the first entry": "Προσθήκη της πρώτης καταχώρισης", + "Issues": "Ζητήματα", + "Lessons learned": "Διδάγματα", + "Meetings": "Συσκέψεις", + "Decisions": "Αποφάσεις", + "Actions": "Ενέργειες", + "Issue": "Ζήτημα", + "Lesson learned": "Δίδαγμα", + "Meeting": "Σύσκεψη", + "Decision": "Απόφαση", + "About this project": "Σχετικά με το έργο", + "No description yet": "Δεν υπάρχει ακόμη περιγραφή", + "Start date": "Ημερομηνία έναρξης", + "Not set": "Δεν έχει οριστεί", + "End date": "Ημερομηνία λήξης", + "Progress": "Πρόοδος", + "No tasks yet": "Δεν υπάρχουν ακόμη εργασίες", + "Open the board": "Άνοιγμα πίνακα", + "People": "Άτομα", + "Owner": "Κάτοχος", + "Latest log entries": "Πιο πρόσφατες καταχωρίσεις", + "Open the log": "Άνοιγμα ημερολογίου", + "{done} of {total} tasks done": "{done} από {total} εργασίες ολοκληρώθηκαν", + "Edit entry": "Επεξεργασία καταχώρισης", + "Type": "Είδος", + "Attendees": "Συμμετέχοντες", + "Issue is closed": "Το ζήτημα έκλεισε", + "Could not save the entry. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της καταχώρισης. Δοκιμάστε ξανά.", + "From: {title}": "Από: {title}", + "What needs to happen": "Τι πρέπει να γίνει", + "Could not create the action. Please try again.": "Δεν ήταν δυνατή η δημιουργία της ενέργειας. Δοκιμάστε ξανά.", + "The action was created but could not be linked to the entry.": "Η ενέργεια δημιουργήθηκε, αλλά δεν ήταν δυνατή η σύνδεσή της με την καταχώριση.", + "Project pages": "Σελίδες έργου", + "Overview": "Επισκόπηση", + "Risks": "Κίνδυνοι", + "Log entry": "Καταχώριση ημερολογίου", + "A short name for the entry": "Ένα σύντομο όνομα για την καταχώριση", + "Project": "Έργο", + "The project this entry belongs to": "Το έργο στο οποίο ανήκει η καταχώριση", + "What kind of entry this is": "Τι είδους καταχώριση είναι", + "When it happened": "Πότε συνέβη", + "What happened, in Markdown": "Τι συνέβη, σε Markdown", + "Whether an issue is still open": "Αν ένα ζήτημα είναι ακόμη ανοιχτό", + "The people at a meeting": "Τα άτομα σε μια σύσκεψη", + "Tasks that came out of this entry": "Εργασίες που προέκυψαν από αυτή την καταχώριση", + "Add risk": "Προσθήκη κινδύνου", + "Risk": "Κίνδυνος", + "Score": "Βαθμολογία", + "Response": "Αντιμετώπιση", + "Review date": "Ημερομηνία επανεξέτασης", + "no longer on the project": "δεν είναι πλέον στο έργο", + "Edit {title}": "Επεξεργασία {title}", + "No risks recorded yet": "Δεν έχουν καταγραφεί ακόμη κίνδυνοι", + "Add the first risk": "Προσθήκη του πρώτου κινδύνου", + "Medium": "Μεσαίος", + "Mitigating": "Σε μετριασμό", + "Occurred": "Επήλθε", + "Avoid": "Αποφυγή", + "Reduce": "Μείωση", + "Transfer": "Μεταφορά", + "Accept": "Αποδοχή", + "Highest open risks": "Υψηλότεροι ανοιχτοί κίνδυνοι", + "No open risks": "Δεν υπάρχουν ανοιχτοί κίνδυνοι", + "Open the risk register": "Άνοιγμα μητρώου κινδύνων", + "Edit risk": "Επεξεργασία κινδύνου", + "What could go wrong": "Τι μπορεί να πάει στραβά", + "Likelihood": "Πιθανότητα", + "Impact": "Επίπτωση", + "Score {score}": "Βαθμολογία {score}", + "Countermeasures": "Αντίμετρα", + "Could not save the risk. Please try again.": "Δεν ήταν δυνατή η αποθήκευση του κινδύνου. Δοκιμάστε ξανά.", + "Risks by likelihood and impact": "Κίνδυνοι ανά πιθανότητα και επίπτωση", + "Risk scale": "Κλίμακα κινδύνου", + "The levels every project scores its risks on, and where low turns into medium and high": "Τα επίπεδα στα οποία κάθε έργο βαθμολογεί τους κινδύνους του, και πού το χαμηλό γίνεται μεσαίο και υψηλό", + "Number of levels": "Αριθμός επιπέδων", + "Likelihood labels": "Ετικέτες πιθανότητας", + "Impact labels": "Ετικέτες επίπτωσης", + "Level {level}": "Επίπεδο {level}", + "Medium from score": "Μεσαίο από βαθμολογία", + "High from score": "Υψηλό από βαθμολογία", + "Risk scale saved": "Η κλίμακα κινδύνου αποθηκεύτηκε", + "1 risk uses level {level}. Change it first.": "1 κίνδυνος χρησιμοποιεί το επίπεδο {level}. Αλλάξτε τον πρώτα.", + "{count} risks use level {level}. Change them first.": "{count} κίνδυνοι χρησιμοποιούν το επίπεδο {level}. Αλλάξτε τους πρώτα.", + "Every level needs a label, and high must start above medium.": "Κάθε επίπεδο χρειάζεται ετικέτα, και το υψηλό πρέπει να ξεκινά πάνω από το μεσαίο.", + "The project this risk belongs to": "Το έργο στο οποίο ανήκει ο κίνδυνος", + "The cause and the effect, in Markdown": "Η αιτία και το αποτέλεσμα, σε Markdown", + "Category": "Κατηγορία", + "A free grouping, such as planning, budget or supplier": "Ελεύθερη ομαδοποίηση, όπως χρονοπρογραμματισμός, προϋπολογισμός ή προμηθευτής", + "How likely it is, on the admin's risk scale": "Πόσο πιθανό είναι, στην κλίμακα κινδύνου του διαχειριστή", + "How hard it would hit, on the admin's risk scale": "Πόσο σκληρά θα έπληττε, στην κλίμακα κινδύνου του διαχειριστή", + "Likelihood times impact, calculated by the server": "Πιθανότητα επί επίπτωση, υπολογισμένη από τον διακομιστή", + "Where the risk stands": "Πού βρίσκεται ο κίνδυνος", + "The person who watches this risk": "Το άτομο που παρακολουθεί τον κίνδυνο", + "How the project answers the risk": "Πώς απαντά το έργο στον κίνδυνο", + "What is done to prevent it or soften it, in Markdown": "Τι γίνεται για να αποτραπεί ή να μετριαστεί, σε Markdown", + "When to look at this risk again": "Πότε να επανεξεταστεί ο κίνδυνος", + "Very low": "Πολύ χαμηλό", + "Very high": "Πολύ υψηλό", + "All projects": "Όλα τα έργα", + "Project status report": "Αναφορά κατάστασης έργου", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Χρονολογημένη αναφορά για το πώς πάει ένα έργο σε χρήματα, οργάνωση, χρόνο, πληροφόρηση, ποιότητα και κίνδυνο (οι πτυχές GROTIK), η καθεμία με σημείωση.", + "The project this report is about": "Το έργο στο οποίο αφορά η αναφορά", + "Report date": "Ημερομηνία αναφοράς", + "The day the report describes": "Η ημέρα που περιγράφει η αναφορά", + "Money": "Χρήματα", + "How the project stands on this aspect": "Πώς πάει το έργο σε αυτή την πτυχή", + "On track": "Εντός πορείας", + "At risk": "Σε κίνδυνο", + "Off track": "Εκτός πορείας", + "Money note": "Σημείωση για τα χρήματα", + "A short explanation of this status": "Σύντομη εξήγηση αυτής της κατάστασης", + "Organisation": "Οργάνωση", + "Organisation note": "Σημείωση για την οργάνωση", + "Time": "Χρόνος", + "Time note": "Σημείωση για τον χρόνο", + "Information": "Πληροφόρηση", + "Information note": "Σημείωση για την πληροφόρηση", + "Quality": "Ποιότητα", + "Quality note": "Σημείωση για την ποιότητα", + "Risk note": "Σημείωση για τον κίνδυνο", + "Overall": "Συνολικά", + "The worst of the six statuses, calculated by the server": "Η χειρότερη από τις έξι καταστάσεις, υπολογίζεται από τον διακομιστή", + "Health: money": "Υγεία: χρήματα", + "Copied from the newest status report": "Αντιγράφεται από την πιο πρόσφατη αναφορά κατάστασης", + "Health: organisation": "Υγεία: οργάνωση", + "Health: time": "Υγεία: χρόνος", + "Health: information": "Υγεία: πληροφόρηση", + "Health: quality": "Υγεία: ποιότητα", + "Health: risk": "Υγεία: κίνδυνος", + "Health: overall": "Υγεία: συνολικά", + "Health: report date": "Υγεία: ημερομηνία αναφοράς", + "The date of the newest status report": "Η ημερομηνία της πιο πρόσφατης αναφοράς κατάστασης", + "New report": "Νέα αναφορά", + "Only the project owner writes status reports.": "Μόνο ο κάτοχος του έργου γράφει αναφορές κατάστασης.", + "Latest report, {date}": "Τελευταία αναφορά, {date}", + "Aspect": "Πτυχή", + "Note": "Σημείωση", + "Report history": "Ιστορικό αναφορών", + "Author": "Συντάκτης", + "No status reports yet": "Δεν υπάρχουν ακόμη αναφορές κατάστασης", + "Write the first report": "Γράψτε την πρώτη αναφορά", + "Choose a status for every aspect to save the report.": "Επιλέξτε κατάσταση για κάθε πτυχή για να αποθηκεύσετε την αναφορά.", + "Suggested: on track.": "Πρόταση: εντός πορείας.", + "Suggested: at risk.": "Πρόταση: σε κίνδυνο.", + "Suggested: off track.": "Πρόταση: εκτός πορείας.", + "1 task is past its due date.": "1 εργασία έχει περάσει την προθεσμία της.", + "{count} tasks are past their due date.": "Εργασίες εκτός προθεσμίας: {count}.", + "The end date has passed with 1 open task.": "Η ημερομηνία λήξης πέρασε με 1 ανοιχτή εργασία.", + "The end date has passed with {count} open tasks.": "Η ημερομηνία λήξης πέρασε, ανοιχτές εργασίες: {count}.", + "No open task is past its due date.": "Καμία ανοιχτή εργασία δεν έχει περάσει την προθεσμία της.", + "The highest open risk, \"{title}\", scores {score}.": "Ο υψηλότερος ανοιχτός κίνδυνος, «{title}», έχει βαθμό {score}.", + "There are no open risks.": "Δεν υπάρχουν ανοιχτοί κίνδυνοι.", + "Costs are at {percent}% of the budget.": "Το κόστος είναι στο {percent}% του προϋπολογισμού.", + "No suggestion: the project has no budget.": "Καμία πρόταση: το έργο δεν έχει προϋπολογισμό.", + "No suggestion: no costs are recorded for this project yet.": "Καμία πρόταση: δεν έχει καταγραφεί ακόμη κόστος για αυτό το έργο.", + "The report was not saved. Only the project owner can write status reports.": "Η αναφορά δεν αποθηκεύτηκε. Μόνο ο κάτοχος του έργου μπορεί να γράφει αναφορές κατάστασης.", + "No report": "Καμία αναφορά", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Ομάδα έργων που διευθύνουν τα ίδια άτομα, όπως ένα τμήμα ή ένα πρόγραμμα. Οι υπεύθυνοί της διαβάζουν κάθε έργο της.", + "The name of the portfolio": "Το όνομα του χαρτοφυλακίου", + "What the portfolio holds and who runs it": "Τι περιέχει το χαρτοφυλάκιο και ποιος το διευθύνει", + "A colour for the portfolio's section in project lists": "Ένα χρώμα για την ενότητα του χαρτοφυλακίου στις λίστες έργων", + "Managers": "Υπεύθυνοι", + "Nextcloud user UIDs of the people who run the portfolio": "Αναγνωριστικά χρηστών Nextcloud των ατόμων που διευθύνουν το χαρτοφυλάκιο", + "Order": "Σειρά", + "Where the portfolio comes in project lists, lowest first": "Η θέση του χαρτοφυλακίου στις λίστες έργων, πρώτα το χαμηλότερο", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Η δική του κλίμακα κινδύνου αυτού του χαρτοφυλακίου σε JSON, στην ίδια μορφή με την κλίμακα όλης της εφαρμογής. Κενό σημαίνει την κλίμακα της εφαρμογής.", + "Portfolio readers": "Αναγνώστες χαρτοφυλακίου", + "Nextcloud user UIDs of the managers of the project's portfolio": "Αναγνωριστικά χρηστών Nextcloud των υπευθύνων του χαρτοφυλακίου του έργου", + "The portfolio this project belongs to": "Το χαρτοφυλάκιο στο οποίο ανήκει το έργο", + "No portfolio": "Χωρίς χαρτοφυλάκιο", + "All portfolios": "Όλα τα χαρτοφυλάκια", + "You read this project as a manager of its portfolio. Only its members change it.": "Διαβάζετε αυτό το έργο ως υπεύθυνος του χαρτοφυλακίου του. Μόνο τα μέλη του το αλλάζουν.", + "Portfolios": "Χαρτοφυλάκια", + "Portfolio status": "Κατάσταση χαρτοφυλακίου", + "No portfolios yet": "Δεν υπάρχουν ακόμη χαρτοφυλάκια", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Ένας διαχειριστής προσθέτει χαρτοφυλάκια στα Έργα, Χαρτοφυλάκια. Τα έργα ενός χαρτοφυλακίου εμφανίζονται εδώ με την κατάστασή τους.", + "Roll-up": "Σύνοψη", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} εντός πορείας, {atRisk} σε κίνδυνο, {offTrack} εκτός πορείας, {noReport} χωρίς αναφορά", + "No project in this portfolio that you can read.": "Κανένα έργο σε αυτό το χαρτοφυλάκιο που μπορείτε να διαβάσετε.", + "Start": "Έναρξη", + "End": "Λήξη", + "Budget": "Προϋπολογισμός", + "Last report": "Τελευταία αναφορά", + "Out of date": "Παρωχημένη", + "Portfolio timeline": "Χρονολόγιο χαρτοφυλακίου", + "Zoom": "Εστίαση", + "Could not load the timeline": "Δεν ήταν δυνατή η φόρτωση του χρονολογίου", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Ένας διαχειριστής προσθέτει χαρτοφυλάκια στα Έργα, Χαρτοφυλάκια. Τα έργα ενός χαρτοφυλακίου εμφανίζονται εδώ σε ένα χρονολόγιο.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Ανοίξτε ένα έργο για να δείτε τις φάσεις και τις εργασίες του. Το χρονολόγιο είναι μόνο για ανάγνωση.", + "Phase: {title}": "Φάση: {title}", + "Left out because you cannot read them: {count} projects": "Παραλείφθηκαν επειδή δεν μπορείτε να τα διαβάσετε: {count} έργα", + "Week": "Εβδομάδα", + "Day": "Ημέρα", + "Month": "Μήνας", + "Please try again later.": "Δοκιμάστε ξανά αργότερα.", + "Status reports": "Αναφορές κατάστασης", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Μετά από πόσες ημέρες η τελευταία αναφορά κατάστασης ενός έργου σημειώνεται ως παρωχημένη στην επισκόπηση χαρτοφυλακίου", + "Reporting period (days)": "Περίοδος αναφοράς (ημέρες)", + "The reporting period is a whole number of days from 1 to 365.": "Η περίοδος αναφοράς είναι ακέραιος αριθμός ημερών από 1 έως 365.", + "Reporting period saved": "Η περίοδος αναφοράς αποθηκεύτηκε", + "The reporting period was not saved. Please try again.": "Η περίοδος αναφοράς δεν αποθηκεύτηκε. Δοκιμάστε ξανά.", + "Every project of a portfolio with its status per aspect, rolled up.": "Κάθε έργο ενός χαρτοφυλακίου με την κατάστασή του ανά πτυχή, συνοπτικά.", + "The projects of a portfolio on one timeline.": "Τα έργα ενός χαρτοφυλακίου σε ένα χρονολόγιο.", + "Phases": "Φάσεις", + "Add phase": "Προσθήκη φάσης", + "No phases yet": "Δεν υπάρχουν ακόμη φάσεις", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Χωρίστε το έργο σε φάσεις, όπως έναρξη, καθορισμός και υλοποίηση. Μια φάση κλείνει μόλις ανέβει το έγγραφο ολοκλήρωσής της.", + "{hours} hours": "{hours} ώρες", + "Concluding document: {title}": "Έγγραφο ολοκλήρωσης: {title}", + "Concluding document missing": "Λείπει το έγγραφο ολοκλήρωσης", + "Move {title} up": "Μετακίνηση {title} πάνω", + "Move {title} down": "Μετακίνηση {title} κάτω", + "Close phase": "Κλείσιμο φάσης", + "Phase": "Φάση", + "Files": "Αρχεία", + "Notes": "Σημειώσεις", + "Audit trail": "Ίχνος ελέγχου", + "Edit phase": "Επεξεργασία φάσης", + "Name": "Όνομα", + "Budget hours": "Ώρες προϋπολογισμού", + "Could not save the phase. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της φάσης. Δοκιμάστε ξανά.", + "Close phase {title}": "Κλείσιμο της φάσης {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Μια φάση κλείνει με το έγγραφο ολοκλήρωσής της: ανεβάστε το εδώ ή επιλέξτε ένα από τα αρχεία της φάσης.", + "Concluding document": "Έγγραφο ολοκλήρωσης", + "This phase has no files yet.": "Αυτή η φάση δεν έχει ακόμη αρχεία.", + "Upload a document": "Ανέβασμα εγγράφου", + "The document was not uploaded. Please try again.": "Το έγγραφο δεν ανέβηκε. Δοκιμάστε ξανά.", + "Upload the concluding document before you close this phase.": "Ανεβάστε το έγγραφο ολοκλήρωσης πριν κλείσετε αυτή τη φάση.", + "This phase cannot be closed from its current status.": "Αυτή η φάση δεν μπορεί να κλείσει από την τρέχουσα κατάστασή της.", + "The phase was not closed. Please try again.": "Η φάση δεν έκλεισε. Δοκιμάστε ξανά.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Το αναγνωριστικό του αρχείου αυτής της φάσης που την ολοκληρώνει. Η φάση μπορεί να ολοκληρωθεί μόνο όταν έχει οριστεί και το αρχείο είναι συνημμένο.", + "Import from Microsoft Project": "Εισαγωγή από το Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Επιλέξτε ένα σχέδιο αποθηκευμένο από το Microsoft Project σε μορφή XML. Τίποτα δεν εισάγεται μέχρι να επιβεβαιώσετε.", + "Plan file": "Αρχείο σχεδίου", + "What the import creates": "Τι δημιουργεί η εισαγωγή", + "Tasks": "Εργασίες", + "Sub-tasks": "Υποεργασίες", + "Milestones": "Ορόσημα", + "Links": "Συνδέσεις", + "Already imported, updated in place: {count}": "Ήδη εισηγμένα, ενημερωμένα επί τόπου: {count}", + "What does not carry over": "Τι δεν μεταφέρεται", + "Tasks with resources, which are not imported: {count}": "Εργασίες με πόρους, που δεν εισάγονται: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Εργασίες βαθύτερα από το επίπεδο 3, τοποθετημένες κάτω από την εργασία επιπέδου 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Συνδέσεις εκτός τέλους-έναρξης, εισηγμένες ως σχετικές συνδέσεις: {count}", + "Link lags, which are dropped: {count}": "Καθυστερήσεις συνδέσεων, που παραλείπονται: {count}", + "Links to a summary task, which are not imported: {count}": "Συνδέσεις με συνοπτική εργασία, που δεν εισάγονται: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Συνδέσεις με εργασίες εκτός αυτού του σχεδίου, που δεν εισάγονται: {count}", + "No longer in the plan": "Όχι πια στο σχέδιο", + "These stay in the project; remove them yourself if they are no longer needed.": "Παραμένουν στο έργο· αφαιρέστε τα εσείς αν δεν χρειάζονται πια.", + "Import": "Εισαγωγή", + "Close": "Κλείσιμο", + "The plan is imported: {created} created, {updated} updated.": "Το σχέδιο εισήχθη: {created} δημιουργήθηκαν, {updated} ενημερώθηκαν.", + "Links that would close a loop were left out: {count}": "Οι συνδέσεις που θα έκλειναν βρόχο παραλείφθηκαν: {count}", + "The import stopped part-way. Run it again to finish it.": "Η εισαγωγή σταμάτησε στη μέση. Εκτελέστε την ξανά για να ολοκληρωθεί.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Αποθηκεύστε το σχέδιο στο Microsoft Project με Αρχείο, Αποθήκευση ως, μορφή XML, και εισαγάγετε εκείνο το αρχείο.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Αυτό το αρχείο δηλώνει DOCTYPE ή οντότητες, που δεν γίνονται δεκτές.", + "The file is larger than 10 MB.": "Το αρχείο είναι μεγαλύτερο από 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Το σχέδιο έχει πάνω από 2.000 εργασίες, περισσότερες από όσες δέχεται μία εισαγωγή.", + "This file is not a Microsoft Project plan in XML format.": "Αυτό το αρχείο δεν είναι σχέδιο Microsoft Project σε μορφή XML.", + "Choose a file to import.": "Επιλέξτε ένα αρχείο για εισαγωγή.", + "Only the project owner can import a plan.": "Μόνο ο κάτοχος του έργου μπορεί να εισαγάγει σχέδιο.", + "The plan could not be read. Please try again.": "Δεν ήταν δυνατή η ανάγνωση του σχεδίου. Δοκιμάστε ξανά.", + "Linked case: {title}": "Συνδεδεμένη υπόθεση: {title}", + "Linked to a case": "Συνδεδεμένο με υπόθεση", + "Hand over to case": "Παράδοση στην υπόθεση", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Αντιγράφει αναλλοίωτο κάθε αρχείο του έργου και των εργασιών του, και ένα αρχείο που περιγράφει το έργο, στη συνδεδεμένη υπόθεση.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Αρχεία που αντιγράφηκαν: {count}", + "Files that failed: {names}": "Αρχεία που απέτυχαν: {names}", + "The handover failed. Please try again.": "Η παράδοση απέτυχε. Δοκιμάστε ξανά.", + "The linked case could not be found, or you cannot open it.": "Η συνδεδεμένη υπόθεση δεν βρέθηκε ή δεν μπορείτε να την ανοίξετε.", + "Case handovers": "Παραδόσεις στην υπόθεση", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Κάθε παράδοση των αρχείων και μεταδεδομένων του έργου στην υπόθεσή του: πότε, από ποιον, σε ποια υπόθεση, κάθε αρχείο που αντιγράφηκε με το SHA-256 του και τα αρχεία που απέτυχαν.", + "Finance": "Οικονομικά", + "Add cost line": "Προσθήκη γραμμής κόστους", + "Delivery terms": "Όροι παράδοσης", + "Billing model": "Μοντέλο χρέωσης", + "Budget in euro": "Προϋπολογισμός σε ευρώ", + "Budget in hours": "Προϋπολογισμός σε ώρες", + "Hourly rate in euro": "Ωριαία χρέωση σε ευρώ", + "Planned start": "Προγραμματισμένη έναρξη", + "Planned end": "Προγραμματισμένη λήξη", + "Planned dates": "Προγραμματισμένες ημερομηνίες", + "Budget {amount}": "Προϋπολογισμός {amount}", + "No budget agreed": "Δεν έχει συμφωνηθεί προϋπολογισμός", + "Hours": "Ώρες", + "Only the project owner and the portfolio managers see the amounts.": "Τα ποσά τα βλέπουν μόνο ο κάτοχος του έργου και οι διαχειριστές του χαρτοφυλακίου.", + "Budget against cost per category": "Προϋπολογισμός έναντι κόστους ανά κατηγορία", + "Labour (booked time)": "Εργασία (καταγεγραμμένος χρόνος)", + "No category": "Χωρίς κατηγορία", + "Hours are not available": "Οι ώρες δεν είναι διαθέσιμες", + "Not yet assigned to a category": "Δεν έχει αντιστοιχιστεί ακόμη σε κατηγορία", + "Total": "Σύνολο", + "{spent} spent, {remaining} remaining": "{spent} δαπανήθηκαν, {remaining} απομένουν", + "Budget against cost per phase": "Προϋπολογισμός έναντι κόστους ανά φάση", + "No phase": "Χωρίς φάση", + "Cost lines": "Γραμμές κόστους", + "From the finance system": "Από το οικονομικό σύστημα", + "Edit cost line {amount}": "Επεξεργασία της γραμμής κόστους {amount}", + "No cost lines yet": "Δεν υπάρχουν ακόμη γραμμές κόστους", + "Commitments": "Δεσμεύσεις", + "Actual cost": "Πραγματικό κόστος", + "Forecast": "Πρόβλεψη", + "Remaining": "Υπόλοιπο", + "Not planned yet": "Δεν έχει προγραμματιστεί ακόμη", + "{start} to {end}": "{start} έως {end}", + "The terms were not saved. Please try again.": "Οι όροι δεν αποθηκεύτηκαν. Δοκιμάστε ξανά.", + "Terms saved": "Οι όροι αποθηκεύτηκαν", + "Fixed price": "Σταθερή τιμή", + "Hourly": "Ανά ώρα", + "Not billed": "Χωρίς χρέωση", + "Commitment": "Δέσμευση", + "Edit cost line": "Επεξεργασία γραμμής κόστους", + "Kind": "Είδος", + "Amount in euro": "Ποσό σε ευρώ", + "Remove": "Αφαίρεση", + "Could not save the cost line. Only the project owner changes the money of a project.": "Η γραμμή κόστους δεν αποθηκεύτηκε. Μόνο ο κάτοχος του έργου αλλάζει τα χρήματα ενός έργου.", + "Could not remove the cost line. Please try again.": "Η γραμμή κόστους δεν αφαιρέθηκε. Δοκιμάστε ξανά.", + "{amount} over budget": "{amount} πάνω από τον προϋπολογισμό", + "Cost categories": "Κατηγορίες κόστους", + "The categories every project splits its budget and costs into, one per line": "Οι κατηγορίες στις οποίες κάθε έργο χωρίζει τον προϋπολογισμό και το κόστος του, μία ανά γραμμή", + "Categories": "Κατηγορίες", + "Give at least one category, each name once.": "Δώστε τουλάχιστον μία κατηγορία, κάθε όνομα μία φορά.", + "Cost categories saved": "Οι κατηγορίες κόστους αποθηκεύτηκαν", + "The cost categories were not saved. Please try again.": "Οι κατηγορίες κόστους δεν αποθηκεύτηκαν. Δοκιμάστε ξανά.", + "Finance line": "Οικονομική γραμμή", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Ένα χρηματικό ποσό ενός έργου: προϋπολογισμός, δέσμευση, πραγματικό κόστος ή πρόβλεψη, σε κατηγορία κόστους και προαιρετικά σε φάση. Καταχωρείται από τον κάτοχο του έργου ή αποστέλλεται από το οικονομικό σύστημα μέσω της εφαρμογής ενσωμάτωσης.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Το έργο στο οποίο ανήκει το ποσό. Κενό για γραμμή του οικονομικού συστήματος της οποίας ο αριθμός έργου δεν αντιστοιχεί σε κανένα έργο.", + "The phase this amount belongs to, if any": "Η φάση στην οποία ανήκει το ποσό, αν υπάρχει", + "The cost category, one of the categories the admin set up": "Η κατηγορία κόστους, μία από τις κατηγορίες που όρισε ο διαχειριστής", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Αν το ποσό είναι προϋπολογισμός, δέσμευση, πραγματικό κόστος ή πρόβλεψη", + "Amount": "Ποσό", + "The amount in the reporting currency (euro)": "Το ποσό στο νόμισμα αναφοράς (ευρώ)", + "The date the amount was booked or is expected": "Η ημερομηνία που καταχωρήθηκε ή αναμένεται το ποσό", + "What the amount is for": "Για τι είναι το ποσό", + "Whether a person entered the line or the finance system sent it": "Αν τη γραμμή την καταχώρησε άτομο ή την έστειλε το οικονομικό σύστημα", + "Entered by hand": "Καταχωρήθηκε με το χέρι", + "Finance line id": "Αναγνωριστικό οικονομικής γραμμής", + "The finance system's own id of this line. One imported line per id.": "Το δικό της αναγνωριστικό της γραμμής στο οικονομικό σύστημα. Μία εισαγόμενη γραμμή ανά αναγνωριστικό.", + "Project number": "Αριθμός έργου", + "The project number the finance system sent, matched against the project key": "Ο αριθμός έργου που έστειλε το οικονομικό σύστημα, σε σύγκριση με το κλειδί του έργου", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Το χαρτοφυλάκιο του έργου της γραμμής, αντιγραμμένο από το έργο ώστε τα σύνολα του χαρτοφυλακίου να χρειάζονται ένα φίλτρο", + "Finance readers": "Αναγνώστες οικονομικών", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID χρηστών Nextcloud των ατόμων που μπορούν να δουν το ποσό: ο κάτοχος του έργου και οι διαχειριστές του χαρτοφυλακίου του", + "Project owner": "Κάτοχος έργου", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID χρήστη Nextcloud του κατόχου του έργου, που μπορεί να αλλάζει και να αφαιρεί χειροκίνητες γραμμές", + "How the client pays: not billed, a fixed price, or by the hour.": "Πώς πληρώνει ο πελάτης: χωρίς χρέωση, σταθερή τιμή ή ανά ώρα.", + "Portfolio finance": "Οικονομικά χαρτοφυλακίου", + "You cannot see the money of any project in this portfolio": "Δεν μπορείτε να δείτε τα χρήματα κανενός έργου αυτού του χαρτοφυλακίου", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Ο διακομιστής επέστρεψε γραμμές κόστους έργων εκτός αυτού του χαρτοφυλακίου, άρα τα σύνολα μπορεί να είναι λάθος.", + "Projects left out because you cannot see their money: {count}": "Έργα που παραλείφθηκαν επειδή δεν βλέπετε τα χρήματά τους: {count}", + "Unmatched finance lines": "Μη αντιστοιχισμένες οικονομικές γραμμές", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Προϋπολογισμός, δεσμεύσεις, πραγματικό κόστος και πρόβλεψη αθροισμένα για ένα χαρτοφυλάκιο.", + "Subprojects": "Υποέργα", + "{done} of {total}": "{done} από {total}", + "{done} of {total} tasks done, including subprojects": "{done} από {total} εργασίες ολοκληρώθηκαν, μαζί με τα υποέργα", + "Show the subprojects of {title}": "Εμφάνιση των υποέργων του {title}", + "Hide the subprojects of {title}": "Απόκρυψη των υποέργων του {title}", + "Part of": "Μέρος του", + "No parent project": "Χωρίς γονικό έργο", + "A project cannot sit under one of its own subprojects.": "Ένα έργο δεν μπορεί να βρίσκεται κάτω από ένα από τα δικά του υποέργα.", + "Projects nest three levels deep at most: programme, project and subproject.": "Τα έργα εμφωλεύονται έως τρία επίπεδα: πρόγραμμα, έργο και υποέργο.", + "Parent project": "Γονικό έργο", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Το έργο κάτω από το οποίο βρίσκεται αυτό το έργο, όπως ένα πρόγραμμα. Τα έργα εμφωλεύονται έως τρία επίπεδα.", + "Yes": "Ναι", + "No": "Όχι", + "{label} (required)": "{label} (υποχρεωτικό)", + "{label} is required": "Το {label} είναι υποχρεωτικό", + "Project field": "Πεδίο έργου", + "A field an admin adds to every project, such as a policy area or a contract value.": "Ένα πεδίο που προσθέτει ένας διαχειριστής σε κάθε έργο, όπως τομέας πολιτικής ή αξία σύμβασης.", + "Key": "Κλειδί", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Το σταθερό όνομα με το οποίο αποθηκεύεται η τιμή, σε lower camel case. Κρατήστε το όταν το χρησιμοποιούν έργα.", + "Label": "Ετικέτα", + "The name people see next to the field": "Το όνομα που βλέπουν οι χρήστες δίπλα στο πεδίο", + "What the field holds": "Τι περιέχει το πεδίο", + "Text": "Κείμενο", + "Number": "Αριθμός", + "Choice": "Επιλογή", + "Person": "Πρόσωπο", + "Yes or no": "Ναι ή όχι", + "Options": "Επιλογές", + "The choices of a choice field": "Οι επιλογές ενός πεδίου επιλογής", + "Required": "Υποχρεωτικό", + "Whether a project must fill in the field": "Αν ένα έργο πρέπει να συμπληρώσει το πεδίο", + "Where the field appears, lowest first": "Πού εμφανίζεται το πεδίο, το μικρότερο πρώτα", + "Applies to": "Ισχύει για", + "What the field is added to": "Σε τι προστίθεται το πεδίο", + "Custom fields": "Δικά σας πεδία", + "The values of the project fields an admin defined, keyed by the field's key.": "Οι τιμές των πεδίων έργου που όρισε ένας διαχειριστής, ανά κλειδί πεδίου.", + "Project fields": "Πεδία έργου", + "Related": "Σχετικές", + "Remove link": "Αφαίρεση σύνδεσης", + "Link type": "Είδος σύνδεσης", + "Relates to": "Σχετίζεται με", + "Duplicates": "Αντιγράφει", + "Project key": "Κλειδί έργου", + "Every task number starts with it, such as VERG-42.": "Κάθε αριθμός εργασίας ξεκινά με αυτό, π.χ. VERG-42.", + "This key is already used by another project.": "Αυτό το κλειδί χρησιμοποιείται ήδη από άλλο έργο.", + "Use 2 to 10 letters and digits, starting with a letter.": "Χρησιμοποιήστε 2 έως 10 γράμματα και ψηφία, ξεκινώντας με γράμμα.", + "The key cannot change once tasks carry it.": "Το κλειδί δεν μπορεί να αλλάξει όταν το φέρουν εργασίες.", + "Project saved. The existing tasks get their numbers in the background.": "Το έργο αποθηκεύτηκε. Οι υπάρχουσες εργασίες παίρνουν τους αριθμούς τους στο παρασκήνιο.", + "Next task number": "Αριθμός επόμενης εργασίας", + "The number the next task of this project gets in its key. Only the system writes it.": "Ο αριθμός που παίρνει στο κλειδί της η επόμενη εργασία αυτού του έργου. Τον γράφει μόνο το σύστημα.", + "Restore {title}": "Επαναφορά {title}", + "Restore": "Επαναφορά", + "Project restored": "Το έργο επανήλθε", + "Could not restore the project": "Δεν ήταν δυνατή η επαναφορά του έργου", + "Bring this project back to the active list.": "Επαναφέρετε αυτό το έργο στη λίστα των ενεργών έργων.", + "Restore project": "Επαναφορά έργου", + "Request reason": "Αιτία του αιτήματος", + "Why the requester needs this project. Filled in when the project is requested.": "Γιατί ο αιτών χρειάζεται αυτό το έργο. Συμπληρώνεται κατά το αίτημα.", + "Reviewed by": "Εξετάστηκε από", + "The user who approved or rejected the request.": "Ο χρήστης που ενέκρινε ή απέρριψε το αίτημα.", + "Reviewed at": "Εξετάστηκε στις", + "When the request was approved or rejected.": "Πότε εγκρίθηκε ή απορρίφθηκε το αίτημα.", + "Review note": "Σημείωση εξέτασης", + "The reviewer's reason, shown to the requester when a request is not approved.": "Ο λόγος του εξεταστή, που βλέπει ο αιτών όταν ένα αίτημα δεν εγκρίνεται.", + "Members of these groups": "Μέλη αυτών των ομάδων", + "Groups that may create projects": "Ομάδες που μπορούν να δημιουργούν έργα", + "The group {group} no longer exists. Save to remove it.": "Η ομάδα {group} δεν υπάρχει πλέον. Αποθηκεύστε για να αφαιρεθεί.", + "Review project request": "Εξέταση αιτήματος έργου", + "Requested by": "Αιτήθηκε από", + "Why it is needed": "Γιατί χρειάζεται", + "Desired start date": "Επιθυμητή ημερομηνία έναρξης", + "Why is it not approved?": "Γιατί δεν εγκρίνεται;", + "Give a reason. The requester sees it.": "Δώστε έναν λόγο. Ο αιτών θα τον δει.", + "Approve": "Έγκριση", + "Reject": "Απόρριψη", + "Reject request": "Απόρριψη αιτήματος", + "The review was not saved. Try again.": "Η εξέταση δεν αποθηκεύτηκε. Δοκιμάστε ξανά.", + "This project is waiting for review": "Αυτό το έργο περιμένει εξέταση", + "This request was not approved": "Αυτό το αίτημα δεν εγκρίθηκε", + "Reason: {note}": "Λόγος: {note}", + "Review request": "Εξέταση αιτήματος", + "Request a project": "Αίτημα για έργο", + "Step {step} of 2": "Βήμα {step} από 2", + "Why is this project needed?": "Γιατί χρειάζεται αυτό το έργο;", + "Give a reason. The reviewer reads it.": "Δώστε έναν λόγο. Ο εξεταστής θα τον διαβάσει.", + "Back": "Πίσω", + "Next": "Επόμενο", + "Send request": "Αποστολή αιτήματος", + "The request was not sent. Try again.": "Το αίτημα δεν στάλθηκε. Δοκιμάστε ξανά.", + "Requested": "Αιτήθηκε", + "Not approved": "Δεν εγκρίθηκε", + "Your request was sent": "Το αίτημά σας στάλθηκε", + "Let everyone else request a project": "Επιτρέψτε σε όλους τους άλλους να ζητούν έργο", + "Add a task": "Προσθήκη εργασίας", + "Delete task": "Διαγραφή εργασίας", + "Edit task": "Επεξεργασία εργασίας", + "Write": "Γραφή", + "Preview": "Προεπισκόπηση", + "Markdown works here: headings, lists and links.": "Εδώ λειτουργεί το Markdown: επικεφαλίδες, λίστες και σύνδεσμοι.", + "Could not save the task. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της εργασίας. Δοκιμάστε ξανά.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Στην εργασία \"{title}\" έχει καταγραφεί χρόνος, οπότε δεν μπορεί να διαγραφεί. Μπορείτε να την ακυρώσετε: οι καταχωρίσεις χρόνου παραμένουν.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Διαγραφή της \"{title}\"; Αφαιρούνται και οι σύνδεσμοί της με άλλες εργασίες. Αυτό δεν αναιρείται.", + "Keep task": "Διατήρηση εργασίας", + "Cancel task": "Ακύρωση εργασίας", + "Only the reporter, the project owner or an admin can delete this task.": "Μόνο ο αναφέρων, ο κάτοχος του έργου ή ένας διαχειριστής μπορεί να διαγράψει αυτή την εργασία.", + "Could not delete the task. Please try again.": "Δεν ήταν δυνατή η διαγραφή της εργασίας. Δοκιμάστε ξανά.", + "Could not cancel the task. Please try again.": "Δεν ήταν δυνατή η ακύρωση της εργασίας. Δοκιμάστε ξανά.", + "Responsible": "Υπεύθυνος", + "Also working on this": "Εργάζονται επίσης σε αυτό", + "Labels": "Ετικέτες", + "Could not change the priority. Please try again.": "Δεν ήταν δυνατή η αλλαγή της προτεραιότητας. Δοκιμάστε ξανά.", + "Other project members who work on this task alongside the person responsible.": "Άλλα μέλη του έργου που εργάζονται σε αυτή την εργασία μαζί με τον υπεύθυνο.", + "Duplicate": "Αντιγραφή", + "Could not copy the task. Please try again.": "Δεν ήταν δυνατή η αντιγραφή της εργασίας. Δοκιμάστε ξανά.", + "Subtasks": "Υποεργασίες", + "{done} of {total} done": "{done} από {total} ολοκληρωμένες", + "Add a subtask": "Προσθήκη υποεργασίας", + "Checklist": "Λίστα ελέγχου", + "Checklist item actions": "Ενέργειες στοιχείου λίστας", + "Add a checklist item": "Προσθήκη στοιχείου λίστας", + "Subtasks: {estimate} estimated, {logged} logged": "Υποεργασίες: {estimate} εκτίμηση, {logged} καταγεγραμμένα", + "Total estimate: {total}": "Συνολική εκτίμηση: {total}", + "Part of {title}": "Μέρος της {title}", + "Checklist: {count} done": "Λίστα ελέγχου: {count} ολοκληρωμένα", + "This task has subtasks: {count}.": "Αυτή η εργασία έχει υποεργασίες: {count}.", + "Keep subtasks as separate tasks": "Διατήρηση των υποεργασιών ως ξεχωριστών εργασιών", + "Delete subtasks too": "Διαγραφή και των υποεργασιών", + "Copy of {title}": "Αντίγραφο της {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Η εργασία αντιγράφηκε, αλλά όχι όλες οι υποεργασίες της. Ελέγξτε το αντίγραφο.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Μικρά βήματα μέσα στην εργασία. Κάθε στοιχείο έχει αναγνωριστικό, κείμενο και αν έχει ολοκληρωθεί.", + "Open work per person and per project.": "Ανοιχτή εργασία ανά άτομο και ανά έργο.", + "View": "Προβολή", + "By person": "Ανά άτομο", + "By project": "Ανά έργο", + "Hours left": "Ώρες που απομένουν", + "Tasks without an estimate": "Εργασίες χωρίς εκτίμηση", + "Due in 14 days": "Λήγει σε 14 ημέρες", + "Shared": "Κοινόχρηστες", + "Unassigned": "Χωρίς ανάθεση", + "{hours} h": "{hours} ώ", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Εμφανίζεται η εργασία στα έργα που μπορείτε να δείτε. Οι ώρες μετρούν για τον υπεύθυνο· οι κοινόχρηστες εργασίες μετρούν χωρίς ώρες.", + "No open work in these projects.": "Δεν υπάρχει ανοιχτή εργασία σε αυτά τα έργα.", + "Open work": "Ανοιχτή εργασία", + "{count} open tasks": "{count} ανοιχτές εργασίες", + "Create a project to see capacity here.": "Δημιουργήστε ένα έργο για να δείτε εδώ τη διαθεσιμότητα.", + "My tasks": "Οι εργασίες μου", + "Show all my tasks": "Εμφάνιση όλων των εργασιών μου", + "No tasks assigned to you": "Δεν σας έχουν ανατεθεί εργασίες", + "Browse projects": "Περιήγηση στα έργα", + "Later": "Αργότερα", + "Due {date}": "Λήξη {date}", + "Could not change the status. Please try again.": "Δεν ήταν δυνατή η αλλαγή της κατάστασης. Δοκιμάστε ξανά.", + "Completed today": "Ολοκληρώθηκαν σήμερα", + "My open tasks": "Οι ανοιχτές εργασίες μου", + "My overdue tasks": "Οι εκπρόθεσμες εργασίες μου", + "My tasks in progress": "Οι εργασίες μου σε εξέλιξη", + "Pin to the top": "Καρφίτσωμα στην κορυφή", + "Unpin": "Ξεκαρφίτσωμα", + "Pinned": "Καρφιτσωμένο", + "Actions for {title}": "Ενέργειες για {title}", + "Could not save your project order. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της σειράς των έργων σας. Δοκιμάστε ξανά.", + "No boards yet": "Δεν υπάρχουν ακόμη πίνακες", + "Create a project to get a board.": "Δημιουργήστε ένα έργο για να αποκτήσετε πίνακα.", + "Use the Projects page to create and manage your projects and tasks.": "Χρησιμοποιήστε τη σελίδα Έργα για να δημιουργείτε και να διαχειρίζεστε τα έργα και τις εργασίες σας.", + "Go to projects": "Μετάβαση στα έργα", + "You are not a member of any projects yet.": "Δεν είστε ακόμη μέλος κανενός έργου.", + "Could not search for users. Please try again.": "Δεν ήταν δυνατή η αναζήτηση χρηστών. Δοκιμάστε ξανά.", + "Project creation is restricted to administrators.": "Μόνο οι διαχειριστές μπορούν να δημιουργούν έργα.", + "Only the project owner or an administrator can delete this project.": "Μόνο ο κάτοχος του έργου ή ένας διαχειριστής μπορεί να διαγράψει αυτό το έργο.", + "No projects are available to you yet. Ask an administrator to create one.": "Δεν υπάρχουν ακόμη διαθέσιμα έργα για εσάς. Ζητήστε από έναν διαχειριστή να δημιουργήσει ένα.", + "Due: {date}": "Λήξη: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Οι εργασίες με ημερομηνία έναρξης ή λήξης εμφανίζονται στο χρονολόγιο. Προσθέστε ημερομηνίες για να τις δείτε εδώ.", + "You do not have access to this project.": "Δεν έχετε πρόσβαση σε αυτό το έργο.", + "Zoom level": "Επίπεδο μεγέθυνσης", + "Unscheduled": "Μη προγραμματισμένες", + "Start: {date}": "Έναρξη: {date}", + "Today": "Σήμερα", + "No scheduled tasks": "Δεν υπάρχουν προγραμματισμένες εργασίες", + "An unexpected error occurred.": "Παρουσιάστηκε απρόσμενο σφάλμα.", + "Column {number} name": "Όνομα στήλης {number}", + "Failed to save creation policy": "Δεν ήταν δυνατή η αποθήκευση του κανόνα δημιουργίας", + "All authenticated users": "Όλοι οι συνδεδεμένοι χρήστες", + "Control who may create new projects": "Ορίστε ποιοι μπορούν να δημιουργούν νέα έργα", + "Administrators only": "Μόνο διαχειριστές", + "Project creation": "Δημιουργία έργων", + "Allow project creation": "Να επιτρέπεται η δημιουργία έργων", + "Creation policy saved successfully": "Ο κανόνας δημιουργίας αποθηκεύτηκε", + "Initializing…": "Εκκίνηση…", + "e.g. 2h 30m, 90m, 1.5h": "π.χ. 2h 30m, 90m, 1.5h", + "Log time": "Καταγραφή χρόνου", + "Save estimate": "Αποθήκευση εκτίμησης", + "Logged: {logged}": "Καταγράφηκαν: {logged}", + "over by {amount}": "υπέρβαση κατά {amount}", + "Time tracking": "Παρακολούθηση χρόνου", + "Estimate": "Εκτίμηση", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Εισαγάγετε έγκυρη εκτίμηση (π.χ. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Εισαγάγετε έγκυρη διάρκεια (π.χ. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της καταχώρισης χρόνου. Δοκιμάστε ξανά.", + "Edit time entry": "Επεξεργασία καταχώρισης χρόνου", + "Duration": "Διάρκεια", + "Date range": "Εύρος ημερομηνιών", + "Last week": "Προηγούμενη εβδομάδα", + "No time logged": "Δεν έχει καταγραφεί χρόνος", + "Log time on a task to see it here.": "Καταγράψτε χρόνο σε μια εργασία για να τον δείτε εδώ.", + "To date": "Έως ημερομηνία", + "This week": "Αυτή την εβδομάδα", + "Total: {total}": "Σύνολο: {total}", + "From date": "Από ημερομηνία", + "Custom range": "Προσαρμοσμένο εύρος", + "All time": "Όλο το διάστημα", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Δεν ήταν δυνατή η διαγραφή μιας εργασίας, οπότε μπορεί να απομένουν δεδομένα. Διαγράψτε ξανά το έργο.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Δεν ήταν δυνατή η διαγραφή μιας καταχώρισης χρόνου, οπότε μπορεί να απομένουν δεδομένα. Διαγράψτε ξανά το έργο.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Δεν ήταν δυνατή η διαγραφή μιας στήλης, οπότε μπορεί να απομένουν δεδομένα. Διαγράψτε ξανά το έργο.", + "Could not delete the project. Please try again.": "Δεν ήταν δυνατή η διαγραφή του έργου. Δοκιμάστε ξανά.", + "Notification settings": "Ρυθμίσεις ειδοποιήσεων", + "Configure when due-date reminders are sent": "Ορίστε πότε αποστέλλονται υπενθυμίσεις προθεσμίας", + "Due-date reminder lead time (hours)": "Χρόνος υπενθύμισης πριν από την προθεσμία (ώρες)", + "Lead time must be between 1 and 336 hours": "Ο χρόνος πρέπει να είναι από 1 έως 336 ώρες", + "Reminder lead time saved successfully": "Ο χρόνος υπενθύμισης αποθηκεύτηκε", + "Failed to save reminder lead time": "Δεν ήταν δυνατή η αποθήκευση του χρόνου υπενθύμισης", + "Notifications": "Ειδοποιήσεις", + "Notify me 1 day before a task's due date": "Ειδοποίησέ με 1 ημέρα πριν από την προθεσμία μιας εργασίας", + "Draft": "Πρόχειρο", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Αν το μάθημα είναι πρόχειρο που βλέπει μόνο ο εκπαιδευτικός του, γίνεται ή ακυρώνεται.", + "New release": "Νέα έκδοση", + "Roadmap chart. The same releases and epics are listed below.": "Διάγραμμα οδικού χάρτη. Οι ίδιες εκδόσεις και τα έπη αναφέρονται παρακάτω.", + "Nothing on the roadmap yet": "Τίποτα ακόμη στον οδικό χάρτη", + "Releases with a target date and epics with dated tasks appear here.": "Εδώ εμφανίζονται οι εκδόσεις με ημερομηνία στόχο και τα έπη με εργασίες που έχουν ημερομηνία.", + "Releases": "Εκδόσεις", + "No releases yet": "Δεν υπάρχουν ακόμη εκδόσεις", + "Target date: {date}": "Ημερομηνία στόχος: {date}", + "No target date": "Χωρίς ημερομηνία στόχο", + "Edit {name}": "Επεξεργασία {name}", + "Mark {name} as released": "Σήμανση {name} ως κυκλοφορημένης", + "Mark as released": "Σήμανση ως κυκλοφορημένης", + "Epics": "Έπη", + "No epics yet. Open a task to make it an epic.": "Δεν υπάρχουν ακόμη έπη. Ανοίξτε μια εργασία για να την κάνετε έπος.", + "Not scheduled yet": "Δεν έχει προγραμματιστεί ακόμη", + "Planned": "Προγραμματισμένη", + "Released": "Κυκλοφόρησε", + "Edit release": "Επεξεργασία έκδοσης", + "Target date": "Ημερομηνία στόχος", + "Could not save the release. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της έκδοσης. Δοκιμάστε ξανά.", + "Every task of this release is done or cancelled.": "Κάθε εργασία αυτής της έκδοσης έχει ολοκληρωθεί ή ακυρωθεί.", + "Not finished yet: {count}": "Δεν έχουν ολοκληρωθεί ακόμη: {count}", + "What happens to these tasks?": "Τι γίνεται με αυτές τις εργασίες;", + "Move to {name}": "Μετακίνηση στην {name}", + "Remove the release": "Αφαίρεση της έκδοσης", + "Keep it on {name}": "Να μείνουν στην {name}", + "Could not mark the release as released. Please try again.": "Δεν ήταν δυνατή η σήμανση της έκδοσης ως κυκλοφορημένης. Δοκιμάστε ξανά.", + "Roadmap": "Οδικός χάρτης", + "Tasks or roadmap": "Εργασίες ή οδικός χάρτης", + "Release": "Έκδοση", + "Epic": "Έπος", + "This task is an epic": "Αυτή η εργασία είναι έπος", + "A named, dated delivery of a project that its tasks are planned against.": "Μια ονομασμένη παράδοση έργου με ημερομηνία, προς την οποία σχεδιάζονται οι εργασίες του.", + "Name of the release": "Όνομα της έκδοσης", + "The project this release belongs to": "Το έργο στο οποίο ανήκει αυτή η έκδοση", + "What this release delivers": "Τι παραδίδει αυτή η έκδοση", + "When work on the release starts": "Πότε ξεκινά η εργασία για την έκδοση", + "The date the release is due": "Η ημερομηνία που πρέπει να είναι έτοιμη η έκδοση", + "Whether the release is planned, released or archived": "Αν η έκδοση είναι προγραμματισμένη, κυκλοφορημένη ή αρχειοθετημένη", + "Released on": "Κυκλοφόρησε στις", + "When the release was marked as released": "Πότε η έκδοση σημειώθηκε ως κυκλοφορημένη", + "The release this task is planned for": "Η έκδοση για την οποία έχει προγραμματιστεί αυτή η εργασία", + "Board view options": "Επιλογές προβολής πίνακα", + "Colour cards": "Χρωματισμός καρτών", + "No colour": "Χωρίς χρώμα", + "By label": "Κατά ετικέτα", + "Swimlanes": "Λωρίδες", + "No swimlanes": "Χωρίς λωρίδες", + "By assignee": "Κατά υπεύθυνο", + "By epic": "Κατά epic", + "No assignee": "Χωρίς υπεύθυνο", + "No epic": "Χωρίς epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Οι κάρτες μένουν στη γραμμή του epic τους. Αλλάξτε το epic στη σελίδα της εργασίας.", + "Hand over to": "Παράδοση σε", + "Could not save your board view. It applies until you reload.": "Η προβολή του πίνακα δεν αποθηκεύτηκε. Ισχύει μέχρι να ανανεώσετε τη σελίδα.", + "Timetable wish": "Επιθυμία ωρολογίου", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Μια επιθυμία που λαμβάνει υπόψη η γεννήτρια. Μια αυστηρή την τηρεί πάντα, μια ευέλικτη όπου μπορεί.", + "Whether the wish is about a teacher, a group, a room or one activity": "Αν η επιθυμία αφορά εκπαιδευτικό, τμήμα, αίθουσα ή μία δραστηριότητα", + "Teacher": "Εκπαιδευτικός", + "Group": "Τμήμα", + "Reference": "Αναφορά", + "The user, group, room or activity the wish is about": "Ο χρήστης, το τμήμα, η αίθουσα ή η δραστηριότητα που αφορά η επιθυμία", + "What the wish asks for": "Τι ζητά η επιθυμία", + "Not on these periods": "Όχι σε αυτές τις ώρες", + "Preferably not on these periods": "Κατά προτίμηση όχι σε αυτές τις ώρες", + "At most a number of lessons a day": "Το πολύ ένας αριθμός μαθημάτων την ημέρα", + "No free periods between lessons": "Χωρίς κενά ανάμεσα στα μαθήματα", + "Always the same room": "Πάντα η ίδια αίθουσα", + "Periods": "Ώρες", + "The periods of the week the wish is about, such as wed-5": "Οι ώρες της εβδομάδας που αφορά η επιθυμία, π.χ. wed-5", + "Limit": "Όριο", + "The most lessons a day, for a wish of that kind": "Τα περισσότερα μαθήματα την ημέρα, για επιθυμία αυτού του είδους", + "Strength": "Ισχύς", + "Whether the generator must keep the wish or should keep it": "Αν η γεννήτρια πρέπει ή θα έπρεπε να τηρήσει την επιθυμία", + "Hard": "Αυστηρή", + "Soft": "Ευέλικτη", + "Weight": "Βάρος", + "How much a soft wish counts, from 1 to 3": "Πόσο μετρά μια ευέλικτη επιθυμία, από 1 έως 3", + "Why the wish exists": "Γιατί υπάρχει η επιθυμία", + "Timetable scenario": "Σενάριο ωρολογίου", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Ένα εβδομαδιαίο μοτίβο, από τη γεννήτρια ή από το τρέχον ωρολόγιο. Κρατά τα δεδομένα εισόδου του και πόσο καλά τηρεί τις επιθυμίες.", + "The name timetablers know the scenario by": "Το όνομα με το οποίο γνωρίζουν το σενάριο όσοι φτιάχνουν το ωρολόγιο", + "Whether the generator made it or it came from the current timetable": "Αν το έφτιαξε η γεννήτρια ή προέρχεται από το τρέχον ωρολόγιο", + "Generated": "Παραγμένο", + "From the current timetable": "Από το τρέχον ωρολόγιο", + "Week of": "Εβδομάδα από", + "The Monday of the first week of the window": "Η Δευτέρα της πρώτης εβδομάδας της περιόδου", + "Window start": "Αρχή περιόδου", + "The first day the week pattern applies to": "Η πρώτη ημέρα για την οποία ισχύει το εβδομαδιαίο μοτίβο", + "Window end": "Τέλος περιόδου", + "The last day the week pattern applies to": "Η τελευταία ημέρα για την οποία ισχύει το εβδομαδιαίο μοτίβο", + "Waiting, generating, done, failed, or published as draft lessons": "Σε αναμονή, σε παραγωγή, έτοιμο, απέτυχε ή δημοσιευμένο ως πρόχειρα μαθήματα", + "Waiting": "Σε αναμονή", + "Generating": "Σε παραγωγή", + "Failed": "Απέτυχε", + "Published": "Δημοσιευμένο", + "Seed": "Σπόρος", + "The number the generator starts from, so a run can be repeated": "Ο αριθμός από τον οποίο ξεκινά η γεννήτρια, ώστε μια εκτέλεση να επαναλαμβάνεται", + "Input": "Είσοδος", + "The periods, rooms, lessons and wishes the scenario was made from": "Οι ώρες, αίθουσες, μαθήματα και επιθυμίες από τα οποία φτιάχτηκε το σενάριο", + "Placements": "Τοποθετήσεις", + "Each lesson with the period and room it was given": "Κάθε μάθημα με την ώρα και την αίθουσα που πήρε", + "Unplaced lessons": "Μη τοποθετημένα μαθήματα", + "Lessons without a place, each with the hard wish that blocked it": "Μαθήματα χωρίς θέση, το καθένα με την αυστηρή επιθυμία που το εμπόδισε", + "Broken wishes": "Παραβιασμένες επιθυμίες", + "The wishes this scenario breaks, with the lessons that break them": "Οι επιθυμίες που παραβιάζει αυτό το σενάριο, με τα μαθήματα που τις παραβιάζουν", + "Measures": "Μετρήσεις", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Τοποθετημένα μαθήματα, παραβιασμένες επιθυμίες, κενά εκπαιδευτικών, μαθήματα την ημέρα και χρήση αιθουσών", + "Reason": "Αιτία", + "Why the run failed": "Γιατί απέτυχε η εκτέλεση", + "Published at": "Δημοσιεύτηκε στις", + "When the scenario was written out as draft lessons": "Πότε γράφτηκε το σενάριο ως πρόχειρα μαθήματα", + "Edit wish": "Επεξεργασία επιθυμίας", + "New wish": "Νέα επιθυμία", + "Hard: the generator always keeps it": "Υποχρεωτική: η γεννήτρια την τηρεί πάντα", + "Soft: the generator keeps it where it can": "Ευέλικτη: η γεννήτρια την τηρεί όπου μπορεί", + "Weight (1 to 3)": "Βάρος (1 έως 3)", + "Most lessons a day": "Το πολύ μαθήματα την ημέρα", + "Period": "Ώρα", + "{day} period {number}": "{day} ώρα {number}", + "Teacher (user name)": "Εκπαιδευτικός (όνομα χρήστη)", + "Activity (group:subject)": "Δραστηριότητα (ομάδα:μάθημα)", + "Say who or what the wish is about.": "Δηλώστε ποιον ή τι αφορά η επιθυμία.", + "Choose at least one period.": "Επιλέξτε τουλάχιστον μία ώρα.", + "The limit is a whole number of 1 or more.": "Το όριο είναι ακέραιος αριθμός 1 ή μεγαλύτερος.", + "Timetable": "Ωρολόγιο πρόγραμμα", + "Wishes": "Επιθυμίες", + "Timetable wishes": "Επιθυμίες ωρολογίου προγράμματος", + "Generator run": "Εκτέλεση γεννήτριας", + "Generator progress": "Πρόοδος γεννήτριας", + "The run failed: {reason}": "Η εκτέλεση απέτυχε: {reason}", + "{placed} of {lessons} lessons placed": "Τοποθετήθηκαν {placed} από {lessons} μαθήματα", + "Generate again": "Δημιουργία ξανά", + "Generate": "Δημιουργία", + "Every lesson has a place.": "Κάθε μάθημα έχει θέση.", + "Lesson": "Μάθημα", + "No free period and room": "Καμία ελεύθερη ώρα και αίθουσα", + "Broken soft wishes": "Ευέλικτες επιθυμίες που δεν τηρήθηκαν", + "Every soft wish is kept.": "Κάθε ευέλικτη επιθυμία τηρείται.", + "Wish": "Επιθυμία", + "Lessons": "Μαθήματα", + "Generating: {percent}% of the time budget used": "Δημιουργία: χρησιμοποιήθηκε {percent}% του χρόνου", + "Waiting to start": "Αναμονή έναρξης", + "Published as draft lessons": "Δημοσιεύτηκε ως πρόχειρα μαθήματα", + "Could not read the scenario.": "Δεν ήταν δυνατή η ανάγνωση του σεναρίου.", + "Could not start the run.": "Δεν ήταν δυνατή η έναρξη της εκτέλεσης.", + "Scenarios": "Σενάρια", + "Timetable scenarios": "Σενάρια ωρολογίου προγράμματος", + "Scenario": "Σενάριο", + "Take the current timetable": "Λήψη του τρέχοντος ωρολογίου προγράμματος", + "Could not take the current timetable.": "Δεν ήταν δυνατή η λήψη του τρέχοντος ωρολογίου προγράμματος.", + "Broken hard wishes": "Υποχρεωτικές επιθυμίες που παραβιάστηκαν", + "Not on a period of the week grid": "Όχι σε ώρα του εβδομαδιαίου πλέγματος", + "Compare scenarios": "Σύγκριση σεναρίων", + "Scenarios to compare": "Σενάρια προς σύγκριση", + "Choose two or three scenarios to compare them.": "Επιλέξτε δύο ή τρία σενάρια για σύγκριση.", + "Measure": "Μέτρο", + "Best": "Καλύτερο", + "Lessons that differ": "Μαθήματα που διαφέρουν", + "No lesson differs.": "Κανένα μάθημα δεν διαφέρει.", + "Not placed": "Δεν τοποθετήθηκε", + "{period} in {room}": "{period} στην {room}", + "Lessons placed": "Τοποθετημένα μαθήματα", + "Lessons without a place": "Μαθήματα χωρίς θέση", + "Clashes": "Συγκρούσεις", + "Hard wishes broken": "Υποχρεωτικές επιθυμίες που δεν τηρήθηκαν", + "Soft wishes broken": "Ευέλικτες επιθυμίες που δεν τηρήθηκαν", + "Soft wishes broken, weighted": "Ευέλικτες επιθυμίες που δεν τηρήθηκαν, σταθμισμένες", + "Free periods between lessons, all teachers": "Κενά, όλοι οι εκπαιδευτικοί", + "Most free periods of one teacher": "Τα περισσότερα κενά ενός εκπαιδευτικού", + "Most lessons of one group on a day": "Τα περισσότερα μαθήματα μιας ομάδας σε μια ημέρα", + "Room use": "Χρήση αιθουσών", + "Publish as draft lessons": "Δημοσίευση ως πρόχειρα μαθήματα", + "Draft lessons written: {count}": "Πρόχειρα μαθήματα που γράφτηκαν: {count}", + "Could not publish the scenario.": "Δεν ήταν δυνατή η δημοσίευση του σεναρίου.", + "Rules": "Κανόνες", + "Rules for {column}": "Κανόνες για {column}", + "When a card enters this column": "Όταν μια κάρτα μπαίνει σε αυτή τη στήλη", + "Action": "Ενέργεια", + "Set the priority": "Ορισμός προτεραιότητας", + "Assign to": "Ανάθεση σε", + "Assign the person who moved the card": "Ανάθεση σε όποιον μετακίνησε την κάρτα", + "Remove the assignee": "Αφαίρεση υπευθύνου", + "Add a label": "Προσθήκη ετικέτας", + "No longer a project member": "Δεν είναι πλέον μέλος του έργου", + "This label no longer exists": "Αυτή η ετικέτα δεν υπάρχει πλέον", + "Add rule": "Προσθήκη κανόνα", + "Remove rule": "Αφαίρεση κανόνα", + "No rules yet. Add one to change a card when it enters this column.": "Δεν υπάρχουν ακόμη κανόνες. Προσθέστε έναν για να αλλάζει μια κάρτα όταν μπαίνει σε αυτή τη στήλη.", + "Could not save the rules. Please try again.": "Οι κανόνες δεν αποθηκεύτηκαν. Δοκιμάστε ξανά.", + "1 rule runs when a card enters this column": "1 κανόνας εκτελείται όταν μια κάρτα μπαίνει σε αυτή τη στήλη", + "{count} rules run when a card enters this column": "{count} κανόνες εκτελούνται όταν μια κάρτα μπαίνει σε αυτή τη στήλη", + "Rules applied: {changes}": "Κανόνες που εφαρμόστηκαν: {changes}", + "assigned to {name}": "ανατέθηκε σε {name}", + "assignee removed": "ο υπεύθυνος αφαιρέθηκε", + "priority {priority}": "προτεραιότητα {priority}", + "label {label}": "ετικέτα {label}", + "What happens to a card when it enters this column, applied in list order.": "Τι συμβαίνει σε μια κάρτα όταν μπαίνει σε αυτή τη στήλη, με τη σειρά της λίστας.", + "Value": "Τιμή", + "What the rule does to the card.": "Τι κάνει ο κανόνας στην κάρτα.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Η προτεραιότητα, το αναγνωριστικό χρήστη ή ετικέτας που χρησιμοποιεί η ενέργεια· κενό για ενέργειες χωρίς τιμή.", + "is not": "δεν είναι", + "{dimension} is not": "{dimension} δεν είναι", + "Saved filters": "Αποθηκευμένα φίλτρα", + "No saved filters yet": "Δεν υπάρχουν ακόμη αποθηκευμένα φίλτρα", + "Save filter": "Αποθήκευση φίλτρου", + "Rename \"{name}\"": "Μετονομασία «{name}»", + "Delete \"{name}\"": "Διαγραφή «{name}»", + "Clear filters": "Καθαρισμός φίλτρων", + "Showing {shown} of {total} tasks": "Εμφανίζονται {shown} από {total} εργασίες", + "Me": "Εγώ", + "No date": "Χωρίς ημερομηνία", + "Rename saved filter": "Μετονομασία αποθηκευμένου φίλτρου", + "Share with the project": "Κοινή χρήση με το έργο", + "Give the filter a name": "Δώστε όνομα στο φίλτρο", + "Could not save the filter. Please try again.": "Το φίλτρο δεν αποθηκεύτηκε. Δοκιμάστε ξανά.", + "Some labels in \"{name}\" no longer exist and were left out.": "Ορισμένες ετικέτες στο «{name}» δεν υπάρχουν πλέον και παραλείφθηκαν.", + "Could not delete the filter. Please try again.": "Το φίλτρο δεν διαγράφηκε. Δοκιμάστε ξανά.", + "Saved filter": "Αποθηκευμένο φίλτρο", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Ένα φίλτρο πίνακα με όνομα για ένα έργο, ιδιωτικό για όποιον το αποθήκευσε εκτός αν μοιράζεται με το έργο.", + "The project whose board the filter applies to": "Το έργο στον πίνακα του οποίου εφαρμόζεται το φίλτρο", + "The name the filter is listed under": "Το όνομα με το οποίο εμφανίζεται το φίλτρο στη λίστα", + "Saved by": "Αποθηκεύτηκε από", + "Nextcloud user id of the person who saved the filter": "Αναγνωριστικό χρήστη Nextcloud όποιου αποθήκευσε το φίλτρο", + "Shared with the project": "Κοινόχρηστο με το έργο", + "Whether every project member sees and applies the filter": "Αν κάθε μέλος του έργου βλέπει και μπορεί να εφαρμόσει το φίλτρο", + "Criteria": "Κριτήρια", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Το φίλτρο: υπεύθυνος, ετικέτα, προτεραιότητα και προθεσμία, το καθένα με είναι ή δεν είναι και τις τιμές του", + "Cross-project view": "Προβολή πολλών έργων", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Μια αποθηκευμένη επιλογή έργων των οποίων οι εργασίες εμφανίζονται μαζί σε στήλες κατάστασης, κοινόχρηστη με τα άτομα που ορίζει.", + "Shared with": "Κοινή χρήση με", + "The name the view is listed under": "Το όνομα με το οποίο εμφανίζεται η προβολή", + "Nextcloud user id of the person who saved the view": "Αναγνωριστικό χρήστη Nextcloud του ατόμου που αποθήκευσε την προβολή", + "Nextcloud user ids of the people the view is shared with": "Αναγνωριστικά χρηστών Nextcloud των ατόμων με τα οποία μοιράζεται η προβολή", + "The projects whose tasks the view shows, at most twenty": "Τα έργα των οποίων τις εργασίες δείχνει η προβολή, έως είκοσι", + "1 project in this view is hidden from you.": "1 έργο αυτής της προβολής είναι κρυφό για εσάς.", + "{count} projects in this view are hidden from you.": "{count} έργα αυτής της προβολής είναι κρυφά για εσάς.", + "{project} has no column for {status}.": "Το έργο {project} δεν έχει στήλη για {status}.", + "This view does not exist or is not shared with you.": "Αυτή η προβολή δεν υπάρχει ή δεν είναι κοινόχρηστη μαζί σας.", + "\"{task}\" moved to {status}.": "Η \"{task}\" μετακινήθηκε σε {status}.", + "Project: {title}": "Έργο: {title}", + "Cross-project views": "Προβολές πολλών έργων", + "New view": "Νέα προβολή", + "Edit view": "Επεξεργασία προβολής", + "Delete view": "Διαγραφή προβολής", + "Give the view a name": "Δώστε όνομα στην προβολή", + "Pick at least one project": "Επιλέξτε τουλάχιστον ένα έργο", + "A view shows at most {max} projects": "Μια προβολή δείχνει έως {max} έργα", + "Could not save the view. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της προβολής. Δοκιμάστε ξανά.", + "Could not delete the view. Please try again.": "Δεν ήταν δυνατή η διαγραφή της προβολής. Δοκιμάστε ξανά.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Διαγραφή του \"{title}\"; Τα έργα και οι εργασίες τους μένουν ως έχουν.", + "People see the tasks of the projects they are in, never more.": "Ο καθένας βλέπει μόνο τις εργασίες των έργων στα οποία συμμετέχει.", + "No views yet. A view shows the tasks of several of your projects together.": "Δεν υπάρχουν ακόμη προβολές. Μια προβολή δείχνει μαζί τις εργασίες πολλών έργων σας.", + "Projects in view: {count}": "Έργα στην προβολή: {count}", + "Notify me when a task is assigned to me": "Ειδοποίησέ με όταν μου ανατίθεται μια εργασία", + "Also send these to me by email": "Στείλε μου αυτά και με email", + "Add an email address in your Nextcloud personal settings to get mail.": "Προσθέστε μια διεύθυνση email στις προσωπικές ρυθμίσεις του Nextcloud για να λαμβάνετε email.", + "Code link": "Σύνδεσμος κώδικα", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Ένα commit, κλάδος, αίτημα συγχώνευσης ή ζήτημα σε πλατφόρμα κώδικα που αφορά μια εργασία.", + "The task the link belongs to": "Η εργασία στην οποία ανήκει ο σύνδεσμος", + "The project of the task": "Το έργο της εργασίας", + "Task key": "Κλειδί εργασίας", + "The task key the forge text named, such as VC-12": "Το κλειδί εργασίας που ανέφερε το κείμενο της πλατφόρμας, π.χ. VC-12", + "What the link points at": "Πού δείχνει ο σύνδεσμος", + "Link": "Σύνδεσμος", + "The address of the item in the forge": "Η διεύθυνση του στοιχείου στην πλατφόρμα κώδικα", + "The commit message, branch name or merge request title": "Το μήνυμα του commit, το όνομα του κλάδου ή ο τίτλος του αιτήματος συγχώνευσης", + "Repository": "Αποθετήριο", + "The repository, such as acme/portal": "Το αποθετήριο, π.χ. acme/portal", + "Forge id": "Id στην πλατφόρμα", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Το δικό του id του στοιχείου στην πλατφόρμα κώδικα, π.χ. github:acme/portal#42 ή ένα hash commit", + "State": "Κατάσταση", + "The state of a merge request or issue": "Η κατάσταση ενός αιτήματος συγχώνευσης ή ζητήματος", + "Who made the commit or opened the merge request": "Ποιος έκανε το commit ή άνοιξε το αίτημα συγχώνευσης", + "When the commit was made or the merge request last changed": "Πότε έγινε το commit ή άλλαξε τελευταία φορά το αίτημα συγχώνευσης", + "Added by": "Προστέθηκε από", + "Whether a person added the link or the integration wrote it": "Αν τον σύνδεσμο τον πρόσθεσε άνθρωπος ή τον έγραψε η ενσωμάτωση", + "Nextcloud user UIDs of project members": "Αναγνωριστικά χρηστών Nextcloud των μελών του έργου", + "Add link": "Προσθήκη συνδέσμου", + "Added by hand": "Προστέθηκε χειροκίνητα", + "Branch": "Κλάδος", + "Code": "Κώδικας", + "Commit": "Commit", + "From the integration": "Από την ενσωμάτωση", + "Link to a commit, branch or merge request": "Σύνδεσμος σε commit, κλάδο ή αίτημα συγχώνευσης", + "Merge request": "Αίτημα συγχώνευσης", + "Merged": "Συγχωνεύθηκε", + "No code linked yet. Name {key} in a commit message or paste a link.": "Δεν υπάρχει ακόμη συνδεδεμένος κώδικας. Αναφέρετε το {key} σε μήνυμα commit ή επικολλήστε σύνδεσμο.", + "No code linked yet. Paste a link to a commit or merge request.": "Δεν υπάρχει ακόμη συνδεδεμένος κώδικας. Επικολλήστε σύνδεσμο σε commit ή αίτημα συγχώνευσης.", + "Paste a web address that starts with https://.": "Επικολλήστε μια διεύθυνση web που ξεκινά με https://.", + "Remove link {title}": "Αφαίρεση του συνδέσμου {title}", + "The link could not be added.": "Ο σύνδεσμος δεν ήταν δυνατό να προστεθεί.", + "The link could not be removed.": "Ο σύνδεσμος δεν ήταν δυνατό να αφαιρεθεί.", + "This link is already on the task.": "Αυτός ο σύνδεσμος υπάρχει ήδη στην εργασία.", + "Code forges": "Πλατφόρμες κώδικα", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Συνδέστε commits και pull requests του GitHub με εργασίες. Το Integriq λαμβάνει τα συμβάντα· το planninq δεν καλεί ποτέ το GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Κατεβάστε τη διαμόρφωση και εισαγάγετέ τη στο Integriq. Έπειτα συμπληρώστε ένα μυστικό στον κανόνα \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Στο GitHub, προσθέστε στο αποθετήριο ένα webhook με αυτή τη διεύθυνση και το ίδιο μυστικό. Επιλέξτε τύπο περιεχομένου application/json και τα συμβάντα push και pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Αναφέρετε το κλειδί εργασίας, π.χ. VC-12, σε μήνυμα commit, όνομα κλάδου ή τίτλο pull request. Ο σύνδεσμος εμφανίζεται τότε σε αυτή την εργασία.", + "Without Integriq, project members can still paste a link on the task page.": "Χωρίς το Integriq, τα μέλη του έργου μπορούν ακόμη να επικολλήσουν σύνδεσμο στη σελίδα της εργασίας.", + "Download the Integriq configuration": "Λήψη της διαμόρφωσης Integriq", + "Calendar": "Ημερολόγιο", + "Previous": "Προηγούμενο", + "Calendar view": "Προβολή ημερολογίου", + "Starts:": "Ξεκινά:", + "No tasks with a date in this month.": "Δεν υπάρχουν εργασίες με ημερομηνία αυτόν τον μήνα.", + "Week of {start} to {end}": "Εβδομάδα από {start} έως {end}", + "My calendar": "Το ημερολόγιό μου", + "Show as list": "Εμφάνιση ως λίστα", + "Show as calendar": "Εμφάνιση ως ημερολόγιο", + "Open my calendar": "Άνοιγμα του ημερολογίου μου", + "Nextcloud Tasks": "Εργασίες Nextcloud", + "Show my tasks in Nextcloud Tasks": "Εμφάνιση των εργασιών μου στις Εργασίες Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Οι εργασίες που σας έχουν ανατεθεί ή κοινοποιηθεί εμφανίζονται σε μια λίστα \"Planninq\" στις Εργασίες και στο Ημερολόγιο του Nextcloud. Οι αλλαγές που γίνονται εκεί αντικαθίστανται με την επόμενη αλλαγή στο Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Αυτός ο διακομιστής δεν μπορεί να γράψει στις Εργασίες Nextcloud, οπότε η εξαγωγή δεν είναι διαθέσιμη.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Διαχειρίζεται από το Planninq. Οι αλλαγές που γίνονται εδώ αντικαθίστανται με την επόμενη αλλαγή στο Planninq.", + "Working days and holidays": "Εργάσιμες ημέρες και αργίες", + "Dates set on the timeline skip the days that are not working days.": "Οι ημερομηνίες στη χρονογραμμή παραλείπουν τις μη εργάσιμες ημέρες.", + "Working weekdays": "Εργάσιμες ημέρες της εβδομάδας", + "Non-working days": "Μη εργάσιμες ημέρες", + "No non-working days yet.": "Δεν υπάρχουν ακόμη μη εργάσιμες ημέρες.", + "Add day": "Προσθήκη ημέρας", + "Year": "Έτος", + "Add Dutch national holidays": "Προσθήκη ολλανδικών εθνικών αργιών", + "Save working days": "Αποθήκευση εργάσιμων ημερών", + "Choose at least one working weekday.": "Επιλέξτε τουλάχιστον μία εργάσιμη ημέρα.", + "Working days saved.": "Οι εργάσιμες ημέρες αποθηκεύτηκαν.", + "Could not save the working days.": "Δεν ήταν δυνατή η αποθήκευση των εργάσιμων ημερών.", + "New Year's Day": "Πρωτοχρονιά", + "Easter Sunday": "Κυριακή του Πάσχα", + "Easter Monday": "Δευτέρα του Πάσχα", + "King's Day": "Ημέρα του Βασιλιά", + "Liberation Day": "Ημέρα της Απελευθέρωσης", + "Ascension Day": "Ανάληψη", + "Whit Sunday": "Πεντηκοστή", + "Whit Monday": "Αγίου Πνεύματος", + "Christmas Day": "Χριστούγεννα", + "Boxing Day": "Δεύτερη ημέρα των Χριστουγέννων", + "Dates of {title}": "Ημερομηνίες του {title}", + "The due date cannot be before the start date.": "Η προθεσμία δεν μπορεί να είναι πριν από την ημερομηνία έναρξης.", + "{title}, from {start} to {end}": "{title}, από {start} έως {end}", + "The dates could not be saved.": "Δεν ήταν δυνατή η αποθήκευση των ημερομηνιών.", + "{title} now runs from {start} to {end}": "Το {title} διαρκεί τώρα από {start} έως {end}", + "Auto-scheduling": "Αυτόματος προγραμματισμός", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Όταν είναι ενεργό, η μετάθεση μιας προθεσμίας αργότερα στη χρονογραμμή προτείνει να μετακινηθούν και οι εργασίες που μπλοκάρει.", + "Move blocked tasks along when a task slips": "Μετακίνηση των μπλοκαρισμένων εργασιών όταν μια εργασία καθυστερεί", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Στη χρονογραμμή, μια μεταγενέστερη προθεσμία προτείνει να μετακινηθούν οι μπλοκαρισμένες εργασίες. Μετρούν μόνο οι σύνδεσμοι \"μπλοκάρει\" και οι εργασίες μετακινούνται μόνο αργότερα.", + "Move the tasks that wait for {title}?": "Μετακίνηση των εργασιών που περιμένουν το {title};", + "These tasks wait for it and would start after its new due date:": "Αυτές οι εργασίες την περιμένουν και θα ξεκινούσαν μετά τη νέα προθεσμία:", + "{count} tasks would move; the first {limit} are listed.": "Θα μετακινούνταν {count} εργασίες· εμφανίζονται οι πρώτες {limit}.", + "Now": "Τώρα", + "After the move": "Μετά τη μετακίνηση", + "Only this task": "Μόνο αυτή η εργασία", + "Move all": "Μετακίνηση όλων", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Διακοπή στο {title}: δεν ήταν δυνατή η αποθήκευση των ημερομηνιών. Οι προηγούμενες εργασίες μετακινήθηκαν.", + "Cumulative flow": "Αθροιστική ροή", + "Show as chart": "Εμφάνιση ως γράφημα", + "Show as table": "Εμφάνιση ως πίνακας", + "Tasks per column per day": "Εργασίες ανά στήλη ανά ημέρα", + "Tasks without recorded history in this period: {count}": "Εργασίες χωρίς καταγεγραμμένο ιστορικό σε αυτή την περίοδο: {count}", + "Lead and cycle time": "Χρόνος παράδοσης και χρόνος κύκλου", + "No tasks were finished in this period.": "Δεν ολοκληρώθηκε καμία εργασία σε αυτή την περίοδο.", + "Finished tasks": "Ολοκληρωμένες εργασίες", + "Cycle time, average": "Χρόνος κύκλου, μέσος όρος", + "Cycle time, 85th percentile": "Χρόνος κύκλου, 85ο εκατοστημόριο", + "Lead time, average": "Χρόνος παράδοσης, μέσος όρος", + "Tasks whose finish time was estimated from their history: {count}": "Εργασίες των οποίων ο χρόνος ολοκλήρωσης εκτιμήθηκε από το ιστορικό: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Χρόνος κύκλου κάθε ολοκληρωμένης εργασίας, με τον μέσο όρο και το 85ο εκατοστημόριο", + "Slowest tasks": "Πιο αργές εργασίες", + "cycle {cycle}, lead {lead}": "κύκλος {cycle}, παράδοση {lead}", + "{days} days": "{days} ημέρες", + "Could not load the flow of this project.": "Δεν ήταν δυνατή η φόρτωση της ροής αυτού του έργου.", + "Last {days} days": "Τελευταίες {days} ημέρες", + "Portfolio flow": "Ροή χαρτοφυλακίου", + "An admin adds portfolios under Projects, Portfolios.": "Ένας διαχειριστής προσθέτει χαρτοφυλάκια στα Έργα, Χαρτοφυλάκια.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Έργα που δεν εμφανίζονται, επειδή εμφανίζονται έως 50 κάθε φορά: {count}", + "Could not load the flow of this portfolio.": "Δεν ήταν δυνατή η φόρτωση της ροής αυτού του χαρτοφυλακίου.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Αθροιστική ροή και χρόνος κύκλου στα έργα ενός χαρτοφυλακίου.", + "Edit report": "Επεξεργασία αναφοράς", + "Only tasks where": "Μόνο εργασίες όπου", + "Group by": "Ομαδοποίηση κατά", + "Display": "Εμφάνιση", + "Share with everyone who can read its projects": "Κοινή χρήση με όσους μπορούν να διαβάσουν τα έργα της", + "The report could not be saved.": "Δεν ήταν δυνατή η αποθήκευση της αναφοράς.", + "Number of tasks": "Αριθμός εργασιών", + "Bar": "Ράβδοι", + "Donut": "Δακτύλιος", + "Table": "Πίνακας", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} από {total} έργα αυτής της αναφοράς δεν είναι ορατά σε εσάς", + "No tasks match this report.": "Καμία εργασία δεν ταιριάζει με αυτή την αναφορά.", + "None": "Κανένα", + "Could not load this report.": "Δεν ήταν δυνατή η φόρτωση αυτής της αναφοράς.", + "Report": "Αναφορά", + "Your reports": "Οι αναφορές σας", + "My reports": "Οι αναφορές μου", + "Shared reports": "Κοινόχρηστες αναφορές", + "You have not built a report yet.": "Δεν έχετε δημιουργήσει ακόμη αναφορά.", + "Nobody has shared a report with you yet.": "Κανείς δεν έχει μοιραστεί ακόμη αναφορά μαζί σας.", + "Reports you built over tasks, and the ones shared with you.": "Αναφορές που δημιουργήσατε για εργασίες, και όσες μοιράστηκαν μαζί σας.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Ένα αποθηκευμένο ερώτημα για εργασίες: ποια έργα, ποια φίλτρα, ομαδοποίηση κατά τι, μέτρηση ή άθροισμα, και εμφάνιση ως πίνακας ή γράφημα.", + "The name the report is listed under": "Το όνομα με το οποίο εμφανίζεται η αναφορά", + "What the report shows and who it is for": "Τι δείχνει η αναφορά και για ποιον είναι", + "Nextcloud user id of the person who saved the report": "Αναγνωριστικό χρήστη Nextcloud του ατόμου που αποθήκευσε την αναφορά", + "Who can open the report": "Ποιος μπορεί να ανοίξει την αναφορά", + "Only me": "Μόνο εγώ", + "Everyone who can read its projects": "Όλοι όσοι μπορούν να διαβάσουν τα έργα της", + "The projects the report covers, at most fifty": "Τα έργα που καλύπτει η αναφορά, έως πενήντα", + "Filters": "Φίλτρα", + "Task fields and the value each must equal": "Πεδία εργασίας και η τιμή με την οποία πρέπει να είναι ίσο το καθένα", + "The task field the report groups on": "Το πεδίο εργασίας κατά το οποίο ομαδοποιεί η αναφορά", + "Count the tasks, or add up a number on them": "Μέτρηση των εργασιών ή άθροιση ενός αριθμού τους", + "Sum": "Άθροισμα", + "Sum of": "Άθροισμα του", + "The number added up when the measure is a sum": "Ο αριθμός που αθροίζεται όταν το μέτρο είναι άθροισμα", + "Story points": "Πόντοι ιστορίας", + "Estimated duration": "Εκτιμώμενη διάρκεια", + "How the report is shown": "Πώς εμφανίζεται η αναφορά", + "Issue type": "Τύπος αιτήματος", + "Task fields and the value each must equal; empty when the report covers every task": "Πεδία εργασίας και η τιμή που πρέπει να έχει το καθένα· κενό όταν η αναφορά καλύπτει όλες τις εργασίες", + "The status a task must have": "Η κατάσταση που πρέπει να έχει μια εργασία", + "The priority a task must have": "Η προτεραιότητα που πρέπει να έχει μια εργασία", + "The user a task must be assigned to": "Ο χρήστης στον οποίο πρέπει να έχει ανατεθεί μια εργασία", + "A label a task must carry": "Μια ετικέτα που πρέπει να φέρει μια εργασία", + "The board column a task must be in": "Η στήλη του πίνακα στην οποία πρέπει να βρίσκεται μια εργασία", + "The issue type a task must have": "Ο τύπος αιτήματος που πρέπει να έχει μια εργασία", + "Manager groups": "Ομάδες διαχειριστών", + "Member groups": "Ομάδες μελών", + "Viewer groups": "Ομάδες αναγνωστών", + "Viewers": "Αναγνώστες", + "Owning group": "Ομάδα ιδιοκτήτη", + "Nextcloud groups whose members manage the project": "Ομάδες Nextcloud των οποίων τα μέλη διαχειρίζονται το έργο", + "Nextcloud groups whose members work on the project": "Ομάδες Nextcloud των οποίων τα μέλη δουλεύουν στο έργο", + "Nextcloud groups whose members may read the project": "Ομάδες Nextcloud των οποίων τα μέλη μπορούν να διαβάζουν το έργο", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Χρήστες Nextcloud που διαχειρίζονται το έργο: ρυθμίσεις, μέλη και εργασία", + "Nextcloud user ids who may read the project and its work but not change it": "Χρήστες Nextcloud που μπορούν να διαβάζουν το έργο και την εργασία του αλλά όχι να τα αλλάζουν", + "The Nextcloud group that owns the project with its creator, at most one": "Η ομάδα Nextcloud που κατέχει το έργο μαζί με τον δημιουργό του, το πολύ μία", + "Nextcloud user ids who may read this through the project": "Χρήστες Nextcloud που μπορούν να διαβάζουν αυτό μέσω του έργου", + "Nextcloud groups whose members may change this through the project": "Ομάδες Nextcloud των οποίων τα μέλη μπορούν να αλλάζουν αυτό μέσω του έργου", + "Nextcloud groups whose members may read this through the project": "Ομάδες Nextcloud των οποίων τα μέλη μπορούν να διαβάζουν αυτό μέσω του έργου", + "Search for a person or a group…": "Αναζήτηση ατόμου ή ομάδας…", + "No one found. Your admin's sharing settings decide who you can find.": "Δεν βρέθηκε κανείς. Οι ρυθμίσεις κοινής χρήσης του διαχειριστή σας καθορίζουν ποιους μπορείτε να βρείτε.", + "Type at least two characters": "Πληκτρολογήστε τουλάχιστον δύο χαρακτήρες", + "Everyone in this group": "Όλοι σε αυτή την ομάδα", + "Could not search for people. Please try again.": "Η αναζήτηση ατόμων απέτυχε. Δοκιμάστε ξανά.", + "Could not remove the group": "Δεν ήταν δυνατή η αφαίρεση της ομάδας", + "Only the owner and managers change who is on this project.": "Μόνο ο κάτοχος και οι διαχειριστές αλλάζουν ποιοι συμμετέχουν σε αυτό το έργο.", + "Role of {name}": "Ρόλος: {name}", + "Manager": "Διαχειριστής", + "Member": "Μέλος", + "Viewer": "Αναγνώστης", + "Could not change the role": "Δεν ήταν δυνατή η αλλαγή του ρόλου", + "Owned by group: {name}": "Ιδιοκτησία της ομάδας: {name}", + "No group owns this project.": "Καμία ομάδα δεν κατέχει αυτό το έργο.", + "Owned by group": "Ιδιοκτησία ομάδας", + "Search for a group…": "Αναζήτηση ομάδας…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Δεν βρέθηκε ομάδα. Οι ρυθμίσεις κοινής χρήσης του διαχειριστή σας ορίζουν ποιες ομάδες μπορείτε να βρείτε.", + "No owning group": "Χωρίς ομάδα ιδιοκτήτη", + "Could not search for groups. Please try again.": "Η αναζήτηση ομάδων απέτυχε. Δοκιμάστε ξανά.", + "Could not change the owning group": "Δεν ήταν δυνατή η αλλαγή της ομάδας ιδιοκτήτη", + "You can read this project. Only its members change it.": "Μπορείτε να διαβάσετε αυτό το έργο. Μόνο τα μέλη του το αλλάζουν.", + "Course": "Μάθημα", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Το μάθημα που διδάσκεται σε αυτή την ώρα, για παράδειγμα ένα μάθημα επιλογής, όταν η εκπαιδευτική εφαρμογή του σχολείου το γνωρίζει.", + "Online meeting link": "Σύνδεσμος διαδικτυακού μαθήματος", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Πού συνδέονται οι μαθητές σε αυτό το μάθημα διαδικτυακά. Το κουμπί Συμμετοχή εμφανίζεται μόνο για σύνδεσμο https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/el.json b/l10n/el.json index 640b0094..ea2dd210 100644 --- a/l10n/el.json +++ b/l10n/el.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Ενεργά έργα", + "Archived projects": "Αρχειοθετημένα έργα", + "Boards": "Πίνακες", + "My projects": "Τα έργα μου", + "Portfolio": "Χαρτοφυλάκιο", + "Project board": "Πίνακας έργου", + "Projects I am in": "Έργα στα οποία συμμετέχω", + "Timeline": "Χρονολόγιο", + "Timesheet": "Φύλλο χρόνου", + "Features & roadmap": "Λειτουργίες και οδικός χάρτης", + "Flow": "Ροή", + "Flows": "Ροές", + "Reports": "Αναφορές", + "Pick a report to open it.": "Επιλέξτε μια αναφορά για να την ανοίξετε.", + "In progress": "Σε εξέλιξη", + "Date": "Ημερομηνία", + "Due": "Προθεσμία", + "Assignee": "Ανατέθηκε σε", + "Who": "Ποιος", + "What": "Τι", + "Minutes": "Λεπτά", + "Entries": "Καταχωρίσεις", + "Most recent": "Πιο πρόσφατα", + "Per person": "Ανά άτομο", + "By status": "Ανά κατάσταση", + "By priority": "Ανά προτεραιότητα", + "Task status": "Κατάσταση εργασιών", + "Time spent": "Χρόνος που δαπανήθηκε", + "Capacity": "Χωρητικότητα", + "Due soonest": "Λήγουν πρώτα", + "Minutes logged": "Καταγεγραμμένα λεπτά", + "Nothing is due": "Δεν λήγει τίποτα", + "Nothing logged yet": "Δεν έχει καταγραφεί τίποτα ακόμη", + "What is open, what is blocked, and what is overdue.": "Τι είναι ανοιχτό, τι μπλοκαρισμένο και τι εκπρόθεσμο.", + "How allocation is spread across the people working on projects.": "Πώς κατανέμεται ο φόρτος στα άτομα που εργάζονται σε έργα.", + "Hours logged, and the projects they went to.": "Οι καταγεγραμμένες ώρες και τα έργα στα οποία πήγαν.", + "Billable": "Χρεώσιμο", + "Budget: {amount}": "Προϋπολογισμός: {amount}", + "Loading projects": "Φόρτωση έργων", + "No projects for this client yet": "Δεν υπάρχουν ακόμη έργα για αυτόν τον πελάτη", + "Open in Planninq": "Άνοιγμα στο Planninq", + "This project could not be found": "Αυτό το έργο δεν βρέθηκε", + "Untitled project": "Έργο χωρίς τίτλο", + "and {count} more": "και {count} ακόμη", + "Store": "Κατάστημα", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Εγκαταστήστε μητρώα, σχήματα και ροές που έχουν δημοσιεύσει άλλοι οργανισμοί.", + "Work Date": "Ημερομηνία εργασίας", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Ενέργειες στήλης", + "Columns": "Στήλες", + "Could not remove the column. Please try again.": "Δεν ήταν δυνατή η αφαίρεση της στήλης. Δοκιμάστε ξανά.", + "Could not save the column. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της στήλης. Δοκιμάστε ξανά.", + "Done column": "Στήλη ολοκληρωμένων", + "Edit column": "Επεξεργασία στήλης", + "Keep the card's status": "Διατήρηση της κατάστασης της κάρτας", + "Move its cards to": "Μετακίνηση των καρτών της σε", + "Move left": "Μετακίνηση αριστερά", + "Move right": "Μετακίνηση δεξιά", + "Status of cards moved here": "Κατάσταση καρτών που μετακινούνται εδώ", + "The last done column cannot be removed.": "Η τελευταία στήλη ολοκληρωμένων δεν μπορεί να αφαιρεθεί.", + "WIP limit": "Όριο WIP", + "over limit": "πάνω από το όριο", + "The status a card gets when it is moved into this column.": "Η κατάσταση που παίρνει μια κάρτα όταν μετακινείται σε αυτή τη στήλη.", + "All priorities": "Όλες οι προτεραιότητες", + "Could not create the task. Please try again.": "Δεν ήταν δυνατή η δημιουργία της εργασίας. Δοκιμάστε ξανά.", + "Created": "Δημιουργήθηκε", + "Move to backlog": "Στο backlog", + "Move to board": "Στον πίνακα", + "New task": "Νέα εργασία", + "Nothing in the backlog": "Τίποτα στο backlog", + "Rank": "Κατάταξη", + "Sort by": "Ταξινόμηση κατά", + "Sort by rank to reorder": "Ταξινομήστε κατά κατάταξη για αναδιάταξη", + "Task actions": "Ενέργειες εργασίας", + "All labels": "Όλες οι ετικέτες", + "Filter tasks by label": "Φιλτράρισμα εργασιών κατά ετικέτα", + "View timeline": "Προβολή χρονολογίου", + "Board": "Πίνακας", + "List": "Λίστα", + "Column": "Στήλη", + "Board or list": "Πίνακας ή λίστα", + "Log": "Ημερολόγιο", + "Add entry": "Προσθήκη καταχώρισης", + "Show": "Εμφάνιση", + "No actions yet": "Δεν υπάρχουν ακόμη ενέργειες", + "Closed": "Κλειστό", + "Entry actions": "Ενέργειες καταχώρισης", + "Add action": "Προσθήκη ενέργειας", + "by {author}": "από {author}", + "saved {time}": "αποθηκεύτηκε {time}", + "Attendees: {names}": "Συμμετέχοντες: {names}", + "Add the first entry": "Προσθήκη της πρώτης καταχώρισης", + "Issues": "Ζητήματα", + "Lessons learned": "Διδάγματα", + "Meetings": "Συσκέψεις", + "Decisions": "Αποφάσεις", + "Actions": "Ενέργειες", + "Issue": "Ζήτημα", + "Lesson learned": "Δίδαγμα", + "Meeting": "Σύσκεψη", + "Decision": "Απόφαση", + "About this project": "Σχετικά με το έργο", + "No description yet": "Δεν υπάρχει ακόμη περιγραφή", + "Start date": "Ημερομηνία έναρξης", + "Not set": "Δεν έχει οριστεί", + "End date": "Ημερομηνία λήξης", + "Progress": "Πρόοδος", + "No tasks yet": "Δεν υπάρχουν ακόμη εργασίες", + "Open the board": "Άνοιγμα πίνακα", + "People": "Άτομα", + "Owner": "Κάτοχος", + "Latest log entries": "Πιο πρόσφατες καταχωρίσεις", + "Open the log": "Άνοιγμα ημερολογίου", + "{done} of {total} tasks done": "{done} από {total} εργασίες ολοκληρώθηκαν", + "Edit entry": "Επεξεργασία καταχώρισης", + "Type": "Είδος", + "Attendees": "Συμμετέχοντες", + "Issue is closed": "Το ζήτημα έκλεισε", + "Could not save the entry. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της καταχώρισης. Δοκιμάστε ξανά.", + "From: {title}": "Από: {title}", + "What needs to happen": "Τι πρέπει να γίνει", + "Could not create the action. Please try again.": "Δεν ήταν δυνατή η δημιουργία της ενέργειας. Δοκιμάστε ξανά.", + "The action was created but could not be linked to the entry.": "Η ενέργεια δημιουργήθηκε, αλλά δεν ήταν δυνατή η σύνδεσή της με την καταχώριση.", + "Project pages": "Σελίδες έργου", + "Overview": "Επισκόπηση", + "Risks": "Κίνδυνοι", + "Log entry": "Καταχώριση ημερολογίου", + "A short name for the entry": "Ένα σύντομο όνομα για την καταχώριση", + "Project": "Έργο", + "The project this entry belongs to": "Το έργο στο οποίο ανήκει η καταχώριση", + "What kind of entry this is": "Τι είδους καταχώριση είναι", + "When it happened": "Πότε συνέβη", + "What happened, in Markdown": "Τι συνέβη, σε Markdown", + "Whether an issue is still open": "Αν ένα ζήτημα είναι ακόμη ανοιχτό", + "The people at a meeting": "Τα άτομα σε μια σύσκεψη", + "Tasks that came out of this entry": "Εργασίες που προέκυψαν από αυτή την καταχώριση", + "Add risk": "Προσθήκη κινδύνου", + "Risk": "Κίνδυνος", + "Score": "Βαθμολογία", + "Response": "Αντιμετώπιση", + "Review date": "Ημερομηνία επανεξέτασης", + "no longer on the project": "δεν είναι πλέον στο έργο", + "Edit {title}": "Επεξεργασία {title}", + "No risks recorded yet": "Δεν έχουν καταγραφεί ακόμη κίνδυνοι", + "Add the first risk": "Προσθήκη του πρώτου κινδύνου", + "Medium": "Μεσαίος", + "Mitigating": "Σε μετριασμό", + "Occurred": "Επήλθε", + "Avoid": "Αποφυγή", + "Reduce": "Μείωση", + "Transfer": "Μεταφορά", + "Accept": "Αποδοχή", + "Highest open risks": "Υψηλότεροι ανοιχτοί κίνδυνοι", + "No open risks": "Δεν υπάρχουν ανοιχτοί κίνδυνοι", + "Open the risk register": "Άνοιγμα μητρώου κινδύνων", + "Edit risk": "Επεξεργασία κινδύνου", + "What could go wrong": "Τι μπορεί να πάει στραβά", + "Likelihood": "Πιθανότητα", + "Impact": "Επίπτωση", + "Score {score}": "Βαθμολογία {score}", + "Countermeasures": "Αντίμετρα", + "Could not save the risk. Please try again.": "Δεν ήταν δυνατή η αποθήκευση του κινδύνου. Δοκιμάστε ξανά.", + "Risks by likelihood and impact": "Κίνδυνοι ανά πιθανότητα και επίπτωση", + "Risk scale": "Κλίμακα κινδύνου", + "The levels every project scores its risks on, and where low turns into medium and high": "Τα επίπεδα στα οποία κάθε έργο βαθμολογεί τους κινδύνους του, και πού το χαμηλό γίνεται μεσαίο και υψηλό", + "Number of levels": "Αριθμός επιπέδων", + "Likelihood labels": "Ετικέτες πιθανότητας", + "Impact labels": "Ετικέτες επίπτωσης", + "Level {level}": "Επίπεδο {level}", + "Medium from score": "Μεσαίο από βαθμολογία", + "High from score": "Υψηλό από βαθμολογία", + "Risk scale saved": "Η κλίμακα κινδύνου αποθηκεύτηκε", + "1 risk uses level {level}. Change it first.": "1 κίνδυνος χρησιμοποιεί το επίπεδο {level}. Αλλάξτε τον πρώτα.", + "{count} risks use level {level}. Change them first.": "{count} κίνδυνοι χρησιμοποιούν το επίπεδο {level}. Αλλάξτε τους πρώτα.", + "Every level needs a label, and high must start above medium.": "Κάθε επίπεδο χρειάζεται ετικέτα, και το υψηλό πρέπει να ξεκινά πάνω από το μεσαίο.", + "The project this risk belongs to": "Το έργο στο οποίο ανήκει ο κίνδυνος", + "The cause and the effect, in Markdown": "Η αιτία και το αποτέλεσμα, σε Markdown", + "Category": "Κατηγορία", + "A free grouping, such as planning, budget or supplier": "Ελεύθερη ομαδοποίηση, όπως χρονοπρογραμματισμός, προϋπολογισμός ή προμηθευτής", + "How likely it is, on the admin's risk scale": "Πόσο πιθανό είναι, στην κλίμακα κινδύνου του διαχειριστή", + "How hard it would hit, on the admin's risk scale": "Πόσο σκληρά θα έπληττε, στην κλίμακα κινδύνου του διαχειριστή", + "Likelihood times impact, calculated by the server": "Πιθανότητα επί επίπτωση, υπολογισμένη από τον διακομιστή", + "Where the risk stands": "Πού βρίσκεται ο κίνδυνος", + "The person who watches this risk": "Το άτομο που παρακολουθεί τον κίνδυνο", + "How the project answers the risk": "Πώς απαντά το έργο στον κίνδυνο", + "What is done to prevent it or soften it, in Markdown": "Τι γίνεται για να αποτραπεί ή να μετριαστεί, σε Markdown", + "When to look at this risk again": "Πότε να επανεξεταστεί ο κίνδυνος", + "Very low": "Πολύ χαμηλό", + "Very high": "Πολύ υψηλό", + "All projects": "Όλα τα έργα", + "Project status report": "Αναφορά κατάστασης έργου", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Χρονολογημένη αναφορά για το πώς πάει ένα έργο σε χρήματα, οργάνωση, χρόνο, πληροφόρηση, ποιότητα και κίνδυνο (οι πτυχές GROTIK), η καθεμία με σημείωση.", + "The project this report is about": "Το έργο στο οποίο αφορά η αναφορά", + "Report date": "Ημερομηνία αναφοράς", + "The day the report describes": "Η ημέρα που περιγράφει η αναφορά", + "Money": "Χρήματα", + "How the project stands on this aspect": "Πώς πάει το έργο σε αυτή την πτυχή", + "On track": "Εντός πορείας", + "At risk": "Σε κίνδυνο", + "Off track": "Εκτός πορείας", + "Money note": "Σημείωση για τα χρήματα", + "A short explanation of this status": "Σύντομη εξήγηση αυτής της κατάστασης", + "Organisation": "Οργάνωση", + "Organisation note": "Σημείωση για την οργάνωση", + "Time": "Χρόνος", + "Time note": "Σημείωση για τον χρόνο", + "Information": "Πληροφόρηση", + "Information note": "Σημείωση για την πληροφόρηση", + "Quality": "Ποιότητα", + "Quality note": "Σημείωση για την ποιότητα", + "Risk note": "Σημείωση για τον κίνδυνο", + "Overall": "Συνολικά", + "The worst of the six statuses, calculated by the server": "Η χειρότερη από τις έξι καταστάσεις, υπολογίζεται από τον διακομιστή", + "Health: money": "Υγεία: χρήματα", + "Copied from the newest status report": "Αντιγράφεται από την πιο πρόσφατη αναφορά κατάστασης", + "Health: organisation": "Υγεία: οργάνωση", + "Health: time": "Υγεία: χρόνος", + "Health: information": "Υγεία: πληροφόρηση", + "Health: quality": "Υγεία: ποιότητα", + "Health: risk": "Υγεία: κίνδυνος", + "Health: overall": "Υγεία: συνολικά", + "Health: report date": "Υγεία: ημερομηνία αναφοράς", + "The date of the newest status report": "Η ημερομηνία της πιο πρόσφατης αναφοράς κατάστασης", + "New report": "Νέα αναφορά", + "Only the project owner writes status reports.": "Μόνο ο κάτοχος του έργου γράφει αναφορές κατάστασης.", + "Latest report, {date}": "Τελευταία αναφορά, {date}", + "Aspect": "Πτυχή", + "Note": "Σημείωση", + "Report history": "Ιστορικό αναφορών", + "Author": "Συντάκτης", + "No status reports yet": "Δεν υπάρχουν ακόμη αναφορές κατάστασης", + "Write the first report": "Γράψτε την πρώτη αναφορά", + "Choose a status for every aspect to save the report.": "Επιλέξτε κατάσταση για κάθε πτυχή για να αποθηκεύσετε την αναφορά.", + "Suggested: on track.": "Πρόταση: εντός πορείας.", + "Suggested: at risk.": "Πρόταση: σε κίνδυνο.", + "Suggested: off track.": "Πρόταση: εκτός πορείας.", + "1 task is past its due date.": "1 εργασία έχει περάσει την προθεσμία της.", + "{count} tasks are past their due date.": "Εργασίες εκτός προθεσμίας: {count}.", + "The end date has passed with 1 open task.": "Η ημερομηνία λήξης πέρασε με 1 ανοιχτή εργασία.", + "The end date has passed with {count} open tasks.": "Η ημερομηνία λήξης πέρασε, ανοιχτές εργασίες: {count}.", + "No open task is past its due date.": "Καμία ανοιχτή εργασία δεν έχει περάσει την προθεσμία της.", + "The highest open risk, \"{title}\", scores {score}.": "Ο υψηλότερος ανοιχτός κίνδυνος, «{title}», έχει βαθμό {score}.", + "There are no open risks.": "Δεν υπάρχουν ανοιχτοί κίνδυνοι.", + "Costs are at {percent}% of the budget.": "Το κόστος είναι στο {percent}% του προϋπολογισμού.", + "No suggestion: the project has no budget.": "Καμία πρόταση: το έργο δεν έχει προϋπολογισμό.", + "No suggestion: no costs are recorded for this project yet.": "Καμία πρόταση: δεν έχει καταγραφεί ακόμη κόστος για αυτό το έργο.", + "The report was not saved. Only the project owner can write status reports.": "Η αναφορά δεν αποθηκεύτηκε. Μόνο ο κάτοχος του έργου μπορεί να γράφει αναφορές κατάστασης.", + "No report": "Καμία αναφορά", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Ομάδα έργων που διευθύνουν τα ίδια άτομα, όπως ένα τμήμα ή ένα πρόγραμμα. Οι υπεύθυνοί της διαβάζουν κάθε έργο της.", + "The name of the portfolio": "Το όνομα του χαρτοφυλακίου", + "What the portfolio holds and who runs it": "Τι περιέχει το χαρτοφυλάκιο και ποιος το διευθύνει", + "A colour for the portfolio's section in project lists": "Ένα χρώμα για την ενότητα του χαρτοφυλακίου στις λίστες έργων", + "Managers": "Υπεύθυνοι", + "Nextcloud user UIDs of the people who run the portfolio": "Αναγνωριστικά χρηστών Nextcloud των ατόμων που διευθύνουν το χαρτοφυλάκιο", + "Order": "Σειρά", + "Where the portfolio comes in project lists, lowest first": "Η θέση του χαρτοφυλακίου στις λίστες έργων, πρώτα το χαμηλότερο", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Η δική του κλίμακα κινδύνου αυτού του χαρτοφυλακίου σε JSON, στην ίδια μορφή με την κλίμακα όλης της εφαρμογής. Κενό σημαίνει την κλίμακα της εφαρμογής.", + "Portfolio readers": "Αναγνώστες χαρτοφυλακίου", + "Nextcloud user UIDs of the managers of the project's portfolio": "Αναγνωριστικά χρηστών Nextcloud των υπευθύνων του χαρτοφυλακίου του έργου", + "The portfolio this project belongs to": "Το χαρτοφυλάκιο στο οποίο ανήκει το έργο", + "No portfolio": "Χωρίς χαρτοφυλάκιο", + "All portfolios": "Όλα τα χαρτοφυλάκια", + "You read this project as a manager of its portfolio. Only its members change it.": "Διαβάζετε αυτό το έργο ως υπεύθυνος του χαρτοφυλακίου του. Μόνο τα μέλη του το αλλάζουν.", + "Portfolios": "Χαρτοφυλάκια", + "Portfolio status": "Κατάσταση χαρτοφυλακίου", + "No portfolios yet": "Δεν υπάρχουν ακόμη χαρτοφυλάκια", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Ένας διαχειριστής προσθέτει χαρτοφυλάκια στα Έργα, Χαρτοφυλάκια. Τα έργα ενός χαρτοφυλακίου εμφανίζονται εδώ με την κατάστασή τους.", + "Roll-up": "Σύνοψη", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} εντός πορείας, {atRisk} σε κίνδυνο, {offTrack} εκτός πορείας, {noReport} χωρίς αναφορά", + "No project in this portfolio that you can read.": "Κανένα έργο σε αυτό το χαρτοφυλάκιο που μπορείτε να διαβάσετε.", + "Start": "Έναρξη", + "End": "Λήξη", + "Budget": "Προϋπολογισμός", + "Last report": "Τελευταία αναφορά", + "Out of date": "Παρωχημένη", + "Portfolio timeline": "Χρονολόγιο χαρτοφυλακίου", + "Zoom": "Εστίαση", + "Could not load the timeline": "Δεν ήταν δυνατή η φόρτωση του χρονολογίου", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Ένας διαχειριστής προσθέτει χαρτοφυλάκια στα Έργα, Χαρτοφυλάκια. Τα έργα ενός χαρτοφυλακίου εμφανίζονται εδώ σε ένα χρονολόγιο.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Ανοίξτε ένα έργο για να δείτε τις φάσεις και τις εργασίες του. Το χρονολόγιο είναι μόνο για ανάγνωση.", + "Phase: {title}": "Φάση: {title}", + "Left out because you cannot read them: {count} projects": "Παραλείφθηκαν επειδή δεν μπορείτε να τα διαβάσετε: {count} έργα", + "Week": "Εβδομάδα", + "Day": "Ημέρα", + "Month": "Μήνας", + "Please try again later.": "Δοκιμάστε ξανά αργότερα.", + "Status reports": "Αναφορές κατάστασης", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Μετά από πόσες ημέρες η τελευταία αναφορά κατάστασης ενός έργου σημειώνεται ως παρωχημένη στην επισκόπηση χαρτοφυλακίου", + "Reporting period (days)": "Περίοδος αναφοράς (ημέρες)", + "The reporting period is a whole number of days from 1 to 365.": "Η περίοδος αναφοράς είναι ακέραιος αριθμός ημερών από 1 έως 365.", + "Reporting period saved": "Η περίοδος αναφοράς αποθηκεύτηκε", + "The reporting period was not saved. Please try again.": "Η περίοδος αναφοράς δεν αποθηκεύτηκε. Δοκιμάστε ξανά.", + "Every project of a portfolio with its status per aspect, rolled up.": "Κάθε έργο ενός χαρτοφυλακίου με την κατάστασή του ανά πτυχή, συνοπτικά.", + "The projects of a portfolio on one timeline.": "Τα έργα ενός χαρτοφυλακίου σε ένα χρονολόγιο.", + "Phases": "Φάσεις", + "Add phase": "Προσθήκη φάσης", + "No phases yet": "Δεν υπάρχουν ακόμη φάσεις", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Χωρίστε το έργο σε φάσεις, όπως έναρξη, καθορισμός και υλοποίηση. Μια φάση κλείνει μόλις ανέβει το έγγραφο ολοκλήρωσής της.", + "{hours} hours": "{hours} ώρες", + "Concluding document: {title}": "Έγγραφο ολοκλήρωσης: {title}", + "Concluding document missing": "Λείπει το έγγραφο ολοκλήρωσης", + "Move {title} up": "Μετακίνηση {title} πάνω", + "Move {title} down": "Μετακίνηση {title} κάτω", + "Close phase": "Κλείσιμο φάσης", + "Phase": "Φάση", + "Files": "Αρχεία", + "Notes": "Σημειώσεις", + "Audit trail": "Ίχνος ελέγχου", + "Edit phase": "Επεξεργασία φάσης", + "Name": "Όνομα", + "Budget hours": "Ώρες προϋπολογισμού", + "Could not save the phase. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της φάσης. Δοκιμάστε ξανά.", + "Close phase {title}": "Κλείσιμο της φάσης {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Μια φάση κλείνει με το έγγραφο ολοκλήρωσής της: ανεβάστε το εδώ ή επιλέξτε ένα από τα αρχεία της φάσης.", + "Concluding document": "Έγγραφο ολοκλήρωσης", + "This phase has no files yet.": "Αυτή η φάση δεν έχει ακόμη αρχεία.", + "Upload a document": "Ανέβασμα εγγράφου", + "The document was not uploaded. Please try again.": "Το έγγραφο δεν ανέβηκε. Δοκιμάστε ξανά.", + "Upload the concluding document before you close this phase.": "Ανεβάστε το έγγραφο ολοκλήρωσης πριν κλείσετε αυτή τη φάση.", + "This phase cannot be closed from its current status.": "Αυτή η φάση δεν μπορεί να κλείσει από την τρέχουσα κατάστασή της.", + "The phase was not closed. Please try again.": "Η φάση δεν έκλεισε. Δοκιμάστε ξανά.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Το αναγνωριστικό του αρχείου αυτής της φάσης που την ολοκληρώνει. Η φάση μπορεί να ολοκληρωθεί μόνο όταν έχει οριστεί και το αρχείο είναι συνημμένο.", + "Import from Microsoft Project": "Εισαγωγή από το Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Επιλέξτε ένα σχέδιο αποθηκευμένο από το Microsoft Project σε μορφή XML. Τίποτα δεν εισάγεται μέχρι να επιβεβαιώσετε.", + "Plan file": "Αρχείο σχεδίου", + "What the import creates": "Τι δημιουργεί η εισαγωγή", + "Tasks": "Εργασίες", + "Sub-tasks": "Υποεργασίες", + "Milestones": "Ορόσημα", + "Links": "Συνδέσεις", + "Already imported, updated in place: {count}": "Ήδη εισηγμένα, ενημερωμένα επί τόπου: {count}", + "What does not carry over": "Τι δεν μεταφέρεται", + "Tasks with resources, which are not imported: {count}": "Εργασίες με πόρους, που δεν εισάγονται: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Εργασίες βαθύτερα από το επίπεδο 3, τοποθετημένες κάτω από την εργασία επιπέδου 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Συνδέσεις εκτός τέλους-έναρξης, εισηγμένες ως σχετικές συνδέσεις: {count}", + "Link lags, which are dropped: {count}": "Καθυστερήσεις συνδέσεων, που παραλείπονται: {count}", + "Links to a summary task, which are not imported: {count}": "Συνδέσεις με συνοπτική εργασία, που δεν εισάγονται: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Συνδέσεις με εργασίες εκτός αυτού του σχεδίου, που δεν εισάγονται: {count}", + "No longer in the plan": "Όχι πια στο σχέδιο", + "These stay in the project; remove them yourself if they are no longer needed.": "Παραμένουν στο έργο· αφαιρέστε τα εσείς αν δεν χρειάζονται πια.", + "Import": "Εισαγωγή", + "Close": "Κλείσιμο", + "The plan is imported: {created} created, {updated} updated.": "Το σχέδιο εισήχθη: {created} δημιουργήθηκαν, {updated} ενημερώθηκαν.", + "Links that would close a loop were left out: {count}": "Οι συνδέσεις που θα έκλειναν βρόχο παραλείφθηκαν: {count}", + "The import stopped part-way. Run it again to finish it.": "Η εισαγωγή σταμάτησε στη μέση. Εκτελέστε την ξανά για να ολοκληρωθεί.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Αποθηκεύστε το σχέδιο στο Microsoft Project με Αρχείο, Αποθήκευση ως, μορφή XML, και εισαγάγετε εκείνο το αρχείο.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Αυτό το αρχείο δηλώνει DOCTYPE ή οντότητες, που δεν γίνονται δεκτές.", + "The file is larger than 10 MB.": "Το αρχείο είναι μεγαλύτερο από 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Το σχέδιο έχει πάνω από 2.000 εργασίες, περισσότερες από όσες δέχεται μία εισαγωγή.", + "This file is not a Microsoft Project plan in XML format.": "Αυτό το αρχείο δεν είναι σχέδιο Microsoft Project σε μορφή XML.", + "Choose a file to import.": "Επιλέξτε ένα αρχείο για εισαγωγή.", + "Only the project owner can import a plan.": "Μόνο ο κάτοχος του έργου μπορεί να εισαγάγει σχέδιο.", + "The plan could not be read. Please try again.": "Δεν ήταν δυνατή η ανάγνωση του σχεδίου. Δοκιμάστε ξανά.", + "Linked case: {title}": "Συνδεδεμένη υπόθεση: {title}", + "Linked to a case": "Συνδεδεμένο με υπόθεση", + "Hand over to case": "Παράδοση στην υπόθεση", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Αντιγράφει αναλλοίωτο κάθε αρχείο του έργου και των εργασιών του, και ένα αρχείο που περιγράφει το έργο, στη συνδεδεμένη υπόθεση.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Αρχεία που αντιγράφηκαν: {count}", + "Files that failed: {names}": "Αρχεία που απέτυχαν: {names}", + "The handover failed. Please try again.": "Η παράδοση απέτυχε. Δοκιμάστε ξανά.", + "The linked case could not be found, or you cannot open it.": "Η συνδεδεμένη υπόθεση δεν βρέθηκε ή δεν μπορείτε να την ανοίξετε.", + "Case handovers": "Παραδόσεις στην υπόθεση", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Κάθε παράδοση των αρχείων και μεταδεδομένων του έργου στην υπόθεσή του: πότε, από ποιον, σε ποια υπόθεση, κάθε αρχείο που αντιγράφηκε με το SHA-256 του και τα αρχεία που απέτυχαν.", + "Finance": "Οικονομικά", + "Add cost line": "Προσθήκη γραμμής κόστους", + "Delivery terms": "Όροι παράδοσης", + "Billing model": "Μοντέλο χρέωσης", + "Budget in euro": "Προϋπολογισμός σε ευρώ", + "Budget in hours": "Προϋπολογισμός σε ώρες", + "Hourly rate in euro": "Ωριαία χρέωση σε ευρώ", + "Planned start": "Προγραμματισμένη έναρξη", + "Planned end": "Προγραμματισμένη λήξη", + "Planned dates": "Προγραμματισμένες ημερομηνίες", + "Budget {amount}": "Προϋπολογισμός {amount}", + "No budget agreed": "Δεν έχει συμφωνηθεί προϋπολογισμός", + "Hours": "Ώρες", + "Only the project owner and the portfolio managers see the amounts.": "Τα ποσά τα βλέπουν μόνο ο κάτοχος του έργου και οι διαχειριστές του χαρτοφυλακίου.", + "Budget against cost per category": "Προϋπολογισμός έναντι κόστους ανά κατηγορία", + "Labour (booked time)": "Εργασία (καταγεγραμμένος χρόνος)", + "No category": "Χωρίς κατηγορία", + "Hours are not available": "Οι ώρες δεν είναι διαθέσιμες", + "Not yet assigned to a category": "Δεν έχει αντιστοιχιστεί ακόμη σε κατηγορία", + "Total": "Σύνολο", + "{spent} spent, {remaining} remaining": "{spent} δαπανήθηκαν, {remaining} απομένουν", + "Budget against cost per phase": "Προϋπολογισμός έναντι κόστους ανά φάση", + "No phase": "Χωρίς φάση", + "Cost lines": "Γραμμές κόστους", + "From the finance system": "Από το οικονομικό σύστημα", + "Edit cost line {amount}": "Επεξεργασία της γραμμής κόστους {amount}", + "No cost lines yet": "Δεν υπάρχουν ακόμη γραμμές κόστους", + "Commitments": "Δεσμεύσεις", + "Actual cost": "Πραγματικό κόστος", + "Forecast": "Πρόβλεψη", + "Remaining": "Υπόλοιπο", + "Not planned yet": "Δεν έχει προγραμματιστεί ακόμη", + "{start} to {end}": "{start} έως {end}", + "The terms were not saved. Please try again.": "Οι όροι δεν αποθηκεύτηκαν. Δοκιμάστε ξανά.", + "Terms saved": "Οι όροι αποθηκεύτηκαν", + "Fixed price": "Σταθερή τιμή", + "Hourly": "Ανά ώρα", + "Not billed": "Χωρίς χρέωση", + "Commitment": "Δέσμευση", + "Edit cost line": "Επεξεργασία γραμμής κόστους", + "Kind": "Είδος", + "Amount in euro": "Ποσό σε ευρώ", + "Remove": "Αφαίρεση", + "Could not save the cost line. Only the project owner changes the money of a project.": "Η γραμμή κόστους δεν αποθηκεύτηκε. Μόνο ο κάτοχος του έργου αλλάζει τα χρήματα ενός έργου.", + "Could not remove the cost line. Please try again.": "Η γραμμή κόστους δεν αφαιρέθηκε. Δοκιμάστε ξανά.", + "{amount} over budget": "{amount} πάνω από τον προϋπολογισμό", + "Cost categories": "Κατηγορίες κόστους", + "The categories every project splits its budget and costs into, one per line": "Οι κατηγορίες στις οποίες κάθε έργο χωρίζει τον προϋπολογισμό και το κόστος του, μία ανά γραμμή", + "Categories": "Κατηγορίες", + "Give at least one category, each name once.": "Δώστε τουλάχιστον μία κατηγορία, κάθε όνομα μία φορά.", + "Cost categories saved": "Οι κατηγορίες κόστους αποθηκεύτηκαν", + "The cost categories were not saved. Please try again.": "Οι κατηγορίες κόστους δεν αποθηκεύτηκαν. Δοκιμάστε ξανά.", + "Finance line": "Οικονομική γραμμή", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Ένα χρηματικό ποσό ενός έργου: προϋπολογισμός, δέσμευση, πραγματικό κόστος ή πρόβλεψη, σε κατηγορία κόστους και προαιρετικά σε φάση. Καταχωρείται από τον κάτοχο του έργου ή αποστέλλεται από το οικονομικό σύστημα μέσω της εφαρμογής ενσωμάτωσης.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Το έργο στο οποίο ανήκει το ποσό. Κενό για γραμμή του οικονομικού συστήματος της οποίας ο αριθμός έργου δεν αντιστοιχεί σε κανένα έργο.", + "The phase this amount belongs to, if any": "Η φάση στην οποία ανήκει το ποσό, αν υπάρχει", + "The cost category, one of the categories the admin set up": "Η κατηγορία κόστους, μία από τις κατηγορίες που όρισε ο διαχειριστής", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Αν το ποσό είναι προϋπολογισμός, δέσμευση, πραγματικό κόστος ή πρόβλεψη", + "Amount": "Ποσό", + "The amount in the reporting currency (euro)": "Το ποσό στο νόμισμα αναφοράς (ευρώ)", + "The date the amount was booked or is expected": "Η ημερομηνία που καταχωρήθηκε ή αναμένεται το ποσό", + "What the amount is for": "Για τι είναι το ποσό", + "Whether a person entered the line or the finance system sent it": "Αν τη γραμμή την καταχώρησε άτομο ή την έστειλε το οικονομικό σύστημα", + "Entered by hand": "Καταχωρήθηκε με το χέρι", + "Finance line id": "Αναγνωριστικό οικονομικής γραμμής", + "The finance system's own id of this line. One imported line per id.": "Το δικό της αναγνωριστικό της γραμμής στο οικονομικό σύστημα. Μία εισαγόμενη γραμμή ανά αναγνωριστικό.", + "Project number": "Αριθμός έργου", + "The project number the finance system sent, matched against the project key": "Ο αριθμός έργου που έστειλε το οικονομικό σύστημα, σε σύγκριση με το κλειδί του έργου", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Το χαρτοφυλάκιο του έργου της γραμμής, αντιγραμμένο από το έργο ώστε τα σύνολα του χαρτοφυλακίου να χρειάζονται ένα φίλτρο", + "Finance readers": "Αναγνώστες οικονομικών", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID χρηστών Nextcloud των ατόμων που μπορούν να δουν το ποσό: ο κάτοχος του έργου και οι διαχειριστές του χαρτοφυλακίου του", + "Project owner": "Κάτοχος έργου", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID χρήστη Nextcloud του κατόχου του έργου, που μπορεί να αλλάζει και να αφαιρεί χειροκίνητες γραμμές", + "How the client pays: not billed, a fixed price, or by the hour.": "Πώς πληρώνει ο πελάτης: χωρίς χρέωση, σταθερή τιμή ή ανά ώρα.", + "Portfolio finance": "Οικονομικά χαρτοφυλακίου", + "You cannot see the money of any project in this portfolio": "Δεν μπορείτε να δείτε τα χρήματα κανενός έργου αυτού του χαρτοφυλακίου", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Ο διακομιστής επέστρεψε γραμμές κόστους έργων εκτός αυτού του χαρτοφυλακίου, άρα τα σύνολα μπορεί να είναι λάθος.", + "Projects left out because you cannot see their money: {count}": "Έργα που παραλείφθηκαν επειδή δεν βλέπετε τα χρήματά τους: {count}", + "Unmatched finance lines": "Μη αντιστοιχισμένες οικονομικές γραμμές", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Προϋπολογισμός, δεσμεύσεις, πραγματικό κόστος και πρόβλεψη αθροισμένα για ένα χαρτοφυλάκιο.", + "Subprojects": "Υποέργα", + "{done} of {total}": "{done} από {total}", + "{done} of {total} tasks done, including subprojects": "{done} από {total} εργασίες ολοκληρώθηκαν, μαζί με τα υποέργα", + "Show the subprojects of {title}": "Εμφάνιση των υποέργων του {title}", + "Hide the subprojects of {title}": "Απόκρυψη των υποέργων του {title}", + "Part of": "Μέρος του", + "No parent project": "Χωρίς γονικό έργο", + "A project cannot sit under one of its own subprojects.": "Ένα έργο δεν μπορεί να βρίσκεται κάτω από ένα από τα δικά του υποέργα.", + "Projects nest three levels deep at most: programme, project and subproject.": "Τα έργα εμφωλεύονται έως τρία επίπεδα: πρόγραμμα, έργο και υποέργο.", + "Parent project": "Γονικό έργο", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Το έργο κάτω από το οποίο βρίσκεται αυτό το έργο, όπως ένα πρόγραμμα. Τα έργα εμφωλεύονται έως τρία επίπεδα.", + "Yes": "Ναι", + "No": "Όχι", + "{label} (required)": "{label} (υποχρεωτικό)", + "{label} is required": "Το {label} είναι υποχρεωτικό", + "Project field": "Πεδίο έργου", + "A field an admin adds to every project, such as a policy area or a contract value.": "Ένα πεδίο που προσθέτει ένας διαχειριστής σε κάθε έργο, όπως τομέας πολιτικής ή αξία σύμβασης.", + "Key": "Κλειδί", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Το σταθερό όνομα με το οποίο αποθηκεύεται η τιμή, σε lower camel case. Κρατήστε το όταν το χρησιμοποιούν έργα.", + "Label": "Ετικέτα", + "The name people see next to the field": "Το όνομα που βλέπουν οι χρήστες δίπλα στο πεδίο", + "What the field holds": "Τι περιέχει το πεδίο", + "Text": "Κείμενο", + "Number": "Αριθμός", + "Choice": "Επιλογή", + "Person": "Πρόσωπο", + "Yes or no": "Ναι ή όχι", + "Options": "Επιλογές", + "The choices of a choice field": "Οι επιλογές ενός πεδίου επιλογής", + "Required": "Υποχρεωτικό", + "Whether a project must fill in the field": "Αν ένα έργο πρέπει να συμπληρώσει το πεδίο", + "Where the field appears, lowest first": "Πού εμφανίζεται το πεδίο, το μικρότερο πρώτα", + "Applies to": "Ισχύει για", + "What the field is added to": "Σε τι προστίθεται το πεδίο", + "Custom fields": "Δικά σας πεδία", + "The values of the project fields an admin defined, keyed by the field's key.": "Οι τιμές των πεδίων έργου που όρισε ένας διαχειριστής, ανά κλειδί πεδίου.", + "Project fields": "Πεδία έργου", + "Related": "Σχετικές", + "Remove link": "Αφαίρεση σύνδεσης", + "Link type": "Είδος σύνδεσης", + "Relates to": "Σχετίζεται με", + "Duplicates": "Αντιγράφει", + "Project key": "Κλειδί έργου", + "Every task number starts with it, such as VERG-42.": "Κάθε αριθμός εργασίας ξεκινά με αυτό, π.χ. VERG-42.", + "This key is already used by another project.": "Αυτό το κλειδί χρησιμοποιείται ήδη από άλλο έργο.", + "Use 2 to 10 letters and digits, starting with a letter.": "Χρησιμοποιήστε 2 έως 10 γράμματα και ψηφία, ξεκινώντας με γράμμα.", + "The key cannot change once tasks carry it.": "Το κλειδί δεν μπορεί να αλλάξει όταν το φέρουν εργασίες.", + "Project saved. The existing tasks get their numbers in the background.": "Το έργο αποθηκεύτηκε. Οι υπάρχουσες εργασίες παίρνουν τους αριθμούς τους στο παρασκήνιο.", + "Next task number": "Αριθμός επόμενης εργασίας", + "The number the next task of this project gets in its key. Only the system writes it.": "Ο αριθμός που παίρνει στο κλειδί της η επόμενη εργασία αυτού του έργου. Τον γράφει μόνο το σύστημα.", + "Restore {title}": "Επαναφορά {title}", + "Restore": "Επαναφορά", + "Project restored": "Το έργο επανήλθε", + "Could not restore the project": "Δεν ήταν δυνατή η επαναφορά του έργου", + "Bring this project back to the active list.": "Επαναφέρετε αυτό το έργο στη λίστα των ενεργών έργων.", + "Restore project": "Επαναφορά έργου", + "Request reason": "Αιτία του αιτήματος", + "Why the requester needs this project. Filled in when the project is requested.": "Γιατί ο αιτών χρειάζεται αυτό το έργο. Συμπληρώνεται κατά το αίτημα.", + "Reviewed by": "Εξετάστηκε από", + "The user who approved or rejected the request.": "Ο χρήστης που ενέκρινε ή απέρριψε το αίτημα.", + "Reviewed at": "Εξετάστηκε στις", + "When the request was approved or rejected.": "Πότε εγκρίθηκε ή απορρίφθηκε το αίτημα.", + "Review note": "Σημείωση εξέτασης", + "The reviewer's reason, shown to the requester when a request is not approved.": "Ο λόγος του εξεταστή, που βλέπει ο αιτών όταν ένα αίτημα δεν εγκρίνεται.", + "Members of these groups": "Μέλη αυτών των ομάδων", + "Groups that may create projects": "Ομάδες που μπορούν να δημιουργούν έργα", + "The group {group} no longer exists. Save to remove it.": "Η ομάδα {group} δεν υπάρχει πλέον. Αποθηκεύστε για να αφαιρεθεί.", + "Review project request": "Εξέταση αιτήματος έργου", + "Requested by": "Αιτήθηκε από", + "Why it is needed": "Γιατί χρειάζεται", + "Desired start date": "Επιθυμητή ημερομηνία έναρξης", + "Why is it not approved?": "Γιατί δεν εγκρίνεται;", + "Give a reason. The requester sees it.": "Δώστε έναν λόγο. Ο αιτών θα τον δει.", + "Approve": "Έγκριση", + "Reject": "Απόρριψη", + "Reject request": "Απόρριψη αιτήματος", + "The review was not saved. Try again.": "Η εξέταση δεν αποθηκεύτηκε. Δοκιμάστε ξανά.", + "This project is waiting for review": "Αυτό το έργο περιμένει εξέταση", + "This request was not approved": "Αυτό το αίτημα δεν εγκρίθηκε", + "Reason: {note}": "Λόγος: {note}", + "Review request": "Εξέταση αιτήματος", + "Request a project": "Αίτημα για έργο", + "Step {step} of 2": "Βήμα {step} από 2", + "Why is this project needed?": "Γιατί χρειάζεται αυτό το έργο;", + "Give a reason. The reviewer reads it.": "Δώστε έναν λόγο. Ο εξεταστής θα τον διαβάσει.", + "Back": "Πίσω", + "Next": "Επόμενο", + "Send request": "Αποστολή αιτήματος", + "The request was not sent. Try again.": "Το αίτημα δεν στάλθηκε. Δοκιμάστε ξανά.", + "Requested": "Αιτήθηκε", + "Not approved": "Δεν εγκρίθηκε", + "Your request was sent": "Το αίτημά σας στάλθηκε", + "Let everyone else request a project": "Επιτρέψτε σε όλους τους άλλους να ζητούν έργο", + "Add a task": "Προσθήκη εργασίας", + "Delete task": "Διαγραφή εργασίας", + "Edit task": "Επεξεργασία εργασίας", + "Write": "Γραφή", + "Preview": "Προεπισκόπηση", + "Markdown works here: headings, lists and links.": "Εδώ λειτουργεί το Markdown: επικεφαλίδες, λίστες και σύνδεσμοι.", + "Could not save the task. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της εργασίας. Δοκιμάστε ξανά.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Στην εργασία \"{title}\" έχει καταγραφεί χρόνος, οπότε δεν μπορεί να διαγραφεί. Μπορείτε να την ακυρώσετε: οι καταχωρίσεις χρόνου παραμένουν.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Διαγραφή της \"{title}\"; Αφαιρούνται και οι σύνδεσμοί της με άλλες εργασίες. Αυτό δεν αναιρείται.", + "Keep task": "Διατήρηση εργασίας", + "Cancel task": "Ακύρωση εργασίας", + "Only the reporter, the project owner or an admin can delete this task.": "Μόνο ο αναφέρων, ο κάτοχος του έργου ή ένας διαχειριστής μπορεί να διαγράψει αυτή την εργασία.", + "Could not delete the task. Please try again.": "Δεν ήταν δυνατή η διαγραφή της εργασίας. Δοκιμάστε ξανά.", + "Could not cancel the task. Please try again.": "Δεν ήταν δυνατή η ακύρωση της εργασίας. Δοκιμάστε ξανά.", + "Responsible": "Υπεύθυνος", + "Also working on this": "Εργάζονται επίσης σε αυτό", + "Labels": "Ετικέτες", + "Could not change the priority. Please try again.": "Δεν ήταν δυνατή η αλλαγή της προτεραιότητας. Δοκιμάστε ξανά.", + "Other project members who work on this task alongside the person responsible.": "Άλλα μέλη του έργου που εργάζονται σε αυτή την εργασία μαζί με τον υπεύθυνο.", + "Duplicate": "Αντιγραφή", + "Could not copy the task. Please try again.": "Δεν ήταν δυνατή η αντιγραφή της εργασίας. Δοκιμάστε ξανά.", + "Subtasks": "Υποεργασίες", + "{done} of {total} done": "{done} από {total} ολοκληρωμένες", + "Add a subtask": "Προσθήκη υποεργασίας", + "Checklist": "Λίστα ελέγχου", + "Checklist item actions": "Ενέργειες στοιχείου λίστας", + "Add a checklist item": "Προσθήκη στοιχείου λίστας", + "Subtasks: {estimate} estimated, {logged} logged": "Υποεργασίες: {estimate} εκτίμηση, {logged} καταγεγραμμένα", + "Total estimate: {total}": "Συνολική εκτίμηση: {total}", + "Part of {title}": "Μέρος της {title}", + "Checklist: {count} done": "Λίστα ελέγχου: {count} ολοκληρωμένα", + "This task has subtasks: {count}.": "Αυτή η εργασία έχει υποεργασίες: {count}.", + "Keep subtasks as separate tasks": "Διατήρηση των υποεργασιών ως ξεχωριστών εργασιών", + "Delete subtasks too": "Διαγραφή και των υποεργασιών", + "Copy of {title}": "Αντίγραφο της {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Η εργασία αντιγράφηκε, αλλά όχι όλες οι υποεργασίες της. Ελέγξτε το αντίγραφο.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Μικρά βήματα μέσα στην εργασία. Κάθε στοιχείο έχει αναγνωριστικό, κείμενο και αν έχει ολοκληρωθεί.", + "Open work per person and per project.": "Ανοιχτή εργασία ανά άτομο και ανά έργο.", + "View": "Προβολή", + "By person": "Ανά άτομο", + "By project": "Ανά έργο", + "Hours left": "Ώρες που απομένουν", + "Tasks without an estimate": "Εργασίες χωρίς εκτίμηση", + "Due in 14 days": "Λήγει σε 14 ημέρες", + "Shared": "Κοινόχρηστες", + "Unassigned": "Χωρίς ανάθεση", + "{hours} h": "{hours} ώ", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Εμφανίζεται η εργασία στα έργα που μπορείτε να δείτε. Οι ώρες μετρούν για τον υπεύθυνο· οι κοινόχρηστες εργασίες μετρούν χωρίς ώρες.", + "No open work in these projects.": "Δεν υπάρχει ανοιχτή εργασία σε αυτά τα έργα.", + "Open work": "Ανοιχτή εργασία", + "{count} open tasks": "{count} ανοιχτές εργασίες", + "Create a project to see capacity here.": "Δημιουργήστε ένα έργο για να δείτε εδώ τη διαθεσιμότητα.", + "My tasks": "Οι εργασίες μου", + "Show all my tasks": "Εμφάνιση όλων των εργασιών μου", + "No tasks assigned to you": "Δεν σας έχουν ανατεθεί εργασίες", + "Browse projects": "Περιήγηση στα έργα", + "Later": "Αργότερα", + "Due {date}": "Λήξη {date}", + "Could not change the status. Please try again.": "Δεν ήταν δυνατή η αλλαγή της κατάστασης. Δοκιμάστε ξανά.", + "Completed today": "Ολοκληρώθηκαν σήμερα", + "My open tasks": "Οι ανοιχτές εργασίες μου", + "My overdue tasks": "Οι εκπρόθεσμες εργασίες μου", + "My tasks in progress": "Οι εργασίες μου σε εξέλιξη", + "Pin to the top": "Καρφίτσωμα στην κορυφή", + "Unpin": "Ξεκαρφίτσωμα", + "Pinned": "Καρφιτσωμένο", + "Actions for {title}": "Ενέργειες για {title}", + "Could not save your project order. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της σειράς των έργων σας. Δοκιμάστε ξανά.", + "No boards yet": "Δεν υπάρχουν ακόμη πίνακες", + "Create a project to get a board.": "Δημιουργήστε ένα έργο για να αποκτήσετε πίνακα.", + "Use the Projects page to create and manage your projects and tasks.": "Χρησιμοποιήστε τη σελίδα Έργα για να δημιουργείτε και να διαχειρίζεστε τα έργα και τις εργασίες σας.", + "Go to projects": "Μετάβαση στα έργα", + "You are not a member of any projects yet.": "Δεν είστε ακόμη μέλος κανενός έργου.", + "Could not search for users. Please try again.": "Δεν ήταν δυνατή η αναζήτηση χρηστών. Δοκιμάστε ξανά.", + "Project creation is restricted to administrators.": "Μόνο οι διαχειριστές μπορούν να δημιουργούν έργα.", + "Only the project owner or an administrator can delete this project.": "Μόνο ο κάτοχος του έργου ή ένας διαχειριστής μπορεί να διαγράψει αυτό το έργο.", + "No projects are available to you yet. Ask an administrator to create one.": "Δεν υπάρχουν ακόμη διαθέσιμα έργα για εσάς. Ζητήστε από έναν διαχειριστή να δημιουργήσει ένα.", + "Due: {date}": "Λήξη: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Οι εργασίες με ημερομηνία έναρξης ή λήξης εμφανίζονται στο χρονολόγιο. Προσθέστε ημερομηνίες για να τις δείτε εδώ.", + "You do not have access to this project.": "Δεν έχετε πρόσβαση σε αυτό το έργο.", + "Zoom level": "Επίπεδο μεγέθυνσης", + "Unscheduled": "Μη προγραμματισμένες", + "Start: {date}": "Έναρξη: {date}", + "Today": "Σήμερα", + "No scheduled tasks": "Δεν υπάρχουν προγραμματισμένες εργασίες", + "An unexpected error occurred.": "Παρουσιάστηκε απρόσμενο σφάλμα.", + "Column {number} name": "Όνομα στήλης {number}", + "Failed to save creation policy": "Δεν ήταν δυνατή η αποθήκευση του κανόνα δημιουργίας", + "All authenticated users": "Όλοι οι συνδεδεμένοι χρήστες", + "Control who may create new projects": "Ορίστε ποιοι μπορούν να δημιουργούν νέα έργα", + "Administrators only": "Μόνο διαχειριστές", + "Project creation": "Δημιουργία έργων", + "Allow project creation": "Να επιτρέπεται η δημιουργία έργων", + "Creation policy saved successfully": "Ο κανόνας δημιουργίας αποθηκεύτηκε", + "Initializing…": "Εκκίνηση…", + "e.g. 2h 30m, 90m, 1.5h": "π.χ. 2h 30m, 90m, 1.5h", + "Log time": "Καταγραφή χρόνου", + "Save estimate": "Αποθήκευση εκτίμησης", + "Logged: {logged}": "Καταγράφηκαν: {logged}", + "over by {amount}": "υπέρβαση κατά {amount}", + "Time tracking": "Παρακολούθηση χρόνου", + "Estimate": "Εκτίμηση", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Εισαγάγετε έγκυρη εκτίμηση (π.χ. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Εισαγάγετε έγκυρη διάρκεια (π.χ. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της καταχώρισης χρόνου. Δοκιμάστε ξανά.", + "Edit time entry": "Επεξεργασία καταχώρισης χρόνου", + "Duration": "Διάρκεια", + "Date range": "Εύρος ημερομηνιών", + "Last week": "Προηγούμενη εβδομάδα", + "No time logged": "Δεν έχει καταγραφεί χρόνος", + "Log time on a task to see it here.": "Καταγράψτε χρόνο σε μια εργασία για να τον δείτε εδώ.", + "To date": "Έως ημερομηνία", + "This week": "Αυτή την εβδομάδα", + "Total: {total}": "Σύνολο: {total}", + "From date": "Από ημερομηνία", + "Custom range": "Προσαρμοσμένο εύρος", + "All time": "Όλο το διάστημα", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Δεν ήταν δυνατή η διαγραφή μιας εργασίας, οπότε μπορεί να απομένουν δεδομένα. Διαγράψτε ξανά το έργο.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Δεν ήταν δυνατή η διαγραφή μιας καταχώρισης χρόνου, οπότε μπορεί να απομένουν δεδομένα. Διαγράψτε ξανά το έργο.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Δεν ήταν δυνατή η διαγραφή μιας στήλης, οπότε μπορεί να απομένουν δεδομένα. Διαγράψτε ξανά το έργο.", + "Could not delete the project. Please try again.": "Δεν ήταν δυνατή η διαγραφή του έργου. Δοκιμάστε ξανά.", + "Notification settings": "Ρυθμίσεις ειδοποιήσεων", + "Configure when due-date reminders are sent": "Ορίστε πότε αποστέλλονται υπενθυμίσεις προθεσμίας", + "Due-date reminder lead time (hours)": "Χρόνος υπενθύμισης πριν από την προθεσμία (ώρες)", + "Lead time must be between 1 and 336 hours": "Ο χρόνος πρέπει να είναι από 1 έως 336 ώρες", + "Reminder lead time saved successfully": "Ο χρόνος υπενθύμισης αποθηκεύτηκε", + "Failed to save reminder lead time": "Δεν ήταν δυνατή η αποθήκευση του χρόνου υπενθύμισης", + "Notifications": "Ειδοποιήσεις", + "Notify me 1 day before a task's due date": "Ειδοποίησέ με 1 ημέρα πριν από την προθεσμία μιας εργασίας", + "Draft": "Πρόχειρο", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Αν το μάθημα είναι πρόχειρο που βλέπει μόνο ο εκπαιδευτικός του, γίνεται ή ακυρώνεται.", + "New release": "Νέα έκδοση", + "Roadmap chart. The same releases and epics are listed below.": "Διάγραμμα οδικού χάρτη. Οι ίδιες εκδόσεις και τα έπη αναφέρονται παρακάτω.", + "Nothing on the roadmap yet": "Τίποτα ακόμη στον οδικό χάρτη", + "Releases with a target date and epics with dated tasks appear here.": "Εδώ εμφανίζονται οι εκδόσεις με ημερομηνία στόχο και τα έπη με εργασίες που έχουν ημερομηνία.", + "Releases": "Εκδόσεις", + "No releases yet": "Δεν υπάρχουν ακόμη εκδόσεις", + "Target date: {date}": "Ημερομηνία στόχος: {date}", + "No target date": "Χωρίς ημερομηνία στόχο", + "Edit {name}": "Επεξεργασία {name}", + "Mark {name} as released": "Σήμανση {name} ως κυκλοφορημένης", + "Mark as released": "Σήμανση ως κυκλοφορημένης", + "Epics": "Έπη", + "No epics yet. Open a task to make it an epic.": "Δεν υπάρχουν ακόμη έπη. Ανοίξτε μια εργασία για να την κάνετε έπος.", + "Not scheduled yet": "Δεν έχει προγραμματιστεί ακόμη", + "Planned": "Προγραμματισμένη", + "Released": "Κυκλοφόρησε", + "Edit release": "Επεξεργασία έκδοσης", + "Target date": "Ημερομηνία στόχος", + "Could not save the release. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της έκδοσης. Δοκιμάστε ξανά.", + "Every task of this release is done or cancelled.": "Κάθε εργασία αυτής της έκδοσης έχει ολοκληρωθεί ή ακυρωθεί.", + "Not finished yet: {count}": "Δεν έχουν ολοκληρωθεί ακόμη: {count}", + "What happens to these tasks?": "Τι γίνεται με αυτές τις εργασίες;", + "Move to {name}": "Μετακίνηση στην {name}", + "Remove the release": "Αφαίρεση της έκδοσης", + "Keep it on {name}": "Να μείνουν στην {name}", + "Could not mark the release as released. Please try again.": "Δεν ήταν δυνατή η σήμανση της έκδοσης ως κυκλοφορημένης. Δοκιμάστε ξανά.", + "Roadmap": "Οδικός χάρτης", + "Tasks or roadmap": "Εργασίες ή οδικός χάρτης", + "Release": "Έκδοση", + "Epic": "Έπος", + "This task is an epic": "Αυτή η εργασία είναι έπος", + "A named, dated delivery of a project that its tasks are planned against.": "Μια ονομασμένη παράδοση έργου με ημερομηνία, προς την οποία σχεδιάζονται οι εργασίες του.", + "Name of the release": "Όνομα της έκδοσης", + "The project this release belongs to": "Το έργο στο οποίο ανήκει αυτή η έκδοση", + "What this release delivers": "Τι παραδίδει αυτή η έκδοση", + "When work on the release starts": "Πότε ξεκινά η εργασία για την έκδοση", + "The date the release is due": "Η ημερομηνία που πρέπει να είναι έτοιμη η έκδοση", + "Whether the release is planned, released or archived": "Αν η έκδοση είναι προγραμματισμένη, κυκλοφορημένη ή αρχειοθετημένη", + "Released on": "Κυκλοφόρησε στις", + "When the release was marked as released": "Πότε η έκδοση σημειώθηκε ως κυκλοφορημένη", + "The release this task is planned for": "Η έκδοση για την οποία έχει προγραμματιστεί αυτή η εργασία", + "Board view options": "Επιλογές προβολής πίνακα", + "Colour cards": "Χρωματισμός καρτών", + "No colour": "Χωρίς χρώμα", + "By label": "Κατά ετικέτα", + "Swimlanes": "Λωρίδες", + "No swimlanes": "Χωρίς λωρίδες", + "By assignee": "Κατά υπεύθυνο", + "By epic": "Κατά epic", + "No assignee": "Χωρίς υπεύθυνο", + "No epic": "Χωρίς epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Οι κάρτες μένουν στη γραμμή του epic τους. Αλλάξτε το epic στη σελίδα της εργασίας.", + "Hand over to": "Παράδοση σε", + "Could not save your board view. It applies until you reload.": "Η προβολή του πίνακα δεν αποθηκεύτηκε. Ισχύει μέχρι να ανανεώσετε τη σελίδα.", + "Timetable wish": "Επιθυμία ωρολογίου", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Μια επιθυμία που λαμβάνει υπόψη η γεννήτρια. Μια αυστηρή την τηρεί πάντα, μια ευέλικτη όπου μπορεί.", + "Whether the wish is about a teacher, a group, a room or one activity": "Αν η επιθυμία αφορά εκπαιδευτικό, τμήμα, αίθουσα ή μία δραστηριότητα", + "Teacher": "Εκπαιδευτικός", + "Group": "Τμήμα", + "Reference": "Αναφορά", + "The user, group, room or activity the wish is about": "Ο χρήστης, το τμήμα, η αίθουσα ή η δραστηριότητα που αφορά η επιθυμία", + "What the wish asks for": "Τι ζητά η επιθυμία", + "Not on these periods": "Όχι σε αυτές τις ώρες", + "Preferably not on these periods": "Κατά προτίμηση όχι σε αυτές τις ώρες", + "At most a number of lessons a day": "Το πολύ ένας αριθμός μαθημάτων την ημέρα", + "No free periods between lessons": "Χωρίς κενά ανάμεσα στα μαθήματα", + "Always the same room": "Πάντα η ίδια αίθουσα", + "Periods": "Ώρες", + "The periods of the week the wish is about, such as wed-5": "Οι ώρες της εβδομάδας που αφορά η επιθυμία, π.χ. wed-5", + "Limit": "Όριο", + "The most lessons a day, for a wish of that kind": "Τα περισσότερα μαθήματα την ημέρα, για επιθυμία αυτού του είδους", + "Strength": "Ισχύς", + "Whether the generator must keep the wish or should keep it": "Αν η γεννήτρια πρέπει ή θα έπρεπε να τηρήσει την επιθυμία", + "Hard": "Αυστηρή", + "Soft": "Ευέλικτη", + "Weight": "Βάρος", + "How much a soft wish counts, from 1 to 3": "Πόσο μετρά μια ευέλικτη επιθυμία, από 1 έως 3", + "Why the wish exists": "Γιατί υπάρχει η επιθυμία", + "Timetable scenario": "Σενάριο ωρολογίου", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Ένα εβδομαδιαίο μοτίβο, από τη γεννήτρια ή από το τρέχον ωρολόγιο. Κρατά τα δεδομένα εισόδου του και πόσο καλά τηρεί τις επιθυμίες.", + "The name timetablers know the scenario by": "Το όνομα με το οποίο γνωρίζουν το σενάριο όσοι φτιάχνουν το ωρολόγιο", + "Whether the generator made it or it came from the current timetable": "Αν το έφτιαξε η γεννήτρια ή προέρχεται από το τρέχον ωρολόγιο", + "Generated": "Παραγμένο", + "From the current timetable": "Από το τρέχον ωρολόγιο", + "Week of": "Εβδομάδα από", + "The Monday of the first week of the window": "Η Δευτέρα της πρώτης εβδομάδας της περιόδου", + "Window start": "Αρχή περιόδου", + "The first day the week pattern applies to": "Η πρώτη ημέρα για την οποία ισχύει το εβδομαδιαίο μοτίβο", + "Window end": "Τέλος περιόδου", + "The last day the week pattern applies to": "Η τελευταία ημέρα για την οποία ισχύει το εβδομαδιαίο μοτίβο", + "Waiting, generating, done, failed, or published as draft lessons": "Σε αναμονή, σε παραγωγή, έτοιμο, απέτυχε ή δημοσιευμένο ως πρόχειρα μαθήματα", + "Waiting": "Σε αναμονή", + "Generating": "Σε παραγωγή", + "Failed": "Απέτυχε", + "Published": "Δημοσιευμένο", + "Seed": "Σπόρος", + "The number the generator starts from, so a run can be repeated": "Ο αριθμός από τον οποίο ξεκινά η γεννήτρια, ώστε μια εκτέλεση να επαναλαμβάνεται", + "Input": "Είσοδος", + "The periods, rooms, lessons and wishes the scenario was made from": "Οι ώρες, αίθουσες, μαθήματα και επιθυμίες από τα οποία φτιάχτηκε το σενάριο", + "Placements": "Τοποθετήσεις", + "Each lesson with the period and room it was given": "Κάθε μάθημα με την ώρα και την αίθουσα που πήρε", + "Unplaced lessons": "Μη τοποθετημένα μαθήματα", + "Lessons without a place, each with the hard wish that blocked it": "Μαθήματα χωρίς θέση, το καθένα με την αυστηρή επιθυμία που το εμπόδισε", + "Broken wishes": "Παραβιασμένες επιθυμίες", + "The wishes this scenario breaks, with the lessons that break them": "Οι επιθυμίες που παραβιάζει αυτό το σενάριο, με τα μαθήματα που τις παραβιάζουν", + "Measures": "Μετρήσεις", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Τοποθετημένα μαθήματα, παραβιασμένες επιθυμίες, κενά εκπαιδευτικών, μαθήματα την ημέρα και χρήση αιθουσών", + "Reason": "Αιτία", + "Why the run failed": "Γιατί απέτυχε η εκτέλεση", + "Published at": "Δημοσιεύτηκε στις", + "When the scenario was written out as draft lessons": "Πότε γράφτηκε το σενάριο ως πρόχειρα μαθήματα", + "Edit wish": "Επεξεργασία επιθυμίας", + "New wish": "Νέα επιθυμία", + "Hard: the generator always keeps it": "Υποχρεωτική: η γεννήτρια την τηρεί πάντα", + "Soft: the generator keeps it where it can": "Ευέλικτη: η γεννήτρια την τηρεί όπου μπορεί", + "Weight (1 to 3)": "Βάρος (1 έως 3)", + "Most lessons a day": "Το πολύ μαθήματα την ημέρα", + "Period": "Ώρα", + "{day} period {number}": "{day} ώρα {number}", + "Teacher (user name)": "Εκπαιδευτικός (όνομα χρήστη)", + "Activity (group:subject)": "Δραστηριότητα (ομάδα:μάθημα)", + "Say who or what the wish is about.": "Δηλώστε ποιον ή τι αφορά η επιθυμία.", + "Choose at least one period.": "Επιλέξτε τουλάχιστον μία ώρα.", + "The limit is a whole number of 1 or more.": "Το όριο είναι ακέραιος αριθμός 1 ή μεγαλύτερος.", + "Timetable": "Ωρολόγιο πρόγραμμα", + "Wishes": "Επιθυμίες", + "Timetable wishes": "Επιθυμίες ωρολογίου προγράμματος", + "Generator run": "Εκτέλεση γεννήτριας", + "Generator progress": "Πρόοδος γεννήτριας", + "The run failed: {reason}": "Η εκτέλεση απέτυχε: {reason}", + "{placed} of {lessons} lessons placed": "Τοποθετήθηκαν {placed} από {lessons} μαθήματα", + "Generate again": "Δημιουργία ξανά", + "Generate": "Δημιουργία", + "Every lesson has a place.": "Κάθε μάθημα έχει θέση.", + "Lesson": "Μάθημα", + "No free period and room": "Καμία ελεύθερη ώρα και αίθουσα", + "Broken soft wishes": "Ευέλικτες επιθυμίες που δεν τηρήθηκαν", + "Every soft wish is kept.": "Κάθε ευέλικτη επιθυμία τηρείται.", + "Wish": "Επιθυμία", + "Lessons": "Μαθήματα", + "Generating: {percent}% of the time budget used": "Δημιουργία: χρησιμοποιήθηκε {percent}% του χρόνου", + "Waiting to start": "Αναμονή έναρξης", + "Published as draft lessons": "Δημοσιεύτηκε ως πρόχειρα μαθήματα", + "Could not read the scenario.": "Δεν ήταν δυνατή η ανάγνωση του σεναρίου.", + "Could not start the run.": "Δεν ήταν δυνατή η έναρξη της εκτέλεσης.", + "Scenarios": "Σενάρια", + "Timetable scenarios": "Σενάρια ωρολογίου προγράμματος", + "Scenario": "Σενάριο", + "Take the current timetable": "Λήψη του τρέχοντος ωρολογίου προγράμματος", + "Could not take the current timetable.": "Δεν ήταν δυνατή η λήψη του τρέχοντος ωρολογίου προγράμματος.", + "Broken hard wishes": "Υποχρεωτικές επιθυμίες που παραβιάστηκαν", + "Not on a period of the week grid": "Όχι σε ώρα του εβδομαδιαίου πλέγματος", + "Compare scenarios": "Σύγκριση σεναρίων", + "Scenarios to compare": "Σενάρια προς σύγκριση", + "Choose two or three scenarios to compare them.": "Επιλέξτε δύο ή τρία σενάρια για σύγκριση.", + "Measure": "Μέτρο", + "Best": "Καλύτερο", + "Lessons that differ": "Μαθήματα που διαφέρουν", + "No lesson differs.": "Κανένα μάθημα δεν διαφέρει.", + "Not placed": "Δεν τοποθετήθηκε", + "{period} in {room}": "{period} στην {room}", + "Lessons placed": "Τοποθετημένα μαθήματα", + "Lessons without a place": "Μαθήματα χωρίς θέση", + "Clashes": "Συγκρούσεις", + "Hard wishes broken": "Υποχρεωτικές επιθυμίες που δεν τηρήθηκαν", + "Soft wishes broken": "Ευέλικτες επιθυμίες που δεν τηρήθηκαν", + "Soft wishes broken, weighted": "Ευέλικτες επιθυμίες που δεν τηρήθηκαν, σταθμισμένες", + "Free periods between lessons, all teachers": "Κενά, όλοι οι εκπαιδευτικοί", + "Most free periods of one teacher": "Τα περισσότερα κενά ενός εκπαιδευτικού", + "Most lessons of one group on a day": "Τα περισσότερα μαθήματα μιας ομάδας σε μια ημέρα", + "Room use": "Χρήση αιθουσών", + "Publish as draft lessons": "Δημοσίευση ως πρόχειρα μαθήματα", + "Draft lessons written: {count}": "Πρόχειρα μαθήματα που γράφτηκαν: {count}", + "Could not publish the scenario.": "Δεν ήταν δυνατή η δημοσίευση του σεναρίου.", + "Rules": "Κανόνες", + "Rules for {column}": "Κανόνες για {column}", + "When a card enters this column": "Όταν μια κάρτα μπαίνει σε αυτή τη στήλη", + "Action": "Ενέργεια", + "Set the priority": "Ορισμός προτεραιότητας", + "Assign to": "Ανάθεση σε", + "Assign the person who moved the card": "Ανάθεση σε όποιον μετακίνησε την κάρτα", + "Remove the assignee": "Αφαίρεση υπευθύνου", + "Add a label": "Προσθήκη ετικέτας", + "No longer a project member": "Δεν είναι πλέον μέλος του έργου", + "This label no longer exists": "Αυτή η ετικέτα δεν υπάρχει πλέον", + "Add rule": "Προσθήκη κανόνα", + "Remove rule": "Αφαίρεση κανόνα", + "No rules yet. Add one to change a card when it enters this column.": "Δεν υπάρχουν ακόμη κανόνες. Προσθέστε έναν για να αλλάζει μια κάρτα όταν μπαίνει σε αυτή τη στήλη.", + "Could not save the rules. Please try again.": "Οι κανόνες δεν αποθηκεύτηκαν. Δοκιμάστε ξανά.", + "1 rule runs when a card enters this column": "1 κανόνας εκτελείται όταν μια κάρτα μπαίνει σε αυτή τη στήλη", + "{count} rules run when a card enters this column": "{count} κανόνες εκτελούνται όταν μια κάρτα μπαίνει σε αυτή τη στήλη", + "Rules applied: {changes}": "Κανόνες που εφαρμόστηκαν: {changes}", + "assigned to {name}": "ανατέθηκε σε {name}", + "assignee removed": "ο υπεύθυνος αφαιρέθηκε", + "priority {priority}": "προτεραιότητα {priority}", + "label {label}": "ετικέτα {label}", + "What happens to a card when it enters this column, applied in list order.": "Τι συμβαίνει σε μια κάρτα όταν μπαίνει σε αυτή τη στήλη, με τη σειρά της λίστας.", + "Value": "Τιμή", + "What the rule does to the card.": "Τι κάνει ο κανόνας στην κάρτα.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Η προτεραιότητα, το αναγνωριστικό χρήστη ή ετικέτας που χρησιμοποιεί η ενέργεια· κενό για ενέργειες χωρίς τιμή.", + "is not": "δεν είναι", + "{dimension} is not": "{dimension} δεν είναι", + "Saved filters": "Αποθηκευμένα φίλτρα", + "No saved filters yet": "Δεν υπάρχουν ακόμη αποθηκευμένα φίλτρα", + "Save filter": "Αποθήκευση φίλτρου", + "Rename \"{name}\"": "Μετονομασία «{name}»", + "Delete \"{name}\"": "Διαγραφή «{name}»", + "Clear filters": "Καθαρισμός φίλτρων", + "Showing {shown} of {total} tasks": "Εμφανίζονται {shown} από {total} εργασίες", + "Me": "Εγώ", + "No date": "Χωρίς ημερομηνία", + "Rename saved filter": "Μετονομασία αποθηκευμένου φίλτρου", + "Share with the project": "Κοινή χρήση με το έργο", + "Give the filter a name": "Δώστε όνομα στο φίλτρο", + "Could not save the filter. Please try again.": "Το φίλτρο δεν αποθηκεύτηκε. Δοκιμάστε ξανά.", + "Some labels in \"{name}\" no longer exist and were left out.": "Ορισμένες ετικέτες στο «{name}» δεν υπάρχουν πλέον και παραλείφθηκαν.", + "Could not delete the filter. Please try again.": "Το φίλτρο δεν διαγράφηκε. Δοκιμάστε ξανά.", + "Saved filter": "Αποθηκευμένο φίλτρο", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Ένα φίλτρο πίνακα με όνομα για ένα έργο, ιδιωτικό για όποιον το αποθήκευσε εκτός αν μοιράζεται με το έργο.", + "The project whose board the filter applies to": "Το έργο στον πίνακα του οποίου εφαρμόζεται το φίλτρο", + "The name the filter is listed under": "Το όνομα με το οποίο εμφανίζεται το φίλτρο στη λίστα", + "Saved by": "Αποθηκεύτηκε από", + "Nextcloud user id of the person who saved the filter": "Αναγνωριστικό χρήστη Nextcloud όποιου αποθήκευσε το φίλτρο", + "Shared with the project": "Κοινόχρηστο με το έργο", + "Whether every project member sees and applies the filter": "Αν κάθε μέλος του έργου βλέπει και μπορεί να εφαρμόσει το φίλτρο", + "Criteria": "Κριτήρια", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Το φίλτρο: υπεύθυνος, ετικέτα, προτεραιότητα και προθεσμία, το καθένα με είναι ή δεν είναι και τις τιμές του", + "Cross-project view": "Προβολή πολλών έργων", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Μια αποθηκευμένη επιλογή έργων των οποίων οι εργασίες εμφανίζονται μαζί σε στήλες κατάστασης, κοινόχρηστη με τα άτομα που ορίζει.", + "Shared with": "Κοινή χρήση με", + "The name the view is listed under": "Το όνομα με το οποίο εμφανίζεται η προβολή", + "Nextcloud user id of the person who saved the view": "Αναγνωριστικό χρήστη Nextcloud του ατόμου που αποθήκευσε την προβολή", + "Nextcloud user ids of the people the view is shared with": "Αναγνωριστικά χρηστών Nextcloud των ατόμων με τα οποία μοιράζεται η προβολή", + "The projects whose tasks the view shows, at most twenty": "Τα έργα των οποίων τις εργασίες δείχνει η προβολή, έως είκοσι", + "1 project in this view is hidden from you.": "1 έργο αυτής της προβολής είναι κρυφό για εσάς.", + "{count} projects in this view are hidden from you.": "{count} έργα αυτής της προβολής είναι κρυφά για εσάς.", + "{project} has no column for {status}.": "Το έργο {project} δεν έχει στήλη για {status}.", + "This view does not exist or is not shared with you.": "Αυτή η προβολή δεν υπάρχει ή δεν είναι κοινόχρηστη μαζί σας.", + "\"{task}\" moved to {status}.": "Η \"{task}\" μετακινήθηκε σε {status}.", + "Project: {title}": "Έργο: {title}", + "Cross-project views": "Προβολές πολλών έργων", + "New view": "Νέα προβολή", + "Edit view": "Επεξεργασία προβολής", + "Delete view": "Διαγραφή προβολής", + "Give the view a name": "Δώστε όνομα στην προβολή", + "Pick at least one project": "Επιλέξτε τουλάχιστον ένα έργο", + "A view shows at most {max} projects": "Μια προβολή δείχνει έως {max} έργα", + "Could not save the view. Please try again.": "Δεν ήταν δυνατή η αποθήκευση της προβολής. Δοκιμάστε ξανά.", + "Could not delete the view. Please try again.": "Δεν ήταν δυνατή η διαγραφή της προβολής. Δοκιμάστε ξανά.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Διαγραφή του \"{title}\"; Τα έργα και οι εργασίες τους μένουν ως έχουν.", + "People see the tasks of the projects they are in, never more.": "Ο καθένας βλέπει μόνο τις εργασίες των έργων στα οποία συμμετέχει.", + "No views yet. A view shows the tasks of several of your projects together.": "Δεν υπάρχουν ακόμη προβολές. Μια προβολή δείχνει μαζί τις εργασίες πολλών έργων σας.", + "Projects in view: {count}": "Έργα στην προβολή: {count}", + "Notify me when a task is assigned to me": "Ειδοποίησέ με όταν μου ανατίθεται μια εργασία", + "Also send these to me by email": "Στείλε μου αυτά και με email", + "Add an email address in your Nextcloud personal settings to get mail.": "Προσθέστε μια διεύθυνση email στις προσωπικές ρυθμίσεις του Nextcloud για να λαμβάνετε email.", + "Code link": "Σύνδεσμος κώδικα", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Ένα commit, κλάδος, αίτημα συγχώνευσης ή ζήτημα σε πλατφόρμα κώδικα που αφορά μια εργασία.", + "The task the link belongs to": "Η εργασία στην οποία ανήκει ο σύνδεσμος", + "The project of the task": "Το έργο της εργασίας", + "Task key": "Κλειδί εργασίας", + "The task key the forge text named, such as VC-12": "Το κλειδί εργασίας που ανέφερε το κείμενο της πλατφόρμας, π.χ. VC-12", + "What the link points at": "Πού δείχνει ο σύνδεσμος", + "Link": "Σύνδεσμος", + "The address of the item in the forge": "Η διεύθυνση του στοιχείου στην πλατφόρμα κώδικα", + "The commit message, branch name or merge request title": "Το μήνυμα του commit, το όνομα του κλάδου ή ο τίτλος του αιτήματος συγχώνευσης", + "Repository": "Αποθετήριο", + "The repository, such as acme/portal": "Το αποθετήριο, π.χ. acme/portal", + "Forge id": "Id στην πλατφόρμα", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Το δικό του id του στοιχείου στην πλατφόρμα κώδικα, π.χ. github:acme/portal#42 ή ένα hash commit", + "State": "Κατάσταση", + "The state of a merge request or issue": "Η κατάσταση ενός αιτήματος συγχώνευσης ή ζητήματος", + "Who made the commit or opened the merge request": "Ποιος έκανε το commit ή άνοιξε το αίτημα συγχώνευσης", + "When the commit was made or the merge request last changed": "Πότε έγινε το commit ή άλλαξε τελευταία φορά το αίτημα συγχώνευσης", + "Added by": "Προστέθηκε από", + "Whether a person added the link or the integration wrote it": "Αν τον σύνδεσμο τον πρόσθεσε άνθρωπος ή τον έγραψε η ενσωμάτωση", + "Nextcloud user UIDs of project members": "Αναγνωριστικά χρηστών Nextcloud των μελών του έργου", + "Add link": "Προσθήκη συνδέσμου", + "Added by hand": "Προστέθηκε χειροκίνητα", + "Branch": "Κλάδος", + "Code": "Κώδικας", + "Commit": "Commit", + "From the integration": "Από την ενσωμάτωση", + "Link to a commit, branch or merge request": "Σύνδεσμος σε commit, κλάδο ή αίτημα συγχώνευσης", + "Merge request": "Αίτημα συγχώνευσης", + "Merged": "Συγχωνεύθηκε", + "No code linked yet. Name {key} in a commit message or paste a link.": "Δεν υπάρχει ακόμη συνδεδεμένος κώδικας. Αναφέρετε το {key} σε μήνυμα commit ή επικολλήστε σύνδεσμο.", + "No code linked yet. Paste a link to a commit or merge request.": "Δεν υπάρχει ακόμη συνδεδεμένος κώδικας. Επικολλήστε σύνδεσμο σε commit ή αίτημα συγχώνευσης.", + "Paste a web address that starts with https://.": "Επικολλήστε μια διεύθυνση web που ξεκινά με https://.", + "Remove link {title}": "Αφαίρεση του συνδέσμου {title}", + "The link could not be added.": "Ο σύνδεσμος δεν ήταν δυνατό να προστεθεί.", + "The link could not be removed.": "Ο σύνδεσμος δεν ήταν δυνατό να αφαιρεθεί.", + "This link is already on the task.": "Αυτός ο σύνδεσμος υπάρχει ήδη στην εργασία.", + "Code forges": "Πλατφόρμες κώδικα", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Συνδέστε commits και pull requests του GitHub με εργασίες. Το Integriq λαμβάνει τα συμβάντα· το planninq δεν καλεί ποτέ το GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Κατεβάστε τη διαμόρφωση και εισαγάγετέ τη στο Integriq. Έπειτα συμπληρώστε ένα μυστικό στον κανόνα \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Στο GitHub, προσθέστε στο αποθετήριο ένα webhook με αυτή τη διεύθυνση και το ίδιο μυστικό. Επιλέξτε τύπο περιεχομένου application/json και τα συμβάντα push και pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Αναφέρετε το κλειδί εργασίας, π.χ. VC-12, σε μήνυμα commit, όνομα κλάδου ή τίτλο pull request. Ο σύνδεσμος εμφανίζεται τότε σε αυτή την εργασία.", + "Without Integriq, project members can still paste a link on the task page.": "Χωρίς το Integriq, τα μέλη του έργου μπορούν ακόμη να επικολλήσουν σύνδεσμο στη σελίδα της εργασίας.", + "Download the Integriq configuration": "Λήψη της διαμόρφωσης Integriq", + "Calendar": "Ημερολόγιο", + "Previous": "Προηγούμενο", + "Calendar view": "Προβολή ημερολογίου", + "Starts:": "Ξεκινά:", + "No tasks with a date in this month.": "Δεν υπάρχουν εργασίες με ημερομηνία αυτόν τον μήνα.", + "Week of {start} to {end}": "Εβδομάδα από {start} έως {end}", + "My calendar": "Το ημερολόγιό μου", + "Show as list": "Εμφάνιση ως λίστα", + "Show as calendar": "Εμφάνιση ως ημερολόγιο", + "Open my calendar": "Άνοιγμα του ημερολογίου μου", + "Nextcloud Tasks": "Εργασίες Nextcloud", + "Show my tasks in Nextcloud Tasks": "Εμφάνιση των εργασιών μου στις Εργασίες Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Οι εργασίες που σας έχουν ανατεθεί ή κοινοποιηθεί εμφανίζονται σε μια λίστα \"Planninq\" στις Εργασίες και στο Ημερολόγιο του Nextcloud. Οι αλλαγές που γίνονται εκεί αντικαθίστανται με την επόμενη αλλαγή στο Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Αυτός ο διακομιστής δεν μπορεί να γράψει στις Εργασίες Nextcloud, οπότε η εξαγωγή δεν είναι διαθέσιμη.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Διαχειρίζεται από το Planninq. Οι αλλαγές που γίνονται εδώ αντικαθίστανται με την επόμενη αλλαγή στο Planninq.", + "Working days and holidays": "Εργάσιμες ημέρες και αργίες", + "Dates set on the timeline skip the days that are not working days.": "Οι ημερομηνίες στη χρονογραμμή παραλείπουν τις μη εργάσιμες ημέρες.", + "Working weekdays": "Εργάσιμες ημέρες της εβδομάδας", + "Non-working days": "Μη εργάσιμες ημέρες", + "No non-working days yet.": "Δεν υπάρχουν ακόμη μη εργάσιμες ημέρες.", + "Add day": "Προσθήκη ημέρας", + "Year": "Έτος", + "Add Dutch national holidays": "Προσθήκη ολλανδικών εθνικών αργιών", + "Save working days": "Αποθήκευση εργάσιμων ημερών", + "Choose at least one working weekday.": "Επιλέξτε τουλάχιστον μία εργάσιμη ημέρα.", + "Working days saved.": "Οι εργάσιμες ημέρες αποθηκεύτηκαν.", + "Could not save the working days.": "Δεν ήταν δυνατή η αποθήκευση των εργάσιμων ημερών.", + "New Year's Day": "Πρωτοχρονιά", + "Easter Sunday": "Κυριακή του Πάσχα", + "Easter Monday": "Δευτέρα του Πάσχα", + "King's Day": "Ημέρα του Βασιλιά", + "Liberation Day": "Ημέρα της Απελευθέρωσης", + "Ascension Day": "Ανάληψη", + "Whit Sunday": "Πεντηκοστή", + "Whit Monday": "Αγίου Πνεύματος", + "Christmas Day": "Χριστούγεννα", + "Boxing Day": "Δεύτερη ημέρα των Χριστουγέννων", + "Dates of {title}": "Ημερομηνίες του {title}", + "The due date cannot be before the start date.": "Η προθεσμία δεν μπορεί να είναι πριν από την ημερομηνία έναρξης.", + "{title}, from {start} to {end}": "{title}, από {start} έως {end}", + "The dates could not be saved.": "Δεν ήταν δυνατή η αποθήκευση των ημερομηνιών.", + "{title} now runs from {start} to {end}": "Το {title} διαρκεί τώρα από {start} έως {end}", + "Auto-scheduling": "Αυτόματος προγραμματισμός", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Όταν είναι ενεργό, η μετάθεση μιας προθεσμίας αργότερα στη χρονογραμμή προτείνει να μετακινηθούν και οι εργασίες που μπλοκάρει.", + "Move blocked tasks along when a task slips": "Μετακίνηση των μπλοκαρισμένων εργασιών όταν μια εργασία καθυστερεί", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Στη χρονογραμμή, μια μεταγενέστερη προθεσμία προτείνει να μετακινηθούν οι μπλοκαρισμένες εργασίες. Μετρούν μόνο οι σύνδεσμοι \"μπλοκάρει\" και οι εργασίες μετακινούνται μόνο αργότερα.", + "Move the tasks that wait for {title}?": "Μετακίνηση των εργασιών που περιμένουν το {title};", + "These tasks wait for it and would start after its new due date:": "Αυτές οι εργασίες την περιμένουν και θα ξεκινούσαν μετά τη νέα προθεσμία:", + "{count} tasks would move; the first {limit} are listed.": "Θα μετακινούνταν {count} εργασίες· εμφανίζονται οι πρώτες {limit}.", + "Now": "Τώρα", + "After the move": "Μετά τη μετακίνηση", + "Only this task": "Μόνο αυτή η εργασία", + "Move all": "Μετακίνηση όλων", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Διακοπή στο {title}: δεν ήταν δυνατή η αποθήκευση των ημερομηνιών. Οι προηγούμενες εργασίες μετακινήθηκαν.", + "Cumulative flow": "Αθροιστική ροή", + "Show as chart": "Εμφάνιση ως γράφημα", + "Show as table": "Εμφάνιση ως πίνακας", + "Tasks per column per day": "Εργασίες ανά στήλη ανά ημέρα", + "Tasks without recorded history in this period: {count}": "Εργασίες χωρίς καταγεγραμμένο ιστορικό σε αυτή την περίοδο: {count}", + "Lead and cycle time": "Χρόνος παράδοσης και χρόνος κύκλου", + "No tasks were finished in this period.": "Δεν ολοκληρώθηκε καμία εργασία σε αυτή την περίοδο.", + "Finished tasks": "Ολοκληρωμένες εργασίες", + "Cycle time, average": "Χρόνος κύκλου, μέσος όρος", + "Cycle time, 85th percentile": "Χρόνος κύκλου, 85ο εκατοστημόριο", + "Lead time, average": "Χρόνος παράδοσης, μέσος όρος", + "Tasks whose finish time was estimated from their history: {count}": "Εργασίες των οποίων ο χρόνος ολοκλήρωσης εκτιμήθηκε από το ιστορικό: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Χρόνος κύκλου κάθε ολοκληρωμένης εργασίας, με τον μέσο όρο και το 85ο εκατοστημόριο", + "Slowest tasks": "Πιο αργές εργασίες", + "cycle {cycle}, lead {lead}": "κύκλος {cycle}, παράδοση {lead}", + "{days} days": "{days} ημέρες", + "Could not load the flow of this project.": "Δεν ήταν δυνατή η φόρτωση της ροής αυτού του έργου.", + "Last {days} days": "Τελευταίες {days} ημέρες", + "Portfolio flow": "Ροή χαρτοφυλακίου", + "An admin adds portfolios under Projects, Portfolios.": "Ένας διαχειριστής προσθέτει χαρτοφυλάκια στα Έργα, Χαρτοφυλάκια.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Έργα που δεν εμφανίζονται, επειδή εμφανίζονται έως 50 κάθε φορά: {count}", + "Could not load the flow of this portfolio.": "Δεν ήταν δυνατή η φόρτωση της ροής αυτού του χαρτοφυλακίου.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Αθροιστική ροή και χρόνος κύκλου στα έργα ενός χαρτοφυλακίου.", + "Edit report": "Επεξεργασία αναφοράς", + "Only tasks where": "Μόνο εργασίες όπου", + "Group by": "Ομαδοποίηση κατά", + "Display": "Εμφάνιση", + "Share with everyone who can read its projects": "Κοινή χρήση με όσους μπορούν να διαβάσουν τα έργα της", + "The report could not be saved.": "Δεν ήταν δυνατή η αποθήκευση της αναφοράς.", + "Number of tasks": "Αριθμός εργασιών", + "Bar": "Ράβδοι", + "Donut": "Δακτύλιος", + "Table": "Πίνακας", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} από {total} έργα αυτής της αναφοράς δεν είναι ορατά σε εσάς", + "No tasks match this report.": "Καμία εργασία δεν ταιριάζει με αυτή την αναφορά.", + "None": "Κανένα", + "Could not load this report.": "Δεν ήταν δυνατή η φόρτωση αυτής της αναφοράς.", + "Report": "Αναφορά", + "Your reports": "Οι αναφορές σας", + "My reports": "Οι αναφορές μου", + "Shared reports": "Κοινόχρηστες αναφορές", + "You have not built a report yet.": "Δεν έχετε δημιουργήσει ακόμη αναφορά.", + "Nobody has shared a report with you yet.": "Κανείς δεν έχει μοιραστεί ακόμη αναφορά μαζί σας.", + "Reports you built over tasks, and the ones shared with you.": "Αναφορές που δημιουργήσατε για εργασίες, και όσες μοιράστηκαν μαζί σας.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Ένα αποθηκευμένο ερώτημα για εργασίες: ποια έργα, ποια φίλτρα, ομαδοποίηση κατά τι, μέτρηση ή άθροισμα, και εμφάνιση ως πίνακας ή γράφημα.", + "The name the report is listed under": "Το όνομα με το οποίο εμφανίζεται η αναφορά", + "What the report shows and who it is for": "Τι δείχνει η αναφορά και για ποιον είναι", + "Nextcloud user id of the person who saved the report": "Αναγνωριστικό χρήστη Nextcloud του ατόμου που αποθήκευσε την αναφορά", + "Who can open the report": "Ποιος μπορεί να ανοίξει την αναφορά", + "Only me": "Μόνο εγώ", + "Everyone who can read its projects": "Όλοι όσοι μπορούν να διαβάσουν τα έργα της", + "The projects the report covers, at most fifty": "Τα έργα που καλύπτει η αναφορά, έως πενήντα", + "Filters": "Φίλτρα", + "Task fields and the value each must equal": "Πεδία εργασίας και η τιμή με την οποία πρέπει να είναι ίσο το καθένα", + "The task field the report groups on": "Το πεδίο εργασίας κατά το οποίο ομαδοποιεί η αναφορά", + "Count the tasks, or add up a number on them": "Μέτρηση των εργασιών ή άθροιση ενός αριθμού τους", + "Sum": "Άθροισμα", + "Sum of": "Άθροισμα του", + "The number added up when the measure is a sum": "Ο αριθμός που αθροίζεται όταν το μέτρο είναι άθροισμα", + "Story points": "Πόντοι ιστορίας", + "Estimated duration": "Εκτιμώμενη διάρκεια", + "How the report is shown": "Πώς εμφανίζεται η αναφορά", + "Issue type": "Τύπος αιτήματος", + "Task fields and the value each must equal; empty when the report covers every task": "Πεδία εργασίας και η τιμή που πρέπει να έχει το καθένα· κενό όταν η αναφορά καλύπτει όλες τις εργασίες", + "The status a task must have": "Η κατάσταση που πρέπει να έχει μια εργασία", + "The priority a task must have": "Η προτεραιότητα που πρέπει να έχει μια εργασία", + "The user a task must be assigned to": "Ο χρήστης στον οποίο πρέπει να έχει ανατεθεί μια εργασία", + "A label a task must carry": "Μια ετικέτα που πρέπει να φέρει μια εργασία", + "The board column a task must be in": "Η στήλη του πίνακα στην οποία πρέπει να βρίσκεται μια εργασία", + "The issue type a task must have": "Ο τύπος αιτήματος που πρέπει να έχει μια εργασία", + "Manager groups": "Ομάδες διαχειριστών", + "Member groups": "Ομάδες μελών", + "Viewer groups": "Ομάδες αναγνωστών", + "Viewers": "Αναγνώστες", + "Owning group": "Ομάδα ιδιοκτήτη", + "Nextcloud groups whose members manage the project": "Ομάδες Nextcloud των οποίων τα μέλη διαχειρίζονται το έργο", + "Nextcloud groups whose members work on the project": "Ομάδες Nextcloud των οποίων τα μέλη δουλεύουν στο έργο", + "Nextcloud groups whose members may read the project": "Ομάδες Nextcloud των οποίων τα μέλη μπορούν να διαβάζουν το έργο", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Χρήστες Nextcloud που διαχειρίζονται το έργο: ρυθμίσεις, μέλη και εργασία", + "Nextcloud user ids who may read the project and its work but not change it": "Χρήστες Nextcloud που μπορούν να διαβάζουν το έργο και την εργασία του αλλά όχι να τα αλλάζουν", + "The Nextcloud group that owns the project with its creator, at most one": "Η ομάδα Nextcloud που κατέχει το έργο μαζί με τον δημιουργό του, το πολύ μία", + "Nextcloud user ids who may read this through the project": "Χρήστες Nextcloud που μπορούν να διαβάζουν αυτό μέσω του έργου", + "Nextcloud groups whose members may change this through the project": "Ομάδες Nextcloud των οποίων τα μέλη μπορούν να αλλάζουν αυτό μέσω του έργου", + "Nextcloud groups whose members may read this through the project": "Ομάδες Nextcloud των οποίων τα μέλη μπορούν να διαβάζουν αυτό μέσω του έργου", + "Search for a person or a group…": "Αναζήτηση ατόμου ή ομάδας…", + "No one found. Your admin's sharing settings decide who you can find.": "Δεν βρέθηκε κανείς. Οι ρυθμίσεις κοινής χρήσης του διαχειριστή σας καθορίζουν ποιους μπορείτε να βρείτε.", + "Type at least two characters": "Πληκτρολογήστε τουλάχιστον δύο χαρακτήρες", + "Everyone in this group": "Όλοι σε αυτή την ομάδα", + "Could not search for people. Please try again.": "Η αναζήτηση ατόμων απέτυχε. Δοκιμάστε ξανά.", + "Could not remove the group": "Δεν ήταν δυνατή η αφαίρεση της ομάδας", + "Only the owner and managers change who is on this project.": "Μόνο ο κάτοχος και οι διαχειριστές αλλάζουν ποιοι συμμετέχουν σε αυτό το έργο.", + "Role of {name}": "Ρόλος: {name}", + "Manager": "Διαχειριστής", + "Member": "Μέλος", + "Viewer": "Αναγνώστης", + "Could not change the role": "Δεν ήταν δυνατή η αλλαγή του ρόλου", + "Owned by group: {name}": "Ιδιοκτησία της ομάδας: {name}", + "No group owns this project.": "Καμία ομάδα δεν κατέχει αυτό το έργο.", + "Owned by group": "Ιδιοκτησία ομάδας", + "Search for a group…": "Αναζήτηση ομάδας…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Δεν βρέθηκε ομάδα. Οι ρυθμίσεις κοινής χρήσης του διαχειριστή σας ορίζουν ποιες ομάδες μπορείτε να βρείτε.", + "No owning group": "Χωρίς ομάδα ιδιοκτήτη", + "Could not search for groups. Please try again.": "Η αναζήτηση ομάδων απέτυχε. Δοκιμάστε ξανά.", + "Could not change the owning group": "Δεν ήταν δυνατή η αλλαγή της ομάδας ιδιοκτήτη", + "You can read this project. Only its members change it.": "Μπορείτε να διαβάσετε αυτό το έργο. Μόνο τα μέλη του το αλλάζουν.", + "Course": "Μάθημα", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Το μάθημα που διδάσκεται σε αυτή την ώρα, για παράδειγμα ένα μάθημα επιλογής, όταν η εκπαιδευτική εφαρμογή του σχολείου το γνωρίζει.", + "Online meeting link": "Σύνδεσμος διαδικτυακού μαθήματος", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Πού συνδέονται οι μαθητές σε αυτό το μάθημα διαδικτυακά. Το κουμπί Συμμετοχή εμφανίζεται μόνο για σύνδεσμο https." }, "plurals": null } diff --git a/l10n/en.js b/l10n/en.js index 56e91dfe..7887e14a 100644 --- a/l10n/en.js +++ b/l10n/en.js @@ -200,7 +200,1146 @@ OC.L10N.register( "Overdue": "Overdue", "Assigned to: {user}": "Assigned to: {user}", "No tasks": "No tasks", - "Could not move the task. Please try again.": "Could not move the task. Please try again." + "Could not move the task. Please try again.": "Could not move the task. Please try again.", + "Active projects": "Active projects", + "Archived projects": "Archived projects", + "Boards": "Boards", + "My projects": "My projects", + "Portfolio": "Portfolio", + "Project board": "Project board", + "Projects I am in": "Projects I am in", + "Timeline": "Timeline", + "Timesheet": "Timesheet", + "Features & roadmap": "Features & roadmap", + "Flow": "Flow", + "Flows": "Flows", + "Billable": "Billable", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Loading projects", + "No projects for this client yet": "No projects for this client yet", + "Open in Planninq": "Open in Planninq", + "This project could not be found": "This project could not be found", + "Untitled project": "Untitled project", + "and {count} more": "and {count} more", + "Work Date": "Work Date", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Column actions", + "Columns": "Columns", + "Could not remove the column. Please try again.": "Could not remove the column. Please try again.", + "Could not save the column. Please try again.": "Could not save the column. Please try again.", + "Done column": "Done column", + "Edit column": "Edit column", + "Keep the card's status": "Keep the card's status", + "Move its cards to": "Move its cards to", + "Move left": "Move left", + "Move right": "Move right", + "Status of cards moved here": "Status of cards moved here", + "The last done column cannot be removed.": "The last done column cannot be removed.", + "WIP limit": "WIP limit", + "over limit": "over limit", + "The status a card gets when it is moved into this column.": "The status a card gets when it is moved into this column.", + "All priorities": "All priorities", + "Could not create the task. Please try again.": "Could not create the task. Please try again.", + "Created": "Created", + "Move to backlog": "Move to backlog", + "Move to board": "Move to board", + "New task": "New task", + "Nothing in the backlog": "Nothing in the backlog", + "Rank": "Rank", + "Sort by": "Sort by", + "Sort by rank to reorder": "Sort by rank to reorder", + "Task actions": "Task actions", + "All labels": "All labels", + "Filter tasks by label": "Filter tasks by label", + "View timeline": "View timeline", + "Board": "Board", + "List": "List", + "Column": "Column", + "Board or list": "Board or list", + "Log": "Log", + "Add entry": "Add entry", + "Show": "Show", + "No actions yet": "No actions yet", + "Closed": "Closed", + "Entry actions": "Entry actions", + "Add action": "Add action", + "by {author}": "by {author}", + "saved {time}": "saved {time}", + "Attendees: {names}": "Attendees: {names}", + "Nothing logged yet": "Nothing logged yet", + "Add the first entry": "Add the first entry", + "Issues": "Issues", + "Lessons learned": "Lessons learned", + "Meetings": "Meetings", + "Decisions": "Decisions", + "Actions": "Actions", + "Issue": "Issue", + "Lesson learned": "Lesson learned", + "Meeting": "Meeting", + "Decision": "Decision", + "About this project": "About this project", + "No description yet": "No description yet", + "Start date": "Start date", + "Not set": "Not set", + "End date": "End date", + "Progress": "Progress", + "No tasks yet": "No tasks yet", + "Open the board": "Open the board", + "People": "People", + "Owner": "Owner", + "Latest log entries": "Latest log entries", + "Open the log": "Open the log", + "{done} of {total} tasks done": "{done} of {total} tasks done", + "Edit entry": "Edit entry", + "Type": "Type", + "Date": "Date", + "Attendees": "Attendees", + "Issue is closed": "Issue is closed", + "Could not save the entry. Please try again.": "Could not save the entry. Please try again.", + "From: {title}": "From: {title}", + "What needs to happen": "What needs to happen", + "Could not create the action. Please try again.": "Could not create the action. Please try again.", + "The action was created but could not be linked to the entry.": "The action was created but could not be linked to the entry.", + "Project pages": "Project pages", + "Overview": "Overview", + "Risks": "Risks", + "Log entry": "Log entry", + "A short name for the entry": "A short name for the entry", + "Project": "Project", + "The project this entry belongs to": "The project this entry belongs to", + "What kind of entry this is": "What kind of entry this is", + "When it happened": "When it happened", + "What happened, in Markdown": "What happened, in Markdown", + "Whether an issue is still open": "Whether an issue is still open", + "The people at a meeting": "The people at a meeting", + "Tasks that came out of this entry": "Tasks that came out of this entry", + "Add risk": "Add risk", + "Risk": "Risk", + "Score": "Score", + "Response": "Response", + "Review date": "Review date", + "no longer on the project": "no longer on the project", + "Edit {title}": "Edit {title}", + "No risks recorded yet": "No risks recorded yet", + "Add the first risk": "Add the first risk", + "Medium": "Medium", + "Mitigating": "Mitigating", + "Occurred": "Occurred", + "Avoid": "Avoid", + "Reduce": "Reduce", + "Transfer": "Transfer", + "Accept": "Accept", + "Highest open risks": "Highest open risks", + "No open risks": "No open risks", + "Open the risk register": "Open the risk register", + "Edit risk": "Edit risk", + "What could go wrong": "What could go wrong", + "Likelihood": "Likelihood", + "Impact": "Impact", + "Score {score}": "Score {score}", + "Countermeasures": "Countermeasures", + "Could not save the risk. Please try again.": "Could not save the risk. Please try again.", + "Risks by likelihood and impact": "Risks by likelihood and impact", + "Risk scale": "Risk scale", + "The levels every project scores its risks on, and where low turns into medium and high": "The levels every project scores its risks on, and where low turns into medium and high", + "Number of levels": "Number of levels", + "Likelihood labels": "Likelihood labels", + "Impact labels": "Impact labels", + "Level {level}": "Level {level}", + "Medium from score": "Medium from score", + "High from score": "High from score", + "Risk scale saved": "Risk scale saved", + "1 risk uses level {level}. Change it first.": "1 risk uses level {level}. Change it first.", + "{count} risks use level {level}. Change them first.": "{count} risks use level {level}. Change them first.", + "Every level needs a label, and high must start above medium.": "Every level needs a label, and high must start above medium.", + "The project this risk belongs to": "The project this risk belongs to", + "The cause and the effect, in Markdown": "The cause and the effect, in Markdown", + "Category": "Category", + "A free grouping, such as planning, budget or supplier": "A free grouping, such as planning, budget or supplier", + "How likely it is, on the admin's risk scale": "How likely it is, on the admin's risk scale", + "How hard it would hit, on the admin's risk scale": "How hard it would hit, on the admin's risk scale", + "Likelihood times impact, calculated by the server": "Likelihood times impact, calculated by the server", + "Where the risk stands": "Where the risk stands", + "The person who watches this risk": "The person who watches this risk", + "How the project answers the risk": "How the project answers the risk", + "What is done to prevent it or soften it, in Markdown": "What is done to prevent it or soften it, in Markdown", + "When to look at this risk again": "When to look at this risk again", + "Very low": "Very low", + "Very high": "Very high", + "All projects": "All projects", + "Project status report": "Project status report", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.", + "The project this report is about": "The project this report is about", + "Report date": "Report date", + "The day the report describes": "The day the report describes", + "Money": "Money", + "How the project stands on this aspect": "How the project stands on this aspect", + "On track": "On track", + "At risk": "At risk", + "Off track": "Off track", + "Money note": "Money note", + "A short explanation of this status": "A short explanation of this status", + "Organisation": "Organisation", + "Organisation note": "Organisation note", + "Time": "Time", + "Time note": "Time note", + "Information": "Information", + "Information note": "Information note", + "Quality": "Quality", + "Quality note": "Quality note", + "Risk note": "Risk note", + "Overall": "Overall", + "The worst of the six statuses, calculated by the server": "The worst of the six statuses, calculated by the server", + "Health: money": "Health: money", + "Copied from the newest status report": "Copied from the newest status report", + "Health: organisation": "Health: organisation", + "Health: time": "Health: time", + "Health: information": "Health: information", + "Health: quality": "Health: quality", + "Health: risk": "Health: risk", + "Health: overall": "Health: overall", + "Health: report date": "Health: report date", + "The date of the newest status report": "The date of the newest status report", + "New report": "New report", + "Only the project owner writes status reports.": "Only the project owner writes status reports.", + "Latest report, {date}": "Latest report, {date}", + "Aspect": "Aspect", + "Note": "Note", + "Report history": "Report history", + "Author": "Author", + "No status reports yet": "No status reports yet", + "Write the first report": "Write the first report", + "Choose a status for every aspect to save the report.": "Choose a status for every aspect to save the report.", + "Suggested: on track.": "Suggested: on track.", + "Suggested: at risk.": "Suggested: at risk.", + "Suggested: off track.": "Suggested: off track.", + "1 task is past its due date.": "1 task is past its due date.", + "{count} tasks are past their due date.": "{count} tasks are past their due date.", + "The end date has passed with 1 open task.": "The end date has passed with 1 open task.", + "The end date has passed with {count} open tasks.": "The end date has passed with {count} open tasks.", + "No open task is past its due date.": "No open task is past its due date.", + "The highest open risk, \"{title}\", scores {score}.": "The highest open risk, \"{title}\", scores {score}.", + "There are no open risks.": "There are no open risks.", + "Costs are at {percent}% of the budget.": "Costs are at {percent}% of the budget.", + "No suggestion: the project has no budget.": "No suggestion: the project has no budget.", + "No suggestion: no costs are recorded for this project yet.": "No suggestion: no costs are recorded for this project yet.", + "The report was not saved. Only the project owner can write status reports.": "The report was not saved. Only the project owner can write status reports.", + "No report": "No report", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.", + "The name of the portfolio": "The name of the portfolio", + "What the portfolio holds and who runs it": "What the portfolio holds and who runs it", + "A colour for the portfolio's section in project lists": "A colour for the portfolio's section in project lists", + "Managers": "Managers", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud user UIDs of the people who run the portfolio", + "Order": "Order", + "Where the portfolio comes in project lists, lowest first": "Where the portfolio comes in project lists, lowest first", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.", + "Portfolio readers": "Portfolio readers", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud user UIDs of the managers of the project's portfolio", + "The portfolio this project belongs to": "The portfolio this project belongs to", + "No portfolio": "No portfolio", + "All portfolios": "All portfolios", + "You read this project as a manager of its portfolio. Only its members change it.": "You read this project as a manager of its portfolio. Only its members change it.", + "Portfolios": "Portfolios", + "Portfolio status": "Portfolio status", + "No portfolios yet": "No portfolios yet", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.", + "Roll-up": "Roll-up", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report", + "No project in this portfolio that you can read.": "No project in this portfolio that you can read.", + "Start": "Start", + "End": "End", + "Budget": "Budget", + "Last report": "Last report", + "Out of date": "Out of date", + "Portfolio timeline": "Portfolio timeline", + "Zoom": "Zoom", + "Could not load the timeline": "Could not load the timeline", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Open a project to see its phases and tasks. The timeline is read-only.", + "Phase: {title}": "Phase: {title}", + "Left out because you cannot read them: {count} projects": "Left out because you cannot read them: {count} projects", + "Week": "Week", + "Day": "Day", + "Month": "Month", + "Please try again later.": "Please try again later.", + "Status reports": "Status reports", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "After how many days a project's latest status report is marked out of date on the portfolio overview", + "Reporting period (days)": "Reporting period (days)", + "The reporting period is a whole number of days from 1 to 365.": "The reporting period is a whole number of days from 1 to 365.", + "Reporting period saved": "Reporting period saved", + "The reporting period was not saved. Please try again.": "The reporting period was not saved. Please try again.", + "Every project of a portfolio with its status per aspect, rolled up.": "Every project of a portfolio with its status per aspect, rolled up.", + "The projects of a portfolio on one timeline.": "The projects of a portfolio on one timeline.", + "Phases": "Phases", + "Add phase": "Add phase", + "No phases yet": "No phases yet", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.", + "{hours} hours": "{hours} hours", + "Concluding document: {title}": "Concluding document: {title}", + "Concluding document missing": "Concluding document missing", + "Move {title} up": "Move {title} up", + "Move {title} down": "Move {title} down", + "Close phase": "Close phase", + "Phase": "Phase", + "Files": "Files", + "Notes": "Notes", + "Audit trail": "Audit trail", + "Edit phase": "Edit phase", + "Name": "Name", + "Budget hours": "Budget hours", + "Could not save the phase. Please try again.": "Could not save the phase. Please try again.", + "Close phase {title}": "Close phase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "A phase closes with its concluding document: upload it here or pick one of the phase's files.", + "Concluding document": "Concluding document", + "This phase has no files yet.": "This phase has no files yet.", + "Upload a document": "Upload a document", + "The document was not uploaded. Please try again.": "The document was not uploaded. Please try again.", + "Upload the concluding document before you close this phase.": "Upload the concluding document before you close this phase.", + "This phase cannot be closed from its current status.": "This phase cannot be closed from its current status.", + "The phase was not closed. Please try again.": "The phase was not closed. Please try again.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.", + "Import from Microsoft Project": "Import from Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.", + "Plan file": "Plan file", + "What the import creates": "What the import creates", + "Tasks": "Tasks", + "Sub-tasks": "Sub-tasks", + "Milestones": "Milestones", + "Links": "Links", + "Already imported, updated in place: {count}": "Already imported, updated in place: {count}", + "What does not carry over": "What does not carry over", + "Tasks with resources, which are not imported: {count}": "Tasks with resources, which are not imported: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tasks deeper than level 3, placed under their level-2 task: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Links other than finish-to-start, imported as related links: {count}", + "Link lags, which are dropped: {count}": "Link lags, which are dropped: {count}", + "Links to a summary task, which are not imported: {count}": "Links to a summary task, which are not imported: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Links to tasks outside this plan, which are not imported: {count}", + "No longer in the plan": "No longer in the plan", + "These stay in the project; remove them yourself if they are no longer needed.": "These stay in the project; remove them yourself if they are no longer needed.", + "Import": "Import", + "Close": "Close", + "The plan is imported: {created} created, {updated} updated.": "The plan is imported: {created} created, {updated} updated.", + "Links that would close a loop were left out: {count}": "Links that would close a loop were left out: {count}", + "The import stopped part-way. Run it again to finish it.": "The import stopped part-way. Run it again to finish it.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.", + "This file declares a DOCTYPE or entities, which are not accepted.": "This file declares a DOCTYPE or entities, which are not accepted.", + "The file is larger than 10 MB.": "The file is larger than 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "The plan has more than 2,000 tasks, more than one import takes.", + "This file is not a Microsoft Project plan in XML format.": "This file is not a Microsoft Project plan in XML format.", + "Choose a file to import.": "Choose a file to import.", + "Only the project owner can import a plan.": "Only the project owner can import a plan.", + "The plan could not be read. Please try again.": "The plan could not be read. Please try again.", + "Linked case: {title}": "Linked case: {title}", + "Linked to a case": "Linked to a case", + "Hand over to case": "Hand over to case", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.", + "{date} by {user}": "{date} by {user}", + "Files copied: {count}": "Files copied: {count}", + "Files that failed: {names}": "Files that failed: {names}", + "The handover failed. Please try again.": "The handover failed. Please try again.", + "The linked case could not be found, or you cannot open it.": "The linked case could not be found, or you cannot open it.", + "Case handovers": "Case handovers", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.", + "Finance": "Finance", + "Add cost line": "Add cost line", + "Delivery terms": "Delivery terms", + "Billing model": "Billing model", + "Budget in euro": "Budget in euro", + "Budget in hours": "Budget in hours", + "Hourly rate in euro": "Hourly rate in euro", + "Planned start": "Planned start", + "Planned end": "Planned end", + "Planned dates": "Planned dates", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "No budget agreed", + "Hours": "Hours", + "Only the project owner and the portfolio managers see the amounts.": "Only the project owner and the portfolio managers see the amounts.", + "Budget against cost per category": "Budget against cost per category", + "Labour (booked time)": "Labour (booked time)", + "No category": "No category", + "Hours are not available": "Hours are not available", + "Not yet assigned to a category": "Not yet assigned to a category", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} spent, {remaining} remaining", + "Budget against cost per phase": "Budget against cost per phase", + "No phase": "No phase", + "Cost lines": "Cost lines", + "From the finance system": "From the finance system", + "Edit cost line {amount}": "Edit cost line {amount}", + "No cost lines yet": "No cost lines yet", + "Commitments": "Commitments", + "Actual cost": "Actual cost", + "Forecast": "Forecast", + "Remaining": "Remaining", + "Not planned yet": "Not planned yet", + "{start} to {end}": "{start} to {end}", + "The terms were not saved. Please try again.": "The terms were not saved. Please try again.", + "Terms saved": "Terms saved", + "Fixed price": "Fixed price", + "Hourly": "Hourly", + "Not billed": "Not billed", + "Commitment": "Commitment", + "Edit cost line": "Edit cost line", + "Kind": "Kind", + "Amount in euro": "Amount in euro", + "Remove": "Remove", + "Could not save the cost line. Only the project owner changes the money of a project.": "Could not save the cost line. Only the project owner changes the money of a project.", + "Could not remove the cost line. Please try again.": "Could not remove the cost line. Please try again.", + "{amount} over budget": "{amount} over budget", + "Cost categories": "Cost categories", + "The categories every project splits its budget and costs into, one per line": "The categories every project splits its budget and costs into, one per line", + "Categories": "Categories", + "Give at least one category, each name once.": "Give at least one category, each name once.", + "Cost categories saved": "Cost categories saved", + "The cost categories were not saved. Please try again.": "The cost categories were not saved. Please try again.", + "Finance line": "Finance line", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.", + "The phase this amount belongs to, if any": "The phase this amount belongs to, if any", + "The cost category, one of the categories the admin set up": "The cost category, one of the categories the admin set up", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Whether the amount is a budget, a commitment, an actual cost or a forecast", + "Amount": "Amount", + "The amount in the reporting currency (euro)": "The amount in the reporting currency (euro)", + "The date the amount was booked or is expected": "The date the amount was booked or is expected", + "What the amount is for": "What the amount is for", + "Whether a person entered the line or the finance system sent it": "Whether a person entered the line or the finance system sent it", + "Entered by hand": "Entered by hand", + "Finance line id": "Finance line id", + "The finance system's own id of this line. One imported line per id.": "The finance system's own id of this line. One imported line per id.", + "Project number": "Project number", + "The project number the finance system sent, matched against the project key": "The project number the finance system sent, matched against the project key", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "The portfolio of the line's project, copied from the project so portfolio totals need one filter", + "Finance readers": "Finance readers", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio", + "Project owner": "Project owner", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud user UID of the project owner, who may change and remove manual lines", + "How the client pays: not billed, a fixed price, or by the hour.": "How the client pays: not billed, a fixed price, or by the hour.", + "Portfolio finance": "Portfolio finance", + "You cannot see the money of any project in this portfolio": "You cannot see the money of any project in this portfolio", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.", + "Projects left out because you cannot see their money: {count}": "Projects left out because you cannot see their money: {count}", + "Unmatched finance lines": "Unmatched finance lines", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, commitments, actual cost and forecast totalled across a portfolio.", + "Subprojects": "Subprojects", + "{done} of {total}": "{done} of {total}", + "{done} of {total} tasks done, including subprojects": "{done} of {total} tasks done, including subprojects", + "Show the subprojects of {title}": "Show the subprojects of {title}", + "Hide the subprojects of {title}": "Hide the subprojects of {title}", + "Part of": "Part of", + "No parent project": "No parent project", + "A project cannot sit under one of its own subprojects.": "A project cannot sit under one of its own subprojects.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projects nest three levels deep at most: programme, project and subproject.", + "Parent project": "Parent project", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "The project this project sits under, such as a programme. Projects nest three levels deep at most.", + "Yes": "Yes", + "No": "No", + "{label} (required)": "{label} (required)", + "{label} is required": "{label} is required", + "Project field": "Project field", + "A field an admin adds to every project, such as a policy area or a contract value.": "A field an admin adds to every project, such as a policy area or a contract value.", + "Key": "Key", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "The stable name the value is stored under, in lower camel case. Keep it once projects use it.", + "Label": "Label", + "The name people see next to the field": "The name people see next to the field", + "What the field holds": "What the field holds", + "Text": "Text", + "Number": "Number", + "Choice": "Choice", + "Person": "Person", + "Yes or no": "Yes or no", + "Options": "Options", + "The choices of a choice field": "The choices of a choice field", + "Required": "Required", + "Whether a project must fill in the field": "Whether a project must fill in the field", + "Where the field appears, lowest first": "Where the field appears, lowest first", + "Applies to": "Applies to", + "What the field is added to": "What the field is added to", + "Custom fields": "Custom fields", + "The values of the project fields an admin defined, keyed by the field's key.": "The values of the project fields an admin defined, keyed by the field's key.", + "Project fields": "Project fields", + "Related": "Related", + "Remove link": "Remove link", + "Link type": "Link type", + "Relates to": "Relates to", + "Duplicates": "Duplicates", + "Project key": "Project key", + "Every task number starts with it, such as VERG-42.": "Every task number starts with it, such as VERG-42.", + "This key is already used by another project.": "This key is already used by another project.", + "Use 2 to 10 letters and digits, starting with a letter.": "Use 2 to 10 letters and digits, starting with a letter.", + "The key cannot change once tasks carry it.": "The key cannot change once tasks carry it.", + "Project saved. The existing tasks get their numbers in the background.": "Project saved. The existing tasks get their numbers in the background.", + "Next task number": "Next task number", + "The number the next task of this project gets in its key. Only the system writes it.": "The number the next task of this project gets in its key. Only the system writes it.", + "Restore {title}": "Restore {title}", + "Restore": "Restore", + "Project restored": "Project restored", + "Could not restore the project": "Could not restore the project", + "Bring this project back to the active list.": "Bring this project back to the active list.", + "Restore project": "Restore project", + "Request reason": "Request reason", + "Why the requester needs this project. Filled in when the project is requested.": "Why the requester needs this project. Filled in when the project is requested.", + "Reviewed by": "Reviewed by", + "The user who approved or rejected the request.": "The user who approved or rejected the request.", + "Reviewed at": "Reviewed at", + "When the request was approved or rejected.": "When the request was approved or rejected.", + "Review note": "Review note", + "The reviewer's reason, shown to the requester when a request is not approved.": "The reviewer's reason, shown to the requester when a request is not approved.", + "Members of these groups": "Members of these groups", + "Groups that may create projects": "Groups that may create projects", + "The group {group} no longer exists. Save to remove it.": "The group {group} no longer exists. Save to remove it.", + "Review project request": "Review project request", + "Requested by": "Requested by", + "Why it is needed": "Why it is needed", + "Desired start date": "Desired start date", + "Why is it not approved?": "Why is it not approved?", + "Give a reason. The requester sees it.": "Give a reason. The requester sees it.", + "Approve": "Approve", + "Reject": "Reject", + "Reject request": "Reject request", + "The review was not saved. Try again.": "The review was not saved. Try again.", + "This project is waiting for review": "This project is waiting for review", + "This request was not approved": "This request was not approved", + "Reason: {note}": "Reason: {note}", + "Review request": "Review request", + "Request a project": "Request a project", + "Step {step} of 2": "Step {step} of 2", + "Why is this project needed?": "Why is this project needed?", + "Give a reason. The reviewer reads it.": "Give a reason. The reviewer reads it.", + "Back": "Back", + "Next": "Next", + "Send request": "Send request", + "The request was not sent. Try again.": "The request was not sent. Try again.", + "Requested": "Requested", + "Not approved": "Not approved", + "Your request was sent": "Your request was sent", + "Let everyone else request a project": "Let everyone else request a project", + "Add a task": "Add a task", + "Delete task": "Delete task", + "Edit task": "Edit task", + "Write": "Write", + "Preview": "Preview", + "Markdown works here: headings, lists and links.": "Markdown works here: headings, lists and links.", + "Could not save the task. Please try again.": "Could not save the task. Please try again.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.", + "Keep task": "Keep task", + "Cancel task": "Cancel task", + "Only the reporter, the project owner or an admin can delete this task.": "Only the reporter, the project owner or an admin can delete this task.", + "Could not delete the task. Please try again.": "Could not delete the task. Please try again.", + "Could not cancel the task. Please try again.": "Could not cancel the task. Please try again.", + "In progress": "In progress", + "Responsible": "Responsible", + "Also working on this": "Also working on this", + "Labels": "Labels", + "Could not change the priority. Please try again.": "Could not change the priority. Please try again.", + "Other project members who work on this task alongside the person responsible.": "Other project members who work on this task alongside the person responsible.", + "Duplicate": "Duplicate", + "Could not copy the task. Please try again.": "Could not copy the task. Please try again.", + "Subtasks": "Subtasks", + "{done} of {total} done": "{done} of {total} done", + "Add a subtask": "Add a subtask", + "Checklist": "Checklist", + "Checklist item actions": "Checklist item actions", + "Add a checklist item": "Add a checklist item", + "Subtasks: {estimate} estimated, {logged} logged": "Subtasks: {estimate} estimated, {logged} logged", + "Total estimate: {total}": "Total estimate: {total}", + "Part of {title}": "Part of {title}", + "Checklist: {count} done": "Checklist: {count} done", + "This task has subtasks: {count}.": "This task has subtasks: {count}.", + "Keep subtasks as separate tasks": "Keep subtasks as separate tasks", + "Delete subtasks too": "Delete subtasks too", + "Copy of {title}": "Copy of {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "The task was copied, but not all of its subtasks. Please check the copy.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Small steps inside the task. Each item has an id, a text and whether it is done.", + "Open work per person and per project.": "Open work per person and per project.", + "View": "View", + "By person": "By person", + "By project": "By project", + "Hours left": "Hours left", + "Tasks without an estimate": "Tasks without an estimate", + "Due in 14 days": "Due in 14 days", + "Shared": "Shared", + "Unassigned": "Unassigned", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.", + "No open work in these projects.": "No open work in these projects.", + "Open work": "Open work", + "{count} open tasks": "{count} open tasks", + "Create a project to see capacity here.": "Create a project to see capacity here.", + "My tasks": "My tasks", + "Show all my tasks": "Show all my tasks", + "No tasks assigned to you": "No tasks assigned to you", + "Browse projects": "Browse projects", + "Later": "Later", + "Due {date}": "Due {date}", + "Could not change the status. Please try again.": "Could not change the status. Please try again.", + "Completed today": "Completed today", + "My open tasks": "My open tasks", + "My overdue tasks": "My overdue tasks", + "My tasks in progress": "My tasks in progress", + "Pin to the top": "Pin to the top", + "Unpin": "Unpin", + "Pinned": "Pinned", + "Actions for {title}": "Actions for {title}", + "Could not save your project order. Please try again.": "Could not save your project order. Please try again.", + "No boards yet": "No boards yet", + "Create a project to get a board.": "Create a project to get a board.", + "Use the Projects page to create and manage your projects and tasks.": "Use the Projects page to create and manage your projects and tasks.", + "Go to projects": "Go to projects", + "You are not a member of any projects yet.": "You are not a member of any projects yet.", + "Could not search for users. Please try again.": "Could not search for users. Please try again.", + "Project creation is restricted to administrators.": "Project creation is restricted to administrators.", + "Only the project owner or an administrator can delete this project.": "Only the project owner or an administrator can delete this project.", + "No projects are available to you yet. Ask an administrator to create one.": "No projects are available to you yet. Ask an administrator to create one.", + "Due: {date}": "Due: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Tasks with a start or due date appear on the timeline. Add dates to see them here.", + "You do not have access to this project.": "You do not have access to this project.", + "Zoom level": "Zoom level", + "Unscheduled": "Unscheduled", + "Start: {date}": "Start: {date}", + "Today": "Today", + "No scheduled tasks": "No scheduled tasks", + "An unexpected error occurred.": "An unexpected error occurred.", + "Column {number} name": "Column {number} name", + "Failed to save creation policy": "Failed to save creation policy", + "All authenticated users": "All authenticated users", + "Control who may create new projects": "Control who may create new projects", + "Administrators only": "Administrators only", + "Project creation": "Project creation", + "Allow project creation": "Allow project creation", + "Creation policy saved successfully": "Creation policy saved successfully", + "Initializing…": "Initializing…", + "e.g. 2h 30m, 90m, 1.5h": "e.g. 2h 30m, 90m, 1.5h", + "Log time": "Log time", + "Save estimate": "Save estimate", + "Logged: {logged}": "Logged: {logged}", + "over by {amount}": "over by {amount}", + "Time tracking": "Time tracking", + "Estimate": "Estimate", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Could not save the time entry. Please try again.", + "Edit time entry": "Edit time entry", + "Duration": "Duration", + "Date range": "Date range", + "Last week": "Last week", + "No time logged": "No time logged", + "Log time on a task to see it here.": "Log time on a task to see it here.", + "To date": "To date", + "This week": "This week", + "Total: {total}": "Total: {total}", + "From date": "From date", + "Custom range": "Custom range", + "All time": "All time", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Could not delete a task, so some data may remain. Try deleting the project again.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Could not delete a time entry, so some data may remain. Try deleting the project again.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Could not delete a column, so some data may remain. Try deleting the project again.", + "Could not delete the project. Please try again.": "Could not delete the project. Please try again.", + "Notification settings": "Notification settings", + "Configure when due-date reminders are sent": "Configure when due-date reminders are sent", + "Due-date reminder lead time (hours)": "Due-date reminder lead time (hours)", + "Lead time must be between 1 and 336 hours": "Lead time must be between 1 and 336 hours", + "Reminder lead time saved successfully": "Reminder lead time saved successfully", + "Failed to save reminder lead time": "Failed to save reminder lead time", + "Notifications": "Notifications", + "Notify me 1 day before a task's due date": "Notify me 1 day before a task's due date", + "Draft": "Draft", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.", + "New release": "New release", + "Roadmap chart. The same releases and epics are listed below.": "Roadmap chart. The same releases and epics are listed below.", + "Nothing on the roadmap yet": "Nothing on the roadmap yet", + "Releases with a target date and epics with dated tasks appear here.": "Releases with a target date and epics with dated tasks appear here.", + "Releases": "Releases", + "No releases yet": "No releases yet", + "Target date: {date}": "Target date: {date}", + "No target date": "No target date", + "Edit {name}": "Edit {name}", + "Mark {name} as released": "Mark {name} as released", + "Mark as released": "Mark as released", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "No epics yet. Open a task to make it an epic.", + "Not scheduled yet": "Not scheduled yet", + "Planned": "Planned", + "Released": "Released", + "Edit release": "Edit release", + "Target date": "Target date", + "Could not save the release. Please try again.": "Could not save the release. Please try again.", + "Every task of this release is done or cancelled.": "Every task of this release is done or cancelled.", + "Not finished yet: {count}": "Not finished yet: {count}", + "What happens to these tasks?": "What happens to these tasks?", + "Move to {name}": "Move to {name}", + "Remove the release": "Remove the release", + "Keep it on {name}": "Keep it on {name}", + "Could not mark the release as released. Please try again.": "Could not mark the release as released. Please try again.", + "Roadmap": "Roadmap", + "Tasks or roadmap": "Tasks or roadmap", + "Release": "Release", + "Epic": "Epic", + "This task is an epic": "This task is an epic", + "A named, dated delivery of a project that its tasks are planned against.": "A named, dated delivery of a project that its tasks are planned against.", + "Name of the release": "Name of the release", + "The project this release belongs to": "The project this release belongs to", + "What this release delivers": "What this release delivers", + "When work on the release starts": "When work on the release starts", + "The date the release is due": "The date the release is due", + "Whether the release is planned, released or archived": "Whether the release is planned, released or archived", + "Released on": "Released on", + "When the release was marked as released": "When the release was marked as released", + "The release this task is planned for": "The release this task is planned for", + "Board view options": "Board view options", + "Colour cards": "Colour cards", + "No colour": "No colour", + "By label": "By label", + "By priority": "By priority", + "Swimlanes": "Swimlanes", + "No swimlanes": "No swimlanes", + "By assignee": "By assignee", + "By epic": "By epic", + "No assignee": "No assignee", + "No epic": "No epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Cards stay in their epic row. Change the epic on the task page.", + "Hand over to": "Hand over to", + "Could not save your board view. It applies until you reload.": "Could not save your board view. It applies until you reload.", + "Timetable wish": "Timetable wish", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.", + "Whether the wish is about a teacher, a group, a room or one activity": "Whether the wish is about a teacher, a group, a room or one activity", + "Teacher": "Teacher", + "Group": "Group", + "Reference": "Reference", + "The user, group, room or activity the wish is about": "The user, group, room or activity the wish is about", + "What the wish asks for": "What the wish asks for", + "Not on these periods": "Not on these periods", + "Preferably not on these periods": "Preferably not on these periods", + "At most a number of lessons a day": "At most a number of lessons a day", + "No free periods between lessons": "No free periods between lessons", + "Always the same room": "Always the same room", + "Periods": "Periods", + "The periods of the week the wish is about, such as wed-5": "The periods of the week the wish is about, such as wed-5", + "Limit": "Limit", + "The most lessons a day, for a wish of that kind": "The most lessons a day, for a wish of that kind", + "Strength": "Strength", + "Whether the generator must keep the wish or should keep it": "Whether the generator must keep the wish or should keep it", + "Hard": "Hard", + "Soft": "Soft", + "Weight": "Weight", + "How much a soft wish counts, from 1 to 3": "How much a soft wish counts, from 1 to 3", + "Why the wish exists": "Why the wish exists", + "Timetable scenario": "Timetable scenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.", + "The name timetablers know the scenario by": "The name timetablers know the scenario by", + "Whether the generator made it or it came from the current timetable": "Whether the generator made it or it came from the current timetable", + "Generated": "Generated", + "From the current timetable": "From the current timetable", + "Week of": "Week of", + "The Monday of the first week of the window": "The Monday of the first week of the window", + "Window start": "Window start", + "The first day the week pattern applies to": "The first day the week pattern applies to", + "Window end": "Window end", + "The last day the week pattern applies to": "The last day the week pattern applies to", + "Waiting, generating, done, failed, or published as draft lessons": "Waiting, generating, done, failed, or published as draft lessons", + "Waiting": "Waiting", + "Generating": "Generating", + "Failed": "Failed", + "Published": "Published", + "Seed": "Seed", + "The number the generator starts from, so a run can be repeated": "The number the generator starts from, so a run can be repeated", + "Input": "Input", + "The periods, rooms, lessons and wishes the scenario was made from": "The periods, rooms, lessons and wishes the scenario was made from", + "Placements": "Placements", + "Each lesson with the period and room it was given": "Each lesson with the period and room it was given", + "Unplaced lessons": "Unplaced lessons", + "Lessons without a place, each with the hard wish that blocked it": "Lessons without a place, each with the hard wish that blocked it", + "Broken wishes": "Broken wishes", + "The wishes this scenario breaks, with the lessons that break them": "The wishes this scenario breaks, with the lessons that break them", + "Measures": "Measures", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Placed lessons, broken wishes, teacher gaps, lessons a day and room use", + "Reason": "Reason", + "Why the run failed": "Why the run failed", + "Published at": "Published at", + "When the scenario was written out as draft lessons": "When the scenario was written out as draft lessons", + "Edit wish": "Edit wish", + "New wish": "New wish", + "Hard: the generator always keeps it": "Hard: the generator always keeps it", + "Soft: the generator keeps it where it can": "Soft: the generator keeps it where it can", + "Weight (1 to 3)": "Weight (1 to 3)", + "Most lessons a day": "Most lessons a day", + "Period": "Period", + "{day} period {number}": "{day} period {number}", + "Teacher (user name)": "Teacher (user name)", + "Activity (group:subject)": "Activity (group:subject)", + "Say who or what the wish is about.": "Say who or what the wish is about.", + "Choose at least one period.": "Choose at least one period.", + "The limit is a whole number of 1 or more.": "The limit is a whole number of 1 or more.", + "Timetable": "Timetable", + "Wishes": "Wishes", + "Timetable wishes": "Timetable wishes", + "Generator run": "Generator run", + "Generator progress": "Generator progress", + "The run failed: {reason}": "The run failed: {reason}", + "{placed} of {lessons} lessons placed": "{placed} of {lessons} lessons placed", + "Generate again": "Generate again", + "Generate": "Generate", + "Every lesson has a place.": "Every lesson has a place.", + "Lesson": "Lesson", + "No free period and room": "No free period and room", + "Broken soft wishes": "Broken soft wishes", + "Every soft wish is kept.": "Every soft wish is kept.", + "Wish": "Wish", + "Lessons": "Lessons", + "Generating: {percent}% of the time budget used": "Generating: {percent}% of the time budget used", + "Waiting to start": "Waiting to start", + "Published as draft lessons": "Published as draft lessons", + "Could not read the scenario.": "Could not read the scenario.", + "Could not start the run.": "Could not start the run.", + "Scenarios": "Scenarios", + "Timetable scenarios": "Timetable scenarios", + "Scenario": "Scenario", + "Take the current timetable": "Take the current timetable", + "Could not take the current timetable.": "Could not take the current timetable.", + "Broken hard wishes": "Broken hard wishes", + "Not on a period of the week grid": "Not on a period of the week grid", + "Compare scenarios": "Compare scenarios", + "Scenarios to compare": "Scenarios to compare", + "Choose two or three scenarios to compare them.": "Choose two or three scenarios to compare them.", + "Measure": "Measure", + "Best": "Best", + "Lessons that differ": "Lessons that differ", + "No lesson differs.": "No lesson differs.", + "Not placed": "Not placed", + "{period} in {room}": "{period} in {room}", + "Lessons placed": "Lessons placed", + "Lessons without a place": "Lessons without a place", + "Clashes": "Clashes", + "Hard wishes broken": "Hard wishes broken", + "Soft wishes broken": "Soft wishes broken", + "Soft wishes broken, weighted": "Soft wishes broken, weighted", + "Free periods between lessons, all teachers": "Free periods between lessons, all teachers", + "Most free periods of one teacher": "Most free periods of one teacher", + "Most lessons of one group on a day": "Most lessons of one group on a day", + "Room use": "Room use", + "Publish as draft lessons": "Publish as draft lessons", + "Draft lessons written: {count}": "Draft lessons written: {count}", + "Could not publish the scenario.": "Could not publish the scenario.", + "Rules": "Rules", + "Rules for {column}": "Rules for {column}", + "When a card enters this column": "When a card enters this column", + "Action": "Action", + "Set the priority": "Set the priority", + "Assign to": "Assign to", + "Assign the person who moved the card": "Assign the person who moved the card", + "Remove the assignee": "Remove the assignee", + "Add a label": "Add a label", + "No longer a project member": "No longer a project member", + "This label no longer exists": "This label no longer exists", + "Add rule": "Add rule", + "Remove rule": "Remove rule", + "No rules yet. Add one to change a card when it enters this column.": "No rules yet. Add one to change a card when it enters this column.", + "Could not save the rules. Please try again.": "Could not save the rules. Please try again.", + "1 rule runs when a card enters this column": "1 rule runs when a card enters this column", + "{count} rules run when a card enters this column": "{count} rules run when a card enters this column", + "Rules applied: {changes}": "Rules applied: {changes}", + "assigned to {name}": "assigned to {name}", + "assignee removed": "assignee removed", + "priority {priority}": "priority {priority}", + "label {label}": "label {label}", + "What happens to a card when it enters this column, applied in list order.": "What happens to a card when it enters this column, applied in list order.", + "Value": "Value", + "What the rule does to the card.": "What the rule does to the card.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "The priority, the user id or the label id the action uses; empty for actions without one.", + "is not": "is not", + "{dimension} is not": "{dimension} is not", + "Saved filters": "Saved filters", + "No saved filters yet": "No saved filters yet", + "Save filter": "Save filter", + "Rename \"{name}\"": "Rename \"{name}\"", + "Delete \"{name}\"": "Delete \"{name}\"", + "Clear filters": "Clear filters", + "Showing {shown} of {total} tasks": "Showing {shown} of {total} tasks", + "Assignee": "Assignee", + "Me": "Me", + "No date": "No date", + "Rename saved filter": "Rename saved filter", + "Share with the project": "Share with the project", + "Give the filter a name": "Give the filter a name", + "Could not save the filter. Please try again.": "Could not save the filter. Please try again.", + "Some labels in \"{name}\" no longer exist and were left out.": "Some labels in \"{name}\" no longer exist and were left out.", + "Could not delete the filter. Please try again.": "Could not delete the filter. Please try again.", + "Saved filter": "Saved filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "A named board filter of one project, private to the person who saved it unless shared with the project.", + "The project whose board the filter applies to": "The project whose board the filter applies to", + "The name the filter is listed under": "The name the filter is listed under", + "Saved by": "Saved by", + "Nextcloud user id of the person who saved the filter": "Nextcloud user id of the person who saved the filter", + "Shared with the project": "Shared with the project", + "Whether every project member sees and applies the filter": "Whether every project member sees and applies the filter", + "Criteria": "Criteria", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "The filter: assignee, label, priority and due date, each with is or is not and its values", + "Cross-project view": "Cross-project view", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.", + "Shared with": "Shared with", + "The name the view is listed under": "The name the view is listed under", + "Nextcloud user id of the person who saved the view": "Nextcloud user id of the person who saved the view", + "Nextcloud user ids of the people the view is shared with": "Nextcloud user ids of the people the view is shared with", + "The projects whose tasks the view shows, at most twenty": "The projects whose tasks the view shows, at most twenty", + "1 project in this view is hidden from you.": "1 project in this view is hidden from you.", + "{count} projects in this view are hidden from you.": "{count} projects in this view are hidden from you.", + "{project} has no column for {status}.": "{project} has no column for {status}.", + "This view does not exist or is not shared with you.": "This view does not exist or is not shared with you.", + "\"{task}\" moved to {status}.": "\"{task}\" moved to {status}.", + "Project: {title}": "Project: {title}", + "Cross-project views": "Cross-project views", + "New view": "New view", + "Edit view": "Edit view", + "Delete view": "Delete view", + "Give the view a name": "Give the view a name", + "Pick at least one project": "Pick at least one project", + "A view shows at most {max} projects": "A view shows at most {max} projects", + "Could not save the view. Please try again.": "Could not save the view. Please try again.", + "Could not delete the view. Please try again.": "Could not delete the view. Please try again.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Delete \"{title}\"? The projects and their tasks stay as they are.", + "People see the tasks of the projects they are in, never more.": "People see the tasks of the projects they are in, never more.", + "No views yet. A view shows the tasks of several of your projects together.": "No views yet. A view shows the tasks of several of your projects together.", + "Projects in view: {count}": "Projects in view: {count}", + "Notify me when a task is assigned to me": "Notify me when a task is assigned to me", + "Also send these to me by email": "Also send these to me by email", + "Add an email address in your Nextcloud personal settings to get mail.": "Add an email address in your Nextcloud personal settings to get mail.", + "Code link": "Code link", + "A commit, branch, merge request or issue in a code forge that works on a task.": "A commit, branch, merge request or issue in a code forge that works on a task.", + "The task the link belongs to": "The task the link belongs to", + "The project of the task": "The project of the task", + "Task key": "Task key", + "The task key the forge text named, such as VC-12": "The task key the forge text named, such as VC-12", + "What the link points at": "What the link points at", + "Link": "Link", + "The address of the item in the forge": "The address of the item in the forge", + "The commit message, branch name or merge request title": "The commit message, branch name or merge request title", + "Repository": "Repository", + "The repository, such as acme/portal": "The repository, such as acme/portal", + "Forge id": "Forge id", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "The forge's own id for the item, such as github:acme/portal#42 or a commit hash", + "State": "State", + "The state of a merge request or issue": "The state of a merge request or issue", + "Who made the commit or opened the merge request": "Who made the commit or opened the merge request", + "When the commit was made or the merge request last changed": "When the commit was made or the merge request last changed", + "Added by": "Added by", + "Whether a person added the link or the integration wrote it": "Whether a person added the link or the integration wrote it", + "Nextcloud user UIDs of project members": "Nextcloud user UIDs of project members", + "Add link": "Add link", + "Added by hand": "Added by hand", + "Branch": "Branch", + "Code": "Code", + "Commit": "Commit", + "From the integration": "From the integration", + "Link to a commit, branch or merge request": "Link to a commit, branch or merge request", + "Merge request": "Merge request", + "Merged": "Merged", + "No code linked yet. Name {key} in a commit message or paste a link.": "No code linked yet. Name {key} in a commit message or paste a link.", + "No code linked yet. Paste a link to a commit or merge request.": "No code linked yet. Paste a link to a commit or merge request.", + "Paste a web address that starts with https://.": "Paste a web address that starts with https://.", + "Remove link {title}": "Remove link {title}", + "The link could not be added.": "The link could not be added.", + "The link could not be removed.": "The link could not be removed.", + "This link is already on the task.": "This link is already on the task.", + "Code forges": "Code forges", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.", + "Without Integriq, project members can still paste a link on the task page.": "Without Integriq, project members can still paste a link on the task page.", + "Download the Integriq configuration": "Download the Integriq configuration", + "Calendar": "Calendar", + "Previous": "Previous", + "Calendar view": "Calendar view", + "Starts:": "Starts:", + "No tasks with a date in this month.": "No tasks with a date in this month.", + "Week of {start} to {end}": "Week of {start} to {end}", + "My calendar": "My calendar", + "Show as list": "Show as list", + "Show as calendar": "Show as calendar", + "Open my calendar": "Open my calendar", + "Nextcloud Tasks": "Nextcloud Tasks", + "Show my tasks in Nextcloud Tasks": "Show my tasks in Nextcloud Tasks", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "This server cannot write to Nextcloud Tasks, so the export is not available.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Managed by Planninq. Changes made here are replaced by the next change in Planninq.", + "Working days and holidays": "Working days and holidays", + "Dates set on the timeline skip the days that are not working days.": "Dates set on the timeline skip the days that are not working days.", + "Working weekdays": "Working weekdays", + "Non-working days": "Non-working days", + "No non-working days yet.": "No non-working days yet.", + "Add day": "Add day", + "Year": "Year", + "Add Dutch national holidays": "Add Dutch national holidays", + "Save working days": "Save working days", + "Choose at least one working weekday.": "Choose at least one working weekday.", + "Working days saved.": "Working days saved.", + "Could not save the working days.": "Could not save the working days.", + "New Year's Day": "New Year's Day", + "Easter Sunday": "Easter Sunday", + "Easter Monday": "Easter Monday", + "King's Day": "King's Day", + "Liberation Day": "Liberation Day", + "Ascension Day": "Ascension Day", + "Whit Sunday": "Whit Sunday", + "Whit Monday": "Whit Monday", + "Christmas Day": "Christmas Day", + "Boxing Day": "Boxing Day", + "Dates of {title}": "Dates of {title}", + "The due date cannot be before the start date.": "The due date cannot be before the start date.", + "{title}, from {start} to {end}": "{title}, from {start} to {end}", + "The dates could not be saved.": "The dates could not be saved.", + "{title} now runs from {start} to {end}": "{title} now runs from {start} to {end}", + "Auto-scheduling": "Auto-scheduling", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.", + "Move blocked tasks along when a task slips": "Move blocked tasks along when a task slips", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.", + "Move the tasks that wait for {title}?": "Move the tasks that wait for {title}?", + "These tasks wait for it and would start after its new due date:": "These tasks wait for it and would start after its new due date:", + "{count} tasks would move; the first {limit} are listed.": "{count} tasks would move; the first {limit} are listed.", + "Now": "Now", + "After the move": "After the move", + "Only this task": "Only this task", + "Move all": "Move all", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stopped at {title}: its dates could not be saved. The tasks before it were moved.", + "Cumulative flow": "Cumulative flow", + "Show as chart": "Show as chart", + "Show as table": "Show as table", + "Tasks per column per day": "Tasks per column per day", + "Tasks without recorded history in this period: {count}": "Tasks without recorded history in this period: {count}", + "Lead and cycle time": "Lead and cycle time", + "No tasks were finished in this period.": "No tasks were finished in this period.", + "Finished tasks": "Finished tasks", + "Cycle time, average": "Cycle time, average", + "Cycle time, 85th percentile": "Cycle time, 85th percentile", + "Lead time, average": "Lead time, average", + "Tasks whose finish time was estimated from their history: {count}": "Tasks whose finish time was estimated from their history: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Cycle time of each finished task, with the average and the 85th percentile", + "Slowest tasks": "Slowest tasks", + "cycle {cycle}, lead {lead}": "cycle {cycle}, lead {lead}", + "{days} days": "{days} days", + "Could not load the flow of this project.": "Could not load the flow of this project.", + "Last {days} days": "Last {days} days", + "Portfolio flow": "Portfolio flow", + "An admin adds portfolios under Projects, Portfolios.": "An admin adds portfolios under Projects, Portfolios.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projects not shown, because at most 50 are shown at a time: {count}", + "Could not load the flow of this portfolio.": "Could not load the flow of this portfolio.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Cumulative flow and cycle time across the projects of a portfolio.", + "Edit report": "Edit report", + "Only tasks where": "Only tasks where", + "Group by": "Group by", + "Display": "Display", + "Share with everyone who can read its projects": "Share with everyone who can read its projects", + "The report could not be saved.": "The report could not be saved.", + "Number of tasks": "Number of tasks", + "Bar": "Bar", + "Donut": "Donut", + "Table": "Table", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} of {total} projects in this report are not visible to you", + "No tasks match this report.": "No tasks match this report.", + "None": "None", + "Could not load this report.": "Could not load this report.", + "Report": "Report", + "Your reports": "Your reports", + "My reports": "My reports", + "Shared reports": "Shared reports", + "You have not built a report yet.": "You have not built a report yet.", + "Nobody has shared a report with you yet.": "Nobody has shared a report with you yet.", + "Reports you built over tasks, and the ones shared with you.": "Reports you built over tasks, and the ones shared with you.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.", + "The name the report is listed under": "The name the report is listed under", + "What the report shows and who it is for": "What the report shows and who it is for", + "Nextcloud user id of the person who saved the report": "Nextcloud user id of the person who saved the report", + "Who can open the report": "Who can open the report", + "Only me": "Only me", + "Everyone who can read its projects": "Everyone who can read its projects", + "The projects the report covers, at most fifty": "The projects the report covers, at most fifty", + "Filters": "Filters", + "Task fields and the value each must equal": "Task fields and the value each must equal", + "The task field the report groups on": "The task field the report groups on", + "Count the tasks, or add up a number on them": "Count the tasks, or add up a number on them", + "Sum": "Sum", + "Sum of": "Sum of", + "The number added up when the measure is a sum": "The number added up when the measure is a sum", + "Story points": "Story points", + "Estimated duration": "Estimated duration", + "How the report is shown": "How the report is shown", + "Issue type": "Issue type", + "Task fields and the value each must equal; empty when the report covers every task": "Task fields and the value each must equal; empty when the report covers every task", + "The status a task must have": "The status a task must have", + "The priority a task must have": "The priority a task must have", + "The user a task must be assigned to": "The user a task must be assigned to", + "A label a task must carry": "A label a task must carry", + "The board column a task must be in": "The board column a task must be in", + "The issue type a task must have": "The issue type a task must have", + "Manager groups": "Manager groups", + "Member groups": "Member groups", + "Viewer groups": "Viewer groups", + "Viewers": "Viewers", + "Owning group": "Owning group", + "Nextcloud groups whose members manage the project": "Nextcloud groups whose members manage the project", + "Nextcloud groups whose members work on the project": "Nextcloud groups whose members work on the project", + "Nextcloud groups whose members may read the project": "Nextcloud groups whose members may read the project", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud user ids who manage the project: its settings, its members and its work", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud user ids who may read the project and its work but not change it", + "The Nextcloud group that owns the project with its creator, at most one": "The Nextcloud group that owns the project with its creator, at most one", + "Nextcloud user ids who may read this through the project": "Nextcloud user ids who may read this through the project", + "Nextcloud groups whose members may change this through the project": "Nextcloud groups whose members may change this through the project", + "Nextcloud groups whose members may read this through the project": "Nextcloud groups whose members may read this through the project", + "Search for a person or a group…": "Search for a person or a group…", + "No one found. Your admin's sharing settings decide who you can find.": "No one found. Your admin's sharing settings decide who you can find.", + "Type at least two characters": "Type at least two characters", + "Everyone in this group": "Everyone in this group", + "Could not search for people. Please try again.": "Could not search for people. Please try again.", + "Could not remove the group": "Could not remove the group", + "Only the owner and managers change who is on this project.": "Only the owner and managers change who is on this project.", + "Role of {name}": "Role of {name}", + "Manager": "Manager", + "Member": "Member", + "Viewer": "Viewer", + "Could not change the role": "Could not change the role", + "Owned by group: {name}": "Owned by group: {name}", + "No group owns this project.": "No group owns this project.", + "Owned by group": "Owned by group", + "Search for a group…": "Search for a group…", + "No group found. Your admin's sharing settings decide which groups you can find.": "No group found. Your admin's sharing settings decide which groups you can find.", + "No owning group": "No owning group", + "Could not search for groups. Please try again.": "Could not search for groups. Please try again.", + "Could not change the owning group": "Could not change the owning group", + "You can read this project. Only its members change it.": "You can read this project. Only its members change it.", + "Course": "Course", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "The course this lesson teaches, such as an elective, when the school's learning app knows it.", + "Online meeting link": "Online meeting link", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Where pupils join this lesson online. Pupils see a Join button only for an https link." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/en.json b/l10n/en.json index 92064605..53517176 100644 --- a/l10n/en.json +++ b/l10n/en.json @@ -199,7 +199,1146 @@ "Overdue": "Overdue", "Assigned to: {user}": "Assigned to: {user}", "No tasks": "No tasks", - "Could not move the task. Please try again.": "Could not move the task. Please try again." + "Could not move the task. Please try again.": "Could not move the task. Please try again.", + "Active projects": "Active projects", + "Archived projects": "Archived projects", + "Boards": "Boards", + "My projects": "My projects", + "Portfolio": "Portfolio", + "Project board": "Project board", + "Projects I am in": "Projects I am in", + "Timeline": "Timeline", + "Timesheet": "Timesheet", + "Features & roadmap": "Features & roadmap", + "Flow": "Flow", + "Flows": "Flows", + "Billable": "Billable", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Loading projects", + "No projects for this client yet": "No projects for this client yet", + "Open in Planninq": "Open in Planninq", + "This project could not be found": "This project could not be found", + "Untitled project": "Untitled project", + "and {count} more": "and {count} more", + "Work Date": "Work Date", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Column actions", + "Columns": "Columns", + "Could not remove the column. Please try again.": "Could not remove the column. Please try again.", + "Could not save the column. Please try again.": "Could not save the column. Please try again.", + "Done column": "Done column", + "Edit column": "Edit column", + "Keep the card's status": "Keep the card's status", + "Move its cards to": "Move its cards to", + "Move left": "Move left", + "Move right": "Move right", + "Status of cards moved here": "Status of cards moved here", + "The last done column cannot be removed.": "The last done column cannot be removed.", + "WIP limit": "WIP limit", + "over limit": "over limit", + "The status a card gets when it is moved into this column.": "The status a card gets when it is moved into this column.", + "All priorities": "All priorities", + "Could not create the task. Please try again.": "Could not create the task. Please try again.", + "Created": "Created", + "Move to backlog": "Move to backlog", + "Move to board": "Move to board", + "New task": "New task", + "Nothing in the backlog": "Nothing in the backlog", + "Rank": "Rank", + "Sort by": "Sort by", + "Sort by rank to reorder": "Sort by rank to reorder", + "Task actions": "Task actions", + "All labels": "All labels", + "Filter tasks by label": "Filter tasks by label", + "View timeline": "View timeline", + "Board": "Board", + "List": "List", + "Column": "Column", + "Board or list": "Board or list", + "Log": "Log", + "Add entry": "Add entry", + "Show": "Show", + "No actions yet": "No actions yet", + "Closed": "Closed", + "Entry actions": "Entry actions", + "Add action": "Add action", + "by {author}": "by {author}", + "saved {time}": "saved {time}", + "Attendees: {names}": "Attendees: {names}", + "Nothing logged yet": "Nothing logged yet", + "Add the first entry": "Add the first entry", + "Issues": "Issues", + "Lessons learned": "Lessons learned", + "Meetings": "Meetings", + "Decisions": "Decisions", + "Actions": "Actions", + "Issue": "Issue", + "Lesson learned": "Lesson learned", + "Meeting": "Meeting", + "Decision": "Decision", + "About this project": "About this project", + "No description yet": "No description yet", + "Start date": "Start date", + "Not set": "Not set", + "End date": "End date", + "Progress": "Progress", + "No tasks yet": "No tasks yet", + "Open the board": "Open the board", + "People": "People", + "Owner": "Owner", + "Latest log entries": "Latest log entries", + "Open the log": "Open the log", + "{done} of {total} tasks done": "{done} of {total} tasks done", + "Edit entry": "Edit entry", + "Type": "Type", + "Date": "Date", + "Attendees": "Attendees", + "Issue is closed": "Issue is closed", + "Could not save the entry. Please try again.": "Could not save the entry. Please try again.", + "From: {title}": "From: {title}", + "What needs to happen": "What needs to happen", + "Could not create the action. Please try again.": "Could not create the action. Please try again.", + "The action was created but could not be linked to the entry.": "The action was created but could not be linked to the entry.", + "Project pages": "Project pages", + "Overview": "Overview", + "Risks": "Risks", + "Log entry": "Log entry", + "A short name for the entry": "A short name for the entry", + "Project": "Project", + "The project this entry belongs to": "The project this entry belongs to", + "What kind of entry this is": "What kind of entry this is", + "When it happened": "When it happened", + "What happened, in Markdown": "What happened, in Markdown", + "Whether an issue is still open": "Whether an issue is still open", + "The people at a meeting": "The people at a meeting", + "Tasks that came out of this entry": "Tasks that came out of this entry", + "Add risk": "Add risk", + "Risk": "Risk", + "Score": "Score", + "Response": "Response", + "Review date": "Review date", + "no longer on the project": "no longer on the project", + "Edit {title}": "Edit {title}", + "No risks recorded yet": "No risks recorded yet", + "Add the first risk": "Add the first risk", + "Medium": "Medium", + "Mitigating": "Mitigating", + "Occurred": "Occurred", + "Avoid": "Avoid", + "Reduce": "Reduce", + "Transfer": "Transfer", + "Accept": "Accept", + "Highest open risks": "Highest open risks", + "No open risks": "No open risks", + "Open the risk register": "Open the risk register", + "Edit risk": "Edit risk", + "What could go wrong": "What could go wrong", + "Likelihood": "Likelihood", + "Impact": "Impact", + "Score {score}": "Score {score}", + "Countermeasures": "Countermeasures", + "Could not save the risk. Please try again.": "Could not save the risk. Please try again.", + "Risks by likelihood and impact": "Risks by likelihood and impact", + "Risk scale": "Risk scale", + "The levels every project scores its risks on, and where low turns into medium and high": "The levels every project scores its risks on, and where low turns into medium and high", + "Number of levels": "Number of levels", + "Likelihood labels": "Likelihood labels", + "Impact labels": "Impact labels", + "Level {level}": "Level {level}", + "Medium from score": "Medium from score", + "High from score": "High from score", + "Risk scale saved": "Risk scale saved", + "1 risk uses level {level}. Change it first.": "1 risk uses level {level}. Change it first.", + "{count} risks use level {level}. Change them first.": "{count} risks use level {level}. Change them first.", + "Every level needs a label, and high must start above medium.": "Every level needs a label, and high must start above medium.", + "The project this risk belongs to": "The project this risk belongs to", + "The cause and the effect, in Markdown": "The cause and the effect, in Markdown", + "Category": "Category", + "A free grouping, such as planning, budget or supplier": "A free grouping, such as planning, budget or supplier", + "How likely it is, on the admin's risk scale": "How likely it is, on the admin's risk scale", + "How hard it would hit, on the admin's risk scale": "How hard it would hit, on the admin's risk scale", + "Likelihood times impact, calculated by the server": "Likelihood times impact, calculated by the server", + "Where the risk stands": "Where the risk stands", + "The person who watches this risk": "The person who watches this risk", + "How the project answers the risk": "How the project answers the risk", + "What is done to prevent it or soften it, in Markdown": "What is done to prevent it or soften it, in Markdown", + "When to look at this risk again": "When to look at this risk again", + "Very low": "Very low", + "Very high": "Very high", + "All projects": "All projects", + "Project status report": "Project status report", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.", + "The project this report is about": "The project this report is about", + "Report date": "Report date", + "The day the report describes": "The day the report describes", + "Money": "Money", + "How the project stands on this aspect": "How the project stands on this aspect", + "On track": "On track", + "At risk": "At risk", + "Off track": "Off track", + "Money note": "Money note", + "A short explanation of this status": "A short explanation of this status", + "Organisation": "Organisation", + "Organisation note": "Organisation note", + "Time": "Time", + "Time note": "Time note", + "Information": "Information", + "Information note": "Information note", + "Quality": "Quality", + "Quality note": "Quality note", + "Risk note": "Risk note", + "Overall": "Overall", + "The worst of the six statuses, calculated by the server": "The worst of the six statuses, calculated by the server", + "Health: money": "Health: money", + "Copied from the newest status report": "Copied from the newest status report", + "Health: organisation": "Health: organisation", + "Health: time": "Health: time", + "Health: information": "Health: information", + "Health: quality": "Health: quality", + "Health: risk": "Health: risk", + "Health: overall": "Health: overall", + "Health: report date": "Health: report date", + "The date of the newest status report": "The date of the newest status report", + "New report": "New report", + "Only the project owner writes status reports.": "Only the project owner writes status reports.", + "Latest report, {date}": "Latest report, {date}", + "Aspect": "Aspect", + "Note": "Note", + "Report history": "Report history", + "Author": "Author", + "No status reports yet": "No status reports yet", + "Write the first report": "Write the first report", + "Choose a status for every aspect to save the report.": "Choose a status for every aspect to save the report.", + "Suggested: on track.": "Suggested: on track.", + "Suggested: at risk.": "Suggested: at risk.", + "Suggested: off track.": "Suggested: off track.", + "1 task is past its due date.": "1 task is past its due date.", + "{count} tasks are past their due date.": "{count} tasks are past their due date.", + "The end date has passed with 1 open task.": "The end date has passed with 1 open task.", + "The end date has passed with {count} open tasks.": "The end date has passed with {count} open tasks.", + "No open task is past its due date.": "No open task is past its due date.", + "The highest open risk, \"{title}\", scores {score}.": "The highest open risk, \"{title}\", scores {score}.", + "There are no open risks.": "There are no open risks.", + "Costs are at {percent}% of the budget.": "Costs are at {percent}% of the budget.", + "No suggestion: the project has no budget.": "No suggestion: the project has no budget.", + "No suggestion: no costs are recorded for this project yet.": "No suggestion: no costs are recorded for this project yet.", + "The report was not saved. Only the project owner can write status reports.": "The report was not saved. Only the project owner can write status reports.", + "No report": "No report", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.", + "The name of the portfolio": "The name of the portfolio", + "What the portfolio holds and who runs it": "What the portfolio holds and who runs it", + "A colour for the portfolio's section in project lists": "A colour for the portfolio's section in project lists", + "Managers": "Managers", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud user UIDs of the people who run the portfolio", + "Order": "Order", + "Where the portfolio comes in project lists, lowest first": "Where the portfolio comes in project lists, lowest first", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.", + "Portfolio readers": "Portfolio readers", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud user UIDs of the managers of the project's portfolio", + "The portfolio this project belongs to": "The portfolio this project belongs to", + "No portfolio": "No portfolio", + "All portfolios": "All portfolios", + "You read this project as a manager of its portfolio. Only its members change it.": "You read this project as a manager of its portfolio. Only its members change it.", + "Portfolios": "Portfolios", + "Portfolio status": "Portfolio status", + "No portfolios yet": "No portfolios yet", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.", + "Roll-up": "Roll-up", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report", + "No project in this portfolio that you can read.": "No project in this portfolio that you can read.", + "Start": "Start", + "End": "End", + "Budget": "Budget", + "Last report": "Last report", + "Out of date": "Out of date", + "Portfolio timeline": "Portfolio timeline", + "Zoom": "Zoom", + "Could not load the timeline": "Could not load the timeline", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Open a project to see its phases and tasks. The timeline is read-only.", + "Phase: {title}": "Phase: {title}", + "Left out because you cannot read them: {count} projects": "Left out because you cannot read them: {count} projects", + "Week": "Week", + "Day": "Day", + "Month": "Month", + "Please try again later.": "Please try again later.", + "Status reports": "Status reports", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "After how many days a project's latest status report is marked out of date on the portfolio overview", + "Reporting period (days)": "Reporting period (days)", + "The reporting period is a whole number of days from 1 to 365.": "The reporting period is a whole number of days from 1 to 365.", + "Reporting period saved": "Reporting period saved", + "The reporting period was not saved. Please try again.": "The reporting period was not saved. Please try again.", + "Every project of a portfolio with its status per aspect, rolled up.": "Every project of a portfolio with its status per aspect, rolled up.", + "The projects of a portfolio on one timeline.": "The projects of a portfolio on one timeline.", + "Phases": "Phases", + "Add phase": "Add phase", + "No phases yet": "No phases yet", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.", + "{hours} hours": "{hours} hours", + "Concluding document: {title}": "Concluding document: {title}", + "Concluding document missing": "Concluding document missing", + "Move {title} up": "Move {title} up", + "Move {title} down": "Move {title} down", + "Close phase": "Close phase", + "Phase": "Phase", + "Files": "Files", + "Notes": "Notes", + "Audit trail": "Audit trail", + "Edit phase": "Edit phase", + "Name": "Name", + "Budget hours": "Budget hours", + "Could not save the phase. Please try again.": "Could not save the phase. Please try again.", + "Close phase {title}": "Close phase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "A phase closes with its concluding document: upload it here or pick one of the phase's files.", + "Concluding document": "Concluding document", + "This phase has no files yet.": "This phase has no files yet.", + "Upload a document": "Upload a document", + "The document was not uploaded. Please try again.": "The document was not uploaded. Please try again.", + "Upload the concluding document before you close this phase.": "Upload the concluding document before you close this phase.", + "This phase cannot be closed from its current status.": "This phase cannot be closed from its current status.", + "The phase was not closed. Please try again.": "The phase was not closed. Please try again.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.", + "Import from Microsoft Project": "Import from Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.", + "Plan file": "Plan file", + "What the import creates": "What the import creates", + "Tasks": "Tasks", + "Sub-tasks": "Sub-tasks", + "Milestones": "Milestones", + "Links": "Links", + "Already imported, updated in place: {count}": "Already imported, updated in place: {count}", + "What does not carry over": "What does not carry over", + "Tasks with resources, which are not imported: {count}": "Tasks with resources, which are not imported: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tasks deeper than level 3, placed under their level-2 task: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Links other than finish-to-start, imported as related links: {count}", + "Link lags, which are dropped: {count}": "Link lags, which are dropped: {count}", + "Links to a summary task, which are not imported: {count}": "Links to a summary task, which are not imported: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Links to tasks outside this plan, which are not imported: {count}", + "No longer in the plan": "No longer in the plan", + "These stay in the project; remove them yourself if they are no longer needed.": "These stay in the project; remove them yourself if they are no longer needed.", + "Import": "Import", + "Close": "Close", + "The plan is imported: {created} created, {updated} updated.": "The plan is imported: {created} created, {updated} updated.", + "Links that would close a loop were left out: {count}": "Links that would close a loop were left out: {count}", + "The import stopped part-way. Run it again to finish it.": "The import stopped part-way. Run it again to finish it.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.", + "This file declares a DOCTYPE or entities, which are not accepted.": "This file declares a DOCTYPE or entities, which are not accepted.", + "The file is larger than 10 MB.": "The file is larger than 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "The plan has more than 2,000 tasks, more than one import takes.", + "This file is not a Microsoft Project plan in XML format.": "This file is not a Microsoft Project plan in XML format.", + "Choose a file to import.": "Choose a file to import.", + "Only the project owner can import a plan.": "Only the project owner can import a plan.", + "The plan could not be read. Please try again.": "The plan could not be read. Please try again.", + "Linked case: {title}": "Linked case: {title}", + "Linked to a case": "Linked to a case", + "Hand over to case": "Hand over to case", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.", + "{date} by {user}": "{date} by {user}", + "Files copied: {count}": "Files copied: {count}", + "Files that failed: {names}": "Files that failed: {names}", + "The handover failed. Please try again.": "The handover failed. Please try again.", + "The linked case could not be found, or you cannot open it.": "The linked case could not be found, or you cannot open it.", + "Case handovers": "Case handovers", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.", + "Finance": "Finance", + "Add cost line": "Add cost line", + "Delivery terms": "Delivery terms", + "Billing model": "Billing model", + "Budget in euro": "Budget in euro", + "Budget in hours": "Budget in hours", + "Hourly rate in euro": "Hourly rate in euro", + "Planned start": "Planned start", + "Planned end": "Planned end", + "Planned dates": "Planned dates", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "No budget agreed", + "Hours": "Hours", + "Only the project owner and the portfolio managers see the amounts.": "Only the project owner and the portfolio managers see the amounts.", + "Budget against cost per category": "Budget against cost per category", + "Labour (booked time)": "Labour (booked time)", + "No category": "No category", + "Hours are not available": "Hours are not available", + "Not yet assigned to a category": "Not yet assigned to a category", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} spent, {remaining} remaining", + "Budget against cost per phase": "Budget against cost per phase", + "No phase": "No phase", + "Cost lines": "Cost lines", + "From the finance system": "From the finance system", + "Edit cost line {amount}": "Edit cost line {amount}", + "No cost lines yet": "No cost lines yet", + "Commitments": "Commitments", + "Actual cost": "Actual cost", + "Forecast": "Forecast", + "Remaining": "Remaining", + "Not planned yet": "Not planned yet", + "{start} to {end}": "{start} to {end}", + "The terms were not saved. Please try again.": "The terms were not saved. Please try again.", + "Terms saved": "Terms saved", + "Fixed price": "Fixed price", + "Hourly": "Hourly", + "Not billed": "Not billed", + "Commitment": "Commitment", + "Edit cost line": "Edit cost line", + "Kind": "Kind", + "Amount in euro": "Amount in euro", + "Remove": "Remove", + "Could not save the cost line. Only the project owner changes the money of a project.": "Could not save the cost line. Only the project owner changes the money of a project.", + "Could not remove the cost line. Please try again.": "Could not remove the cost line. Please try again.", + "{amount} over budget": "{amount} over budget", + "Cost categories": "Cost categories", + "The categories every project splits its budget and costs into, one per line": "The categories every project splits its budget and costs into, one per line", + "Categories": "Categories", + "Give at least one category, each name once.": "Give at least one category, each name once.", + "Cost categories saved": "Cost categories saved", + "The cost categories were not saved. Please try again.": "The cost categories were not saved. Please try again.", + "Finance line": "Finance line", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.", + "The phase this amount belongs to, if any": "The phase this amount belongs to, if any", + "The cost category, one of the categories the admin set up": "The cost category, one of the categories the admin set up", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Whether the amount is a budget, a commitment, an actual cost or a forecast", + "Amount": "Amount", + "The amount in the reporting currency (euro)": "The amount in the reporting currency (euro)", + "The date the amount was booked or is expected": "The date the amount was booked or is expected", + "What the amount is for": "What the amount is for", + "Whether a person entered the line or the finance system sent it": "Whether a person entered the line or the finance system sent it", + "Entered by hand": "Entered by hand", + "Finance line id": "Finance line id", + "The finance system's own id of this line. One imported line per id.": "The finance system's own id of this line. One imported line per id.", + "Project number": "Project number", + "The project number the finance system sent, matched against the project key": "The project number the finance system sent, matched against the project key", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "The portfolio of the line's project, copied from the project so portfolio totals need one filter", + "Finance readers": "Finance readers", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio", + "Project owner": "Project owner", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud user UID of the project owner, who may change and remove manual lines", + "How the client pays: not billed, a fixed price, or by the hour.": "How the client pays: not billed, a fixed price, or by the hour.", + "Portfolio finance": "Portfolio finance", + "You cannot see the money of any project in this portfolio": "You cannot see the money of any project in this portfolio", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.", + "Projects left out because you cannot see their money: {count}": "Projects left out because you cannot see their money: {count}", + "Unmatched finance lines": "Unmatched finance lines", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, commitments, actual cost and forecast totalled across a portfolio.", + "Subprojects": "Subprojects", + "{done} of {total}": "{done} of {total}", + "{done} of {total} tasks done, including subprojects": "{done} of {total} tasks done, including subprojects", + "Show the subprojects of {title}": "Show the subprojects of {title}", + "Hide the subprojects of {title}": "Hide the subprojects of {title}", + "Part of": "Part of", + "No parent project": "No parent project", + "A project cannot sit under one of its own subprojects.": "A project cannot sit under one of its own subprojects.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projects nest three levels deep at most: programme, project and subproject.", + "Parent project": "Parent project", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "The project this project sits under, such as a programme. Projects nest three levels deep at most.", + "Yes": "Yes", + "No": "No", + "{label} (required)": "{label} (required)", + "{label} is required": "{label} is required", + "Project field": "Project field", + "A field an admin adds to every project, such as a policy area or a contract value.": "A field an admin adds to every project, such as a policy area or a contract value.", + "Key": "Key", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "The stable name the value is stored under, in lower camel case. Keep it once projects use it.", + "Label": "Label", + "The name people see next to the field": "The name people see next to the field", + "What the field holds": "What the field holds", + "Text": "Text", + "Number": "Number", + "Choice": "Choice", + "Person": "Person", + "Yes or no": "Yes or no", + "Options": "Options", + "The choices of a choice field": "The choices of a choice field", + "Required": "Required", + "Whether a project must fill in the field": "Whether a project must fill in the field", + "Where the field appears, lowest first": "Where the field appears, lowest first", + "Applies to": "Applies to", + "What the field is added to": "What the field is added to", + "Custom fields": "Custom fields", + "The values of the project fields an admin defined, keyed by the field's key.": "The values of the project fields an admin defined, keyed by the field's key.", + "Project fields": "Project fields", + "Related": "Related", + "Remove link": "Remove link", + "Link type": "Link type", + "Relates to": "Relates to", + "Duplicates": "Duplicates", + "Project key": "Project key", + "Every task number starts with it, such as VERG-42.": "Every task number starts with it, such as VERG-42.", + "This key is already used by another project.": "This key is already used by another project.", + "Use 2 to 10 letters and digits, starting with a letter.": "Use 2 to 10 letters and digits, starting with a letter.", + "The key cannot change once tasks carry it.": "The key cannot change once tasks carry it.", + "Project saved. The existing tasks get their numbers in the background.": "Project saved. The existing tasks get their numbers in the background.", + "Next task number": "Next task number", + "The number the next task of this project gets in its key. Only the system writes it.": "The number the next task of this project gets in its key. Only the system writes it.", + "Restore {title}": "Restore {title}", + "Restore": "Restore", + "Project restored": "Project restored", + "Could not restore the project": "Could not restore the project", + "Bring this project back to the active list.": "Bring this project back to the active list.", + "Restore project": "Restore project", + "Request reason": "Request reason", + "Why the requester needs this project. Filled in when the project is requested.": "Why the requester needs this project. Filled in when the project is requested.", + "Reviewed by": "Reviewed by", + "The user who approved or rejected the request.": "The user who approved or rejected the request.", + "Reviewed at": "Reviewed at", + "When the request was approved or rejected.": "When the request was approved or rejected.", + "Review note": "Review note", + "The reviewer's reason, shown to the requester when a request is not approved.": "The reviewer's reason, shown to the requester when a request is not approved.", + "Members of these groups": "Members of these groups", + "Groups that may create projects": "Groups that may create projects", + "The group {group} no longer exists. Save to remove it.": "The group {group} no longer exists. Save to remove it.", + "Review project request": "Review project request", + "Requested by": "Requested by", + "Why it is needed": "Why it is needed", + "Desired start date": "Desired start date", + "Why is it not approved?": "Why is it not approved?", + "Give a reason. The requester sees it.": "Give a reason. The requester sees it.", + "Approve": "Approve", + "Reject": "Reject", + "Reject request": "Reject request", + "The review was not saved. Try again.": "The review was not saved. Try again.", + "This project is waiting for review": "This project is waiting for review", + "This request was not approved": "This request was not approved", + "Reason: {note}": "Reason: {note}", + "Review request": "Review request", + "Request a project": "Request a project", + "Step {step} of 2": "Step {step} of 2", + "Why is this project needed?": "Why is this project needed?", + "Give a reason. The reviewer reads it.": "Give a reason. The reviewer reads it.", + "Back": "Back", + "Next": "Next", + "Send request": "Send request", + "The request was not sent. Try again.": "The request was not sent. Try again.", + "Requested": "Requested", + "Not approved": "Not approved", + "Your request was sent": "Your request was sent", + "Let everyone else request a project": "Let everyone else request a project", + "Add a task": "Add a task", + "Delete task": "Delete task", + "Edit task": "Edit task", + "Write": "Write", + "Preview": "Preview", + "Markdown works here: headings, lists and links.": "Markdown works here: headings, lists and links.", + "Could not save the task. Please try again.": "Could not save the task. Please try again.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.", + "Keep task": "Keep task", + "Cancel task": "Cancel task", + "Only the reporter, the project owner or an admin can delete this task.": "Only the reporter, the project owner or an admin can delete this task.", + "Could not delete the task. Please try again.": "Could not delete the task. Please try again.", + "Could not cancel the task. Please try again.": "Could not cancel the task. Please try again.", + "In progress": "In progress", + "Responsible": "Responsible", + "Also working on this": "Also working on this", + "Labels": "Labels", + "Could not change the priority. Please try again.": "Could not change the priority. Please try again.", + "Other project members who work on this task alongside the person responsible.": "Other project members who work on this task alongside the person responsible.", + "Duplicate": "Duplicate", + "Could not copy the task. Please try again.": "Could not copy the task. Please try again.", + "Subtasks": "Subtasks", + "{done} of {total} done": "{done} of {total} done", + "Add a subtask": "Add a subtask", + "Checklist": "Checklist", + "Checklist item actions": "Checklist item actions", + "Add a checklist item": "Add a checklist item", + "Subtasks: {estimate} estimated, {logged} logged": "Subtasks: {estimate} estimated, {logged} logged", + "Total estimate: {total}": "Total estimate: {total}", + "Part of {title}": "Part of {title}", + "Checklist: {count} done": "Checklist: {count} done", + "This task has subtasks: {count}.": "This task has subtasks: {count}.", + "Keep subtasks as separate tasks": "Keep subtasks as separate tasks", + "Delete subtasks too": "Delete subtasks too", + "Copy of {title}": "Copy of {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "The task was copied, but not all of its subtasks. Please check the copy.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Small steps inside the task. Each item has an id, a text and whether it is done.", + "Open work per person and per project.": "Open work per person and per project.", + "View": "View", + "By person": "By person", + "By project": "By project", + "Hours left": "Hours left", + "Tasks without an estimate": "Tasks without an estimate", + "Due in 14 days": "Due in 14 days", + "Shared": "Shared", + "Unassigned": "Unassigned", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.", + "No open work in these projects.": "No open work in these projects.", + "Open work": "Open work", + "{count} open tasks": "{count} open tasks", + "Create a project to see capacity here.": "Create a project to see capacity here.", + "My tasks": "My tasks", + "Show all my tasks": "Show all my tasks", + "No tasks assigned to you": "No tasks assigned to you", + "Browse projects": "Browse projects", + "Later": "Later", + "Due {date}": "Due {date}", + "Could not change the status. Please try again.": "Could not change the status. Please try again.", + "Completed today": "Completed today", + "My open tasks": "My open tasks", + "My overdue tasks": "My overdue tasks", + "My tasks in progress": "My tasks in progress", + "Pin to the top": "Pin to the top", + "Unpin": "Unpin", + "Pinned": "Pinned", + "Actions for {title}": "Actions for {title}", + "Could not save your project order. Please try again.": "Could not save your project order. Please try again.", + "No boards yet": "No boards yet", + "Create a project to get a board.": "Create a project to get a board.", + "Use the Projects page to create and manage your projects and tasks.": "Use the Projects page to create and manage your projects and tasks.", + "Go to projects": "Go to projects", + "You are not a member of any projects yet.": "You are not a member of any projects yet.", + "Could not search for users. Please try again.": "Could not search for users. Please try again.", + "Project creation is restricted to administrators.": "Project creation is restricted to administrators.", + "Only the project owner or an administrator can delete this project.": "Only the project owner or an administrator can delete this project.", + "No projects are available to you yet. Ask an administrator to create one.": "No projects are available to you yet. Ask an administrator to create one.", + "Due: {date}": "Due: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Tasks with a start or due date appear on the timeline. Add dates to see them here.", + "You do not have access to this project.": "You do not have access to this project.", + "Zoom level": "Zoom level", + "Unscheduled": "Unscheduled", + "Start: {date}": "Start: {date}", + "Today": "Today", + "No scheduled tasks": "No scheduled tasks", + "An unexpected error occurred.": "An unexpected error occurred.", + "Column {number} name": "Column {number} name", + "Failed to save creation policy": "Failed to save creation policy", + "All authenticated users": "All authenticated users", + "Control who may create new projects": "Control who may create new projects", + "Administrators only": "Administrators only", + "Project creation": "Project creation", + "Allow project creation": "Allow project creation", + "Creation policy saved successfully": "Creation policy saved successfully", + "Initializing…": "Initializing…", + "e.g. 2h 30m, 90m, 1.5h": "e.g. 2h 30m, 90m, 1.5h", + "Log time": "Log time", + "Save estimate": "Save estimate", + "Logged: {logged}": "Logged: {logged}", + "over by {amount}": "over by {amount}", + "Time tracking": "Time tracking", + "Estimate": "Estimate", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Could not save the time entry. Please try again.", + "Edit time entry": "Edit time entry", + "Duration": "Duration", + "Date range": "Date range", + "Last week": "Last week", + "No time logged": "No time logged", + "Log time on a task to see it here.": "Log time on a task to see it here.", + "To date": "To date", + "This week": "This week", + "Total: {total}": "Total: {total}", + "From date": "From date", + "Custom range": "Custom range", + "All time": "All time", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Could not delete a task, so some data may remain. Try deleting the project again.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Could not delete a time entry, so some data may remain. Try deleting the project again.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Could not delete a column, so some data may remain. Try deleting the project again.", + "Could not delete the project. Please try again.": "Could not delete the project. Please try again.", + "Notification settings": "Notification settings", + "Configure when due-date reminders are sent": "Configure when due-date reminders are sent", + "Due-date reminder lead time (hours)": "Due-date reminder lead time (hours)", + "Lead time must be between 1 and 336 hours": "Lead time must be between 1 and 336 hours", + "Reminder lead time saved successfully": "Reminder lead time saved successfully", + "Failed to save reminder lead time": "Failed to save reminder lead time", + "Notifications": "Notifications", + "Notify me 1 day before a task's due date": "Notify me 1 day before a task's due date", + "Draft": "Draft", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.", + "New release": "New release", + "Roadmap chart. The same releases and epics are listed below.": "Roadmap chart. The same releases and epics are listed below.", + "Nothing on the roadmap yet": "Nothing on the roadmap yet", + "Releases with a target date and epics with dated tasks appear here.": "Releases with a target date and epics with dated tasks appear here.", + "Releases": "Releases", + "No releases yet": "No releases yet", + "Target date: {date}": "Target date: {date}", + "No target date": "No target date", + "Edit {name}": "Edit {name}", + "Mark {name} as released": "Mark {name} as released", + "Mark as released": "Mark as released", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "No epics yet. Open a task to make it an epic.", + "Not scheduled yet": "Not scheduled yet", + "Planned": "Planned", + "Released": "Released", + "Edit release": "Edit release", + "Target date": "Target date", + "Could not save the release. Please try again.": "Could not save the release. Please try again.", + "Every task of this release is done or cancelled.": "Every task of this release is done or cancelled.", + "Not finished yet: {count}": "Not finished yet: {count}", + "What happens to these tasks?": "What happens to these tasks?", + "Move to {name}": "Move to {name}", + "Remove the release": "Remove the release", + "Keep it on {name}": "Keep it on {name}", + "Could not mark the release as released. Please try again.": "Could not mark the release as released. Please try again.", + "Roadmap": "Roadmap", + "Tasks or roadmap": "Tasks or roadmap", + "Release": "Release", + "Epic": "Epic", + "This task is an epic": "This task is an epic", + "A named, dated delivery of a project that its tasks are planned against.": "A named, dated delivery of a project that its tasks are planned against.", + "Name of the release": "Name of the release", + "The project this release belongs to": "The project this release belongs to", + "What this release delivers": "What this release delivers", + "When work on the release starts": "When work on the release starts", + "The date the release is due": "The date the release is due", + "Whether the release is planned, released or archived": "Whether the release is planned, released or archived", + "Released on": "Released on", + "When the release was marked as released": "When the release was marked as released", + "The release this task is planned for": "The release this task is planned for", + "Board view options": "Board view options", + "Colour cards": "Colour cards", + "No colour": "No colour", + "By label": "By label", + "By priority": "By priority", + "Swimlanes": "Swimlanes", + "No swimlanes": "No swimlanes", + "By assignee": "By assignee", + "By epic": "By epic", + "No assignee": "No assignee", + "No epic": "No epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Cards stay in their epic row. Change the epic on the task page.", + "Hand over to": "Hand over to", + "Could not save your board view. It applies until you reload.": "Could not save your board view. It applies until you reload.", + "Timetable wish": "Timetable wish", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.", + "Whether the wish is about a teacher, a group, a room or one activity": "Whether the wish is about a teacher, a group, a room or one activity", + "Teacher": "Teacher", + "Group": "Group", + "Reference": "Reference", + "The user, group, room or activity the wish is about": "The user, group, room or activity the wish is about", + "What the wish asks for": "What the wish asks for", + "Not on these periods": "Not on these periods", + "Preferably not on these periods": "Preferably not on these periods", + "At most a number of lessons a day": "At most a number of lessons a day", + "No free periods between lessons": "No free periods between lessons", + "Always the same room": "Always the same room", + "Periods": "Periods", + "The periods of the week the wish is about, such as wed-5": "The periods of the week the wish is about, such as wed-5", + "Limit": "Limit", + "The most lessons a day, for a wish of that kind": "The most lessons a day, for a wish of that kind", + "Strength": "Strength", + "Whether the generator must keep the wish or should keep it": "Whether the generator must keep the wish or should keep it", + "Hard": "Hard", + "Soft": "Soft", + "Weight": "Weight", + "How much a soft wish counts, from 1 to 3": "How much a soft wish counts, from 1 to 3", + "Why the wish exists": "Why the wish exists", + "Timetable scenario": "Timetable scenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.", + "The name timetablers know the scenario by": "The name timetablers know the scenario by", + "Whether the generator made it or it came from the current timetable": "Whether the generator made it or it came from the current timetable", + "Generated": "Generated", + "From the current timetable": "From the current timetable", + "Week of": "Week of", + "The Monday of the first week of the window": "The Monday of the first week of the window", + "Window start": "Window start", + "The first day the week pattern applies to": "The first day the week pattern applies to", + "Window end": "Window end", + "The last day the week pattern applies to": "The last day the week pattern applies to", + "Waiting, generating, done, failed, or published as draft lessons": "Waiting, generating, done, failed, or published as draft lessons", + "Waiting": "Waiting", + "Generating": "Generating", + "Failed": "Failed", + "Published": "Published", + "Seed": "Seed", + "The number the generator starts from, so a run can be repeated": "The number the generator starts from, so a run can be repeated", + "Input": "Input", + "The periods, rooms, lessons and wishes the scenario was made from": "The periods, rooms, lessons and wishes the scenario was made from", + "Placements": "Placements", + "Each lesson with the period and room it was given": "Each lesson with the period and room it was given", + "Unplaced lessons": "Unplaced lessons", + "Lessons without a place, each with the hard wish that blocked it": "Lessons without a place, each with the hard wish that blocked it", + "Broken wishes": "Broken wishes", + "The wishes this scenario breaks, with the lessons that break them": "The wishes this scenario breaks, with the lessons that break them", + "Measures": "Measures", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Placed lessons, broken wishes, teacher gaps, lessons a day and room use", + "Reason": "Reason", + "Why the run failed": "Why the run failed", + "Published at": "Published at", + "When the scenario was written out as draft lessons": "When the scenario was written out as draft lessons", + "Edit wish": "Edit wish", + "New wish": "New wish", + "Hard: the generator always keeps it": "Hard: the generator always keeps it", + "Soft: the generator keeps it where it can": "Soft: the generator keeps it where it can", + "Weight (1 to 3)": "Weight (1 to 3)", + "Most lessons a day": "Most lessons a day", + "Period": "Period", + "{day} period {number}": "{day} period {number}", + "Teacher (user name)": "Teacher (user name)", + "Activity (group:subject)": "Activity (group:subject)", + "Say who or what the wish is about.": "Say who or what the wish is about.", + "Choose at least one period.": "Choose at least one period.", + "The limit is a whole number of 1 or more.": "The limit is a whole number of 1 or more.", + "Timetable": "Timetable", + "Wishes": "Wishes", + "Timetable wishes": "Timetable wishes", + "Generator run": "Generator run", + "Generator progress": "Generator progress", + "The run failed: {reason}": "The run failed: {reason}", + "{placed} of {lessons} lessons placed": "{placed} of {lessons} lessons placed", + "Generate again": "Generate again", + "Generate": "Generate", + "Every lesson has a place.": "Every lesson has a place.", + "Lesson": "Lesson", + "No free period and room": "No free period and room", + "Broken soft wishes": "Broken soft wishes", + "Every soft wish is kept.": "Every soft wish is kept.", + "Wish": "Wish", + "Lessons": "Lessons", + "Generating: {percent}% of the time budget used": "Generating: {percent}% of the time budget used", + "Waiting to start": "Waiting to start", + "Published as draft lessons": "Published as draft lessons", + "Could not read the scenario.": "Could not read the scenario.", + "Could not start the run.": "Could not start the run.", + "Scenarios": "Scenarios", + "Timetable scenarios": "Timetable scenarios", + "Scenario": "Scenario", + "Take the current timetable": "Take the current timetable", + "Could not take the current timetable.": "Could not take the current timetable.", + "Broken hard wishes": "Broken hard wishes", + "Not on a period of the week grid": "Not on a period of the week grid", + "Compare scenarios": "Compare scenarios", + "Scenarios to compare": "Scenarios to compare", + "Choose two or three scenarios to compare them.": "Choose two or three scenarios to compare them.", + "Measure": "Measure", + "Best": "Best", + "Lessons that differ": "Lessons that differ", + "No lesson differs.": "No lesson differs.", + "Not placed": "Not placed", + "{period} in {room}": "{period} in {room}", + "Lessons placed": "Lessons placed", + "Lessons without a place": "Lessons without a place", + "Clashes": "Clashes", + "Hard wishes broken": "Hard wishes broken", + "Soft wishes broken": "Soft wishes broken", + "Soft wishes broken, weighted": "Soft wishes broken, weighted", + "Free periods between lessons, all teachers": "Free periods between lessons, all teachers", + "Most free periods of one teacher": "Most free periods of one teacher", + "Most lessons of one group on a day": "Most lessons of one group on a day", + "Room use": "Room use", + "Publish as draft lessons": "Publish as draft lessons", + "Draft lessons written: {count}": "Draft lessons written: {count}", + "Could not publish the scenario.": "Could not publish the scenario.", + "Rules": "Rules", + "Rules for {column}": "Rules for {column}", + "When a card enters this column": "When a card enters this column", + "Action": "Action", + "Set the priority": "Set the priority", + "Assign to": "Assign to", + "Assign the person who moved the card": "Assign the person who moved the card", + "Remove the assignee": "Remove the assignee", + "Add a label": "Add a label", + "No longer a project member": "No longer a project member", + "This label no longer exists": "This label no longer exists", + "Add rule": "Add rule", + "Remove rule": "Remove rule", + "No rules yet. Add one to change a card when it enters this column.": "No rules yet. Add one to change a card when it enters this column.", + "Could not save the rules. Please try again.": "Could not save the rules. Please try again.", + "1 rule runs when a card enters this column": "1 rule runs when a card enters this column", + "{count} rules run when a card enters this column": "{count} rules run when a card enters this column", + "Rules applied: {changes}": "Rules applied: {changes}", + "assigned to {name}": "assigned to {name}", + "assignee removed": "assignee removed", + "priority {priority}": "priority {priority}", + "label {label}": "label {label}", + "What happens to a card when it enters this column, applied in list order.": "What happens to a card when it enters this column, applied in list order.", + "Value": "Value", + "What the rule does to the card.": "What the rule does to the card.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "The priority, the user id or the label id the action uses; empty for actions without one.", + "is not": "is not", + "{dimension} is not": "{dimension} is not", + "Saved filters": "Saved filters", + "No saved filters yet": "No saved filters yet", + "Save filter": "Save filter", + "Rename \"{name}\"": "Rename \"{name}\"", + "Delete \"{name}\"": "Delete \"{name}\"", + "Clear filters": "Clear filters", + "Showing {shown} of {total} tasks": "Showing {shown} of {total} tasks", + "Assignee": "Assignee", + "Me": "Me", + "No date": "No date", + "Rename saved filter": "Rename saved filter", + "Share with the project": "Share with the project", + "Give the filter a name": "Give the filter a name", + "Could not save the filter. Please try again.": "Could not save the filter. Please try again.", + "Some labels in \"{name}\" no longer exist and were left out.": "Some labels in \"{name}\" no longer exist and were left out.", + "Could not delete the filter. Please try again.": "Could not delete the filter. Please try again.", + "Saved filter": "Saved filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "A named board filter of one project, private to the person who saved it unless shared with the project.", + "The project whose board the filter applies to": "The project whose board the filter applies to", + "The name the filter is listed under": "The name the filter is listed under", + "Saved by": "Saved by", + "Nextcloud user id of the person who saved the filter": "Nextcloud user id of the person who saved the filter", + "Shared with the project": "Shared with the project", + "Whether every project member sees and applies the filter": "Whether every project member sees and applies the filter", + "Criteria": "Criteria", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "The filter: assignee, label, priority and due date, each with is or is not and its values", + "Cross-project view": "Cross-project view", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.", + "Shared with": "Shared with", + "The name the view is listed under": "The name the view is listed under", + "Nextcloud user id of the person who saved the view": "Nextcloud user id of the person who saved the view", + "Nextcloud user ids of the people the view is shared with": "Nextcloud user ids of the people the view is shared with", + "The projects whose tasks the view shows, at most twenty": "The projects whose tasks the view shows, at most twenty", + "1 project in this view is hidden from you.": "1 project in this view is hidden from you.", + "{count} projects in this view are hidden from you.": "{count} projects in this view are hidden from you.", + "{project} has no column for {status}.": "{project} has no column for {status}.", + "This view does not exist or is not shared with you.": "This view does not exist or is not shared with you.", + "\"{task}\" moved to {status}.": "\"{task}\" moved to {status}.", + "Project: {title}": "Project: {title}", + "Cross-project views": "Cross-project views", + "New view": "New view", + "Edit view": "Edit view", + "Delete view": "Delete view", + "Give the view a name": "Give the view a name", + "Pick at least one project": "Pick at least one project", + "A view shows at most {max} projects": "A view shows at most {max} projects", + "Could not save the view. Please try again.": "Could not save the view. Please try again.", + "Could not delete the view. Please try again.": "Could not delete the view. Please try again.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Delete \"{title}\"? The projects and their tasks stay as they are.", + "People see the tasks of the projects they are in, never more.": "People see the tasks of the projects they are in, never more.", + "No views yet. A view shows the tasks of several of your projects together.": "No views yet. A view shows the tasks of several of your projects together.", + "Projects in view: {count}": "Projects in view: {count}", + "Notify me when a task is assigned to me": "Notify me when a task is assigned to me", + "Also send these to me by email": "Also send these to me by email", + "Add an email address in your Nextcloud personal settings to get mail.": "Add an email address in your Nextcloud personal settings to get mail.", + "Code link": "Code link", + "A commit, branch, merge request or issue in a code forge that works on a task.": "A commit, branch, merge request or issue in a code forge that works on a task.", + "The task the link belongs to": "The task the link belongs to", + "The project of the task": "The project of the task", + "Task key": "Task key", + "The task key the forge text named, such as VC-12": "The task key the forge text named, such as VC-12", + "What the link points at": "What the link points at", + "Link": "Link", + "The address of the item in the forge": "The address of the item in the forge", + "The commit message, branch name or merge request title": "The commit message, branch name or merge request title", + "Repository": "Repository", + "The repository, such as acme/portal": "The repository, such as acme/portal", + "Forge id": "Forge id", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "The forge's own id for the item, such as github:acme/portal#42 or a commit hash", + "State": "State", + "The state of a merge request or issue": "The state of a merge request or issue", + "Who made the commit or opened the merge request": "Who made the commit or opened the merge request", + "When the commit was made or the merge request last changed": "When the commit was made or the merge request last changed", + "Added by": "Added by", + "Whether a person added the link or the integration wrote it": "Whether a person added the link or the integration wrote it", + "Nextcloud user UIDs of project members": "Nextcloud user UIDs of project members", + "Add link": "Add link", + "Added by hand": "Added by hand", + "Branch": "Branch", + "Code": "Code", + "Commit": "Commit", + "From the integration": "From the integration", + "Link to a commit, branch or merge request": "Link to a commit, branch or merge request", + "Merge request": "Merge request", + "Merged": "Merged", + "No code linked yet. Name {key} in a commit message or paste a link.": "No code linked yet. Name {key} in a commit message or paste a link.", + "No code linked yet. Paste a link to a commit or merge request.": "No code linked yet. Paste a link to a commit or merge request.", + "Paste a web address that starts with https://.": "Paste a web address that starts with https://.", + "Remove link {title}": "Remove link {title}", + "The link could not be added.": "The link could not be added.", + "The link could not be removed.": "The link could not be removed.", + "This link is already on the task.": "This link is already on the task.", + "Code forges": "Code forges", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.", + "Without Integriq, project members can still paste a link on the task page.": "Without Integriq, project members can still paste a link on the task page.", + "Download the Integriq configuration": "Download the Integriq configuration", + "Calendar": "Calendar", + "Previous": "Previous", + "Calendar view": "Calendar view", + "Starts:": "Starts:", + "No tasks with a date in this month.": "No tasks with a date in this month.", + "Week of {start} to {end}": "Week of {start} to {end}", + "My calendar": "My calendar", + "Show as list": "Show as list", + "Show as calendar": "Show as calendar", + "Open my calendar": "Open my calendar", + "Nextcloud Tasks": "Nextcloud Tasks", + "Show my tasks in Nextcloud Tasks": "Show my tasks in Nextcloud Tasks", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "This server cannot write to Nextcloud Tasks, so the export is not available.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Managed by Planninq. Changes made here are replaced by the next change in Planninq.", + "Working days and holidays": "Working days and holidays", + "Dates set on the timeline skip the days that are not working days.": "Dates set on the timeline skip the days that are not working days.", + "Working weekdays": "Working weekdays", + "Non-working days": "Non-working days", + "No non-working days yet.": "No non-working days yet.", + "Add day": "Add day", + "Year": "Year", + "Add Dutch national holidays": "Add Dutch national holidays", + "Save working days": "Save working days", + "Choose at least one working weekday.": "Choose at least one working weekday.", + "Working days saved.": "Working days saved.", + "Could not save the working days.": "Could not save the working days.", + "New Year's Day": "New Year's Day", + "Easter Sunday": "Easter Sunday", + "Easter Monday": "Easter Monday", + "King's Day": "King's Day", + "Liberation Day": "Liberation Day", + "Ascension Day": "Ascension Day", + "Whit Sunday": "Whit Sunday", + "Whit Monday": "Whit Monday", + "Christmas Day": "Christmas Day", + "Boxing Day": "Boxing Day", + "Dates of {title}": "Dates of {title}", + "The due date cannot be before the start date.": "The due date cannot be before the start date.", + "{title}, from {start} to {end}": "{title}, from {start} to {end}", + "The dates could not be saved.": "The dates could not be saved.", + "{title} now runs from {start} to {end}": "{title} now runs from {start} to {end}", + "Auto-scheduling": "Auto-scheduling", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.", + "Move blocked tasks along when a task slips": "Move blocked tasks along when a task slips", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.", + "Move the tasks that wait for {title}?": "Move the tasks that wait for {title}?", + "These tasks wait for it and would start after its new due date:": "These tasks wait for it and would start after its new due date:", + "{count} tasks would move; the first {limit} are listed.": "{count} tasks would move; the first {limit} are listed.", + "Now": "Now", + "After the move": "After the move", + "Only this task": "Only this task", + "Move all": "Move all", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stopped at {title}: its dates could not be saved. The tasks before it were moved.", + "Cumulative flow": "Cumulative flow", + "Show as chart": "Show as chart", + "Show as table": "Show as table", + "Tasks per column per day": "Tasks per column per day", + "Tasks without recorded history in this period: {count}": "Tasks without recorded history in this period: {count}", + "Lead and cycle time": "Lead and cycle time", + "No tasks were finished in this period.": "No tasks were finished in this period.", + "Finished tasks": "Finished tasks", + "Cycle time, average": "Cycle time, average", + "Cycle time, 85th percentile": "Cycle time, 85th percentile", + "Lead time, average": "Lead time, average", + "Tasks whose finish time was estimated from their history: {count}": "Tasks whose finish time was estimated from their history: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Cycle time of each finished task, with the average and the 85th percentile", + "Slowest tasks": "Slowest tasks", + "cycle {cycle}, lead {lead}": "cycle {cycle}, lead {lead}", + "{days} days": "{days} days", + "Could not load the flow of this project.": "Could not load the flow of this project.", + "Last {days} days": "Last {days} days", + "Portfolio flow": "Portfolio flow", + "An admin adds portfolios under Projects, Portfolios.": "An admin adds portfolios under Projects, Portfolios.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projects not shown, because at most 50 are shown at a time: {count}", + "Could not load the flow of this portfolio.": "Could not load the flow of this portfolio.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Cumulative flow and cycle time across the projects of a portfolio.", + "Edit report": "Edit report", + "Only tasks where": "Only tasks where", + "Group by": "Group by", + "Display": "Display", + "Share with everyone who can read its projects": "Share with everyone who can read its projects", + "The report could not be saved.": "The report could not be saved.", + "Number of tasks": "Number of tasks", + "Bar": "Bar", + "Donut": "Donut", + "Table": "Table", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} of {total} projects in this report are not visible to you", + "No tasks match this report.": "No tasks match this report.", + "None": "None", + "Could not load this report.": "Could not load this report.", + "Report": "Report", + "Your reports": "Your reports", + "My reports": "My reports", + "Shared reports": "Shared reports", + "You have not built a report yet.": "You have not built a report yet.", + "Nobody has shared a report with you yet.": "Nobody has shared a report with you yet.", + "Reports you built over tasks, and the ones shared with you.": "Reports you built over tasks, and the ones shared with you.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.", + "The name the report is listed under": "The name the report is listed under", + "What the report shows and who it is for": "What the report shows and who it is for", + "Nextcloud user id of the person who saved the report": "Nextcloud user id of the person who saved the report", + "Who can open the report": "Who can open the report", + "Only me": "Only me", + "Everyone who can read its projects": "Everyone who can read its projects", + "The projects the report covers, at most fifty": "The projects the report covers, at most fifty", + "Filters": "Filters", + "Task fields and the value each must equal": "Task fields and the value each must equal", + "The task field the report groups on": "The task field the report groups on", + "Count the tasks, or add up a number on them": "Count the tasks, or add up a number on them", + "Sum": "Sum", + "Sum of": "Sum of", + "The number added up when the measure is a sum": "The number added up when the measure is a sum", + "Story points": "Story points", + "Estimated duration": "Estimated duration", + "How the report is shown": "How the report is shown", + "Issue type": "Issue type", + "Task fields and the value each must equal; empty when the report covers every task": "Task fields and the value each must equal; empty when the report covers every task", + "The status a task must have": "The status a task must have", + "The priority a task must have": "The priority a task must have", + "The user a task must be assigned to": "The user a task must be assigned to", + "A label a task must carry": "A label a task must carry", + "The board column a task must be in": "The board column a task must be in", + "The issue type a task must have": "The issue type a task must have", + "Manager groups": "Manager groups", + "Member groups": "Member groups", + "Viewer groups": "Viewer groups", + "Viewers": "Viewers", + "Owning group": "Owning group", + "Nextcloud groups whose members manage the project": "Nextcloud groups whose members manage the project", + "Nextcloud groups whose members work on the project": "Nextcloud groups whose members work on the project", + "Nextcloud groups whose members may read the project": "Nextcloud groups whose members may read the project", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud user ids who manage the project: its settings, its members and its work", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud user ids who may read the project and its work but not change it", + "The Nextcloud group that owns the project with its creator, at most one": "The Nextcloud group that owns the project with its creator, at most one", + "Nextcloud user ids who may read this through the project": "Nextcloud user ids who may read this through the project", + "Nextcloud groups whose members may change this through the project": "Nextcloud groups whose members may change this through the project", + "Nextcloud groups whose members may read this through the project": "Nextcloud groups whose members may read this through the project", + "Search for a person or a group…": "Search for a person or a group…", + "No one found. Your admin's sharing settings decide who you can find.": "No one found. Your admin's sharing settings decide who you can find.", + "Type at least two characters": "Type at least two characters", + "Everyone in this group": "Everyone in this group", + "Could not search for people. Please try again.": "Could not search for people. Please try again.", + "Could not remove the group": "Could not remove the group", + "Only the owner and managers change who is on this project.": "Only the owner and managers change who is on this project.", + "Role of {name}": "Role of {name}", + "Manager": "Manager", + "Member": "Member", + "Viewer": "Viewer", + "Could not change the role": "Could not change the role", + "Owned by group: {name}": "Owned by group: {name}", + "No group owns this project.": "No group owns this project.", + "Owned by group": "Owned by group", + "Search for a group…": "Search for a group…", + "No group found. Your admin's sharing settings decide which groups you can find.": "No group found. Your admin's sharing settings decide which groups you can find.", + "No owning group": "No owning group", + "Could not search for groups. Please try again.": "Could not search for groups. Please try again.", + "Could not change the owning group": "Could not change the owning group", + "You can read this project. Only its members change it.": "You can read this project. Only its members change it.", + "Course": "Course", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "The course this lesson teaches, such as an elective, when the school's learning app knows it.", + "Online meeting link": "Online meeting link", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Where pupils join this lesson online. Pupils see a Join button only for an https link." }, "plurals": {}, "pluralForm": "nplurals=2; plural=(n != 1);" diff --git a/l10n/es.js b/l10n/es.js index facbf242..f41bda9d 100644 --- a/l10n/es.js +++ b/l10n/es.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "No se pudo eliminar la etiqueta", "Delete label \"{title}\"? It will be removed from {count} task.": "¿Eliminar la etiqueta \"{title}\"? Se quitará de {count} tarea.", "Label deleted and removed from {count} task": "Etiqueta eliminada y quitada de {count} tarea", - "used by {count} task": "usada por {count} tarea" + "used by {count} task": "usada por {count} tarea", + "Active projects": "Proyectos activos", + "Archived projects": "Proyectos archivados", + "Boards": "Tableros", + "My projects": "Mis proyectos", + "Portfolio": "Cartera", + "Project board": "Tablero del proyecto", + "Projects I am in": "Proyectos en los que participo", + "Timeline": "Cronología", + "Timesheet": "Hoja de horas", + "Features & roadmap": "Funciones y hoja de ruta", + "Flow": "Flujo", + "Flows": "Flujos", + "Reports": "Informes", + "Pick a report to open it.": "Elija un informe para abrirlo.", + "In progress": "En curso", + "Date": "Fecha", + "Due": "Vence", + "Assignee": "Asignado a", + "Who": "Quién", + "What": "Qué", + "Minutes": "Minutos", + "Entries": "Entradas", + "Most recent": "Más recientes", + "Per person": "Por persona", + "By status": "Por estado", + "By priority": "Por prioridad", + "Task status": "Estado de las tareas", + "Time spent": "Tiempo dedicado", + "Capacity": "Capacidad", + "Due soonest": "Vencen antes", + "Minutes logged": "Minutos registrados", + "Nothing is due": "No hay vencimientos", + "Nothing logged yet": "Aún no hay registros", + "What is open, what is blocked, and what is overdue.": "Qué está abierto, qué está bloqueado y qué está vencido.", + "How allocation is spread across the people working on projects.": "Cómo se reparte la asignación entre quienes trabajan en proyectos.", + "Hours logged, and the projects they went to.": "Las horas registradas y los proyectos a los que fueron.", + "Billable": "Facturable", + "Budget: {amount}": "Presupuesto: {amount}", + "Loading projects": "Cargando proyectos", + "No projects for this client yet": "Aún no hay proyectos para este cliente", + "Open in Planninq": "Abrir en Planninq", + "This project could not be found": "No se ha encontrado este proyecto", + "Untitled project": "Proyecto sin título", + "and {count} more": "y {count} más", + "Store": "Tienda", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instale registros, esquemas y flujos publicados por otras organizaciones.", + "Work Date": "Fecha de trabajo", + "Zaak UUID": "UUID de Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Acciones de la columna", + "Columns": "Columnas", + "Could not remove the column. Please try again.": "No se pudo eliminar la columna. Inténtelo de nuevo.", + "Could not save the column. Please try again.": "No se pudo guardar la columna. Inténtelo de nuevo.", + "Done column": "Columna de terminado", + "Edit column": "Editar columna", + "Keep the card's status": "Mantener el estado de la tarjeta", + "Move its cards to": "Mover sus tarjetas a", + "Move left": "Mover a la izquierda", + "Move right": "Mover a la derecha", + "Status of cards moved here": "Estado de las tarjetas movidas aquí", + "The last done column cannot be removed.": "La última columna de terminado no se puede eliminar.", + "WIP limit": "Límite WIP", + "over limit": "por encima del límite", + "The status a card gets when it is moved into this column.": "El estado que recibe una tarjeta cuando se mueve a esta columna.", + "All priorities": "Todas las prioridades", + "Could not create the task. Please try again.": "No se pudo crear la tarea. Inténtelo de nuevo.", + "Created": "Creada", + "Move to backlog": "Al backlog", + "Move to board": "Al tablero", + "New task": "Nueva tarea", + "Nothing in the backlog": "Nada en el backlog", + "Rank": "Rango", + "Sort by": "Ordenar por", + "Sort by rank to reorder": "Ordene por rango para reordenar", + "Task actions": "Acciones de la tarea", + "All labels": "Todas las etiquetas", + "Filter tasks by label": "Filtrar tareas por etiqueta", + "View timeline": "Ver cronología", + "Board": "Tablero", + "List": "Lista", + "Column": "Columna", + "Board or list": "Tablero o lista", + "Log": "Registro", + "Add entry": "Añadir entrada", + "Show": "Mostrar", + "No actions yet": "Aún no hay acciones", + "Closed": "Cerrado", + "Entry actions": "Acciones de la entrada", + "Add action": "Añadir acción", + "by {author}": "por {author}", + "saved {time}": "guardado {time}", + "Attendees: {names}": "Asistentes: {names}", + "Add the first entry": "Añadir la primera entrada", + "Issues": "Incidencias", + "Lessons learned": "Lecciones aprendidas", + "Meetings": "Reuniones", + "Decisions": "Decisiones", + "Actions": "Acciones", + "Issue": "Incidencia", + "Lesson learned": "Lección aprendida", + "Meeting": "Reunión", + "Decision": "Decisión", + "About this project": "Acerca de este proyecto", + "No description yet": "Aún no hay descripción", + "Start date": "Fecha de inicio", + "Not set": "Sin definir", + "End date": "Fecha de fin", + "Progress": "Progreso", + "No tasks yet": "Aún no hay tareas", + "Open the board": "Abrir el tablero", + "People": "Personas", + "Owner": "Propietario", + "Latest log entries": "Últimas entradas", + "Open the log": "Abrir el registro", + "{done} of {total} tasks done": "{done} de {total} tareas hechas", + "Edit entry": "Editar entrada", + "Type": "Tipo", + "Attendees": "Asistentes", + "Issue is closed": "La incidencia está cerrada", + "Could not save the entry. Please try again.": "No se pudo guardar la entrada. Inténtelo de nuevo.", + "From: {title}": "De: {title}", + "What needs to happen": "Qué hay que hacer", + "Could not create the action. Please try again.": "No se pudo crear la acción. Inténtelo de nuevo.", + "The action was created but could not be linked to the entry.": "La acción se creó, pero no se pudo vincular a la entrada.", + "Project pages": "Páginas del proyecto", + "Overview": "Resumen", + "Risks": "Riesgos", + "Log entry": "Entrada de registro", + "A short name for the entry": "Un nombre corto para la entrada", + "Project": "Proyecto", + "The project this entry belongs to": "El proyecto al que pertenece esta entrada", + "What kind of entry this is": "Qué tipo de entrada es", + "When it happened": "Cuándo ocurrió", + "What happened, in Markdown": "Qué ocurrió, en Markdown", + "Whether an issue is still open": "Si una incidencia sigue abierta", + "The people at a meeting": "Las personas en una reunión", + "Tasks that came out of this entry": "Tareas surgidas de esta entrada", + "Add risk": "Añadir riesgo", + "Risk": "Riesgo", + "Score": "Puntuación", + "Response": "Respuesta", + "Review date": "Fecha de revisión", + "no longer on the project": "ya no está en el proyecto", + "Edit {title}": "Editar {title}", + "No risks recorded yet": "Aún no hay riesgos registrados", + "Add the first risk": "Añadir el primer riesgo", + "Medium": "Medio", + "Mitigating": "En mitigación", + "Occurred": "Ocurrido", + "Avoid": "Evitar", + "Reduce": "Reducir", + "Transfer": "Transferir", + "Accept": "Aceptar", + "Highest open risks": "Riesgos abiertos más altos", + "No open risks": "No hay riesgos abiertos", + "Open the risk register": "Abrir el registro de riesgos", + "Edit risk": "Editar riesgo", + "What could go wrong": "Qué podría salir mal", + "Likelihood": "Probabilidad", + "Impact": "Impacto", + "Score {score}": "Puntuación {score}", + "Countermeasures": "Contramedidas", + "Could not save the risk. Please try again.": "No se pudo guardar el riesgo. Inténtelo de nuevo.", + "Risks by likelihood and impact": "Riesgos por probabilidad e impacto", + "Risk scale": "Escala de riesgo", + "The levels every project scores its risks on, and where low turns into medium and high": "Los niveles en los que cada proyecto puntúa sus riesgos, y dónde bajo pasa a medio y alto", + "Number of levels": "Número de niveles", + "Likelihood labels": "Etiquetas de probabilidad", + "Impact labels": "Etiquetas de impacto", + "Level {level}": "Nivel {level}", + "Medium from score": "Medio a partir de la puntuación", + "High from score": "Alto a partir de la puntuación", + "Risk scale saved": "Escala de riesgo guardada", + "1 risk uses level {level}. Change it first.": "1 riesgo usa el nivel {level}. Cámbielo primero.", + "{count} risks use level {level}. Change them first.": "{count} riesgos usan el nivel {level}. Cámbielos primero.", + "Every level needs a label, and high must start above medium.": "Cada nivel necesita una etiqueta, y alto debe empezar por encima de medio.", + "The project this risk belongs to": "El proyecto al que pertenece este riesgo", + "The cause and the effect, in Markdown": "La causa y el efecto, en Markdown", + "Category": "Categoría", + "A free grouping, such as planning, budget or supplier": "Una agrupación libre, como planificación, presupuesto o proveedor", + "How likely it is, on the admin's risk scale": "Qué probabilidad tiene, en la escala de riesgo del administrador", + "How hard it would hit, on the admin's risk scale": "Cuánto afectaría, en la escala de riesgo del administrador", + "Likelihood times impact, calculated by the server": "Probabilidad por impacto, calculada por el servidor", + "Where the risk stands": "En qué punto está el riesgo", + "The person who watches this risk": "La persona que vigila este riesgo", + "How the project answers the risk": "Cómo responde el proyecto al riesgo", + "What is done to prevent it or soften it, in Markdown": "Qué se hace para evitarlo o suavizarlo, en Markdown", + "When to look at this risk again": "Cuándo revisar de nuevo este riesgo", + "Very low": "Muy bajo", + "Very high": "Muy alto", + "All projects": "Todos los proyectos", + "Project status report": "Informe de estado del proyecto", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Un informe fechado sobre cómo está un proyecto en dinero, organización, tiempo, información, calidad y riesgo (los aspectos GROTIK), cada uno con una nota.", + "The project this report is about": "El proyecto del que trata este informe", + "Report date": "Fecha del informe", + "The day the report describes": "El día que describe el informe", + "Money": "Dinero", + "How the project stands on this aspect": "Cómo está el proyecto en este aspecto", + "On track": "En curso", + "At risk": "En riesgo", + "Off track": "Desviado", + "Money note": "Nota sobre dinero", + "A short explanation of this status": "Una breve explicación de este estado", + "Organisation": "Organización", + "Organisation note": "Nota sobre organización", + "Time": "Tiempo", + "Time note": "Nota sobre tiempo", + "Information": "Información", + "Information note": "Nota sobre información", + "Quality": "Calidad", + "Quality note": "Nota sobre calidad", + "Risk note": "Nota sobre riesgo", + "Overall": "General", + "The worst of the six statuses, calculated by the server": "El peor de los seis estados, calculado por el servidor", + "Health: money": "Salud: dinero", + "Copied from the newest status report": "Copiado del informe de estado más reciente", + "Health: organisation": "Salud: organización", + "Health: time": "Salud: tiempo", + "Health: information": "Salud: información", + "Health: quality": "Salud: calidad", + "Health: risk": "Salud: riesgo", + "Health: overall": "Salud: general", + "Health: report date": "Salud: fecha del informe", + "The date of the newest status report": "La fecha del informe de estado más reciente", + "New report": "Nuevo informe", + "Only the project owner writes status reports.": "Solo el propietario del proyecto escribe informes de estado.", + "Latest report, {date}": "Último informe, {date}", + "Aspect": "Aspecto", + "Note": "Nota", + "Report history": "Historial de informes", + "Author": "Autor", + "No status reports yet": "Aún no hay informes de estado", + "Write the first report": "Escribir el primer informe", + "Choose a status for every aspect to save the report.": "Elija un estado para cada aspecto para guardar el informe.", + "Suggested: on track.": "Sugerencia: en curso.", + "Suggested: at risk.": "Sugerencia: en riesgo.", + "Suggested: off track.": "Sugerencia: desviado.", + "1 task is past its due date.": "1 tarea ha pasado su fecha límite.", + "{count} tasks are past their due date.": "{count} tareas han pasado su fecha límite.", + "The end date has passed with 1 open task.": "La fecha de fin ha pasado con 1 tarea abierta.", + "The end date has passed with {count} open tasks.": "La fecha de fin ha pasado con {count} tareas abiertas.", + "No open task is past its due date.": "Ninguna tarea abierta ha pasado su fecha límite.", + "The highest open risk, \"{title}\", scores {score}.": "El riesgo abierto más alto, \"{title}\", puntúa {score}.", + "There are no open risks.": "No hay riesgos abiertos.", + "Costs are at {percent}% of the budget.": "Los costes están en el {percent}% del presupuesto.", + "No suggestion: the project has no budget.": "Sin sugerencia: el proyecto no tiene presupuesto.", + "No suggestion: no costs are recorded for this project yet.": "Sin sugerencia: aún no hay costes registrados para este proyecto.", + "The report was not saved. Only the project owner can write status reports.": "El informe no se ha guardado. Solo el propietario del proyecto puede escribir informes de estado.", + "No report": "Sin informe", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Un grupo de proyectos dirigidos por las mismas personas, como un departamento o un programa. Sus responsables leen cada proyecto que contiene.", + "The name of the portfolio": "El nombre de la cartera", + "What the portfolio holds and who runs it": "Qué contiene la cartera y quién la dirige", + "A colour for the portfolio's section in project lists": "Un color para la sección de la cartera en las listas de proyectos", + "Managers": "Responsables", + "Nextcloud user UIDs of the people who run the portfolio": "ID de usuario de Nextcloud de las personas que dirigen la cartera", + "Order": "Orden", + "Where the portfolio comes in project lists, lowest first": "Dónde aparece la cartera en las listas de proyectos, primero el más bajo", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "La escala de riesgo propia de esta cartera en JSON, con la misma forma que la de toda la aplicación. Vacío significa la escala de la aplicación.", + "Portfolio readers": "Lectores de la cartera", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID de usuario de Nextcloud de los responsables de la cartera del proyecto", + "The portfolio this project belongs to": "La cartera a la que pertenece este proyecto", + "No portfolio": "Sin cartera", + "All portfolios": "Todas las carteras", + "You read this project as a manager of its portfolio. Only its members change it.": "Lee este proyecto como responsable de su cartera. Solo sus miembros lo cambian.", + "Portfolios": "Carteras", + "Portfolio status": "Estado de la cartera", + "No portfolios yet": "Aún no hay carteras", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Un administrador añade carteras en Proyectos, Carteras. Los proyectos de una cartera aparecen aquí con su estado.", + "Roll-up": "Resumen", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} en curso, {atRisk} en riesgo, {offTrack} desviados, {noReport} sin informe", + "No project in this portfolio that you can read.": "Ningún proyecto de esta cartera que puedas leer.", + "Start": "Inicio", + "End": "Fin", + "Budget": "Presupuesto", + "Last report": "Último informe", + "Out of date": "Desactualizado", + "Portfolio timeline": "Cronograma de la cartera", + "Zoom": "Zoom", + "Could not load the timeline": "No se pudo cargar el cronograma", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Un administrador añade carteras en Proyectos, Carteras. Los proyectos de una cartera aparecen aquí en un solo cronograma.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Abre un proyecto para ver sus fases y tareas. El cronograma es de solo lectura.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Omitidos porque no puedes leerlos: {count} proyectos", + "Week": "Semana", + "Day": "Día", + "Month": "Mes", + "Please try again later.": "Inténtalo de nuevo más tarde.", + "Status reports": "Informes de estado", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Después de cuántos días el último informe de estado de un proyecto se marca como desactualizado en la vista de la cartera", + "Reporting period (days)": "Periodo de informe (días)", + "The reporting period is a whole number of days from 1 to 365.": "El periodo de informe es un número entero de días de 1 a 365.", + "Reporting period saved": "Periodo de informe guardado", + "The reporting period was not saved. Please try again.": "El periodo de informe no se guardó. Inténtalo de nuevo.", + "Every project of a portfolio with its status per aspect, rolled up.": "Cada proyecto de una cartera con su estado por aspecto, resumido.", + "The projects of a portfolio on one timeline.": "Los proyectos de una cartera en un solo cronograma.", + "Phases": "Fases", + "Add phase": "Añadir fase", + "No phases yet": "Aún no hay fases", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Divide el proyecto en fases, como iniciación, definición y ejecución. Una fase se cierra cuando se sube su documento de cierre.", + "{hours} hours": "{hours} horas", + "Concluding document: {title}": "Documento de cierre: {title}", + "Concluding document missing": "Falta el documento de cierre", + "Move {title} up": "Subir {title}", + "Move {title} down": "Bajar {title}", + "Close phase": "Cerrar fase", + "Phase": "Fase", + "Files": "Archivos", + "Notes": "Notas", + "Audit trail": "Registro de auditoría", + "Edit phase": "Editar fase", + "Name": "Nombre", + "Budget hours": "Horas presupuestadas", + "Could not save the phase. Please try again.": "No se pudo guardar la fase. Inténtalo de nuevo.", + "Close phase {title}": "Cerrar la fase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Una fase se cierra con su documento de cierre: súbelo aquí o elige uno de los archivos de la fase.", + "Concluding document": "Documento de cierre", + "This phase has no files yet.": "Esta fase aún no tiene archivos.", + "Upload a document": "Subir un documento", + "The document was not uploaded. Please try again.": "El documento no se subió. Inténtalo de nuevo.", + "Upload the concluding document before you close this phase.": "Sube el documento de cierre antes de cerrar esta fase.", + "This phase cannot be closed from its current status.": "Esta fase no se puede cerrar desde su estado actual.", + "The phase was not closed. Please try again.": "La fase no se cerró. Inténtalo de nuevo.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "El id del archivo de esta fase que la cierra. La fase solo puede completarse cuando está indicado y el archivo está adjunto.", + "Import from Microsoft Project": "Importar desde Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Elija un plan guardado desde Microsoft Project en formato XML. No se importa nada hasta que confirme.", + "Plan file": "Archivo del plan", + "What the import creates": "Lo que crea la importación", + "Tasks": "Tareas", + "Sub-tasks": "Subtareas", + "Milestones": "Hitos", + "Links": "Vínculos", + "Already imported, updated in place: {count}": "Ya importados, actualizados en su sitio: {count}", + "What does not carry over": "Lo que no se traslada", + "Tasks with resources, which are not imported: {count}": "Tareas con recursos, que no se importan: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tareas por debajo del nivel 3, colocadas bajo su tarea de nivel 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Vínculos distintos de fin a comienzo, importados como vínculos relacionados: {count}", + "Link lags, which are dropped: {count}": "Posposiciones de vínculos, que se descartan: {count}", + "Links to a summary task, which are not imported: {count}": "Vínculos a una tarea de resumen, que no se importan: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Vínculos a tareas fuera de este plan, que no se importan: {count}", + "No longer in the plan": "Ya no está en el plan", + "These stay in the project; remove them yourself if they are no longer needed.": "Permanecen en el proyecto; elimínelos usted si ya no se necesitan.", + "Import": "Importar", + "Close": "Cerrar", + "The plan is imported: {created} created, {updated} updated.": "El plan está importado: {created} creados, {updated} actualizados.", + "Links that would close a loop were left out: {count}": "Se omitieron los vínculos que cerrarían un ciclo: {count}", + "The import stopped part-way. Run it again to finish it.": "La importación se detuvo a medias. Ejecútela de nuevo para terminarla.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Guarde el plan en Microsoft Project con Archivo, Guardar como, formato XML, e importe ese archivo.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Este archivo declara un DOCTYPE o entidades, que no se aceptan.", + "The file is larger than 10 MB.": "El archivo supera los 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "El plan tiene más de 2.000 tareas, más de las que admite una importación.", + "This file is not a Microsoft Project plan in XML format.": "Este archivo no es un plan de Microsoft Project en formato XML.", + "Choose a file to import.": "Elija un archivo para importar.", + "Only the project owner can import a plan.": "Solo el propietario del proyecto puede importar un plan.", + "The plan could not be read. Please try again.": "No se pudo leer el plan. Inténtelo de nuevo.", + "Linked case: {title}": "Expediente vinculado: {title}", + "Linked to a case": "Vinculado a un expediente", + "Hand over to case": "Entregar al expediente", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copia sin cambios cada archivo del proyecto y de sus tareas, y un archivo que describe el proyecto, al expediente vinculado.", + "{date} by {user}": "{date} por {user}", + "Files copied: {count}": "Archivos copiados: {count}", + "Files that failed: {names}": "Archivos con error: {names}", + "The handover failed. Please try again.": "La entrega ha fallado. Inténtelo de nuevo.", + "The linked case could not be found, or you cannot open it.": "No se encontró el expediente vinculado o no puede abrirlo.", + "Case handovers": "Entregas al expediente", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Cada entrega de los archivos y metadatos del proyecto a su expediente: cuándo, por quién, a qué expediente, cada archivo copiado con su SHA-256 y los archivos que fallaron.", + "Finance": "Finanzas", + "Add cost line": "Añadir línea de coste", + "Delivery terms": "Condiciones de entrega", + "Billing model": "Modelo de facturación", + "Budget in euro": "Presupuesto en euros", + "Budget in hours": "Presupuesto en horas", + "Hourly rate in euro": "Tarifa por hora en euros", + "Planned start": "Inicio previsto", + "Planned end": "Fin previsto", + "Planned dates": "Fechas previstas", + "Budget {amount}": "Presupuesto {amount}", + "No budget agreed": "Sin presupuesto acordado", + "Hours": "Horas", + "Only the project owner and the portfolio managers see the amounts.": "Solo el propietario del proyecto y los gestores de la cartera ven los importes.", + "Budget against cost per category": "Presupuesto frente a costes por categoría", + "Labour (booked time)": "Mano de obra (horas registradas)", + "No category": "Sin categoría", + "Hours are not available": "Las horas no están disponibles", + "Not yet assigned to a category": "Aún sin asignar a una categoría", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} gastado, {remaining} restante", + "Budget against cost per phase": "Presupuesto frente a costes por fase", + "No phase": "Sin fase", + "Cost lines": "Líneas de coste", + "From the finance system": "Del sistema financiero", + "Edit cost line {amount}": "Editar la línea de coste {amount}", + "No cost lines yet": "Aún no hay líneas de coste", + "Commitments": "Compromisos", + "Actual cost": "Coste real", + "Forecast": "Previsión", + "Remaining": "Restante", + "Not planned yet": "Aún sin planificar", + "{start} to {end}": "{start} a {end}", + "The terms were not saved. Please try again.": "Las condiciones no se guardaron. Inténtalo de nuevo.", + "Terms saved": "Condiciones guardadas", + "Fixed price": "Precio fijo", + "Hourly": "Por horas", + "Not billed": "Sin facturar", + "Commitment": "Compromiso", + "Edit cost line": "Editar línea de coste", + "Kind": "Tipo", + "Amount in euro": "Importe en euros", + "Remove": "Eliminar", + "Could not save the cost line. Only the project owner changes the money of a project.": "No se pudo guardar la línea de coste. Solo el propietario del proyecto cambia el dinero de un proyecto.", + "Could not remove the cost line. Please try again.": "No se pudo eliminar la línea de coste. Inténtalo de nuevo.", + "{amount} over budget": "{amount} por encima del presupuesto", + "Cost categories": "Categorías de coste", + "The categories every project splits its budget and costs into, one per line": "Las categorías en las que cada proyecto divide su presupuesto y sus costes, una por línea", + "Categories": "Categorías", + "Give at least one category, each name once.": "Indica al menos una categoría, cada nombre una sola vez.", + "Cost categories saved": "Categorías de coste guardadas", + "The cost categories were not saved. Please try again.": "Las categorías de coste no se guardaron. Inténtalo de nuevo.", + "Finance line": "Línea financiera", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Un importe de un proyecto: un presupuesto, un compromiso, un coste real o una previsión, en una categoría de coste y opcionalmente una fase. Lo registra el propietario del proyecto o el sistema financiero a través de la aplicación de integración.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "El proyecto al que pertenece este importe. Vacío para una línea del sistema financiero cuyo número de proyecto no coincide con ningún proyecto.", + "The phase this amount belongs to, if any": "La fase a la que pertenece este importe, si la hay", + "The cost category, one of the categories the admin set up": "La categoría de coste, una de las que configuró el administrador", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Si el importe es un presupuesto, un compromiso, un coste real o una previsión", + "Amount": "Importe", + "The amount in the reporting currency (euro)": "El importe en la moneda de informe (euro)", + "The date the amount was booked or is expected": "La fecha en que se registró o se espera el importe", + "What the amount is for": "Para qué es el importe", + "Whether a person entered the line or the finance system sent it": "Si una persona registró la línea o la envió el sistema financiero", + "Entered by hand": "Registrado a mano", + "Finance line id": "Id de la línea financiera", + "The finance system's own id of this line. One imported line per id.": "El id propio de esta línea en el sistema financiero. Una línea importada por id.", + "Project number": "Número de proyecto", + "The project number the finance system sent, matched against the project key": "El número de proyecto que envió el sistema financiero, comparado con la clave del proyecto", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "La cartera del proyecto de la línea, copiada del proyecto para que los totales de la cartera necesiten un solo filtro", + "Finance readers": "Lectores financieros", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID de Nextcloud de las personas que pueden ver este importe: el propietario del proyecto y los gestores de su cartera", + "Project owner": "Propietario del proyecto", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID de Nextcloud del propietario del proyecto, que puede cambiar y eliminar las líneas manuales", + "How the client pays: not billed, a fixed price, or by the hour.": "Cómo paga el cliente: sin facturar, precio fijo o por horas.", + "Portfolio finance": "Finanzas de la cartera", + "You cannot see the money of any project in this portfolio": "No puedes ver el dinero de ningún proyecto de esta cartera", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "El servidor devolvió líneas de coste de proyectos fuera de esta cartera, así que estos totales pueden ser erróneos.", + "Projects left out because you cannot see their money: {count}": "Proyectos omitidos porque no puedes ver su dinero: {count}", + "Unmatched finance lines": "Líneas financieras sin asignar", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Presupuesto, compromisos, coste real y previsión sumados en una cartera.", + "Subprojects": "Subproyectos", + "{done} of {total}": "{done} de {total}", + "{done} of {total} tasks done, including subprojects": "{done} de {total} tareas hechas, subproyectos incluidos", + "Show the subprojects of {title}": "Mostrar los subproyectos de {title}", + "Hide the subprojects of {title}": "Ocultar los subproyectos de {title}", + "Part of": "Forma parte de", + "No parent project": "Sin proyecto superior", + "A project cannot sit under one of its own subprojects.": "Un proyecto no puede quedar bajo uno de sus propios subproyectos.", + "Projects nest three levels deep at most: programme, project and subproject.": "Los proyectos se anidan como máximo tres niveles: programa, proyecto y subproyecto.", + "Parent project": "Proyecto superior", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "El proyecto bajo el que queda este proyecto, como un programa. Los proyectos se anidan como máximo tres niveles.", + "Yes": "Sí", + "No": "No", + "{label} (required)": "{label} (obligatorio)", + "{label} is required": "{label} es obligatorio", + "Project field": "Campo de proyecto", + "A field an admin adds to every project, such as a policy area or a contract value.": "Un campo que un administrador añade a cada proyecto, como un área de política o un valor de contrato.", + "Key": "Clave", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "El nombre fijo con el que se guarda el valor, en lower camel case. Mantenlo en cuanto los proyectos lo usen.", + "Label": "Etiqueta", + "The name people see next to the field": "El nombre que las personas ven junto al campo", + "What the field holds": "Lo que contiene el campo", + "Text": "Texto", + "Number": "Número", + "Choice": "Opción", + "Person": "Persona", + "Yes or no": "Sí o no", + "Options": "Opciones", + "The choices of a choice field": "Las opciones de un campo de elección", + "Required": "Obligatorio", + "Whether a project must fill in the field": "Si un proyecto debe rellenar el campo", + "Where the field appears, lowest first": "Dónde aparece el campo, el menor primero", + "Applies to": "Se aplica a", + "What the field is added to": "A qué se añade el campo", + "Custom fields": "Campos propios", + "The values of the project fields an admin defined, keyed by the field's key.": "Los valores de los campos de proyecto que definió un administrador, por la clave del campo.", + "Project fields": "Campos de proyecto", + "Related": "Relacionadas", + "Remove link": "Quitar el vínculo", + "Link type": "Tipo de vínculo", + "Relates to": "Relacionada con", + "Duplicates": "Duplica", + "Project key": "Clave del proyecto", + "Every task number starts with it, such as VERG-42.": "Cada número de tarea empieza por ella, por ejemplo VERG-42.", + "This key is already used by another project.": "Otro proyecto ya usa esta clave.", + "Use 2 to 10 letters and digits, starting with a letter.": "Use de 2 a 10 letras y dígitos, empezando por una letra.", + "The key cannot change once tasks carry it.": "La clave no puede cambiar una vez que las tareas la llevan.", + "Project saved. The existing tasks get their numbers in the background.": "Proyecto guardado. Las tareas existentes reciben su número en segundo plano.", + "Next task number": "Número de la siguiente tarea", + "The number the next task of this project gets in its key. Only the system writes it.": "El número que recibe en su clave la siguiente tarea de este proyecto. Solo el sistema lo escribe.", + "Restore {title}": "Restaurar {title}", + "Restore": "Restaurar", + "Project restored": "Proyecto restaurado", + "Could not restore the project": "No se pudo restaurar el proyecto", + "Bring this project back to the active list.": "Devolver este proyecto a la lista de proyectos activos.", + "Restore project": "Restaurar proyecto", + "Request reason": "Motivo de la solicitud", + "Why the requester needs this project. Filled in when the project is requested.": "Por qué el solicitante necesita este proyecto. Se rellena al solicitarlo.", + "Reviewed by": "Revisado por", + "The user who approved or rejected the request.": "El usuario que aprobó o rechazó la solicitud.", + "Reviewed at": "Revisado el", + "When the request was approved or rejected.": "Cuándo se aprobó o rechazó la solicitud.", + "Review note": "Nota de revisión", + "The reviewer's reason, shown to the requester when a request is not approved.": "El motivo del revisor, que ve el solicitante cuando una solicitud no se aprueba.", + "Members of these groups": "Miembros de estos grupos", + "Groups that may create projects": "Grupos que pueden crear proyectos", + "The group {group} no longer exists. Save to remove it.": "El grupo {group} ya no existe. Guarde para quitarlo.", + "Review project request": "Revisar la solicitud de proyecto", + "Requested by": "Solicitado por", + "Why it is needed": "Por qué se necesita", + "Desired start date": "Fecha de inicio deseada", + "Why is it not approved?": "¿Por qué no se aprueba?", + "Give a reason. The requester sees it.": "Indique un motivo. El solicitante lo verá.", + "Approve": "Aprobar", + "Reject": "Rechazar", + "Reject request": "Rechazar la solicitud", + "The review was not saved. Try again.": "La revisión no se guardó. Inténtelo de nuevo.", + "This project is waiting for review": "Este proyecto está pendiente de revisión", + "This request was not approved": "Esta solicitud no se aprobó", + "Reason: {note}": "Motivo: {note}", + "Review request": "Revisar la solicitud", + "Request a project": "Solicitar un proyecto", + "Step {step} of 2": "Paso {step} de 2", + "Why is this project needed?": "¿Por qué se necesita este proyecto?", + "Give a reason. The reviewer reads it.": "Indique un motivo. El revisor lo leerá.", + "Back": "Atrás", + "Next": "Siguiente", + "Send request": "Enviar solicitud", + "The request was not sent. Try again.": "La solicitud no se envió. Inténtelo de nuevo.", + "Requested": "Solicitado", + "Not approved": "No aprobado", + "Your request was sent": "Su solicitud se ha enviado", + "Let everyone else request a project": "Permitir que los demás soliciten un proyecto", + "Add a task": "Añadir una tarea", + "Delete task": "Eliminar tarea", + "Edit task": "Editar tarea", + "Write": "Escribir", + "Preview": "Vista previa", + "Markdown works here: headings, lists and links.": "Aquí funciona Markdown: encabezados, listas y enlaces.", + "Could not save the task. Please try again.": "No se pudo guardar la tarea. Inténtalo de nuevo.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "\"{title}\" tiene tiempo registrado, así que no se puede eliminar. Puedes cancelarla en su lugar: los registros de tiempo se conservan.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "¿Eliminar \"{title}\"? También se eliminan sus vínculos con otras tareas. Esto no se puede deshacer.", + "Keep task": "Conservar tarea", + "Cancel task": "Cancelar tarea", + "Only the reporter, the project owner or an admin can delete this task.": "Solo quien la informó, el propietario del proyecto o un administrador puede eliminar esta tarea.", + "Could not delete the task. Please try again.": "No se pudo eliminar la tarea. Inténtalo de nuevo.", + "Could not cancel the task. Please try again.": "No se pudo cancelar la tarea. Inténtalo de nuevo.", + "Responsible": "Responsable", + "Also working on this": "También trabajan en esto", + "Labels": "Etiquetas", + "Could not change the priority. Please try again.": "No se pudo cambiar la prioridad. Inténtalo de nuevo.", + "Other project members who work on this task alongside the person responsible.": "Otros miembros del proyecto que trabajan en esta tarea junto a la persona responsable.", + "Duplicate": "Duplicar", + "Could not copy the task. Please try again.": "No se pudo copiar la tarea. Inténtalo de nuevo.", + "Subtasks": "Subtareas", + "{done} of {total} done": "{done} de {total} hechas", + "Add a subtask": "Añadir una subtarea", + "Checklist": "Lista de comprobación", + "Checklist item actions": "Acciones del elemento de la lista", + "Add a checklist item": "Añadir un elemento a la lista", + "Subtasks: {estimate} estimated, {logged} logged": "Subtareas: {estimate} estimado, {logged} registrado", + "Total estimate: {total}": "Estimación total: {total}", + "Part of {title}": "Parte de {title}", + "Checklist: {count} done": "Lista de comprobación: {count} hechos", + "This task has subtasks: {count}.": "Esta tarea tiene subtareas: {count}.", + "Keep subtasks as separate tasks": "Conservar las subtareas como tareas independientes", + "Delete subtasks too": "Eliminar también las subtareas", + "Copy of {title}": "Copia de {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "La tarea se copió, pero no todas sus subtareas. Revisa la copia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Pequeños pasos dentro de la tarea. Cada elemento tiene un id, un texto y si está hecho.", + "Open work per person and per project.": "Trabajo abierto por persona y por proyecto.", + "View": "Vista", + "By person": "Por persona", + "By project": "Por proyecto", + "Hours left": "Horas restantes", + "Tasks without an estimate": "Tareas sin estimación", + "Due in 14 days": "Vence en 14 días", + "Shared": "Compartidas", + "Unassigned": "Sin asignar", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Se muestra el trabajo de los proyectos que puedes ver. Las horas cuentan para la persona responsable; las tareas compartidas se cuentan sin horas.", + "No open work in these projects.": "No hay trabajo abierto en estos proyectos.", + "Open work": "Trabajo abierto", + "{count} open tasks": "{count} tareas abiertas", + "Create a project to see capacity here.": "Crea un proyecto para ver aquí la capacidad.", + "My tasks": "Mis tareas", + "Show all my tasks": "Mostrar todas mis tareas", + "No tasks assigned to you": "No tienes tareas asignadas", + "Browse projects": "Explorar proyectos", + "Later": "Más adelante", + "Due {date}": "Vence {date}", + "Could not change the status. Please try again.": "No se pudo cambiar el estado. Inténtalo de nuevo.", + "Completed today": "Completadas hoy", + "My open tasks": "Mis tareas abiertas", + "My overdue tasks": "Mis tareas vencidas", + "My tasks in progress": "Mis tareas en curso", + "Pin to the top": "Fijar arriba", + "Unpin": "Desfijar", + "Pinned": "Fijado", + "Actions for {title}": "Acciones para {title}", + "Could not save your project order. Please try again.": "No se pudo guardar el orden de tus proyectos. Inténtalo de nuevo.", + "No boards yet": "Aún no hay tableros", + "Create a project to get a board.": "Crea un proyecto para tener un tablero.", + "Use the Projects page to create and manage your projects and tasks.": "Usa la página Proyectos para crear y gestionar tus proyectos y tareas.", + "Go to projects": "Ir a proyectos", + "You are not a member of any projects yet.": "Aún no eres miembro de ningún proyecto.", + "Could not search for users. Please try again.": "No se pudieron buscar usuarios. Inténtalo de nuevo.", + "Project creation is restricted to administrators.": "Solo los administradores pueden crear proyectos.", + "Only the project owner or an administrator can delete this project.": "Solo el propietario del proyecto o un administrador puede eliminar este proyecto.", + "No projects are available to you yet. Ask an administrator to create one.": "Aún no tienes proyectos disponibles. Pide a un administrador que cree uno.", + "Due: {date}": "Vence: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Las tareas con fecha de inicio o de vencimiento aparecen en la línea de tiempo. Añade fechas para verlas aquí.", + "You do not have access to this project.": "No tienes acceso a este proyecto.", + "Zoom level": "Nivel de zoom", + "Unscheduled": "Sin planificar", + "Start: {date}": "Inicio: {date}", + "Today": "Hoy", + "No scheduled tasks": "No hay tareas planificadas", + "An unexpected error occurred.": "Se produjo un error inesperado.", + "Column {number} name": "Nombre de la columna {number}", + "Failed to save creation policy": "No se pudo guardar la política de creación", + "All authenticated users": "Todos los usuarios autenticados", + "Control who may create new projects": "Controla quién puede crear proyectos nuevos", + "Administrators only": "Solo administradores", + "Project creation": "Creación de proyectos", + "Allow project creation": "Permitir la creación de proyectos", + "Creation policy saved successfully": "Política de creación guardada", + "Initializing…": "Iniciando…", + "e.g. 2h 30m, 90m, 1.5h": "p. ej. 2h 30m, 90m, 1.5h", + "Log time": "Registrar tiempo", + "Save estimate": "Guardar estimación", + "Logged: {logged}": "Registrado: {logged}", + "over by {amount}": "excedido en {amount}", + "Time tracking": "Registro de tiempo", + "Estimate": "Estimación", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Introduce una estimación válida (p. ej. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Introduce una duración válida (p. ej. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "No se pudo guardar el registro de tiempo. Inténtalo de nuevo.", + "Edit time entry": "Editar registro de tiempo", + "Duration": "Duración", + "Date range": "Periodo", + "Last week": "Semana pasada", + "No time logged": "No hay tiempo registrado", + "Log time on a task to see it here.": "Registra tiempo en una tarea para verlo aquí.", + "To date": "Hasta la fecha", + "This week": "Esta semana", + "Total: {total}": "Total: {total}", + "From date": "Desde la fecha", + "Custom range": "Periodo personalizado", + "All time": "Todo", + "Could not delete a task, so some data may remain. Try deleting the project again.": "No se pudo eliminar una tarea, así que pueden quedar datos. Vuelve a eliminar el proyecto.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "No se pudo eliminar un registro de tiempo, así que pueden quedar datos. Vuelve a eliminar el proyecto.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "No se pudo eliminar una columna, así que pueden quedar datos. Vuelve a eliminar el proyecto.", + "Could not delete the project. Please try again.": "No se pudo eliminar el proyecto. Inténtalo de nuevo.", + "Notification settings": "Ajustes de notificaciones", + "Configure when due-date reminders are sent": "Configura cuándo se envían los recordatorios de vencimiento", + "Due-date reminder lead time (hours)": "Antelación del recordatorio (horas)", + "Lead time must be between 1 and 336 hours": "La antelación debe estar entre 1 y 336 horas", + "Reminder lead time saved successfully": "Antelación del recordatorio guardada", + "Failed to save reminder lead time": "No se pudo guardar la antelación del recordatorio", + "Notifications": "Notificaciones", + "Notify me 1 day before a task's due date": "Avisarme 1 día antes del vencimiento de una tarea", + "Draft": "Borrador", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Si la clase es un borrador que solo ve su docente, se imparte o se cancela.", + "New release": "Nueva versión", + "Roadmap chart. The same releases and epics are listed below.": "Gráfico de la hoja de ruta. Las mismas versiones y épicas aparecen en la lista de abajo.", + "Nothing on the roadmap yet": "Aún no hay nada en la hoja de ruta", + "Releases with a target date and epics with dated tasks appear here.": "Aquí aparecen las versiones con fecha objetivo y las épicas con tareas fechadas.", + "Releases": "Versiones", + "No releases yet": "Aún no hay versiones", + "Target date: {date}": "Fecha objetivo: {date}", + "No target date": "Sin fecha objetivo", + "Edit {name}": "Editar {name}", + "Mark {name} as released": "Marcar {name} como publicada", + "Mark as released": "Marcar como publicada", + "Epics": "Épicas", + "No epics yet. Open a task to make it an epic.": "Aún no hay épicas. Abra una tarea para convertirla en épica.", + "Not scheduled yet": "Aún sin programar", + "Planned": "Planificada", + "Released": "Publicada", + "Edit release": "Editar versión", + "Target date": "Fecha objetivo", + "Could not save the release. Please try again.": "No se pudo guardar la versión. Inténtelo de nuevo.", + "Every task of this release is done or cancelled.": "Todas las tareas de esta versión están hechas o canceladas.", + "Not finished yet: {count}": "Aún sin terminar: {count}", + "What happens to these tasks?": "¿Qué pasa con estas tareas?", + "Move to {name}": "Mover a {name}", + "Remove the release": "Quitar la versión", + "Keep it on {name}": "Dejarlas en {name}", + "Could not mark the release as released. Please try again.": "No se pudo marcar la versión como publicada. Inténtelo de nuevo.", + "Roadmap": "Hoja de ruta", + "Tasks or roadmap": "Tareas u hoja de ruta", + "Release": "Versión", + "Epic": "Épica", + "This task is an epic": "Esta tarea es una épica", + "A named, dated delivery of a project that its tasks are planned against.": "Una entrega con nombre y fecha de un proyecto, contra la que se planifican sus tareas.", + "Name of the release": "Nombre de la versión", + "The project this release belongs to": "El proyecto al que pertenece esta versión", + "What this release delivers": "Lo que entrega esta versión", + "When work on the release starts": "Cuándo empieza el trabajo en la versión", + "The date the release is due": "La fecha en que vence la versión", + "Whether the release is planned, released or archived": "Si la versión está planificada, publicada o archivada", + "Released on": "Publicada el", + "When the release was marked as released": "Cuándo se marcó la versión como publicada", + "The release this task is planned for": "La versión para la que está planificada esta tarea", + "Board view options": "Opciones de vista del tablero", + "Colour cards": "Colorear tarjetas", + "No colour": "Sin color", + "By label": "Por etiqueta", + "Swimlanes": "Carriles", + "No swimlanes": "Sin carriles", + "By assignee": "Por persona asignada", + "By epic": "Por épica", + "No assignee": "Sin asignar", + "No epic": "Sin épica", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Las tarjetas se quedan en la fila de su épica. Cambie la épica en la página de la tarea.", + "Hand over to": "Traspasar a", + "Could not save your board view. It applies until you reload.": "No se pudo guardar su vista del tablero. Se aplica hasta que recargue.", + "Timetable wish": "Deseo de horario", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Un deseo que el generador tiene en cuenta. Siempre respeta un deseo estricto, y uno flexible cuando puede.", + "Whether the wish is about a teacher, a group, a room or one activity": "Si el deseo trata de un docente, un grupo, un aula o una actividad", + "Teacher": "Docente", + "Group": "Grupo", + "Reference": "Referencia", + "The user, group, room or activity the wish is about": "El usuario, grupo, aula o actividad al que se refiere el deseo", + "What the wish asks for": "Lo que pide el deseo", + "Not on these periods": "No en estas franjas", + "Preferably not on these periods": "Preferiblemente no en estas franjas", + "At most a number of lessons a day": "Como máximo un número de clases al día", + "No free periods between lessons": "Sin horas libres entre clases", + "Always the same room": "Siempre la misma aula", + "Periods": "Franjas", + "The periods of the week the wish is about, such as wed-5": "Las franjas de la semana a las que se refiere, como wed-5", + "Limit": "Límite", + "The most lessons a day, for a wish of that kind": "El máximo de clases al día, para un deseo de ese tipo", + "Strength": "Fuerza", + "Whether the generator must keep the wish or should keep it": "Si el generador debe o debería respetar el deseo", + "Hard": "Estricto", + "Soft": "Flexible", + "Weight": "Peso", + "How much a soft wish counts, from 1 to 3": "Cuánto cuenta un deseo flexible, de 1 a 3", + "Why the wish exists": "Por qué existe el deseo", + "Timetable scenario": "Escenario de horario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Un patrón semanal, hecho por el generador o tomado del horario actual. Guarda sus datos de entrada y cuánto respeta los deseos.", + "The name timetablers know the scenario by": "El nombre con el que los planificadores conocen el escenario", + "Whether the generator made it or it came from the current timetable": "Si lo hizo el generador o viene del horario actual", + "Generated": "Generado", + "From the current timetable": "Del horario actual", + "Week of": "Semana del", + "The Monday of the first week of the window": "El lunes de la primera semana del periodo", + "Window start": "Inicio del periodo", + "The first day the week pattern applies to": "El primer día al que se aplica el patrón semanal", + "Window end": "Fin del periodo", + "The last day the week pattern applies to": "El último día al que se aplica el patrón semanal", + "Waiting, generating, done, failed, or published as draft lessons": "En espera, generando, listo, fallido o publicado como clases borrador", + "Waiting": "En espera", + "Generating": "Generando", + "Failed": "Fallido", + "Published": "Publicado", + "Seed": "Semilla", + "The number the generator starts from, so a run can be repeated": "El número con el que empieza el generador, para poder repetir una ejecución", + "Input": "Entrada", + "The periods, rooms, lessons and wishes the scenario was made from": "Las franjas, aulas, clases y deseos de los que salió el escenario", + "Placements": "Ubicaciones", + "Each lesson with the period and room it was given": "Cada clase con la franja y el aula que recibió", + "Unplaced lessons": "Clases sin ubicar", + "Lessons without a place, each with the hard wish that blocked it": "Clases sin sitio, cada una con el deseo estricto que la bloqueó", + "Broken wishes": "Deseos incumplidos", + "The wishes this scenario breaks, with the lessons that break them": "Los deseos que este escenario incumple, con las clases que los incumplen", + "Measures": "Medidas", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Clases ubicadas, deseos incumplidos, huecos docentes, clases al día y uso de aulas", + "Reason": "Motivo", + "Why the run failed": "Por qué falló la ejecución", + "Published at": "Publicado el", + "When the scenario was written out as draft lessons": "Cuándo se escribió el escenario como clases borrador", + "Edit wish": "Editar deseo", + "New wish": "Nuevo deseo", + "Hard: the generator always keeps it": "Estricto: el generador siempre lo respeta", + "Soft: the generator keeps it where it can": "Flexible: el generador lo respeta cuando puede", + "Weight (1 to 3)": "Peso (1 a 3)", + "Most lessons a day": "Máximo de clases al día", + "Period": "Franja", + "{day} period {number}": "{day} franja {number}", + "Teacher (user name)": "Docente (nombre de usuario)", + "Activity (group:subject)": "Actividad (grupo:asignatura)", + "Say who or what the wish is about.": "Indique a quién o a qué se refiere el deseo.", + "Choose at least one period.": "Elija al menos una franja.", + "The limit is a whole number of 1 or more.": "El límite es un número entero de 1 o más.", + "Timetable": "Horario", + "Wishes": "Deseos", + "Timetable wishes": "Deseos de horario", + "Generator run": "Ejecución del generador", + "Generator progress": "Progreso del generador", + "The run failed: {reason}": "La ejecución falló: {reason}", + "{placed} of {lessons} lessons placed": "{placed} de {lessons} clases colocadas", + "Generate again": "Generar de nuevo", + "Generate": "Generar", + "Every lesson has a place.": "Cada clase tiene un lugar.", + "Lesson": "Clase", + "No free period and room": "Sin franja ni aula libre", + "Broken soft wishes": "Deseos flexibles incumplidos", + "Every soft wish is kept.": "Se respeta cada deseo flexible.", + "Wish": "Deseo", + "Lessons": "Clases", + "Generating: {percent}% of the time budget used": "Generando: {percent} % del tiempo usado", + "Waiting to start": "Esperando para empezar", + "Published as draft lessons": "Publicado como clases en borrador", + "Could not read the scenario.": "No se pudo leer el escenario.", + "Could not start the run.": "No se pudo iniciar la ejecución.", + "Scenarios": "Escenarios", + "Timetable scenarios": "Escenarios de horario", + "Scenario": "Escenario", + "Take the current timetable": "Tomar el horario actual", + "Could not take the current timetable.": "No se pudo tomar el horario actual.", + "Broken hard wishes": "Deseos obligatorios incumplidos", + "Not on a period of the week grid": "No está en una franja de la cuadrícula semanal", + "Compare scenarios": "Comparar escenarios", + "Scenarios to compare": "Escenarios que comparar", + "Choose two or three scenarios to compare them.": "Elija dos o tres escenarios para compararlos.", + "Measure": "Medida", + "Best": "Mejor", + "Lessons that differ": "Clases que difieren", + "No lesson differs.": "Ninguna clase difiere.", + "Not placed": "Sin colocar", + "{period} in {room}": "{period} en {room}", + "Lessons placed": "Clases colocadas", + "Lessons without a place": "Clases sin lugar", + "Clashes": "Choques", + "Hard wishes broken": "Deseos estrictos incumplidos", + "Soft wishes broken": "Deseos flexibles incumplidos", + "Soft wishes broken, weighted": "Deseos flexibles incumplidos, ponderados", + "Free periods between lessons, all teachers": "Horas libres entre clases, todos los docentes", + "Most free periods of one teacher": "Más horas libres de un docente", + "Most lessons of one group on a day": "Más clases de un grupo en un día", + "Room use": "Uso de aulas", + "Publish as draft lessons": "Publicar como clases en borrador", + "Draft lessons written: {count}": "Clases en borrador escritas: {count}", + "Could not publish the scenario.": "No se pudo publicar el escenario.", + "Rules": "Reglas", + "Rules for {column}": "Reglas de {column}", + "When a card enters this column": "Cuando una tarjeta entra en esta columna", + "Action": "Acción", + "Set the priority": "Fijar la prioridad", + "Assign to": "Asignar a", + "Assign the person who moved the card": "Asignar a la persona que movió la tarjeta", + "Remove the assignee": "Quitar la persona asignada", + "Add a label": "Añadir una etiqueta", + "No longer a project member": "Ya no es miembro del proyecto", + "This label no longer exists": "Esta etiqueta ya no existe", + "Add rule": "Añadir regla", + "Remove rule": "Quitar regla", + "No rules yet. Add one to change a card when it enters this column.": "Aún no hay reglas. Añada una para cambiar una tarjeta cuando entre en esta columna.", + "Could not save the rules. Please try again.": "No se pudieron guardar las reglas. Inténtelo de nuevo.", + "1 rule runs when a card enters this column": "1 regla se aplica cuando una tarjeta entra en esta columna", + "{count} rules run when a card enters this column": "{count} reglas se aplican cuando una tarjeta entra en esta columna", + "Rules applied: {changes}": "Reglas aplicadas: {changes}", + "assigned to {name}": "asignada a {name}", + "assignee removed": "persona asignada quitada", + "priority {priority}": "prioridad {priority}", + "label {label}": "etiqueta {label}", + "What happens to a card when it enters this column, applied in list order.": "Lo que le ocurre a una tarjeta cuando entra en esta columna, en el orden de la lista.", + "Value": "Valor", + "What the rule does to the card.": "Lo que la regla hace con la tarjeta.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "La prioridad, el id de usuario o el id de etiqueta que usa la acción; vacío para acciones sin valor.", + "is not": "no es", + "{dimension} is not": "{dimension} no es", + "Saved filters": "Filtros guardados", + "No saved filters yet": "Aún no hay filtros guardados", + "Save filter": "Guardar filtro", + "Rename \"{name}\"": "Cambiar el nombre de «{name}»", + "Delete \"{name}\"": "Eliminar «{name}»", + "Clear filters": "Borrar filtros", + "Showing {shown} of {total} tasks": "Se muestran {shown} de {total} tareas", + "Me": "Yo", + "No date": "Sin fecha", + "Rename saved filter": "Cambiar el nombre del filtro guardado", + "Share with the project": "Compartir con el proyecto", + "Give the filter a name": "Ponga un nombre al filtro", + "Could not save the filter. Please try again.": "No se pudo guardar el filtro. Inténtelo de nuevo.", + "Some labels in \"{name}\" no longer exist and were left out.": "Algunas etiquetas de «{name}» ya no existen y se han omitido.", + "Could not delete the filter. Please try again.": "No se pudo eliminar el filtro. Inténtelo de nuevo.", + "Saved filter": "Filtro guardado", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Un filtro de tablero con nombre de un proyecto, privado para quien lo guardó salvo que se comparta con el proyecto.", + "The project whose board the filter applies to": "El proyecto a cuyo tablero se aplica el filtro", + "The name the filter is listed under": "El nombre con el que aparece el filtro en la lista", + "Saved by": "Guardado por", + "Nextcloud user id of the person who saved the filter": "Id de usuario de Nextcloud de quien guardó el filtro", + "Shared with the project": "Compartido con el proyecto", + "Whether every project member sees and applies the filter": "Si cada miembro del proyecto ve y puede aplicar el filtro", + "Criteria": "Criterios", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "El filtro: persona asignada, etiqueta, prioridad y vencimiento, cada uno con es o no es y sus valores", + "Cross-project view": "Vista entre proyectos", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Una selección guardada de proyectos cuyas tareas se muestran juntas en carriles de estado, compartida con las personas que nombra.", + "Shared with": "Compartida con", + "The name the view is listed under": "El nombre con el que aparece la vista", + "Nextcloud user id of the person who saved the view": "Id de usuario de Nextcloud de la persona que guardó la vista", + "Nextcloud user ids of the people the view is shared with": "Ids de usuario de Nextcloud de las personas con las que se comparte la vista", + "The projects whose tasks the view shows, at most twenty": "Los proyectos cuyas tareas muestra la vista, como máximo veinte", + "1 project in this view is hidden from you.": "1 proyecto de esta vista está oculto para ti.", + "{count} projects in this view are hidden from you.": "{count} proyectos de esta vista están ocultos para ti.", + "{project} has no column for {status}.": "{project} no tiene columna para {status}.", + "This view does not exist or is not shared with you.": "Esta vista no existe o no se ha compartido contigo.", + "\"{task}\" moved to {status}.": "\"{task}\" movida a {status}.", + "Project: {title}": "Proyecto: {title}", + "Cross-project views": "Vistas entre proyectos", + "New view": "Nueva vista", + "Edit view": "Editar vista", + "Delete view": "Eliminar vista", + "Give the view a name": "Pon un nombre a la vista", + "Pick at least one project": "Elige al menos un proyecto", + "A view shows at most {max} projects": "Una vista muestra como máximo {max} proyectos", + "Could not save the view. Please try again.": "No se pudo guardar la vista. Inténtalo de nuevo.", + "Could not delete the view. Please try again.": "No se pudo eliminar la vista. Inténtalo de nuevo.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "¿Eliminar \"{title}\"? Los proyectos y sus tareas quedan como están.", + "People see the tasks of the projects they are in, never more.": "Cada persona ve las tareas de los proyectos en los que está, nunca más.", + "No views yet. A view shows the tasks of several of your projects together.": "Aún no hay vistas. Una vista muestra juntas las tareas de varios de tus proyectos.", + "Projects in view: {count}": "Proyectos en la vista: {count}", + "Notify me when a task is assigned to me": "Avisarme cuando se me asigne una tarea", + "Also send these to me by email": "Enviarme también estos avisos por correo", + "Add an email address in your Nextcloud personal settings to get mail.": "Añade una dirección de correo en tus ajustes personales de Nextcloud para recibir correo.", + "Code link": "Enlace de código", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Un commit, rama, solicitud de fusión o incidencia en una forja de código que trabaja en una tarea.", + "The task the link belongs to": "La tarea a la que pertenece el enlace", + "The project of the task": "El proyecto de la tarea", + "Task key": "Clave de tarea", + "The task key the forge text named, such as VC-12": "La clave de tarea que nombró el texto de la forja, como VC-12", + "What the link points at": "A qué apunta el enlace", + "Link": "Enlace", + "The address of the item in the forge": "La dirección del elemento en la forja", + "The commit message, branch name or merge request title": "El mensaje del commit, el nombre de la rama o el título de la solicitud de fusión", + "Repository": "Repositorio", + "The repository, such as acme/portal": "El repositorio, como acme/portal", + "Forge id": "Id en la forja", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "El id propio del elemento en la forja, como github:acme/portal#42 o un hash de commit", + "State": "Estado", + "The state of a merge request or issue": "El estado de una solicitud de fusión o incidencia", + "Who made the commit or opened the merge request": "Quién hizo el commit o abrió la solicitud de fusión", + "When the commit was made or the merge request last changed": "Cuándo se hizo el commit o cambió por última vez la solicitud de fusión", + "Added by": "Añadido por", + "Whether a person added the link or the integration wrote it": "Si una persona añadió el enlace o lo escribió la integración", + "Nextcloud user UIDs of project members": "UID de usuario de Nextcloud de los miembros del proyecto", + "Add link": "Añadir enlace", + "Added by hand": "Añadido a mano", + "Branch": "Rama", + "Code": "Código", + "Commit": "Commit", + "From the integration": "Desde la integración", + "Link to a commit, branch or merge request": "Enlace a un commit, rama o solicitud de fusión", + "Merge request": "Solicitud de fusión", + "Merged": "Fusionada", + "No code linked yet. Name {key} in a commit message or paste a link.": "Aún no hay código enlazado. Nombra {key} en un mensaje de commit o pega un enlace.", + "No code linked yet. Paste a link to a commit or merge request.": "Aún no hay código enlazado. Pega un enlace a un commit o solicitud de fusión.", + "Paste a web address that starts with https://.": "Pega una dirección web que empiece por https://.", + "Remove link {title}": "Quitar el enlace {title}", + "The link could not be added.": "No se pudo añadir el enlace.", + "The link could not be removed.": "No se pudo quitar el enlace.", + "This link is already on the task.": "Este enlace ya está en la tarea.", + "Code forges": "Forjas de código", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Enlaza commits y pull requests de GitHub con tareas. Integriq recibe los eventos; planninq nunca llama a GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Descarga la configuración e impórtala en Integriq. Después escribe un secreto en la regla \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "En GitHub, añade al repositorio un webhook con esta dirección y el mismo secreto. Elige el tipo de contenido application/json y los eventos push y pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nombra la clave de la tarea, como VC-12, en un mensaje de commit, un nombre de rama o el título de una pull request. El enlace aparece entonces en esa tarea.", + "Without Integriq, project members can still paste a link on the task page.": "Sin Integriq, los miembros del proyecto pueden seguir pegando un enlace en la página de la tarea.", + "Download the Integriq configuration": "Descargar la configuración de Integriq", + "Calendar": "Calendario", + "Previous": "Anterior", + "Calendar view": "Vista del calendario", + "Starts:": "Empieza:", + "No tasks with a date in this month.": "No hay tareas con fecha este mes.", + "Week of {start} to {end}": "Semana del {start} al {end}", + "My calendar": "Mi calendario", + "Show as list": "Mostrar como lista", + "Show as calendar": "Mostrar como calendario", + "Open my calendar": "Abrir mi calendario", + "Nextcloud Tasks": "Tareas de Nextcloud", + "Show my tasks in Nextcloud Tasks": "Mostrar mis tareas en Tareas de Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Las tareas asignadas a ti o compartidas contigo aparecen en una lista \"Planninq\" en Tareas y Calendario de Nextcloud. Los cambios hechos allí se sustituyen con el siguiente cambio en Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Este servidor no puede escribir en Tareas de Nextcloud, así que la exportación no está disponible.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Gestionado por Planninq. Los cambios hechos aquí se sustituyen con el siguiente cambio en Planninq.", + "Working days and holidays": "Días laborables y festivos", + "Dates set on the timeline skip the days that are not working days.": "Las fechas fijadas en la cronología saltan los días que no son laborables.", + "Working weekdays": "Días laborables de la semana", + "Non-working days": "Días no laborables", + "No non-working days yet.": "Aún no hay días no laborables.", + "Add day": "Añadir día", + "Year": "Año", + "Add Dutch national holidays": "Añadir festivos nacionales neerlandeses", + "Save working days": "Guardar días laborables", + "Choose at least one working weekday.": "Elige al menos un día laborable.", + "Working days saved.": "Días laborables guardados.", + "Could not save the working days.": "No se pudieron guardar los días laborables.", + "New Year's Day": "Año Nuevo", + "Easter Sunday": "Domingo de Pascua", + "Easter Monday": "Lunes de Pascua", + "King's Day": "Día del Rey", + "Liberation Day": "Día de la Liberación", + "Ascension Day": "Ascensión", + "Whit Sunday": "Domingo de Pentecostés", + "Whit Monday": "Lunes de Pentecostés", + "Christmas Day": "Navidad", + "Boxing Day": "San Esteban", + "Dates of {title}": "Fechas de {title}", + "The due date cannot be before the start date.": "La fecha de vencimiento no puede ser anterior a la de inicio.", + "{title}, from {start} to {end}": "{title}, del {start} al {end}", + "The dates could not be saved.": "No se pudieron guardar las fechas.", + "{title} now runs from {start} to {end}": "{title} ahora va del {start} al {end}", + "Auto-scheduling": "Planificación automática", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Si está activada, retrasar una fecha de vencimiento en la cronología ofrece mover también las tareas que bloquea.", + "Move blocked tasks along when a task slips": "Mover las tareas bloqueadas cuando una tarea se retrasa", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "En la cronología, una fecha de vencimiento posterior ofrece mover las tareas que bloquea. Solo cuentan los enlaces \"bloquea\", y las tareas solo se retrasan.", + "Move the tasks that wait for {title}?": "¿Mover las tareas que esperan a {title}?", + "These tasks wait for it and would start after its new due date:": "Estas tareas la esperan y empezarían después de su nueva fecha de vencimiento:", + "{count} tasks would move; the first {limit} are listed.": "Se moverían {count} tareas; se muestran las primeras {limit}.", + "Now": "Ahora", + "After the move": "Después del cambio", + "Only this task": "Solo esta tarea", + "Move all": "Mover todas", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Detenido en {title}: no se pudieron guardar sus fechas. Las tareas anteriores se movieron.", + "Cumulative flow": "Flujo acumulado", + "Show as chart": "Mostrar como gráfico", + "Show as table": "Mostrar como tabla", + "Tasks per column per day": "Tareas por columna y día", + "Tasks without recorded history in this period: {count}": "Tareas sin historial registrado en este periodo: {count}", + "Lead and cycle time": "Plazo de entrega y tiempo de ciclo", + "No tasks were finished in this period.": "No se terminó ninguna tarea en este periodo.", + "Finished tasks": "Tareas terminadas", + "Cycle time, average": "Tiempo de ciclo, media", + "Cycle time, 85th percentile": "Tiempo de ciclo, percentil 85", + "Lead time, average": "Plazo de entrega, media", + "Tasks whose finish time was estimated from their history: {count}": "Tareas cuya hora de fin se estimó a partir del historial: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Tiempo de ciclo de cada tarea terminada, con la media y el percentil 85", + "Slowest tasks": "Tareas más lentas", + "cycle {cycle}, lead {lead}": "ciclo {cycle}, plazo {lead}", + "{days} days": "{days} días", + "Could not load the flow of this project.": "No se pudo cargar el flujo de este proyecto.", + "Last {days} days": "Últimos {days} días", + "Portfolio flow": "Flujo de la cartera", + "An admin adds portfolios under Projects, Portfolios.": "Un administrador añade carteras en Proyectos, Carteras.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Proyectos no mostrados, porque se muestran como máximo 50 a la vez: {count}", + "Could not load the flow of this portfolio.": "No se pudo cargar el flujo de esta cartera.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flujo acumulado y tiempo de ciclo de los proyectos de una cartera.", + "Edit report": "Editar informe", + "Only tasks where": "Solo tareas en las que", + "Group by": "Agrupar por", + "Display": "Visualización", + "Share with everyone who can read its projects": "Compartir con todos los que pueden leer sus proyectos", + "The report could not be saved.": "No se pudo guardar el informe.", + "Number of tasks": "Número de tareas", + "Bar": "Barras", + "Donut": "Anillo", + "Table": "Tabla", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} de {total} proyectos de este informe no son visibles para ti", + "No tasks match this report.": "Ninguna tarea coincide con este informe.", + "None": "Ninguno", + "Could not load this report.": "No se pudo cargar este informe.", + "Report": "Informe", + "Your reports": "Tus informes", + "My reports": "Mis informes", + "Shared reports": "Informes compartidos", + "You have not built a report yet.": "Aún no has creado ningún informe.", + "Nobody has shared a report with you yet.": "Nadie ha compartido todavía un informe contigo.", + "Reports you built over tasks, and the ones shared with you.": "Informes que creaste sobre tareas, y los compartidos contigo.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Una consulta guardada sobre tareas: qué proyectos, qué filtros, agrupada por qué, contada o sumada, y mostrada como tabla o gráfico.", + "The name the report is listed under": "El nombre con el que aparece el informe", + "What the report shows and who it is for": "Qué muestra el informe y para quién es", + "Nextcloud user id of the person who saved the report": "Id de usuario de Nextcloud de quien guardó el informe", + "Who can open the report": "Quién puede abrir el informe", + "Only me": "Solo yo", + "Everyone who can read its projects": "Todos los que pueden leer sus proyectos", + "The projects the report covers, at most fifty": "Los proyectos que abarca el informe, como máximo cincuenta", + "Filters": "Filtros", + "Task fields and the value each must equal": "Campos de tarea y el valor al que cada uno debe ser igual", + "The task field the report groups on": "El campo de tarea por el que agrupa el informe", + "Count the tasks, or add up a number on them": "Contar las tareas, o sumar un número de ellas", + "Sum": "Suma", + "Sum of": "Suma de", + "The number added up when the measure is a sum": "El número que se suma cuando la medida es una suma", + "Story points": "Puntos de historia", + "Estimated duration": "Duración estimada", + "How the report is shown": "Cómo se muestra el informe", + "Issue type": "Tipo de incidencia", + "Task fields and the value each must equal; empty when the report covers every task": "Campos de tarea y el valor que cada uno debe tener; vacío si el informe abarca todas las tareas", + "The status a task must have": "El estado que debe tener una tarea", + "The priority a task must have": "La prioridad que debe tener una tarea", + "The user a task must be assigned to": "El usuario al que debe estar asignada una tarea", + "A label a task must carry": "Una etiqueta que debe llevar una tarea", + "The board column a task must be in": "La columna del tablero en la que debe estar una tarea", + "The issue type a task must have": "El tipo de incidencia que debe tener una tarea", + "Manager groups": "Grupos gestores", + "Member groups": "Grupos miembros", + "Viewer groups": "Grupos lectores", + "Viewers": "Lectores", + "Owning group": "Grupo propietario", + "Nextcloud groups whose members manage the project": "Grupos de Nextcloud cuyos miembros gestionan el proyecto", + "Nextcloud groups whose members work on the project": "Grupos de Nextcloud cuyos miembros trabajan en el proyecto", + "Nextcloud groups whose members may read the project": "Grupos de Nextcloud cuyos miembros pueden leer el proyecto", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Usuarios de Nextcloud que gestionan el proyecto: ajustes, miembros y trabajo", + "Nextcloud user ids who may read the project and its work but not change it": "Usuarios de Nextcloud que pueden leer el proyecto y su trabajo sin cambiarlo", + "The Nextcloud group that owns the project with its creator, at most one": "El grupo de Nextcloud que posee el proyecto con su creador, como máximo uno", + "Nextcloud user ids who may read this through the project": "Usuarios de Nextcloud que pueden leer esto a través del proyecto", + "Nextcloud groups whose members may change this through the project": "Grupos de Nextcloud cuyos miembros pueden cambiar esto a través del proyecto", + "Nextcloud groups whose members may read this through the project": "Grupos de Nextcloud cuyos miembros pueden leer esto a través del proyecto", + "Search for a person or a group…": "Buscar una persona o un grupo…", + "No one found. Your admin's sharing settings decide who you can find.": "No se encontró a nadie. La configuración de uso compartido de tu administrador decide a quién puedes encontrar.", + "Type at least two characters": "Escribe al menos dos caracteres", + "Everyone in this group": "Todas las personas de este grupo", + "Could not search for people. Please try again.": "No se pudo buscar personas. Inténtalo de nuevo.", + "Could not remove the group": "No se pudo quitar el grupo", + "Only the owner and managers change who is on this project.": "Solo la persona propietaria y quienes gestionan cambian quién está en este proyecto.", + "Role of {name}": "Rol de {name}", + "Manager": "Gestor", + "Member": "Miembro", + "Viewer": "Lector", + "Could not change the role": "No se pudo cambiar el rol", + "Owned by group: {name}": "Propiedad del grupo: {name}", + "No group owns this project.": "Ningún grupo es propietario de este proyecto.", + "Owned by group": "Propiedad del grupo", + "Search for a group…": "Buscar un grupo…", + "No group found. Your admin's sharing settings decide which groups you can find.": "No se encontró ningún grupo. La configuración de uso compartido de tu administrador decide qué grupos puedes encontrar.", + "No owning group": "Sin grupo propietario", + "Could not search for groups. Please try again.": "No se pudieron buscar grupos. Inténtalo de nuevo.", + "Could not change the owning group": "No se pudo cambiar el grupo propietario", + "You can read this project. Only its members change it.": "Puedes leer este proyecto. Solo sus miembros lo cambian.", + "Course": "Curso", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "El curso que se imparte en esta clase, como una optativa, cuando la aplicación de aprendizaje del centro lo conoce.", + "Online meeting link": "Enlace de la clase en línea", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Dónde se unen los alumnos a esta clase en línea. El botón Unirse solo aparece con un enlace https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/es.json b/l10n/es.json index 0bd62788..912205cc 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -199,7 +199,1167 @@ "Could not delete label": "No se pudo eliminar la etiqueta", "Delete label \"{title}\"? It will be removed from {count} task.": "¿Eliminar la etiqueta \"{title}\"? Se quitará de {count} tarea.", "Label deleted and removed from {count} task": "Etiqueta eliminada y quitada de {count} tarea", - "used by {count} task": "usada por {count} tarea" + "used by {count} task": "usada por {count} tarea", + "Active projects": "Proyectos activos", + "Archived projects": "Proyectos archivados", + "Boards": "Tableros", + "My projects": "Mis proyectos", + "Portfolio": "Cartera", + "Project board": "Tablero del proyecto", + "Projects I am in": "Proyectos en los que participo", + "Timeline": "Cronología", + "Timesheet": "Hoja de horas", + "Features & roadmap": "Funciones y hoja de ruta", + "Flow": "Flujo", + "Flows": "Flujos", + "Reports": "Informes", + "Pick a report to open it.": "Elija un informe para abrirlo.", + "In progress": "En curso", + "Date": "Fecha", + "Due": "Vence", + "Assignee": "Asignado a", + "Who": "Quién", + "What": "Qué", + "Minutes": "Minutos", + "Entries": "Entradas", + "Most recent": "Más recientes", + "Per person": "Por persona", + "By status": "Por estado", + "By priority": "Por prioridad", + "Task status": "Estado de las tareas", + "Time spent": "Tiempo dedicado", + "Capacity": "Capacidad", + "Due soonest": "Vencen antes", + "Minutes logged": "Minutos registrados", + "Nothing is due": "No hay vencimientos", + "Nothing logged yet": "Aún no hay registros", + "What is open, what is blocked, and what is overdue.": "Qué está abierto, qué está bloqueado y qué está vencido.", + "How allocation is spread across the people working on projects.": "Cómo se reparte la asignación entre quienes trabajan en proyectos.", + "Hours logged, and the projects they went to.": "Las horas registradas y los proyectos a los que fueron.", + "Billable": "Facturable", + "Budget: {amount}": "Presupuesto: {amount}", + "Loading projects": "Cargando proyectos", + "No projects for this client yet": "Aún no hay proyectos para este cliente", + "Open in Planninq": "Abrir en Planninq", + "This project could not be found": "No se ha encontrado este proyecto", + "Untitled project": "Proyecto sin título", + "and {count} more": "y {count} más", + "Store": "Tienda", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instale registros, esquemas y flujos publicados por otras organizaciones.", + "Work Date": "Fecha de trabajo", + "Zaak UUID": "UUID de Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Acciones de la columna", + "Columns": "Columnas", + "Could not remove the column. Please try again.": "No se pudo eliminar la columna. Inténtelo de nuevo.", + "Could not save the column. Please try again.": "No se pudo guardar la columna. Inténtelo de nuevo.", + "Done column": "Columna de terminado", + "Edit column": "Editar columna", + "Keep the card's status": "Mantener el estado de la tarjeta", + "Move its cards to": "Mover sus tarjetas a", + "Move left": "Mover a la izquierda", + "Move right": "Mover a la derecha", + "Status of cards moved here": "Estado de las tarjetas movidas aquí", + "The last done column cannot be removed.": "La última columna de terminado no se puede eliminar.", + "WIP limit": "Límite WIP", + "over limit": "por encima del límite", + "The status a card gets when it is moved into this column.": "El estado que recibe una tarjeta cuando se mueve a esta columna.", + "All priorities": "Todas las prioridades", + "Could not create the task. Please try again.": "No se pudo crear la tarea. Inténtelo de nuevo.", + "Created": "Creada", + "Move to backlog": "Al backlog", + "Move to board": "Al tablero", + "New task": "Nueva tarea", + "Nothing in the backlog": "Nada en el backlog", + "Rank": "Rango", + "Sort by": "Ordenar por", + "Sort by rank to reorder": "Ordene por rango para reordenar", + "Task actions": "Acciones de la tarea", + "All labels": "Todas las etiquetas", + "Filter tasks by label": "Filtrar tareas por etiqueta", + "View timeline": "Ver cronología", + "Board": "Tablero", + "List": "Lista", + "Column": "Columna", + "Board or list": "Tablero o lista", + "Log": "Registro", + "Add entry": "Añadir entrada", + "Show": "Mostrar", + "No actions yet": "Aún no hay acciones", + "Closed": "Cerrado", + "Entry actions": "Acciones de la entrada", + "Add action": "Añadir acción", + "by {author}": "por {author}", + "saved {time}": "guardado {time}", + "Attendees: {names}": "Asistentes: {names}", + "Add the first entry": "Añadir la primera entrada", + "Issues": "Incidencias", + "Lessons learned": "Lecciones aprendidas", + "Meetings": "Reuniones", + "Decisions": "Decisiones", + "Actions": "Acciones", + "Issue": "Incidencia", + "Lesson learned": "Lección aprendida", + "Meeting": "Reunión", + "Decision": "Decisión", + "About this project": "Acerca de este proyecto", + "No description yet": "Aún no hay descripción", + "Start date": "Fecha de inicio", + "Not set": "Sin definir", + "End date": "Fecha de fin", + "Progress": "Progreso", + "No tasks yet": "Aún no hay tareas", + "Open the board": "Abrir el tablero", + "People": "Personas", + "Owner": "Propietario", + "Latest log entries": "Últimas entradas", + "Open the log": "Abrir el registro", + "{done} of {total} tasks done": "{done} de {total} tareas hechas", + "Edit entry": "Editar entrada", + "Type": "Tipo", + "Attendees": "Asistentes", + "Issue is closed": "La incidencia está cerrada", + "Could not save the entry. Please try again.": "No se pudo guardar la entrada. Inténtelo de nuevo.", + "From: {title}": "De: {title}", + "What needs to happen": "Qué hay que hacer", + "Could not create the action. Please try again.": "No se pudo crear la acción. Inténtelo de nuevo.", + "The action was created but could not be linked to the entry.": "La acción se creó, pero no se pudo vincular a la entrada.", + "Project pages": "Páginas del proyecto", + "Overview": "Resumen", + "Risks": "Riesgos", + "Log entry": "Entrada de registro", + "A short name for the entry": "Un nombre corto para la entrada", + "Project": "Proyecto", + "The project this entry belongs to": "El proyecto al que pertenece esta entrada", + "What kind of entry this is": "Qué tipo de entrada es", + "When it happened": "Cuándo ocurrió", + "What happened, in Markdown": "Qué ocurrió, en Markdown", + "Whether an issue is still open": "Si una incidencia sigue abierta", + "The people at a meeting": "Las personas en una reunión", + "Tasks that came out of this entry": "Tareas surgidas de esta entrada", + "Add risk": "Añadir riesgo", + "Risk": "Riesgo", + "Score": "Puntuación", + "Response": "Respuesta", + "Review date": "Fecha de revisión", + "no longer on the project": "ya no está en el proyecto", + "Edit {title}": "Editar {title}", + "No risks recorded yet": "Aún no hay riesgos registrados", + "Add the first risk": "Añadir el primer riesgo", + "Medium": "Medio", + "Mitigating": "En mitigación", + "Occurred": "Ocurrido", + "Avoid": "Evitar", + "Reduce": "Reducir", + "Transfer": "Transferir", + "Accept": "Aceptar", + "Highest open risks": "Riesgos abiertos más altos", + "No open risks": "No hay riesgos abiertos", + "Open the risk register": "Abrir el registro de riesgos", + "Edit risk": "Editar riesgo", + "What could go wrong": "Qué podría salir mal", + "Likelihood": "Probabilidad", + "Impact": "Impacto", + "Score {score}": "Puntuación {score}", + "Countermeasures": "Contramedidas", + "Could not save the risk. Please try again.": "No se pudo guardar el riesgo. Inténtelo de nuevo.", + "Risks by likelihood and impact": "Riesgos por probabilidad e impacto", + "Risk scale": "Escala de riesgo", + "The levels every project scores its risks on, and where low turns into medium and high": "Los niveles en los que cada proyecto puntúa sus riesgos, y dónde bajo pasa a medio y alto", + "Number of levels": "Número de niveles", + "Likelihood labels": "Etiquetas de probabilidad", + "Impact labels": "Etiquetas de impacto", + "Level {level}": "Nivel {level}", + "Medium from score": "Medio a partir de la puntuación", + "High from score": "Alto a partir de la puntuación", + "Risk scale saved": "Escala de riesgo guardada", + "1 risk uses level {level}. Change it first.": "1 riesgo usa el nivel {level}. Cámbielo primero.", + "{count} risks use level {level}. Change them first.": "{count} riesgos usan el nivel {level}. Cámbielos primero.", + "Every level needs a label, and high must start above medium.": "Cada nivel necesita una etiqueta, y alto debe empezar por encima de medio.", + "The project this risk belongs to": "El proyecto al que pertenece este riesgo", + "The cause and the effect, in Markdown": "La causa y el efecto, en Markdown", + "Category": "Categoría", + "A free grouping, such as planning, budget or supplier": "Una agrupación libre, como planificación, presupuesto o proveedor", + "How likely it is, on the admin's risk scale": "Qué probabilidad tiene, en la escala de riesgo del administrador", + "How hard it would hit, on the admin's risk scale": "Cuánto afectaría, en la escala de riesgo del administrador", + "Likelihood times impact, calculated by the server": "Probabilidad por impacto, calculada por el servidor", + "Where the risk stands": "En qué punto está el riesgo", + "The person who watches this risk": "La persona que vigila este riesgo", + "How the project answers the risk": "Cómo responde el proyecto al riesgo", + "What is done to prevent it or soften it, in Markdown": "Qué se hace para evitarlo o suavizarlo, en Markdown", + "When to look at this risk again": "Cuándo revisar de nuevo este riesgo", + "Very low": "Muy bajo", + "Very high": "Muy alto", + "All projects": "Todos los proyectos", + "Project status report": "Informe de estado del proyecto", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Un informe fechado sobre cómo está un proyecto en dinero, organización, tiempo, información, calidad y riesgo (los aspectos GROTIK), cada uno con una nota.", + "The project this report is about": "El proyecto del que trata este informe", + "Report date": "Fecha del informe", + "The day the report describes": "El día que describe el informe", + "Money": "Dinero", + "How the project stands on this aspect": "Cómo está el proyecto en este aspecto", + "On track": "En curso", + "At risk": "En riesgo", + "Off track": "Desviado", + "Money note": "Nota sobre dinero", + "A short explanation of this status": "Una breve explicación de este estado", + "Organisation": "Organización", + "Organisation note": "Nota sobre organización", + "Time": "Tiempo", + "Time note": "Nota sobre tiempo", + "Information": "Información", + "Information note": "Nota sobre información", + "Quality": "Calidad", + "Quality note": "Nota sobre calidad", + "Risk note": "Nota sobre riesgo", + "Overall": "General", + "The worst of the six statuses, calculated by the server": "El peor de los seis estados, calculado por el servidor", + "Health: money": "Salud: dinero", + "Copied from the newest status report": "Copiado del informe de estado más reciente", + "Health: organisation": "Salud: organización", + "Health: time": "Salud: tiempo", + "Health: information": "Salud: información", + "Health: quality": "Salud: calidad", + "Health: risk": "Salud: riesgo", + "Health: overall": "Salud: general", + "Health: report date": "Salud: fecha del informe", + "The date of the newest status report": "La fecha del informe de estado más reciente", + "New report": "Nuevo informe", + "Only the project owner writes status reports.": "Solo el propietario del proyecto escribe informes de estado.", + "Latest report, {date}": "Último informe, {date}", + "Aspect": "Aspecto", + "Note": "Nota", + "Report history": "Historial de informes", + "Author": "Autor", + "No status reports yet": "Aún no hay informes de estado", + "Write the first report": "Escribir el primer informe", + "Choose a status for every aspect to save the report.": "Elija un estado para cada aspecto para guardar el informe.", + "Suggested: on track.": "Sugerencia: en curso.", + "Suggested: at risk.": "Sugerencia: en riesgo.", + "Suggested: off track.": "Sugerencia: desviado.", + "1 task is past its due date.": "1 tarea ha pasado su fecha límite.", + "{count} tasks are past their due date.": "{count} tareas han pasado su fecha límite.", + "The end date has passed with 1 open task.": "La fecha de fin ha pasado con 1 tarea abierta.", + "The end date has passed with {count} open tasks.": "La fecha de fin ha pasado con {count} tareas abiertas.", + "No open task is past its due date.": "Ninguna tarea abierta ha pasado su fecha límite.", + "The highest open risk, \"{title}\", scores {score}.": "El riesgo abierto más alto, \"{title}\", puntúa {score}.", + "There are no open risks.": "No hay riesgos abiertos.", + "Costs are at {percent}% of the budget.": "Los costes están en el {percent}% del presupuesto.", + "No suggestion: the project has no budget.": "Sin sugerencia: el proyecto no tiene presupuesto.", + "No suggestion: no costs are recorded for this project yet.": "Sin sugerencia: aún no hay costes registrados para este proyecto.", + "The report was not saved. Only the project owner can write status reports.": "El informe no se ha guardado. Solo el propietario del proyecto puede escribir informes de estado.", + "No report": "Sin informe", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Un grupo de proyectos dirigidos por las mismas personas, como un departamento o un programa. Sus responsables leen cada proyecto que contiene.", + "The name of the portfolio": "El nombre de la cartera", + "What the portfolio holds and who runs it": "Qué contiene la cartera y quién la dirige", + "A colour for the portfolio's section in project lists": "Un color para la sección de la cartera en las listas de proyectos", + "Managers": "Responsables", + "Nextcloud user UIDs of the people who run the portfolio": "ID de usuario de Nextcloud de las personas que dirigen la cartera", + "Order": "Orden", + "Where the portfolio comes in project lists, lowest first": "Dónde aparece la cartera en las listas de proyectos, primero el más bajo", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "La escala de riesgo propia de esta cartera en JSON, con la misma forma que la de toda la aplicación. Vacío significa la escala de la aplicación.", + "Portfolio readers": "Lectores de la cartera", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID de usuario de Nextcloud de los responsables de la cartera del proyecto", + "The portfolio this project belongs to": "La cartera a la que pertenece este proyecto", + "No portfolio": "Sin cartera", + "All portfolios": "Todas las carteras", + "You read this project as a manager of its portfolio. Only its members change it.": "Lee este proyecto como responsable de su cartera. Solo sus miembros lo cambian.", + "Portfolios": "Carteras", + "Portfolio status": "Estado de la cartera", + "No portfolios yet": "Aún no hay carteras", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Un administrador añade carteras en Proyectos, Carteras. Los proyectos de una cartera aparecen aquí con su estado.", + "Roll-up": "Resumen", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} en curso, {atRisk} en riesgo, {offTrack} desviados, {noReport} sin informe", + "No project in this portfolio that you can read.": "Ningún proyecto de esta cartera que puedas leer.", + "Start": "Inicio", + "End": "Fin", + "Budget": "Presupuesto", + "Last report": "Último informe", + "Out of date": "Desactualizado", + "Portfolio timeline": "Cronograma de la cartera", + "Zoom": "Zoom", + "Could not load the timeline": "No se pudo cargar el cronograma", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Un administrador añade carteras en Proyectos, Carteras. Los proyectos de una cartera aparecen aquí en un solo cronograma.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Abre un proyecto para ver sus fases y tareas. El cronograma es de solo lectura.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Omitidos porque no puedes leerlos: {count} proyectos", + "Week": "Semana", + "Day": "Día", + "Month": "Mes", + "Please try again later.": "Inténtalo de nuevo más tarde.", + "Status reports": "Informes de estado", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Después de cuántos días el último informe de estado de un proyecto se marca como desactualizado en la vista de la cartera", + "Reporting period (days)": "Periodo de informe (días)", + "The reporting period is a whole number of days from 1 to 365.": "El periodo de informe es un número entero de días de 1 a 365.", + "Reporting period saved": "Periodo de informe guardado", + "The reporting period was not saved. Please try again.": "El periodo de informe no se guardó. Inténtalo de nuevo.", + "Every project of a portfolio with its status per aspect, rolled up.": "Cada proyecto de una cartera con su estado por aspecto, resumido.", + "The projects of a portfolio on one timeline.": "Los proyectos de una cartera en un solo cronograma.", + "Phases": "Fases", + "Add phase": "Añadir fase", + "No phases yet": "Aún no hay fases", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Divide el proyecto en fases, como iniciación, definición y ejecución. Una fase se cierra cuando se sube su documento de cierre.", + "{hours} hours": "{hours} horas", + "Concluding document: {title}": "Documento de cierre: {title}", + "Concluding document missing": "Falta el documento de cierre", + "Move {title} up": "Subir {title}", + "Move {title} down": "Bajar {title}", + "Close phase": "Cerrar fase", + "Phase": "Fase", + "Files": "Archivos", + "Notes": "Notas", + "Audit trail": "Registro de auditoría", + "Edit phase": "Editar fase", + "Name": "Nombre", + "Budget hours": "Horas presupuestadas", + "Could not save the phase. Please try again.": "No se pudo guardar la fase. Inténtalo de nuevo.", + "Close phase {title}": "Cerrar la fase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Una fase se cierra con su documento de cierre: súbelo aquí o elige uno de los archivos de la fase.", + "Concluding document": "Documento de cierre", + "This phase has no files yet.": "Esta fase aún no tiene archivos.", + "Upload a document": "Subir un documento", + "The document was not uploaded. Please try again.": "El documento no se subió. Inténtalo de nuevo.", + "Upload the concluding document before you close this phase.": "Sube el documento de cierre antes de cerrar esta fase.", + "This phase cannot be closed from its current status.": "Esta fase no se puede cerrar desde su estado actual.", + "The phase was not closed. Please try again.": "La fase no se cerró. Inténtalo de nuevo.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "El id del archivo de esta fase que la cierra. La fase solo puede completarse cuando está indicado y el archivo está adjunto.", + "Import from Microsoft Project": "Importar desde Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Elija un plan guardado desde Microsoft Project en formato XML. No se importa nada hasta que confirme.", + "Plan file": "Archivo del plan", + "What the import creates": "Lo que crea la importación", + "Tasks": "Tareas", + "Sub-tasks": "Subtareas", + "Milestones": "Hitos", + "Links": "Vínculos", + "Already imported, updated in place: {count}": "Ya importados, actualizados en su sitio: {count}", + "What does not carry over": "Lo que no se traslada", + "Tasks with resources, which are not imported: {count}": "Tareas con recursos, que no se importan: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tareas por debajo del nivel 3, colocadas bajo su tarea de nivel 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Vínculos distintos de fin a comienzo, importados como vínculos relacionados: {count}", + "Link lags, which are dropped: {count}": "Posposiciones de vínculos, que se descartan: {count}", + "Links to a summary task, which are not imported: {count}": "Vínculos a una tarea de resumen, que no se importan: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Vínculos a tareas fuera de este plan, que no se importan: {count}", + "No longer in the plan": "Ya no está en el plan", + "These stay in the project; remove them yourself if they are no longer needed.": "Permanecen en el proyecto; elimínelos usted si ya no se necesitan.", + "Import": "Importar", + "Close": "Cerrar", + "The plan is imported: {created} created, {updated} updated.": "El plan está importado: {created} creados, {updated} actualizados.", + "Links that would close a loop were left out: {count}": "Se omitieron los vínculos que cerrarían un ciclo: {count}", + "The import stopped part-way. Run it again to finish it.": "La importación se detuvo a medias. Ejecútela de nuevo para terminarla.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Guarde el plan en Microsoft Project con Archivo, Guardar como, formato XML, e importe ese archivo.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Este archivo declara un DOCTYPE o entidades, que no se aceptan.", + "The file is larger than 10 MB.": "El archivo supera los 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "El plan tiene más de 2.000 tareas, más de las que admite una importación.", + "This file is not a Microsoft Project plan in XML format.": "Este archivo no es un plan de Microsoft Project en formato XML.", + "Choose a file to import.": "Elija un archivo para importar.", + "Only the project owner can import a plan.": "Solo el propietario del proyecto puede importar un plan.", + "The plan could not be read. Please try again.": "No se pudo leer el plan. Inténtelo de nuevo.", + "Linked case: {title}": "Expediente vinculado: {title}", + "Linked to a case": "Vinculado a un expediente", + "Hand over to case": "Entregar al expediente", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copia sin cambios cada archivo del proyecto y de sus tareas, y un archivo que describe el proyecto, al expediente vinculado.", + "{date} by {user}": "{date} por {user}", + "Files copied: {count}": "Archivos copiados: {count}", + "Files that failed: {names}": "Archivos con error: {names}", + "The handover failed. Please try again.": "La entrega ha fallado. Inténtelo de nuevo.", + "The linked case could not be found, or you cannot open it.": "No se encontró el expediente vinculado o no puede abrirlo.", + "Case handovers": "Entregas al expediente", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Cada entrega de los archivos y metadatos del proyecto a su expediente: cuándo, por quién, a qué expediente, cada archivo copiado con su SHA-256 y los archivos que fallaron.", + "Finance": "Finanzas", + "Add cost line": "Añadir línea de coste", + "Delivery terms": "Condiciones de entrega", + "Billing model": "Modelo de facturación", + "Budget in euro": "Presupuesto en euros", + "Budget in hours": "Presupuesto en horas", + "Hourly rate in euro": "Tarifa por hora en euros", + "Planned start": "Inicio previsto", + "Planned end": "Fin previsto", + "Planned dates": "Fechas previstas", + "Budget {amount}": "Presupuesto {amount}", + "No budget agreed": "Sin presupuesto acordado", + "Hours": "Horas", + "Only the project owner and the portfolio managers see the amounts.": "Solo el propietario del proyecto y los gestores de la cartera ven los importes.", + "Budget against cost per category": "Presupuesto frente a costes por categoría", + "Labour (booked time)": "Mano de obra (horas registradas)", + "No category": "Sin categoría", + "Hours are not available": "Las horas no están disponibles", + "Not yet assigned to a category": "Aún sin asignar a una categoría", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} gastado, {remaining} restante", + "Budget against cost per phase": "Presupuesto frente a costes por fase", + "No phase": "Sin fase", + "Cost lines": "Líneas de coste", + "From the finance system": "Del sistema financiero", + "Edit cost line {amount}": "Editar la línea de coste {amount}", + "No cost lines yet": "Aún no hay líneas de coste", + "Commitments": "Compromisos", + "Actual cost": "Coste real", + "Forecast": "Previsión", + "Remaining": "Restante", + "Not planned yet": "Aún sin planificar", + "{start} to {end}": "{start} a {end}", + "The terms were not saved. Please try again.": "Las condiciones no se guardaron. Inténtalo de nuevo.", + "Terms saved": "Condiciones guardadas", + "Fixed price": "Precio fijo", + "Hourly": "Por horas", + "Not billed": "Sin facturar", + "Commitment": "Compromiso", + "Edit cost line": "Editar línea de coste", + "Kind": "Tipo", + "Amount in euro": "Importe en euros", + "Remove": "Eliminar", + "Could not save the cost line. Only the project owner changes the money of a project.": "No se pudo guardar la línea de coste. Solo el propietario del proyecto cambia el dinero de un proyecto.", + "Could not remove the cost line. Please try again.": "No se pudo eliminar la línea de coste. Inténtalo de nuevo.", + "{amount} over budget": "{amount} por encima del presupuesto", + "Cost categories": "Categorías de coste", + "The categories every project splits its budget and costs into, one per line": "Las categorías en las que cada proyecto divide su presupuesto y sus costes, una por línea", + "Categories": "Categorías", + "Give at least one category, each name once.": "Indica al menos una categoría, cada nombre una sola vez.", + "Cost categories saved": "Categorías de coste guardadas", + "The cost categories were not saved. Please try again.": "Las categorías de coste no se guardaron. Inténtalo de nuevo.", + "Finance line": "Línea financiera", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Un importe de un proyecto: un presupuesto, un compromiso, un coste real o una previsión, en una categoría de coste y opcionalmente una fase. Lo registra el propietario del proyecto o el sistema financiero a través de la aplicación de integración.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "El proyecto al que pertenece este importe. Vacío para una línea del sistema financiero cuyo número de proyecto no coincide con ningún proyecto.", + "The phase this amount belongs to, if any": "La fase a la que pertenece este importe, si la hay", + "The cost category, one of the categories the admin set up": "La categoría de coste, una de las que configuró el administrador", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Si el importe es un presupuesto, un compromiso, un coste real o una previsión", + "Amount": "Importe", + "The amount in the reporting currency (euro)": "El importe en la moneda de informe (euro)", + "The date the amount was booked or is expected": "La fecha en que se registró o se espera el importe", + "What the amount is for": "Para qué es el importe", + "Whether a person entered the line or the finance system sent it": "Si una persona registró la línea o la envió el sistema financiero", + "Entered by hand": "Registrado a mano", + "Finance line id": "Id de la línea financiera", + "The finance system's own id of this line. One imported line per id.": "El id propio de esta línea en el sistema financiero. Una línea importada por id.", + "Project number": "Número de proyecto", + "The project number the finance system sent, matched against the project key": "El número de proyecto que envió el sistema financiero, comparado con la clave del proyecto", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "La cartera del proyecto de la línea, copiada del proyecto para que los totales de la cartera necesiten un solo filtro", + "Finance readers": "Lectores financieros", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID de Nextcloud de las personas que pueden ver este importe: el propietario del proyecto y los gestores de su cartera", + "Project owner": "Propietario del proyecto", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID de Nextcloud del propietario del proyecto, que puede cambiar y eliminar las líneas manuales", + "How the client pays: not billed, a fixed price, or by the hour.": "Cómo paga el cliente: sin facturar, precio fijo o por horas.", + "Portfolio finance": "Finanzas de la cartera", + "You cannot see the money of any project in this portfolio": "No puedes ver el dinero de ningún proyecto de esta cartera", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "El servidor devolvió líneas de coste de proyectos fuera de esta cartera, así que estos totales pueden ser erróneos.", + "Projects left out because you cannot see their money: {count}": "Proyectos omitidos porque no puedes ver su dinero: {count}", + "Unmatched finance lines": "Líneas financieras sin asignar", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Presupuesto, compromisos, coste real y previsión sumados en una cartera.", + "Subprojects": "Subproyectos", + "{done} of {total}": "{done} de {total}", + "{done} of {total} tasks done, including subprojects": "{done} de {total} tareas hechas, subproyectos incluidos", + "Show the subprojects of {title}": "Mostrar los subproyectos de {title}", + "Hide the subprojects of {title}": "Ocultar los subproyectos de {title}", + "Part of": "Forma parte de", + "No parent project": "Sin proyecto superior", + "A project cannot sit under one of its own subprojects.": "Un proyecto no puede quedar bajo uno de sus propios subproyectos.", + "Projects nest three levels deep at most: programme, project and subproject.": "Los proyectos se anidan como máximo tres niveles: programa, proyecto y subproyecto.", + "Parent project": "Proyecto superior", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "El proyecto bajo el que queda este proyecto, como un programa. Los proyectos se anidan como máximo tres niveles.", + "Yes": "Sí", + "No": "No", + "{label} (required)": "{label} (obligatorio)", + "{label} is required": "{label} es obligatorio", + "Project field": "Campo de proyecto", + "A field an admin adds to every project, such as a policy area or a contract value.": "Un campo que un administrador añade a cada proyecto, como un área de política o un valor de contrato.", + "Key": "Clave", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "El nombre fijo con el que se guarda el valor, en lower camel case. Mantenlo en cuanto los proyectos lo usen.", + "Label": "Etiqueta", + "The name people see next to the field": "El nombre que las personas ven junto al campo", + "What the field holds": "Lo que contiene el campo", + "Text": "Texto", + "Number": "Número", + "Choice": "Opción", + "Person": "Persona", + "Yes or no": "Sí o no", + "Options": "Opciones", + "The choices of a choice field": "Las opciones de un campo de elección", + "Required": "Obligatorio", + "Whether a project must fill in the field": "Si un proyecto debe rellenar el campo", + "Where the field appears, lowest first": "Dónde aparece el campo, el menor primero", + "Applies to": "Se aplica a", + "What the field is added to": "A qué se añade el campo", + "Custom fields": "Campos propios", + "The values of the project fields an admin defined, keyed by the field's key.": "Los valores de los campos de proyecto que definió un administrador, por la clave del campo.", + "Project fields": "Campos de proyecto", + "Related": "Relacionadas", + "Remove link": "Quitar el vínculo", + "Link type": "Tipo de vínculo", + "Relates to": "Relacionada con", + "Duplicates": "Duplica", + "Project key": "Clave del proyecto", + "Every task number starts with it, such as VERG-42.": "Cada número de tarea empieza por ella, por ejemplo VERG-42.", + "This key is already used by another project.": "Otro proyecto ya usa esta clave.", + "Use 2 to 10 letters and digits, starting with a letter.": "Use de 2 a 10 letras y dígitos, empezando por una letra.", + "The key cannot change once tasks carry it.": "La clave no puede cambiar una vez que las tareas la llevan.", + "Project saved. The existing tasks get their numbers in the background.": "Proyecto guardado. Las tareas existentes reciben su número en segundo plano.", + "Next task number": "Número de la siguiente tarea", + "The number the next task of this project gets in its key. Only the system writes it.": "El número que recibe en su clave la siguiente tarea de este proyecto. Solo el sistema lo escribe.", + "Restore {title}": "Restaurar {title}", + "Restore": "Restaurar", + "Project restored": "Proyecto restaurado", + "Could not restore the project": "No se pudo restaurar el proyecto", + "Bring this project back to the active list.": "Devolver este proyecto a la lista de proyectos activos.", + "Restore project": "Restaurar proyecto", + "Request reason": "Motivo de la solicitud", + "Why the requester needs this project. Filled in when the project is requested.": "Por qué el solicitante necesita este proyecto. Se rellena al solicitarlo.", + "Reviewed by": "Revisado por", + "The user who approved or rejected the request.": "El usuario que aprobó o rechazó la solicitud.", + "Reviewed at": "Revisado el", + "When the request was approved or rejected.": "Cuándo se aprobó o rechazó la solicitud.", + "Review note": "Nota de revisión", + "The reviewer's reason, shown to the requester when a request is not approved.": "El motivo del revisor, que ve el solicitante cuando una solicitud no se aprueba.", + "Members of these groups": "Miembros de estos grupos", + "Groups that may create projects": "Grupos que pueden crear proyectos", + "The group {group} no longer exists. Save to remove it.": "El grupo {group} ya no existe. Guarde para quitarlo.", + "Review project request": "Revisar la solicitud de proyecto", + "Requested by": "Solicitado por", + "Why it is needed": "Por qué se necesita", + "Desired start date": "Fecha de inicio deseada", + "Why is it not approved?": "¿Por qué no se aprueba?", + "Give a reason. The requester sees it.": "Indique un motivo. El solicitante lo verá.", + "Approve": "Aprobar", + "Reject": "Rechazar", + "Reject request": "Rechazar la solicitud", + "The review was not saved. Try again.": "La revisión no se guardó. Inténtelo de nuevo.", + "This project is waiting for review": "Este proyecto está pendiente de revisión", + "This request was not approved": "Esta solicitud no se aprobó", + "Reason: {note}": "Motivo: {note}", + "Review request": "Revisar la solicitud", + "Request a project": "Solicitar un proyecto", + "Step {step} of 2": "Paso {step} de 2", + "Why is this project needed?": "¿Por qué se necesita este proyecto?", + "Give a reason. The reviewer reads it.": "Indique un motivo. El revisor lo leerá.", + "Back": "Atrás", + "Next": "Siguiente", + "Send request": "Enviar solicitud", + "The request was not sent. Try again.": "La solicitud no se envió. Inténtelo de nuevo.", + "Requested": "Solicitado", + "Not approved": "No aprobado", + "Your request was sent": "Su solicitud se ha enviado", + "Let everyone else request a project": "Permitir que los demás soliciten un proyecto", + "Add a task": "Añadir una tarea", + "Delete task": "Eliminar tarea", + "Edit task": "Editar tarea", + "Write": "Escribir", + "Preview": "Vista previa", + "Markdown works here: headings, lists and links.": "Aquí funciona Markdown: encabezados, listas y enlaces.", + "Could not save the task. Please try again.": "No se pudo guardar la tarea. Inténtalo de nuevo.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "\"{title}\" tiene tiempo registrado, así que no se puede eliminar. Puedes cancelarla en su lugar: los registros de tiempo se conservan.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "¿Eliminar \"{title}\"? También se eliminan sus vínculos con otras tareas. Esto no se puede deshacer.", + "Keep task": "Conservar tarea", + "Cancel task": "Cancelar tarea", + "Only the reporter, the project owner or an admin can delete this task.": "Solo quien la informó, el propietario del proyecto o un administrador puede eliminar esta tarea.", + "Could not delete the task. Please try again.": "No se pudo eliminar la tarea. Inténtalo de nuevo.", + "Could not cancel the task. Please try again.": "No se pudo cancelar la tarea. Inténtalo de nuevo.", + "Responsible": "Responsable", + "Also working on this": "También trabajan en esto", + "Labels": "Etiquetas", + "Could not change the priority. Please try again.": "No se pudo cambiar la prioridad. Inténtalo de nuevo.", + "Other project members who work on this task alongside the person responsible.": "Otros miembros del proyecto que trabajan en esta tarea junto a la persona responsable.", + "Duplicate": "Duplicar", + "Could not copy the task. Please try again.": "No se pudo copiar la tarea. Inténtalo de nuevo.", + "Subtasks": "Subtareas", + "{done} of {total} done": "{done} de {total} hechas", + "Add a subtask": "Añadir una subtarea", + "Checklist": "Lista de comprobación", + "Checklist item actions": "Acciones del elemento de la lista", + "Add a checklist item": "Añadir un elemento a la lista", + "Subtasks: {estimate} estimated, {logged} logged": "Subtareas: {estimate} estimado, {logged} registrado", + "Total estimate: {total}": "Estimación total: {total}", + "Part of {title}": "Parte de {title}", + "Checklist: {count} done": "Lista de comprobación: {count} hechos", + "This task has subtasks: {count}.": "Esta tarea tiene subtareas: {count}.", + "Keep subtasks as separate tasks": "Conservar las subtareas como tareas independientes", + "Delete subtasks too": "Eliminar también las subtareas", + "Copy of {title}": "Copia de {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "La tarea se copió, pero no todas sus subtareas. Revisa la copia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Pequeños pasos dentro de la tarea. Cada elemento tiene un id, un texto y si está hecho.", + "Open work per person and per project.": "Trabajo abierto por persona y por proyecto.", + "View": "Vista", + "By person": "Por persona", + "By project": "Por proyecto", + "Hours left": "Horas restantes", + "Tasks without an estimate": "Tareas sin estimación", + "Due in 14 days": "Vence en 14 días", + "Shared": "Compartidas", + "Unassigned": "Sin asignar", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Se muestra el trabajo de los proyectos que puedes ver. Las horas cuentan para la persona responsable; las tareas compartidas se cuentan sin horas.", + "No open work in these projects.": "No hay trabajo abierto en estos proyectos.", + "Open work": "Trabajo abierto", + "{count} open tasks": "{count} tareas abiertas", + "Create a project to see capacity here.": "Crea un proyecto para ver aquí la capacidad.", + "My tasks": "Mis tareas", + "Show all my tasks": "Mostrar todas mis tareas", + "No tasks assigned to you": "No tienes tareas asignadas", + "Browse projects": "Explorar proyectos", + "Later": "Más adelante", + "Due {date}": "Vence {date}", + "Could not change the status. Please try again.": "No se pudo cambiar el estado. Inténtalo de nuevo.", + "Completed today": "Completadas hoy", + "My open tasks": "Mis tareas abiertas", + "My overdue tasks": "Mis tareas vencidas", + "My tasks in progress": "Mis tareas en curso", + "Pin to the top": "Fijar arriba", + "Unpin": "Desfijar", + "Pinned": "Fijado", + "Actions for {title}": "Acciones para {title}", + "Could not save your project order. Please try again.": "No se pudo guardar el orden de tus proyectos. Inténtalo de nuevo.", + "No boards yet": "Aún no hay tableros", + "Create a project to get a board.": "Crea un proyecto para tener un tablero.", + "Use the Projects page to create and manage your projects and tasks.": "Usa la página Proyectos para crear y gestionar tus proyectos y tareas.", + "Go to projects": "Ir a proyectos", + "You are not a member of any projects yet.": "Aún no eres miembro de ningún proyecto.", + "Could not search for users. Please try again.": "No se pudieron buscar usuarios. Inténtalo de nuevo.", + "Project creation is restricted to administrators.": "Solo los administradores pueden crear proyectos.", + "Only the project owner or an administrator can delete this project.": "Solo el propietario del proyecto o un administrador puede eliminar este proyecto.", + "No projects are available to you yet. Ask an administrator to create one.": "Aún no tienes proyectos disponibles. Pide a un administrador que cree uno.", + "Due: {date}": "Vence: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Las tareas con fecha de inicio o de vencimiento aparecen en la línea de tiempo. Añade fechas para verlas aquí.", + "You do not have access to this project.": "No tienes acceso a este proyecto.", + "Zoom level": "Nivel de zoom", + "Unscheduled": "Sin planificar", + "Start: {date}": "Inicio: {date}", + "Today": "Hoy", + "No scheduled tasks": "No hay tareas planificadas", + "An unexpected error occurred.": "Se produjo un error inesperado.", + "Column {number} name": "Nombre de la columna {number}", + "Failed to save creation policy": "No se pudo guardar la política de creación", + "All authenticated users": "Todos los usuarios autenticados", + "Control who may create new projects": "Controla quién puede crear proyectos nuevos", + "Administrators only": "Solo administradores", + "Project creation": "Creación de proyectos", + "Allow project creation": "Permitir la creación de proyectos", + "Creation policy saved successfully": "Política de creación guardada", + "Initializing…": "Iniciando…", + "e.g. 2h 30m, 90m, 1.5h": "p. ej. 2h 30m, 90m, 1.5h", + "Log time": "Registrar tiempo", + "Save estimate": "Guardar estimación", + "Logged: {logged}": "Registrado: {logged}", + "over by {amount}": "excedido en {amount}", + "Time tracking": "Registro de tiempo", + "Estimate": "Estimación", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Introduce una estimación válida (p. ej. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Introduce una duración válida (p. ej. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "No se pudo guardar el registro de tiempo. Inténtalo de nuevo.", + "Edit time entry": "Editar registro de tiempo", + "Duration": "Duración", + "Date range": "Periodo", + "Last week": "Semana pasada", + "No time logged": "No hay tiempo registrado", + "Log time on a task to see it here.": "Registra tiempo en una tarea para verlo aquí.", + "To date": "Hasta la fecha", + "This week": "Esta semana", + "Total: {total}": "Total: {total}", + "From date": "Desde la fecha", + "Custom range": "Periodo personalizado", + "All time": "Todo", + "Could not delete a task, so some data may remain. Try deleting the project again.": "No se pudo eliminar una tarea, así que pueden quedar datos. Vuelve a eliminar el proyecto.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "No se pudo eliminar un registro de tiempo, así que pueden quedar datos. Vuelve a eliminar el proyecto.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "No se pudo eliminar una columna, así que pueden quedar datos. Vuelve a eliminar el proyecto.", + "Could not delete the project. Please try again.": "No se pudo eliminar el proyecto. Inténtalo de nuevo.", + "Notification settings": "Ajustes de notificaciones", + "Configure when due-date reminders are sent": "Configura cuándo se envían los recordatorios de vencimiento", + "Due-date reminder lead time (hours)": "Antelación del recordatorio (horas)", + "Lead time must be between 1 and 336 hours": "La antelación debe estar entre 1 y 336 horas", + "Reminder lead time saved successfully": "Antelación del recordatorio guardada", + "Failed to save reminder lead time": "No se pudo guardar la antelación del recordatorio", + "Notifications": "Notificaciones", + "Notify me 1 day before a task's due date": "Avisarme 1 día antes del vencimiento de una tarea", + "Draft": "Borrador", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Si la clase es un borrador que solo ve su docente, se imparte o se cancela.", + "New release": "Nueva versión", + "Roadmap chart. The same releases and epics are listed below.": "Gráfico de la hoja de ruta. Las mismas versiones y épicas aparecen en la lista de abajo.", + "Nothing on the roadmap yet": "Aún no hay nada en la hoja de ruta", + "Releases with a target date and epics with dated tasks appear here.": "Aquí aparecen las versiones con fecha objetivo y las épicas con tareas fechadas.", + "Releases": "Versiones", + "No releases yet": "Aún no hay versiones", + "Target date: {date}": "Fecha objetivo: {date}", + "No target date": "Sin fecha objetivo", + "Edit {name}": "Editar {name}", + "Mark {name} as released": "Marcar {name} como publicada", + "Mark as released": "Marcar como publicada", + "Epics": "Épicas", + "No epics yet. Open a task to make it an epic.": "Aún no hay épicas. Abra una tarea para convertirla en épica.", + "Not scheduled yet": "Aún sin programar", + "Planned": "Planificada", + "Released": "Publicada", + "Edit release": "Editar versión", + "Target date": "Fecha objetivo", + "Could not save the release. Please try again.": "No se pudo guardar la versión. Inténtelo de nuevo.", + "Every task of this release is done or cancelled.": "Todas las tareas de esta versión están hechas o canceladas.", + "Not finished yet: {count}": "Aún sin terminar: {count}", + "What happens to these tasks?": "¿Qué pasa con estas tareas?", + "Move to {name}": "Mover a {name}", + "Remove the release": "Quitar la versión", + "Keep it on {name}": "Dejarlas en {name}", + "Could not mark the release as released. Please try again.": "No se pudo marcar la versión como publicada. Inténtelo de nuevo.", + "Roadmap": "Hoja de ruta", + "Tasks or roadmap": "Tareas u hoja de ruta", + "Release": "Versión", + "Epic": "Épica", + "This task is an epic": "Esta tarea es una épica", + "A named, dated delivery of a project that its tasks are planned against.": "Una entrega con nombre y fecha de un proyecto, contra la que se planifican sus tareas.", + "Name of the release": "Nombre de la versión", + "The project this release belongs to": "El proyecto al que pertenece esta versión", + "What this release delivers": "Lo que entrega esta versión", + "When work on the release starts": "Cuándo empieza el trabajo en la versión", + "The date the release is due": "La fecha en que vence la versión", + "Whether the release is planned, released or archived": "Si la versión está planificada, publicada o archivada", + "Released on": "Publicada el", + "When the release was marked as released": "Cuándo se marcó la versión como publicada", + "The release this task is planned for": "La versión para la que está planificada esta tarea", + "Board view options": "Opciones de vista del tablero", + "Colour cards": "Colorear tarjetas", + "No colour": "Sin color", + "By label": "Por etiqueta", + "Swimlanes": "Carriles", + "No swimlanes": "Sin carriles", + "By assignee": "Por persona asignada", + "By epic": "Por épica", + "No assignee": "Sin asignar", + "No epic": "Sin épica", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Las tarjetas se quedan en la fila de su épica. Cambie la épica en la página de la tarea.", + "Hand over to": "Traspasar a", + "Could not save your board view. It applies until you reload.": "No se pudo guardar su vista del tablero. Se aplica hasta que recargue.", + "Timetable wish": "Deseo de horario", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Un deseo que el generador tiene en cuenta. Siempre respeta un deseo estricto, y uno flexible cuando puede.", + "Whether the wish is about a teacher, a group, a room or one activity": "Si el deseo trata de un docente, un grupo, un aula o una actividad", + "Teacher": "Docente", + "Group": "Grupo", + "Reference": "Referencia", + "The user, group, room or activity the wish is about": "El usuario, grupo, aula o actividad al que se refiere el deseo", + "What the wish asks for": "Lo que pide el deseo", + "Not on these periods": "No en estas franjas", + "Preferably not on these periods": "Preferiblemente no en estas franjas", + "At most a number of lessons a day": "Como máximo un número de clases al día", + "No free periods between lessons": "Sin horas libres entre clases", + "Always the same room": "Siempre la misma aula", + "Periods": "Franjas", + "The periods of the week the wish is about, such as wed-5": "Las franjas de la semana a las que se refiere, como wed-5", + "Limit": "Límite", + "The most lessons a day, for a wish of that kind": "El máximo de clases al día, para un deseo de ese tipo", + "Strength": "Fuerza", + "Whether the generator must keep the wish or should keep it": "Si el generador debe o debería respetar el deseo", + "Hard": "Estricto", + "Soft": "Flexible", + "Weight": "Peso", + "How much a soft wish counts, from 1 to 3": "Cuánto cuenta un deseo flexible, de 1 a 3", + "Why the wish exists": "Por qué existe el deseo", + "Timetable scenario": "Escenario de horario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Un patrón semanal, hecho por el generador o tomado del horario actual. Guarda sus datos de entrada y cuánto respeta los deseos.", + "The name timetablers know the scenario by": "El nombre con el que los planificadores conocen el escenario", + "Whether the generator made it or it came from the current timetable": "Si lo hizo el generador o viene del horario actual", + "Generated": "Generado", + "From the current timetable": "Del horario actual", + "Week of": "Semana del", + "The Monday of the first week of the window": "El lunes de la primera semana del periodo", + "Window start": "Inicio del periodo", + "The first day the week pattern applies to": "El primer día al que se aplica el patrón semanal", + "Window end": "Fin del periodo", + "The last day the week pattern applies to": "El último día al que se aplica el patrón semanal", + "Waiting, generating, done, failed, or published as draft lessons": "En espera, generando, listo, fallido o publicado como clases borrador", + "Waiting": "En espera", + "Generating": "Generando", + "Failed": "Fallido", + "Published": "Publicado", + "Seed": "Semilla", + "The number the generator starts from, so a run can be repeated": "El número con el que empieza el generador, para poder repetir una ejecución", + "Input": "Entrada", + "The periods, rooms, lessons and wishes the scenario was made from": "Las franjas, aulas, clases y deseos de los que salió el escenario", + "Placements": "Ubicaciones", + "Each lesson with the period and room it was given": "Cada clase con la franja y el aula que recibió", + "Unplaced lessons": "Clases sin ubicar", + "Lessons without a place, each with the hard wish that blocked it": "Clases sin sitio, cada una con el deseo estricto que la bloqueó", + "Broken wishes": "Deseos incumplidos", + "The wishes this scenario breaks, with the lessons that break them": "Los deseos que este escenario incumple, con las clases que los incumplen", + "Measures": "Medidas", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Clases ubicadas, deseos incumplidos, huecos docentes, clases al día y uso de aulas", + "Reason": "Motivo", + "Why the run failed": "Por qué falló la ejecución", + "Published at": "Publicado el", + "When the scenario was written out as draft lessons": "Cuándo se escribió el escenario como clases borrador", + "Edit wish": "Editar deseo", + "New wish": "Nuevo deseo", + "Hard: the generator always keeps it": "Estricto: el generador siempre lo respeta", + "Soft: the generator keeps it where it can": "Flexible: el generador lo respeta cuando puede", + "Weight (1 to 3)": "Peso (1 a 3)", + "Most lessons a day": "Máximo de clases al día", + "Period": "Franja", + "{day} period {number}": "{day} franja {number}", + "Teacher (user name)": "Docente (nombre de usuario)", + "Activity (group:subject)": "Actividad (grupo:asignatura)", + "Say who or what the wish is about.": "Indique a quién o a qué se refiere el deseo.", + "Choose at least one period.": "Elija al menos una franja.", + "The limit is a whole number of 1 or more.": "El límite es un número entero de 1 o más.", + "Timetable": "Horario", + "Wishes": "Deseos", + "Timetable wishes": "Deseos de horario", + "Generator run": "Ejecución del generador", + "Generator progress": "Progreso del generador", + "The run failed: {reason}": "La ejecución falló: {reason}", + "{placed} of {lessons} lessons placed": "{placed} de {lessons} clases colocadas", + "Generate again": "Generar de nuevo", + "Generate": "Generar", + "Every lesson has a place.": "Cada clase tiene un lugar.", + "Lesson": "Clase", + "No free period and room": "Sin franja ni aula libre", + "Broken soft wishes": "Deseos flexibles incumplidos", + "Every soft wish is kept.": "Se respeta cada deseo flexible.", + "Wish": "Deseo", + "Lessons": "Clases", + "Generating: {percent}% of the time budget used": "Generando: {percent} % del tiempo usado", + "Waiting to start": "Esperando para empezar", + "Published as draft lessons": "Publicado como clases en borrador", + "Could not read the scenario.": "No se pudo leer el escenario.", + "Could not start the run.": "No se pudo iniciar la ejecución.", + "Scenarios": "Escenarios", + "Timetable scenarios": "Escenarios de horario", + "Scenario": "Escenario", + "Take the current timetable": "Tomar el horario actual", + "Could not take the current timetable.": "No se pudo tomar el horario actual.", + "Broken hard wishes": "Deseos obligatorios incumplidos", + "Not on a period of the week grid": "No está en una franja de la cuadrícula semanal", + "Compare scenarios": "Comparar escenarios", + "Scenarios to compare": "Escenarios que comparar", + "Choose two or three scenarios to compare them.": "Elija dos o tres escenarios para compararlos.", + "Measure": "Medida", + "Best": "Mejor", + "Lessons that differ": "Clases que difieren", + "No lesson differs.": "Ninguna clase difiere.", + "Not placed": "Sin colocar", + "{period} in {room}": "{period} en {room}", + "Lessons placed": "Clases colocadas", + "Lessons without a place": "Clases sin lugar", + "Clashes": "Choques", + "Hard wishes broken": "Deseos estrictos incumplidos", + "Soft wishes broken": "Deseos flexibles incumplidos", + "Soft wishes broken, weighted": "Deseos flexibles incumplidos, ponderados", + "Free periods between lessons, all teachers": "Horas libres entre clases, todos los docentes", + "Most free periods of one teacher": "Más horas libres de un docente", + "Most lessons of one group on a day": "Más clases de un grupo en un día", + "Room use": "Uso de aulas", + "Publish as draft lessons": "Publicar como clases en borrador", + "Draft lessons written: {count}": "Clases en borrador escritas: {count}", + "Could not publish the scenario.": "No se pudo publicar el escenario.", + "Rules": "Reglas", + "Rules for {column}": "Reglas de {column}", + "When a card enters this column": "Cuando una tarjeta entra en esta columna", + "Action": "Acción", + "Set the priority": "Fijar la prioridad", + "Assign to": "Asignar a", + "Assign the person who moved the card": "Asignar a la persona que movió la tarjeta", + "Remove the assignee": "Quitar la persona asignada", + "Add a label": "Añadir una etiqueta", + "No longer a project member": "Ya no es miembro del proyecto", + "This label no longer exists": "Esta etiqueta ya no existe", + "Add rule": "Añadir regla", + "Remove rule": "Quitar regla", + "No rules yet. Add one to change a card when it enters this column.": "Aún no hay reglas. Añada una para cambiar una tarjeta cuando entre en esta columna.", + "Could not save the rules. Please try again.": "No se pudieron guardar las reglas. Inténtelo de nuevo.", + "1 rule runs when a card enters this column": "1 regla se aplica cuando una tarjeta entra en esta columna", + "{count} rules run when a card enters this column": "{count} reglas se aplican cuando una tarjeta entra en esta columna", + "Rules applied: {changes}": "Reglas aplicadas: {changes}", + "assigned to {name}": "asignada a {name}", + "assignee removed": "persona asignada quitada", + "priority {priority}": "prioridad {priority}", + "label {label}": "etiqueta {label}", + "What happens to a card when it enters this column, applied in list order.": "Lo que le ocurre a una tarjeta cuando entra en esta columna, en el orden de la lista.", + "Value": "Valor", + "What the rule does to the card.": "Lo que la regla hace con la tarjeta.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "La prioridad, el id de usuario o el id de etiqueta que usa la acción; vacío para acciones sin valor.", + "is not": "no es", + "{dimension} is not": "{dimension} no es", + "Saved filters": "Filtros guardados", + "No saved filters yet": "Aún no hay filtros guardados", + "Save filter": "Guardar filtro", + "Rename \"{name}\"": "Cambiar el nombre de «{name}»", + "Delete \"{name}\"": "Eliminar «{name}»", + "Clear filters": "Borrar filtros", + "Showing {shown} of {total} tasks": "Se muestran {shown} de {total} tareas", + "Me": "Yo", + "No date": "Sin fecha", + "Rename saved filter": "Cambiar el nombre del filtro guardado", + "Share with the project": "Compartir con el proyecto", + "Give the filter a name": "Ponga un nombre al filtro", + "Could not save the filter. Please try again.": "No se pudo guardar el filtro. Inténtelo de nuevo.", + "Some labels in \"{name}\" no longer exist and were left out.": "Algunas etiquetas de «{name}» ya no existen y se han omitido.", + "Could not delete the filter. Please try again.": "No se pudo eliminar el filtro. Inténtelo de nuevo.", + "Saved filter": "Filtro guardado", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Un filtro de tablero con nombre de un proyecto, privado para quien lo guardó salvo que se comparta con el proyecto.", + "The project whose board the filter applies to": "El proyecto a cuyo tablero se aplica el filtro", + "The name the filter is listed under": "El nombre con el que aparece el filtro en la lista", + "Saved by": "Guardado por", + "Nextcloud user id of the person who saved the filter": "Id de usuario de Nextcloud de quien guardó el filtro", + "Shared with the project": "Compartido con el proyecto", + "Whether every project member sees and applies the filter": "Si cada miembro del proyecto ve y puede aplicar el filtro", + "Criteria": "Criterios", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "El filtro: persona asignada, etiqueta, prioridad y vencimiento, cada uno con es o no es y sus valores", + "Cross-project view": "Vista entre proyectos", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Una selección guardada de proyectos cuyas tareas se muestran juntas en carriles de estado, compartida con las personas que nombra.", + "Shared with": "Compartida con", + "The name the view is listed under": "El nombre con el que aparece la vista", + "Nextcloud user id of the person who saved the view": "Id de usuario de Nextcloud de la persona que guardó la vista", + "Nextcloud user ids of the people the view is shared with": "Ids de usuario de Nextcloud de las personas con las que se comparte la vista", + "The projects whose tasks the view shows, at most twenty": "Los proyectos cuyas tareas muestra la vista, como máximo veinte", + "1 project in this view is hidden from you.": "1 proyecto de esta vista está oculto para ti.", + "{count} projects in this view are hidden from you.": "{count} proyectos de esta vista están ocultos para ti.", + "{project} has no column for {status}.": "{project} no tiene columna para {status}.", + "This view does not exist or is not shared with you.": "Esta vista no existe o no se ha compartido contigo.", + "\"{task}\" moved to {status}.": "\"{task}\" movida a {status}.", + "Project: {title}": "Proyecto: {title}", + "Cross-project views": "Vistas entre proyectos", + "New view": "Nueva vista", + "Edit view": "Editar vista", + "Delete view": "Eliminar vista", + "Give the view a name": "Pon un nombre a la vista", + "Pick at least one project": "Elige al menos un proyecto", + "A view shows at most {max} projects": "Una vista muestra como máximo {max} proyectos", + "Could not save the view. Please try again.": "No se pudo guardar la vista. Inténtalo de nuevo.", + "Could not delete the view. Please try again.": "No se pudo eliminar la vista. Inténtalo de nuevo.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "¿Eliminar \"{title}\"? Los proyectos y sus tareas quedan como están.", + "People see the tasks of the projects they are in, never more.": "Cada persona ve las tareas de los proyectos en los que está, nunca más.", + "No views yet. A view shows the tasks of several of your projects together.": "Aún no hay vistas. Una vista muestra juntas las tareas de varios de tus proyectos.", + "Projects in view: {count}": "Proyectos en la vista: {count}", + "Notify me when a task is assigned to me": "Avisarme cuando se me asigne una tarea", + "Also send these to me by email": "Enviarme también estos avisos por correo", + "Add an email address in your Nextcloud personal settings to get mail.": "Añade una dirección de correo en tus ajustes personales de Nextcloud para recibir correo.", + "Code link": "Enlace de código", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Un commit, rama, solicitud de fusión o incidencia en una forja de código que trabaja en una tarea.", + "The task the link belongs to": "La tarea a la que pertenece el enlace", + "The project of the task": "El proyecto de la tarea", + "Task key": "Clave de tarea", + "The task key the forge text named, such as VC-12": "La clave de tarea que nombró el texto de la forja, como VC-12", + "What the link points at": "A qué apunta el enlace", + "Link": "Enlace", + "The address of the item in the forge": "La dirección del elemento en la forja", + "The commit message, branch name or merge request title": "El mensaje del commit, el nombre de la rama o el título de la solicitud de fusión", + "Repository": "Repositorio", + "The repository, such as acme/portal": "El repositorio, como acme/portal", + "Forge id": "Id en la forja", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "El id propio del elemento en la forja, como github:acme/portal#42 o un hash de commit", + "State": "Estado", + "The state of a merge request or issue": "El estado de una solicitud de fusión o incidencia", + "Who made the commit or opened the merge request": "Quién hizo el commit o abrió la solicitud de fusión", + "When the commit was made or the merge request last changed": "Cuándo se hizo el commit o cambió por última vez la solicitud de fusión", + "Added by": "Añadido por", + "Whether a person added the link or the integration wrote it": "Si una persona añadió el enlace o lo escribió la integración", + "Nextcloud user UIDs of project members": "UID de usuario de Nextcloud de los miembros del proyecto", + "Add link": "Añadir enlace", + "Added by hand": "Añadido a mano", + "Branch": "Rama", + "Code": "Código", + "Commit": "Commit", + "From the integration": "Desde la integración", + "Link to a commit, branch or merge request": "Enlace a un commit, rama o solicitud de fusión", + "Merge request": "Solicitud de fusión", + "Merged": "Fusionada", + "No code linked yet. Name {key} in a commit message or paste a link.": "Aún no hay código enlazado. Nombra {key} en un mensaje de commit o pega un enlace.", + "No code linked yet. Paste a link to a commit or merge request.": "Aún no hay código enlazado. Pega un enlace a un commit o solicitud de fusión.", + "Paste a web address that starts with https://.": "Pega una dirección web que empiece por https://.", + "Remove link {title}": "Quitar el enlace {title}", + "The link could not be added.": "No se pudo añadir el enlace.", + "The link could not be removed.": "No se pudo quitar el enlace.", + "This link is already on the task.": "Este enlace ya está en la tarea.", + "Code forges": "Forjas de código", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Enlaza commits y pull requests de GitHub con tareas. Integriq recibe los eventos; planninq nunca llama a GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Descarga la configuración e impórtala en Integriq. Después escribe un secreto en la regla \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "En GitHub, añade al repositorio un webhook con esta dirección y el mismo secreto. Elige el tipo de contenido application/json y los eventos push y pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nombra la clave de la tarea, como VC-12, en un mensaje de commit, un nombre de rama o el título de una pull request. El enlace aparece entonces en esa tarea.", + "Without Integriq, project members can still paste a link on the task page.": "Sin Integriq, los miembros del proyecto pueden seguir pegando un enlace en la página de la tarea.", + "Download the Integriq configuration": "Descargar la configuración de Integriq", + "Calendar": "Calendario", + "Previous": "Anterior", + "Calendar view": "Vista del calendario", + "Starts:": "Empieza:", + "No tasks with a date in this month.": "No hay tareas con fecha este mes.", + "Week of {start} to {end}": "Semana del {start} al {end}", + "My calendar": "Mi calendario", + "Show as list": "Mostrar como lista", + "Show as calendar": "Mostrar como calendario", + "Open my calendar": "Abrir mi calendario", + "Nextcloud Tasks": "Tareas de Nextcloud", + "Show my tasks in Nextcloud Tasks": "Mostrar mis tareas en Tareas de Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Las tareas asignadas a ti o compartidas contigo aparecen en una lista \"Planninq\" en Tareas y Calendario de Nextcloud. Los cambios hechos allí se sustituyen con el siguiente cambio en Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Este servidor no puede escribir en Tareas de Nextcloud, así que la exportación no está disponible.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Gestionado por Planninq. Los cambios hechos aquí se sustituyen con el siguiente cambio en Planninq.", + "Working days and holidays": "Días laborables y festivos", + "Dates set on the timeline skip the days that are not working days.": "Las fechas fijadas en la cronología saltan los días que no son laborables.", + "Working weekdays": "Días laborables de la semana", + "Non-working days": "Días no laborables", + "No non-working days yet.": "Aún no hay días no laborables.", + "Add day": "Añadir día", + "Year": "Año", + "Add Dutch national holidays": "Añadir festivos nacionales neerlandeses", + "Save working days": "Guardar días laborables", + "Choose at least one working weekday.": "Elige al menos un día laborable.", + "Working days saved.": "Días laborables guardados.", + "Could not save the working days.": "No se pudieron guardar los días laborables.", + "New Year's Day": "Año Nuevo", + "Easter Sunday": "Domingo de Pascua", + "Easter Monday": "Lunes de Pascua", + "King's Day": "Día del Rey", + "Liberation Day": "Día de la Liberación", + "Ascension Day": "Ascensión", + "Whit Sunday": "Domingo de Pentecostés", + "Whit Monday": "Lunes de Pentecostés", + "Christmas Day": "Navidad", + "Boxing Day": "San Esteban", + "Dates of {title}": "Fechas de {title}", + "The due date cannot be before the start date.": "La fecha de vencimiento no puede ser anterior a la de inicio.", + "{title}, from {start} to {end}": "{title}, del {start} al {end}", + "The dates could not be saved.": "No se pudieron guardar las fechas.", + "{title} now runs from {start} to {end}": "{title} ahora va del {start} al {end}", + "Auto-scheduling": "Planificación automática", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Si está activada, retrasar una fecha de vencimiento en la cronología ofrece mover también las tareas que bloquea.", + "Move blocked tasks along when a task slips": "Mover las tareas bloqueadas cuando una tarea se retrasa", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "En la cronología, una fecha de vencimiento posterior ofrece mover las tareas que bloquea. Solo cuentan los enlaces \"bloquea\", y las tareas solo se retrasan.", + "Move the tasks that wait for {title}?": "¿Mover las tareas que esperan a {title}?", + "These tasks wait for it and would start after its new due date:": "Estas tareas la esperan y empezarían después de su nueva fecha de vencimiento:", + "{count} tasks would move; the first {limit} are listed.": "Se moverían {count} tareas; se muestran las primeras {limit}.", + "Now": "Ahora", + "After the move": "Después del cambio", + "Only this task": "Solo esta tarea", + "Move all": "Mover todas", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Detenido en {title}: no se pudieron guardar sus fechas. Las tareas anteriores se movieron.", + "Cumulative flow": "Flujo acumulado", + "Show as chart": "Mostrar como gráfico", + "Show as table": "Mostrar como tabla", + "Tasks per column per day": "Tareas por columna y día", + "Tasks without recorded history in this period: {count}": "Tareas sin historial registrado en este periodo: {count}", + "Lead and cycle time": "Plazo de entrega y tiempo de ciclo", + "No tasks were finished in this period.": "No se terminó ninguna tarea en este periodo.", + "Finished tasks": "Tareas terminadas", + "Cycle time, average": "Tiempo de ciclo, media", + "Cycle time, 85th percentile": "Tiempo de ciclo, percentil 85", + "Lead time, average": "Plazo de entrega, media", + "Tasks whose finish time was estimated from their history: {count}": "Tareas cuya hora de fin se estimó a partir del historial: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Tiempo de ciclo de cada tarea terminada, con la media y el percentil 85", + "Slowest tasks": "Tareas más lentas", + "cycle {cycle}, lead {lead}": "ciclo {cycle}, plazo {lead}", + "{days} days": "{days} días", + "Could not load the flow of this project.": "No se pudo cargar el flujo de este proyecto.", + "Last {days} days": "Últimos {days} días", + "Portfolio flow": "Flujo de la cartera", + "An admin adds portfolios under Projects, Portfolios.": "Un administrador añade carteras en Proyectos, Carteras.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Proyectos no mostrados, porque se muestran como máximo 50 a la vez: {count}", + "Could not load the flow of this portfolio.": "No se pudo cargar el flujo de esta cartera.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flujo acumulado y tiempo de ciclo de los proyectos de una cartera.", + "Edit report": "Editar informe", + "Only tasks where": "Solo tareas en las que", + "Group by": "Agrupar por", + "Display": "Visualización", + "Share with everyone who can read its projects": "Compartir con todos los que pueden leer sus proyectos", + "The report could not be saved.": "No se pudo guardar el informe.", + "Number of tasks": "Número de tareas", + "Bar": "Barras", + "Donut": "Anillo", + "Table": "Tabla", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} de {total} proyectos de este informe no son visibles para ti", + "No tasks match this report.": "Ninguna tarea coincide con este informe.", + "None": "Ninguno", + "Could not load this report.": "No se pudo cargar este informe.", + "Report": "Informe", + "Your reports": "Tus informes", + "My reports": "Mis informes", + "Shared reports": "Informes compartidos", + "You have not built a report yet.": "Aún no has creado ningún informe.", + "Nobody has shared a report with you yet.": "Nadie ha compartido todavía un informe contigo.", + "Reports you built over tasks, and the ones shared with you.": "Informes que creaste sobre tareas, y los compartidos contigo.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Una consulta guardada sobre tareas: qué proyectos, qué filtros, agrupada por qué, contada o sumada, y mostrada como tabla o gráfico.", + "The name the report is listed under": "El nombre con el que aparece el informe", + "What the report shows and who it is for": "Qué muestra el informe y para quién es", + "Nextcloud user id of the person who saved the report": "Id de usuario de Nextcloud de quien guardó el informe", + "Who can open the report": "Quién puede abrir el informe", + "Only me": "Solo yo", + "Everyone who can read its projects": "Todos los que pueden leer sus proyectos", + "The projects the report covers, at most fifty": "Los proyectos que abarca el informe, como máximo cincuenta", + "Filters": "Filtros", + "Task fields and the value each must equal": "Campos de tarea y el valor al que cada uno debe ser igual", + "The task field the report groups on": "El campo de tarea por el que agrupa el informe", + "Count the tasks, or add up a number on them": "Contar las tareas, o sumar un número de ellas", + "Sum": "Suma", + "Sum of": "Suma de", + "The number added up when the measure is a sum": "El número que se suma cuando la medida es una suma", + "Story points": "Puntos de historia", + "Estimated duration": "Duración estimada", + "How the report is shown": "Cómo se muestra el informe", + "Issue type": "Tipo de incidencia", + "Task fields and the value each must equal; empty when the report covers every task": "Campos de tarea y el valor que cada uno debe tener; vacío si el informe abarca todas las tareas", + "The status a task must have": "El estado que debe tener una tarea", + "The priority a task must have": "La prioridad que debe tener una tarea", + "The user a task must be assigned to": "El usuario al que debe estar asignada una tarea", + "A label a task must carry": "Una etiqueta que debe llevar una tarea", + "The board column a task must be in": "La columna del tablero en la que debe estar una tarea", + "The issue type a task must have": "El tipo de incidencia que debe tener una tarea", + "Manager groups": "Grupos gestores", + "Member groups": "Grupos miembros", + "Viewer groups": "Grupos lectores", + "Viewers": "Lectores", + "Owning group": "Grupo propietario", + "Nextcloud groups whose members manage the project": "Grupos de Nextcloud cuyos miembros gestionan el proyecto", + "Nextcloud groups whose members work on the project": "Grupos de Nextcloud cuyos miembros trabajan en el proyecto", + "Nextcloud groups whose members may read the project": "Grupos de Nextcloud cuyos miembros pueden leer el proyecto", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Usuarios de Nextcloud que gestionan el proyecto: ajustes, miembros y trabajo", + "Nextcloud user ids who may read the project and its work but not change it": "Usuarios de Nextcloud que pueden leer el proyecto y su trabajo sin cambiarlo", + "The Nextcloud group that owns the project with its creator, at most one": "El grupo de Nextcloud que posee el proyecto con su creador, como máximo uno", + "Nextcloud user ids who may read this through the project": "Usuarios de Nextcloud que pueden leer esto a través del proyecto", + "Nextcloud groups whose members may change this through the project": "Grupos de Nextcloud cuyos miembros pueden cambiar esto a través del proyecto", + "Nextcloud groups whose members may read this through the project": "Grupos de Nextcloud cuyos miembros pueden leer esto a través del proyecto", + "Search for a person or a group…": "Buscar una persona o un grupo…", + "No one found. Your admin's sharing settings decide who you can find.": "No se encontró a nadie. La configuración de uso compartido de tu administrador decide a quién puedes encontrar.", + "Type at least two characters": "Escribe al menos dos caracteres", + "Everyone in this group": "Todas las personas de este grupo", + "Could not search for people. Please try again.": "No se pudo buscar personas. Inténtalo de nuevo.", + "Could not remove the group": "No se pudo quitar el grupo", + "Only the owner and managers change who is on this project.": "Solo la persona propietaria y quienes gestionan cambian quién está en este proyecto.", + "Role of {name}": "Rol de {name}", + "Manager": "Gestor", + "Member": "Miembro", + "Viewer": "Lector", + "Could not change the role": "No se pudo cambiar el rol", + "Owned by group: {name}": "Propiedad del grupo: {name}", + "No group owns this project.": "Ningún grupo es propietario de este proyecto.", + "Owned by group": "Propiedad del grupo", + "Search for a group…": "Buscar un grupo…", + "No group found. Your admin's sharing settings decide which groups you can find.": "No se encontró ningún grupo. La configuración de uso compartido de tu administrador decide qué grupos puedes encontrar.", + "No owning group": "Sin grupo propietario", + "Could not search for groups. Please try again.": "No se pudieron buscar grupos. Inténtalo de nuevo.", + "Could not change the owning group": "No se pudo cambiar el grupo propietario", + "You can read this project. Only its members change it.": "Puedes leer este proyecto. Solo sus miembros lo cambian.", + "Course": "Curso", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "El curso que se imparte en esta clase, como una optativa, cuando la aplicación de aprendizaje del centro lo conoce.", + "Online meeting link": "Enlace de la clase en línea", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Dónde se unen los alumnos a esta clase en línea. El botón Unirse solo aparece con un enlace https." }, "plurals": null } diff --git a/l10n/et.js b/l10n/et.js index db31f645..ae55ce25 100644 --- a/l10n/et.js +++ b/l10n/et.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktiivsed projektid", + "Archived projects": "Arhiveeritud projektid", + "Boards": "Tahvlid", + "My projects": "Minu projektid", + "Portfolio": "Portfell", + "Project board": "Projekti tahvel", + "Projects I am in": "Projektid, milles osalen", + "Timeline": "Ajajoon", + "Timesheet": "Tööajaleht", + "Features & roadmap": "Funktsioonid ja teekaart", + "Flow": "Voog", + "Flows": "Vood", + "Reports": "Aruanded", + "Pick a report to open it.": "Vali aruanne, et see avada.", + "In progress": "Töös", + "Date": "Kuupäev", + "Due": "Tähtaeg", + "Assignee": "Määratud", + "Who": "Kes", + "What": "Mis", + "Minutes": "Minutid", + "Entries": "Kirjed", + "Most recent": "Uusimad", + "Per person": "Isiku kohta", + "By status": "Staatuse järgi", + "By priority": "Prioriteedi järgi", + "Task status": "Ülesannete olek", + "Time spent": "Kulutatud aeg", + "Capacity": "Maht", + "Due soonest": "Kõige varem tähtajaks", + "Minutes logged": "Registreeritud minutid", + "Nothing is due": "Midagi ei ole tähtajaks", + "Nothing logged yet": "Midagi pole veel kirjendatud", + "What is open, what is blocked, and what is overdue.": "Mis on avatud, mis blokeeritud ja mis hilinenud.", + "How allocation is spread across the people working on projects.": "Kuidas koormus jaguneb projektidega tegelevate inimeste vahel.", + "Hours logged, and the projects they went to.": "Kirjendatud tunnid ja projektid, kuhu need läksid.", + "Billable": "Arveldatav", + "Budget: {amount}": "Eelarve: {amount}", + "Loading projects": "Projektide laadimine", + "No projects for this client yet": "Sellel kliendil pole veel projekte", + "Open in Planninq": "Ava Planninqis", + "This project could not be found": "Seda projekti ei leitud", + "Untitled project": "Nimeta projekt", + "and {count} more": "ja veel {count}", + "Store": "Pood", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Paigalda registrid, skeemid ja voog, mille teised organisatsioonid on avaldanud.", + "Work Date": "Töö kuupäev", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Veeru toimingud", + "Columns": "Veerud", + "Could not remove the column. Please try again.": "Veergu ei õnnestunud eemaldada. Proovi uuesti.", + "Could not save the column. Please try again.": "Veergu ei õnnestunud salvestada. Proovi uuesti.", + "Done column": "Valmis-veerg", + "Edit column": "Muuda veergu", + "Keep the card's status": "Säilita kaardi olek", + "Move its cards to": "Teisalda selle kaardid veergu", + "Move left": "Liiguta vasakule", + "Move right": "Liiguta paremale", + "Status of cards moved here": "Siia teisaldatud kaartide olek", + "The last done column cannot be removed.": "Viimast valmis-veergu ei saa eemaldada.", + "WIP limit": "WIP-piirang", + "over limit": "üle piirangu", + "The status a card gets when it is moved into this column.": "Olek, mille kaart saab, kui see teisaldatakse sellesse veergu.", + "All priorities": "Kõik prioriteedid", + "Could not create the task. Please try again.": "Ülesannet ei õnnestunud luua. Proovi uuesti.", + "Created": "Loodud", + "Move to backlog": "Ootenimekirja", + "Move to board": "Tahvlile", + "New task": "Uus ülesanne", + "Nothing in the backlog": "Ootenimekiri on tühi", + "Rank": "Järjekoht", + "Sort by": "Sordi", + "Sort by rank to reorder": "Järjestuse muutmiseks sordi järjekoha järgi", + "Task actions": "Ülesande toimingud", + "All labels": "Kõik sildid", + "Filter tasks by label": "Filtreeri ülesandeid sildi järgi", + "View timeline": "Vaata ajajoont", + "Board": "Tahvel", + "List": "Loend", + "Column": "Veerg", + "Board or list": "Tahvel või loend", + "Log": "Logi", + "Add entry": "Lisa kirje", + "Show": "Näita", + "No actions yet": "Tegevusi veel pole", + "Closed": "Suletud", + "Entry actions": "Kirje toimingud", + "Add action": "Lisa tegevus", + "by {author}": "autor {author}", + "saved {time}": "salvestatud {time}", + "Attendees: {names}": "Osalejad: {names}", + "Add the first entry": "Lisa esimene kirje", + "Issues": "Probleemid", + "Lessons learned": "Õppetunnid", + "Meetings": "Koosolekud", + "Decisions": "Otsused", + "Actions": "Tegevused", + "Issue": "Probleem", + "Lesson learned": "Õppetund", + "Meeting": "Koosolek", + "Decision": "Otsus", + "About this project": "Projektist", + "No description yet": "Kirjeldust veel pole", + "Start date": "Alguskuupäev", + "Not set": "Määramata", + "End date": "Lõppkuupäev", + "Progress": "Edenemine", + "No tasks yet": "Ülesandeid veel pole", + "Open the board": "Ava tahvel", + "People": "Inimesed", + "Owner": "Omanik", + "Latest log entries": "Viimased kirjed", + "Open the log": "Ava logi", + "{done} of {total} tasks done": "{done} ülesannet {total}-st tehtud", + "Edit entry": "Muuda kirjet", + "Type": "Liik", + "Attendees": "Osalejad", + "Issue is closed": "Probleem on suletud", + "Could not save the entry. Please try again.": "Kirjet ei õnnestunud salvestada. Proovi uuesti.", + "From: {title}": "Allikas: {title}", + "What needs to happen": "Mis peab juhtuma", + "Could not create the action. Please try again.": "Tegevust ei õnnestunud luua. Proovi uuesti.", + "The action was created but could not be linked to the entry.": "Tegevus loodi, kuid seda ei õnnestunud kirjega siduda.", + "Project pages": "Projekti lehed", + "Overview": "Ülevaade", + "Risks": "Riskid", + "Log entry": "Logikirje", + "A short name for the entry": "Kirje lühinimi", + "Project": "Projekt", + "The project this entry belongs to": "Projekt, millesse see kirje kuulub", + "What kind of entry this is": "Mis liiki kirje see on", + "When it happened": "Millal see juhtus", + "What happened, in Markdown": "Mis juhtus, Markdownis", + "Whether an issue is still open": "Kas probleem on veel avatud", + "The people at a meeting": "Koosolekul osalejad", + "Tasks that came out of this entry": "Sellest kirjest tulenevad ülesanded", + "Add risk": "Lisa risk", + "Risk": "Risk", + "Score": "Skoor", + "Response": "Vastus", + "Review date": "Ülevaatuse kuupäev", + "no longer on the project": "pole enam projektis", + "Edit {title}": "Muuda: {title}", + "No risks recorded yet": "Riske pole veel kirja pandud", + "Add the first risk": "Lisa esimene risk", + "Medium": "Keskmine", + "Mitigating": "Leevendamisel", + "Occurred": "Realiseerunud", + "Avoid": "Väldi", + "Reduce": "Vähenda", + "Transfer": "Kanna üle", + "Accept": "Aktsepteeri", + "Highest open risks": "Kõrgeimad avatud riskid", + "No open risks": "Avatud riske pole", + "Open the risk register": "Ava riskiregister", + "Edit risk": "Muuda riski", + "What could go wrong": "Mis võib valesti minna", + "Likelihood": "Tõenäosus", + "Impact": "Mõju", + "Score {score}": "Skoor {score}", + "Countermeasures": "Vastumeetmed", + "Could not save the risk. Please try again.": "Riski ei õnnestunud salvestada. Proovi uuesti.", + "Risks by likelihood and impact": "Riskid tõenäosuse ja mõju järgi", + "Risk scale": "Riskiskaala", + "The levels every project scores its risks on, and where low turns into medium and high": "Tasemed, millel iga projekt oma riske hindab, ja kus madal läheb üle keskmiseks ja kõrgeks", + "Number of levels": "Tasemete arv", + "Likelihood labels": "Tõenäosuse sildid", + "Impact labels": "Mõju sildid", + "Level {level}": "Tase {level}", + "Medium from score": "Keskmine alates skoorist", + "High from score": "Kõrge alates skoorist", + "Risk scale saved": "Riskiskaala salvestatud", + "1 risk uses level {level}. Change it first.": "1 risk kasutab taset {level}. Muuda see enne ära.", + "{count} risks use level {level}. Change them first.": "{count} riski kasutavad taset {level}. Muuda need enne ära.", + "Every level needs a label, and high must start above medium.": "Igal tasemel peab olema silt ja kõrge peab algama keskmisest kõrgemalt.", + "The project this risk belongs to": "Projekt, millesse see risk kuulub", + "The cause and the effect, in Markdown": "Põhjus ja tagajärg, Markdownis", + "Category": "Kategooria", + "A free grouping, such as planning, budget or supplier": "Vaba rühmitus, nt planeerimine, eelarve või tarnija", + "How likely it is, on the admin's risk scale": "Kui tõenäoline see on, administraatori riskiskaalal", + "How hard it would hit, on the admin's risk scale": "Kui rängalt see mõjuks, administraatori riskiskaalal", + "Likelihood times impact, calculated by the server": "Tõenäosus korda mõju, arvutab server", + "Where the risk stands": "Kus risk on", + "The person who watches this risk": "Inimene, kes seda riski jälgib", + "How the project answers the risk": "Kuidas projekt riskile vastab", + "What is done to prevent it or soften it, in Markdown": "Mida tehakse selle ärahoidmiseks või leevendamiseks, Markdownis", + "When to look at this risk again": "Millal riski uuesti vaadata", + "Very low": "Väga madal", + "Very high": "Väga kõrge", + "All projects": "Kõik projektid", + "Project status report": "Projekti olukorra aruanne", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Kuupäevaga aruanne selle kohta, kuidas projekt seisab raha, korralduse, aja, teabe, kvaliteedi ja riski osas (GROTIK-aspektid), igaüks märkusega.", + "The project this report is about": "Projekt, mida aruanne puudutab", + "Report date": "Aruande kuupäev", + "The day the report describes": "Päev, mida aruanne kirjeldab", + "Money": "Raha", + "How the project stands on this aspect": "Kuidas projekt selles aspektis seisab", + "On track": "Graafikus", + "At risk": "Ohus", + "Off track": "Graafikust väljas", + "Money note": "Märkus raha kohta", + "A short explanation of this status": "Selle oleku lühike selgitus", + "Organisation": "Korraldus", + "Organisation note": "Märkus korralduse kohta", + "Time": "Aeg", + "Time note": "Märkus aja kohta", + "Information": "Teave", + "Information note": "Märkus teabe kohta", + "Quality": "Kvaliteet", + "Quality note": "Märkus kvaliteedi kohta", + "Risk note": "Märkus riski kohta", + "Overall": "Kokku", + "The worst of the six statuses, calculated by the server": "Kuuest olekust halvim, arvutab server", + "Health: money": "Tervis: raha", + "Copied from the newest status report": "Kopeeritud uusimast olukorra aruandest", + "Health: organisation": "Tervis: korraldus", + "Health: time": "Tervis: aeg", + "Health: information": "Tervis: teave", + "Health: quality": "Tervis: kvaliteet", + "Health: risk": "Tervis: risk", + "Health: overall": "Tervis: kokku", + "Health: report date": "Tervis: aruande kuupäev", + "The date of the newest status report": "Uusima olukorra aruande kuupäev", + "New report": "Uus aruanne", + "Only the project owner writes status reports.": "Olukorra aruandeid kirjutab ainult projekti omanik.", + "Latest report, {date}": "Viimane aruanne, {date}", + "Aspect": "Aspekt", + "Note": "Märkus", + "Report history": "Aruannete ajalugu", + "Author": "Autor", + "No status reports yet": "Olukorra aruandeid veel pole", + "Write the first report": "Kirjuta esimene aruanne", + "Choose a status for every aspect to save the report.": "Aruande salvestamiseks vali iga aspekti jaoks olek.", + "Suggested: on track.": "Soovitus: graafikus.", + "Suggested: at risk.": "Soovitus: ohus.", + "Suggested: off track.": "Soovitus: graafikust väljas.", + "1 task is past its due date.": "1 ülesande tähtaeg on möödas.", + "{count} tasks are past their due date.": "Tähtaja ületanud ülesandeid: {count}.", + "The end date has passed with 1 open task.": "Lõppkuupäev on möödas ja 1 ülesanne on avatud.", + "The end date has passed with {count} open tasks.": "Lõppkuupäev on möödas, avatud ülesandeid: {count}.", + "No open task is past its due date.": "Ühegi avatud ülesande tähtaeg pole möödas.", + "The highest open risk, \"{title}\", scores {score}.": "Suurim avatud risk, „{title}”, saab {score} punkti.", + "There are no open risks.": "Avatud riske pole.", + "Costs are at {percent}% of the budget.": "Kulud on {percent}% eelarvest.", + "No suggestion: the project has no budget.": "Soovitust pole: projektil pole eelarvet.", + "No suggestion: no costs are recorded for this project yet.": "Soovitust pole: sellele projektile pole veel kulusid kirjendatud.", + "The report was not saved. Only the project owner can write status reports.": "Aruannet ei salvestatud. Olukorra aruandeid saab kirjutada ainult projekti omanik.", + "No report": "Aruanne puudub", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Samade inimeste juhitavate projektide rühm, näiteks osakond või programm. Selle juhid loevad iga selles olevat projekti.", + "The name of the portfolio": "Portfelli nimi", + "What the portfolio holds and who runs it": "Mida portfell sisaldab ja kes seda juhib", + "A colour for the portfolio's section in project lists": "Portfelli jaotise värv projektiloendites", + "Managers": "Juhid", + "Nextcloud user UIDs of the people who run the portfolio": "Portfelli juhtivate inimeste Nextcloudi kasutajatunnused", + "Order": "Järjekord", + "Where the portfolio comes in project lists, lowest first": "Portfelli koht projektiloendites, väikseim eespool", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Selle portfelli oma riskiskaala JSON-ina, samas kujus nagu kogu rakenduse skaala. Tühi tähendab rakenduse skaalat.", + "Portfolio readers": "Portfelli lugejad", + "Nextcloud user UIDs of the managers of the project's portfolio": "Projekti portfelli juhtide Nextcloudi kasutajatunnused", + "The portfolio this project belongs to": "Portfell, kuhu see projekt kuulub", + "No portfolio": "Portfell puudub", + "All portfolios": "Kõik portfellid", + "You read this project as a manager of its portfolio. Only its members change it.": "Loed seda projekti selle portfelli juhina. Muudavad seda ainult selle liikmed.", + "Portfolios": "Portfellid", + "Portfolio status": "Portfelli seis", + "No portfolios yet": "Portfelle veel pole", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administraator lisab portfellid jaotises Projektid, Portfellid. Portfelli projektid on siin loetletud koos nende seisuga.", + "Roll-up": "Kokkuvõte", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} graafikus, {atRisk} ohus, {offTrack} graafikust väljas, {noReport} aruandeta", + "No project in this portfolio that you can read.": "Selles portfellis pole projekti, mida saaksid lugeda.", + "Start": "Algus", + "End": "Lõpp", + "Budget": "Eelarve", + "Last report": "Viimane aruanne", + "Out of date": "Aegunud", + "Portfolio timeline": "Portfelli ajatelg", + "Zoom": "Suurendus", + "Could not load the timeline": "Ajatelge ei õnnestunud laadida", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administraator lisab portfellid jaotises Projektid, Portfellid. Portfelli projektid on siin ühel ajateljel.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Ava projekt, et näha selle etappe ja ülesandeid. Ajatelg on kirjutuskaitstud.", + "Phase: {title}": "Etapp: {title}", + "Left out because you cannot read them: {count} projects": "Välja jäetud, sest sa ei saa neid lugeda: {count} projekti", + "Week": "Nädal", + "Day": "Päev", + "Month": "Kuu", + "Please try again later.": "Proovi hiljem uuesti.", + "Status reports": "Seisuaruanded", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Mitme päeva pärast märgitakse projekti viimane seisuaruanne portfelli ülevaates aegunuks", + "Reporting period (days)": "Aruandlusperiood (päevades)", + "The reporting period is a whole number of days from 1 to 365.": "Aruandlusperiood on täisarv päevi vahemikus 1 kuni 365.", + "Reporting period saved": "Aruandlusperiood salvestatud", + "The reporting period was not saved. Please try again.": "Aruandlusperioodi ei salvestatud. Proovi uuesti.", + "Every project of a portfolio with its status per aspect, rolled up.": "Portfelli iga projekt koos seisuga aspektide kaupa, kokkuvõtlikult.", + "The projects of a portfolio on one timeline.": "Portfelli projektid ühel ajateljel.", + "Phases": "Etapid", + "Add phase": "Lisa etapp", + "No phases yet": "Etappe veel pole", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Jaga projekt etappideks, näiteks algatamine, määratlemine ja teostus. Etapp suletakse, kui selle lõppdokument on üles laaditud.", + "{hours} hours": "{hours} tundi", + "Concluding document: {title}": "Lõppdokument: {title}", + "Concluding document missing": "Lõppdokument puudub", + "Move {title} up": "Liiguta {title} üles", + "Move {title} down": "Liiguta {title} alla", + "Close phase": "Sulge etapp", + "Phase": "Etapp", + "Files": "Failid", + "Notes": "Märkmed", + "Audit trail": "Auditilogi", + "Edit phase": "Muuda etappi", + "Name": "Nimi", + "Budget hours": "Eelarvetunnid", + "Could not save the phase. Please try again.": "Etappi ei õnnestunud salvestada. Proovi uuesti.", + "Close phase {title}": "Sulge etapp {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Etapp suletakse lõppdokumendiga: laadi see siin üles või vali üks etapi failidest.", + "Concluding document": "Lõppdokument", + "This phase has no files yet.": "Sellel etapil pole veel faile.", + "Upload a document": "Laadi dokument üles", + "The document was not uploaded. Please try again.": "Dokumenti ei laaditud üles. Proovi uuesti.", + "Upload the concluding document before you close this phase.": "Laadi lõppdokument üles enne selle etapi sulgemist.", + "This phase cannot be closed from its current status.": "Seda etappi ei saa selle praegusest olekust sulgeda.", + "The phase was not closed. Please try again.": "Etappi ei suletud. Proovi uuesti.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Selle etapi faili ID, mis etapi lõpetab. Etapi saab lõpetada alles siis, kui see on määratud ja fail on lisatud.", + "Import from Microsoft Project": "Impordi Microsoft Projectist", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Vali plaan, mis on Microsoft Projectist salvestatud XML-vormingus. Midagi ei impordita enne, kui kinnitad.", + "Plan file": "Plaanifail", + "What the import creates": "Mida import loob", + "Tasks": "Ülesanded", + "Sub-tasks": "Alamülesanded", + "Milestones": "Verstapostid", + "Links": "Seosed", + "Already imported, updated in place: {count}": "Juba imporditud, uuendatud kohapeal: {count}", + "What does not carry over": "Mis üle ei tule", + "Tasks with resources, which are not imported: {count}": "Ressurssidega ülesanded, mida ei impordita: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tasemest 3 sügavamad ülesanded, paigutatud oma 2. taseme ülesande alla: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Muud kui lõpp-algus seosed, imporditud seotud seostena: {count}", + "Link lags, which are dropped: {count}": "Seoste viivitused, mis jäetakse välja: {count}", + "Links to a summary task, which are not imported: {count}": "Seosed kokkuvõtteülesandega, mida ei impordita: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Seosed selle plaani väliste ülesannetega, mida ei impordita: {count}", + "No longer in the plan": "Pole enam plaanis", + "These stay in the project; remove them yourself if they are no longer needed.": "Need jäävad projekti; eemalda need ise, kui neid enam vaja pole.", + "Import": "Impordi", + "Close": "Sulge", + "The plan is imported: {created} created, {updated} updated.": "Plaan on imporditud: {created} loodud, {updated} uuendatud.", + "Links that would close a loop were left out: {count}": "Silmuse sulgevad seosed jäeti välja: {count}", + "The import stopped part-way. Run it again to finish it.": "Import peatus poolel teel. Käivita see uuesti, et see lõpetada.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Salvesta plaan Microsoft Projectis valikuga Fail, Salvesta nimega, XML-vorming, ja impordi see fail.", + "This file declares a DOCTYPE or entities, which are not accepted.": "See fail deklareerib DOCTYPE'i või olemeid, mida ei aktsepteerita.", + "The file is larger than 10 MB.": "Fail on suurem kui 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plaanis on üle 2000 ülesande, rohkem kui üks import võtab.", + "This file is not a Microsoft Project plan in XML format.": "See fail ei ole XML-vormingus Microsoft Projecti plaan.", + "Choose a file to import.": "Vali imporditav fail.", + "Only the project owner can import a plan.": "Ainult projekti omanik saab plaani importida.", + "The plan could not be read. Please try again.": "Plaani ei saanud lugeda. Proovi uuesti.", + "Linked case: {title}": "Seotud menetlus: {title}", + "Linked to a case": "Seotud menetlusega", + "Hand over to case": "Anna menetlusele üle", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopeerib iga projekti ja selle ülesannete faili ning projekti kirjeldava faili muutmata kujul seotud menetlusse.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopeeritud faile: {count}", + "Files that failed: {names}": "Ebaõnnestunud failid: {names}", + "The handover failed. Please try again.": "Üleandmine ebaõnnestus. Proovi uuesti.", + "The linked case could not be found, or you cannot open it.": "Seotud menetlust ei leitud või sa ei saa seda avada.", + "Case handovers": "Üleandmised menetlusele", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Iga kord, kui projekti failid ja metaandmed menetlusele üle anti: millal, kes, millisele menetlusele, iga kopeeritud fail koos SHA-256-ga ja ebaõnnestunud failid.", + "Finance": "Rahandus", + "Add cost line": "Lisa kulurida", + "Delivery terms": "Tarnetingimused", + "Billing model": "Arveldusmudel", + "Budget in euro": "Eelarve eurodes", + "Budget in hours": "Eelarve tundides", + "Hourly rate in euro": "Tunnihind eurodes", + "Planned start": "Kavandatud algus", + "Planned end": "Kavandatud lõpp", + "Planned dates": "Kavandatud kuupäevad", + "Budget {amount}": "Eelarve {amount}", + "No budget agreed": "Eelarves pole kokku lepitud", + "Hours": "Tunnid", + "Only the project owner and the portfolio managers see the amounts.": "Summasid näevad ainult projekti omanik ja portfelli haldurid.", + "Budget against cost per category": "Eelarve ja kulud kategooriate kaupa", + "Labour (booked time)": "Töö (registreeritud aeg)", + "No category": "Kategooriata", + "Hours are not available": "Tunnid pole saadaval", + "Not yet assigned to a category": "Pole veel kategooriale määratud", + "Total": "Kokku", + "{spent} spent, {remaining} remaining": "{spent} kulutatud, {remaining} alles", + "Budget against cost per phase": "Eelarve ja kulud etappide kaupa", + "No phase": "Etapita", + "Cost lines": "Kuluread", + "From the finance system": "Finantssüsteemist", + "Edit cost line {amount}": "Muuda kulurida {amount}", + "No cost lines yet": "Kuluridu veel pole", + "Commitments": "Kohustused", + "Actual cost": "Tegelik kulu", + "Forecast": "Prognoos", + "Remaining": "Alles", + "Not planned yet": "Pole veel kavandatud", + "{start} to {end}": "{start} kuni {end}", + "The terms were not saved. Please try again.": "Tingimusi ei salvestatud. Proovi uuesti.", + "Terms saved": "Tingimused salvestatud", + "Fixed price": "Kindel hind", + "Hourly": "Tunnipõhine", + "Not billed": "Arvet ei esitata", + "Commitment": "Kohustus", + "Edit cost line": "Muuda kulurida", + "Kind": "Liik", + "Amount in euro": "Summa eurodes", + "Remove": "Eemalda", + "Could not save the cost line. Only the project owner changes the money of a project.": "Kulurida ei saanud salvestada. Projekti raha muudab ainult projekti omanik.", + "Could not remove the cost line. Please try again.": "Kulurida ei saanud eemaldada. Proovi uuesti.", + "{amount} over budget": "{amount} üle eelarve", + "Cost categories": "Kulukategooriad", + "The categories every project splits its budget and costs into, one per line": "Kategooriad, millesse iga projekt oma eelarve ja kulud jagab, üks rea kohta", + "Categories": "Kategooriad", + "Give at least one category, each name once.": "Anna vähemalt üks kategooria, iga nimi üks kord.", + "Cost categories saved": "Kulukategooriad salvestatud", + "The cost categories were not saved. Please try again.": "Kulukategooriaid ei salvestatud. Proovi uuesti.", + "Finance line": "Finantsrida", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Üks projekti rahasumma: eelarve, kohustus, tegelik kulu või prognoos, kulukategoorias ja soovi korral etapis. Sisestab projekti omanik või saadab finantssüsteem integratsioonirakenduse kaudu.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt, kuhu summa kuulub. Tühi finantssüsteemi rea puhul, mille projektinumber ei vasta ühelegi projektile.", + "The phase this amount belongs to, if any": "Etapp, kuhu summa kuulub, kui see on olemas", + "The cost category, one of the categories the admin set up": "Kulukategooria, üks administraatori seadistatud kategooriatest", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Kas summa on eelarve, kohustus, tegelik kulu või prognoos", + "Amount": "Summa", + "The amount in the reporting currency (euro)": "Summa aruandlusvaluutas (euro)", + "The date the amount was booked or is expected": "Kuupäev, millal summa kirjendati või on oodata", + "What the amount is for": "Milleks summa on", + "Whether a person entered the line or the finance system sent it": "Kas rea sisestas inimene või saatis selle finantssüsteem", + "Entered by hand": "Käsitsi sisestatud", + "Finance line id": "Finantsrea ID", + "The finance system's own id of this line. One imported line per id.": "Selle rea oma ID finantssüsteemis. Üks imporditud rida ID kohta.", + "Project number": "Projektinumber", + "The project number the finance system sent, matched against the project key": "Finantssüsteemi saadetud projektinumber, mida võrreldakse projekti võtmega", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Rea projekti portfell, kopeeritud projektist, et portfelli kogusummad vajaksid ühte filtrit", + "Finance readers": "Finantslugejad", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nende inimeste Nextcloudi kasutaja-UID-d, kes võivad summat näha: projekti omanik ja portfelli haldurid", + "Project owner": "Projekti omanik", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Projekti omaniku Nextcloudi kasutaja-UID; tema võib käsitsi ridu muuta ja eemaldada", + "How the client pays: not billed, a fixed price, or by the hour.": "Kuidas klient maksab: arvet ei esitata, kindel hind või tunnipõhine.", + "Portfolio finance": "Portfelli rahandus", + "You cannot see the money of any project in this portfolio": "Sa ei näe selle portfelli ühegi projekti raha", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Server tagastas kuluridu väljaspool seda portfelli olevatest projektidest, seega võivad need kogusummad olla valed.", + "Projects left out because you cannot see their money: {count}": "Välja jäetud projektid, sest sa ei näe nende raha: {count}", + "Unmatched finance lines": "Sobitamata finantsread", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Eelarve, kohustused, tegelik kulu ja prognoos portfelli kohta kokku.", + "Subprojects": "Alamprojektid", + "{done} of {total}": "{done}/{total}", + "{done} of {total} tasks done, including subprojects": "{done}/{total} ülesannet tehtud, alamprojektid kaasa arvatud", + "Show the subprojects of {title}": "Näita projekti {title} alamprojekte", + "Hide the subprojects of {title}": "Peida projekti {title} alamprojektid", + "Part of": "Kuulub", + "No parent project": "Ülemprojekt puudub", + "A project cannot sit under one of its own subprojects.": "Projekt ei saa olla oma alamprojekti all.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projektid pesastuvad kuni kolm taset: programm, projekt ja alamprojekt.", + "Parent project": "Ülemprojekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt, mille all see projekt on, näiteks programm. Projektid pesastuvad kuni kolm taset.", + "Yes": "Jah", + "No": "Ei", + "{label} (required)": "{label} (kohustuslik)", + "{label} is required": "{label} on kohustuslik", + "Project field": "Projekti väli", + "A field an admin adds to every project, such as a policy area or a contract value.": "Väli, mille administraator lisab igale projektile, näiteks poliitikavaldkond või lepingu väärtus.", + "Key": "Võti", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Püsiv nimi, mille all väärtus salvestatakse, lower camel case kujul. Hoia see samaks, kui projektid seda kasutavad.", + "Label": "Silt", + "The name people see next to the field": "Nimi, mida inimesed välja kõrval näevad", + "What the field holds": "Mida väli sisaldab", + "Text": "Tekst", + "Number": "Arv", + "Choice": "Valik", + "Person": "Isik", + "Yes or no": "Jah või ei", + "Options": "Valikud", + "The choices of a choice field": "Valikvälja valikud", + "Required": "Kohustuslik", + "Whether a project must fill in the field": "Kas projekt peab välja täitma", + "Where the field appears, lowest first": "Kus väli kuvatakse, väikseim enne", + "Applies to": "Kehtib", + "What the field is added to": "Millele väli lisatakse", + "Custom fields": "Omad väljad", + "The values of the project fields an admin defined, keyed by the field's key.": "Administraatori määratud projektiväljade väärtused välja võtme järgi.", + "Project fields": "Projekti väljad", + "Related": "Seotud", + "Remove link": "Eemalda link", + "Link type": "Lingi tüüp", + "Relates to": "Seotud ülesandega", + "Duplicates": "Dubleerib", + "Project key": "Projekti võti", + "Every task number starts with it, such as VERG-42.": "Iga ülesande number algab sellega, näiteks VERG-42.", + "This key is already used by another project.": "Seda võtit kasutab juba teine projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Kasutage 2 kuni 10 tähte ja numbrit, alustades tähega.", + "The key cannot change once tasks carry it.": "Võti ei saa muutuda, kui ülesanded seda kannavad.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt salvestatud. Olemasolevad ülesanded saavad numbrid taustal.", + "Next task number": "Järgmise ülesande number", + "The number the next task of this project gets in its key. Only the system writes it.": "Number, mille selle projekti järgmine ülesanne oma võtmes saab. Seda kirjutab ainult süsteem.", + "Restore {title}": "Taasta {title}", + "Restore": "Taasta", + "Project restored": "Projekt taastatud", + "Could not restore the project": "Projekti ei õnnestunud taastada", + "Bring this project back to the active list.": "Too see projekt tagasi aktiivsete projektide loendisse.", + "Restore project": "Taasta projekt", + "Request reason": "Taotluse põhjus", + "Why the requester needs this project. Filled in when the project is requested.": "Miks taotleja seda projekti vajab. Täidetakse taotlemisel.", + "Reviewed by": "Läbi vaadanud", + "The user who approved or rejected the request.": "Kasutaja, kes taotluse kinnitas või tagasi lükkas.", + "Reviewed at": "Läbi vaadatud", + "When the request was approved or rejected.": "Millal taotlus kinnitati või tagasi lükati.", + "Review note": "Läbivaataja märkus", + "The reviewer's reason, shown to the requester when a request is not approved.": "Läbivaataja põhjendus, mida taotleja näeb, kui taotlust ei kinnitata.", + "Members of these groups": "Nende gruppide liikmed", + "Groups that may create projects": "Grupid, kes võivad projekte luua", + "The group {group} no longer exists. Save to remove it.": "Gruppi {group} enam pole. Salvestage, et see eemaldada.", + "Review project request": "Vaata projektitaotlus läbi", + "Requested by": "Taotleja", + "Why it is needed": "Miks seda vaja on", + "Desired start date": "Soovitud alguskuupäev", + "Why is it not approved?": "Miks seda ei kinnitata?", + "Give a reason. The requester sees it.": "Andke põhjus. Taotleja näeb seda.", + "Approve": "Kinnita", + "Reject": "Lükka tagasi", + "Reject request": "Lükka taotlus tagasi", + "The review was not saved. Try again.": "Läbivaatust ei salvestatud. Proovige uuesti.", + "This project is waiting for review": "See projekt ootab läbivaatust", + "This request was not approved": "Seda taotlust ei kinnitatud", + "Reason: {note}": "Põhjus: {note}", + "Review request": "Vaata taotlus läbi", + "Request a project": "Taotle projekti", + "Step {step} of 2": "Samm {step}/2", + "Why is this project needed?": "Miks seda projekti vaja on?", + "Give a reason. The reviewer reads it.": "Andke põhjus. Läbivaataja loeb seda.", + "Back": "Tagasi", + "Next": "Edasi", + "Send request": "Saada taotlus", + "The request was not sent. Try again.": "Taotlust ei saadetud. Proovige uuesti.", + "Requested": "Taotletud", + "Not approved": "Pole kinnitatud", + "Your request was sent": "Teie taotlus on saadetud", + "Let everyone else request a project": "Luba kõigil teistel projekti taotleda", + "Add a task": "Lisa ülesanne", + "Delete task": "Kustuta ülesanne", + "Edit task": "Muuda ülesannet", + "Write": "Kirjuta", + "Preview": "Eelvaade", + "Markdown works here: headings, lists and links.": "Siin töötab Markdown: pealkirjad, loendid ja lingid.", + "Could not save the task. Please try again.": "Ülesannet ei õnnestunud salvestada. Proovi uuesti.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Ülesandele \"{title}\" on aega kirjendatud, seega ei saa seda kustutada. Selle asemel saad selle tühistada: ajakanded jäävad alles.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Kas kustutada \"{title}\"? Ka selle lingid teistele ülesannetele eemaldatakse. Seda ei saa tagasi võtta.", + "Keep task": "Jäta ülesanne alles", + "Cancel task": "Tühista ülesanne", + "Only the reporter, the project owner or an admin can delete this task.": "Seda ülesannet saab kustutada ainult teataja, projekti omanik või administraator.", + "Could not delete the task. Please try again.": "Ülesannet ei õnnestunud kustutada. Proovi uuesti.", + "Could not cancel the task. Please try again.": "Ülesannet ei õnnestunud tühistada. Proovi uuesti.", + "Responsible": "Vastutaja", + "Also working on this": "Töötavad ka selle kallal", + "Labels": "Sildid", + "Could not change the priority. Please try again.": "Prioriteeti ei õnnestunud muuta. Proovi uuesti.", + "Other project members who work on this task alongside the person responsible.": "Teised projekti liikmed, kes töötavad selle ülesande kallal koos vastutajaga.", + "Duplicate": "Kopeeri", + "Could not copy the task. Please try again.": "Ülesannet ei õnnestunud kopeerida. Proovi uuesti.", + "Subtasks": "Alamülesanded", + "{done} of {total} done": "{done} / {total} valmis", + "Add a subtask": "Lisa alamülesanne", + "Checklist": "Kontrollnimekiri", + "Checklist item actions": "Nimekirja punkti toimingud", + "Add a checklist item": "Lisa nimekirja punkt", + "Subtasks: {estimate} estimated, {logged} logged": "Alamülesanded: hinnang {estimate}, kirjendatud {logged}", + "Total estimate: {total}": "Koguhinnang: {total}", + "Part of {title}": "Osa ülesandest {title}", + "Checklist: {count} done": "Kontrollnimekiri: {count} valmis", + "This task has subtasks: {count}.": "Sellel ülesandel on alamülesandeid: {count}.", + "Keep subtasks as separate tasks": "Jäta alamülesanded eraldi ülesanneteks", + "Delete subtasks too": "Kustuta ka alamülesanded", + "Copy of {title}": "Koopia: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Ülesanne kopeeriti, kuid mitte kõik selle alamülesanded. Kontrolli koopiat.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Väikesed sammud ülesande sees. Igal punktil on id, tekst ja märge, kas see on valmis.", + "Open work per person and per project.": "Avatud töö inimeste ja projektide kaupa.", + "View": "Vaade", + "By person": "Inimeste kaupa", + "By project": "Projektide kaupa", + "Hours left": "Jäänud tunde", + "Tasks without an estimate": "Hinnanguta ülesanded", + "Due in 14 days": "Tähtaeg 14 päeva jooksul", + "Shared": "Jagatud", + "Unassigned": "Määramata", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Näidatakse tööd projektides, mida sa näed. Tunnid lähevad vastutajale; jagatud ülesanded loetakse ilma tundideta.", + "No open work in these projects.": "Nendes projektides pole avatud tööd.", + "Open work": "Avatud töö", + "{count} open tasks": "{count} avatud ülesannet", + "Create a project to see capacity here.": "Loo projekt, et siin koormust näha.", + "My tasks": "Minu ülesanded", + "Show all my tasks": "Näita kõiki minu ülesandeid", + "No tasks assigned to you": "Sulle pole ülesandeid määratud", + "Browse projects": "Sirvi projekte", + "Later": "Hiljem", + "Due {date}": "Tähtaeg {date}", + "Could not change the status. Please try again.": "Olekut ei saanud muuta. Proovi uuesti.", + "Completed today": "Täna lõpetatud", + "My open tasks": "Minu avatud ülesanded", + "My overdue tasks": "Minu hilinenud ülesanded", + "My tasks in progress": "Minu pooleliolevad ülesanded", + "Pin to the top": "Kinnita üles", + "Unpin": "Vabasta", + "Pinned": "Kinnitatud", + "Actions for {title}": "Toimingud: {title}", + "Could not save your project order. Please try again.": "Projektide järjekorda ei saanud salvestada. Proovi uuesti.", + "No boards yet": "Tahvleid veel pole", + "Create a project to get a board.": "Loo projekt, et saada tahvel.", + "Use the Projects page to create and manage your projects and tasks.": "Kasuta lehte Projektid oma projektide ja ülesannete loomiseks ja haldamiseks.", + "Go to projects": "Mine projektidesse", + "You are not a member of any projects yet.": "Sa pole veel ühegi projekti liige.", + "Could not search for users. Please try again.": "Kasutajaid ei õnnestunud otsida. Proovi uuesti.", + "Project creation is restricted to administrators.": "Projekte saavad luua ainult administraatorid.", + "Only the project owner or an administrator can delete this project.": "Selle projekti saab kustutada ainult projekti omanik või administraator.", + "No projects are available to you yet. Ask an administrator to create one.": "Sulle pole veel ühtegi projekti saadaval. Palu administraatoril üks luua.", + "Due: {date}": "Tähtaeg: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Algus- või tähtajaga ülesanded kuvatakse ajajoonel. Lisa kuupäevad, et neid siin näha.", + "You do not have access to this project.": "Sul pole sellele projektile juurdepääsu.", + "Zoom level": "Suumitase", + "Unscheduled": "Planeerimata", + "Start: {date}": "Algus: {date}", + "Today": "Täna", + "No scheduled tasks": "Planeeritud ülesandeid pole", + "An unexpected error occurred.": "Tekkis ootamatu viga.", + "Column {number} name": "Veeru {number} nimi", + "Failed to save creation policy": "Loomise reeglit ei õnnestunud salvestada", + "All authenticated users": "Kõik sisselogitud kasutajad", + "Control who may create new projects": "Määra, kes tohib uusi projekte luua", + "Administrators only": "Ainult administraatorid", + "Project creation": "Projektide loomine", + "Allow project creation": "Luba projektide loomine", + "Creation policy saved successfully": "Loomise reegel salvestatud", + "Initializing…": "Käivitamine…", + "e.g. 2h 30m, 90m, 1.5h": "nt 2h 30m, 90m, 1.5h", + "Log time": "Kirjuta aega", + "Save estimate": "Salvesta hinnang", + "Logged: {logged}": "Kirjutatud: {logged}", + "over by {amount}": "{amount} üle", + "Time tracking": "Ajaarvestus", + "Estimate": "Hinnang", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Sisesta kehtiv hinnang (nt 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Sisesta kehtiv kestus (nt 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Ajakannet ei õnnestunud salvestada. Proovi uuesti.", + "Edit time entry": "Muuda ajakannet", + "Duration": "Kestus", + "Date range": "Ajavahemik", + "Last week": "Eelmine nädal", + "No time logged": "Aega pole kirjutatud", + "Log time on a task to see it here.": "Kirjuta ülesandele aega, et seda siin näha.", + "To date": "Kuupäevani", + "This week": "See nädal", + "Total: {total}": "Kokku: {total}", + "From date": "Kuupäevast", + "Custom range": "Kohandatud vahemik", + "All time": "Kogu aeg", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Ülesannet ei õnnestunud kustutada, seega võivad andmed alles jääda. Kustuta projekt uuesti.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Ajakannet ei õnnestunud kustutada, seega võivad andmed alles jääda. Kustuta projekt uuesti.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Veergu ei õnnestunud kustutada, seega võivad andmed alles jääda. Kustuta projekt uuesti.", + "Could not delete the project. Please try again.": "Projekti ei õnnestunud kustutada. Proovi uuesti.", + "Notification settings": "Teavituste seaded", + "Configure when due-date reminders are sent": "Määra, millal tähtaja meeldetuletused saadetakse", + "Due-date reminder lead time (hours)": "Meeldetuletuse ennetusaeg (tundi)", + "Lead time must be between 1 and 336 hours": "Ennetusaeg peab olema 1 kuni 336 tundi", + "Reminder lead time saved successfully": "Meeldetuletuse ennetusaeg salvestatud", + "Failed to save reminder lead time": "Meeldetuletuse ennetusaega ei õnnestunud salvestada", + "Notifications": "Teavitused", + "Notify me 1 day before a task's due date": "Teavita mind 1 päev enne ülesande tähtaega", + "Draft": "Mustand", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Kas tund on mustand, mida näeb ainult õpetaja, toimub või jääb ära.", + "New release": "Uus väljalase", + "Roadmap chart. The same releases and epics are listed below.": "Tegevuskava diagramm. Samad väljalasked ja eepikud on allpool loendis.", + "Nothing on the roadmap yet": "Tegevuskaval pole veel midagi", + "Releases with a target date and epics with dated tasks appear here.": "Siin kuvatakse sihtkuupäevaga väljalasked ja kuupäevastatud ülesannetega eepikud.", + "Releases": "Väljalasked", + "No releases yet": "Väljalaskeid veel pole", + "Target date: {date}": "Sihtkuupäev: {date}", + "No target date": "Sihtkuupäev puudub", + "Edit {name}": "Muuda {name}", + "Mark {name} as released": "Märgi {name} välja lastuks", + "Mark as released": "Märgi välja lastuks", + "Epics": "Eepikud", + "No epics yet. Open a task to make it an epic.": "Eepikuid veel pole. Ava ülesanne, et teha sellest eepik.", + "Not scheduled yet": "Veel ajastamata", + "Planned": "Planeeritud", + "Released": "Välja lastud", + "Edit release": "Muuda väljalaset", + "Target date": "Sihtkuupäev", + "Could not save the release. Please try again.": "Väljalaset ei õnnestunud salvestada. Proovi uuesti.", + "Every task of this release is done or cancelled.": "Selle väljalaske kõik ülesanded on tehtud või tühistatud.", + "Not finished yet: {count}": "Veel lõpetamata: {count}", + "What happens to these tasks?": "Mis saab nendest ülesannetest?", + "Move to {name}": "Teisalda väljalaskesse {name}", + "Remove the release": "Eemalda väljalase", + "Keep it on {name}": "Jäta need väljalaskesse {name}", + "Could not mark the release as released. Please try again.": "Väljalaset ei õnnestunud välja lastuks märkida. Proovi uuesti.", + "Roadmap": "Tegevuskava", + "Tasks or roadmap": "Ülesanded või tegevuskava", + "Release": "Väljalase", + "Epic": "Eepik", + "This task is an epic": "See ülesanne on eepik", + "A named, dated delivery of a project that its tasks are planned against.": "Projekti nimeline ja kuupäevastatud tarne, mille järgi selle ülesandeid planeeritakse.", + "Name of the release": "Väljalaske nimi", + "The project this release belongs to": "Projekt, kuhu see väljalase kuulub", + "What this release delivers": "Mida see väljalase tarnib", + "When work on the release starts": "Millal väljalaske kallal töö algab", + "The date the release is due": "Kuupäev, milleks väljalase peab valmis olema", + "Whether the release is planned, released or archived": "Kas väljalase on planeeritud, välja lastud või arhiveeritud", + "Released on": "Välja lastud", + "When the release was marked as released": "Millal väljalase välja lastuks märgiti", + "The release this task is planned for": "Väljalase, mille jaoks see ülesanne on planeeritud", + "Board view options": "Tahvli vaate valikud", + "Colour cards": "Värvi kaardid", + "No colour": "Värvita", + "By label": "Sildi järgi", + "Swimlanes": "Ujumisrajad", + "No swimlanes": "Ujumisradadeta", + "By assignee": "Täitja järgi", + "By epic": "Eepose järgi", + "No assignee": "Määramata", + "No epic": "Eeposeta", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kaardid jäävad oma eepose reale. Muuda eepost ülesande lehel.", + "Hand over to": "Anna üle", + "Could not save your board view. It applies until you reload.": "Tahvli vaadet ei salvestatud. See kehtib kuni lehe uuesti laadimiseni.", + "Timetable wish": "Tunniplaanisoov", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Soov, mida generaator arvestab. Ranget soovi peab ta alati kinni, paindlikku siis, kui saab.", + "Whether the wish is about a teacher, a group, a room or one activity": "Kas soov puudutab õpetajat, rühma, ruumi või üht tegevust", + "Teacher": "Õpetaja", + "Group": "Rühm", + "Reference": "Viide", + "The user, group, room or activity the wish is about": "Kasutaja, rühm, ruum või tegevus, mida soov puudutab", + "What the wish asks for": "Mida soov palub", + "Not on these periods": "Mitte nendel tundidel", + "Preferably not on these periods": "Pigem mitte nendel tundidel", + "At most a number of lessons a day": "Kõige rohkem teatud arv tunde päevas", + "No free periods between lessons": "Tundide vahel aknaid pole", + "Always the same room": "Alati sama ruum", + "Periods": "Tunnid", + "The periods of the week the wish is about, such as wed-5": "Nädala tunnid, mida soov puudutab, näiteks wed-5", + "Limit": "Piir", + "The most lessons a day, for a wish of that kind": "Kõige rohkem tunde päevas, sellist liiki soovi puhul", + "Strength": "Tugevus", + "Whether the generator must keep the wish or should keep it": "Kas generaator peab või peaks soovist kinni pidama", + "Hard": "Range", + "Soft": "Paindlik", + "Weight": "Kaal", + "How much a soft wish counts, from 1 to 3": "Kui palju paindlik soov loeb, 1 kuni 3", + "Why the wish exists": "Miks soov olemas on", + "Timetable scenario": "Tunniplaani stsenaarium", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Üks nädalamuster, generaatori tehtud või praegusest tunniplaanist võetud. See hoiab oma sisendit ja seda, kui hästi ta soove täidab.", + "The name timetablers know the scenario by": "Nimi, mille all tunniplaani koostajad stsenaariumi tunnevad", + "Whether the generator made it or it came from the current timetable": "Kas generaator tegi selle või tuleb see praegusest tunniplaanist", + "Generated": "Genereeritud", + "From the current timetable": "Praegusest tunniplaanist", + "Week of": "Nädal alates", + "The Monday of the first week of the window": "Perioodi esimese nädala esmaspäev", + "Window start": "Perioodi algus", + "The first day the week pattern applies to": "Esimene päev, mille kohta nädalamuster kehtib", + "Window end": "Perioodi lõpp", + "The last day the week pattern applies to": "Viimane päev, mille kohta nädalamuster kehtib", + "Waiting, generating, done, failed, or published as draft lessons": "Ootel, genereerimisel, valmis, ebaõnnestus või avaldatud mustandtundidena", + "Waiting": "Ootel", + "Generating": "Genereerimisel", + "Failed": "Ebaõnnestus", + "Published": "Avaldatud", + "Seed": "Seeme", + "The number the generator starts from, so a run can be repeated": "Arv, millest generaator alustab, et käivitust saaks korrata", + "Input": "Sisend", + "The periods, rooms, lessons and wishes the scenario was made from": "Tunnid, ruumid, õppetunnid ja soovid, millest stsenaarium tehti", + "Placements": "Paigutused", + "Each lesson with the period and room it was given": "Iga õppetund koos saadud tunni ja ruumiga", + "Unplaced lessons": "Paigutamata õppetunnid", + "Lessons without a place, each with the hard wish that blocked it": "Kohata õppetunnid, igaüks koos range sooviga, mis selle peatas", + "Broken wishes": "Rikutud soovid", + "The wishes this scenario breaks, with the lessons that break them": "Soovid, mida see stsenaarium rikub, koos neid rikkuvate õppetundidega", + "Measures": "Mõõdikud", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Paigutatud õppetunnid, rikutud soovid, õpetajate aknad, tunnid päevas ja ruumikasutus", + "Reason": "Põhjus", + "Why the run failed": "Miks käivitus ebaõnnestus", + "Published at": "Avaldatud", + "When the scenario was written out as draft lessons": "Millal stsenaarium kirjutati mustandtundideks", + "Edit wish": "Muuda soovi", + "New wish": "Uus soov", + "Hard: the generator always keeps it": "Kohustuslik: generaator peab sellest alati kinni", + "Soft: the generator keeps it where it can": "Paindlik: generaator peab sellest kinni, kui saab", + "Weight (1 to 3)": "Kaal (1 kuni 3)", + "Most lessons a day": "Kõige rohkem tunde päevas", + "Period": "Tund", + "{day} period {number}": "{day} tund {number}", + "Teacher (user name)": "Õpetaja (kasutajanimi)", + "Activity (group:subject)": "Tegevus (rühm:aine)", + "Say who or what the wish is about.": "Märkige, kelle või mille kohta soov on.", + "Choose at least one period.": "Valige vähemalt üks tund.", + "The limit is a whole number of 1 or more.": "Piirang on täisarv 1 või rohkem.", + "Timetable": "Tunniplaan", + "Wishes": "Soovid", + "Timetable wishes": "Tunniplaani soovid", + "Generator run": "Generaatori käivitus", + "Generator progress": "Generaatori edenemine", + "The run failed: {reason}": "Käivitus ebaõnnestus: {reason}", + "{placed} of {lessons} lessons placed": "Paigutatud {placed} tundi {lessons}-st", + "Generate again": "Genereeri uuesti", + "Generate": "Genereeri", + "Every lesson has a place.": "Igal tunnil on koht.", + "Lesson": "Tund", + "No free period and room": "Vaba tundi ja ruumi pole", + "Broken soft wishes": "Rikutud paindlikud soovid", + "Every soft wish is kept.": "Iga paindlik soov on täidetud.", + "Wish": "Soov", + "Lessons": "Tunnid", + "Generating: {percent}% of the time budget used": "Genereerimine: kasutatud {percent}% ajast", + "Waiting to start": "Ootab algust", + "Published as draft lessons": "Avaldatud mustandtundidena", + "Could not read the scenario.": "Stsenaariumi ei saanud lugeda.", + "Could not start the run.": "Käivitust ei saanud alustada.", + "Scenarios": "Stsenaariumid", + "Timetable scenarios": "Tunniplaani stsenaariumid", + "Scenario": "Stsenaarium", + "Take the current timetable": "Võta praegune tunniplaan", + "Could not take the current timetable.": "Praegust tunniplaani ei õnnestunud võtta.", + "Broken hard wishes": "Rikutud kohustuslikud soovid", + "Not on a period of the week grid": "Ei ole nädalavõrgu tunnil", + "Compare scenarios": "Võrdle stsenaariume", + "Scenarios to compare": "Võrreldavad stsenaariumid", + "Choose two or three scenarios to compare them.": "Valige võrdlemiseks kaks või kolm stsenaariumi.", + "Measure": "Näitaja", + "Best": "Parim", + "Lessons that differ": "Erinevad tunnid", + "No lesson differs.": "Ükski tund ei erine.", + "Not placed": "Paigutamata", + "{period} in {room}": "{period} ruumis {room}", + "Lessons placed": "Paigutatud tunnid", + "Lessons without a place": "Kohata tunnid", + "Clashes": "Kokkupõrked", + "Hard wishes broken": "Rikutud kohustuslikud soovid", + "Soft wishes broken": "Rikutud paindlikud soovid", + "Soft wishes broken, weighted": "Rikutud paindlikud soovid, kaalutud", + "Free periods between lessons, all teachers": "Aknatunnid, kõik õpetajad", + "Most free periods of one teacher": "Ühe õpetaja kõige rohkem aknatunde", + "Most lessons of one group on a day": "Ühe rühma kõige rohkem tunde päevas", + "Room use": "Ruumide kasutus", + "Publish as draft lessons": "Avalda mustandtundidena", + "Draft lessons written: {count}": "Mustandtunde kirjutatud: {count}", + "Could not publish the scenario.": "Stsenaariumi ei õnnestunud avaldada.", + "Rules": "Reeglid", + "Rules for {column}": "Veeru {column} reeglid", + "When a card enters this column": "Kui kaart jõuab sellesse veergu", + "Action": "Toiming", + "Set the priority": "Määra prioriteet", + "Assign to": "Määra täitjaks", + "Assign the person who moved the card": "Määra täitjaks kaardi liigutaja", + "Remove the assignee": "Eemalda täitja", + "Add a label": "Lisa silt", + "No longer a project member": "Pole enam projekti liige", + "This label no longer exists": "Seda silti enam ei ole", + "Add rule": "Lisa reegel", + "Remove rule": "Eemalda reegel", + "No rules yet. Add one to change a card when it enters this column.": "Reegleid veel pole. Lisa reegel, mis muudab kaarti, kui see jõuab sellesse veergu.", + "Could not save the rules. Please try again.": "Reegleid ei õnnestunud salvestada. Proovi uuesti.", + "1 rule runs when a card enters this column": "1 reegel käivitub, kui kaart jõuab sellesse veergu", + "{count} rules run when a card enters this column": "{count} reeglit käivitub, kui kaart jõuab sellesse veergu", + "Rules applied: {changes}": "Rakendatud reeglid: {changes}", + "assigned to {name}": "täitja {name}", + "assignee removed": "täitja eemaldatud", + "priority {priority}": "prioriteet {priority}", + "label {label}": "silt {label}", + "What happens to a card when it enters this column, applied in list order.": "Mis juhtub kaardiga, kui see jõuab sellesse veergu, loendi järjekorras.", + "Value": "Väärtus", + "What the rule does to the card.": "Mida reegel kaardiga teeb.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioriteet, kasutaja ID või sildi ID, mida toiming kasutab; tühi väärtuseta toimingute puhul.", + "is not": "ei ole", + "{dimension} is not": "{dimension} ei ole", + "Saved filters": "Salvestatud filtrid", + "No saved filters yet": "Salvestatud filtreid veel pole", + "Save filter": "Salvesta filter", + "Rename \"{name}\"": "Nimeta „{name}” ümber", + "Delete \"{name}\"": "Kustuta „{name}”", + "Clear filters": "Tühjenda filtrid", + "Showing {shown} of {total} tasks": "Kuvatud {shown} ülesannet {total}-st", + "Me": "Mina", + "No date": "Kuupäevata", + "Rename saved filter": "Nimeta salvestatud filter ümber", + "Share with the project": "Jaga projektiga", + "Give the filter a name": "Anna filtrile nimi", + "Could not save the filter. Please try again.": "Filtrit ei õnnestunud salvestada. Proovi uuesti.", + "Some labels in \"{name}\" no longer exist and were left out.": "Mõnda silti filtris „{name}” enam pole ja need jäeti välja.", + "Could not delete the filter. Please try again.": "Filtrit ei õnnestunud kustutada. Proovi uuesti.", + "Saved filter": "Salvestatud filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Ühe projekti nimega tahvlifilter, nähtav ainult salvestajale, kui seda pole projektiga jagatud.", + "The project whose board the filter applies to": "Projekt, mille tahvlile filter kehtib", + "The name the filter is listed under": "Nimi, millega filter loendis on", + "Saved by": "Salvestaja", + "Nextcloud user id of the person who saved the filter": "Filtri salvestaja Nextcloudi kasutaja-ID", + "Shared with the project": "Jagatud projektiga", + "Whether every project member sees and applies the filter": "Kas iga projekti liige näeb filtrit ja saab seda rakendada", + "Criteria": "Kriteeriumid", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filter: täitja, silt, prioriteet ja tähtaeg, igaüks väärtusega on või ei ole ja oma väärtustega", + "Cross-project view": "Projektiülene vaade", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Salvestatud projektide valik, mille ülesandeid näidatakse koos olekuradadel ja mida jagatakse nimetatud inimestega.", + "Shared with": "Jagatud", + "The name the view is listed under": "Nimi, mille all vaade on loetletud", + "Nextcloud user id of the person who saved the view": "Vaate salvestanud inimese Nextcloudi kasutaja-ID", + "Nextcloud user ids of the people the view is shared with": "Nende inimeste Nextcloudi kasutaja-ID-d, kellega vaadet jagatakse", + "The projects whose tasks the view shows, at most twenty": "Projektid, mille ülesandeid vaade näitab, kõige rohkem kakskümmend", + "1 project in this view is hidden from you.": "1 selle vaate projekt on sinu eest peidetud.", + "{count} projects in this view are hidden from you.": "{count} selle vaate projekti on sinu eest peidetud.", + "{project} has no column for {status}.": "Projektil {project} pole veergu olekule {status}.", + "This view does not exist or is not shared with you.": "Seda vaadet pole olemas või seda pole sinuga jagatud.", + "\"{task}\" moved to {status}.": "\"{task}\" viidi olekusse {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Projektiülesed vaated", + "New view": "Uus vaade", + "Edit view": "Muuda vaadet", + "Delete view": "Kustuta vaade", + "Give the view a name": "Anna vaatele nimi", + "Pick at least one project": "Vali vähemalt üks projekt", + "A view shows at most {max} projects": "Vaade näitab kõige rohkem {max} projekti", + "Could not save the view. Please try again.": "Vaadet ei õnnestunud salvestada. Proovi uuesti.", + "Could not delete the view. Please try again.": "Vaadet ei õnnestunud kustutada. Proovi uuesti.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Kas kustutada \"{title}\"? Projektid ja nende ülesanded jäävad samaks.", + "People see the tasks of the projects they are in, never more.": "Igaüks näeb ainult nende projektide ülesandeid, kus ta osaleb.", + "No views yet. A view shows the tasks of several of your projects together.": "Vaateid veel pole. Vaade näitab mitme sinu projekti ülesandeid koos.", + "Projects in view: {count}": "Projekte vaates: {count}", + "Notify me when a task is assigned to me": "Teavita mind, kui mulle määratakse ülesanne", + "Also send these to me by email": "Saada need mulle ka e-postiga", + "Add an email address in your Nextcloud personal settings to get mail.": "E-kirjade saamiseks lisa Nextcloudi isiklikes seadetes e-posti aadress.", + "Code link": "Koodilink", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Kommit, haru, ühendamistaotlus või probleem koodiplatvormil, mis on seotud ülesandega.", + "The task the link belongs to": "Ülesanne, millele link kuulub", + "The project of the task": "Ülesande projekt", + "Task key": "Ülesande võti", + "The task key the forge text named, such as VC-12": "Ülesande võti, mida koodiplatvormi tekst nimetas, näiteks VC-12", + "What the link points at": "Kuhu link viitab", + "Link": "Link", + "The address of the item in the forge": "Üksuse aadress koodiplatvormil", + "The commit message, branch name or merge request title": "Kommiti sõnum, haru nimi või ühendamistaotluse pealkiri", + "Repository": "Hoidla", + "The repository, such as acme/portal": "Hoidla, näiteks acme/portal", + "Forge id": "Id platvormil", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Üksuse enda id koodiplatvormil, näiteks github:acme/portal#42 või kommiti räsi", + "State": "Olek", + "The state of a merge request or issue": "Ühendamistaotluse või probleemi olek", + "Who made the commit or opened the merge request": "Kes tegi kommiti või avas ühendamistaotluse", + "When the commit was made or the merge request last changed": "Millal kommit tehti või ühendamistaotlus viimati muutus", + "Added by": "Lisaja", + "Whether a person added the link or the integration wrote it": "Kas lingi lisas inimene või kirjutas selle integratsioon", + "Nextcloud user UIDs of project members": "Projekti liikmete Nextcloudi kasutajatunnused", + "Add link": "Lisa link", + "Added by hand": "Lisatud käsitsi", + "Branch": "Haru", + "Code": "Kood", + "Commit": "Kommit", + "From the integration": "Integratsioonist", + "Link to a commit, branch or merge request": "Link kommitile, harule või ühendamistaotlusele", + "Merge request": "Ühendamistaotlus", + "Merged": "Ühendatud", + "No code linked yet. Name {key} in a commit message or paste a link.": "Koodi pole veel lingitud. Nimeta {key} kommiti sõnumis või kleebi link.", + "No code linked yet. Paste a link to a commit or merge request.": "Koodi pole veel lingitud. Kleebi link kommitile või ühendamistaotlusele.", + "Paste a web address that starts with https://.": "Kleebi veebiaadress, mis algab https://.", + "Remove link {title}": "Eemalda link {title}", + "The link could not be added.": "Linki ei õnnestunud lisada.", + "The link could not be removed.": "Linki ei õnnestunud eemaldada.", + "This link is already on the task.": "See link on ülesandel juba olemas.", + "Code forges": "Koodiplatvormid", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Seo GitHubi kommitid ja pull requestid ülesannetega. Integriq võtab sündmused vastu; planninq ei pöördu kunagi GitHubi poole.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Laadi seadistus alla ja impordi see Integriqi. Seejärel sisesta saladus reeglisse \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Lisa GitHubis hoidlale selle aadressi ja sama saladusega webhook. Vali sisutüübiks application/json ning sündmused push ja pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nimeta ülesande võti, näiteks VC-12, kommiti sõnumis, haru nimes või pull requesti pealkirjas. Link ilmub siis selle ülesande juurde.", + "Without Integriq, project members can still paste a link on the task page.": "Ilma Integriqita saavad projekti liikmed ikka lingi ülesande lehele kleepida.", + "Download the Integriq configuration": "Laadi alla Integriqi seadistus", + "Calendar": "Kalender", + "Previous": "Eelmine", + "Calendar view": "Kalendrivaade", + "Starts:": "Algab:", + "No tasks with a date in this month.": "Selles kuus pole kuupäevaga ülesandeid.", + "Week of {start} to {end}": "Nädal {start} kuni {end}", + "My calendar": "Minu kalender", + "Show as list": "Näita loendina", + "Show as calendar": "Näita kalendrina", + "Open my calendar": "Ava minu kalender", + "Nextcloud Tasks": "Nextcloudi ülesanded", + "Show my tasks in Nextcloud Tasks": "Näita minu ülesandeid Nextcloudi ülesannetes", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Sulle määratud või sinuga jagatud ülesanded ilmuvad loendis \"Planninq\" Nextcloudi ülesannetes ja kalendris. Seal tehtud muudatused asendatakse järgmise muudatusega Planninqis.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "See server ei saa Nextcloudi ülesannetesse kirjutada, seega eksport pole saadaval.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Haldab Planninq. Siin tehtud muudatused asendatakse järgmise muudatusega Planninqis.", + "Working days and holidays": "Tööpäevad ja pühad", + "Dates set on the timeline skip the days that are not working days.": "Ajajoonel määratud kuupäevad jätavad vahele päevad, mis ei ole tööpäevad.", + "Working weekdays": "Nädala tööpäevad", + "Non-working days": "Puhkepäevad", + "No non-working days yet.": "Puhkepäevi veel pole.", + "Add day": "Lisa päev", + "Year": "Aasta", + "Add Dutch national holidays": "Lisa Madalmaade riigipühad", + "Save working days": "Salvesta tööpäevad", + "Choose at least one working weekday.": "Vali vähemalt üks tööpäev.", + "Working days saved.": "Tööpäevad salvestatud.", + "Could not save the working days.": "Tööpäevi ei õnnestunud salvestada.", + "New Year's Day": "Uusaasta", + "Easter Sunday": "Ülestõusmispühade 1. päev", + "Easter Monday": "Ülestõusmispühade 2. päev", + "King's Day": "Kuningapäev", + "Liberation Day": "Vabastamispäev", + "Ascension Day": "Taevaminemispüha", + "Whit Sunday": "Nelipühade 1. päev", + "Whit Monday": "Nelipühade 2. päev", + "Christmas Day": "Esimene jõulupüha", + "Boxing Day": "Teine jõulupüha", + "Dates of {title}": "Ülesande {title} kuupäevad", + "The due date cannot be before the start date.": "Tähtaeg ei saa olla enne alguskuupäeva.", + "{title}, from {start} to {end}": "{title}, {start} kuni {end}", + "The dates could not be saved.": "Kuupäevi ei õnnestunud salvestada.", + "{title} now runs from {start} to {end}": "{title} kestab nüüd {start} kuni {end}", + "Auto-scheduling": "Automaatne planeerimine", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kui see on sees, pakub tähtaja hilisemaks nihutamine ajajoonel ka selle blokeeritud ülesannete nihutamist.", + "Move blocked tasks along when a task slips": "Nihuta blokeeritud ülesandeid, kui ülesanne hilineb", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Ajajoonel pakub hilisem tähtaeg blokeeritud ülesannete nihutamist. Arvesse lähevad ainult \"blokeerib\"-lingid ja ülesanded nihkuvad ainult hilisemaks.", + "Move the tasks that wait for {title}?": "Kas nihutada ülesandeid, mis ootavad ülesannet {title}?", + "These tasks wait for it and would start after its new due date:": "Need ülesanded ootavad seda ja algaksid pärast uut tähtaega:", + "{count} tasks would move; the first {limit} are listed.": "Nihutataks {count} ülesannet; näidatud on esimesed {limit}.", + "Now": "Praegu", + "After the move": "Pärast nihutamist", + "Only this task": "Ainult see ülesanne", + "Move all": "Nihuta kõik", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Peatus ülesande {title} juures: kuupäevi ei õnnestunud salvestada. Sellele eelnenud ülesanded nihutati.", + "Cumulative flow": "Kumulatiivne voog", + "Show as chart": "Näita diagrammina", + "Show as table": "Näita tabelina", + "Tasks per column per day": "Ülesanded veeru kaupa päevas", + "Tasks without recorded history in this period: {count}": "Ülesanded ilma salvestatud ajaloota sel perioodil: {count}", + "Lead and cycle time": "Läbimisaeg ja tsükliaeg", + "No tasks were finished in this period.": "Sel perioodil ei lõpetatud ühtegi ülesannet.", + "Finished tasks": "Lõpetatud ülesanded", + "Cycle time, average": "Tsükliaeg, keskmine", + "Cycle time, 85th percentile": "Tsükliaeg, 85. protsentiil", + "Lead time, average": "Läbimisaeg, keskmine", + "Tasks whose finish time was estimated from their history: {count}": "Ülesanded, mille lõpuaeg hinnati ajaloo põhjal: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Iga lõpetatud ülesande tsükliaeg koos keskmise ja 85. protsentiiliga", + "Slowest tasks": "Aeglaseimad ülesanded", + "cycle {cycle}, lead {lead}": "tsükkel {cycle}, läbimine {lead}", + "{days} days": "{days} päeva", + "Could not load the flow of this project.": "Selle projekti voogu ei õnnestunud laadida.", + "Last {days} days": "Viimased {days} päeva", + "Portfolio flow": "Portfelli voog", + "An admin adds portfolios under Projects, Portfolios.": "Administraator lisab portfellid jaotises Projektid, Portfellid.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Kuvamata projektid, sest korraga kuvatakse kuni 50: {count}", + "Could not load the flow of this portfolio.": "Selle portfelli voogu ei õnnestunud laadida.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulatiivne voog ja tsükliaeg portfelli projektides.", + "Edit report": "Muuda aruannet", + "Only tasks where": "Ainult ülesanded, kus", + "Group by": "Rühmita", + "Display": "Kuva", + "Share with everyone who can read its projects": "Jaga kõigiga, kes saavad selle projekte lugeda", + "The report could not be saved.": "Aruannet ei õnnestunud salvestada.", + "Number of tasks": "Ülesannete arv", + "Bar": "Tulp", + "Donut": "Rõngas", + "Table": "Tabel", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} projekti {total}-st selles aruandes pole sulle nähtavad", + "No tasks match this report.": "Ükski ülesanne ei vasta sellele aruandele.", + "None": "Puudub", + "Could not load this report.": "Seda aruannet ei õnnestunud laadida.", + "Report": "Aruanne", + "Your reports": "Sinu aruanded", + "My reports": "Minu aruanded", + "Shared reports": "Jagatud aruanded", + "You have not built a report yet.": "Sa pole veel ühtegi aruannet koostanud.", + "Nobody has shared a report with you yet.": "Keegi pole sinuga veel aruannet jaganud.", + "Reports you built over tasks, and the ones shared with you.": "Aruanded, mille sa ülesannete põhjal koostasid, ja need, mida sinuga jagati.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Salvestatud päring ülesannete kohta: millised projektid, millised filtrid, mille järgi rühmitatud, loendatud või summeeritud, ja näidatud tabeli või diagrammina.", + "The name the report is listed under": "Nimi, mille all aruanne loendis on", + "What the report shows and who it is for": "Mida aruanne näitab ja kellele see on", + "Nextcloud user id of the person who saved the report": "Aruande salvestanud isiku Nextcloudi kasutaja-ID", + "Who can open the report": "Kes saab aruannet avada", + "Only me": "Ainult mina", + "Everyone who can read its projects": "Kõik, kes saavad selle projekte lugeda", + "The projects the report covers, at most fifty": "Projektid, mida aruanne hõlmab, kuni viiskümmend", + "Filters": "Filtrid", + "Task fields and the value each must equal": "Ülesande väljad ja väärtus, millega igaüks peab võrduma", + "The task field the report groups on": "Ülesande väli, mille järgi aruanne rühmitab", + "Count the tasks, or add up a number on them": "Loenda ülesanded või liida nende arv", + "Sum": "Summa", + "Sum of": "Summa väljast", + "The number added up when the measure is a sum": "Arv, mis liidetakse, kui mõõt on summa", + "Story points": "Lugupunktid", + "Estimated duration": "Hinnanguline kestus", + "How the report is shown": "Kuidas aruannet näidatakse", + "Issue type": "Pileti tüüp", + "Task fields and the value each must equal; empty when the report covers every task": "Ülesande väljad ja väärtus, mis igaühel peab olema; tühi, kui aruanne hõlmab kõiki ülesandeid", + "The status a task must have": "Olek, mis ülesandel peab olema", + "The priority a task must have": "Prioriteet, mis ülesandel peab olema", + "The user a task must be assigned to": "Kasutaja, kellele ülesanne peab olema määratud", + "A label a task must carry": "Silt, mis ülesandel peab olema", + "The board column a task must be in": "Tahvli veerg, kus ülesanne peab olema", + "The issue type a task must have": "Pileti tüüp, mis ülesandel peab olema", + "Manager groups": "Juhtide rühmad", + "Member groups": "Liikmete rühmad", + "Viewer groups": "Lugejate rühmad", + "Viewers": "Lugejad", + "Owning group": "Omanikrühm", + "Nextcloud groups whose members manage the project": "Nextcloudi rühmad, mille liikmed juhivad projekti", + "Nextcloud groups whose members work on the project": "Nextcloudi rühmad, mille liikmed töötavad projektis", + "Nextcloud groups whose members may read the project": "Nextcloudi rühmad, mille liikmed võivad projekti lugeda", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloudi kasutajad, kes juhivad projekti: seadeid, liikmeid ja tööd", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloudi kasutajad, kes võivad projekti ja selle tööd lugeda, kuid mitte muuta", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloudi rühm, kellele projekt koos selle loojaga kuulub, kõige rohkem üks", + "Nextcloud user ids who may read this through the project": "Nextcloudi kasutajad, kes võivad seda projekti kaudu lugeda", + "Nextcloud groups whose members may change this through the project": "Nextcloudi rühmad, mille liikmed võivad seda projekti kaudu muuta", + "Nextcloud groups whose members may read this through the project": "Nextcloudi rühmad, mille liikmed võivad seda projekti kaudu lugeda", + "Search for a person or a group…": "Otsi inimest või gruppi…", + "No one found. Your admin's sharing settings decide who you can find.": "Kedagi ei leitud. Sinu administraatori jagamisseaded määravad, keda saad leida.", + "Type at least two characters": "Sisesta vähemalt kaks märki", + "Everyone in this group": "Kõik selles grupis", + "Could not search for people. Please try again.": "Inimeste otsimine ebaõnnestus. Proovi uuesti.", + "Could not remove the group": "Gruppi ei õnnestunud eemaldada", + "Only the owner and managers change who is on this project.": "Ainult omanik ja haldurid muudavad, kes selles projektis on.", + "Role of {name}": "Kasutaja {name} roll", + "Manager": "Haldur", + "Member": "Liige", + "Viewer": "Lugeja", + "Could not change the role": "Rolli ei õnnestunud muuta", + "Owned by group: {name}": "Grupi omandis: {name}", + "No group owns this project.": "Ükski grupp ei oma seda projekti.", + "Owned by group": "Grupi omandis", + "Search for a group…": "Otsi gruppi…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Gruppi ei leitud. Sinu administraatori jagamisseaded määravad, milliseid gruppe saad leida.", + "No owning group": "Omanikgruppi pole", + "Could not search for groups. Please try again.": "Gruppide otsimine ebaõnnestus. Proovi uuesti.", + "Could not change the owning group": "Omanikgruppi ei õnnestunud muuta", + "You can read this project. Only its members change it.": "Saad seda projekti lugeda. Muudavad seda ainult selle liikmed.", + "Course": "Kursus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursus, mida selles tunnis õpetatakse, näiteks valikaine, kui kooli õpperakendus seda teab.", + "Online meeting link": "Veebitunni link", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kus õpilased selle tunniga veebis liituvad. Nupp Liitu kuvatakse ainult https-lingi korral." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/et.json b/l10n/et.json index ba78b730..6bf901f8 100644 --- a/l10n/et.json +++ b/l10n/et.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktiivsed projektid", + "Archived projects": "Arhiveeritud projektid", + "Boards": "Tahvlid", + "My projects": "Minu projektid", + "Portfolio": "Portfell", + "Project board": "Projekti tahvel", + "Projects I am in": "Projektid, milles osalen", + "Timeline": "Ajajoon", + "Timesheet": "Tööajaleht", + "Features & roadmap": "Funktsioonid ja teekaart", + "Flow": "Voog", + "Flows": "Vood", + "Reports": "Aruanded", + "Pick a report to open it.": "Vali aruanne, et see avada.", + "In progress": "Töös", + "Date": "Kuupäev", + "Due": "Tähtaeg", + "Assignee": "Määratud", + "Who": "Kes", + "What": "Mis", + "Minutes": "Minutid", + "Entries": "Kirjed", + "Most recent": "Uusimad", + "Per person": "Isiku kohta", + "By status": "Staatuse järgi", + "By priority": "Prioriteedi järgi", + "Task status": "Ülesannete olek", + "Time spent": "Kulutatud aeg", + "Capacity": "Maht", + "Due soonest": "Kõige varem tähtajaks", + "Minutes logged": "Registreeritud minutid", + "Nothing is due": "Midagi ei ole tähtajaks", + "Nothing logged yet": "Midagi pole veel kirjendatud", + "What is open, what is blocked, and what is overdue.": "Mis on avatud, mis blokeeritud ja mis hilinenud.", + "How allocation is spread across the people working on projects.": "Kuidas koormus jaguneb projektidega tegelevate inimeste vahel.", + "Hours logged, and the projects they went to.": "Kirjendatud tunnid ja projektid, kuhu need läksid.", + "Billable": "Arveldatav", + "Budget: {amount}": "Eelarve: {amount}", + "Loading projects": "Projektide laadimine", + "No projects for this client yet": "Sellel kliendil pole veel projekte", + "Open in Planninq": "Ava Planninqis", + "This project could not be found": "Seda projekti ei leitud", + "Untitled project": "Nimeta projekt", + "and {count} more": "ja veel {count}", + "Store": "Pood", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Paigalda registrid, skeemid ja voog, mille teised organisatsioonid on avaldanud.", + "Work Date": "Töö kuupäev", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Veeru toimingud", + "Columns": "Veerud", + "Could not remove the column. Please try again.": "Veergu ei õnnestunud eemaldada. Proovi uuesti.", + "Could not save the column. Please try again.": "Veergu ei õnnestunud salvestada. Proovi uuesti.", + "Done column": "Valmis-veerg", + "Edit column": "Muuda veergu", + "Keep the card's status": "Säilita kaardi olek", + "Move its cards to": "Teisalda selle kaardid veergu", + "Move left": "Liiguta vasakule", + "Move right": "Liiguta paremale", + "Status of cards moved here": "Siia teisaldatud kaartide olek", + "The last done column cannot be removed.": "Viimast valmis-veergu ei saa eemaldada.", + "WIP limit": "WIP-piirang", + "over limit": "üle piirangu", + "The status a card gets when it is moved into this column.": "Olek, mille kaart saab, kui see teisaldatakse sellesse veergu.", + "All priorities": "Kõik prioriteedid", + "Could not create the task. Please try again.": "Ülesannet ei õnnestunud luua. Proovi uuesti.", + "Created": "Loodud", + "Move to backlog": "Ootenimekirja", + "Move to board": "Tahvlile", + "New task": "Uus ülesanne", + "Nothing in the backlog": "Ootenimekiri on tühi", + "Rank": "Järjekoht", + "Sort by": "Sordi", + "Sort by rank to reorder": "Järjestuse muutmiseks sordi järjekoha järgi", + "Task actions": "Ülesande toimingud", + "All labels": "Kõik sildid", + "Filter tasks by label": "Filtreeri ülesandeid sildi järgi", + "View timeline": "Vaata ajajoont", + "Board": "Tahvel", + "List": "Loend", + "Column": "Veerg", + "Board or list": "Tahvel või loend", + "Log": "Logi", + "Add entry": "Lisa kirje", + "Show": "Näita", + "No actions yet": "Tegevusi veel pole", + "Closed": "Suletud", + "Entry actions": "Kirje toimingud", + "Add action": "Lisa tegevus", + "by {author}": "autor {author}", + "saved {time}": "salvestatud {time}", + "Attendees: {names}": "Osalejad: {names}", + "Add the first entry": "Lisa esimene kirje", + "Issues": "Probleemid", + "Lessons learned": "Õppetunnid", + "Meetings": "Koosolekud", + "Decisions": "Otsused", + "Actions": "Tegevused", + "Issue": "Probleem", + "Lesson learned": "Õppetund", + "Meeting": "Koosolek", + "Decision": "Otsus", + "About this project": "Projektist", + "No description yet": "Kirjeldust veel pole", + "Start date": "Alguskuupäev", + "Not set": "Määramata", + "End date": "Lõppkuupäev", + "Progress": "Edenemine", + "No tasks yet": "Ülesandeid veel pole", + "Open the board": "Ava tahvel", + "People": "Inimesed", + "Owner": "Omanik", + "Latest log entries": "Viimased kirjed", + "Open the log": "Ava logi", + "{done} of {total} tasks done": "{done} ülesannet {total}-st tehtud", + "Edit entry": "Muuda kirjet", + "Type": "Liik", + "Attendees": "Osalejad", + "Issue is closed": "Probleem on suletud", + "Could not save the entry. Please try again.": "Kirjet ei õnnestunud salvestada. Proovi uuesti.", + "From: {title}": "Allikas: {title}", + "What needs to happen": "Mis peab juhtuma", + "Could not create the action. Please try again.": "Tegevust ei õnnestunud luua. Proovi uuesti.", + "The action was created but could not be linked to the entry.": "Tegevus loodi, kuid seda ei õnnestunud kirjega siduda.", + "Project pages": "Projekti lehed", + "Overview": "Ülevaade", + "Risks": "Riskid", + "Log entry": "Logikirje", + "A short name for the entry": "Kirje lühinimi", + "Project": "Projekt", + "The project this entry belongs to": "Projekt, millesse see kirje kuulub", + "What kind of entry this is": "Mis liiki kirje see on", + "When it happened": "Millal see juhtus", + "What happened, in Markdown": "Mis juhtus, Markdownis", + "Whether an issue is still open": "Kas probleem on veel avatud", + "The people at a meeting": "Koosolekul osalejad", + "Tasks that came out of this entry": "Sellest kirjest tulenevad ülesanded", + "Add risk": "Lisa risk", + "Risk": "Risk", + "Score": "Skoor", + "Response": "Vastus", + "Review date": "Ülevaatuse kuupäev", + "no longer on the project": "pole enam projektis", + "Edit {title}": "Muuda: {title}", + "No risks recorded yet": "Riske pole veel kirja pandud", + "Add the first risk": "Lisa esimene risk", + "Medium": "Keskmine", + "Mitigating": "Leevendamisel", + "Occurred": "Realiseerunud", + "Avoid": "Väldi", + "Reduce": "Vähenda", + "Transfer": "Kanna üle", + "Accept": "Aktsepteeri", + "Highest open risks": "Kõrgeimad avatud riskid", + "No open risks": "Avatud riske pole", + "Open the risk register": "Ava riskiregister", + "Edit risk": "Muuda riski", + "What could go wrong": "Mis võib valesti minna", + "Likelihood": "Tõenäosus", + "Impact": "Mõju", + "Score {score}": "Skoor {score}", + "Countermeasures": "Vastumeetmed", + "Could not save the risk. Please try again.": "Riski ei õnnestunud salvestada. Proovi uuesti.", + "Risks by likelihood and impact": "Riskid tõenäosuse ja mõju järgi", + "Risk scale": "Riskiskaala", + "The levels every project scores its risks on, and where low turns into medium and high": "Tasemed, millel iga projekt oma riske hindab, ja kus madal läheb üle keskmiseks ja kõrgeks", + "Number of levels": "Tasemete arv", + "Likelihood labels": "Tõenäosuse sildid", + "Impact labels": "Mõju sildid", + "Level {level}": "Tase {level}", + "Medium from score": "Keskmine alates skoorist", + "High from score": "Kõrge alates skoorist", + "Risk scale saved": "Riskiskaala salvestatud", + "1 risk uses level {level}. Change it first.": "1 risk kasutab taset {level}. Muuda see enne ära.", + "{count} risks use level {level}. Change them first.": "{count} riski kasutavad taset {level}. Muuda need enne ära.", + "Every level needs a label, and high must start above medium.": "Igal tasemel peab olema silt ja kõrge peab algama keskmisest kõrgemalt.", + "The project this risk belongs to": "Projekt, millesse see risk kuulub", + "The cause and the effect, in Markdown": "Põhjus ja tagajärg, Markdownis", + "Category": "Kategooria", + "A free grouping, such as planning, budget or supplier": "Vaba rühmitus, nt planeerimine, eelarve või tarnija", + "How likely it is, on the admin's risk scale": "Kui tõenäoline see on, administraatori riskiskaalal", + "How hard it would hit, on the admin's risk scale": "Kui rängalt see mõjuks, administraatori riskiskaalal", + "Likelihood times impact, calculated by the server": "Tõenäosus korda mõju, arvutab server", + "Where the risk stands": "Kus risk on", + "The person who watches this risk": "Inimene, kes seda riski jälgib", + "How the project answers the risk": "Kuidas projekt riskile vastab", + "What is done to prevent it or soften it, in Markdown": "Mida tehakse selle ärahoidmiseks või leevendamiseks, Markdownis", + "When to look at this risk again": "Millal riski uuesti vaadata", + "Very low": "Väga madal", + "Very high": "Väga kõrge", + "All projects": "Kõik projektid", + "Project status report": "Projekti olukorra aruanne", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Kuupäevaga aruanne selle kohta, kuidas projekt seisab raha, korralduse, aja, teabe, kvaliteedi ja riski osas (GROTIK-aspektid), igaüks märkusega.", + "The project this report is about": "Projekt, mida aruanne puudutab", + "Report date": "Aruande kuupäev", + "The day the report describes": "Päev, mida aruanne kirjeldab", + "Money": "Raha", + "How the project stands on this aspect": "Kuidas projekt selles aspektis seisab", + "On track": "Graafikus", + "At risk": "Ohus", + "Off track": "Graafikust väljas", + "Money note": "Märkus raha kohta", + "A short explanation of this status": "Selle oleku lühike selgitus", + "Organisation": "Korraldus", + "Organisation note": "Märkus korralduse kohta", + "Time": "Aeg", + "Time note": "Märkus aja kohta", + "Information": "Teave", + "Information note": "Märkus teabe kohta", + "Quality": "Kvaliteet", + "Quality note": "Märkus kvaliteedi kohta", + "Risk note": "Märkus riski kohta", + "Overall": "Kokku", + "The worst of the six statuses, calculated by the server": "Kuuest olekust halvim, arvutab server", + "Health: money": "Tervis: raha", + "Copied from the newest status report": "Kopeeritud uusimast olukorra aruandest", + "Health: organisation": "Tervis: korraldus", + "Health: time": "Tervis: aeg", + "Health: information": "Tervis: teave", + "Health: quality": "Tervis: kvaliteet", + "Health: risk": "Tervis: risk", + "Health: overall": "Tervis: kokku", + "Health: report date": "Tervis: aruande kuupäev", + "The date of the newest status report": "Uusima olukorra aruande kuupäev", + "New report": "Uus aruanne", + "Only the project owner writes status reports.": "Olukorra aruandeid kirjutab ainult projekti omanik.", + "Latest report, {date}": "Viimane aruanne, {date}", + "Aspect": "Aspekt", + "Note": "Märkus", + "Report history": "Aruannete ajalugu", + "Author": "Autor", + "No status reports yet": "Olukorra aruandeid veel pole", + "Write the first report": "Kirjuta esimene aruanne", + "Choose a status for every aspect to save the report.": "Aruande salvestamiseks vali iga aspekti jaoks olek.", + "Suggested: on track.": "Soovitus: graafikus.", + "Suggested: at risk.": "Soovitus: ohus.", + "Suggested: off track.": "Soovitus: graafikust väljas.", + "1 task is past its due date.": "1 ülesande tähtaeg on möödas.", + "{count} tasks are past their due date.": "Tähtaja ületanud ülesandeid: {count}.", + "The end date has passed with 1 open task.": "Lõppkuupäev on möödas ja 1 ülesanne on avatud.", + "The end date has passed with {count} open tasks.": "Lõppkuupäev on möödas, avatud ülesandeid: {count}.", + "No open task is past its due date.": "Ühegi avatud ülesande tähtaeg pole möödas.", + "The highest open risk, \"{title}\", scores {score}.": "Suurim avatud risk, „{title}”, saab {score} punkti.", + "There are no open risks.": "Avatud riske pole.", + "Costs are at {percent}% of the budget.": "Kulud on {percent}% eelarvest.", + "No suggestion: the project has no budget.": "Soovitust pole: projektil pole eelarvet.", + "No suggestion: no costs are recorded for this project yet.": "Soovitust pole: sellele projektile pole veel kulusid kirjendatud.", + "The report was not saved. Only the project owner can write status reports.": "Aruannet ei salvestatud. Olukorra aruandeid saab kirjutada ainult projekti omanik.", + "No report": "Aruanne puudub", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Samade inimeste juhitavate projektide rühm, näiteks osakond või programm. Selle juhid loevad iga selles olevat projekti.", + "The name of the portfolio": "Portfelli nimi", + "What the portfolio holds and who runs it": "Mida portfell sisaldab ja kes seda juhib", + "A colour for the portfolio's section in project lists": "Portfelli jaotise värv projektiloendites", + "Managers": "Juhid", + "Nextcloud user UIDs of the people who run the portfolio": "Portfelli juhtivate inimeste Nextcloudi kasutajatunnused", + "Order": "Järjekord", + "Where the portfolio comes in project lists, lowest first": "Portfelli koht projektiloendites, väikseim eespool", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Selle portfelli oma riskiskaala JSON-ina, samas kujus nagu kogu rakenduse skaala. Tühi tähendab rakenduse skaalat.", + "Portfolio readers": "Portfelli lugejad", + "Nextcloud user UIDs of the managers of the project's portfolio": "Projekti portfelli juhtide Nextcloudi kasutajatunnused", + "The portfolio this project belongs to": "Portfell, kuhu see projekt kuulub", + "No portfolio": "Portfell puudub", + "All portfolios": "Kõik portfellid", + "You read this project as a manager of its portfolio. Only its members change it.": "Loed seda projekti selle portfelli juhina. Muudavad seda ainult selle liikmed.", + "Portfolios": "Portfellid", + "Portfolio status": "Portfelli seis", + "No portfolios yet": "Portfelle veel pole", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administraator lisab portfellid jaotises Projektid, Portfellid. Portfelli projektid on siin loetletud koos nende seisuga.", + "Roll-up": "Kokkuvõte", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} graafikus, {atRisk} ohus, {offTrack} graafikust väljas, {noReport} aruandeta", + "No project in this portfolio that you can read.": "Selles portfellis pole projekti, mida saaksid lugeda.", + "Start": "Algus", + "End": "Lõpp", + "Budget": "Eelarve", + "Last report": "Viimane aruanne", + "Out of date": "Aegunud", + "Portfolio timeline": "Portfelli ajatelg", + "Zoom": "Suurendus", + "Could not load the timeline": "Ajatelge ei õnnestunud laadida", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administraator lisab portfellid jaotises Projektid, Portfellid. Portfelli projektid on siin ühel ajateljel.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Ava projekt, et näha selle etappe ja ülesandeid. Ajatelg on kirjutuskaitstud.", + "Phase: {title}": "Etapp: {title}", + "Left out because you cannot read them: {count} projects": "Välja jäetud, sest sa ei saa neid lugeda: {count} projekti", + "Week": "Nädal", + "Day": "Päev", + "Month": "Kuu", + "Please try again later.": "Proovi hiljem uuesti.", + "Status reports": "Seisuaruanded", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Mitme päeva pärast märgitakse projekti viimane seisuaruanne portfelli ülevaates aegunuks", + "Reporting period (days)": "Aruandlusperiood (päevades)", + "The reporting period is a whole number of days from 1 to 365.": "Aruandlusperiood on täisarv päevi vahemikus 1 kuni 365.", + "Reporting period saved": "Aruandlusperiood salvestatud", + "The reporting period was not saved. Please try again.": "Aruandlusperioodi ei salvestatud. Proovi uuesti.", + "Every project of a portfolio with its status per aspect, rolled up.": "Portfelli iga projekt koos seisuga aspektide kaupa, kokkuvõtlikult.", + "The projects of a portfolio on one timeline.": "Portfelli projektid ühel ajateljel.", + "Phases": "Etapid", + "Add phase": "Lisa etapp", + "No phases yet": "Etappe veel pole", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Jaga projekt etappideks, näiteks algatamine, määratlemine ja teostus. Etapp suletakse, kui selle lõppdokument on üles laaditud.", + "{hours} hours": "{hours} tundi", + "Concluding document: {title}": "Lõppdokument: {title}", + "Concluding document missing": "Lõppdokument puudub", + "Move {title} up": "Liiguta {title} üles", + "Move {title} down": "Liiguta {title} alla", + "Close phase": "Sulge etapp", + "Phase": "Etapp", + "Files": "Failid", + "Notes": "Märkmed", + "Audit trail": "Auditilogi", + "Edit phase": "Muuda etappi", + "Name": "Nimi", + "Budget hours": "Eelarvetunnid", + "Could not save the phase. Please try again.": "Etappi ei õnnestunud salvestada. Proovi uuesti.", + "Close phase {title}": "Sulge etapp {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Etapp suletakse lõppdokumendiga: laadi see siin üles või vali üks etapi failidest.", + "Concluding document": "Lõppdokument", + "This phase has no files yet.": "Sellel etapil pole veel faile.", + "Upload a document": "Laadi dokument üles", + "The document was not uploaded. Please try again.": "Dokumenti ei laaditud üles. Proovi uuesti.", + "Upload the concluding document before you close this phase.": "Laadi lõppdokument üles enne selle etapi sulgemist.", + "This phase cannot be closed from its current status.": "Seda etappi ei saa selle praegusest olekust sulgeda.", + "The phase was not closed. Please try again.": "Etappi ei suletud. Proovi uuesti.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Selle etapi faili ID, mis etapi lõpetab. Etapi saab lõpetada alles siis, kui see on määratud ja fail on lisatud.", + "Import from Microsoft Project": "Impordi Microsoft Projectist", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Vali plaan, mis on Microsoft Projectist salvestatud XML-vormingus. Midagi ei impordita enne, kui kinnitad.", + "Plan file": "Plaanifail", + "What the import creates": "Mida import loob", + "Tasks": "Ülesanded", + "Sub-tasks": "Alamülesanded", + "Milestones": "Verstapostid", + "Links": "Seosed", + "Already imported, updated in place: {count}": "Juba imporditud, uuendatud kohapeal: {count}", + "What does not carry over": "Mis üle ei tule", + "Tasks with resources, which are not imported: {count}": "Ressurssidega ülesanded, mida ei impordita: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tasemest 3 sügavamad ülesanded, paigutatud oma 2. taseme ülesande alla: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Muud kui lõpp-algus seosed, imporditud seotud seostena: {count}", + "Link lags, which are dropped: {count}": "Seoste viivitused, mis jäetakse välja: {count}", + "Links to a summary task, which are not imported: {count}": "Seosed kokkuvõtteülesandega, mida ei impordita: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Seosed selle plaani väliste ülesannetega, mida ei impordita: {count}", + "No longer in the plan": "Pole enam plaanis", + "These stay in the project; remove them yourself if they are no longer needed.": "Need jäävad projekti; eemalda need ise, kui neid enam vaja pole.", + "Import": "Impordi", + "Close": "Sulge", + "The plan is imported: {created} created, {updated} updated.": "Plaan on imporditud: {created} loodud, {updated} uuendatud.", + "Links that would close a loop were left out: {count}": "Silmuse sulgevad seosed jäeti välja: {count}", + "The import stopped part-way. Run it again to finish it.": "Import peatus poolel teel. Käivita see uuesti, et see lõpetada.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Salvesta plaan Microsoft Projectis valikuga Fail, Salvesta nimega, XML-vorming, ja impordi see fail.", + "This file declares a DOCTYPE or entities, which are not accepted.": "See fail deklareerib DOCTYPE'i või olemeid, mida ei aktsepteerita.", + "The file is larger than 10 MB.": "Fail on suurem kui 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plaanis on üle 2000 ülesande, rohkem kui üks import võtab.", + "This file is not a Microsoft Project plan in XML format.": "See fail ei ole XML-vormingus Microsoft Projecti plaan.", + "Choose a file to import.": "Vali imporditav fail.", + "Only the project owner can import a plan.": "Ainult projekti omanik saab plaani importida.", + "The plan could not be read. Please try again.": "Plaani ei saanud lugeda. Proovi uuesti.", + "Linked case: {title}": "Seotud menetlus: {title}", + "Linked to a case": "Seotud menetlusega", + "Hand over to case": "Anna menetlusele üle", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopeerib iga projekti ja selle ülesannete faili ning projekti kirjeldava faili muutmata kujul seotud menetlusse.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopeeritud faile: {count}", + "Files that failed: {names}": "Ebaõnnestunud failid: {names}", + "The handover failed. Please try again.": "Üleandmine ebaõnnestus. Proovi uuesti.", + "The linked case could not be found, or you cannot open it.": "Seotud menetlust ei leitud või sa ei saa seda avada.", + "Case handovers": "Üleandmised menetlusele", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Iga kord, kui projekti failid ja metaandmed menetlusele üle anti: millal, kes, millisele menetlusele, iga kopeeritud fail koos SHA-256-ga ja ebaõnnestunud failid.", + "Finance": "Rahandus", + "Add cost line": "Lisa kulurida", + "Delivery terms": "Tarnetingimused", + "Billing model": "Arveldusmudel", + "Budget in euro": "Eelarve eurodes", + "Budget in hours": "Eelarve tundides", + "Hourly rate in euro": "Tunnihind eurodes", + "Planned start": "Kavandatud algus", + "Planned end": "Kavandatud lõpp", + "Planned dates": "Kavandatud kuupäevad", + "Budget {amount}": "Eelarve {amount}", + "No budget agreed": "Eelarves pole kokku lepitud", + "Hours": "Tunnid", + "Only the project owner and the portfolio managers see the amounts.": "Summasid näevad ainult projekti omanik ja portfelli haldurid.", + "Budget against cost per category": "Eelarve ja kulud kategooriate kaupa", + "Labour (booked time)": "Töö (registreeritud aeg)", + "No category": "Kategooriata", + "Hours are not available": "Tunnid pole saadaval", + "Not yet assigned to a category": "Pole veel kategooriale määratud", + "Total": "Kokku", + "{spent} spent, {remaining} remaining": "{spent} kulutatud, {remaining} alles", + "Budget against cost per phase": "Eelarve ja kulud etappide kaupa", + "No phase": "Etapita", + "Cost lines": "Kuluread", + "From the finance system": "Finantssüsteemist", + "Edit cost line {amount}": "Muuda kulurida {amount}", + "No cost lines yet": "Kuluridu veel pole", + "Commitments": "Kohustused", + "Actual cost": "Tegelik kulu", + "Forecast": "Prognoos", + "Remaining": "Alles", + "Not planned yet": "Pole veel kavandatud", + "{start} to {end}": "{start} kuni {end}", + "The terms were not saved. Please try again.": "Tingimusi ei salvestatud. Proovi uuesti.", + "Terms saved": "Tingimused salvestatud", + "Fixed price": "Kindel hind", + "Hourly": "Tunnipõhine", + "Not billed": "Arvet ei esitata", + "Commitment": "Kohustus", + "Edit cost line": "Muuda kulurida", + "Kind": "Liik", + "Amount in euro": "Summa eurodes", + "Remove": "Eemalda", + "Could not save the cost line. Only the project owner changes the money of a project.": "Kulurida ei saanud salvestada. Projekti raha muudab ainult projekti omanik.", + "Could not remove the cost line. Please try again.": "Kulurida ei saanud eemaldada. Proovi uuesti.", + "{amount} over budget": "{amount} üle eelarve", + "Cost categories": "Kulukategooriad", + "The categories every project splits its budget and costs into, one per line": "Kategooriad, millesse iga projekt oma eelarve ja kulud jagab, üks rea kohta", + "Categories": "Kategooriad", + "Give at least one category, each name once.": "Anna vähemalt üks kategooria, iga nimi üks kord.", + "Cost categories saved": "Kulukategooriad salvestatud", + "The cost categories were not saved. Please try again.": "Kulukategooriaid ei salvestatud. Proovi uuesti.", + "Finance line": "Finantsrida", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Üks projekti rahasumma: eelarve, kohustus, tegelik kulu või prognoos, kulukategoorias ja soovi korral etapis. Sisestab projekti omanik või saadab finantssüsteem integratsioonirakenduse kaudu.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt, kuhu summa kuulub. Tühi finantssüsteemi rea puhul, mille projektinumber ei vasta ühelegi projektile.", + "The phase this amount belongs to, if any": "Etapp, kuhu summa kuulub, kui see on olemas", + "The cost category, one of the categories the admin set up": "Kulukategooria, üks administraatori seadistatud kategooriatest", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Kas summa on eelarve, kohustus, tegelik kulu või prognoos", + "Amount": "Summa", + "The amount in the reporting currency (euro)": "Summa aruandlusvaluutas (euro)", + "The date the amount was booked or is expected": "Kuupäev, millal summa kirjendati või on oodata", + "What the amount is for": "Milleks summa on", + "Whether a person entered the line or the finance system sent it": "Kas rea sisestas inimene või saatis selle finantssüsteem", + "Entered by hand": "Käsitsi sisestatud", + "Finance line id": "Finantsrea ID", + "The finance system's own id of this line. One imported line per id.": "Selle rea oma ID finantssüsteemis. Üks imporditud rida ID kohta.", + "Project number": "Projektinumber", + "The project number the finance system sent, matched against the project key": "Finantssüsteemi saadetud projektinumber, mida võrreldakse projekti võtmega", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Rea projekti portfell, kopeeritud projektist, et portfelli kogusummad vajaksid ühte filtrit", + "Finance readers": "Finantslugejad", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nende inimeste Nextcloudi kasutaja-UID-d, kes võivad summat näha: projekti omanik ja portfelli haldurid", + "Project owner": "Projekti omanik", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Projekti omaniku Nextcloudi kasutaja-UID; tema võib käsitsi ridu muuta ja eemaldada", + "How the client pays: not billed, a fixed price, or by the hour.": "Kuidas klient maksab: arvet ei esitata, kindel hind või tunnipõhine.", + "Portfolio finance": "Portfelli rahandus", + "You cannot see the money of any project in this portfolio": "Sa ei näe selle portfelli ühegi projekti raha", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Server tagastas kuluridu väljaspool seda portfelli olevatest projektidest, seega võivad need kogusummad olla valed.", + "Projects left out because you cannot see their money: {count}": "Välja jäetud projektid, sest sa ei näe nende raha: {count}", + "Unmatched finance lines": "Sobitamata finantsread", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Eelarve, kohustused, tegelik kulu ja prognoos portfelli kohta kokku.", + "Subprojects": "Alamprojektid", + "{done} of {total}": "{done}/{total}", + "{done} of {total} tasks done, including subprojects": "{done}/{total} ülesannet tehtud, alamprojektid kaasa arvatud", + "Show the subprojects of {title}": "Näita projekti {title} alamprojekte", + "Hide the subprojects of {title}": "Peida projekti {title} alamprojektid", + "Part of": "Kuulub", + "No parent project": "Ülemprojekt puudub", + "A project cannot sit under one of its own subprojects.": "Projekt ei saa olla oma alamprojekti all.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projektid pesastuvad kuni kolm taset: programm, projekt ja alamprojekt.", + "Parent project": "Ülemprojekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt, mille all see projekt on, näiteks programm. Projektid pesastuvad kuni kolm taset.", + "Yes": "Jah", + "No": "Ei", + "{label} (required)": "{label} (kohustuslik)", + "{label} is required": "{label} on kohustuslik", + "Project field": "Projekti väli", + "A field an admin adds to every project, such as a policy area or a contract value.": "Väli, mille administraator lisab igale projektile, näiteks poliitikavaldkond või lepingu väärtus.", + "Key": "Võti", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Püsiv nimi, mille all väärtus salvestatakse, lower camel case kujul. Hoia see samaks, kui projektid seda kasutavad.", + "Label": "Silt", + "The name people see next to the field": "Nimi, mida inimesed välja kõrval näevad", + "What the field holds": "Mida väli sisaldab", + "Text": "Tekst", + "Number": "Arv", + "Choice": "Valik", + "Person": "Isik", + "Yes or no": "Jah või ei", + "Options": "Valikud", + "The choices of a choice field": "Valikvälja valikud", + "Required": "Kohustuslik", + "Whether a project must fill in the field": "Kas projekt peab välja täitma", + "Where the field appears, lowest first": "Kus väli kuvatakse, väikseim enne", + "Applies to": "Kehtib", + "What the field is added to": "Millele väli lisatakse", + "Custom fields": "Omad väljad", + "The values of the project fields an admin defined, keyed by the field's key.": "Administraatori määratud projektiväljade väärtused välja võtme järgi.", + "Project fields": "Projekti väljad", + "Related": "Seotud", + "Remove link": "Eemalda link", + "Link type": "Lingi tüüp", + "Relates to": "Seotud ülesandega", + "Duplicates": "Dubleerib", + "Project key": "Projekti võti", + "Every task number starts with it, such as VERG-42.": "Iga ülesande number algab sellega, näiteks VERG-42.", + "This key is already used by another project.": "Seda võtit kasutab juba teine projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Kasutage 2 kuni 10 tähte ja numbrit, alustades tähega.", + "The key cannot change once tasks carry it.": "Võti ei saa muutuda, kui ülesanded seda kannavad.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt salvestatud. Olemasolevad ülesanded saavad numbrid taustal.", + "Next task number": "Järgmise ülesande number", + "The number the next task of this project gets in its key. Only the system writes it.": "Number, mille selle projekti järgmine ülesanne oma võtmes saab. Seda kirjutab ainult süsteem.", + "Restore {title}": "Taasta {title}", + "Restore": "Taasta", + "Project restored": "Projekt taastatud", + "Could not restore the project": "Projekti ei õnnestunud taastada", + "Bring this project back to the active list.": "Too see projekt tagasi aktiivsete projektide loendisse.", + "Restore project": "Taasta projekt", + "Request reason": "Taotluse põhjus", + "Why the requester needs this project. Filled in when the project is requested.": "Miks taotleja seda projekti vajab. Täidetakse taotlemisel.", + "Reviewed by": "Läbi vaadanud", + "The user who approved or rejected the request.": "Kasutaja, kes taotluse kinnitas või tagasi lükkas.", + "Reviewed at": "Läbi vaadatud", + "When the request was approved or rejected.": "Millal taotlus kinnitati või tagasi lükati.", + "Review note": "Läbivaataja märkus", + "The reviewer's reason, shown to the requester when a request is not approved.": "Läbivaataja põhjendus, mida taotleja näeb, kui taotlust ei kinnitata.", + "Members of these groups": "Nende gruppide liikmed", + "Groups that may create projects": "Grupid, kes võivad projekte luua", + "The group {group} no longer exists. Save to remove it.": "Gruppi {group} enam pole. Salvestage, et see eemaldada.", + "Review project request": "Vaata projektitaotlus läbi", + "Requested by": "Taotleja", + "Why it is needed": "Miks seda vaja on", + "Desired start date": "Soovitud alguskuupäev", + "Why is it not approved?": "Miks seda ei kinnitata?", + "Give a reason. The requester sees it.": "Andke põhjus. Taotleja näeb seda.", + "Approve": "Kinnita", + "Reject": "Lükka tagasi", + "Reject request": "Lükka taotlus tagasi", + "The review was not saved. Try again.": "Läbivaatust ei salvestatud. Proovige uuesti.", + "This project is waiting for review": "See projekt ootab läbivaatust", + "This request was not approved": "Seda taotlust ei kinnitatud", + "Reason: {note}": "Põhjus: {note}", + "Review request": "Vaata taotlus läbi", + "Request a project": "Taotle projekti", + "Step {step} of 2": "Samm {step}/2", + "Why is this project needed?": "Miks seda projekti vaja on?", + "Give a reason. The reviewer reads it.": "Andke põhjus. Läbivaataja loeb seda.", + "Back": "Tagasi", + "Next": "Edasi", + "Send request": "Saada taotlus", + "The request was not sent. Try again.": "Taotlust ei saadetud. Proovige uuesti.", + "Requested": "Taotletud", + "Not approved": "Pole kinnitatud", + "Your request was sent": "Teie taotlus on saadetud", + "Let everyone else request a project": "Luba kõigil teistel projekti taotleda", + "Add a task": "Lisa ülesanne", + "Delete task": "Kustuta ülesanne", + "Edit task": "Muuda ülesannet", + "Write": "Kirjuta", + "Preview": "Eelvaade", + "Markdown works here: headings, lists and links.": "Siin töötab Markdown: pealkirjad, loendid ja lingid.", + "Could not save the task. Please try again.": "Ülesannet ei õnnestunud salvestada. Proovi uuesti.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Ülesandele \"{title}\" on aega kirjendatud, seega ei saa seda kustutada. Selle asemel saad selle tühistada: ajakanded jäävad alles.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Kas kustutada \"{title}\"? Ka selle lingid teistele ülesannetele eemaldatakse. Seda ei saa tagasi võtta.", + "Keep task": "Jäta ülesanne alles", + "Cancel task": "Tühista ülesanne", + "Only the reporter, the project owner or an admin can delete this task.": "Seda ülesannet saab kustutada ainult teataja, projekti omanik või administraator.", + "Could not delete the task. Please try again.": "Ülesannet ei õnnestunud kustutada. Proovi uuesti.", + "Could not cancel the task. Please try again.": "Ülesannet ei õnnestunud tühistada. Proovi uuesti.", + "Responsible": "Vastutaja", + "Also working on this": "Töötavad ka selle kallal", + "Labels": "Sildid", + "Could not change the priority. Please try again.": "Prioriteeti ei õnnestunud muuta. Proovi uuesti.", + "Other project members who work on this task alongside the person responsible.": "Teised projekti liikmed, kes töötavad selle ülesande kallal koos vastutajaga.", + "Duplicate": "Kopeeri", + "Could not copy the task. Please try again.": "Ülesannet ei õnnestunud kopeerida. Proovi uuesti.", + "Subtasks": "Alamülesanded", + "{done} of {total} done": "{done} / {total} valmis", + "Add a subtask": "Lisa alamülesanne", + "Checklist": "Kontrollnimekiri", + "Checklist item actions": "Nimekirja punkti toimingud", + "Add a checklist item": "Lisa nimekirja punkt", + "Subtasks: {estimate} estimated, {logged} logged": "Alamülesanded: hinnang {estimate}, kirjendatud {logged}", + "Total estimate: {total}": "Koguhinnang: {total}", + "Part of {title}": "Osa ülesandest {title}", + "Checklist: {count} done": "Kontrollnimekiri: {count} valmis", + "This task has subtasks: {count}.": "Sellel ülesandel on alamülesandeid: {count}.", + "Keep subtasks as separate tasks": "Jäta alamülesanded eraldi ülesanneteks", + "Delete subtasks too": "Kustuta ka alamülesanded", + "Copy of {title}": "Koopia: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Ülesanne kopeeriti, kuid mitte kõik selle alamülesanded. Kontrolli koopiat.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Väikesed sammud ülesande sees. Igal punktil on id, tekst ja märge, kas see on valmis.", + "Open work per person and per project.": "Avatud töö inimeste ja projektide kaupa.", + "View": "Vaade", + "By person": "Inimeste kaupa", + "By project": "Projektide kaupa", + "Hours left": "Jäänud tunde", + "Tasks without an estimate": "Hinnanguta ülesanded", + "Due in 14 days": "Tähtaeg 14 päeva jooksul", + "Shared": "Jagatud", + "Unassigned": "Määramata", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Näidatakse tööd projektides, mida sa näed. Tunnid lähevad vastutajale; jagatud ülesanded loetakse ilma tundideta.", + "No open work in these projects.": "Nendes projektides pole avatud tööd.", + "Open work": "Avatud töö", + "{count} open tasks": "{count} avatud ülesannet", + "Create a project to see capacity here.": "Loo projekt, et siin koormust näha.", + "My tasks": "Minu ülesanded", + "Show all my tasks": "Näita kõiki minu ülesandeid", + "No tasks assigned to you": "Sulle pole ülesandeid määratud", + "Browse projects": "Sirvi projekte", + "Later": "Hiljem", + "Due {date}": "Tähtaeg {date}", + "Could not change the status. Please try again.": "Olekut ei saanud muuta. Proovi uuesti.", + "Completed today": "Täna lõpetatud", + "My open tasks": "Minu avatud ülesanded", + "My overdue tasks": "Minu hilinenud ülesanded", + "My tasks in progress": "Minu pooleliolevad ülesanded", + "Pin to the top": "Kinnita üles", + "Unpin": "Vabasta", + "Pinned": "Kinnitatud", + "Actions for {title}": "Toimingud: {title}", + "Could not save your project order. Please try again.": "Projektide järjekorda ei saanud salvestada. Proovi uuesti.", + "No boards yet": "Tahvleid veel pole", + "Create a project to get a board.": "Loo projekt, et saada tahvel.", + "Use the Projects page to create and manage your projects and tasks.": "Kasuta lehte Projektid oma projektide ja ülesannete loomiseks ja haldamiseks.", + "Go to projects": "Mine projektidesse", + "You are not a member of any projects yet.": "Sa pole veel ühegi projekti liige.", + "Could not search for users. Please try again.": "Kasutajaid ei õnnestunud otsida. Proovi uuesti.", + "Project creation is restricted to administrators.": "Projekte saavad luua ainult administraatorid.", + "Only the project owner or an administrator can delete this project.": "Selle projekti saab kustutada ainult projekti omanik või administraator.", + "No projects are available to you yet. Ask an administrator to create one.": "Sulle pole veel ühtegi projekti saadaval. Palu administraatoril üks luua.", + "Due: {date}": "Tähtaeg: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Algus- või tähtajaga ülesanded kuvatakse ajajoonel. Lisa kuupäevad, et neid siin näha.", + "You do not have access to this project.": "Sul pole sellele projektile juurdepääsu.", + "Zoom level": "Suumitase", + "Unscheduled": "Planeerimata", + "Start: {date}": "Algus: {date}", + "Today": "Täna", + "No scheduled tasks": "Planeeritud ülesandeid pole", + "An unexpected error occurred.": "Tekkis ootamatu viga.", + "Column {number} name": "Veeru {number} nimi", + "Failed to save creation policy": "Loomise reeglit ei õnnestunud salvestada", + "All authenticated users": "Kõik sisselogitud kasutajad", + "Control who may create new projects": "Määra, kes tohib uusi projekte luua", + "Administrators only": "Ainult administraatorid", + "Project creation": "Projektide loomine", + "Allow project creation": "Luba projektide loomine", + "Creation policy saved successfully": "Loomise reegel salvestatud", + "Initializing…": "Käivitamine…", + "e.g. 2h 30m, 90m, 1.5h": "nt 2h 30m, 90m, 1.5h", + "Log time": "Kirjuta aega", + "Save estimate": "Salvesta hinnang", + "Logged: {logged}": "Kirjutatud: {logged}", + "over by {amount}": "{amount} üle", + "Time tracking": "Ajaarvestus", + "Estimate": "Hinnang", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Sisesta kehtiv hinnang (nt 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Sisesta kehtiv kestus (nt 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Ajakannet ei õnnestunud salvestada. Proovi uuesti.", + "Edit time entry": "Muuda ajakannet", + "Duration": "Kestus", + "Date range": "Ajavahemik", + "Last week": "Eelmine nädal", + "No time logged": "Aega pole kirjutatud", + "Log time on a task to see it here.": "Kirjuta ülesandele aega, et seda siin näha.", + "To date": "Kuupäevani", + "This week": "See nädal", + "Total: {total}": "Kokku: {total}", + "From date": "Kuupäevast", + "Custom range": "Kohandatud vahemik", + "All time": "Kogu aeg", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Ülesannet ei õnnestunud kustutada, seega võivad andmed alles jääda. Kustuta projekt uuesti.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Ajakannet ei õnnestunud kustutada, seega võivad andmed alles jääda. Kustuta projekt uuesti.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Veergu ei õnnestunud kustutada, seega võivad andmed alles jääda. Kustuta projekt uuesti.", + "Could not delete the project. Please try again.": "Projekti ei õnnestunud kustutada. Proovi uuesti.", + "Notification settings": "Teavituste seaded", + "Configure when due-date reminders are sent": "Määra, millal tähtaja meeldetuletused saadetakse", + "Due-date reminder lead time (hours)": "Meeldetuletuse ennetusaeg (tundi)", + "Lead time must be between 1 and 336 hours": "Ennetusaeg peab olema 1 kuni 336 tundi", + "Reminder lead time saved successfully": "Meeldetuletuse ennetusaeg salvestatud", + "Failed to save reminder lead time": "Meeldetuletuse ennetusaega ei õnnestunud salvestada", + "Notifications": "Teavitused", + "Notify me 1 day before a task's due date": "Teavita mind 1 päev enne ülesande tähtaega", + "Draft": "Mustand", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Kas tund on mustand, mida näeb ainult õpetaja, toimub või jääb ära.", + "New release": "Uus väljalase", + "Roadmap chart. The same releases and epics are listed below.": "Tegevuskava diagramm. Samad väljalasked ja eepikud on allpool loendis.", + "Nothing on the roadmap yet": "Tegevuskaval pole veel midagi", + "Releases with a target date and epics with dated tasks appear here.": "Siin kuvatakse sihtkuupäevaga väljalasked ja kuupäevastatud ülesannetega eepikud.", + "Releases": "Väljalasked", + "No releases yet": "Väljalaskeid veel pole", + "Target date: {date}": "Sihtkuupäev: {date}", + "No target date": "Sihtkuupäev puudub", + "Edit {name}": "Muuda {name}", + "Mark {name} as released": "Märgi {name} välja lastuks", + "Mark as released": "Märgi välja lastuks", + "Epics": "Eepikud", + "No epics yet. Open a task to make it an epic.": "Eepikuid veel pole. Ava ülesanne, et teha sellest eepik.", + "Not scheduled yet": "Veel ajastamata", + "Planned": "Planeeritud", + "Released": "Välja lastud", + "Edit release": "Muuda väljalaset", + "Target date": "Sihtkuupäev", + "Could not save the release. Please try again.": "Väljalaset ei õnnestunud salvestada. Proovi uuesti.", + "Every task of this release is done or cancelled.": "Selle väljalaske kõik ülesanded on tehtud või tühistatud.", + "Not finished yet: {count}": "Veel lõpetamata: {count}", + "What happens to these tasks?": "Mis saab nendest ülesannetest?", + "Move to {name}": "Teisalda väljalaskesse {name}", + "Remove the release": "Eemalda väljalase", + "Keep it on {name}": "Jäta need väljalaskesse {name}", + "Could not mark the release as released. Please try again.": "Väljalaset ei õnnestunud välja lastuks märkida. Proovi uuesti.", + "Roadmap": "Tegevuskava", + "Tasks or roadmap": "Ülesanded või tegevuskava", + "Release": "Väljalase", + "Epic": "Eepik", + "This task is an epic": "See ülesanne on eepik", + "A named, dated delivery of a project that its tasks are planned against.": "Projekti nimeline ja kuupäevastatud tarne, mille järgi selle ülesandeid planeeritakse.", + "Name of the release": "Väljalaske nimi", + "The project this release belongs to": "Projekt, kuhu see väljalase kuulub", + "What this release delivers": "Mida see väljalase tarnib", + "When work on the release starts": "Millal väljalaske kallal töö algab", + "The date the release is due": "Kuupäev, milleks väljalase peab valmis olema", + "Whether the release is planned, released or archived": "Kas väljalase on planeeritud, välja lastud või arhiveeritud", + "Released on": "Välja lastud", + "When the release was marked as released": "Millal väljalase välja lastuks märgiti", + "The release this task is planned for": "Väljalase, mille jaoks see ülesanne on planeeritud", + "Board view options": "Tahvli vaate valikud", + "Colour cards": "Värvi kaardid", + "No colour": "Värvita", + "By label": "Sildi järgi", + "Swimlanes": "Ujumisrajad", + "No swimlanes": "Ujumisradadeta", + "By assignee": "Täitja järgi", + "By epic": "Eepose järgi", + "No assignee": "Määramata", + "No epic": "Eeposeta", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kaardid jäävad oma eepose reale. Muuda eepost ülesande lehel.", + "Hand over to": "Anna üle", + "Could not save your board view. It applies until you reload.": "Tahvli vaadet ei salvestatud. See kehtib kuni lehe uuesti laadimiseni.", + "Timetable wish": "Tunniplaanisoov", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Soov, mida generaator arvestab. Ranget soovi peab ta alati kinni, paindlikku siis, kui saab.", + "Whether the wish is about a teacher, a group, a room or one activity": "Kas soov puudutab õpetajat, rühma, ruumi või üht tegevust", + "Teacher": "Õpetaja", + "Group": "Rühm", + "Reference": "Viide", + "The user, group, room or activity the wish is about": "Kasutaja, rühm, ruum või tegevus, mida soov puudutab", + "What the wish asks for": "Mida soov palub", + "Not on these periods": "Mitte nendel tundidel", + "Preferably not on these periods": "Pigem mitte nendel tundidel", + "At most a number of lessons a day": "Kõige rohkem teatud arv tunde päevas", + "No free periods between lessons": "Tundide vahel aknaid pole", + "Always the same room": "Alati sama ruum", + "Periods": "Tunnid", + "The periods of the week the wish is about, such as wed-5": "Nädala tunnid, mida soov puudutab, näiteks wed-5", + "Limit": "Piir", + "The most lessons a day, for a wish of that kind": "Kõige rohkem tunde päevas, sellist liiki soovi puhul", + "Strength": "Tugevus", + "Whether the generator must keep the wish or should keep it": "Kas generaator peab või peaks soovist kinni pidama", + "Hard": "Range", + "Soft": "Paindlik", + "Weight": "Kaal", + "How much a soft wish counts, from 1 to 3": "Kui palju paindlik soov loeb, 1 kuni 3", + "Why the wish exists": "Miks soov olemas on", + "Timetable scenario": "Tunniplaani stsenaarium", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Üks nädalamuster, generaatori tehtud või praegusest tunniplaanist võetud. See hoiab oma sisendit ja seda, kui hästi ta soove täidab.", + "The name timetablers know the scenario by": "Nimi, mille all tunniplaani koostajad stsenaariumi tunnevad", + "Whether the generator made it or it came from the current timetable": "Kas generaator tegi selle või tuleb see praegusest tunniplaanist", + "Generated": "Genereeritud", + "From the current timetable": "Praegusest tunniplaanist", + "Week of": "Nädal alates", + "The Monday of the first week of the window": "Perioodi esimese nädala esmaspäev", + "Window start": "Perioodi algus", + "The first day the week pattern applies to": "Esimene päev, mille kohta nädalamuster kehtib", + "Window end": "Perioodi lõpp", + "The last day the week pattern applies to": "Viimane päev, mille kohta nädalamuster kehtib", + "Waiting, generating, done, failed, or published as draft lessons": "Ootel, genereerimisel, valmis, ebaõnnestus või avaldatud mustandtundidena", + "Waiting": "Ootel", + "Generating": "Genereerimisel", + "Failed": "Ebaõnnestus", + "Published": "Avaldatud", + "Seed": "Seeme", + "The number the generator starts from, so a run can be repeated": "Arv, millest generaator alustab, et käivitust saaks korrata", + "Input": "Sisend", + "The periods, rooms, lessons and wishes the scenario was made from": "Tunnid, ruumid, õppetunnid ja soovid, millest stsenaarium tehti", + "Placements": "Paigutused", + "Each lesson with the period and room it was given": "Iga õppetund koos saadud tunni ja ruumiga", + "Unplaced lessons": "Paigutamata õppetunnid", + "Lessons without a place, each with the hard wish that blocked it": "Kohata õppetunnid, igaüks koos range sooviga, mis selle peatas", + "Broken wishes": "Rikutud soovid", + "The wishes this scenario breaks, with the lessons that break them": "Soovid, mida see stsenaarium rikub, koos neid rikkuvate õppetundidega", + "Measures": "Mõõdikud", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Paigutatud õppetunnid, rikutud soovid, õpetajate aknad, tunnid päevas ja ruumikasutus", + "Reason": "Põhjus", + "Why the run failed": "Miks käivitus ebaõnnestus", + "Published at": "Avaldatud", + "When the scenario was written out as draft lessons": "Millal stsenaarium kirjutati mustandtundideks", + "Edit wish": "Muuda soovi", + "New wish": "Uus soov", + "Hard: the generator always keeps it": "Kohustuslik: generaator peab sellest alati kinni", + "Soft: the generator keeps it where it can": "Paindlik: generaator peab sellest kinni, kui saab", + "Weight (1 to 3)": "Kaal (1 kuni 3)", + "Most lessons a day": "Kõige rohkem tunde päevas", + "Period": "Tund", + "{day} period {number}": "{day} tund {number}", + "Teacher (user name)": "Õpetaja (kasutajanimi)", + "Activity (group:subject)": "Tegevus (rühm:aine)", + "Say who or what the wish is about.": "Märkige, kelle või mille kohta soov on.", + "Choose at least one period.": "Valige vähemalt üks tund.", + "The limit is a whole number of 1 or more.": "Piirang on täisarv 1 või rohkem.", + "Timetable": "Tunniplaan", + "Wishes": "Soovid", + "Timetable wishes": "Tunniplaani soovid", + "Generator run": "Generaatori käivitus", + "Generator progress": "Generaatori edenemine", + "The run failed: {reason}": "Käivitus ebaõnnestus: {reason}", + "{placed} of {lessons} lessons placed": "Paigutatud {placed} tundi {lessons}-st", + "Generate again": "Genereeri uuesti", + "Generate": "Genereeri", + "Every lesson has a place.": "Igal tunnil on koht.", + "Lesson": "Tund", + "No free period and room": "Vaba tundi ja ruumi pole", + "Broken soft wishes": "Rikutud paindlikud soovid", + "Every soft wish is kept.": "Iga paindlik soov on täidetud.", + "Wish": "Soov", + "Lessons": "Tunnid", + "Generating: {percent}% of the time budget used": "Genereerimine: kasutatud {percent}% ajast", + "Waiting to start": "Ootab algust", + "Published as draft lessons": "Avaldatud mustandtundidena", + "Could not read the scenario.": "Stsenaariumi ei saanud lugeda.", + "Could not start the run.": "Käivitust ei saanud alustada.", + "Scenarios": "Stsenaariumid", + "Timetable scenarios": "Tunniplaani stsenaariumid", + "Scenario": "Stsenaarium", + "Take the current timetable": "Võta praegune tunniplaan", + "Could not take the current timetable.": "Praegust tunniplaani ei õnnestunud võtta.", + "Broken hard wishes": "Rikutud kohustuslikud soovid", + "Not on a period of the week grid": "Ei ole nädalavõrgu tunnil", + "Compare scenarios": "Võrdle stsenaariume", + "Scenarios to compare": "Võrreldavad stsenaariumid", + "Choose two or three scenarios to compare them.": "Valige võrdlemiseks kaks või kolm stsenaariumi.", + "Measure": "Näitaja", + "Best": "Parim", + "Lessons that differ": "Erinevad tunnid", + "No lesson differs.": "Ükski tund ei erine.", + "Not placed": "Paigutamata", + "{period} in {room}": "{period} ruumis {room}", + "Lessons placed": "Paigutatud tunnid", + "Lessons without a place": "Kohata tunnid", + "Clashes": "Kokkupõrked", + "Hard wishes broken": "Rikutud kohustuslikud soovid", + "Soft wishes broken": "Rikutud paindlikud soovid", + "Soft wishes broken, weighted": "Rikutud paindlikud soovid, kaalutud", + "Free periods between lessons, all teachers": "Aknatunnid, kõik õpetajad", + "Most free periods of one teacher": "Ühe õpetaja kõige rohkem aknatunde", + "Most lessons of one group on a day": "Ühe rühma kõige rohkem tunde päevas", + "Room use": "Ruumide kasutus", + "Publish as draft lessons": "Avalda mustandtundidena", + "Draft lessons written: {count}": "Mustandtunde kirjutatud: {count}", + "Could not publish the scenario.": "Stsenaariumi ei õnnestunud avaldada.", + "Rules": "Reeglid", + "Rules for {column}": "Veeru {column} reeglid", + "When a card enters this column": "Kui kaart jõuab sellesse veergu", + "Action": "Toiming", + "Set the priority": "Määra prioriteet", + "Assign to": "Määra täitjaks", + "Assign the person who moved the card": "Määra täitjaks kaardi liigutaja", + "Remove the assignee": "Eemalda täitja", + "Add a label": "Lisa silt", + "No longer a project member": "Pole enam projekti liige", + "This label no longer exists": "Seda silti enam ei ole", + "Add rule": "Lisa reegel", + "Remove rule": "Eemalda reegel", + "No rules yet. Add one to change a card when it enters this column.": "Reegleid veel pole. Lisa reegel, mis muudab kaarti, kui see jõuab sellesse veergu.", + "Could not save the rules. Please try again.": "Reegleid ei õnnestunud salvestada. Proovi uuesti.", + "1 rule runs when a card enters this column": "1 reegel käivitub, kui kaart jõuab sellesse veergu", + "{count} rules run when a card enters this column": "{count} reeglit käivitub, kui kaart jõuab sellesse veergu", + "Rules applied: {changes}": "Rakendatud reeglid: {changes}", + "assigned to {name}": "täitja {name}", + "assignee removed": "täitja eemaldatud", + "priority {priority}": "prioriteet {priority}", + "label {label}": "silt {label}", + "What happens to a card when it enters this column, applied in list order.": "Mis juhtub kaardiga, kui see jõuab sellesse veergu, loendi järjekorras.", + "Value": "Väärtus", + "What the rule does to the card.": "Mida reegel kaardiga teeb.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioriteet, kasutaja ID või sildi ID, mida toiming kasutab; tühi väärtuseta toimingute puhul.", + "is not": "ei ole", + "{dimension} is not": "{dimension} ei ole", + "Saved filters": "Salvestatud filtrid", + "No saved filters yet": "Salvestatud filtreid veel pole", + "Save filter": "Salvesta filter", + "Rename \"{name}\"": "Nimeta „{name}” ümber", + "Delete \"{name}\"": "Kustuta „{name}”", + "Clear filters": "Tühjenda filtrid", + "Showing {shown} of {total} tasks": "Kuvatud {shown} ülesannet {total}-st", + "Me": "Mina", + "No date": "Kuupäevata", + "Rename saved filter": "Nimeta salvestatud filter ümber", + "Share with the project": "Jaga projektiga", + "Give the filter a name": "Anna filtrile nimi", + "Could not save the filter. Please try again.": "Filtrit ei õnnestunud salvestada. Proovi uuesti.", + "Some labels in \"{name}\" no longer exist and were left out.": "Mõnda silti filtris „{name}” enam pole ja need jäeti välja.", + "Could not delete the filter. Please try again.": "Filtrit ei õnnestunud kustutada. Proovi uuesti.", + "Saved filter": "Salvestatud filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Ühe projekti nimega tahvlifilter, nähtav ainult salvestajale, kui seda pole projektiga jagatud.", + "The project whose board the filter applies to": "Projekt, mille tahvlile filter kehtib", + "The name the filter is listed under": "Nimi, millega filter loendis on", + "Saved by": "Salvestaja", + "Nextcloud user id of the person who saved the filter": "Filtri salvestaja Nextcloudi kasutaja-ID", + "Shared with the project": "Jagatud projektiga", + "Whether every project member sees and applies the filter": "Kas iga projekti liige näeb filtrit ja saab seda rakendada", + "Criteria": "Kriteeriumid", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filter: täitja, silt, prioriteet ja tähtaeg, igaüks väärtusega on või ei ole ja oma väärtustega", + "Cross-project view": "Projektiülene vaade", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Salvestatud projektide valik, mille ülesandeid näidatakse koos olekuradadel ja mida jagatakse nimetatud inimestega.", + "Shared with": "Jagatud", + "The name the view is listed under": "Nimi, mille all vaade on loetletud", + "Nextcloud user id of the person who saved the view": "Vaate salvestanud inimese Nextcloudi kasutaja-ID", + "Nextcloud user ids of the people the view is shared with": "Nende inimeste Nextcloudi kasutaja-ID-d, kellega vaadet jagatakse", + "The projects whose tasks the view shows, at most twenty": "Projektid, mille ülesandeid vaade näitab, kõige rohkem kakskümmend", + "1 project in this view is hidden from you.": "1 selle vaate projekt on sinu eest peidetud.", + "{count} projects in this view are hidden from you.": "{count} selle vaate projekti on sinu eest peidetud.", + "{project} has no column for {status}.": "Projektil {project} pole veergu olekule {status}.", + "This view does not exist or is not shared with you.": "Seda vaadet pole olemas või seda pole sinuga jagatud.", + "\"{task}\" moved to {status}.": "\"{task}\" viidi olekusse {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Projektiülesed vaated", + "New view": "Uus vaade", + "Edit view": "Muuda vaadet", + "Delete view": "Kustuta vaade", + "Give the view a name": "Anna vaatele nimi", + "Pick at least one project": "Vali vähemalt üks projekt", + "A view shows at most {max} projects": "Vaade näitab kõige rohkem {max} projekti", + "Could not save the view. Please try again.": "Vaadet ei õnnestunud salvestada. Proovi uuesti.", + "Could not delete the view. Please try again.": "Vaadet ei õnnestunud kustutada. Proovi uuesti.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Kas kustutada \"{title}\"? Projektid ja nende ülesanded jäävad samaks.", + "People see the tasks of the projects they are in, never more.": "Igaüks näeb ainult nende projektide ülesandeid, kus ta osaleb.", + "No views yet. A view shows the tasks of several of your projects together.": "Vaateid veel pole. Vaade näitab mitme sinu projekti ülesandeid koos.", + "Projects in view: {count}": "Projekte vaates: {count}", + "Notify me when a task is assigned to me": "Teavita mind, kui mulle määratakse ülesanne", + "Also send these to me by email": "Saada need mulle ka e-postiga", + "Add an email address in your Nextcloud personal settings to get mail.": "E-kirjade saamiseks lisa Nextcloudi isiklikes seadetes e-posti aadress.", + "Code link": "Koodilink", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Kommit, haru, ühendamistaotlus või probleem koodiplatvormil, mis on seotud ülesandega.", + "The task the link belongs to": "Ülesanne, millele link kuulub", + "The project of the task": "Ülesande projekt", + "Task key": "Ülesande võti", + "The task key the forge text named, such as VC-12": "Ülesande võti, mida koodiplatvormi tekst nimetas, näiteks VC-12", + "What the link points at": "Kuhu link viitab", + "Link": "Link", + "The address of the item in the forge": "Üksuse aadress koodiplatvormil", + "The commit message, branch name or merge request title": "Kommiti sõnum, haru nimi või ühendamistaotluse pealkiri", + "Repository": "Hoidla", + "The repository, such as acme/portal": "Hoidla, näiteks acme/portal", + "Forge id": "Id platvormil", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Üksuse enda id koodiplatvormil, näiteks github:acme/portal#42 või kommiti räsi", + "State": "Olek", + "The state of a merge request or issue": "Ühendamistaotluse või probleemi olek", + "Who made the commit or opened the merge request": "Kes tegi kommiti või avas ühendamistaotluse", + "When the commit was made or the merge request last changed": "Millal kommit tehti või ühendamistaotlus viimati muutus", + "Added by": "Lisaja", + "Whether a person added the link or the integration wrote it": "Kas lingi lisas inimene või kirjutas selle integratsioon", + "Nextcloud user UIDs of project members": "Projekti liikmete Nextcloudi kasutajatunnused", + "Add link": "Lisa link", + "Added by hand": "Lisatud käsitsi", + "Branch": "Haru", + "Code": "Kood", + "Commit": "Kommit", + "From the integration": "Integratsioonist", + "Link to a commit, branch or merge request": "Link kommitile, harule või ühendamistaotlusele", + "Merge request": "Ühendamistaotlus", + "Merged": "Ühendatud", + "No code linked yet. Name {key} in a commit message or paste a link.": "Koodi pole veel lingitud. Nimeta {key} kommiti sõnumis või kleebi link.", + "No code linked yet. Paste a link to a commit or merge request.": "Koodi pole veel lingitud. Kleebi link kommitile või ühendamistaotlusele.", + "Paste a web address that starts with https://.": "Kleebi veebiaadress, mis algab https://.", + "Remove link {title}": "Eemalda link {title}", + "The link could not be added.": "Linki ei õnnestunud lisada.", + "The link could not be removed.": "Linki ei õnnestunud eemaldada.", + "This link is already on the task.": "See link on ülesandel juba olemas.", + "Code forges": "Koodiplatvormid", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Seo GitHubi kommitid ja pull requestid ülesannetega. Integriq võtab sündmused vastu; planninq ei pöördu kunagi GitHubi poole.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Laadi seadistus alla ja impordi see Integriqi. Seejärel sisesta saladus reeglisse \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Lisa GitHubis hoidlale selle aadressi ja sama saladusega webhook. Vali sisutüübiks application/json ning sündmused push ja pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nimeta ülesande võti, näiteks VC-12, kommiti sõnumis, haru nimes või pull requesti pealkirjas. Link ilmub siis selle ülesande juurde.", + "Without Integriq, project members can still paste a link on the task page.": "Ilma Integriqita saavad projekti liikmed ikka lingi ülesande lehele kleepida.", + "Download the Integriq configuration": "Laadi alla Integriqi seadistus", + "Calendar": "Kalender", + "Previous": "Eelmine", + "Calendar view": "Kalendrivaade", + "Starts:": "Algab:", + "No tasks with a date in this month.": "Selles kuus pole kuupäevaga ülesandeid.", + "Week of {start} to {end}": "Nädal {start} kuni {end}", + "My calendar": "Minu kalender", + "Show as list": "Näita loendina", + "Show as calendar": "Näita kalendrina", + "Open my calendar": "Ava minu kalender", + "Nextcloud Tasks": "Nextcloudi ülesanded", + "Show my tasks in Nextcloud Tasks": "Näita minu ülesandeid Nextcloudi ülesannetes", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Sulle määratud või sinuga jagatud ülesanded ilmuvad loendis \"Planninq\" Nextcloudi ülesannetes ja kalendris. Seal tehtud muudatused asendatakse järgmise muudatusega Planninqis.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "See server ei saa Nextcloudi ülesannetesse kirjutada, seega eksport pole saadaval.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Haldab Planninq. Siin tehtud muudatused asendatakse järgmise muudatusega Planninqis.", + "Working days and holidays": "Tööpäevad ja pühad", + "Dates set on the timeline skip the days that are not working days.": "Ajajoonel määratud kuupäevad jätavad vahele päevad, mis ei ole tööpäevad.", + "Working weekdays": "Nädala tööpäevad", + "Non-working days": "Puhkepäevad", + "No non-working days yet.": "Puhkepäevi veel pole.", + "Add day": "Lisa päev", + "Year": "Aasta", + "Add Dutch national holidays": "Lisa Madalmaade riigipühad", + "Save working days": "Salvesta tööpäevad", + "Choose at least one working weekday.": "Vali vähemalt üks tööpäev.", + "Working days saved.": "Tööpäevad salvestatud.", + "Could not save the working days.": "Tööpäevi ei õnnestunud salvestada.", + "New Year's Day": "Uusaasta", + "Easter Sunday": "Ülestõusmispühade 1. päev", + "Easter Monday": "Ülestõusmispühade 2. päev", + "King's Day": "Kuningapäev", + "Liberation Day": "Vabastamispäev", + "Ascension Day": "Taevaminemispüha", + "Whit Sunday": "Nelipühade 1. päev", + "Whit Monday": "Nelipühade 2. päev", + "Christmas Day": "Esimene jõulupüha", + "Boxing Day": "Teine jõulupüha", + "Dates of {title}": "Ülesande {title} kuupäevad", + "The due date cannot be before the start date.": "Tähtaeg ei saa olla enne alguskuupäeva.", + "{title}, from {start} to {end}": "{title}, {start} kuni {end}", + "The dates could not be saved.": "Kuupäevi ei õnnestunud salvestada.", + "{title} now runs from {start} to {end}": "{title} kestab nüüd {start} kuni {end}", + "Auto-scheduling": "Automaatne planeerimine", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kui see on sees, pakub tähtaja hilisemaks nihutamine ajajoonel ka selle blokeeritud ülesannete nihutamist.", + "Move blocked tasks along when a task slips": "Nihuta blokeeritud ülesandeid, kui ülesanne hilineb", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Ajajoonel pakub hilisem tähtaeg blokeeritud ülesannete nihutamist. Arvesse lähevad ainult \"blokeerib\"-lingid ja ülesanded nihkuvad ainult hilisemaks.", + "Move the tasks that wait for {title}?": "Kas nihutada ülesandeid, mis ootavad ülesannet {title}?", + "These tasks wait for it and would start after its new due date:": "Need ülesanded ootavad seda ja algaksid pärast uut tähtaega:", + "{count} tasks would move; the first {limit} are listed.": "Nihutataks {count} ülesannet; näidatud on esimesed {limit}.", + "Now": "Praegu", + "After the move": "Pärast nihutamist", + "Only this task": "Ainult see ülesanne", + "Move all": "Nihuta kõik", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Peatus ülesande {title} juures: kuupäevi ei õnnestunud salvestada. Sellele eelnenud ülesanded nihutati.", + "Cumulative flow": "Kumulatiivne voog", + "Show as chart": "Näita diagrammina", + "Show as table": "Näita tabelina", + "Tasks per column per day": "Ülesanded veeru kaupa päevas", + "Tasks without recorded history in this period: {count}": "Ülesanded ilma salvestatud ajaloota sel perioodil: {count}", + "Lead and cycle time": "Läbimisaeg ja tsükliaeg", + "No tasks were finished in this period.": "Sel perioodil ei lõpetatud ühtegi ülesannet.", + "Finished tasks": "Lõpetatud ülesanded", + "Cycle time, average": "Tsükliaeg, keskmine", + "Cycle time, 85th percentile": "Tsükliaeg, 85. protsentiil", + "Lead time, average": "Läbimisaeg, keskmine", + "Tasks whose finish time was estimated from their history: {count}": "Ülesanded, mille lõpuaeg hinnati ajaloo põhjal: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Iga lõpetatud ülesande tsükliaeg koos keskmise ja 85. protsentiiliga", + "Slowest tasks": "Aeglaseimad ülesanded", + "cycle {cycle}, lead {lead}": "tsükkel {cycle}, läbimine {lead}", + "{days} days": "{days} päeva", + "Could not load the flow of this project.": "Selle projekti voogu ei õnnestunud laadida.", + "Last {days} days": "Viimased {days} päeva", + "Portfolio flow": "Portfelli voog", + "An admin adds portfolios under Projects, Portfolios.": "Administraator lisab portfellid jaotises Projektid, Portfellid.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Kuvamata projektid, sest korraga kuvatakse kuni 50: {count}", + "Could not load the flow of this portfolio.": "Selle portfelli voogu ei õnnestunud laadida.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulatiivne voog ja tsükliaeg portfelli projektides.", + "Edit report": "Muuda aruannet", + "Only tasks where": "Ainult ülesanded, kus", + "Group by": "Rühmita", + "Display": "Kuva", + "Share with everyone who can read its projects": "Jaga kõigiga, kes saavad selle projekte lugeda", + "The report could not be saved.": "Aruannet ei õnnestunud salvestada.", + "Number of tasks": "Ülesannete arv", + "Bar": "Tulp", + "Donut": "Rõngas", + "Table": "Tabel", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} projekti {total}-st selles aruandes pole sulle nähtavad", + "No tasks match this report.": "Ükski ülesanne ei vasta sellele aruandele.", + "None": "Puudub", + "Could not load this report.": "Seda aruannet ei õnnestunud laadida.", + "Report": "Aruanne", + "Your reports": "Sinu aruanded", + "My reports": "Minu aruanded", + "Shared reports": "Jagatud aruanded", + "You have not built a report yet.": "Sa pole veel ühtegi aruannet koostanud.", + "Nobody has shared a report with you yet.": "Keegi pole sinuga veel aruannet jaganud.", + "Reports you built over tasks, and the ones shared with you.": "Aruanded, mille sa ülesannete põhjal koostasid, ja need, mida sinuga jagati.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Salvestatud päring ülesannete kohta: millised projektid, millised filtrid, mille järgi rühmitatud, loendatud või summeeritud, ja näidatud tabeli või diagrammina.", + "The name the report is listed under": "Nimi, mille all aruanne loendis on", + "What the report shows and who it is for": "Mida aruanne näitab ja kellele see on", + "Nextcloud user id of the person who saved the report": "Aruande salvestanud isiku Nextcloudi kasutaja-ID", + "Who can open the report": "Kes saab aruannet avada", + "Only me": "Ainult mina", + "Everyone who can read its projects": "Kõik, kes saavad selle projekte lugeda", + "The projects the report covers, at most fifty": "Projektid, mida aruanne hõlmab, kuni viiskümmend", + "Filters": "Filtrid", + "Task fields and the value each must equal": "Ülesande väljad ja väärtus, millega igaüks peab võrduma", + "The task field the report groups on": "Ülesande väli, mille järgi aruanne rühmitab", + "Count the tasks, or add up a number on them": "Loenda ülesanded või liida nende arv", + "Sum": "Summa", + "Sum of": "Summa väljast", + "The number added up when the measure is a sum": "Arv, mis liidetakse, kui mõõt on summa", + "Story points": "Lugupunktid", + "Estimated duration": "Hinnanguline kestus", + "How the report is shown": "Kuidas aruannet näidatakse", + "Issue type": "Pileti tüüp", + "Task fields and the value each must equal; empty when the report covers every task": "Ülesande väljad ja väärtus, mis igaühel peab olema; tühi, kui aruanne hõlmab kõiki ülesandeid", + "The status a task must have": "Olek, mis ülesandel peab olema", + "The priority a task must have": "Prioriteet, mis ülesandel peab olema", + "The user a task must be assigned to": "Kasutaja, kellele ülesanne peab olema määratud", + "A label a task must carry": "Silt, mis ülesandel peab olema", + "The board column a task must be in": "Tahvli veerg, kus ülesanne peab olema", + "The issue type a task must have": "Pileti tüüp, mis ülesandel peab olema", + "Manager groups": "Juhtide rühmad", + "Member groups": "Liikmete rühmad", + "Viewer groups": "Lugejate rühmad", + "Viewers": "Lugejad", + "Owning group": "Omanikrühm", + "Nextcloud groups whose members manage the project": "Nextcloudi rühmad, mille liikmed juhivad projekti", + "Nextcloud groups whose members work on the project": "Nextcloudi rühmad, mille liikmed töötavad projektis", + "Nextcloud groups whose members may read the project": "Nextcloudi rühmad, mille liikmed võivad projekti lugeda", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloudi kasutajad, kes juhivad projekti: seadeid, liikmeid ja tööd", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloudi kasutajad, kes võivad projekti ja selle tööd lugeda, kuid mitte muuta", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloudi rühm, kellele projekt koos selle loojaga kuulub, kõige rohkem üks", + "Nextcloud user ids who may read this through the project": "Nextcloudi kasutajad, kes võivad seda projekti kaudu lugeda", + "Nextcloud groups whose members may change this through the project": "Nextcloudi rühmad, mille liikmed võivad seda projekti kaudu muuta", + "Nextcloud groups whose members may read this through the project": "Nextcloudi rühmad, mille liikmed võivad seda projekti kaudu lugeda", + "Search for a person or a group…": "Otsi inimest või gruppi…", + "No one found. Your admin's sharing settings decide who you can find.": "Kedagi ei leitud. Sinu administraatori jagamisseaded määravad, keda saad leida.", + "Type at least two characters": "Sisesta vähemalt kaks märki", + "Everyone in this group": "Kõik selles grupis", + "Could not search for people. Please try again.": "Inimeste otsimine ebaõnnestus. Proovi uuesti.", + "Could not remove the group": "Gruppi ei õnnestunud eemaldada", + "Only the owner and managers change who is on this project.": "Ainult omanik ja haldurid muudavad, kes selles projektis on.", + "Role of {name}": "Kasutaja {name} roll", + "Manager": "Haldur", + "Member": "Liige", + "Viewer": "Lugeja", + "Could not change the role": "Rolli ei õnnestunud muuta", + "Owned by group: {name}": "Grupi omandis: {name}", + "No group owns this project.": "Ükski grupp ei oma seda projekti.", + "Owned by group": "Grupi omandis", + "Search for a group…": "Otsi gruppi…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Gruppi ei leitud. Sinu administraatori jagamisseaded määravad, milliseid gruppe saad leida.", + "No owning group": "Omanikgruppi pole", + "Could not search for groups. Please try again.": "Gruppide otsimine ebaõnnestus. Proovi uuesti.", + "Could not change the owning group": "Omanikgruppi ei õnnestunud muuta", + "You can read this project. Only its members change it.": "Saad seda projekti lugeda. Muudavad seda ainult selle liikmed.", + "Course": "Kursus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursus, mida selles tunnis õpetatakse, näiteks valikaine, kui kooli õpperakendus seda teab.", + "Online meeting link": "Veebitunni link", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kus õpilased selle tunniga veebis liituvad. Nupp Liitu kuvatakse ainult https-lingi korral." }, "plurals": null } diff --git a/l10n/fi.js b/l10n/fi.js index f8d3ce4c..c4803b31 100644 --- a/l10n/fi.js +++ b/l10n/fi.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktiiviset projektit", + "Archived projects": "Arkistoidut projektit", + "Boards": "Taulut", + "My projects": "Omat projektit", + "Portfolio": "Portfolio", + "Project board": "Projektitaulu", + "Projects I am in": "Projektit joissa olen mukana", + "Timeline": "Aikajana", + "Timesheet": "Tuntikirjaus", + "Features & roadmap": "Ominaisuudet ja tiekartta", + "Flow": "Kulku", + "Flows": "Kulut", + "Reports": "Raportit", + "Pick a report to open it.": "Valitse raportti avataksesi sen.", + "In progress": "Käynnissä", + "Date": "Päivämäärä", + "Due": "Määräpäivä", + "Assignee": "Vastuuhenkilö", + "Who": "Kuka", + "What": "Mitä", + "Minutes": "Minuutit", + "Entries": "Merkinnät", + "Most recent": "Uusimmat", + "Per person": "Henkilöä kohti", + "By status": "Tilan mukaan", + "By priority": "Prioriteetin mukaan", + "Task status": "Tehtävien tila", + "Time spent": "Käytetty aika", + "Capacity": "Kapasiteetti", + "Due soonest": "Erääntyy ensin", + "Minutes logged": "Kirjatut minuutit", + "Nothing is due": "Mikään ei eräänny", + "Nothing logged yet": "Mitään ei ole vielä kirjattu", + "What is open, what is blocked, and what is overdue.": "Mikä on avoinna, mikä estetty ja mikä myöhässä.", + "How allocation is spread across the people working on projects.": "Miten kuormitus jakautuu projekteissa työskentelevien kesken.", + "Hours logged, and the projects they went to.": "Kirjatut tunnit ja projektit, joihin ne menivät.", + "Billable": "Laskutettava", + "Budget: {amount}": "Budjetti: {amount}", + "Loading projects": "Ladataan projekteja", + "No projects for this client yet": "Tälle asiakkaalle ei ole vielä projekteja", + "Open in Planninq": "Avaa Planninqissa", + "This project could not be found": "Tätä projektia ei löytynyt", + "Untitled project": "Nimetön projekti", + "and {count} more": "ja {count} muuta", + "Store": "Kauppa", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Asenna muiden organisaatioiden julkaisemia rekistereitä, skeemoja ja vuokaavioita.", + "Work Date": "Työpäivä", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Sarakkeen toiminnot", + "Columns": "Sarakkeet", + "Could not remove the column. Please try again.": "Saraketta ei voitu poistaa. Yritä uudelleen.", + "Could not save the column. Please try again.": "Saraketta ei voitu tallentaa. Yritä uudelleen.", + "Done column": "Valmis-sarake", + "Edit column": "Muokkaa saraketta", + "Keep the card's status": "Säilytä kortin tila", + "Move its cards to": "Siirrä sen kortit sarakkeeseen", + "Move left": "Siirrä vasemmalle", + "Move right": "Siirrä oikealle", + "Status of cards moved here": "Tänne siirrettyjen korttien tila", + "The last done column cannot be removed.": "Viimeistä valmis-saraketta ei voi poistaa.", + "WIP limit": "WIP-raja", + "over limit": "yli rajan", + "The status a card gets when it is moved into this column.": "Tila, jonka kortti saa, kun se siirretään tähän sarakkeeseen.", + "All priorities": "Kaikki prioriteetit", + "Could not create the task. Please try again.": "Tehtävää ei voitu luoda. Yritä uudelleen.", + "Created": "Luotu", + "Move to backlog": "Backlogiin", + "Move to board": "Taululle", + "New task": "Uusi tehtävä", + "Nothing in the backlog": "Backlog on tyhjä", + "Rank": "Järjestys", + "Sort by": "Lajitteluperuste", + "Sort by rank to reorder": "Lajittele järjestyksen mukaan muuttaaksesi järjestystä", + "Task actions": "Tehtävän toiminnot", + "All labels": "Kaikki tunnisteet", + "Filter tasks by label": "Suodata tehtäviä tunnisteen mukaan", + "View timeline": "Näytä aikajana", + "Board": "Taulu", + "List": "Luettelo", + "Column": "Sarake", + "Board or list": "Taulu tai luettelo", + "Log": "Loki", + "Add entry": "Lisää merkintä", + "Show": "Näytä", + "No actions yet": "Ei vielä toimenpiteitä", + "Closed": "Suljettu", + "Entry actions": "Merkinnän toiminnot", + "Add action": "Lisää toimenpide", + "by {author}": "tekijä {author}", + "saved {time}": "tallennettu {time}", + "Attendees: {names}": "Osallistujat: {names}", + "Add the first entry": "Lisää ensimmäinen merkintä", + "Issues": "Ongelmat", + "Lessons learned": "Opit", + "Meetings": "Kokoukset", + "Decisions": "Päätökset", + "Actions": "Toimenpiteet", + "Issue": "Ongelma", + "Lesson learned": "Opittu asia", + "Meeting": "Kokous", + "Decision": "Päätös", + "About this project": "Tietoa projektista", + "No description yet": "Ei vielä kuvausta", + "Start date": "Alkupäivä", + "Not set": "Ei asetettu", + "End date": "Loppupäivä", + "Progress": "Edistyminen", + "No tasks yet": "Ei vielä tehtäviä", + "Open the board": "Avaa taulu", + "People": "Henkilöt", + "Owner": "Omistaja", + "Latest log entries": "Uusimmat merkinnät", + "Open the log": "Avaa loki", + "{done} of {total} tasks done": "{done}/{total} tehtävää valmiina", + "Edit entry": "Muokkaa merkintää", + "Type": "Tyyppi", + "Attendees": "Osallistujat", + "Issue is closed": "Ongelma on suljettu", + "Could not save the entry. Please try again.": "Merkintää ei voitu tallentaa. Yritä uudelleen.", + "From: {title}": "Lähde: {title}", + "What needs to happen": "Mitä pitää tehdä", + "Could not create the action. Please try again.": "Toimenpidettä ei voitu luoda. Yritä uudelleen.", + "The action was created but could not be linked to the entry.": "Toimenpide luotiin, mutta sitä ei voitu liittää merkintään.", + "Project pages": "Projektin sivut", + "Overview": "Yleiskatsaus", + "Risks": "Riskit", + "Log entry": "Lokimerkintä", + "A short name for the entry": "Merkinnän lyhyt nimi", + "Project": "Projekti", + "The project this entry belongs to": "Projekti, johon merkintä kuuluu", + "What kind of entry this is": "Minkä tyyppinen merkintä on", + "When it happened": "Milloin se tapahtui", + "What happened, in Markdown": "Mitä tapahtui, Markdownina", + "Whether an issue is still open": "Onko ongelma yhä auki", + "The people at a meeting": "Kokouksen osallistujat", + "Tasks that came out of this entry": "Tästä merkinnästä syntyneet tehtävät", + "Add risk": "Lisää riski", + "Risk": "Riski", + "Score": "Pisteet", + "Response": "Toimintatapa", + "Review date": "Tarkistuspäivä", + "no longer on the project": "ei enää projektissa", + "Edit {title}": "Muokkaa: {title}", + "No risks recorded yet": "Riskejä ei ole vielä kirjattu", + "Add the first risk": "Lisää ensimmäinen riski", + "Medium": "Keskitaso", + "Mitigating": "Lievennetään", + "Occurred": "Toteutunut", + "Avoid": "Vältä", + "Reduce": "Pienennä", + "Transfer": "Siirrä", + "Accept": "Hyväksy", + "Highest open risks": "Suurimmat avoimet riskit", + "No open risks": "Ei avoimia riskejä", + "Open the risk register": "Avaa riskirekisteri", + "Edit risk": "Muokkaa riskiä", + "What could go wrong": "Mikä voi mennä pieleen", + "Likelihood": "Todennäköisyys", + "Impact": "Vaikutus", + "Score {score}": "Pisteet {score}", + "Countermeasures": "Vastatoimet", + "Could not save the risk. Please try again.": "Riskiä ei voitu tallentaa. Yritä uudelleen.", + "Risks by likelihood and impact": "Riskit todennäköisyyden ja vaikutuksen mukaan", + "Risk scale": "Riskiasteikko", + "The levels every project scores its risks on, and where low turns into medium and high": "Tasot, joilla jokainen projekti pisteyttää riskinsä, ja missä matala vaihtuu keskitasoon ja korkeaan", + "Number of levels": "Tasojen määrä", + "Likelihood labels": "Todennäköisyyden nimet", + "Impact labels": "Vaikutuksen nimet", + "Level {level}": "Taso {level}", + "Medium from score": "Keskitaso pisteistä", + "High from score": "Korkea pisteistä", + "Risk scale saved": "Riskiasteikko tallennettu", + "1 risk uses level {level}. Change it first.": "1 riski käyttää tasoa {level}. Muuta se ensin.", + "{count} risks use level {level}. Change them first.": "{count} riskiä käyttää tasoa {level}. Muuta ne ensin.", + "Every level needs a label, and high must start above medium.": "Jokainen taso tarvitsee nimen, ja korkean on alettava keskitason yläpuolelta.", + "The project this risk belongs to": "Projekti, johon riski kuuluu", + "The cause and the effect, in Markdown": "Syy ja seuraus, Markdownina", + "Category": "Luokka", + "A free grouping, such as planning, budget or supplier": "Vapaa ryhmittely, kuten aikataulu, budjetti tai toimittaja", + "How likely it is, on the admin's risk scale": "Kuinka todennäköinen se on ylläpitäjän riskiasteikolla", + "How hard it would hit, on the admin's risk scale": "Kuinka kovaa se osuisi ylläpitäjän riskiasteikolla", + "Likelihood times impact, calculated by the server": "Todennäköisyys kertaa vaikutus, palvelimen laskema", + "Where the risk stands": "Missä vaiheessa riski on", + "The person who watches this risk": "Henkilö, joka seuraa tätä riskiä", + "How the project answers the risk": "Miten projekti vastaa riskiin", + "What is done to prevent it or soften it, in Markdown": "Mitä tehdään sen estämiseksi tai lieventämiseksi, Markdownina", + "When to look at this risk again": "Milloin riski tarkistetaan uudelleen", + "Very low": "Hyvin matala", + "Very high": "Hyvin korkea", + "All projects": "Kaikki projektit", + "Project status report": "Projektin tilaraportti", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Päivätty raportti siitä, miten projekti on edennyt rahan, organisaation, ajan, tiedon, laadun ja riskin osalta (GROTIK-näkökulmat), kukin huomautuksella.", + "The project this report is about": "Projekti, jota raportti koskee", + "Report date": "Raportin päivämäärä", + "The day the report describes": "Päivä, jota raportti kuvaa", + "Money": "Raha", + "How the project stands on this aspect": "Miten projekti on edennyt tämän näkökulman osalta", + "On track": "Aikataulussa", + "At risk": "Riskissä", + "Off track": "Raiteiltaan", + "Money note": "Huomautus rahasta", + "A short explanation of this status": "Lyhyt selitys tälle tilalle", + "Organisation": "Organisaatio", + "Organisation note": "Huomautus organisaatiosta", + "Time": "Aika", + "Time note": "Huomautus ajasta", + "Information": "Tieto", + "Information note": "Huomautus tiedosta", + "Quality": "Laatu", + "Quality note": "Huomautus laadusta", + "Risk note": "Huomautus riskistä", + "Overall": "Kokonaisuus", + "The worst of the six statuses, calculated by the server": "Kuuden tilan huonoin, palvelimen laskema", + "Health: money": "Kunto: raha", + "Copied from the newest status report": "Kopioitu uusimmasta tilaraportista", + "Health: organisation": "Kunto: organisaatio", + "Health: time": "Kunto: aika", + "Health: information": "Kunto: tieto", + "Health: quality": "Kunto: laatu", + "Health: risk": "Kunto: riski", + "Health: overall": "Kunto: kokonaisuus", + "Health: report date": "Kunto: raportin päivämäärä", + "The date of the newest status report": "Uusimman tilaraportin päivämäärä", + "New report": "Uusi raportti", + "Only the project owner writes status reports.": "Vain projektin omistaja kirjoittaa tilaraportit.", + "Latest report, {date}": "Viimeisin raportti, {date}", + "Aspect": "Näkökulma", + "Note": "Huomautus", + "Report history": "Raporttihistoria", + "Author": "Tekijä", + "No status reports yet": "Ei vielä tilaraportteja", + "Write the first report": "Kirjoita ensimmäinen raportti", + "Choose a status for every aspect to save the report.": "Valitse tila jokaiselle näkökulmalle tallentaaksesi raportin.", + "Suggested: on track.": "Ehdotus: aikataulussa.", + "Suggested: at risk.": "Ehdotus: riskissä.", + "Suggested: off track.": "Ehdotus: raiteiltaan.", + "1 task is past its due date.": "1 tehtävä on myöhässä.", + "{count} tasks are past their due date.": "{count} tehtävää on myöhässä.", + "The end date has passed with 1 open task.": "Päättymispäivä on ohitettu, ja 1 tehtävä on avoinna.", + "The end date has passed with {count} open tasks.": "Päättymispäivä on ohitettu, ja {count} tehtävää on avoinna.", + "No open task is past its due date.": "Yksikään avoin tehtävä ei ole myöhässä.", + "The highest open risk, \"{title}\", scores {score}.": "Suurin avoin riski, \"{title}\", saa pisteet {score}.", + "There are no open risks.": "Avoimia riskejä ei ole.", + "Costs are at {percent}% of the budget.": "Kustannukset ovat {percent}% budjetista.", + "No suggestion: the project has no budget.": "Ei ehdotusta: projektilla ei ole budjettia.", + "No suggestion: no costs are recorded for this project yet.": "Ei ehdotusta: projektille ei ole vielä kirjattu kustannuksia.", + "The report was not saved. Only the project owner can write status reports.": "Raporttia ei tallennettu. Vain projektin omistaja voi kirjoittaa tilaraportteja.", + "No report": "Ei raporttia", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Samojen ihmisten johtamien projektien ryhmä, kuten osasto tai ohjelma. Sen vastuuhenkilöt lukevat jokaista siihen kuuluvaa projektia.", + "The name of the portfolio": "Salkun nimi", + "What the portfolio holds and who runs it": "Mitä salkku sisältää ja kuka sitä johtaa", + "A colour for the portfolio's section in project lists": "Väri salkun osiolle projektiluetteloissa", + "Managers": "Vastuuhenkilöt", + "Nextcloud user UIDs of the people who run the portfolio": "Salkkua johtavien ihmisten Nextcloud-käyttäjätunnukset", + "Order": "Järjestys", + "Where the portfolio comes in project lists, lowest first": "Salkun paikka projektiluetteloissa, pienin ensin", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Tämän salkun oma riskiasteikko JSON-muodossa, samassa muodossa kuin koko sovelluksen asteikko. Tyhjä tarkoittaa koko sovelluksen asteikkoa.", + "Portfolio readers": "Salkun lukijat", + "Nextcloud user UIDs of the managers of the project's portfolio": "Projektin salkun vastuuhenkilöiden Nextcloud-käyttäjätunnukset", + "The portfolio this project belongs to": "Salkku, johon tämä projekti kuuluu", + "No portfolio": "Ei salkkua", + "All portfolios": "Kaikki salkut", + "You read this project as a manager of its portfolio. Only its members change it.": "Luet tätä projektia sen salkun vastuuhenkilönä. Vain sen jäsenet muuttavat sitä.", + "Portfolios": "Salkut", + "Portfolio status": "Salkun tila", + "No portfolios yet": "Ei vielä salkkuja", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Ylläpitäjä lisää salkut kohdassa Projektit, Salkut. Salkun projektit näkyvät tässä tiloineen.", + "Roll-up": "Yhteenveto", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} aikataulussa, {atRisk} riskissä, {offTrack} raiteiltaan, {noReport} ilman raporttia", + "No project in this portfolio that you can read.": "Tässä salkussa ei ole projektia, jonka voit lukea.", + "Start": "Alku", + "End": "Loppu", + "Budget": "Budjetti", + "Last report": "Viimeisin raportti", + "Out of date": "Vanhentunut", + "Portfolio timeline": "Salkun aikajana", + "Zoom": "Zoomaus", + "Could not load the timeline": "Aikajanaa ei voitu ladata", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Ylläpitäjä lisää salkut kohdassa Projektit, Salkut. Salkun projektit näkyvät tässä yhdellä aikajanalla.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Avaa projekti nähdäksesi sen vaiheet ja tehtävät. Aikajana on vain luku -tilassa.", + "Phase: {title}": "Vaihe: {title}", + "Left out because you cannot read them: {count} projects": "Jätetty pois, koska et voi lukea niitä: {count} projektia", + "Week": "Viikko", + "Day": "Päivä", + "Month": "Kuukausi", + "Please try again later.": "Yritä myöhemmin uudelleen.", + "Status reports": "Tilaraportit", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Monenko päivän jälkeen projektin viimeisin tilaraportti merkitään vanhentuneeksi salkun yleiskatsauksessa", + "Reporting period (days)": "Raportointijakso (päivää)", + "The reporting period is a whole number of days from 1 to 365.": "Raportointijakso on kokonainen määrä päiviä väliltä 1–365.", + "Reporting period saved": "Raportointijakso tallennettu", + "The reporting period was not saved. Please try again.": "Raportointijaksoa ei tallennettu. Yritä uudelleen.", + "Every project of a portfolio with its status per aspect, rolled up.": "Salkun jokainen projekti ja sen tila näkökulmittain, yhteenvetona.", + "The projects of a portfolio on one timeline.": "Salkun projektit yhdellä aikajanalla.", + "Phases": "Vaiheet", + "Add phase": "Lisää vaihe", + "No phases yet": "Ei vielä vaiheita", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Jaa projekti vaiheisiin, kuten käynnistys, määrittely ja toteutus. Vaihe sulkeutuu, kun sen päättävä asiakirja on ladattu.", + "{hours} hours": "{hours} tuntia", + "Concluding document: {title}": "Päättävä asiakirja: {title}", + "Concluding document missing": "Päättävä asiakirja puuttuu", + "Move {title} up": "Siirrä {title} ylös", + "Move {title} down": "Siirrä {title} alas", + "Close phase": "Sulje vaihe", + "Phase": "Vaihe", + "Files": "Tiedostot", + "Notes": "Muistiinpanot", + "Audit trail": "Kirjausketju", + "Edit phase": "Muokkaa vaihetta", + "Name": "Nimi", + "Budget hours": "Budjettitunnit", + "Could not save the phase. Please try again.": "Vaihetta ei voitu tallentaa. Yritä uudelleen.", + "Close phase {title}": "Sulje vaihe {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Vaihe suljetaan sen päättävällä asiakirjalla: lataa se tässä tai valitse jokin vaiheen tiedostoista.", + "Concluding document": "Päättävä asiakirja", + "This phase has no files yet.": "Tässä vaiheessa ei ole vielä tiedostoja.", + "Upload a document": "Lataa asiakirja", + "The document was not uploaded. Please try again.": "Asiakirjaa ei ladattu. Yritä uudelleen.", + "Upload the concluding document before you close this phase.": "Lataa päättävä asiakirja ennen kuin suljet tämän vaiheen.", + "This phase cannot be closed from its current status.": "Tätä vaihetta ei voi sulkea sen nykyisestä tilasta.", + "The phase was not closed. Please try again.": "Vaihetta ei suljettu. Yritä uudelleen.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Vaiheen päättävän tiedoston tunniste. Vaihe voidaan merkitä valmiiksi vasta, kun se on asetettu ja tiedosto on liitetty.", + "Import from Microsoft Project": "Tuo Microsoft Projectista", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Valitse suunnitelma, joka on tallennettu Microsoft Projectista XML-muodossa. Mitään ei tuoda ennen kuin vahvistat.", + "Plan file": "Suunnitelmatiedosto", + "What the import creates": "Mitä tuonti luo", + "Tasks": "Tehtävät", + "Sub-tasks": "Alitehtävät", + "Milestones": "Välitavoitteet", + "Links": "Linkit", + "Already imported, updated in place: {count}": "Jo tuotu, päivitetty paikallaan: {count}", + "What does not carry over": "Mikä ei siirry", + "Tasks with resources, which are not imported: {count}": "Tehtävät, joilla on resursseja, joita ei tuoda: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tasoa 3 syvemmät tehtävät, sijoitettu tason 2 tehtävänsä alle: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Muut kuin lopusta alkuun -linkit, tuotu liittyvinä linkkeinä: {count}", + "Link lags, which are dropped: {count}": "Linkkien viiveet, jotka jätetään pois: {count}", + "Links to a summary task, which are not imported: {count}": "Linkit yhteenvetotehtävään, joita ei tuoda: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Linkit tämän suunnitelman ulkopuolisiin tehtäviin, joita ei tuoda: {count}", + "No longer in the plan": "Ei enää suunnitelmassa", + "These stay in the project; remove them yourself if they are no longer needed.": "Nämä jäävät projektiin; poista ne itse, jos niitä ei enää tarvita.", + "Import": "Tuo", + "Close": "Sulje", + "The plan is imported: {created} created, {updated} updated.": "Suunnitelma on tuotu: {created} luotu, {updated} päivitetty.", + "Links that would close a loop were left out: {count}": "Silmukan sulkevat linkit jätettiin pois: {count}", + "The import stopped part-way. Run it again to finish it.": "Tuonti pysähtyi kesken. Suorita se uudelleen viedäksesi sen loppuun.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Tallenna suunnitelma Microsoft Projectissa valitsemalla Tiedosto, Tallenna nimellä, XML-muoto, ja tuo se tiedosto.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Tämä tiedosto määrittelee DOCTYPEn tai entiteettejä, joita ei hyväksytä.", + "The file is larger than 10 MB.": "Tiedosto on yli 10 Mt.", + "The plan has more than 2,000 tasks, more than one import takes.": "Suunnitelmassa on yli 2 000 tehtävää, enemmän kuin yksi tuonti ottaa.", + "This file is not a Microsoft Project plan in XML format.": "Tämä tiedosto ei ole XML-muotoinen Microsoft Project -suunnitelma.", + "Choose a file to import.": "Valitse tuotava tiedosto.", + "Only the project owner can import a plan.": "Vain projektin omistaja voi tuoda suunnitelman.", + "The plan could not be read. Please try again.": "Suunnitelmaa ei voitu lukea. Yritä uudelleen.", + "Linked case: {title}": "Linkitetty asia: {title}", + "Linked to a case": "Linkitetty asiaan", + "Hand over to case": "Luovuta asialle", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopioi jokaisen projektin ja sen tehtävien tiedoston sekä projektia kuvaavan tiedoston muuttamattomina linkitettyyn asiaan.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopioidut tiedostot: {count}", + "Files that failed: {names}": "Epäonnistuneet tiedostot: {names}", + "The handover failed. Please try again.": "Luovutus epäonnistui. Yritä uudelleen.", + "The linked case could not be found, or you cannot open it.": "Linkitettyä asiaa ei löytynyt, tai et voi avata sitä.", + "Case handovers": "Luovutukset asialle", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Jokainen kerta, kun projektin tiedostot ja metatiedot luovutettiin asialle: milloin, kuka, mille asialle, jokainen kopioitu tiedosto SHA-256-tiivisteineen ja epäonnistuneet tiedostot.", + "Finance": "Talous", + "Add cost line": "Lisää kustannusrivi", + "Delivery terms": "Toimitusehdot", + "Billing model": "Laskutusmalli", + "Budget in euro": "Budjetti euroina", + "Budget in hours": "Budjetti tunteina", + "Hourly rate in euro": "Tuntihinta euroina", + "Planned start": "Suunniteltu alku", + "Planned end": "Suunniteltu loppu", + "Planned dates": "Suunnitellut päivät", + "Budget {amount}": "Budjetti {amount}", + "No budget agreed": "Budjetista ei ole sovittu", + "Hours": "Tunnit", + "Only the project owner and the portfolio managers see the amounts.": "Vain projektin omistaja ja salkun hallinnoijat näkevät summat.", + "Budget against cost per category": "Budjetti ja kustannukset luokittain", + "Labour (booked time)": "Työ (kirjatut tunnit)", + "No category": "Ei luokkaa", + "Hours are not available": "Tunnit eivät ole saatavilla", + "Not yet assigned to a category": "Ei vielä kohdistettu luokkaan", + "Total": "Yhteensä", + "{spent} spent, {remaining} remaining": "{spent} käytetty, {remaining} jäljellä", + "Budget against cost per phase": "Budjetti ja kustannukset vaiheittain", + "No phase": "Ei vaihetta", + "Cost lines": "Kustannusrivit", + "From the finance system": "Talousjärjestelmästä", + "Edit cost line {amount}": "Muokkaa kustannusriviä {amount}", + "No cost lines yet": "Ei vielä kustannusrivejä", + "Commitments": "Sitoumukset", + "Actual cost": "Toteutuneet kustannukset", + "Forecast": "Ennuste", + "Remaining": "Jäljellä", + "Not planned yet": "Ei vielä suunniteltu", + "{start} to {end}": "{start}–{end}", + "The terms were not saved. Please try again.": "Ehtoja ei tallennettu. Yritä uudelleen.", + "Terms saved": "Ehdot tallennettu", + "Fixed price": "Kiinteä hinta", + "Hourly": "Tuntiperusteinen", + "Not billed": "Ei laskuteta", + "Commitment": "Sitoumus", + "Edit cost line": "Muokkaa kustannusriviä", + "Kind": "Laji", + "Amount in euro": "Summa euroina", + "Remove": "Poista", + "Could not save the cost line. Only the project owner changes the money of a project.": "Kustannusriviä ei voitu tallentaa. Vain projektin omistaja muuttaa projektin rahoja.", + "Could not remove the cost line. Please try again.": "Kustannusriviä ei voitu poistaa. Yritä uudelleen.", + "{amount} over budget": "{amount} yli budjetin", + "Cost categories": "Kustannusluokat", + "The categories every project splits its budget and costs into, one per line": "Luokat, joihin jokainen projekti jakaa budjettinsa ja kustannuksensa, yksi riviä kohden", + "Categories": "Luokat", + "Give at least one category, each name once.": "Anna vähintään yksi luokka, kukin nimi kerran.", + "Cost categories saved": "Kustannusluokat tallennettu", + "The cost categories were not saved. Please try again.": "Kustannusluokkia ei tallennettu. Yritä uudelleen.", + "Finance line": "Talousrivi", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Yksi projektin rahasumma: budjetti, sitoumus, toteutunut kustannus tai ennuste, kustannusluokassa ja mahdollisesti vaiheessa. Projektin omistajan kirjaama tai talousjärjestelmän integraatiosovelluksen kautta lähettämä.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekti, johon summa kuuluu. Tyhjä talousjärjestelmän rivillä, jonka projektinumero ei vastaa mitään projektia.", + "The phase this amount belongs to, if any": "Vaihe, johon summa kuuluu, jos sellainen on", + "The cost category, one of the categories the admin set up": "Kustannusluokka, jokin ylläpitäjän määrittämistä luokista", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Onko summa budjetti, sitoumus, toteutunut kustannus vai ennuste", + "Amount": "Summa", + "The amount in the reporting currency (euro)": "Summa raportointivaluutassa (euro)", + "The date the amount was booked or is expected": "Päivä, jona summa kirjattiin tai odotetaan", + "What the amount is for": "Mihin summa on", + "Whether a person entered the line or the finance system sent it": "Kirjasiko rivin henkilö vai lähettikö sen talousjärjestelmä", + "Entered by hand": "Käsin kirjattu", + "Finance line id": "Talousrivin tunniste", + "The finance system's own id of this line. One imported line per id.": "Tämän rivin oma tunniste talousjärjestelmässä. Yksi tuotu rivi tunnistetta kohden.", + "Project number": "Projektinumero", + "The project number the finance system sent, matched against the project key": "Talousjärjestelmän lähettämä projektinumero, jota verrataan projektin avaimeen", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Rivin projektin salkku, kopioitu projektista, jotta salkun summat tarvitsevat yhden suodattimen", + "Finance readers": "Talouden lukijat", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Niiden henkilöiden Nextcloud-käyttäjätunnukset, jotka saavat nähdä summan: projektin omistaja ja salkun hallinnoijat", + "Project owner": "Projektin omistaja", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Projektin omistajan Nextcloud-käyttäjätunnus; hän saa muuttaa ja poistaa käsin kirjattuja rivejä", + "How the client pays: not billed, a fixed price, or by the hour.": "Miten asiakas maksaa: ei laskuteta, kiinteä hinta tai tuntiperusteinen.", + "Portfolio finance": "Salkun talous", + "You cannot see the money of any project in this portfolio": "Et näe tämän salkun minkään projektin rahoja", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Palvelin palautti kustannusrivejä tämän salkun ulkopuolisista projekteista, joten summat voivat olla vääriä.", + "Projects left out because you cannot see their money: {count}": "Pois jätetyt projektit, koska et näe niiden rahoja: {count}", + "Unmatched finance lines": "Kohdistamattomat talousrivit", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budjetti, sitoumukset, toteutuneet kustannukset ja ennuste salkun yhteissummina.", + "Subprojects": "Aliprojektit", + "{done} of {total}": "{done}/{total}", + "{done} of {total} tasks done, including subprojects": "{done}/{total} tehtävää valmiina, aliprojektit mukaan lukien", + "Show the subprojects of {title}": "Näytä kohteen {title} aliprojektit", + "Hide the subprojects of {title}": "Piilota kohteen {title} aliprojektit", + "Part of": "Osa kohdetta", + "No parent project": "Ei yläprojektia", + "A project cannot sit under one of its own subprojects.": "Projekti ei voi olla oman aliprojektinsa alla.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projektit voivat olla enintään kolmen tason syvyydellä: ohjelma, projekti ja aliprojekti.", + "Parent project": "Yläprojekti", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekti, jonka alla tämä projekti on, esimerkiksi ohjelma. Projektit voivat olla enintään kolmen tason syvyydellä.", + "Yes": "Kyllä", + "No": "Ei", + "{label} (required)": "{label} (pakollinen)", + "{label} is required": "{label} on pakollinen", + "Project field": "Projektikenttä", + "A field an admin adds to every project, such as a policy area or a contract value.": "Kenttä, jonka ylläpitäjä lisää jokaiseen projektiin, kuten toimiala tai sopimusarvo.", + "Key": "Avain", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Pysyvä nimi, jolla arvo tallennetaan, lower camel case -muodossa. Pidä se, kun projektit käyttävät sitä.", + "Label": "Nimike", + "The name people see next to the field": "Nimi, jonka ihmiset näkevät kentän vieressä", + "What the field holds": "Mitä kenttä sisältää", + "Text": "Teksti", + "Number": "Numero", + "Choice": "Valinta", + "Person": "Henkilö", + "Yes or no": "Kyllä tai ei", + "Options": "Vaihtoehdot", + "The choices of a choice field": "Valintakentän vaihtoehdot", + "Required": "Pakollinen", + "Whether a project must fill in the field": "Täytyykö projektin täyttää kenttä", + "Where the field appears, lowest first": "Missä kenttä näkyy, pienin ensin", + "Applies to": "Koskee", + "What the field is added to": "Mihin kenttä lisätään", + "Custom fields": "Omat kentät", + "The values of the project fields an admin defined, keyed by the field's key.": "Ylläpitäjän määrittämien projektikenttien arvot kentän avaimen mukaan.", + "Project fields": "Projektikentät", + "Related": "Liittyvät", + "Remove link": "Poista linkki", + "Link type": "Linkin tyyppi", + "Relates to": "Liittyy", + "Duplicates": "Kaksoiskappale", + "Project key": "Projektin tunnus", + "Every task number starts with it, such as VERG-42.": "Jokainen tehtävänumero alkaa sillä, esimerkiksi VERG-42.", + "This key is already used by another project.": "Toinen projekti käyttää jo tätä tunnusta.", + "Use 2 to 10 letters and digits, starting with a letter.": "Käytä 2–10 kirjainta ja numeroa, ja aloita kirjaimella.", + "The key cannot change once tasks carry it.": "Tunnus ei voi muuttua, kun tehtävillä on se.", + "Project saved. The existing tasks get their numbers in the background.": "Projekti tallennettu. Nykyiset tehtävät saavat numeronsa taustalla.", + "Next task number": "Seuraava tehtävänumero", + "The number the next task of this project gets in its key. Only the system writes it.": "Numero, jonka tämän projektin seuraava tehtävä saa tunnukseensa. Vain järjestelmä kirjoittaa sen.", + "Restore {title}": "Palauta {title}", + "Restore": "Palauta", + "Project restored": "Projekti palautettu", + "Could not restore the project": "Projektia ei voitu palauttaa", + "Bring this project back to the active list.": "Palauta projekti aktiivisten projektien luetteloon.", + "Restore project": "Palauta projekti", + "Request reason": "Pyynnön syy", + "Why the requester needs this project. Filled in when the project is requested.": "Miksi pyytäjä tarvitsee projektin. Täytetään pyynnön yhteydessä.", + "Reviewed by": "Käsittelijä", + "The user who approved or rejected the request.": "Käyttäjä, joka hyväksyi tai hylkäsi pyynnön.", + "Reviewed at": "Käsitelty", + "When the request was approved or rejected.": "Milloin pyyntö hyväksyttiin tai hylättiin.", + "Review note": "Käsittelijän huomautus", + "The reviewer's reason, shown to the requester when a request is not approved.": "Käsittelijän perustelu, jonka pyytäjä näkee, kun pyyntöä ei hyväksytä.", + "Members of these groups": "Näiden ryhmien jäsenet", + "Groups that may create projects": "Ryhmät, jotka voivat luoda projekteja", + "The group {group} no longer exists. Save to remove it.": "Ryhmää {group} ei enää ole. Poista se tallentamalla.", + "Review project request": "Käsittele projektipyyntö", + "Requested by": "Pyytäjä", + "Why it is needed": "Miksi sitä tarvitaan", + "Desired start date": "Toivottu aloituspäivä", + "Why is it not approved?": "Miksi sitä ei hyväksytä?", + "Give a reason. The requester sees it.": "Anna syy. Pyytäjä näkee sen.", + "Approve": "Hyväksy", + "Reject": "Hylkää", + "Reject request": "Hylkää pyyntö", + "The review was not saved. Try again.": "Käsittelyä ei tallennettu. Yritä uudelleen.", + "This project is waiting for review": "Projekti odottaa käsittelyä", + "This request was not approved": "Pyyntöä ei hyväksytty", + "Reason: {note}": "Syy: {note}", + "Review request": "Käsittele pyyntö", + "Request a project": "Pyydä projektia", + "Step {step} of 2": "Vaihe {step}/2", + "Why is this project needed?": "Miksi projektia tarvitaan?", + "Give a reason. The reviewer reads it.": "Anna syy. Käsittelijä lukee sen.", + "Back": "Takaisin", + "Next": "Seuraava", + "Send request": "Lähetä pyyntö", + "The request was not sent. Try again.": "Pyyntöä ei lähetetty. Yritä uudelleen.", + "Requested": "Pyydetty", + "Not approved": "Ei hyväksytty", + "Your request was sent": "Pyyntösi on lähetetty", + "Let everyone else request a project": "Anna kaikkien muiden pyytää projektia", + "Add a task": "Lisää tehtävä", + "Delete task": "Poista tehtävä", + "Edit task": "Muokkaa tehtävää", + "Write": "Kirjoita", + "Preview": "Esikatselu", + "Markdown works here: headings, lists and links.": "Markdown toimii tässä: otsikot, luettelot ja linkit.", + "Could not save the task. Please try again.": "Tehtävää ei voitu tallentaa. Yritä uudelleen.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Tehtävään \"{title}\" on kirjattu aikaa, joten sitä ei voi poistaa. Voit perua sen sen sijaan: aikakirjaukset säilyvät.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Poistetaanko \"{title}\"? Myös sen linkit muihin tehtäviin poistetaan. Tätä ei voi perua.", + "Keep task": "Säilytä tehtävä", + "Cancel task": "Peru tehtävä", + "Only the reporter, the project owner or an admin can delete this task.": "Vain ilmoittaja, projektin omistaja tai ylläpitäjä voi poistaa tämän tehtävän.", + "Could not delete the task. Please try again.": "Tehtävää ei voitu poistaa. Yritä uudelleen.", + "Could not cancel the task. Please try again.": "Tehtävää ei voitu perua. Yritä uudelleen.", + "Responsible": "Vastuuhenkilö", + "Also working on this": "Työskentelee myös tämän parissa", + "Labels": "Tunnisteet", + "Could not change the priority. Please try again.": "Prioriteettia ei voitu muuttaa. Yritä uudelleen.", + "Other project members who work on this task alongside the person responsible.": "Muut projektin jäsenet, jotka työskentelevät tehtävän parissa vastuuhenkilön kanssa.", + "Duplicate": "Monista", + "Could not copy the task. Please try again.": "Tehtävää ei voitu kopioida. Yritä uudelleen.", + "Subtasks": "Alitehtävät", + "{done} of {total} done": "{done}/{total} valmiina", + "Add a subtask": "Lisää alitehtävä", + "Checklist": "Tarkistuslista", + "Checklist item actions": "Tarkistuslistan kohdan toiminnot", + "Add a checklist item": "Lisää tarkistuslistan kohta", + "Subtasks: {estimate} estimated, {logged} logged": "Alitehtävät: {estimate} arvioitu, {logged} kirjattu", + "Total estimate: {total}": "Kokonaisarvio: {total}", + "Part of {title}": "Osa tehtävää {title}", + "Checklist: {count} done": "Tarkistuslista: {count} valmiina", + "This task has subtasks: {count}.": "Tällä tehtävällä on alitehtäviä: {count}.", + "Keep subtasks as separate tasks": "Säilytä alitehtävät erillisinä tehtävinä", + "Delete subtasks too": "Poista myös alitehtävät", + "Copy of {title}": "Kopio: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Tehtävä kopioitiin, mutta ei kaikkia sen alitehtäviä. Tarkista kopio.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Pieniä vaiheita tehtävän sisällä. Jokaisella kohdalla on tunniste, teksti ja tieto siitä, onko se valmis.", + "Open work per person and per project.": "Avoin työ henkilöittäin ja projekteittain.", + "View": "Näkymä", + "By person": "Henkilöittäin", + "By project": "Projekteittain", + "Hours left": "Tunteja jäljellä", + "Tasks without an estimate": "Tehtävät ilman arviota", + "Due in 14 days": "Erääntyy 14 päivän sisällä", + "Shared": "Jaetut", + "Unassigned": "Ei vastuuhenkilöä", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Näytetään työ projekteista, jotka voit nähdä. Tunnit lasketaan vastuuhenkilölle; jaetut tehtävät lasketaan ilman tunteja.", + "No open work in these projects.": "Näissä projekteissa ei ole avointa työtä.", + "Open work": "Avoin työ", + "{count} open tasks": "{count} avointa tehtävää", + "Create a project to see capacity here.": "Luo projekti nähdäksesi kapasiteetin tässä.", + "My tasks": "Omat tehtävät", + "Show all my tasks": "Näytä kaikki omat tehtävät", + "No tasks assigned to you": "Sinulle ei ole osoitettu tehtäviä", + "Browse projects": "Selaa projekteja", + "Later": "Myöhemmin", + "Due {date}": "Erääntyy {date}", + "Could not change the status. Please try again.": "Tilaa ei voitu muuttaa. Yritä uudelleen.", + "Completed today": "Valmistuneet tänään", + "My open tasks": "Omat avoimet tehtävät", + "My overdue tasks": "Omat myöhässä olevat tehtävät", + "My tasks in progress": "Omat käynnissä olevat tehtävät", + "Pin to the top": "Kiinnitä ylös", + "Unpin": "Irrota", + "Pinned": "Kiinnitetty", + "Actions for {title}": "Toiminnot: {title}", + "Could not save your project order. Please try again.": "Projektiesi järjestystä ei voitu tallentaa. Yritä uudelleen.", + "No boards yet": "Ei vielä tauluja", + "Create a project to get a board.": "Luo projekti saadaksesi taulun.", + "Use the Projects page to create and manage your projects and tasks.": "Luo ja hallitse projektejasi ja tehtäviäsi Projektit-sivulla.", + "Go to projects": "Siirry projekteihin", + "You are not a member of any projects yet.": "Et ole vielä minkään projektin jäsen.", + "Could not search for users. Please try again.": "Käyttäjien haku epäonnistui. Yritä uudelleen.", + "Project creation is restricted to administrators.": "Vain ylläpitäjät voivat luoda projekteja.", + "Only the project owner or an administrator can delete this project.": "Vain projektin omistaja tai ylläpitäjä voi poistaa tämän projektin.", + "No projects are available to you yet. Ask an administrator to create one.": "Sinulle ei ole vielä saatavilla projekteja. Pyydä ylläpitäjää luomaan sellainen.", + "Due: {date}": "Erääntyy: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Tehtävät, joilla on aloitus- tai eräpäivä, näkyvät aikajanalla. Lisää päivämäärät nähdäksesi ne tässä.", + "You do not have access to this project.": "Sinulla ei ole pääsyä tähän projektiin.", + "Zoom level": "Zoomaustaso", + "Unscheduled": "Aikatauluttamattomat", + "Start: {date}": "Alku: {date}", + "Today": "Tänään", + "No scheduled tasks": "Ei aikataulutettuja tehtäviä", + "An unexpected error occurred.": "Tapahtui odottamaton virhe.", + "Column {number} name": "Sarakkeen {number} nimi", + "Failed to save creation policy": "Luontikäytännön tallentaminen epäonnistui", + "All authenticated users": "Kaikki kirjautuneet käyttäjät", + "Control who may create new projects": "Määritä, kuka saa luoda uusia projekteja", + "Administrators only": "Vain ylläpitäjät", + "Project creation": "Projektien luonti", + "Allow project creation": "Salli projektien luonti", + "Creation policy saved successfully": "Luontikäytäntö tallennettu", + "Initializing…": "Käynnistetään…", + "e.g. 2h 30m, 90m, 1.5h": "esim. 2h 30m, 90m, 1.5h", + "Log time": "Kirjaa aikaa", + "Save estimate": "Tallenna arvio", + "Logged: {logged}": "Kirjattu: {logged}", + "over by {amount}": "{amount} yli", + "Time tracking": "Ajankäytön seuranta", + "Estimate": "Arvio", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Anna kelvollinen arvio (esim. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Anna kelvollinen kesto (esim. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Aikakirjausta ei voitu tallentaa. Yritä uudelleen.", + "Edit time entry": "Muokkaa aikakirjausta", + "Duration": "Kesto", + "Date range": "Aikaväli", + "Last week": "Viime viikko", + "No time logged": "Aikaa ei ole kirjattu", + "Log time on a task to see it here.": "Kirjaa aikaa tehtävälle nähdäksesi sen tässä.", + "To date": "Päättymispäivä", + "This week": "Tämä viikko", + "Total: {total}": "Yhteensä: {total}", + "From date": "Alkamispäivä", + "Custom range": "Mukautettu aikaväli", + "All time": "Koko aika", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Tehtävää ei voitu poistaa, joten tietoja voi jäädä jäljelle. Poista projekti uudelleen.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Aikakirjausta ei voitu poistaa, joten tietoja voi jäädä jäljelle. Poista projekti uudelleen.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Saraketta ei voitu poistaa, joten tietoja voi jäädä jäljelle. Poista projekti uudelleen.", + "Could not delete the project. Please try again.": "Projektia ei voitu poistaa. Yritä uudelleen.", + "Notification settings": "Ilmoitusasetukset", + "Configure when due-date reminders are sent": "Määritä, milloin eräpäivämuistutukset lähetetään", + "Due-date reminder lead time (hours)": "Eräpäivämuistutuksen ennakko (tuntia)", + "Lead time must be between 1 and 336 hours": "Ennakon on oltava 1–336 tuntia", + "Reminder lead time saved successfully": "Muistutuksen ennakko tallennettu", + "Failed to save reminder lead time": "Muistutuksen ennakkoa ei voitu tallentaa", + "Notifications": "Ilmoitukset", + "Notify me 1 day before a task's due date": "Ilmoita minulle 1 päivä ennen tehtävän eräpäivää", + "Draft": "Luonnos", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Onko oppitunti luonnos, jonka vain sen opettaja näkee, pidetäänkö se vai onko se peruttu.", + "New release": "Uusi julkaisu", + "Roadmap chart. The same releases and epics are listed below.": "Tiekarttakaavio. Samat julkaisut ja eepokset on lueteltu alla.", + "Nothing on the roadmap yet": "Tiekartalla ei ole vielä mitään", + "Releases with a target date and epics with dated tasks appear here.": "Tässä näkyvät julkaisut, joilla on tavoitepäivä, ja eepokset, joiden tehtävillä on päivämäärä.", + "Releases": "Julkaisut", + "No releases yet": "Ei vielä julkaisuja", + "Target date: {date}": "Tavoitepäivä: {date}", + "No target date": "Ei tavoitepäivää", + "Edit {name}": "Muokkaa: {name}", + "Mark {name} as released": "Merkitse {name} julkaistuksi", + "Mark as released": "Merkitse julkaistuksi", + "Epics": "Eepokset", + "No epics yet. Open a task to make it an epic.": "Ei vielä eepoksia. Avaa tehtävä tehdäksesi siitä eepoksen.", + "Not scheduled yet": "Ei vielä aikataulutettu", + "Planned": "Suunniteltu", + "Released": "Julkaistu", + "Edit release": "Muokkaa julkaisua", + "Target date": "Tavoitepäivä", + "Could not save the release. Please try again.": "Julkaisua ei voitu tallentaa. Yritä uudelleen.", + "Every task of this release is done or cancelled.": "Tämän julkaisun kaikki tehtävät ovat valmiita tai peruttuja.", + "Not finished yet: {count}": "Vielä kesken: {count}", + "What happens to these tasks?": "Mitä näille tehtäville tapahtuu?", + "Move to {name}": "Siirrä julkaisuun {name}", + "Remove the release": "Poista julkaisu", + "Keep it on {name}": "Jätä ne julkaisuun {name}", + "Could not mark the release as released. Please try again.": "Julkaisua ei voitu merkitä julkaistuksi. Yritä uudelleen.", + "Roadmap": "Tiekartta", + "Tasks or roadmap": "Tehtävät tai tiekartta", + "Release": "Julkaisu", + "Epic": "Eepos", + "This task is an epic": "Tämä tehtävä on eepos", + "A named, dated delivery of a project that its tasks are planned against.": "Projektin nimetty ja päivätty toimitus, johon sen tehtävät suunnitellaan.", + "Name of the release": "Julkaisun nimi", + "The project this release belongs to": "Projekti, johon tämä julkaisu kuuluu", + "What this release delivers": "Mitä tämä julkaisu toimittaa", + "When work on the release starts": "Milloin työ julkaisun parissa alkaa", + "The date the release is due": "Päivä, johon mennessä julkaisun on oltava valmis", + "Whether the release is planned, released or archived": "Onko julkaisu suunniteltu, julkaistu vai arkistoitu", + "Released on": "Julkaistu", + "When the release was marked as released": "Milloin julkaisu merkittiin julkaistuksi", + "The release this task is planned for": "Julkaisu, johon tämä tehtävä on suunniteltu", + "Board view options": "Taulun näkymäasetukset", + "Colour cards": "Väritä kortit", + "No colour": "Ei väriä", + "By label": "Tunnisteen mukaan", + "Swimlanes": "Uimaradat", + "No swimlanes": "Ei uimaratoja", + "By assignee": "Vastuuhenkilön mukaan", + "By epic": "Eepoksen mukaan", + "No assignee": "Ei vastuuhenkilöä", + "No epic": "Ei eeposta", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kortit pysyvät eepoksensa rivillä. Vaihda eepos tehtävän sivulla.", + "Hand over to": "Siirrä henkilölle", + "Could not save your board view. It applies until you reload.": "Taulun näkymää ei voitu tallentaa. Se on voimassa, kunnes lataat sivun uudelleen.", + "Timetable wish": "Lukujärjestystoive", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Toive, jonka generaattori ottaa huomioon. Ehdottoman toiveen se pitää aina, joustavan kun voi.", + "Whether the wish is about a teacher, a group, a room or one activity": "Koskeeko toive opettajaa, ryhmää, tilaa vai yhtä toimintoa", + "Teacher": "Opettaja", + "Group": "Ryhmä", + "Reference": "Viite", + "The user, group, room or activity the wish is about": "Käyttäjä, ryhmä, tila tai toiminto, jota toive koskee", + "What the wish asks for": "Mitä toive pyytää", + "Not on these periods": "Ei näillä tunneilla", + "Preferably not on these periods": "Mieluiten ei näillä tunneilla", + "At most a number of lessons a day": "Enintään tietty määrä tunteja päivässä", + "No free periods between lessons": "Ei hyppytunteja", + "Always the same room": "Aina sama tila", + "Periods": "Tunnit", + "The periods of the week the wish is about, such as wed-5": "Viikon tunnit, joita toive koskee, esimerkiksi wed-5", + "Limit": "Raja", + "The most lessons a day, for a wish of that kind": "Enimmäistunnit päivässä, tämän lajin toiveelle", + "Strength": "Vahvuus", + "Whether the generator must keep the wish or should keep it": "Täytyykö vai pitäisikö generaattorin pitää toive", + "Hard": "Ehdoton", + "Soft": "Joustava", + "Weight": "Paino", + "How much a soft wish counts, from 1 to 3": "Kuinka paljon joustava toive painaa, 1–3", + "Why the wish exists": "Miksi toive on olemassa", + "Timetable scenario": "Lukujärjestysskenaario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Yksi viikkomalli, generaattorin tekemä tai nykyisestä lukujärjestyksestä otettu. Se säilyttää syötteensä ja sen, miten hyvin se pitää toiveet.", + "The name timetablers know the scenario by": "Nimi, jolla lukujärjestyksen tekijät tuntevat skenaarion", + "Whether the generator made it or it came from the current timetable": "Tekikö generaattori sen vai tuleeko se nykyisestä lukujärjestyksestä", + "Generated": "Luotu", + "From the current timetable": "Nykyisestä lukujärjestyksestä", + "Week of": "Viikko alkaen", + "The Monday of the first week of the window": "Jakson ensimmäisen viikon maanantai", + "Window start": "Jakson alku", + "The first day the week pattern applies to": "Ensimmäinen päivä, jota viikkomalli koskee", + "Window end": "Jakson loppu", + "The last day the week pattern applies to": "Viimeinen päivä, jota viikkomalli koskee", + "Waiting, generating, done, failed, or published as draft lessons": "Odottaa, luodaan, valmis, epäonnistui tai julkaistu luonnostunteina", + "Waiting": "Odottaa", + "Generating": "Luodaan", + "Failed": "Epäonnistui", + "Published": "Julkaistu", + "Seed": "Siemen", + "The number the generator starts from, so a run can be repeated": "Luku, josta generaattori aloittaa, jotta ajon voi toistaa", + "Input": "Syöte", + "The periods, rooms, lessons and wishes the scenario was made from": "Tunnit, tilat, oppitunnit ja toiveet, joista skenaario tehtiin", + "Placements": "Sijoitukset", + "Each lesson with the period and room it was given": "Jokainen oppitunti sille annetun tunnin ja tilan kanssa", + "Unplaced lessons": "Sijoittamattomat oppitunnit", + "Lessons without a place, each with the hard wish that blocked it": "Oppitunnit ilman paikkaa, kukin sen estäneen ehdottoman toiveen kanssa", + "Broken wishes": "Rikotut toiveet", + "The wishes this scenario breaks, with the lessons that break them": "Toiveet, joita tämä skenaario rikkoo, ja ne rikkovat oppitunnit", + "Measures": "Mittarit", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Sijoitetut oppitunnit, rikotut toiveet, opettajien hyppytunnit, tunnit päivässä ja tilojen käyttö", + "Reason": "Syy", + "Why the run failed": "Miksi ajo epäonnistui", + "Published at": "Julkaistu", + "When the scenario was written out as draft lessons": "Milloin skenaario kirjoitettiin luonnostunneiksi", + "Edit wish": "Muokkaa toivetta", + "New wish": "Uusi toive", + "Hard: the generator always keeps it": "Ehdoton: generaattori noudattaa sitä aina", + "Soft: the generator keeps it where it can": "Joustava: generaattori noudattaa sitä, kun voi", + "Weight (1 to 3)": "Paino (1-3)", + "Most lessons a day": "Enintään tunteja päivässä", + "Period": "Tunti", + "{day} period {number}": "{day} tunti {number}", + "Teacher (user name)": "Opettaja (käyttäjänimi)", + "Activity (group:subject)": "Toiminta (ryhmä:aine)", + "Say who or what the wish is about.": "Kerro, ketä tai mitä toive koskee.", + "Choose at least one period.": "Valitse vähintään yksi tunti.", + "The limit is a whole number of 1 or more.": "Raja on kokonaisluku 1 tai enemmän.", + "Timetable": "Lukujärjestys", + "Wishes": "Toiveet", + "Timetable wishes": "Lukujärjestystoiveet", + "Generator run": "Generaattorin ajo", + "Generator progress": "Generaattorin edistyminen", + "The run failed: {reason}": "Ajo epäonnistui: {reason}", + "{placed} of {lessons} lessons placed": "{placed}/{lessons} tuntia sijoitettu", + "Generate again": "Luo uudelleen", + "Generate": "Luo", + "Every lesson has a place.": "Jokaisella tunnilla on paikka.", + "Lesson": "Tunti", + "No free period and room": "Ei vapaata tuntia ja tilaa", + "Broken soft wishes": "Rikotut joustavat toiveet", + "Every soft wish is kept.": "Jokainen joustava toive on noudatettu.", + "Wish": "Toive", + "Lessons": "Tunnit", + "Generating: {percent}% of the time budget used": "Luodaan: {percent} % ajasta käytetty", + "Waiting to start": "Odottaa aloitusta", + "Published as draft lessons": "Julkaistu luonnostunteina", + "Could not read the scenario.": "Skenaariota ei voitu lukea.", + "Could not start the run.": "Ajoa ei voitu aloittaa.", + "Scenarios": "Skenaariot", + "Timetable scenarios": "Lukujärjestysskenaariot", + "Scenario": "Skenaario", + "Take the current timetable": "Ota nykyinen lukujärjestys", + "Could not take the current timetable.": "Nykyistä lukujärjestystä ei voitu ottaa.", + "Broken hard wishes": "Rikotut ehdottomat toiveet", + "Not on a period of the week grid": "Ei viikkoruudukon tunnilla", + "Compare scenarios": "Vertaa skenaarioita", + "Scenarios to compare": "Verrattavat skenaariot", + "Choose two or three scenarios to compare them.": "Valitse kaksi tai kolme skenaariota verrattavaksi.", + "Measure": "Mittari", + "Best": "Paras", + "Lessons that differ": "Eroavat tunnit", + "No lesson differs.": "Mikään tunti ei eroa.", + "Not placed": "Ei sijoitettu", + "{period} in {room}": "{period} tilassa {room}", + "Lessons placed": "Sijoitetut tunnit", + "Lessons without a place": "Tunnit ilman paikkaa", + "Clashes": "Päällekkäisyydet", + "Hard wishes broken": "Rikotut ehdottomat toiveet", + "Soft wishes broken": "Rikotut joustavat toiveet", + "Soft wishes broken, weighted": "Rikotut joustavat toiveet, painotettu", + "Free periods between lessons, all teachers": "Hyppytunnit, kaikki opettajat", + "Most free periods of one teacher": "Yhden opettajan eniten hyppytunteja", + "Most lessons of one group on a day": "Yhden ryhmän eniten tunteja päivässä", + "Room use": "Tilojen käyttö", + "Publish as draft lessons": "Julkaise luonnostunteina", + "Draft lessons written: {count}": "Luonnostunteja kirjoitettu: {count}", + "Could not publish the scenario.": "Skenaariota ei voitu julkaista.", + "Rules": "Säännöt", + "Rules for {column}": "Sarakkeen {column} säännöt", + "When a card enters this column": "Kun kortti tulee tähän sarakkeeseen", + "Action": "Toiminto", + "Set the priority": "Aseta prioriteetti", + "Assign to": "Anna tehtäväksi", + "Assign the person who moved the card": "Anna tehtäväksi kortin siirtäjälle", + "Remove the assignee": "Poista vastuuhenkilö", + "Add a label": "Lisää tunniste", + "No longer a project member": "Ei enää projektin jäsen", + "This label no longer exists": "Tätä tunnistetta ei enää ole", + "Add rule": "Lisää sääntö", + "Remove rule": "Poista sääntö", + "No rules yet. Add one to change a card when it enters this column.": "Ei vielä sääntöjä. Lisää sääntö, joka muuttaa korttia, kun se tulee tähän sarakkeeseen.", + "Could not save the rules. Please try again.": "Sääntöjä ei voitu tallentaa. Yritä uudelleen.", + "1 rule runs when a card enters this column": "1 sääntö suoritetaan, kun kortti tulee tähän sarakkeeseen", + "{count} rules run when a card enters this column": "{count} sääntöä suoritetaan, kun kortti tulee tähän sarakkeeseen", + "Rules applied: {changes}": "Säännöt käytetty: {changes}", + "assigned to {name}": "vastuuhenkilö {name}", + "assignee removed": "vastuuhenkilö poistettu", + "priority {priority}": "prioriteetti {priority}", + "label {label}": "tunniste {label}", + "What happens to a card when it enters this column, applied in list order.": "Mitä kortille tapahtuu, kun se tulee tähän sarakkeeseen, listan järjestyksessä.", + "Value": "Arvo", + "What the rule does to the card.": "Mitä sääntö tekee kortille.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioriteetti, käyttäjätunnus tai tunnisteen tunnus, jota toiminto käyttää; tyhjä toiminnoille ilman arvoa.", + "is not": "ei ole", + "{dimension} is not": "{dimension} ei ole", + "Saved filters": "Tallennetut suodattimet", + "No saved filters yet": "Ei vielä tallennettuja suodattimia", + "Save filter": "Tallenna suodatin", + "Rename \"{name}\"": "Nimeä \"{name}\" uudelleen", + "Delete \"{name}\"": "Poista \"{name}\"", + "Clear filters": "Tyhjennä suodattimet", + "Showing {shown} of {total} tasks": "Näytetään {shown}/{total} tehtävää", + "Me": "Minä", + "No date": "Ei päivämäärää", + "Rename saved filter": "Nimeä tallennettu suodatin uudelleen", + "Share with the project": "Jaa projektin kanssa", + "Give the filter a name": "Anna suodattimelle nimi", + "Could not save the filter. Please try again.": "Suodatinta ei voitu tallentaa. Yritä uudelleen.", + "Some labels in \"{name}\" no longer exist and were left out.": "Osa suodattimen \"{name}\" tunnisteista ei ole enää olemassa, ja ne jätettiin pois.", + "Could not delete the filter. Please try again.": "Suodatinta ei voitu poistaa. Yritä uudelleen.", + "Saved filter": "Tallennettu suodatin", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Yhden projektin nimetty taulusuodatin, vain tallentajan nähtävissä, ellei sitä ole jaettu projektin kanssa.", + "The project whose board the filter applies to": "Projekti, jonka tauluun suodatin kohdistuu", + "The name the filter is listed under": "Nimi, jolla suodatin näkyy luettelossa", + "Saved by": "Tallentaja", + "Nextcloud user id of the person who saved the filter": "Suodattimen tallentajan Nextcloud-käyttäjätunnus", + "Shared with the project": "Jaettu projektin kanssa", + "Whether every project member sees and applies the filter": "Näkeekö jokainen projektin jäsen suodattimen ja voiko sitä käyttää", + "Criteria": "Ehdot", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Suodatin: vastuuhenkilö, tunniste, prioriteetti ja määräpäivä, kukin ehdolla on tai ei ole ja arvoineen", + "Cross-project view": "Projektit ylittävä näkymä", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Tallennettu projektivalikoima, jonka tehtävät näytetään yhdessä tilasarakkeissa ja joka on jaettu siinä nimetyille henkilöille.", + "Shared with": "Jaettu henkilöille", + "The name the view is listed under": "Nimi, jolla näkymä luetellaan", + "Nextcloud user id of the person who saved the view": "Näkymän tallentaneen henkilön Nextcloud-käyttäjätunnus", + "Nextcloud user ids of the people the view is shared with": "Niiden henkilöiden Nextcloud-käyttäjätunnukset, joille näkymä on jaettu", + "The projects whose tasks the view shows, at most twenty": "Projektit, joiden tehtävät näkymä näyttää, enintään kaksikymmentä", + "1 project in this view is hidden from you.": "1 tämän näkymän projekti on piilotettu sinulta.", + "{count} projects in this view are hidden from you.": "{count} tämän näkymän projektia on piilotettu sinulta.", + "{project} has no column for {status}.": "Projektilla {project} ei ole saraketta tilalle {status}.", + "This view does not exist or is not shared with you.": "Tätä näkymää ei ole tai sitä ei ole jaettu sinulle.", + "\"{task}\" moved to {status}.": "\"{task}\" siirretty tilaan {status}.", + "Project: {title}": "Projekti: {title}", + "Cross-project views": "Projektit ylittävät näkymät", + "New view": "Uusi näkymä", + "Edit view": "Muokkaa näkymää", + "Delete view": "Poista näkymä", + "Give the view a name": "Anna näkymälle nimi", + "Pick at least one project": "Valitse vähintään yksi projekti", + "A view shows at most {max} projects": "Näkymä näyttää enintään {max} projektia", + "Could not save the view. Please try again.": "Näkymää ei voitu tallentaa. Yritä uudelleen.", + "Could not delete the view. Please try again.": "Näkymää ei voitu poistaa. Yritä uudelleen.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Poistetaanko \"{title}\"? Projektit ja niiden tehtävät pysyvät ennallaan.", + "People see the tasks of the projects they are in, never more.": "Kukin näkee vain niiden projektien tehtävät, joissa on mukana.", + "No views yet. A view shows the tasks of several of your projects together.": "Ei vielä näkymiä. Näkymä näyttää useiden projektiesi tehtävät yhdessä.", + "Projects in view: {count}": "Projekteja näkymässä: {count}", + "Notify me when a task is assigned to me": "Ilmoita minulle, kun minulle annetaan tehtävä", + "Also send these to me by email": "Lähetä nämä minulle myös sähköpostilla", + "Add an email address in your Nextcloud personal settings to get mail.": "Lisää sähköpostiosoite Nextcloudin henkilökohtaisiin asetuksiin saadaksesi sähköpostia.", + "Code link": "Koodilinkki", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Koodialustan commit, haara, yhdistämispyyntö tai tiketti, joka liittyy tehtävään.", + "The task the link belongs to": "Tehtävä, johon linkki kuuluu", + "The project of the task": "Tehtävän projekti", + "Task key": "Tehtäväavain", + "The task key the forge text named, such as VC-12": "Tehtäväavain, jonka koodialustan teksti mainitsi, esimerkiksi VC-12", + "What the link points at": "Mihin linkki osoittaa", + "Link": "Linkki", + "The address of the item in the forge": "Kohteen osoite koodialustalla", + "The commit message, branch name or merge request title": "Commit-viesti, haaran nimi tai yhdistämispyynnön otsikko", + "Repository": "Repositorio", + "The repository, such as acme/portal": "Repositorio, esimerkiksi acme/portal", + "Forge id": "Tunniste alustalla", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Kohteen oma tunniste koodialustalla, esimerkiksi github:acme/portal#42 tai commit-tiiviste", + "State": "Tila", + "The state of a merge request or issue": "Yhdistämispyynnön tai tiketin tila", + "Who made the commit or opened the merge request": "Kuka teki commitin tai avasi yhdistämispyynnön", + "When the commit was made or the merge request last changed": "Milloin commit tehtiin tai yhdistämispyyntö viimeksi muuttui", + "Added by": "Lisääjä", + "Whether a person added the link or the integration wrote it": "Lisäsikö linkin henkilö vai kirjoittiko sen integraatio", + "Nextcloud user UIDs of project members": "Projektin jäsenten Nextcloud-käyttäjätunnukset", + "Add link": "Lisää linkki", + "Added by hand": "Lisätty käsin", + "Branch": "Haara", + "Code": "Koodi", + "Commit": "Commit", + "From the integration": "Integraation kautta", + "Link to a commit, branch or merge request": "Linkki commitiin, haaraan tai yhdistämispyyntöön", + "Merge request": "Yhdistämispyyntö", + "Merged": "Yhdistetty", + "No code linked yet. Name {key} in a commit message or paste a link.": "Koodia ei ole vielä linkitetty. Mainitse {key} commit-viestissä tai liitä linkki.", + "No code linked yet. Paste a link to a commit or merge request.": "Koodia ei ole vielä linkitetty. Liitä linkki commitiin tai yhdistämispyyntöön.", + "Paste a web address that starts with https://.": "Liitä verkko-osoite, joka alkaa https://.", + "Remove link {title}": "Poista linkki {title}", + "The link could not be added.": "Linkkiä ei voitu lisätä.", + "The link could not be removed.": "Linkkiä ei voitu poistaa.", + "This link is already on the task.": "Tämä linkki on jo tehtävässä.", + "Code forges": "Koodialustat", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Linkitä GitHubin commitit ja pull requestit tehtäviin. Integriq vastaanottaa tapahtumat; planninq ei koskaan kutsu GitHubia.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Lataa määritys ja tuo se Integriqiin. Täytä sitten salaisuus sääntöön \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Lisää GitHubissa repositorioon webhook tällä osoitteella ja samalla salaisuudella. Valitse sisältötyypiksi application/json sekä tapahtumat push ja pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Mainitse tehtäväavain, esimerkiksi VC-12, commit-viestissä, haaran nimessä tai pull requestin otsikossa. Linkki näkyy silloin kyseisessä tehtävässä.", + "Without Integriq, project members can still paste a link on the task page.": "Ilman Integriqiä projektin jäsenet voivat silti liittää linkin tehtäväsivulle.", + "Download the Integriq configuration": "Lataa Integriq-määritys", + "Calendar": "Kalenteri", + "Previous": "Edellinen", + "Calendar view": "Kalenterinäkymä", + "Starts:": "Alkaa:", + "No tasks with a date in this month.": "Tässä kuussa ei ole päivättyjä tehtäviä.", + "Week of {start} to {end}": "Viikko {start}–{end}", + "My calendar": "Oma kalenteri", + "Show as list": "Näytä luettelona", + "Show as calendar": "Näytä kalenterina", + "Open my calendar": "Avaa oma kalenteri", + "Nextcloud Tasks": "Nextcloud Tehtävät", + "Show my tasks in Nextcloud Tasks": "Näytä tehtäväni Nextcloud Tehtävissä", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Sinulle osoitetut tai kanssasi jaetut tehtävät näkyvät \"Planninq\"-luettelossa Nextcloudin Tehtävissä ja Kalenterissa. Siellä tehdyt muutokset korvataan seuraavalla Planninqin muutoksella.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Tämä palvelin ei voi kirjoittaa Nextcloud Tehtäviin, joten vienti ei ole käytettävissä.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Planninqin hallinnoima. Täällä tehdyt muutokset korvataan seuraavalla Planninqin muutoksella.", + "Working days and holidays": "Työpäivät ja pyhäpäivät", + "Dates set on the timeline skip the days that are not working days.": "Aikajanalle asetetut päivämäärät ohittavat päivät, jotka eivät ole työpäiviä.", + "Working weekdays": "Viikon työpäivät", + "Non-working days": "Vapaapäivät", + "No non-working days yet.": "Ei vielä vapaapäiviä.", + "Add day": "Lisää päivä", + "Year": "Vuosi", + "Add Dutch national holidays": "Lisää Alankomaiden kansalliset pyhäpäivät", + "Save working days": "Tallenna työpäivät", + "Choose at least one working weekday.": "Valitse vähintään yksi työpäivä.", + "Working days saved.": "Työpäivät tallennettu.", + "Could not save the working days.": "Työpäiviä ei voitu tallentaa.", + "New Year's Day": "Uudenvuodenpäivä", + "Easter Sunday": "Pääsiäispäivä", + "Easter Monday": "2. pääsiäispäivä", + "King's Day": "Kuninkaanpäivä", + "Liberation Day": "Vapautuksen päivä", + "Ascension Day": "Helatorstai", + "Whit Sunday": "Helluntaipäivä", + "Whit Monday": "2. helluntaipäivä", + "Christmas Day": "Joulupäivä", + "Boxing Day": "Tapaninpäivä", + "Dates of {title}": "Kohteen {title} päivämäärät", + "The due date cannot be before the start date.": "Määräpäivä ei voi olla ennen aloituspäivää.", + "{title}, from {start} to {end}": "{title}, {start}–{end}", + "The dates could not be saved.": "Päivämääriä ei voitu tallentaa.", + "{title} now runs from {start} to {end}": "{title} kestää nyt {start}–{end}", + "Auto-scheduling": "Automaattinen aikataulutus", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kun tämä on päällä, määräpäivän siirtäminen myöhemmäksi aikajanalla tarjoaa siirtää myös sen estämät tehtävät.", + "Move blocked tasks along when a task slips": "Siirrä estetyt tehtävät, kun tehtävä myöhästyy", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Aikajanalla myöhempi määräpäivä tarjoaa siirtää estetyt tehtävät. Vain \"estää\"-linkit lasketaan, ja tehtävät siirtyvät vain myöhemmäksi.", + "Move the tasks that wait for {title}?": "Siirretäänkö tehtävät, jotka odottavat kohdetta {title}?", + "These tasks wait for it and would start after its new due date:": "Nämä tehtävät odottavat sitä ja alkaisivat uuden määräpäivän jälkeen:", + "{count} tasks would move; the first {limit} are listed.": "{count} tehtävää siirtyisi; ensimmäiset {limit} näytetään.", + "Now": "Nyt", + "After the move": "Siirron jälkeen", + "Only this task": "Vain tämä tehtävä", + "Move all": "Siirrä kaikki", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Pysähtyi kohtaan {title}: päivämääriä ei voitu tallentaa. Sitä edeltävät tehtävät siirrettiin.", + "Cumulative flow": "Kumulatiivinen virtaus", + "Show as chart": "Näytä kaaviona", + "Show as table": "Näytä taulukkona", + "Tasks per column per day": "Tehtävät sarakkeittain päivittäin", + "Tasks without recorded history in this period: {count}": "Tehtävät ilman tallennettua historiaa tällä jaksolla: {count}", + "Lead and cycle time": "Läpimenoaika ja sykliaika", + "No tasks were finished in this period.": "Tällä jaksolla ei valmistunut tehtäviä.", + "Finished tasks": "Valmiit tehtävät", + "Cycle time, average": "Sykliaika, keskiarvo", + "Cycle time, 85th percentile": "Sykliaika, 85. persentiili", + "Lead time, average": "Läpimenoaika, keskiarvo", + "Tasks whose finish time was estimated from their history: {count}": "Tehtävät, joiden valmistumisaika arvioitiin historiasta: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Jokaisen valmiin tehtävän sykliaika, keskiarvo ja 85. persentiili", + "Slowest tasks": "Hitaimmat tehtävät", + "cycle {cycle}, lead {lead}": "sykli {cycle}, läpimeno {lead}", + "{days} days": "{days} päivää", + "Could not load the flow of this project.": "Projektin virtausta ei voitu ladata.", + "Last {days} days": "Viimeiset {days} päivää", + "Portfolio flow": "Salkun virtaus", + "An admin adds portfolios under Projects, Portfolios.": "Ylläpitäjä lisää salkut kohdassa Projektit, Salkut.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projektit, joita ei näytetä, koska kerralla näytetään enintään 50: {count}", + "Could not load the flow of this portfolio.": "Salkun virtausta ei voitu ladata.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulatiivinen virtaus ja sykliaika salkun projekteista.", + "Edit report": "Muokkaa raporttia", + "Only tasks where": "Vain tehtävät, joissa", + "Group by": "Ryhmittele", + "Display": "Näkymä", + "Share with everyone who can read its projects": "Jaa kaikille, jotka voivat lukea sen projekteja", + "The report could not be saved.": "Raporttia ei voitu tallentaa.", + "Number of tasks": "Tehtävien määrä", + "Bar": "Pylväs", + "Donut": "Rengas", + "Table": "Taulukko", + "{hidden} of {total} projects in this report are not visible to you": "{hidden}/{total} raportin projektista ei näy sinulle", + "No tasks match this report.": "Mikään tehtävä ei vastaa raporttia.", + "None": "Ei mitään", + "Could not load this report.": "Raporttia ei voitu ladata.", + "Report": "Raportti", + "Your reports": "Raporttisi", + "My reports": "Omat raportit", + "Shared reports": "Jaetut raportit", + "You have not built a report yet.": "Et ole vielä tehnyt raporttia.", + "Nobody has shared a report with you yet.": "Kukaan ei ole vielä jakanut raporttia kanssasi.", + "Reports you built over tasks, and the ones shared with you.": "Tehtävistä tekemäsi raportit ja kanssasi jaetut raportit.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Tallennettu kysely tehtävistä: mitkä projektit, mitkä suodattimet, millä ryhmitelty, laskettu tai summattu, ja näytetty taulukkona tai kaaviona.", + "The name the report is listed under": "Nimi, jolla raportti näkyy listassa", + "What the report shows and who it is for": "Mitä raportti näyttää ja kenelle se on", + "Nextcloud user id of the person who saved the report": "Raportin tallentaneen henkilön Nextcloud-käyttäjätunnus", + "Who can open the report": "Kuka voi avata raportin", + "Only me": "Vain minä", + "Everyone who can read its projects": "Kaikki, jotka voivat lukea sen projekteja", + "The projects the report covers, at most fifty": "Raportin kattamat projektit, enintään viisikymmentä", + "Filters": "Suodattimet", + "Task fields and the value each must equal": "Tehtäväkentät ja arvo, jota kunkin on vastattava", + "The task field the report groups on": "Tehtäväkenttä, jolla raportti ryhmittelee", + "Count the tasks, or add up a number on them": "Laske tehtävät tai summaa niistä luku", + "Sum": "Summa", + "Sum of": "Summa kentästä", + "The number added up when the measure is a sum": "Summattava luku, kun mittari on summa", + "Story points": "Tarinapisteet", + "Estimated duration": "Arvioitu kesto", + "How the report is shown": "Miten raportti näytetään", + "Issue type": "Tikettityyppi", + "Task fields and the value each must equal; empty when the report covers every task": "Tehtävän kentät ja arvo, joka kunkin on oltava; tyhjä, kun raportti kattaa kaikki tehtävät", + "The status a task must have": "Tila, joka tehtävällä on oltava", + "The priority a task must have": "Prioriteetti, joka tehtävällä on oltava", + "The user a task must be assigned to": "Käyttäjä, jolle tehtävä on oltava osoitettu", + "A label a task must carry": "Tunniste, joka tehtävällä on oltava", + "The board column a task must be in": "Taulun sarake, jossa tehtävän on oltava", + "The issue type a task must have": "Tikettityyppi, joka tehtävällä on oltava", + "Manager groups": "Hallinnoijaryhmät", + "Member groups": "Jäsenryhmät", + "Viewer groups": "Lukijaryhmät", + "Viewers": "Lukijat", + "Owning group": "Omistajaryhmä", + "Nextcloud groups whose members manage the project": "Nextcloud-ryhmät, joiden jäsenet hallinnoivat projektia", + "Nextcloud groups whose members work on the project": "Nextcloud-ryhmät, joiden jäsenet työskentelevät projektissa", + "Nextcloud groups whose members may read the project": "Nextcloud-ryhmät, joiden jäsenet voivat lukea projektia", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-käyttäjät, jotka hallinnoivat projektia: asetukset, jäsenet ja työ", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-käyttäjät, jotka voivat lukea projektia ja sen työtä mutta eivät muuttaa sitä", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud-ryhmä, joka omistaa projektin sen luojan kanssa, enintään yksi", + "Nextcloud user ids who may read this through the project": "Nextcloud-käyttäjät, jotka voivat lukea tämän projektin kautta", + "Nextcloud groups whose members may change this through the project": "Nextcloud-ryhmät, joiden jäsenet voivat muuttaa tätä projektin kautta", + "Nextcloud groups whose members may read this through the project": "Nextcloud-ryhmät, joiden jäsenet voivat lukea tämän projektin kautta", + "Search for a person or a group…": "Hae henkilöä tai ryhmää…", + "No one found. Your admin's sharing settings decide who you can find.": "Ketään ei löytynyt. Ylläpitäjän jakoasetukset määräävät, keitä voit löytää.", + "Type at least two characters": "Kirjoita vähintään kaksi merkkiä", + "Everyone in this group": "Kaikki tässä ryhmässä", + "Could not search for people. Please try again.": "Henkilöiden haku epäonnistui. Yritä uudelleen.", + "Could not remove the group": "Ryhmää ei voitu poistaa", + "Only the owner and managers change who is on this project.": "Vain omistaja ja hallinnoijat muuttavat, keitä projektissa on.", + "Role of {name}": "Käyttäjän {name} rooli", + "Manager": "Hallinnoija", + "Member": "Jäsen", + "Viewer": "Lukija", + "Could not change the role": "Roolia ei voitu muuttaa", + "Owned by group: {name}": "Ryhmän omistama: {name}", + "No group owns this project.": "Mikään ryhmä ei omista tätä projektia.", + "Owned by group": "Ryhmän omistama", + "Search for a group…": "Etsi ryhmää…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ryhmää ei löytynyt. Ylläpitäjäsi jakoasetukset määräävät, mitkä ryhmät voit löytää.", + "No owning group": "Ei omistajaryhmää", + "Could not search for groups. Please try again.": "Ryhmien haku epäonnistui. Yritä uudelleen.", + "Could not change the owning group": "Omistajaryhmää ei voitu muuttaa", + "You can read this project. Only its members change it.": "Voit lukea tätä projektia. Vain sen jäsenet muuttavat sitä.", + "Course": "Kurssi", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurssi, jota tällä tunnilla opetetaan, esimerkiksi valinnainen kurssi, kun koulun oppimissovellus tuntee sen.", + "Online meeting link": "Verkkotunnin linkki", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Mistä oppilaat liittyvät tälle tunnille verkossa. Liity-painike näkyy vain https-linkille." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fi.json b/l10n/fi.json index 8f1982f8..16c61549 100644 --- a/l10n/fi.json +++ b/l10n/fi.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktiiviset projektit", + "Archived projects": "Arkistoidut projektit", + "Boards": "Taulut", + "My projects": "Omat projektit", + "Portfolio": "Portfolio", + "Project board": "Projektitaulu", + "Projects I am in": "Projektit joissa olen mukana", + "Timeline": "Aikajana", + "Timesheet": "Tuntikirjaus", + "Features & roadmap": "Ominaisuudet ja tiekartta", + "Flow": "Kulku", + "Flows": "Kulut", + "Reports": "Raportit", + "Pick a report to open it.": "Valitse raportti avataksesi sen.", + "In progress": "Käynnissä", + "Date": "Päivämäärä", + "Due": "Määräpäivä", + "Assignee": "Vastuuhenkilö", + "Who": "Kuka", + "What": "Mitä", + "Minutes": "Minuutit", + "Entries": "Merkinnät", + "Most recent": "Uusimmat", + "Per person": "Henkilöä kohti", + "By status": "Tilan mukaan", + "By priority": "Prioriteetin mukaan", + "Task status": "Tehtävien tila", + "Time spent": "Käytetty aika", + "Capacity": "Kapasiteetti", + "Due soonest": "Erääntyy ensin", + "Minutes logged": "Kirjatut minuutit", + "Nothing is due": "Mikään ei eräänny", + "Nothing logged yet": "Mitään ei ole vielä kirjattu", + "What is open, what is blocked, and what is overdue.": "Mikä on avoinna, mikä estetty ja mikä myöhässä.", + "How allocation is spread across the people working on projects.": "Miten kuormitus jakautuu projekteissa työskentelevien kesken.", + "Hours logged, and the projects they went to.": "Kirjatut tunnit ja projektit, joihin ne menivät.", + "Billable": "Laskutettava", + "Budget: {amount}": "Budjetti: {amount}", + "Loading projects": "Ladataan projekteja", + "No projects for this client yet": "Tälle asiakkaalle ei ole vielä projekteja", + "Open in Planninq": "Avaa Planninqissa", + "This project could not be found": "Tätä projektia ei löytynyt", + "Untitled project": "Nimetön projekti", + "and {count} more": "ja {count} muuta", + "Store": "Kauppa", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Asenna muiden organisaatioiden julkaisemia rekistereitä, skeemoja ja vuokaavioita.", + "Work Date": "Työpäivä", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Sarakkeen toiminnot", + "Columns": "Sarakkeet", + "Could not remove the column. Please try again.": "Saraketta ei voitu poistaa. Yritä uudelleen.", + "Could not save the column. Please try again.": "Saraketta ei voitu tallentaa. Yritä uudelleen.", + "Done column": "Valmis-sarake", + "Edit column": "Muokkaa saraketta", + "Keep the card's status": "Säilytä kortin tila", + "Move its cards to": "Siirrä sen kortit sarakkeeseen", + "Move left": "Siirrä vasemmalle", + "Move right": "Siirrä oikealle", + "Status of cards moved here": "Tänne siirrettyjen korttien tila", + "The last done column cannot be removed.": "Viimeistä valmis-saraketta ei voi poistaa.", + "WIP limit": "WIP-raja", + "over limit": "yli rajan", + "The status a card gets when it is moved into this column.": "Tila, jonka kortti saa, kun se siirretään tähän sarakkeeseen.", + "All priorities": "Kaikki prioriteetit", + "Could not create the task. Please try again.": "Tehtävää ei voitu luoda. Yritä uudelleen.", + "Created": "Luotu", + "Move to backlog": "Backlogiin", + "Move to board": "Taululle", + "New task": "Uusi tehtävä", + "Nothing in the backlog": "Backlog on tyhjä", + "Rank": "Järjestys", + "Sort by": "Lajitteluperuste", + "Sort by rank to reorder": "Lajittele järjestyksen mukaan muuttaaksesi järjestystä", + "Task actions": "Tehtävän toiminnot", + "All labels": "Kaikki tunnisteet", + "Filter tasks by label": "Suodata tehtäviä tunnisteen mukaan", + "View timeline": "Näytä aikajana", + "Board": "Taulu", + "List": "Luettelo", + "Column": "Sarake", + "Board or list": "Taulu tai luettelo", + "Log": "Loki", + "Add entry": "Lisää merkintä", + "Show": "Näytä", + "No actions yet": "Ei vielä toimenpiteitä", + "Closed": "Suljettu", + "Entry actions": "Merkinnän toiminnot", + "Add action": "Lisää toimenpide", + "by {author}": "tekijä {author}", + "saved {time}": "tallennettu {time}", + "Attendees: {names}": "Osallistujat: {names}", + "Add the first entry": "Lisää ensimmäinen merkintä", + "Issues": "Ongelmat", + "Lessons learned": "Opit", + "Meetings": "Kokoukset", + "Decisions": "Päätökset", + "Actions": "Toimenpiteet", + "Issue": "Ongelma", + "Lesson learned": "Opittu asia", + "Meeting": "Kokous", + "Decision": "Päätös", + "About this project": "Tietoa projektista", + "No description yet": "Ei vielä kuvausta", + "Start date": "Alkupäivä", + "Not set": "Ei asetettu", + "End date": "Loppupäivä", + "Progress": "Edistyminen", + "No tasks yet": "Ei vielä tehtäviä", + "Open the board": "Avaa taulu", + "People": "Henkilöt", + "Owner": "Omistaja", + "Latest log entries": "Uusimmat merkinnät", + "Open the log": "Avaa loki", + "{done} of {total} tasks done": "{done}/{total} tehtävää valmiina", + "Edit entry": "Muokkaa merkintää", + "Type": "Tyyppi", + "Attendees": "Osallistujat", + "Issue is closed": "Ongelma on suljettu", + "Could not save the entry. Please try again.": "Merkintää ei voitu tallentaa. Yritä uudelleen.", + "From: {title}": "Lähde: {title}", + "What needs to happen": "Mitä pitää tehdä", + "Could not create the action. Please try again.": "Toimenpidettä ei voitu luoda. Yritä uudelleen.", + "The action was created but could not be linked to the entry.": "Toimenpide luotiin, mutta sitä ei voitu liittää merkintään.", + "Project pages": "Projektin sivut", + "Overview": "Yleiskatsaus", + "Risks": "Riskit", + "Log entry": "Lokimerkintä", + "A short name for the entry": "Merkinnän lyhyt nimi", + "Project": "Projekti", + "The project this entry belongs to": "Projekti, johon merkintä kuuluu", + "What kind of entry this is": "Minkä tyyppinen merkintä on", + "When it happened": "Milloin se tapahtui", + "What happened, in Markdown": "Mitä tapahtui, Markdownina", + "Whether an issue is still open": "Onko ongelma yhä auki", + "The people at a meeting": "Kokouksen osallistujat", + "Tasks that came out of this entry": "Tästä merkinnästä syntyneet tehtävät", + "Add risk": "Lisää riski", + "Risk": "Riski", + "Score": "Pisteet", + "Response": "Toimintatapa", + "Review date": "Tarkistuspäivä", + "no longer on the project": "ei enää projektissa", + "Edit {title}": "Muokkaa: {title}", + "No risks recorded yet": "Riskejä ei ole vielä kirjattu", + "Add the first risk": "Lisää ensimmäinen riski", + "Medium": "Keskitaso", + "Mitigating": "Lievennetään", + "Occurred": "Toteutunut", + "Avoid": "Vältä", + "Reduce": "Pienennä", + "Transfer": "Siirrä", + "Accept": "Hyväksy", + "Highest open risks": "Suurimmat avoimet riskit", + "No open risks": "Ei avoimia riskejä", + "Open the risk register": "Avaa riskirekisteri", + "Edit risk": "Muokkaa riskiä", + "What could go wrong": "Mikä voi mennä pieleen", + "Likelihood": "Todennäköisyys", + "Impact": "Vaikutus", + "Score {score}": "Pisteet {score}", + "Countermeasures": "Vastatoimet", + "Could not save the risk. Please try again.": "Riskiä ei voitu tallentaa. Yritä uudelleen.", + "Risks by likelihood and impact": "Riskit todennäköisyyden ja vaikutuksen mukaan", + "Risk scale": "Riskiasteikko", + "The levels every project scores its risks on, and where low turns into medium and high": "Tasot, joilla jokainen projekti pisteyttää riskinsä, ja missä matala vaihtuu keskitasoon ja korkeaan", + "Number of levels": "Tasojen määrä", + "Likelihood labels": "Todennäköisyyden nimet", + "Impact labels": "Vaikutuksen nimet", + "Level {level}": "Taso {level}", + "Medium from score": "Keskitaso pisteistä", + "High from score": "Korkea pisteistä", + "Risk scale saved": "Riskiasteikko tallennettu", + "1 risk uses level {level}. Change it first.": "1 riski käyttää tasoa {level}. Muuta se ensin.", + "{count} risks use level {level}. Change them first.": "{count} riskiä käyttää tasoa {level}. Muuta ne ensin.", + "Every level needs a label, and high must start above medium.": "Jokainen taso tarvitsee nimen, ja korkean on alettava keskitason yläpuolelta.", + "The project this risk belongs to": "Projekti, johon riski kuuluu", + "The cause and the effect, in Markdown": "Syy ja seuraus, Markdownina", + "Category": "Luokka", + "A free grouping, such as planning, budget or supplier": "Vapaa ryhmittely, kuten aikataulu, budjetti tai toimittaja", + "How likely it is, on the admin's risk scale": "Kuinka todennäköinen se on ylläpitäjän riskiasteikolla", + "How hard it would hit, on the admin's risk scale": "Kuinka kovaa se osuisi ylläpitäjän riskiasteikolla", + "Likelihood times impact, calculated by the server": "Todennäköisyys kertaa vaikutus, palvelimen laskema", + "Where the risk stands": "Missä vaiheessa riski on", + "The person who watches this risk": "Henkilö, joka seuraa tätä riskiä", + "How the project answers the risk": "Miten projekti vastaa riskiin", + "What is done to prevent it or soften it, in Markdown": "Mitä tehdään sen estämiseksi tai lieventämiseksi, Markdownina", + "When to look at this risk again": "Milloin riski tarkistetaan uudelleen", + "Very low": "Hyvin matala", + "Very high": "Hyvin korkea", + "All projects": "Kaikki projektit", + "Project status report": "Projektin tilaraportti", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Päivätty raportti siitä, miten projekti on edennyt rahan, organisaation, ajan, tiedon, laadun ja riskin osalta (GROTIK-näkökulmat), kukin huomautuksella.", + "The project this report is about": "Projekti, jota raportti koskee", + "Report date": "Raportin päivämäärä", + "The day the report describes": "Päivä, jota raportti kuvaa", + "Money": "Raha", + "How the project stands on this aspect": "Miten projekti on edennyt tämän näkökulman osalta", + "On track": "Aikataulussa", + "At risk": "Riskissä", + "Off track": "Raiteiltaan", + "Money note": "Huomautus rahasta", + "A short explanation of this status": "Lyhyt selitys tälle tilalle", + "Organisation": "Organisaatio", + "Organisation note": "Huomautus organisaatiosta", + "Time": "Aika", + "Time note": "Huomautus ajasta", + "Information": "Tieto", + "Information note": "Huomautus tiedosta", + "Quality": "Laatu", + "Quality note": "Huomautus laadusta", + "Risk note": "Huomautus riskistä", + "Overall": "Kokonaisuus", + "The worst of the six statuses, calculated by the server": "Kuuden tilan huonoin, palvelimen laskema", + "Health: money": "Kunto: raha", + "Copied from the newest status report": "Kopioitu uusimmasta tilaraportista", + "Health: organisation": "Kunto: organisaatio", + "Health: time": "Kunto: aika", + "Health: information": "Kunto: tieto", + "Health: quality": "Kunto: laatu", + "Health: risk": "Kunto: riski", + "Health: overall": "Kunto: kokonaisuus", + "Health: report date": "Kunto: raportin päivämäärä", + "The date of the newest status report": "Uusimman tilaraportin päivämäärä", + "New report": "Uusi raportti", + "Only the project owner writes status reports.": "Vain projektin omistaja kirjoittaa tilaraportit.", + "Latest report, {date}": "Viimeisin raportti, {date}", + "Aspect": "Näkökulma", + "Note": "Huomautus", + "Report history": "Raporttihistoria", + "Author": "Tekijä", + "No status reports yet": "Ei vielä tilaraportteja", + "Write the first report": "Kirjoita ensimmäinen raportti", + "Choose a status for every aspect to save the report.": "Valitse tila jokaiselle näkökulmalle tallentaaksesi raportin.", + "Suggested: on track.": "Ehdotus: aikataulussa.", + "Suggested: at risk.": "Ehdotus: riskissä.", + "Suggested: off track.": "Ehdotus: raiteiltaan.", + "1 task is past its due date.": "1 tehtävä on myöhässä.", + "{count} tasks are past their due date.": "{count} tehtävää on myöhässä.", + "The end date has passed with 1 open task.": "Päättymispäivä on ohitettu, ja 1 tehtävä on avoinna.", + "The end date has passed with {count} open tasks.": "Päättymispäivä on ohitettu, ja {count} tehtävää on avoinna.", + "No open task is past its due date.": "Yksikään avoin tehtävä ei ole myöhässä.", + "The highest open risk, \"{title}\", scores {score}.": "Suurin avoin riski, \"{title}\", saa pisteet {score}.", + "There are no open risks.": "Avoimia riskejä ei ole.", + "Costs are at {percent}% of the budget.": "Kustannukset ovat {percent}% budjetista.", + "No suggestion: the project has no budget.": "Ei ehdotusta: projektilla ei ole budjettia.", + "No suggestion: no costs are recorded for this project yet.": "Ei ehdotusta: projektille ei ole vielä kirjattu kustannuksia.", + "The report was not saved. Only the project owner can write status reports.": "Raporttia ei tallennettu. Vain projektin omistaja voi kirjoittaa tilaraportteja.", + "No report": "Ei raporttia", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Samojen ihmisten johtamien projektien ryhmä, kuten osasto tai ohjelma. Sen vastuuhenkilöt lukevat jokaista siihen kuuluvaa projektia.", + "The name of the portfolio": "Salkun nimi", + "What the portfolio holds and who runs it": "Mitä salkku sisältää ja kuka sitä johtaa", + "A colour for the portfolio's section in project lists": "Väri salkun osiolle projektiluetteloissa", + "Managers": "Vastuuhenkilöt", + "Nextcloud user UIDs of the people who run the portfolio": "Salkkua johtavien ihmisten Nextcloud-käyttäjätunnukset", + "Order": "Järjestys", + "Where the portfolio comes in project lists, lowest first": "Salkun paikka projektiluetteloissa, pienin ensin", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Tämän salkun oma riskiasteikko JSON-muodossa, samassa muodossa kuin koko sovelluksen asteikko. Tyhjä tarkoittaa koko sovelluksen asteikkoa.", + "Portfolio readers": "Salkun lukijat", + "Nextcloud user UIDs of the managers of the project's portfolio": "Projektin salkun vastuuhenkilöiden Nextcloud-käyttäjätunnukset", + "The portfolio this project belongs to": "Salkku, johon tämä projekti kuuluu", + "No portfolio": "Ei salkkua", + "All portfolios": "Kaikki salkut", + "You read this project as a manager of its portfolio. Only its members change it.": "Luet tätä projektia sen salkun vastuuhenkilönä. Vain sen jäsenet muuttavat sitä.", + "Portfolios": "Salkut", + "Portfolio status": "Salkun tila", + "No portfolios yet": "Ei vielä salkkuja", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Ylläpitäjä lisää salkut kohdassa Projektit, Salkut. Salkun projektit näkyvät tässä tiloineen.", + "Roll-up": "Yhteenveto", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} aikataulussa, {atRisk} riskissä, {offTrack} raiteiltaan, {noReport} ilman raporttia", + "No project in this portfolio that you can read.": "Tässä salkussa ei ole projektia, jonka voit lukea.", + "Start": "Alku", + "End": "Loppu", + "Budget": "Budjetti", + "Last report": "Viimeisin raportti", + "Out of date": "Vanhentunut", + "Portfolio timeline": "Salkun aikajana", + "Zoom": "Zoomaus", + "Could not load the timeline": "Aikajanaa ei voitu ladata", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Ylläpitäjä lisää salkut kohdassa Projektit, Salkut. Salkun projektit näkyvät tässä yhdellä aikajanalla.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Avaa projekti nähdäksesi sen vaiheet ja tehtävät. Aikajana on vain luku -tilassa.", + "Phase: {title}": "Vaihe: {title}", + "Left out because you cannot read them: {count} projects": "Jätetty pois, koska et voi lukea niitä: {count} projektia", + "Week": "Viikko", + "Day": "Päivä", + "Month": "Kuukausi", + "Please try again later.": "Yritä myöhemmin uudelleen.", + "Status reports": "Tilaraportit", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Monenko päivän jälkeen projektin viimeisin tilaraportti merkitään vanhentuneeksi salkun yleiskatsauksessa", + "Reporting period (days)": "Raportointijakso (päivää)", + "The reporting period is a whole number of days from 1 to 365.": "Raportointijakso on kokonainen määrä päiviä väliltä 1–365.", + "Reporting period saved": "Raportointijakso tallennettu", + "The reporting period was not saved. Please try again.": "Raportointijaksoa ei tallennettu. Yritä uudelleen.", + "Every project of a portfolio with its status per aspect, rolled up.": "Salkun jokainen projekti ja sen tila näkökulmittain, yhteenvetona.", + "The projects of a portfolio on one timeline.": "Salkun projektit yhdellä aikajanalla.", + "Phases": "Vaiheet", + "Add phase": "Lisää vaihe", + "No phases yet": "Ei vielä vaiheita", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Jaa projekti vaiheisiin, kuten käynnistys, määrittely ja toteutus. Vaihe sulkeutuu, kun sen päättävä asiakirja on ladattu.", + "{hours} hours": "{hours} tuntia", + "Concluding document: {title}": "Päättävä asiakirja: {title}", + "Concluding document missing": "Päättävä asiakirja puuttuu", + "Move {title} up": "Siirrä {title} ylös", + "Move {title} down": "Siirrä {title} alas", + "Close phase": "Sulje vaihe", + "Phase": "Vaihe", + "Files": "Tiedostot", + "Notes": "Muistiinpanot", + "Audit trail": "Kirjausketju", + "Edit phase": "Muokkaa vaihetta", + "Name": "Nimi", + "Budget hours": "Budjettitunnit", + "Could not save the phase. Please try again.": "Vaihetta ei voitu tallentaa. Yritä uudelleen.", + "Close phase {title}": "Sulje vaihe {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Vaihe suljetaan sen päättävällä asiakirjalla: lataa se tässä tai valitse jokin vaiheen tiedostoista.", + "Concluding document": "Päättävä asiakirja", + "This phase has no files yet.": "Tässä vaiheessa ei ole vielä tiedostoja.", + "Upload a document": "Lataa asiakirja", + "The document was not uploaded. Please try again.": "Asiakirjaa ei ladattu. Yritä uudelleen.", + "Upload the concluding document before you close this phase.": "Lataa päättävä asiakirja ennen kuin suljet tämän vaiheen.", + "This phase cannot be closed from its current status.": "Tätä vaihetta ei voi sulkea sen nykyisestä tilasta.", + "The phase was not closed. Please try again.": "Vaihetta ei suljettu. Yritä uudelleen.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Vaiheen päättävän tiedoston tunniste. Vaihe voidaan merkitä valmiiksi vasta, kun se on asetettu ja tiedosto on liitetty.", + "Import from Microsoft Project": "Tuo Microsoft Projectista", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Valitse suunnitelma, joka on tallennettu Microsoft Projectista XML-muodossa. Mitään ei tuoda ennen kuin vahvistat.", + "Plan file": "Suunnitelmatiedosto", + "What the import creates": "Mitä tuonti luo", + "Tasks": "Tehtävät", + "Sub-tasks": "Alitehtävät", + "Milestones": "Välitavoitteet", + "Links": "Linkit", + "Already imported, updated in place: {count}": "Jo tuotu, päivitetty paikallaan: {count}", + "What does not carry over": "Mikä ei siirry", + "Tasks with resources, which are not imported: {count}": "Tehtävät, joilla on resursseja, joita ei tuoda: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tasoa 3 syvemmät tehtävät, sijoitettu tason 2 tehtävänsä alle: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Muut kuin lopusta alkuun -linkit, tuotu liittyvinä linkkeinä: {count}", + "Link lags, which are dropped: {count}": "Linkkien viiveet, jotka jätetään pois: {count}", + "Links to a summary task, which are not imported: {count}": "Linkit yhteenvetotehtävään, joita ei tuoda: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Linkit tämän suunnitelman ulkopuolisiin tehtäviin, joita ei tuoda: {count}", + "No longer in the plan": "Ei enää suunnitelmassa", + "These stay in the project; remove them yourself if they are no longer needed.": "Nämä jäävät projektiin; poista ne itse, jos niitä ei enää tarvita.", + "Import": "Tuo", + "Close": "Sulje", + "The plan is imported: {created} created, {updated} updated.": "Suunnitelma on tuotu: {created} luotu, {updated} päivitetty.", + "Links that would close a loop were left out: {count}": "Silmukan sulkevat linkit jätettiin pois: {count}", + "The import stopped part-way. Run it again to finish it.": "Tuonti pysähtyi kesken. Suorita se uudelleen viedäksesi sen loppuun.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Tallenna suunnitelma Microsoft Projectissa valitsemalla Tiedosto, Tallenna nimellä, XML-muoto, ja tuo se tiedosto.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Tämä tiedosto määrittelee DOCTYPEn tai entiteettejä, joita ei hyväksytä.", + "The file is larger than 10 MB.": "Tiedosto on yli 10 Mt.", + "The plan has more than 2,000 tasks, more than one import takes.": "Suunnitelmassa on yli 2 000 tehtävää, enemmän kuin yksi tuonti ottaa.", + "This file is not a Microsoft Project plan in XML format.": "Tämä tiedosto ei ole XML-muotoinen Microsoft Project -suunnitelma.", + "Choose a file to import.": "Valitse tuotava tiedosto.", + "Only the project owner can import a plan.": "Vain projektin omistaja voi tuoda suunnitelman.", + "The plan could not be read. Please try again.": "Suunnitelmaa ei voitu lukea. Yritä uudelleen.", + "Linked case: {title}": "Linkitetty asia: {title}", + "Linked to a case": "Linkitetty asiaan", + "Hand over to case": "Luovuta asialle", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopioi jokaisen projektin ja sen tehtävien tiedoston sekä projektia kuvaavan tiedoston muuttamattomina linkitettyyn asiaan.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopioidut tiedostot: {count}", + "Files that failed: {names}": "Epäonnistuneet tiedostot: {names}", + "The handover failed. Please try again.": "Luovutus epäonnistui. Yritä uudelleen.", + "The linked case could not be found, or you cannot open it.": "Linkitettyä asiaa ei löytynyt, tai et voi avata sitä.", + "Case handovers": "Luovutukset asialle", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Jokainen kerta, kun projektin tiedostot ja metatiedot luovutettiin asialle: milloin, kuka, mille asialle, jokainen kopioitu tiedosto SHA-256-tiivisteineen ja epäonnistuneet tiedostot.", + "Finance": "Talous", + "Add cost line": "Lisää kustannusrivi", + "Delivery terms": "Toimitusehdot", + "Billing model": "Laskutusmalli", + "Budget in euro": "Budjetti euroina", + "Budget in hours": "Budjetti tunteina", + "Hourly rate in euro": "Tuntihinta euroina", + "Planned start": "Suunniteltu alku", + "Planned end": "Suunniteltu loppu", + "Planned dates": "Suunnitellut päivät", + "Budget {amount}": "Budjetti {amount}", + "No budget agreed": "Budjetista ei ole sovittu", + "Hours": "Tunnit", + "Only the project owner and the portfolio managers see the amounts.": "Vain projektin omistaja ja salkun hallinnoijat näkevät summat.", + "Budget against cost per category": "Budjetti ja kustannukset luokittain", + "Labour (booked time)": "Työ (kirjatut tunnit)", + "No category": "Ei luokkaa", + "Hours are not available": "Tunnit eivät ole saatavilla", + "Not yet assigned to a category": "Ei vielä kohdistettu luokkaan", + "Total": "Yhteensä", + "{spent} spent, {remaining} remaining": "{spent} käytetty, {remaining} jäljellä", + "Budget against cost per phase": "Budjetti ja kustannukset vaiheittain", + "No phase": "Ei vaihetta", + "Cost lines": "Kustannusrivit", + "From the finance system": "Talousjärjestelmästä", + "Edit cost line {amount}": "Muokkaa kustannusriviä {amount}", + "No cost lines yet": "Ei vielä kustannusrivejä", + "Commitments": "Sitoumukset", + "Actual cost": "Toteutuneet kustannukset", + "Forecast": "Ennuste", + "Remaining": "Jäljellä", + "Not planned yet": "Ei vielä suunniteltu", + "{start} to {end}": "{start}–{end}", + "The terms were not saved. Please try again.": "Ehtoja ei tallennettu. Yritä uudelleen.", + "Terms saved": "Ehdot tallennettu", + "Fixed price": "Kiinteä hinta", + "Hourly": "Tuntiperusteinen", + "Not billed": "Ei laskuteta", + "Commitment": "Sitoumus", + "Edit cost line": "Muokkaa kustannusriviä", + "Kind": "Laji", + "Amount in euro": "Summa euroina", + "Remove": "Poista", + "Could not save the cost line. Only the project owner changes the money of a project.": "Kustannusriviä ei voitu tallentaa. Vain projektin omistaja muuttaa projektin rahoja.", + "Could not remove the cost line. Please try again.": "Kustannusriviä ei voitu poistaa. Yritä uudelleen.", + "{amount} over budget": "{amount} yli budjetin", + "Cost categories": "Kustannusluokat", + "The categories every project splits its budget and costs into, one per line": "Luokat, joihin jokainen projekti jakaa budjettinsa ja kustannuksensa, yksi riviä kohden", + "Categories": "Luokat", + "Give at least one category, each name once.": "Anna vähintään yksi luokka, kukin nimi kerran.", + "Cost categories saved": "Kustannusluokat tallennettu", + "The cost categories were not saved. Please try again.": "Kustannusluokkia ei tallennettu. Yritä uudelleen.", + "Finance line": "Talousrivi", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Yksi projektin rahasumma: budjetti, sitoumus, toteutunut kustannus tai ennuste, kustannusluokassa ja mahdollisesti vaiheessa. Projektin omistajan kirjaama tai talousjärjestelmän integraatiosovelluksen kautta lähettämä.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekti, johon summa kuuluu. Tyhjä talousjärjestelmän rivillä, jonka projektinumero ei vastaa mitään projektia.", + "The phase this amount belongs to, if any": "Vaihe, johon summa kuuluu, jos sellainen on", + "The cost category, one of the categories the admin set up": "Kustannusluokka, jokin ylläpitäjän määrittämistä luokista", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Onko summa budjetti, sitoumus, toteutunut kustannus vai ennuste", + "Amount": "Summa", + "The amount in the reporting currency (euro)": "Summa raportointivaluutassa (euro)", + "The date the amount was booked or is expected": "Päivä, jona summa kirjattiin tai odotetaan", + "What the amount is for": "Mihin summa on", + "Whether a person entered the line or the finance system sent it": "Kirjasiko rivin henkilö vai lähettikö sen talousjärjestelmä", + "Entered by hand": "Käsin kirjattu", + "Finance line id": "Talousrivin tunniste", + "The finance system's own id of this line. One imported line per id.": "Tämän rivin oma tunniste talousjärjestelmässä. Yksi tuotu rivi tunnistetta kohden.", + "Project number": "Projektinumero", + "The project number the finance system sent, matched against the project key": "Talousjärjestelmän lähettämä projektinumero, jota verrataan projektin avaimeen", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Rivin projektin salkku, kopioitu projektista, jotta salkun summat tarvitsevat yhden suodattimen", + "Finance readers": "Talouden lukijat", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Niiden henkilöiden Nextcloud-käyttäjätunnukset, jotka saavat nähdä summan: projektin omistaja ja salkun hallinnoijat", + "Project owner": "Projektin omistaja", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Projektin omistajan Nextcloud-käyttäjätunnus; hän saa muuttaa ja poistaa käsin kirjattuja rivejä", + "How the client pays: not billed, a fixed price, or by the hour.": "Miten asiakas maksaa: ei laskuteta, kiinteä hinta tai tuntiperusteinen.", + "Portfolio finance": "Salkun talous", + "You cannot see the money of any project in this portfolio": "Et näe tämän salkun minkään projektin rahoja", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Palvelin palautti kustannusrivejä tämän salkun ulkopuolisista projekteista, joten summat voivat olla vääriä.", + "Projects left out because you cannot see their money: {count}": "Pois jätetyt projektit, koska et näe niiden rahoja: {count}", + "Unmatched finance lines": "Kohdistamattomat talousrivit", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budjetti, sitoumukset, toteutuneet kustannukset ja ennuste salkun yhteissummina.", + "Subprojects": "Aliprojektit", + "{done} of {total}": "{done}/{total}", + "{done} of {total} tasks done, including subprojects": "{done}/{total} tehtävää valmiina, aliprojektit mukaan lukien", + "Show the subprojects of {title}": "Näytä kohteen {title} aliprojektit", + "Hide the subprojects of {title}": "Piilota kohteen {title} aliprojektit", + "Part of": "Osa kohdetta", + "No parent project": "Ei yläprojektia", + "A project cannot sit under one of its own subprojects.": "Projekti ei voi olla oman aliprojektinsa alla.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projektit voivat olla enintään kolmen tason syvyydellä: ohjelma, projekti ja aliprojekti.", + "Parent project": "Yläprojekti", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekti, jonka alla tämä projekti on, esimerkiksi ohjelma. Projektit voivat olla enintään kolmen tason syvyydellä.", + "Yes": "Kyllä", + "No": "Ei", + "{label} (required)": "{label} (pakollinen)", + "{label} is required": "{label} on pakollinen", + "Project field": "Projektikenttä", + "A field an admin adds to every project, such as a policy area or a contract value.": "Kenttä, jonka ylläpitäjä lisää jokaiseen projektiin, kuten toimiala tai sopimusarvo.", + "Key": "Avain", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Pysyvä nimi, jolla arvo tallennetaan, lower camel case -muodossa. Pidä se, kun projektit käyttävät sitä.", + "Label": "Nimike", + "The name people see next to the field": "Nimi, jonka ihmiset näkevät kentän vieressä", + "What the field holds": "Mitä kenttä sisältää", + "Text": "Teksti", + "Number": "Numero", + "Choice": "Valinta", + "Person": "Henkilö", + "Yes or no": "Kyllä tai ei", + "Options": "Vaihtoehdot", + "The choices of a choice field": "Valintakentän vaihtoehdot", + "Required": "Pakollinen", + "Whether a project must fill in the field": "Täytyykö projektin täyttää kenttä", + "Where the field appears, lowest first": "Missä kenttä näkyy, pienin ensin", + "Applies to": "Koskee", + "What the field is added to": "Mihin kenttä lisätään", + "Custom fields": "Omat kentät", + "The values of the project fields an admin defined, keyed by the field's key.": "Ylläpitäjän määrittämien projektikenttien arvot kentän avaimen mukaan.", + "Project fields": "Projektikentät", + "Related": "Liittyvät", + "Remove link": "Poista linkki", + "Link type": "Linkin tyyppi", + "Relates to": "Liittyy", + "Duplicates": "Kaksoiskappale", + "Project key": "Projektin tunnus", + "Every task number starts with it, such as VERG-42.": "Jokainen tehtävänumero alkaa sillä, esimerkiksi VERG-42.", + "This key is already used by another project.": "Toinen projekti käyttää jo tätä tunnusta.", + "Use 2 to 10 letters and digits, starting with a letter.": "Käytä 2–10 kirjainta ja numeroa, ja aloita kirjaimella.", + "The key cannot change once tasks carry it.": "Tunnus ei voi muuttua, kun tehtävillä on se.", + "Project saved. The existing tasks get their numbers in the background.": "Projekti tallennettu. Nykyiset tehtävät saavat numeronsa taustalla.", + "Next task number": "Seuraava tehtävänumero", + "The number the next task of this project gets in its key. Only the system writes it.": "Numero, jonka tämän projektin seuraava tehtävä saa tunnukseensa. Vain järjestelmä kirjoittaa sen.", + "Restore {title}": "Palauta {title}", + "Restore": "Palauta", + "Project restored": "Projekti palautettu", + "Could not restore the project": "Projektia ei voitu palauttaa", + "Bring this project back to the active list.": "Palauta projekti aktiivisten projektien luetteloon.", + "Restore project": "Palauta projekti", + "Request reason": "Pyynnön syy", + "Why the requester needs this project. Filled in when the project is requested.": "Miksi pyytäjä tarvitsee projektin. Täytetään pyynnön yhteydessä.", + "Reviewed by": "Käsittelijä", + "The user who approved or rejected the request.": "Käyttäjä, joka hyväksyi tai hylkäsi pyynnön.", + "Reviewed at": "Käsitelty", + "When the request was approved or rejected.": "Milloin pyyntö hyväksyttiin tai hylättiin.", + "Review note": "Käsittelijän huomautus", + "The reviewer's reason, shown to the requester when a request is not approved.": "Käsittelijän perustelu, jonka pyytäjä näkee, kun pyyntöä ei hyväksytä.", + "Members of these groups": "Näiden ryhmien jäsenet", + "Groups that may create projects": "Ryhmät, jotka voivat luoda projekteja", + "The group {group} no longer exists. Save to remove it.": "Ryhmää {group} ei enää ole. Poista se tallentamalla.", + "Review project request": "Käsittele projektipyyntö", + "Requested by": "Pyytäjä", + "Why it is needed": "Miksi sitä tarvitaan", + "Desired start date": "Toivottu aloituspäivä", + "Why is it not approved?": "Miksi sitä ei hyväksytä?", + "Give a reason. The requester sees it.": "Anna syy. Pyytäjä näkee sen.", + "Approve": "Hyväksy", + "Reject": "Hylkää", + "Reject request": "Hylkää pyyntö", + "The review was not saved. Try again.": "Käsittelyä ei tallennettu. Yritä uudelleen.", + "This project is waiting for review": "Projekti odottaa käsittelyä", + "This request was not approved": "Pyyntöä ei hyväksytty", + "Reason: {note}": "Syy: {note}", + "Review request": "Käsittele pyyntö", + "Request a project": "Pyydä projektia", + "Step {step} of 2": "Vaihe {step}/2", + "Why is this project needed?": "Miksi projektia tarvitaan?", + "Give a reason. The reviewer reads it.": "Anna syy. Käsittelijä lukee sen.", + "Back": "Takaisin", + "Next": "Seuraava", + "Send request": "Lähetä pyyntö", + "The request was not sent. Try again.": "Pyyntöä ei lähetetty. Yritä uudelleen.", + "Requested": "Pyydetty", + "Not approved": "Ei hyväksytty", + "Your request was sent": "Pyyntösi on lähetetty", + "Let everyone else request a project": "Anna kaikkien muiden pyytää projektia", + "Add a task": "Lisää tehtävä", + "Delete task": "Poista tehtävä", + "Edit task": "Muokkaa tehtävää", + "Write": "Kirjoita", + "Preview": "Esikatselu", + "Markdown works here: headings, lists and links.": "Markdown toimii tässä: otsikot, luettelot ja linkit.", + "Could not save the task. Please try again.": "Tehtävää ei voitu tallentaa. Yritä uudelleen.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Tehtävään \"{title}\" on kirjattu aikaa, joten sitä ei voi poistaa. Voit perua sen sen sijaan: aikakirjaukset säilyvät.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Poistetaanko \"{title}\"? Myös sen linkit muihin tehtäviin poistetaan. Tätä ei voi perua.", + "Keep task": "Säilytä tehtävä", + "Cancel task": "Peru tehtävä", + "Only the reporter, the project owner or an admin can delete this task.": "Vain ilmoittaja, projektin omistaja tai ylläpitäjä voi poistaa tämän tehtävän.", + "Could not delete the task. Please try again.": "Tehtävää ei voitu poistaa. Yritä uudelleen.", + "Could not cancel the task. Please try again.": "Tehtävää ei voitu perua. Yritä uudelleen.", + "Responsible": "Vastuuhenkilö", + "Also working on this": "Työskentelee myös tämän parissa", + "Labels": "Tunnisteet", + "Could not change the priority. Please try again.": "Prioriteettia ei voitu muuttaa. Yritä uudelleen.", + "Other project members who work on this task alongside the person responsible.": "Muut projektin jäsenet, jotka työskentelevät tehtävän parissa vastuuhenkilön kanssa.", + "Duplicate": "Monista", + "Could not copy the task. Please try again.": "Tehtävää ei voitu kopioida. Yritä uudelleen.", + "Subtasks": "Alitehtävät", + "{done} of {total} done": "{done}/{total} valmiina", + "Add a subtask": "Lisää alitehtävä", + "Checklist": "Tarkistuslista", + "Checklist item actions": "Tarkistuslistan kohdan toiminnot", + "Add a checklist item": "Lisää tarkistuslistan kohta", + "Subtasks: {estimate} estimated, {logged} logged": "Alitehtävät: {estimate} arvioitu, {logged} kirjattu", + "Total estimate: {total}": "Kokonaisarvio: {total}", + "Part of {title}": "Osa tehtävää {title}", + "Checklist: {count} done": "Tarkistuslista: {count} valmiina", + "This task has subtasks: {count}.": "Tällä tehtävällä on alitehtäviä: {count}.", + "Keep subtasks as separate tasks": "Säilytä alitehtävät erillisinä tehtävinä", + "Delete subtasks too": "Poista myös alitehtävät", + "Copy of {title}": "Kopio: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Tehtävä kopioitiin, mutta ei kaikkia sen alitehtäviä. Tarkista kopio.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Pieniä vaiheita tehtävän sisällä. Jokaisella kohdalla on tunniste, teksti ja tieto siitä, onko se valmis.", + "Open work per person and per project.": "Avoin työ henkilöittäin ja projekteittain.", + "View": "Näkymä", + "By person": "Henkilöittäin", + "By project": "Projekteittain", + "Hours left": "Tunteja jäljellä", + "Tasks without an estimate": "Tehtävät ilman arviota", + "Due in 14 days": "Erääntyy 14 päivän sisällä", + "Shared": "Jaetut", + "Unassigned": "Ei vastuuhenkilöä", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Näytetään työ projekteista, jotka voit nähdä. Tunnit lasketaan vastuuhenkilölle; jaetut tehtävät lasketaan ilman tunteja.", + "No open work in these projects.": "Näissä projekteissa ei ole avointa työtä.", + "Open work": "Avoin työ", + "{count} open tasks": "{count} avointa tehtävää", + "Create a project to see capacity here.": "Luo projekti nähdäksesi kapasiteetin tässä.", + "My tasks": "Omat tehtävät", + "Show all my tasks": "Näytä kaikki omat tehtävät", + "No tasks assigned to you": "Sinulle ei ole osoitettu tehtäviä", + "Browse projects": "Selaa projekteja", + "Later": "Myöhemmin", + "Due {date}": "Erääntyy {date}", + "Could not change the status. Please try again.": "Tilaa ei voitu muuttaa. Yritä uudelleen.", + "Completed today": "Valmistuneet tänään", + "My open tasks": "Omat avoimet tehtävät", + "My overdue tasks": "Omat myöhässä olevat tehtävät", + "My tasks in progress": "Omat käynnissä olevat tehtävät", + "Pin to the top": "Kiinnitä ylös", + "Unpin": "Irrota", + "Pinned": "Kiinnitetty", + "Actions for {title}": "Toiminnot: {title}", + "Could not save your project order. Please try again.": "Projektiesi järjestystä ei voitu tallentaa. Yritä uudelleen.", + "No boards yet": "Ei vielä tauluja", + "Create a project to get a board.": "Luo projekti saadaksesi taulun.", + "Use the Projects page to create and manage your projects and tasks.": "Luo ja hallitse projektejasi ja tehtäviäsi Projektit-sivulla.", + "Go to projects": "Siirry projekteihin", + "You are not a member of any projects yet.": "Et ole vielä minkään projektin jäsen.", + "Could not search for users. Please try again.": "Käyttäjien haku epäonnistui. Yritä uudelleen.", + "Project creation is restricted to administrators.": "Vain ylläpitäjät voivat luoda projekteja.", + "Only the project owner or an administrator can delete this project.": "Vain projektin omistaja tai ylläpitäjä voi poistaa tämän projektin.", + "No projects are available to you yet. Ask an administrator to create one.": "Sinulle ei ole vielä saatavilla projekteja. Pyydä ylläpitäjää luomaan sellainen.", + "Due: {date}": "Erääntyy: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Tehtävät, joilla on aloitus- tai eräpäivä, näkyvät aikajanalla. Lisää päivämäärät nähdäksesi ne tässä.", + "You do not have access to this project.": "Sinulla ei ole pääsyä tähän projektiin.", + "Zoom level": "Zoomaustaso", + "Unscheduled": "Aikatauluttamattomat", + "Start: {date}": "Alku: {date}", + "Today": "Tänään", + "No scheduled tasks": "Ei aikataulutettuja tehtäviä", + "An unexpected error occurred.": "Tapahtui odottamaton virhe.", + "Column {number} name": "Sarakkeen {number} nimi", + "Failed to save creation policy": "Luontikäytännön tallentaminen epäonnistui", + "All authenticated users": "Kaikki kirjautuneet käyttäjät", + "Control who may create new projects": "Määritä, kuka saa luoda uusia projekteja", + "Administrators only": "Vain ylläpitäjät", + "Project creation": "Projektien luonti", + "Allow project creation": "Salli projektien luonti", + "Creation policy saved successfully": "Luontikäytäntö tallennettu", + "Initializing…": "Käynnistetään…", + "e.g. 2h 30m, 90m, 1.5h": "esim. 2h 30m, 90m, 1.5h", + "Log time": "Kirjaa aikaa", + "Save estimate": "Tallenna arvio", + "Logged: {logged}": "Kirjattu: {logged}", + "over by {amount}": "{amount} yli", + "Time tracking": "Ajankäytön seuranta", + "Estimate": "Arvio", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Anna kelvollinen arvio (esim. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Anna kelvollinen kesto (esim. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Aikakirjausta ei voitu tallentaa. Yritä uudelleen.", + "Edit time entry": "Muokkaa aikakirjausta", + "Duration": "Kesto", + "Date range": "Aikaväli", + "Last week": "Viime viikko", + "No time logged": "Aikaa ei ole kirjattu", + "Log time on a task to see it here.": "Kirjaa aikaa tehtävälle nähdäksesi sen tässä.", + "To date": "Päättymispäivä", + "This week": "Tämä viikko", + "Total: {total}": "Yhteensä: {total}", + "From date": "Alkamispäivä", + "Custom range": "Mukautettu aikaväli", + "All time": "Koko aika", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Tehtävää ei voitu poistaa, joten tietoja voi jäädä jäljelle. Poista projekti uudelleen.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Aikakirjausta ei voitu poistaa, joten tietoja voi jäädä jäljelle. Poista projekti uudelleen.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Saraketta ei voitu poistaa, joten tietoja voi jäädä jäljelle. Poista projekti uudelleen.", + "Could not delete the project. Please try again.": "Projektia ei voitu poistaa. Yritä uudelleen.", + "Notification settings": "Ilmoitusasetukset", + "Configure when due-date reminders are sent": "Määritä, milloin eräpäivämuistutukset lähetetään", + "Due-date reminder lead time (hours)": "Eräpäivämuistutuksen ennakko (tuntia)", + "Lead time must be between 1 and 336 hours": "Ennakon on oltava 1–336 tuntia", + "Reminder lead time saved successfully": "Muistutuksen ennakko tallennettu", + "Failed to save reminder lead time": "Muistutuksen ennakkoa ei voitu tallentaa", + "Notifications": "Ilmoitukset", + "Notify me 1 day before a task's due date": "Ilmoita minulle 1 päivä ennen tehtävän eräpäivää", + "Draft": "Luonnos", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Onko oppitunti luonnos, jonka vain sen opettaja näkee, pidetäänkö se vai onko se peruttu.", + "New release": "Uusi julkaisu", + "Roadmap chart. The same releases and epics are listed below.": "Tiekarttakaavio. Samat julkaisut ja eepokset on lueteltu alla.", + "Nothing on the roadmap yet": "Tiekartalla ei ole vielä mitään", + "Releases with a target date and epics with dated tasks appear here.": "Tässä näkyvät julkaisut, joilla on tavoitepäivä, ja eepokset, joiden tehtävillä on päivämäärä.", + "Releases": "Julkaisut", + "No releases yet": "Ei vielä julkaisuja", + "Target date: {date}": "Tavoitepäivä: {date}", + "No target date": "Ei tavoitepäivää", + "Edit {name}": "Muokkaa: {name}", + "Mark {name} as released": "Merkitse {name} julkaistuksi", + "Mark as released": "Merkitse julkaistuksi", + "Epics": "Eepokset", + "No epics yet. Open a task to make it an epic.": "Ei vielä eepoksia. Avaa tehtävä tehdäksesi siitä eepoksen.", + "Not scheduled yet": "Ei vielä aikataulutettu", + "Planned": "Suunniteltu", + "Released": "Julkaistu", + "Edit release": "Muokkaa julkaisua", + "Target date": "Tavoitepäivä", + "Could not save the release. Please try again.": "Julkaisua ei voitu tallentaa. Yritä uudelleen.", + "Every task of this release is done or cancelled.": "Tämän julkaisun kaikki tehtävät ovat valmiita tai peruttuja.", + "Not finished yet: {count}": "Vielä kesken: {count}", + "What happens to these tasks?": "Mitä näille tehtäville tapahtuu?", + "Move to {name}": "Siirrä julkaisuun {name}", + "Remove the release": "Poista julkaisu", + "Keep it on {name}": "Jätä ne julkaisuun {name}", + "Could not mark the release as released. Please try again.": "Julkaisua ei voitu merkitä julkaistuksi. Yritä uudelleen.", + "Roadmap": "Tiekartta", + "Tasks or roadmap": "Tehtävät tai tiekartta", + "Release": "Julkaisu", + "Epic": "Eepos", + "This task is an epic": "Tämä tehtävä on eepos", + "A named, dated delivery of a project that its tasks are planned against.": "Projektin nimetty ja päivätty toimitus, johon sen tehtävät suunnitellaan.", + "Name of the release": "Julkaisun nimi", + "The project this release belongs to": "Projekti, johon tämä julkaisu kuuluu", + "What this release delivers": "Mitä tämä julkaisu toimittaa", + "When work on the release starts": "Milloin työ julkaisun parissa alkaa", + "The date the release is due": "Päivä, johon mennessä julkaisun on oltava valmis", + "Whether the release is planned, released or archived": "Onko julkaisu suunniteltu, julkaistu vai arkistoitu", + "Released on": "Julkaistu", + "When the release was marked as released": "Milloin julkaisu merkittiin julkaistuksi", + "The release this task is planned for": "Julkaisu, johon tämä tehtävä on suunniteltu", + "Board view options": "Taulun näkymäasetukset", + "Colour cards": "Väritä kortit", + "No colour": "Ei väriä", + "By label": "Tunnisteen mukaan", + "Swimlanes": "Uimaradat", + "No swimlanes": "Ei uimaratoja", + "By assignee": "Vastuuhenkilön mukaan", + "By epic": "Eepoksen mukaan", + "No assignee": "Ei vastuuhenkilöä", + "No epic": "Ei eeposta", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kortit pysyvät eepoksensa rivillä. Vaihda eepos tehtävän sivulla.", + "Hand over to": "Siirrä henkilölle", + "Could not save your board view. It applies until you reload.": "Taulun näkymää ei voitu tallentaa. Se on voimassa, kunnes lataat sivun uudelleen.", + "Timetable wish": "Lukujärjestystoive", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Toive, jonka generaattori ottaa huomioon. Ehdottoman toiveen se pitää aina, joustavan kun voi.", + "Whether the wish is about a teacher, a group, a room or one activity": "Koskeeko toive opettajaa, ryhmää, tilaa vai yhtä toimintoa", + "Teacher": "Opettaja", + "Group": "Ryhmä", + "Reference": "Viite", + "The user, group, room or activity the wish is about": "Käyttäjä, ryhmä, tila tai toiminto, jota toive koskee", + "What the wish asks for": "Mitä toive pyytää", + "Not on these periods": "Ei näillä tunneilla", + "Preferably not on these periods": "Mieluiten ei näillä tunneilla", + "At most a number of lessons a day": "Enintään tietty määrä tunteja päivässä", + "No free periods between lessons": "Ei hyppytunteja", + "Always the same room": "Aina sama tila", + "Periods": "Tunnit", + "The periods of the week the wish is about, such as wed-5": "Viikon tunnit, joita toive koskee, esimerkiksi wed-5", + "Limit": "Raja", + "The most lessons a day, for a wish of that kind": "Enimmäistunnit päivässä, tämän lajin toiveelle", + "Strength": "Vahvuus", + "Whether the generator must keep the wish or should keep it": "Täytyykö vai pitäisikö generaattorin pitää toive", + "Hard": "Ehdoton", + "Soft": "Joustava", + "Weight": "Paino", + "How much a soft wish counts, from 1 to 3": "Kuinka paljon joustava toive painaa, 1–3", + "Why the wish exists": "Miksi toive on olemassa", + "Timetable scenario": "Lukujärjestysskenaario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Yksi viikkomalli, generaattorin tekemä tai nykyisestä lukujärjestyksestä otettu. Se säilyttää syötteensä ja sen, miten hyvin se pitää toiveet.", + "The name timetablers know the scenario by": "Nimi, jolla lukujärjestyksen tekijät tuntevat skenaarion", + "Whether the generator made it or it came from the current timetable": "Tekikö generaattori sen vai tuleeko se nykyisestä lukujärjestyksestä", + "Generated": "Luotu", + "From the current timetable": "Nykyisestä lukujärjestyksestä", + "Week of": "Viikko alkaen", + "The Monday of the first week of the window": "Jakson ensimmäisen viikon maanantai", + "Window start": "Jakson alku", + "The first day the week pattern applies to": "Ensimmäinen päivä, jota viikkomalli koskee", + "Window end": "Jakson loppu", + "The last day the week pattern applies to": "Viimeinen päivä, jota viikkomalli koskee", + "Waiting, generating, done, failed, or published as draft lessons": "Odottaa, luodaan, valmis, epäonnistui tai julkaistu luonnostunteina", + "Waiting": "Odottaa", + "Generating": "Luodaan", + "Failed": "Epäonnistui", + "Published": "Julkaistu", + "Seed": "Siemen", + "The number the generator starts from, so a run can be repeated": "Luku, josta generaattori aloittaa, jotta ajon voi toistaa", + "Input": "Syöte", + "The periods, rooms, lessons and wishes the scenario was made from": "Tunnit, tilat, oppitunnit ja toiveet, joista skenaario tehtiin", + "Placements": "Sijoitukset", + "Each lesson with the period and room it was given": "Jokainen oppitunti sille annetun tunnin ja tilan kanssa", + "Unplaced lessons": "Sijoittamattomat oppitunnit", + "Lessons without a place, each with the hard wish that blocked it": "Oppitunnit ilman paikkaa, kukin sen estäneen ehdottoman toiveen kanssa", + "Broken wishes": "Rikotut toiveet", + "The wishes this scenario breaks, with the lessons that break them": "Toiveet, joita tämä skenaario rikkoo, ja ne rikkovat oppitunnit", + "Measures": "Mittarit", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Sijoitetut oppitunnit, rikotut toiveet, opettajien hyppytunnit, tunnit päivässä ja tilojen käyttö", + "Reason": "Syy", + "Why the run failed": "Miksi ajo epäonnistui", + "Published at": "Julkaistu", + "When the scenario was written out as draft lessons": "Milloin skenaario kirjoitettiin luonnostunneiksi", + "Edit wish": "Muokkaa toivetta", + "New wish": "Uusi toive", + "Hard: the generator always keeps it": "Ehdoton: generaattori noudattaa sitä aina", + "Soft: the generator keeps it where it can": "Joustava: generaattori noudattaa sitä, kun voi", + "Weight (1 to 3)": "Paino (1-3)", + "Most lessons a day": "Enintään tunteja päivässä", + "Period": "Tunti", + "{day} period {number}": "{day} tunti {number}", + "Teacher (user name)": "Opettaja (käyttäjänimi)", + "Activity (group:subject)": "Toiminta (ryhmä:aine)", + "Say who or what the wish is about.": "Kerro, ketä tai mitä toive koskee.", + "Choose at least one period.": "Valitse vähintään yksi tunti.", + "The limit is a whole number of 1 or more.": "Raja on kokonaisluku 1 tai enemmän.", + "Timetable": "Lukujärjestys", + "Wishes": "Toiveet", + "Timetable wishes": "Lukujärjestystoiveet", + "Generator run": "Generaattorin ajo", + "Generator progress": "Generaattorin edistyminen", + "The run failed: {reason}": "Ajo epäonnistui: {reason}", + "{placed} of {lessons} lessons placed": "{placed}/{lessons} tuntia sijoitettu", + "Generate again": "Luo uudelleen", + "Generate": "Luo", + "Every lesson has a place.": "Jokaisella tunnilla on paikka.", + "Lesson": "Tunti", + "No free period and room": "Ei vapaata tuntia ja tilaa", + "Broken soft wishes": "Rikotut joustavat toiveet", + "Every soft wish is kept.": "Jokainen joustava toive on noudatettu.", + "Wish": "Toive", + "Lessons": "Tunnit", + "Generating: {percent}% of the time budget used": "Luodaan: {percent} % ajasta käytetty", + "Waiting to start": "Odottaa aloitusta", + "Published as draft lessons": "Julkaistu luonnostunteina", + "Could not read the scenario.": "Skenaariota ei voitu lukea.", + "Could not start the run.": "Ajoa ei voitu aloittaa.", + "Scenarios": "Skenaariot", + "Timetable scenarios": "Lukujärjestysskenaariot", + "Scenario": "Skenaario", + "Take the current timetable": "Ota nykyinen lukujärjestys", + "Could not take the current timetable.": "Nykyistä lukujärjestystä ei voitu ottaa.", + "Broken hard wishes": "Rikotut ehdottomat toiveet", + "Not on a period of the week grid": "Ei viikkoruudukon tunnilla", + "Compare scenarios": "Vertaa skenaarioita", + "Scenarios to compare": "Verrattavat skenaariot", + "Choose two or three scenarios to compare them.": "Valitse kaksi tai kolme skenaariota verrattavaksi.", + "Measure": "Mittari", + "Best": "Paras", + "Lessons that differ": "Eroavat tunnit", + "No lesson differs.": "Mikään tunti ei eroa.", + "Not placed": "Ei sijoitettu", + "{period} in {room}": "{period} tilassa {room}", + "Lessons placed": "Sijoitetut tunnit", + "Lessons without a place": "Tunnit ilman paikkaa", + "Clashes": "Päällekkäisyydet", + "Hard wishes broken": "Rikotut ehdottomat toiveet", + "Soft wishes broken": "Rikotut joustavat toiveet", + "Soft wishes broken, weighted": "Rikotut joustavat toiveet, painotettu", + "Free periods between lessons, all teachers": "Hyppytunnit, kaikki opettajat", + "Most free periods of one teacher": "Yhden opettajan eniten hyppytunteja", + "Most lessons of one group on a day": "Yhden ryhmän eniten tunteja päivässä", + "Room use": "Tilojen käyttö", + "Publish as draft lessons": "Julkaise luonnostunteina", + "Draft lessons written: {count}": "Luonnostunteja kirjoitettu: {count}", + "Could not publish the scenario.": "Skenaariota ei voitu julkaista.", + "Rules": "Säännöt", + "Rules for {column}": "Sarakkeen {column} säännöt", + "When a card enters this column": "Kun kortti tulee tähän sarakkeeseen", + "Action": "Toiminto", + "Set the priority": "Aseta prioriteetti", + "Assign to": "Anna tehtäväksi", + "Assign the person who moved the card": "Anna tehtäväksi kortin siirtäjälle", + "Remove the assignee": "Poista vastuuhenkilö", + "Add a label": "Lisää tunniste", + "No longer a project member": "Ei enää projektin jäsen", + "This label no longer exists": "Tätä tunnistetta ei enää ole", + "Add rule": "Lisää sääntö", + "Remove rule": "Poista sääntö", + "No rules yet. Add one to change a card when it enters this column.": "Ei vielä sääntöjä. Lisää sääntö, joka muuttaa korttia, kun se tulee tähän sarakkeeseen.", + "Could not save the rules. Please try again.": "Sääntöjä ei voitu tallentaa. Yritä uudelleen.", + "1 rule runs when a card enters this column": "1 sääntö suoritetaan, kun kortti tulee tähän sarakkeeseen", + "{count} rules run when a card enters this column": "{count} sääntöä suoritetaan, kun kortti tulee tähän sarakkeeseen", + "Rules applied: {changes}": "Säännöt käytetty: {changes}", + "assigned to {name}": "vastuuhenkilö {name}", + "assignee removed": "vastuuhenkilö poistettu", + "priority {priority}": "prioriteetti {priority}", + "label {label}": "tunniste {label}", + "What happens to a card when it enters this column, applied in list order.": "Mitä kortille tapahtuu, kun se tulee tähän sarakkeeseen, listan järjestyksessä.", + "Value": "Arvo", + "What the rule does to the card.": "Mitä sääntö tekee kortille.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioriteetti, käyttäjätunnus tai tunnisteen tunnus, jota toiminto käyttää; tyhjä toiminnoille ilman arvoa.", + "is not": "ei ole", + "{dimension} is not": "{dimension} ei ole", + "Saved filters": "Tallennetut suodattimet", + "No saved filters yet": "Ei vielä tallennettuja suodattimia", + "Save filter": "Tallenna suodatin", + "Rename \"{name}\"": "Nimeä \"{name}\" uudelleen", + "Delete \"{name}\"": "Poista \"{name}\"", + "Clear filters": "Tyhjennä suodattimet", + "Showing {shown} of {total} tasks": "Näytetään {shown}/{total} tehtävää", + "Me": "Minä", + "No date": "Ei päivämäärää", + "Rename saved filter": "Nimeä tallennettu suodatin uudelleen", + "Share with the project": "Jaa projektin kanssa", + "Give the filter a name": "Anna suodattimelle nimi", + "Could not save the filter. Please try again.": "Suodatinta ei voitu tallentaa. Yritä uudelleen.", + "Some labels in \"{name}\" no longer exist and were left out.": "Osa suodattimen \"{name}\" tunnisteista ei ole enää olemassa, ja ne jätettiin pois.", + "Could not delete the filter. Please try again.": "Suodatinta ei voitu poistaa. Yritä uudelleen.", + "Saved filter": "Tallennettu suodatin", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Yhden projektin nimetty taulusuodatin, vain tallentajan nähtävissä, ellei sitä ole jaettu projektin kanssa.", + "The project whose board the filter applies to": "Projekti, jonka tauluun suodatin kohdistuu", + "The name the filter is listed under": "Nimi, jolla suodatin näkyy luettelossa", + "Saved by": "Tallentaja", + "Nextcloud user id of the person who saved the filter": "Suodattimen tallentajan Nextcloud-käyttäjätunnus", + "Shared with the project": "Jaettu projektin kanssa", + "Whether every project member sees and applies the filter": "Näkeekö jokainen projektin jäsen suodattimen ja voiko sitä käyttää", + "Criteria": "Ehdot", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Suodatin: vastuuhenkilö, tunniste, prioriteetti ja määräpäivä, kukin ehdolla on tai ei ole ja arvoineen", + "Cross-project view": "Projektit ylittävä näkymä", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Tallennettu projektivalikoima, jonka tehtävät näytetään yhdessä tilasarakkeissa ja joka on jaettu siinä nimetyille henkilöille.", + "Shared with": "Jaettu henkilöille", + "The name the view is listed under": "Nimi, jolla näkymä luetellaan", + "Nextcloud user id of the person who saved the view": "Näkymän tallentaneen henkilön Nextcloud-käyttäjätunnus", + "Nextcloud user ids of the people the view is shared with": "Niiden henkilöiden Nextcloud-käyttäjätunnukset, joille näkymä on jaettu", + "The projects whose tasks the view shows, at most twenty": "Projektit, joiden tehtävät näkymä näyttää, enintään kaksikymmentä", + "1 project in this view is hidden from you.": "1 tämän näkymän projekti on piilotettu sinulta.", + "{count} projects in this view are hidden from you.": "{count} tämän näkymän projektia on piilotettu sinulta.", + "{project} has no column for {status}.": "Projektilla {project} ei ole saraketta tilalle {status}.", + "This view does not exist or is not shared with you.": "Tätä näkymää ei ole tai sitä ei ole jaettu sinulle.", + "\"{task}\" moved to {status}.": "\"{task}\" siirretty tilaan {status}.", + "Project: {title}": "Projekti: {title}", + "Cross-project views": "Projektit ylittävät näkymät", + "New view": "Uusi näkymä", + "Edit view": "Muokkaa näkymää", + "Delete view": "Poista näkymä", + "Give the view a name": "Anna näkymälle nimi", + "Pick at least one project": "Valitse vähintään yksi projekti", + "A view shows at most {max} projects": "Näkymä näyttää enintään {max} projektia", + "Could not save the view. Please try again.": "Näkymää ei voitu tallentaa. Yritä uudelleen.", + "Could not delete the view. Please try again.": "Näkymää ei voitu poistaa. Yritä uudelleen.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Poistetaanko \"{title}\"? Projektit ja niiden tehtävät pysyvät ennallaan.", + "People see the tasks of the projects they are in, never more.": "Kukin näkee vain niiden projektien tehtävät, joissa on mukana.", + "No views yet. A view shows the tasks of several of your projects together.": "Ei vielä näkymiä. Näkymä näyttää useiden projektiesi tehtävät yhdessä.", + "Projects in view: {count}": "Projekteja näkymässä: {count}", + "Notify me when a task is assigned to me": "Ilmoita minulle, kun minulle annetaan tehtävä", + "Also send these to me by email": "Lähetä nämä minulle myös sähköpostilla", + "Add an email address in your Nextcloud personal settings to get mail.": "Lisää sähköpostiosoite Nextcloudin henkilökohtaisiin asetuksiin saadaksesi sähköpostia.", + "Code link": "Koodilinkki", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Koodialustan commit, haara, yhdistämispyyntö tai tiketti, joka liittyy tehtävään.", + "The task the link belongs to": "Tehtävä, johon linkki kuuluu", + "The project of the task": "Tehtävän projekti", + "Task key": "Tehtäväavain", + "The task key the forge text named, such as VC-12": "Tehtäväavain, jonka koodialustan teksti mainitsi, esimerkiksi VC-12", + "What the link points at": "Mihin linkki osoittaa", + "Link": "Linkki", + "The address of the item in the forge": "Kohteen osoite koodialustalla", + "The commit message, branch name or merge request title": "Commit-viesti, haaran nimi tai yhdistämispyynnön otsikko", + "Repository": "Repositorio", + "The repository, such as acme/portal": "Repositorio, esimerkiksi acme/portal", + "Forge id": "Tunniste alustalla", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Kohteen oma tunniste koodialustalla, esimerkiksi github:acme/portal#42 tai commit-tiiviste", + "State": "Tila", + "The state of a merge request or issue": "Yhdistämispyynnön tai tiketin tila", + "Who made the commit or opened the merge request": "Kuka teki commitin tai avasi yhdistämispyynnön", + "When the commit was made or the merge request last changed": "Milloin commit tehtiin tai yhdistämispyyntö viimeksi muuttui", + "Added by": "Lisääjä", + "Whether a person added the link or the integration wrote it": "Lisäsikö linkin henkilö vai kirjoittiko sen integraatio", + "Nextcloud user UIDs of project members": "Projektin jäsenten Nextcloud-käyttäjätunnukset", + "Add link": "Lisää linkki", + "Added by hand": "Lisätty käsin", + "Branch": "Haara", + "Code": "Koodi", + "Commit": "Commit", + "From the integration": "Integraation kautta", + "Link to a commit, branch or merge request": "Linkki commitiin, haaraan tai yhdistämispyyntöön", + "Merge request": "Yhdistämispyyntö", + "Merged": "Yhdistetty", + "No code linked yet. Name {key} in a commit message or paste a link.": "Koodia ei ole vielä linkitetty. Mainitse {key} commit-viestissä tai liitä linkki.", + "No code linked yet. Paste a link to a commit or merge request.": "Koodia ei ole vielä linkitetty. Liitä linkki commitiin tai yhdistämispyyntöön.", + "Paste a web address that starts with https://.": "Liitä verkko-osoite, joka alkaa https://.", + "Remove link {title}": "Poista linkki {title}", + "The link could not be added.": "Linkkiä ei voitu lisätä.", + "The link could not be removed.": "Linkkiä ei voitu poistaa.", + "This link is already on the task.": "Tämä linkki on jo tehtävässä.", + "Code forges": "Koodialustat", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Linkitä GitHubin commitit ja pull requestit tehtäviin. Integriq vastaanottaa tapahtumat; planninq ei koskaan kutsu GitHubia.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Lataa määritys ja tuo se Integriqiin. Täytä sitten salaisuus sääntöön \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Lisää GitHubissa repositorioon webhook tällä osoitteella ja samalla salaisuudella. Valitse sisältötyypiksi application/json sekä tapahtumat push ja pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Mainitse tehtäväavain, esimerkiksi VC-12, commit-viestissä, haaran nimessä tai pull requestin otsikossa. Linkki näkyy silloin kyseisessä tehtävässä.", + "Without Integriq, project members can still paste a link on the task page.": "Ilman Integriqiä projektin jäsenet voivat silti liittää linkin tehtäväsivulle.", + "Download the Integriq configuration": "Lataa Integriq-määritys", + "Calendar": "Kalenteri", + "Previous": "Edellinen", + "Calendar view": "Kalenterinäkymä", + "Starts:": "Alkaa:", + "No tasks with a date in this month.": "Tässä kuussa ei ole päivättyjä tehtäviä.", + "Week of {start} to {end}": "Viikko {start}–{end}", + "My calendar": "Oma kalenteri", + "Show as list": "Näytä luettelona", + "Show as calendar": "Näytä kalenterina", + "Open my calendar": "Avaa oma kalenteri", + "Nextcloud Tasks": "Nextcloud Tehtävät", + "Show my tasks in Nextcloud Tasks": "Näytä tehtäväni Nextcloud Tehtävissä", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Sinulle osoitetut tai kanssasi jaetut tehtävät näkyvät \"Planninq\"-luettelossa Nextcloudin Tehtävissä ja Kalenterissa. Siellä tehdyt muutokset korvataan seuraavalla Planninqin muutoksella.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Tämä palvelin ei voi kirjoittaa Nextcloud Tehtäviin, joten vienti ei ole käytettävissä.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Planninqin hallinnoima. Täällä tehdyt muutokset korvataan seuraavalla Planninqin muutoksella.", + "Working days and holidays": "Työpäivät ja pyhäpäivät", + "Dates set on the timeline skip the days that are not working days.": "Aikajanalle asetetut päivämäärät ohittavat päivät, jotka eivät ole työpäiviä.", + "Working weekdays": "Viikon työpäivät", + "Non-working days": "Vapaapäivät", + "No non-working days yet.": "Ei vielä vapaapäiviä.", + "Add day": "Lisää päivä", + "Year": "Vuosi", + "Add Dutch national holidays": "Lisää Alankomaiden kansalliset pyhäpäivät", + "Save working days": "Tallenna työpäivät", + "Choose at least one working weekday.": "Valitse vähintään yksi työpäivä.", + "Working days saved.": "Työpäivät tallennettu.", + "Could not save the working days.": "Työpäiviä ei voitu tallentaa.", + "New Year's Day": "Uudenvuodenpäivä", + "Easter Sunday": "Pääsiäispäivä", + "Easter Monday": "2. pääsiäispäivä", + "King's Day": "Kuninkaanpäivä", + "Liberation Day": "Vapautuksen päivä", + "Ascension Day": "Helatorstai", + "Whit Sunday": "Helluntaipäivä", + "Whit Monday": "2. helluntaipäivä", + "Christmas Day": "Joulupäivä", + "Boxing Day": "Tapaninpäivä", + "Dates of {title}": "Kohteen {title} päivämäärät", + "The due date cannot be before the start date.": "Määräpäivä ei voi olla ennen aloituspäivää.", + "{title}, from {start} to {end}": "{title}, {start}–{end}", + "The dates could not be saved.": "Päivämääriä ei voitu tallentaa.", + "{title} now runs from {start} to {end}": "{title} kestää nyt {start}–{end}", + "Auto-scheduling": "Automaattinen aikataulutus", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kun tämä on päällä, määräpäivän siirtäminen myöhemmäksi aikajanalla tarjoaa siirtää myös sen estämät tehtävät.", + "Move blocked tasks along when a task slips": "Siirrä estetyt tehtävät, kun tehtävä myöhästyy", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Aikajanalla myöhempi määräpäivä tarjoaa siirtää estetyt tehtävät. Vain \"estää\"-linkit lasketaan, ja tehtävät siirtyvät vain myöhemmäksi.", + "Move the tasks that wait for {title}?": "Siirretäänkö tehtävät, jotka odottavat kohdetta {title}?", + "These tasks wait for it and would start after its new due date:": "Nämä tehtävät odottavat sitä ja alkaisivat uuden määräpäivän jälkeen:", + "{count} tasks would move; the first {limit} are listed.": "{count} tehtävää siirtyisi; ensimmäiset {limit} näytetään.", + "Now": "Nyt", + "After the move": "Siirron jälkeen", + "Only this task": "Vain tämä tehtävä", + "Move all": "Siirrä kaikki", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Pysähtyi kohtaan {title}: päivämääriä ei voitu tallentaa. Sitä edeltävät tehtävät siirrettiin.", + "Cumulative flow": "Kumulatiivinen virtaus", + "Show as chart": "Näytä kaaviona", + "Show as table": "Näytä taulukkona", + "Tasks per column per day": "Tehtävät sarakkeittain päivittäin", + "Tasks without recorded history in this period: {count}": "Tehtävät ilman tallennettua historiaa tällä jaksolla: {count}", + "Lead and cycle time": "Läpimenoaika ja sykliaika", + "No tasks were finished in this period.": "Tällä jaksolla ei valmistunut tehtäviä.", + "Finished tasks": "Valmiit tehtävät", + "Cycle time, average": "Sykliaika, keskiarvo", + "Cycle time, 85th percentile": "Sykliaika, 85. persentiili", + "Lead time, average": "Läpimenoaika, keskiarvo", + "Tasks whose finish time was estimated from their history: {count}": "Tehtävät, joiden valmistumisaika arvioitiin historiasta: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Jokaisen valmiin tehtävän sykliaika, keskiarvo ja 85. persentiili", + "Slowest tasks": "Hitaimmat tehtävät", + "cycle {cycle}, lead {lead}": "sykli {cycle}, läpimeno {lead}", + "{days} days": "{days} päivää", + "Could not load the flow of this project.": "Projektin virtausta ei voitu ladata.", + "Last {days} days": "Viimeiset {days} päivää", + "Portfolio flow": "Salkun virtaus", + "An admin adds portfolios under Projects, Portfolios.": "Ylläpitäjä lisää salkut kohdassa Projektit, Salkut.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projektit, joita ei näytetä, koska kerralla näytetään enintään 50: {count}", + "Could not load the flow of this portfolio.": "Salkun virtausta ei voitu ladata.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulatiivinen virtaus ja sykliaika salkun projekteista.", + "Edit report": "Muokkaa raporttia", + "Only tasks where": "Vain tehtävät, joissa", + "Group by": "Ryhmittele", + "Display": "Näkymä", + "Share with everyone who can read its projects": "Jaa kaikille, jotka voivat lukea sen projekteja", + "The report could not be saved.": "Raporttia ei voitu tallentaa.", + "Number of tasks": "Tehtävien määrä", + "Bar": "Pylväs", + "Donut": "Rengas", + "Table": "Taulukko", + "{hidden} of {total} projects in this report are not visible to you": "{hidden}/{total} raportin projektista ei näy sinulle", + "No tasks match this report.": "Mikään tehtävä ei vastaa raporttia.", + "None": "Ei mitään", + "Could not load this report.": "Raporttia ei voitu ladata.", + "Report": "Raportti", + "Your reports": "Raporttisi", + "My reports": "Omat raportit", + "Shared reports": "Jaetut raportit", + "You have not built a report yet.": "Et ole vielä tehnyt raporttia.", + "Nobody has shared a report with you yet.": "Kukaan ei ole vielä jakanut raporttia kanssasi.", + "Reports you built over tasks, and the ones shared with you.": "Tehtävistä tekemäsi raportit ja kanssasi jaetut raportit.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Tallennettu kysely tehtävistä: mitkä projektit, mitkä suodattimet, millä ryhmitelty, laskettu tai summattu, ja näytetty taulukkona tai kaaviona.", + "The name the report is listed under": "Nimi, jolla raportti näkyy listassa", + "What the report shows and who it is for": "Mitä raportti näyttää ja kenelle se on", + "Nextcloud user id of the person who saved the report": "Raportin tallentaneen henkilön Nextcloud-käyttäjätunnus", + "Who can open the report": "Kuka voi avata raportin", + "Only me": "Vain minä", + "Everyone who can read its projects": "Kaikki, jotka voivat lukea sen projekteja", + "The projects the report covers, at most fifty": "Raportin kattamat projektit, enintään viisikymmentä", + "Filters": "Suodattimet", + "Task fields and the value each must equal": "Tehtäväkentät ja arvo, jota kunkin on vastattava", + "The task field the report groups on": "Tehtäväkenttä, jolla raportti ryhmittelee", + "Count the tasks, or add up a number on them": "Laske tehtävät tai summaa niistä luku", + "Sum": "Summa", + "Sum of": "Summa kentästä", + "The number added up when the measure is a sum": "Summattava luku, kun mittari on summa", + "Story points": "Tarinapisteet", + "Estimated duration": "Arvioitu kesto", + "How the report is shown": "Miten raportti näytetään", + "Issue type": "Tikettityyppi", + "Task fields and the value each must equal; empty when the report covers every task": "Tehtävän kentät ja arvo, joka kunkin on oltava; tyhjä, kun raportti kattaa kaikki tehtävät", + "The status a task must have": "Tila, joka tehtävällä on oltava", + "The priority a task must have": "Prioriteetti, joka tehtävällä on oltava", + "The user a task must be assigned to": "Käyttäjä, jolle tehtävä on oltava osoitettu", + "A label a task must carry": "Tunniste, joka tehtävällä on oltava", + "The board column a task must be in": "Taulun sarake, jossa tehtävän on oltava", + "The issue type a task must have": "Tikettityyppi, joka tehtävällä on oltava", + "Manager groups": "Hallinnoijaryhmät", + "Member groups": "Jäsenryhmät", + "Viewer groups": "Lukijaryhmät", + "Viewers": "Lukijat", + "Owning group": "Omistajaryhmä", + "Nextcloud groups whose members manage the project": "Nextcloud-ryhmät, joiden jäsenet hallinnoivat projektia", + "Nextcloud groups whose members work on the project": "Nextcloud-ryhmät, joiden jäsenet työskentelevät projektissa", + "Nextcloud groups whose members may read the project": "Nextcloud-ryhmät, joiden jäsenet voivat lukea projektia", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-käyttäjät, jotka hallinnoivat projektia: asetukset, jäsenet ja työ", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-käyttäjät, jotka voivat lukea projektia ja sen työtä mutta eivät muuttaa sitä", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud-ryhmä, joka omistaa projektin sen luojan kanssa, enintään yksi", + "Nextcloud user ids who may read this through the project": "Nextcloud-käyttäjät, jotka voivat lukea tämän projektin kautta", + "Nextcloud groups whose members may change this through the project": "Nextcloud-ryhmät, joiden jäsenet voivat muuttaa tätä projektin kautta", + "Nextcloud groups whose members may read this through the project": "Nextcloud-ryhmät, joiden jäsenet voivat lukea tämän projektin kautta", + "Search for a person or a group…": "Hae henkilöä tai ryhmää…", + "No one found. Your admin's sharing settings decide who you can find.": "Ketään ei löytynyt. Ylläpitäjän jakoasetukset määräävät, keitä voit löytää.", + "Type at least two characters": "Kirjoita vähintään kaksi merkkiä", + "Everyone in this group": "Kaikki tässä ryhmässä", + "Could not search for people. Please try again.": "Henkilöiden haku epäonnistui. Yritä uudelleen.", + "Could not remove the group": "Ryhmää ei voitu poistaa", + "Only the owner and managers change who is on this project.": "Vain omistaja ja hallinnoijat muuttavat, keitä projektissa on.", + "Role of {name}": "Käyttäjän {name} rooli", + "Manager": "Hallinnoija", + "Member": "Jäsen", + "Viewer": "Lukija", + "Could not change the role": "Roolia ei voitu muuttaa", + "Owned by group: {name}": "Ryhmän omistama: {name}", + "No group owns this project.": "Mikään ryhmä ei omista tätä projektia.", + "Owned by group": "Ryhmän omistama", + "Search for a group…": "Etsi ryhmää…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ryhmää ei löytynyt. Ylläpitäjäsi jakoasetukset määräävät, mitkä ryhmät voit löytää.", + "No owning group": "Ei omistajaryhmää", + "Could not search for groups. Please try again.": "Ryhmien haku epäonnistui. Yritä uudelleen.", + "Could not change the owning group": "Omistajaryhmää ei voitu muuttaa", + "You can read this project. Only its members change it.": "Voit lukea tätä projektia. Vain sen jäsenet muuttavat sitä.", + "Course": "Kurssi", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurssi, jota tällä tunnilla opetetaan, esimerkiksi valinnainen kurssi, kun koulun oppimissovellus tuntee sen.", + "Online meeting link": "Verkkotunnin linkki", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Mistä oppilaat liittyvät tälle tunnille verkossa. Liity-painike näkyy vain https-linkille." }, "plurals": null } diff --git a/l10n/fr.js b/l10n/fr.js index fa72874a..469bd346 100644 --- a/l10n/fr.js +++ b/l10n/fr.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Impossible de supprimer l'étiquette", "Delete label \"{title}\"? It will be removed from {count} task.": "Supprimer l'étiquette « {title} » ? Elle sera retirée de {count} tâche.", "Label deleted and removed from {count} task": "Étiquette supprimée et retirée de {count} tâche", - "used by {count} task": "utilisée par {count} tâche" + "used by {count} task": "utilisée par {count} tâche", + "Active projects": "Projets actifs", + "Archived projects": "Projets archivés", + "Boards": "Tableaux", + "My projects": "Mes projets", + "Portfolio": "Portefeuille", + "Project board": "Tableau du projet", + "Projects I am in": "Projets auxquels je participe", + "Timeline": "Chronologie", + "Timesheet": "Feuille de temps", + "Features & roadmap": "Fonctionnalités et feuille de route", + "Flow": "Flux", + "Flows": "Flux", + "Reports": "Rapports", + "Pick a report to open it.": "Choisissez un rapport pour l'ouvrir.", + "In progress": "En cours", + "Date": "Date", + "Due": "Échéance", + "Assignee": "Assigné à", + "Who": "Qui", + "What": "Quoi", + "Minutes": "Minutes", + "Entries": "Entrées", + "Most recent": "Les plus récents", + "Per person": "Par personne", + "By status": "Par statut", + "By priority": "Par priorité", + "Task status": "Statut des tâches", + "Time spent": "Temps passé", + "Capacity": "Capacité", + "Due soonest": "Échéance la plus proche", + "Minutes logged": "Minutes enregistrées", + "Nothing is due": "Rien n'est à échéance", + "Nothing logged yet": "Rien d'enregistré pour l'instant", + "What is open, what is blocked, and what is overdue.": "Ce qui est ouvert, bloqué et en retard.", + "How allocation is spread across the people working on projects.": "Comment la charge se répartit entre les personnes travaillant sur les projets.", + "Hours logged, and the projects they went to.": "Les heures enregistrées et les projets auxquels elles sont allées.", + "Billable": "Facturable", + "Budget: {amount}": "Budget : {amount}", + "Loading projects": "Chargement des projets", + "No projects for this client yet": "Aucun projet pour ce client pour l'instant", + "Open in Planninq": "Ouvrir dans Planninq", + "This project could not be found": "Ce projet est introuvable", + "Untitled project": "Projet sans titre", + "and {count} more": "et {count} de plus", + "Store": "Boutique", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installez des registres, schémas et flux publiés par d'autres organisations.", + "Work Date": "Date de travail", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Actions de la colonne", + "Columns": "Colonnes", + "Could not remove the column. Please try again.": "Impossible de supprimer la colonne. Veuillez réessayer.", + "Could not save the column. Please try again.": "Impossible d'enregistrer la colonne. Veuillez réessayer.", + "Done column": "Colonne terminée", + "Edit column": "Modifier la colonne", + "Keep the card's status": "Conserver le statut de la carte", + "Move its cards to": "Déplacer ses cartes vers", + "Move left": "Déplacer à gauche", + "Move right": "Déplacer à droite", + "Status of cards moved here": "Statut des cartes déplacées ici", + "The last done column cannot be removed.": "La dernière colonne terminée ne peut pas être supprimée.", + "WIP limit": "Limite WIP", + "over limit": "au-dessus de la limite", + "The status a card gets when it is moved into this column.": "Le statut qu'une carte reçoit lorsqu'elle est déplacée dans cette colonne.", + "All priorities": "Toutes les priorités", + "Could not create the task. Please try again.": "Impossible de créer la tâche. Veuillez réessayer.", + "Created": "Créée", + "Move to backlog": "Vers le backlog", + "Move to board": "Vers le tableau", + "New task": "Nouvelle tâche", + "Nothing in the backlog": "Rien dans le backlog", + "Rank": "Rang", + "Sort by": "Trier par", + "Sort by rank to reorder": "Triez par rang pour réordonner", + "Task actions": "Actions de la tâche", + "All labels": "Toutes les étiquettes", + "Filter tasks by label": "Filtrer les tâches par étiquette", + "View timeline": "Voir la chronologie", + "Board": "Tableau", + "List": "Liste", + "Column": "Colonne", + "Board or list": "Tableau ou liste", + "Log": "Journal", + "Add entry": "Ajouter une entrée", + "Show": "Afficher", + "No actions yet": "Aucune action pour l'instant", + "Closed": "Fermé", + "Entry actions": "Actions de l'entrée", + "Add action": "Ajouter une action", + "by {author}": "par {author}", + "saved {time}": "enregistré {time}", + "Attendees: {names}": "Participants : {names}", + "Add the first entry": "Ajouter la première entrée", + "Issues": "Problèmes", + "Lessons learned": "Enseignements", + "Meetings": "Réunions", + "Decisions": "Décisions", + "Actions": "Actions", + "Issue": "Problème", + "Lesson learned": "Enseignement", + "Meeting": "Réunion", + "Decision": "Décision", + "About this project": "À propos de ce projet", + "No description yet": "Pas encore de description", + "Start date": "Date de début", + "Not set": "Non défini", + "End date": "Date de fin", + "Progress": "Avancement", + "No tasks yet": "Pas encore de tâches", + "Open the board": "Ouvrir le tableau", + "People": "Personnes", + "Owner": "Propriétaire", + "Latest log entries": "Dernières entrées", + "Open the log": "Ouvrir le journal", + "{done} of {total} tasks done": "{done} tâches terminées sur {total}", + "Edit entry": "Modifier l'entrée", + "Type": "Type", + "Attendees": "Participants", + "Issue is closed": "Le problème est fermé", + "Could not save the entry. Please try again.": "Impossible d'enregistrer l'entrée. Veuillez réessayer.", + "From: {title}": "Issu de : {title}", + "What needs to happen": "Ce qui doit être fait", + "Could not create the action. Please try again.": "Impossible de créer l'action. Veuillez réessayer.", + "The action was created but could not be linked to the entry.": "L'action a été créée mais n'a pas pu être liée à l'entrée.", + "Project pages": "Pages du projet", + "Overview": "Vue d'ensemble", + "Risks": "Risques", + "Log entry": "Entrée de journal", + "A short name for the entry": "Un nom court pour l'entrée", + "Project": "Projet", + "The project this entry belongs to": "Le projet auquel appartient cette entrée", + "What kind of entry this is": "Le type d'entrée", + "When it happened": "Quand cela s'est produit", + "What happened, in Markdown": "Ce qui s'est passé, en Markdown", + "Whether an issue is still open": "Si un problème est encore ouvert", + "The people at a meeting": "Les personnes présentes à une réunion", + "Tasks that came out of this entry": "Les tâches issues de cette entrée", + "Add risk": "Ajouter un risque", + "Risk": "Risque", + "Score": "Score", + "Response": "Réponse", + "Review date": "Date de révision", + "no longer on the project": "ne fait plus partie du projet", + "Edit {title}": "Modifier {title}", + "No risks recorded yet": "Aucun risque consigné pour l'instant", + "Add the first risk": "Ajouter le premier risque", + "Medium": "Moyen", + "Mitigating": "En atténuation", + "Occurred": "Survenu", + "Avoid": "Éviter", + "Reduce": "Réduire", + "Transfer": "Transférer", + "Accept": "Accepter", + "Highest open risks": "Risques ouverts les plus élevés", + "No open risks": "Aucun risque ouvert", + "Open the risk register": "Ouvrir le registre des risques", + "Edit risk": "Modifier le risque", + "What could go wrong": "Ce qui pourrait mal tourner", + "Likelihood": "Probabilité", + "Impact": "Impact", + "Score {score}": "Score {score}", + "Countermeasures": "Contre-mesures", + "Could not save the risk. Please try again.": "Impossible d'enregistrer le risque. Veuillez réessayer.", + "Risks by likelihood and impact": "Risques par probabilité et impact", + "Risk scale": "Échelle de risque", + "The levels every project scores its risks on, and where low turns into medium and high": "Les niveaux sur lesquels chaque projet évalue ses risques, et où faible devient moyen puis élevé", + "Number of levels": "Nombre de niveaux", + "Likelihood labels": "Libellés de probabilité", + "Impact labels": "Libellés d'impact", + "Level {level}": "Niveau {level}", + "Medium from score": "Moyen à partir du score", + "High from score": "Élevé à partir du score", + "Risk scale saved": "Échelle de risque enregistrée", + "1 risk uses level {level}. Change it first.": "1 risque utilise le niveau {level}. Modifiez-le d'abord.", + "{count} risks use level {level}. Change them first.": "{count} risques utilisent le niveau {level}. Modifiez-les d'abord.", + "Every level needs a label, and high must start above medium.": "Chaque niveau a besoin d'un libellé, et élevé doit commencer au-dessus de moyen.", + "The project this risk belongs to": "Le projet auquel appartient ce risque", + "The cause and the effect, in Markdown": "La cause et l'effet, en Markdown", + "Category": "Catégorie", + "A free grouping, such as planning, budget or supplier": "Un regroupement libre, comme planning, budget ou fournisseur", + "How likely it is, on the admin's risk scale": "Sa probabilité, sur l'échelle de risque de l'administrateur", + "How hard it would hit, on the admin's risk scale": "La gravité de son impact, sur l'échelle de risque de l'administrateur", + "Likelihood times impact, calculated by the server": "Probabilité multipliée par l'impact, calculée par le serveur", + "Where the risk stands": "Où en est le risque", + "The person who watches this risk": "La personne qui surveille ce risque", + "How the project answers the risk": "Comment le projet répond au risque", + "What is done to prevent it or soften it, in Markdown": "Ce qui est fait pour l'éviter ou l'atténuer, en Markdown", + "When to look at this risk again": "Quand réexaminer ce risque", + "Very low": "Très faible", + "Very high": "Très élevé", + "All projects": "Tous les projets", + "Project status report": "Rapport d'état du projet", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Un rapport daté sur la situation d'un projet en matière d'argent, d'organisation, de temps, d'information, de qualité et de risque (les aspects GROTIK), chacun avec une note.", + "The project this report is about": "Le projet concerné par ce rapport", + "Report date": "Date du rapport", + "The day the report describes": "Le jour que décrit le rapport", + "Money": "Argent", + "How the project stands on this aspect": "La situation du projet pour cet aspect", + "On track": "Dans les temps", + "At risk": "À risque", + "Off track": "Hors trajectoire", + "Money note": "Note sur l'argent", + "A short explanation of this status": "Une courte explication de cet état", + "Organisation": "Organisation", + "Organisation note": "Note sur l'organisation", + "Time": "Temps", + "Time note": "Note sur le temps", + "Information": "Information", + "Information note": "Note sur l'information", + "Quality": "Qualité", + "Quality note": "Note sur la qualité", + "Risk note": "Note sur le risque", + "Overall": "Global", + "The worst of the six statuses, calculated by the server": "Le pire des six états, calculé par le serveur", + "Health: money": "Santé : argent", + "Copied from the newest status report": "Copié du rapport d'état le plus récent", + "Health: organisation": "Santé : organisation", + "Health: time": "Santé : temps", + "Health: information": "Santé : information", + "Health: quality": "Santé : qualité", + "Health: risk": "Santé : risque", + "Health: overall": "Santé : global", + "Health: report date": "Santé : date du rapport", + "The date of the newest status report": "La date du rapport d'état le plus récent", + "New report": "Nouveau rapport", + "Only the project owner writes status reports.": "Seul le propriétaire du projet rédige les rapports d'état.", + "Latest report, {date}": "Dernier rapport, {date}", + "Aspect": "Aspect", + "Note": "Note", + "Report history": "Historique des rapports", + "Author": "Auteur", + "No status reports yet": "Aucun rapport d'état pour l'instant", + "Write the first report": "Rédiger le premier rapport", + "Choose a status for every aspect to save the report.": "Choisissez un état pour chaque aspect pour enregistrer le rapport.", + "Suggested: on track.": "Suggestion : dans les temps.", + "Suggested: at risk.": "Suggestion : à risque.", + "Suggested: off track.": "Suggestion : hors trajectoire.", + "1 task is past its due date.": "1 tâche a dépassé son échéance.", + "{count} tasks are past their due date.": "{count} tâches ont dépassé leur échéance.", + "The end date has passed with 1 open task.": "La date de fin est passée avec 1 tâche ouverte.", + "The end date has passed with {count} open tasks.": "La date de fin est passée avec {count} tâches ouvertes.", + "No open task is past its due date.": "Aucune tâche ouverte n'a dépassé son échéance.", + "The highest open risk, \"{title}\", scores {score}.": "Le risque ouvert le plus élevé, « {title} », obtient {score}.", + "There are no open risks.": "Il n'y a aucun risque ouvert.", + "Costs are at {percent}% of the budget.": "Les coûts atteignent {percent}% du budget.", + "No suggestion: the project has no budget.": "Pas de suggestion : le projet n'a pas de budget.", + "No suggestion: no costs are recorded for this project yet.": "Pas de suggestion : aucun coût n'est encore enregistré pour ce projet.", + "The report was not saved. Only the project owner can write status reports.": "Le rapport n'a pas été enregistré. Seul le propriétaire du projet peut rédiger des rapports d'état.", + "No report": "Aucun rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Un groupe de projets menés par les mêmes personnes, comme un service ou un programme. Ses responsables lisent chaque projet qu'il contient.", + "The name of the portfolio": "Le nom du portefeuille", + "What the portfolio holds and who runs it": "Ce que contient le portefeuille et qui le pilote", + "A colour for the portfolio's section in project lists": "Une couleur pour la section du portefeuille dans les listes de projets", + "Managers": "Responsables", + "Nextcloud user UIDs of the people who run the portfolio": "Identifiants Nextcloud des personnes qui pilotent le portefeuille", + "Order": "Ordre", + "Where the portfolio comes in project lists, lowest first": "La place du portefeuille dans les listes de projets, du plus bas au plus haut", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "L'échelle de risque propre à ce portefeuille, en JSON, de même forme que celle de l'application. Vide signifie l'échelle de l'application.", + "Portfolio readers": "Lecteurs du portefeuille", + "Nextcloud user UIDs of the managers of the project's portfolio": "Identifiants Nextcloud des responsables du portefeuille du projet", + "The portfolio this project belongs to": "Le portefeuille auquel appartient ce projet", + "No portfolio": "Aucun portefeuille", + "All portfolios": "Tous les portefeuilles", + "You read this project as a manager of its portfolio. Only its members change it.": "Vous lisez ce projet en tant que responsable de son portefeuille. Seuls ses membres le modifient.", + "Portfolios": "Portefeuilles", + "Portfolio status": "Statut du portefeuille", + "No portfolios yet": "Aucun portefeuille pour l'instant", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Un administrateur ajoute des portefeuilles sous Projets, Portefeuilles. Les projets d'un portefeuille figurent ici avec leur statut.", + "Roll-up": "Synthèse", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} dans les temps, {atRisk} à risque, {offTrack} hors trajectoire, {noReport} sans rapport", + "No project in this portfolio that you can read.": "Aucun projet de ce portefeuille que vous pouvez lire.", + "Start": "Début", + "End": "Fin", + "Budget": "Budget", + "Last report": "Dernier rapport", + "Out of date": "Périmé", + "Portfolio timeline": "Chronologie du portefeuille", + "Zoom": "Zoom", + "Could not load the timeline": "Impossible de charger la chronologie", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Un administrateur ajoute des portefeuilles sous Projets, Portefeuilles. Les projets d'un portefeuille figurent ici sur une seule chronologie.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Ouvrez un projet pour voir ses phases et ses tâches. La chronologie est en lecture seule.", + "Phase: {title}": "Phase : {title}", + "Left out because you cannot read them: {count} projects": "Omis car vous ne pouvez pas les lire : {count} projets", + "Week": "Semaine", + "Day": "Jour", + "Month": "Mois", + "Please try again later.": "Veuillez réessayer plus tard.", + "Status reports": "Rapports d'état", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Après combien de jours le dernier rapport d'état d'un projet est marqué comme périmé dans la vue du portefeuille", + "Reporting period (days)": "Période de rapport (jours)", + "The reporting period is a whole number of days from 1 to 365.": "La période de rapport est un nombre entier de jours de 1 à 365.", + "Reporting period saved": "Période de rapport enregistrée", + "The reporting period was not saved. Please try again.": "La période de rapport n'a pas été enregistrée. Veuillez réessayer.", + "Every project of a portfolio with its status per aspect, rolled up.": "Chaque projet d'un portefeuille avec son statut par aspect, synthétisé.", + "The projects of a portfolio on one timeline.": "Les projets d'un portefeuille sur une seule chronologie.", + "Phases": "Phases", + "Add phase": "Ajouter une phase", + "No phases yet": "Aucune phase pour l'instant", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Découpez le projet en phases, comme l'initiation, la définition et la réalisation. Une phase se clôt dès que son document de clôture est téléversé.", + "{hours} hours": "{hours} heures", + "Concluding document: {title}": "Document de clôture : {title}", + "Concluding document missing": "Document de clôture manquant", + "Move {title} up": "Monter {title}", + "Move {title} down": "Descendre {title}", + "Close phase": "Clore la phase", + "Phase": "Phase", + "Files": "Fichiers", + "Notes": "Notes", + "Audit trail": "Piste d'audit", + "Edit phase": "Modifier la phase", + "Name": "Nom", + "Budget hours": "Heures budgétées", + "Could not save the phase. Please try again.": "Impossible d'enregistrer la phase. Veuillez réessayer.", + "Close phase {title}": "Clore la phase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Une phase se clôt avec son document de clôture : téléversez-le ici ou choisissez un des fichiers de la phase.", + "Concluding document": "Document de clôture", + "This phase has no files yet.": "Cette phase n'a pas encore de fichiers.", + "Upload a document": "Téléverser un document", + "The document was not uploaded. Please try again.": "Le document n'a pas été téléversé. Veuillez réessayer.", + "Upload the concluding document before you close this phase.": "Téléversez le document de clôture avant de clore cette phase.", + "This phase cannot be closed from its current status.": "Cette phase ne peut pas être close depuis son statut actuel.", + "The phase was not closed. Please try again.": "La phase n'a pas été close. Veuillez réessayer.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "L'identifiant du fichier de cette phase qui la clôt. La phase ne peut être terminée qu'une fois celui-ci renseigné et le fichier joint.", + "Import from Microsoft Project": "Importer depuis Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Choisissez un planning enregistré depuis Microsoft Project au format XML. Rien n'est importé avant votre confirmation.", + "Plan file": "Fichier de planning", + "What the import creates": "Ce que l'import crée", + "Tasks": "Tâches", + "Sub-tasks": "Sous-tâches", + "Milestones": "Jalons", + "Links": "Liens", + "Already imported, updated in place: {count}": "Déjà importés, mis à jour sur place : {count}", + "What does not carry over": "Ce qui n'est pas repris", + "Tasks with resources, which are not imported: {count}": "Tâches avec des ressources, qui ne sont pas importées : {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tâches au-delà du niveau 3, placées sous leur tâche de niveau 2 : {count}", + "Links other than finish-to-start, imported as related links: {count}": "Liens autres que fin-début, importés comme liens associés : {count}", + "Link lags, which are dropped: {count}": "Décalages de liens, qui sont abandonnés : {count}", + "Links to a summary task, which are not imported: {count}": "Liens vers une tâche récapitulative, qui ne sont pas importés : {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Liens vers des tâches hors de ce planning, qui ne sont pas importés : {count}", + "No longer in the plan": "Plus dans le planning", + "These stay in the project; remove them yourself if they are no longer needed.": "Ils restent dans le projet ; supprimez-les vous-même s'ils ne sont plus nécessaires.", + "Import": "Importer", + "Close": "Fermer", + "The plan is imported: {created} created, {updated} updated.": "Le planning est importé : {created} créés, {updated} mis à jour.", + "Links that would close a loop were left out: {count}": "Les liens qui fermeraient une boucle ont été omis : {count}", + "The import stopped part-way. Run it again to finish it.": "L'import s'est arrêté en cours de route. Relancez-le pour le terminer.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Enregistrez le planning dans Microsoft Project via Fichier, Enregistrer sous, format XML, puis importez ce fichier.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ce fichier déclare un DOCTYPE ou des entités, qui ne sont pas acceptés.", + "The file is larger than 10 MB.": "Le fichier dépasse 10 Mo.", + "The plan has more than 2,000 tasks, more than one import takes.": "Le planning compte plus de 2 000 tâches, plus qu'un import n'en accepte.", + "This file is not a Microsoft Project plan in XML format.": "Ce fichier n'est pas un planning Microsoft Project au format XML.", + "Choose a file to import.": "Choisissez un fichier à importer.", + "Only the project owner can import a plan.": "Seul le propriétaire du projet peut importer un planning.", + "The plan could not be read. Please try again.": "Le planning n'a pas pu être lu. Veuillez réessayer.", + "Linked case: {title}": "Dossier lié : {title}", + "Linked to a case": "Lié à un dossier", + "Hand over to case": "Transmettre au dossier", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copie sans modification chaque fichier du projet et de ses tâches, ainsi qu'un fichier décrivant le projet, vers le dossier lié.", + "{date} by {user}": "{date} par {user}", + "Files copied: {count}": "Fichiers copiés : {count}", + "Files that failed: {names}": "Fichiers en échec : {names}", + "The handover failed. Please try again.": "La transmission a échoué. Veuillez réessayer.", + "The linked case could not be found, or you cannot open it.": "Le dossier lié est introuvable, ou vous ne pouvez pas l'ouvrir.", + "Case handovers": "Transmissions au dossier", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Chaque transmission des fichiers et métadonnées du projet à son dossier : quand, par qui, à quel dossier, chaque fichier copié avec son SHA-256, et les fichiers en échec.", + "Finance": "Finances", + "Add cost line": "Ajouter une ligne de coût", + "Delivery terms": "Conditions de livraison", + "Billing model": "Mode de facturation", + "Budget in euro": "Budget en euros", + "Budget in hours": "Budget en heures", + "Hourly rate in euro": "Taux horaire en euros", + "Planned start": "Début prévu", + "Planned end": "Fin prévue", + "Planned dates": "Dates prévues", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Aucun budget convenu", + "Hours": "Heures", + "Only the project owner and the portfolio managers see the amounts.": "Seuls le propriétaire du projet et les gestionnaires du portefeuille voient les montants.", + "Budget against cost per category": "Budget face aux coûts par catégorie", + "Labour (booked time)": "Main-d'œuvre (temps saisi)", + "No category": "Aucune catégorie", + "Hours are not available": "Les heures ne sont pas disponibles", + "Not yet assigned to a category": "Pas encore affecté à une catégorie", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} dépensés, {remaining} restants", + "Budget against cost per phase": "Budget face aux coûts par phase", + "No phase": "Aucune phase", + "Cost lines": "Lignes de coût", + "From the finance system": "Du système financier", + "Edit cost line {amount}": "Modifier la ligne de coût {amount}", + "No cost lines yet": "Aucune ligne de coût pour l'instant", + "Commitments": "Engagements", + "Actual cost": "Coût réel", + "Forecast": "Prévision", + "Remaining": "Restant", + "Not planned yet": "Pas encore planifié", + "{start} to {end}": "{start} au {end}", + "The terms were not saved. Please try again.": "Les conditions n'ont pas été enregistrées. Veuillez réessayer.", + "Terms saved": "Conditions enregistrées", + "Fixed price": "Prix forfaitaire", + "Hourly": "À l'heure", + "Not billed": "Non facturé", + "Commitment": "Engagement", + "Edit cost line": "Modifier la ligne de coût", + "Kind": "Type", + "Amount in euro": "Montant en euros", + "Remove": "Supprimer", + "Could not save the cost line. Only the project owner changes the money of a project.": "Impossible d'enregistrer la ligne de coût. Seul le propriétaire du projet modifie l'argent d'un projet.", + "Could not remove the cost line. Please try again.": "Impossible de supprimer la ligne de coût. Veuillez réessayer.", + "{amount} over budget": "{amount} au-delà du budget", + "Cost categories": "Catégories de coûts", + "The categories every project splits its budget and costs into, one per line": "Les catégories dans lesquelles chaque projet répartit son budget et ses coûts, une par ligne", + "Categories": "Catégories", + "Give at least one category, each name once.": "Indiquez au moins une catégorie, chaque nom une seule fois.", + "Cost categories saved": "Catégories de coûts enregistrées", + "The cost categories were not saved. Please try again.": "Les catégories de coûts n'ont pas été enregistrées. Veuillez réessayer.", + "Finance line": "Ligne financière", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Un montant d'un projet : un budget, un engagement, un coût réel ou une prévision, dans une catégorie de coûts et éventuellement une phase. Saisi par le propriétaire du projet, ou par le système financier via l'application d'intégration.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Le projet auquel ce montant appartient. Vide pour une ligne du système financier dont le numéro de projet ne correspond à aucun projet.", + "The phase this amount belongs to, if any": "La phase à laquelle ce montant appartient, le cas échéant", + "The cost category, one of the categories the admin set up": "La catégorie de coûts, l'une des catégories définies par l'administrateur", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Si le montant est un budget, un engagement, un coût réel ou une prévision", + "Amount": "Montant", + "The amount in the reporting currency (euro)": "Le montant dans la devise de rapport (euro)", + "The date the amount was booked or is expected": "La date à laquelle le montant a été comptabilisé ou est attendu", + "What the amount is for": "L'objet du montant", + "Whether a person entered the line or the finance system sent it": "Si une personne a saisi la ligne ou si le système financier l'a envoyée", + "Entered by hand": "Saisi à la main", + "Finance line id": "Identifiant de la ligne financière", + "The finance system's own id of this line. One imported line per id.": "L'identifiant propre de cette ligne dans le système financier. Une ligne importée par identifiant.", + "Project number": "Numéro de projet", + "The project number the finance system sent, matched against the project key": "Le numéro de projet envoyé par le système financier, comparé à la clé du projet", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Le portefeuille du projet de la ligne, copié du projet pour que les totaux du portefeuille n'aient besoin que d'un filtre", + "Finance readers": "Lecteurs financiers", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID Nextcloud des personnes autorisées à voir ce montant : le propriétaire du projet et les gestionnaires de son portefeuille", + "Project owner": "Propriétaire du projet", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID Nextcloud du propriétaire du projet, qui peut modifier et supprimer les lignes saisies à la main", + "How the client pays: not billed, a fixed price, or by the hour.": "Comment le client paie : non facturé, prix forfaitaire ou à l'heure.", + "Portfolio finance": "Finances du portefeuille", + "You cannot see the money of any project in this portfolio": "Vous ne pouvez voir l'argent d'aucun projet de ce portefeuille", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Le serveur a renvoyé des lignes de coût de projets hors de ce portefeuille, ces totaux peuvent donc être faux.", + "Projects left out because you cannot see their money: {count}": "Projets écartés car vous ne pouvez pas voir leur argent : {count}", + "Unmatched finance lines": "Lignes financières non rattachées", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, engagements, coût réel et prévision totalisés sur un portefeuille.", + "Subprojects": "Sous-projets", + "{done} of {total}": "{done} sur {total}", + "{done} of {total} tasks done, including subprojects": "{done} tâches terminées sur {total}, sous-projets compris", + "Show the subprojects of {title}": "Afficher les sous-projets de {title}", + "Hide the subprojects of {title}": "Masquer les sous-projets de {title}", + "Part of": "Fait partie de", + "No parent project": "Aucun projet parent", + "A project cannot sit under one of its own subprojects.": "Un projet ne peut pas se placer sous l'un de ses propres sous-projets.", + "Projects nest three levels deep at most: programme, project and subproject.": "Les projets s'imbriquent sur trois niveaux au plus : programme, projet et sous-projet.", + "Parent project": "Projet parent", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Le projet sous lequel se place ce projet, par exemple un programme. Les projets s'imbriquent sur trois niveaux au plus.", + "Yes": "Oui", + "No": "Non", + "{label} (required)": "{label} (obligatoire)", + "{label} is required": "{label} est obligatoire", + "Project field": "Champ de projet", + "A field an admin adds to every project, such as a policy area or a contract value.": "Un champ qu'un administrateur ajoute à chaque projet, comme un domaine d'action ou une valeur de contrat.", + "Key": "Clé", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Le nom fixe sous lequel la valeur est enregistrée, en lower camel case. Gardez-le dès que des projets l'utilisent.", + "Label": "Libellé", + "The name people see next to the field": "Le nom que les personnes voient à côté du champ", + "What the field holds": "Ce que contient le champ", + "Text": "Texte", + "Number": "Nombre", + "Choice": "Choix", + "Person": "Personne", + "Yes or no": "Oui ou non", + "Options": "Options", + "The choices of a choice field": "Les choix d'un champ à choix", + "Required": "Obligatoire", + "Whether a project must fill in the field": "Si un projet doit remplir le champ", + "Where the field appears, lowest first": "Où le champ apparaît, le plus bas d'abord", + "Applies to": "S'applique à", + "What the field is added to": "Ce à quoi le champ est ajouté", + "Custom fields": "Champs personnalisés", + "The values of the project fields an admin defined, keyed by the field's key.": "Les valeurs des champs de projet définis par un administrateur, selon la clé du champ.", + "Project fields": "Champs de projet", + "Related": "Liés", + "Remove link": "Retirer le lien", + "Link type": "Type de lien", + "Relates to": "Lié à", + "Duplicates": "Duplique", + "Project key": "Clé du projet", + "Every task number starts with it, such as VERG-42.": "Chaque numéro de tâche commence par elle, par exemple VERG-42.", + "This key is already used by another project.": "Cette clé est déjà utilisée par un autre projet.", + "Use 2 to 10 letters and digits, starting with a letter.": "Utilisez 2 à 10 lettres et chiffres, en commençant par une lettre.", + "The key cannot change once tasks carry it.": "La clé ne peut plus changer une fois que des tâches la portent.", + "Project saved. The existing tasks get their numbers in the background.": "Projet enregistré. Les tâches existantes reçoivent leur numéro en arrière-plan.", + "Next task number": "Numéro de la prochaine tâche", + "The number the next task of this project gets in its key. Only the system writes it.": "Le numéro que la prochaine tâche de ce projet reçoit dans sa clé. Seul le système l’écrit.", + "Restore {title}": "Restaurer {title}", + "Restore": "Restaurer", + "Project restored": "Projet restauré", + "Could not restore the project": "Impossible de restaurer le projet", + "Bring this project back to the active list.": "Remettre ce projet dans la liste des projets actifs.", + "Restore project": "Restaurer le projet", + "Request reason": "Motif de la demande", + "Why the requester needs this project. Filled in when the project is requested.": "Pourquoi le demandeur a besoin de ce projet. Renseigné lors de la demande.", + "Reviewed by": "Examiné par", + "The user who approved or rejected the request.": "L’utilisateur qui a approuvé ou refusé la demande.", + "Reviewed at": "Examiné le", + "When the request was approved or rejected.": "Quand la demande a été approuvée ou refusée.", + "Review note": "Note d’examen", + "The reviewer's reason, shown to the requester when a request is not approved.": "La raison de l’examinateur, affichée au demandeur quand une demande n’est pas approuvée.", + "Members of these groups": "Membres de ces groupes", + "Groups that may create projects": "Groupes autorisés à créer des projets", + "The group {group} no longer exists. Save to remove it.": "Le groupe {group} n’existe plus. Enregistrez pour le retirer.", + "Review project request": "Examiner la demande de projet", + "Requested by": "Demandé par", + "Why it is needed": "Pourquoi il est nécessaire", + "Desired start date": "Date de début souhaitée", + "Why is it not approved?": "Pourquoi n’est-il pas approuvé ?", + "Give a reason. The requester sees it.": "Indiquez une raison. Le demandeur la verra.", + "Approve": "Approuver", + "Reject": "Refuser", + "Reject request": "Refuser la demande", + "The review was not saved. Try again.": "L’examen n’a pas été enregistré. Réessayez.", + "This project is waiting for review": "Ce projet attend un examen", + "This request was not approved": "Cette demande n’a pas été approuvée", + "Reason: {note}": "Raison : {note}", + "Review request": "Examiner la demande", + "Request a project": "Demander un projet", + "Step {step} of 2": "Étape {step} sur 2", + "Why is this project needed?": "Pourquoi ce projet est-il nécessaire ?", + "Give a reason. The reviewer reads it.": "Indiquez une raison. L’examinateur la lira.", + "Back": "Retour", + "Next": "Suivant", + "Send request": "Envoyer la demande", + "The request was not sent. Try again.": "La demande n’a pas été envoyée. Réessayez.", + "Requested": "Demandé", + "Not approved": "Non approuvé", + "Your request was sent": "Votre demande a été envoyée", + "Let everyone else request a project": "Permettre à tous les autres de demander un projet", + "Add a task": "Ajouter une tâche", + "Delete task": "Supprimer la tâche", + "Edit task": "Modifier la tâche", + "Write": "Écrire", + "Preview": "Aperçu", + "Markdown works here: headings, lists and links.": "Le Markdown fonctionne ici : titres, listes et liens.", + "Could not save the task. Please try again.": "Impossible d'enregistrer la tâche. Veuillez réessayer.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Du temps a été saisi sur \"{title}\", elle ne peut donc pas être supprimée. Vous pouvez l'annuler à la place : les saisies de temps sont conservées.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Supprimer \"{title}\" ? Ses liens vers d'autres tâches sont aussi supprimés. Cette action est irréversible.", + "Keep task": "Garder la tâche", + "Cancel task": "Annuler la tâche", + "Only the reporter, the project owner or an admin can delete this task.": "Seul le rapporteur, le propriétaire du projet ou un administrateur peut supprimer cette tâche.", + "Could not delete the task. Please try again.": "Impossible de supprimer la tâche. Veuillez réessayer.", + "Could not cancel the task. Please try again.": "Impossible d'annuler la tâche. Veuillez réessayer.", + "Responsible": "Responsable", + "Also working on this": "Travaille aussi dessus", + "Labels": "Étiquettes", + "Could not change the priority. Please try again.": "Impossible de modifier la priorité. Veuillez réessayer.", + "Other project members who work on this task alongside the person responsible.": "Autres membres du projet qui travaillent sur cette tâche avec la personne responsable.", + "Duplicate": "Dupliquer", + "Could not copy the task. Please try again.": "Impossible de copier la tâche. Veuillez réessayer.", + "Subtasks": "Sous-tâches", + "{done} of {total} done": "{done} sur {total} terminées", + "Add a subtask": "Ajouter une sous-tâche", + "Checklist": "Liste de contrôle", + "Checklist item actions": "Actions de l'élément de liste", + "Add a checklist item": "Ajouter un élément à la liste", + "Subtasks: {estimate} estimated, {logged} logged": "Sous-tâches : {estimate} estimées, {logged} saisies", + "Total estimate: {total}": "Estimation totale : {total}", + "Part of {title}": "Fait partie de {title}", + "Checklist: {count} done": "Liste de contrôle : {count} terminés", + "This task has subtasks: {count}.": "Cette tâche a des sous-tâches : {count}.", + "Keep subtasks as separate tasks": "Garder les sous-tâches comme tâches séparées", + "Delete subtasks too": "Supprimer aussi les sous-tâches", + "Copy of {title}": "Copie de {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "La tâche a été copiée, mais pas toutes ses sous-tâches. Vérifiez la copie.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Petites étapes au sein de la tâche. Chaque élément a un identifiant, un texte et indique s'il est terminé.", + "Open work per person and per project.": "Travail ouvert par personne et par projet.", + "View": "Affichage", + "By person": "Par personne", + "By project": "Par projet", + "Hours left": "Heures restantes", + "Tasks without an estimate": "Tâches sans estimation", + "Due in 14 days": "Échéance dans 14 jours", + "Shared": "Partagées", + "Unassigned": "Non assignées", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Travail affiché pour les projets que vous pouvez voir. Les heures comptent pour la personne responsable ; les tâches partagées sont comptées sans heures.", + "No open work in these projects.": "Aucun travail ouvert dans ces projets.", + "Open work": "Travail ouvert", + "{count} open tasks": "{count} tâches ouvertes", + "Create a project to see capacity here.": "Créez un projet pour voir la capacité ici.", + "My tasks": "Mes tâches", + "Show all my tasks": "Afficher toutes mes tâches", + "No tasks assigned to you": "Aucune tâche ne vous est assignée", + "Browse projects": "Parcourir les projets", + "Later": "Plus tard", + "Due {date}": "Échéance {date}", + "Could not change the status. Please try again.": "Impossible de modifier le statut. Veuillez réessayer.", + "Completed today": "Terminées aujourd'hui", + "My open tasks": "Mes tâches ouvertes", + "My overdue tasks": "Mes tâches en retard", + "My tasks in progress": "Mes tâches en cours", + "Pin to the top": "Épingler en haut", + "Unpin": "Désépingler", + "Pinned": "Épinglé", + "Actions for {title}": "Actions pour {title}", + "Could not save your project order. Please try again.": "Impossible d'enregistrer l'ordre de vos projets. Veuillez réessayer.", + "No boards yet": "Aucun tableau pour l'instant", + "Create a project to get a board.": "Créez un projet pour obtenir un tableau.", + "Use the Projects page to create and manage your projects and tasks.": "Utilisez la page Projets pour créer et gérer vos projets et vos tâches.", + "Go to projects": "Aller aux projets", + "You are not a member of any projects yet.": "Vous n'êtes encore membre d'aucun projet.", + "Could not search for users. Please try again.": "Impossible de rechercher des utilisateurs. Veuillez réessayer.", + "Project creation is restricted to administrators.": "La création de projets est réservée aux administrateurs.", + "Only the project owner or an administrator can delete this project.": "Seul le propriétaire du projet ou un administrateur peut supprimer ce projet.", + "No projects are available to you yet. Ask an administrator to create one.": "Aucun projet ne vous est encore accessible. Demandez à un administrateur d'en créer un.", + "Due: {date}": "Échéance : {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Les tâches avec une date de début ou d'échéance apparaissent sur la chronologie. Ajoutez des dates pour les voir ici.", + "You do not have access to this project.": "Vous n'avez pas accès à ce projet.", + "Zoom level": "Niveau de zoom", + "Unscheduled": "Non planifiées", + "Start: {date}": "Début : {date}", + "Today": "Aujourd'hui", + "No scheduled tasks": "Aucune tâche planifiée", + "An unexpected error occurred.": "Une erreur inattendue s'est produite.", + "Column {number} name": "Nom de la colonne {number}", + "Failed to save creation policy": "Impossible d'enregistrer la règle de création", + "All authenticated users": "Tous les utilisateurs connectés", + "Control who may create new projects": "Définir qui peut créer de nouveaux projets", + "Administrators only": "Administrateurs uniquement", + "Project creation": "Création de projets", + "Allow project creation": "Autoriser la création de projets", + "Creation policy saved successfully": "Règle de création enregistrée", + "Initializing…": "Initialisation…", + "e.g. 2h 30m, 90m, 1.5h": "ex. 2h 30m, 90m, 1.5h", + "Log time": "Saisir du temps", + "Save estimate": "Enregistrer l'estimation", + "Logged: {logged}": "Saisi : {logged}", + "over by {amount}": "dépassement de {amount}", + "Time tracking": "Suivi du temps", + "Estimate": "Estimation", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Saisissez une estimation valide (ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Saisissez une durée valide (ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Impossible d'enregistrer la saisie de temps. Veuillez réessayer.", + "Edit time entry": "Modifier la saisie de temps", + "Duration": "Durée", + "Date range": "Période", + "Last week": "Semaine dernière", + "No time logged": "Aucun temps saisi", + "Log time on a task to see it here.": "Saisissez du temps sur une tâche pour le voir ici.", + "To date": "Date de fin", + "This week": "Cette semaine", + "Total: {total}": "Total : {total}", + "From date": "Date de début", + "Custom range": "Période personnalisée", + "All time": "Toute la période", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Impossible de supprimer une tâche, des données peuvent donc subsister. Supprimez à nouveau le projet.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Impossible de supprimer une saisie de temps, des données peuvent donc subsister. Supprimez à nouveau le projet.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Impossible de supprimer une colonne, des données peuvent donc subsister. Supprimez à nouveau le projet.", + "Could not delete the project. Please try again.": "Impossible de supprimer le projet. Veuillez réessayer.", + "Notification settings": "Paramètres de notification", + "Configure when due-date reminders are sent": "Définir quand les rappels d'échéance sont envoyés", + "Due-date reminder lead time (hours)": "Délai du rappel d'échéance (heures)", + "Lead time must be between 1 and 336 hours": "Le délai doit être compris entre 1 et 336 heures", + "Reminder lead time saved successfully": "Délai du rappel enregistré", + "Failed to save reminder lead time": "Impossible d'enregistrer le délai du rappel", + "Notifications": "Notifications", + "Notify me 1 day before a task's due date": "Me prévenir 1 jour avant l'échéance d'une tâche", + "Draft": "Brouillon", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Indique si le cours est un brouillon que seul son enseignant voit, s'il a lieu ou s'il est annulé.", + "New release": "Nouvelle version", + "Roadmap chart. The same releases and epics are listed below.": "Graphique de la feuille de route. Les mêmes versions et épopées sont listées ci-dessous.", + "Nothing on the roadmap yet": "Rien sur la feuille de route pour l'instant", + "Releases with a target date and epics with dated tasks appear here.": "Les versions avec une date cible et les épopées avec des tâches datées apparaissent ici.", + "Releases": "Versions", + "No releases yet": "Aucune version pour l'instant", + "Target date: {date}": "Date cible : {date}", + "No target date": "Aucune date cible", + "Edit {name}": "Modifier {name}", + "Mark {name} as released": "Marquer {name} comme publiée", + "Mark as released": "Marquer comme publiée", + "Epics": "Épopées", + "No epics yet. Open a task to make it an epic.": "Aucune épopée pour l'instant. Ouvrez une tâche pour en faire une épopée.", + "Not scheduled yet": "Pas encore planifiée", + "Planned": "Prévue", + "Released": "Publiée", + "Edit release": "Modifier la version", + "Target date": "Date cible", + "Could not save the release. Please try again.": "Impossible d'enregistrer la version. Veuillez réessayer.", + "Every task of this release is done or cancelled.": "Chaque tâche de cette version est terminée ou annulée.", + "Not finished yet: {count}": "Pas encore terminées : {count}", + "What happens to these tasks?": "Que deviennent ces tâches ?", + "Move to {name}": "Déplacer vers {name}", + "Remove the release": "Retirer la version", + "Keep it on {name}": "Les laisser sur {name}", + "Could not mark the release as released. Please try again.": "Impossible de marquer la version comme publiée. Veuillez réessayer.", + "Roadmap": "Feuille de route", + "Tasks or roadmap": "Tâches ou feuille de route", + "Release": "Version", + "Epic": "Épopée", + "This task is an epic": "Cette tâche est une épopée", + "A named, dated delivery of a project that its tasks are planned against.": "Une livraison nommée et datée d'un projet, sur laquelle ses tâches sont planifiées.", + "Name of the release": "Nom de la version", + "The project this release belongs to": "Le projet auquel appartient cette version", + "What this release delivers": "Ce que livre cette version", + "When work on the release starts": "Quand le travail sur la version commence", + "The date the release is due": "La date à laquelle la version est attendue", + "Whether the release is planned, released or archived": "Si la version est prévue, publiée ou archivée", + "Released on": "Publiée le", + "When the release was marked as released": "Quand la version a été marquée comme publiée", + "The release this task is planned for": "La version pour laquelle cette tâche est planifiée", + "Board view options": "Options d'affichage du tableau", + "Colour cards": "Colorer les cartes", + "No colour": "Aucune couleur", + "By label": "Par étiquette", + "Swimlanes": "Couloirs", + "No swimlanes": "Aucun couloir", + "By assignee": "Par responsable", + "By epic": "Par epic", + "No assignee": "Non attribuée", + "No epic": "Aucun epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Les cartes restent dans la ligne de leur epic. Modifiez l'epic sur la page de la tâche.", + "Hand over to": "Confier à", + "Could not save your board view. It applies until you reload.": "Votre affichage du tableau n'a pas été enregistré. Il s'applique jusqu'au rechargement.", + "Timetable wish": "Souhait d'emploi du temps", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Un souhait que le générateur prend en compte. Il respecte toujours un souhait strict, et un souhait souple quand il le peut.", + "Whether the wish is about a teacher, a group, a room or one activity": "Si le souhait concerne un enseignant, un groupe, une salle ou une activité", + "Teacher": "Enseignant", + "Group": "Groupe", + "Reference": "Référence", + "The user, group, room or activity the wish is about": "L'utilisateur, le groupe, la salle ou l'activité concernés", + "What the wish asks for": "Ce que le souhait demande", + "Not on these periods": "Pas sur ces créneaux", + "Preferably not on these periods": "De préférence pas sur ces créneaux", + "At most a number of lessons a day": "Au plus un nombre de cours par jour", + "No free periods between lessons": "Pas de trous entre les cours", + "Always the same room": "Toujours la même salle", + "Periods": "Créneaux", + "The periods of the week the wish is about, such as wed-5": "Les créneaux de la semaine concernés, par exemple wed-5", + "Limit": "Limite", + "The most lessons a day, for a wish of that kind": "Le nombre maximal de cours par jour, pour ce type de souhait", + "Strength": "Force", + "Whether the generator must keep the wish or should keep it": "Si le générateur doit ou devrait respecter le souhait", + "Hard": "Strict", + "Soft": "Souple", + "Weight": "Poids", + "How much a soft wish counts, from 1 to 3": "Le poids d'un souhait souple, de 1 à 3", + "Why the wish exists": "Pourquoi ce souhait existe", + "Timetable scenario": "Scénario d'emploi du temps", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Un modèle de semaine, créé par le générateur ou repris de l'emploi du temps actuel. Il garde ses données d'entrée et son respect des souhaits.", + "The name timetablers know the scenario by": "Le nom sous lequel les planificateurs connaissent le scénario", + "Whether the generator made it or it came from the current timetable": "Si le générateur l'a créé ou s'il vient de l'emploi du temps actuel", + "Generated": "Généré", + "From the current timetable": "Depuis l'emploi du temps actuel", + "Week of": "Semaine du", + "The Monday of the first week of the window": "Le lundi de la première semaine de la période", + "Window start": "Début de la période", + "The first day the week pattern applies to": "Le premier jour où le modèle de semaine s'applique", + "Window end": "Fin de la période", + "The last day the week pattern applies to": "Le dernier jour où le modèle de semaine s'applique", + "Waiting, generating, done, failed, or published as draft lessons": "En attente, en cours, terminé, échoué ou publié en cours brouillons", + "Waiting": "En attente", + "Generating": "Génération en cours", + "Failed": "Échoué", + "Published": "Publié", + "Seed": "Graine", + "The number the generator starts from, so a run can be repeated": "Le nombre de départ du générateur, pour pouvoir répéter un calcul", + "Input": "Entrée", + "The periods, rooms, lessons and wishes the scenario was made from": "Les créneaux, salles, cours et souhaits d'où vient le scénario", + "Placements": "Placements", + "Each lesson with the period and room it was given": "Chaque cours avec le créneau et la salle obtenus", + "Unplaced lessons": "Cours non placés", + "Lessons without a place, each with the hard wish that blocked it": "Cours sans place, chacun avec le souhait strict qui l'a bloqué", + "Broken wishes": "Souhaits non respectés", + "The wishes this scenario breaks, with the lessons that break them": "Les souhaits que ce scénario enfreint, avec les cours en cause", + "Measures": "Mesures", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Cours placés, souhaits enfreints, trous des enseignants, cours par jour et usage des salles", + "Reason": "Raison", + "Why the run failed": "Pourquoi le calcul a échoué", + "Published at": "Publié le", + "When the scenario was written out as draft lessons": "Quand le scénario a été écrit en cours brouillons", + "Edit wish": "Modifier le souhait", + "New wish": "Nouveau souhait", + "Hard: the generator always keeps it": "Strict : le générateur le respecte toujours", + "Soft: the generator keeps it where it can": "Souple : le générateur le respecte quand il le peut", + "Weight (1 to 3)": "Poids (1 à 3)", + "Most lessons a day": "Nombre maximal de cours par jour", + "Period": "Créneau", + "{day} period {number}": "{day} créneau {number}", + "Teacher (user name)": "Enseignant (nom d'utilisateur)", + "Activity (group:subject)": "Activité (groupe:matière)", + "Say who or what the wish is about.": "Indiquez qui ou quoi concerne le souhait.", + "Choose at least one period.": "Choisissez au moins un créneau.", + "The limit is a whole number of 1 or more.": "La limite est un nombre entier de 1 ou plus.", + "Timetable": "Emploi du temps", + "Wishes": "Souhaits", + "Timetable wishes": "Souhaits d'emploi du temps", + "Generator run": "Exécution du générateur", + "Generator progress": "Progression du générateur", + "The run failed: {reason}": "L'exécution a échoué : {reason}", + "{placed} of {lessons} lessons placed": "{placed} cours placés sur {lessons}", + "Generate again": "Générer à nouveau", + "Generate": "Générer", + "Every lesson has a place.": "Chaque cours a une place.", + "Lesson": "Cours", + "No free period and room": "Aucun créneau ni salle libre", + "Broken soft wishes": "Souhaits souples non respectés", + "Every soft wish is kept.": "Chaque souhait souple est respecté.", + "Wish": "Souhait", + "Lessons": "Cours", + "Generating: {percent}% of the time budget used": "Génération : {percent} % du temps utilisé", + "Waiting to start": "En attente de démarrage", + "Published as draft lessons": "Publié en cours brouillons", + "Could not read the scenario.": "Impossible de lire le scénario.", + "Could not start the run.": "Impossible de lancer l'exécution.", + "Scenarios": "Scénarios", + "Timetable scenarios": "Scénarios d'emploi du temps", + "Scenario": "Scénario", + "Take the current timetable": "Reprendre l'emploi du temps actuel", + "Could not take the current timetable.": "Impossible de reprendre l'emploi du temps actuel.", + "Broken hard wishes": "Souhaits stricts non respectés", + "Not on a period of the week grid": "Pas sur un créneau de la grille hebdomadaire", + "Compare scenarios": "Comparer des scénarios", + "Scenarios to compare": "Scénarios à comparer", + "Choose two or three scenarios to compare them.": "Choisissez deux ou trois scénarios pour les comparer.", + "Measure": "Mesure", + "Best": "Meilleur", + "Lessons that differ": "Cours qui diffèrent", + "No lesson differs.": "Aucun cours ne diffère.", + "Not placed": "Non placé", + "{period} in {room}": "{period} en {room}", + "Lessons placed": "Cours placés", + "Lessons without a place": "Cours sans place", + "Clashes": "Conflits", + "Hard wishes broken": "Souhaits stricts non respectés", + "Soft wishes broken": "Souhaits souples non respectés", + "Soft wishes broken, weighted": "Souhaits souples non respectés, pondérés", + "Free periods between lessons, all teachers": "Heures creuses, tous les enseignants", + "Most free periods of one teacher": "Plus d'heures creuses pour un enseignant", + "Most lessons of one group on a day": "Plus de cours d'un groupe en un jour", + "Room use": "Occupation des salles", + "Publish as draft lessons": "Publier comme cours brouillons", + "Draft lessons written: {count}": "Cours brouillons écrits : {count}", + "Could not publish the scenario.": "Impossible de publier le scénario.", + "Rules": "Règles", + "Rules for {column}": "Règles pour {column}", + "When a card enters this column": "Quand une carte entre dans cette colonne", + "Action": "Action", + "Set the priority": "Définir la priorité", + "Assign to": "Attribuer à", + "Assign the person who moved the card": "Attribuer à la personne qui a déplacé la carte", + "Remove the assignee": "Retirer le responsable", + "Add a label": "Ajouter une étiquette", + "No longer a project member": "N'est plus membre du projet", + "This label no longer exists": "Cette étiquette n'existe plus", + "Add rule": "Ajouter une règle", + "Remove rule": "Supprimer la règle", + "No rules yet. Add one to change a card when it enters this column.": "Aucune règle pour l'instant. Ajoutez-en une pour modifier une carte quand elle entre dans cette colonne.", + "Could not save the rules. Please try again.": "Impossible d'enregistrer les règles. Veuillez réessayer.", + "1 rule runs when a card enters this column": "1 règle s'applique quand une carte entre dans cette colonne", + "{count} rules run when a card enters this column": "{count} règles s'appliquent quand une carte entre dans cette colonne", + "Rules applied: {changes}": "Règles appliquées : {changes}", + "assigned to {name}": "attribuée à {name}", + "assignee removed": "responsable retiré", + "priority {priority}": "priorité {priority}", + "label {label}": "étiquette {label}", + "What happens to a card when it enters this column, applied in list order.": "Ce qui arrive à une carte quand elle entre dans cette colonne, dans l'ordre de la liste.", + "Value": "Valeur", + "What the rule does to the card.": "Ce que la règle fait à la carte.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "La priorité, l'identifiant d'utilisateur ou l'identifiant d'étiquette utilisé par l'action ; vide pour les actions sans valeur.", + "is not": "n'est pas", + "{dimension} is not": "{dimension} n'est pas", + "Saved filters": "Filtres enregistrés", + "No saved filters yet": "Aucun filtre enregistré", + "Save filter": "Enregistrer le filtre", + "Rename \"{name}\"": "Renommer « {name} »", + "Delete \"{name}\"": "Supprimer « {name} »", + "Clear filters": "Effacer les filtres", + "Showing {shown} of {total} tasks": "{shown} tâches affichées sur {total}", + "Me": "Moi", + "No date": "Sans date", + "Rename saved filter": "Renommer le filtre enregistré", + "Share with the project": "Partager avec le projet", + "Give the filter a name": "Donnez un nom au filtre", + "Could not save the filter. Please try again.": "Impossible d'enregistrer le filtre. Veuillez réessayer.", + "Some labels in \"{name}\" no longer exist and were left out.": "Certaines étiquettes de « {name} » n'existent plus et ont été ignorées.", + "Could not delete the filter. Please try again.": "Impossible de supprimer le filtre. Veuillez réessayer.", + "Saved filter": "Filtre enregistré", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Un filtre de tableau nommé d'un projet, visible seulement par la personne qui l'a enregistré, sauf s'il est partagé avec le projet.", + "The project whose board the filter applies to": "Le projet dont le tableau utilise le filtre", + "The name the filter is listed under": "Le nom sous lequel le filtre est listé", + "Saved by": "Enregistré par", + "Nextcloud user id of the person who saved the filter": "Identifiant Nextcloud de la personne qui a enregistré le filtre", + "Shared with the project": "Partagé avec le projet", + "Whether every project member sees and applies the filter": "Si chaque membre du projet voit et peut appliquer le filtre", + "Criteria": "Critères", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Le filtre : responsable, étiquette, priorité et échéance, chacun avec est ou n'est pas et ses valeurs", + "Cross-project view": "Vue multiprojet", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Une sélection enregistrée de projets dont les tâches sont affichées ensemble par statut, partagée avec les personnes qu'elle nomme.", + "Shared with": "Partagée avec", + "The name the view is listed under": "Le nom sous lequel la vue est listée", + "Nextcloud user id of the person who saved the view": "Identifiant Nextcloud de la personne qui a enregistré la vue", + "Nextcloud user ids of the people the view is shared with": "Identifiants Nextcloud des personnes avec qui la vue est partagée", + "The projects whose tasks the view shows, at most twenty": "Les projets dont la vue affiche les tâches, vingt au maximum", + "1 project in this view is hidden from you.": "1 projet de cette vue vous est masqué.", + "{count} projects in this view are hidden from you.": "{count} projets de cette vue vous sont masqués.", + "{project} has no column for {status}.": "{project} n'a pas de colonne pour {status}.", + "This view does not exist or is not shared with you.": "Cette vue n'existe pas ou n'est pas partagée avec vous.", + "\"{task}\" moved to {status}.": "« {task} » déplacée vers {status}.", + "Project: {title}": "Projet : {title}", + "Cross-project views": "Vues multiprojets", + "New view": "Nouvelle vue", + "Edit view": "Modifier la vue", + "Delete view": "Supprimer la vue", + "Give the view a name": "Donnez un nom à la vue", + "Pick at least one project": "Choisissez au moins un projet", + "A view shows at most {max} projects": "Une vue affiche au plus {max} projets", + "Could not save the view. Please try again.": "Impossible d'enregistrer la vue. Veuillez réessayer.", + "Could not delete the view. Please try again.": "Impossible de supprimer la vue. Veuillez réessayer.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Supprimer « {title} » ? Les projets et leurs tâches restent tels quels.", + "People see the tasks of the projects they are in, never more.": "Chacun voit les tâches des projets dont il fait partie, jamais plus.", + "No views yet. A view shows the tasks of several of your projects together.": "Aucune vue pour l'instant. Une vue affiche ensemble les tâches de plusieurs de vos projets.", + "Projects in view: {count}": "Projets dans la vue : {count}", + "Notify me when a task is assigned to me": "M'avertir quand une tâche m'est attribuée", + "Also send these to me by email": "M'envoyer aussi ces notifications par e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Ajoutez une adresse e-mail dans vos paramètres personnels Nextcloud pour recevoir des e-mails.", + "Code link": "Lien de code", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Un commit, une branche, une demande de fusion ou un ticket sur une forge de code qui concerne une tâche.", + "The task the link belongs to": "La tâche à laquelle appartient le lien", + "The project of the task": "Le projet de la tâche", + "Task key": "Clé de tâche", + "The task key the forge text named, such as VC-12": "La clé de tâche citée dans le texte de la forge, par exemple VC-12", + "What the link points at": "Ce vers quoi pointe le lien", + "Link": "Lien", + "The address of the item in the forge": "L'adresse de l'élément sur la forge", + "The commit message, branch name or merge request title": "Le message de commit, le nom de branche ou le titre de la demande de fusion", + "Repository": "Dépôt", + "The repository, such as acme/portal": "Le dépôt, par exemple acme/portal", + "Forge id": "Identifiant sur la forge", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "L'identifiant propre de l'élément sur la forge, par exemple github:acme/portal#42 ou un hash de commit", + "State": "État", + "The state of a merge request or issue": "L'état d'une demande de fusion ou d'un ticket", + "Who made the commit or opened the merge request": "Qui a fait le commit ou ouvert la demande de fusion", + "When the commit was made or the merge request last changed": "Quand le commit a été fait ou la demande de fusion a changé pour la dernière fois", + "Added by": "Ajouté par", + "Whether a person added the link or the integration wrote it": "Si une personne a ajouté le lien ou si l'intégration l'a écrit", + "Nextcloud user UIDs of project members": "Identifiants Nextcloud des membres du projet", + "Add link": "Ajouter un lien", + "Added by hand": "Ajouté à la main", + "Branch": "Branche", + "Code": "Code", + "Commit": "Commit", + "From the integration": "Par l'intégration", + "Link to a commit, branch or merge request": "Lien vers un commit, une branche ou une demande de fusion", + "Merge request": "Demande de fusion", + "Merged": "Fusionnée", + "No code linked yet. Name {key} in a commit message or paste a link.": "Aucun code lié pour l'instant. Citez {key} dans un message de commit ou collez un lien.", + "No code linked yet. Paste a link to a commit or merge request.": "Aucun code lié pour l'instant. Collez un lien vers un commit ou une demande de fusion.", + "Paste a web address that starts with https://.": "Collez une adresse web qui commence par https://.", + "Remove link {title}": "Retirer le lien {title}", + "The link could not be added.": "Le lien n'a pas pu être ajouté.", + "The link could not be removed.": "Le lien n'a pas pu être retiré.", + "This link is already on the task.": "Ce lien est déjà sur la tâche.", + "Code forges": "Forges de code", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Liez les commits et pull requests GitHub aux tâches. Integriq reçoit les événements ; planninq n'appelle jamais GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Téléchargez la configuration et importez-la dans Integriq. Saisissez ensuite un secret dans la règle \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Dans GitHub, ajoutez au dépôt un webhook avec cette adresse et le même secret. Choisissez le type de contenu application/json et les événements push et pull request :", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Citez la clé de tâche, par exemple VC-12, dans un message de commit, un nom de branche ou le titre d'une pull request. Le lien apparaît alors sur cette tâche.", + "Without Integriq, project members can still paste a link on the task page.": "Sans Integriq, les membres du projet peuvent toujours coller un lien sur la page de la tâche.", + "Download the Integriq configuration": "Télécharger la configuration Integriq", + "Calendar": "Calendrier", + "Previous": "Précédent", + "Calendar view": "Vue du calendrier", + "Starts:": "Commence :", + "No tasks with a date in this month.": "Aucune tâche datée ce mois-ci.", + "Week of {start} to {end}": "Semaine du {start} au {end}", + "My calendar": "Mon calendrier", + "Show as list": "Afficher en liste", + "Show as calendar": "Afficher en calendrier", + "Open my calendar": "Ouvrir mon calendrier", + "Nextcloud Tasks": "Tâches Nextcloud", + "Show my tasks in Nextcloud Tasks": "Afficher mes tâches dans Tâches Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Les tâches qui vous sont attribuées ou partagées avec vous apparaissent dans une liste « Planninq » dans Tâches et Agenda de Nextcloud. Les modifications faites là-bas sont remplacées à la prochaine modification dans Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ce serveur ne peut pas écrire dans Tâches Nextcloud, l'export n'est donc pas disponible.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Géré par Planninq. Les modifications faites ici sont remplacées à la prochaine modification dans Planninq.", + "Working days and holidays": "Jours ouvrés et jours fériés", + "Dates set on the timeline skip the days that are not working days.": "Les dates posées sur la chronologie sautent les jours non ouvrés.", + "Working weekdays": "Jours ouvrés de la semaine", + "Non-working days": "Jours non ouvrés", + "No non-working days yet.": "Aucun jour non ouvré pour l'instant.", + "Add day": "Ajouter un jour", + "Year": "Année", + "Add Dutch national holidays": "Ajouter les jours fériés néerlandais", + "Save working days": "Enregistrer les jours ouvrés", + "Choose at least one working weekday.": "Choisissez au moins un jour ouvré.", + "Working days saved.": "Jours ouvrés enregistrés.", + "Could not save the working days.": "Impossible d'enregistrer les jours ouvrés.", + "New Year's Day": "Jour de l'An", + "Easter Sunday": "Dimanche de Pâques", + "Easter Monday": "Lundi de Pâques", + "King's Day": "Fête du Roi", + "Liberation Day": "Jour de la Libération", + "Ascension Day": "Ascension", + "Whit Sunday": "Dimanche de Pentecôte", + "Whit Monday": "Lundi de Pentecôte", + "Christmas Day": "Noël", + "Boxing Day": "Lendemain de Noël", + "Dates of {title}": "Dates de {title}", + "The due date cannot be before the start date.": "La date d'échéance ne peut pas précéder la date de début.", + "{title}, from {start} to {end}": "{title}, du {start} au {end}", + "The dates could not be saved.": "Impossible d'enregistrer les dates.", + "{title} now runs from {start} to {end}": "{title} court maintenant du {start} au {end}", + "Auto-scheduling": "Planification automatique", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Si activé, reporter une échéance sur la chronologie propose de décaler aussi les tâches qu'elle bloque.", + "Move blocked tasks along when a task slips": "Décaler les tâches bloquées quand une tâche prend du retard", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Sur la chronologie, une échéance plus tardive propose de décaler les tâches bloquées. Seuls les liens « bloque » comptent, et les tâches ne sont décalées que vers plus tard.", + "Move the tasks that wait for {title}?": "Décaler les tâches qui attendent {title} ?", + "These tasks wait for it and would start after its new due date:": "Ces tâches l'attendent et commenceraient après sa nouvelle échéance :", + "{count} tasks would move; the first {limit} are listed.": "{count} tâches seraient décalées ; les {limit} premières sont listées.", + "Now": "Maintenant", + "After the move": "Après le décalage", + "Only this task": "Seulement cette tâche", + "Move all": "Tout décaler", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Arrêté à {title} : ses dates n'ont pas pu être enregistrées. Les tâches précédentes ont été décalées.", + "Cumulative flow": "Flux cumulé", + "Show as chart": "Afficher en graphique", + "Show as table": "Afficher en tableau", + "Tasks per column per day": "Tâches par colonne et par jour", + "Tasks without recorded history in this period: {count}": "Tâches sans historique enregistré sur cette période : {count}", + "Lead and cycle time": "Délai et temps de cycle", + "No tasks were finished in this period.": "Aucune tâche n'a été terminée sur cette période.", + "Finished tasks": "Tâches terminées", + "Cycle time, average": "Temps de cycle, moyenne", + "Cycle time, 85th percentile": "Temps de cycle, 85e centile", + "Lead time, average": "Délai, moyenne", + "Tasks whose finish time was estimated from their history: {count}": "Tâches dont l'heure de fin a été estimée à partir de l'historique : {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Temps de cycle de chaque tâche terminée, avec la moyenne et le 85e centile", + "Slowest tasks": "Tâches les plus lentes", + "cycle {cycle}, lead {lead}": "cycle {cycle}, délai {lead}", + "{days} days": "{days} jours", + "Could not load the flow of this project.": "Impossible de charger le flux de ce projet.", + "Last {days} days": "{days} derniers jours", + "Portfolio flow": "Flux du portefeuille", + "An admin adds portfolios under Projects, Portfolios.": "Un administrateur ajoute des portefeuilles sous Projets, Portefeuilles.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projets non affichés, car 50 au plus sont affichés à la fois : {count}", + "Could not load the flow of this portfolio.": "Impossible de charger le flux de ce portefeuille.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flux cumulé et temps de cycle sur les projets d'un portefeuille.", + "Edit report": "Modifier le rapport", + "Only tasks where": "Seulement les tâches où", + "Group by": "Grouper par", + "Display": "Affichage", + "Share with everyone who can read its projects": "Partager avec toute personne pouvant lire ses projets", + "The report could not be saved.": "Le rapport n'a pas pu être enregistré.", + "Number of tasks": "Nombre de tâches", + "Bar": "Barres", + "Donut": "Anneau", + "Table": "Tableau", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} des {total} projets de ce rapport ne vous sont pas visibles", + "No tasks match this report.": "Aucune tâche ne correspond à ce rapport.", + "None": "Aucun", + "Could not load this report.": "Impossible de charger ce rapport.", + "Report": "Rapport", + "Your reports": "Vos rapports", + "My reports": "Mes rapports", + "Shared reports": "Rapports partagés", + "You have not built a report yet.": "Vous n'avez encore créé aucun rapport.", + "Nobody has shared a report with you yet.": "Personne n'a encore partagé de rapport avec vous.", + "Reports you built over tasks, and the ones shared with you.": "Les rapports que vous avez créés sur les tâches, et ceux partagés avec vous.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Une requête enregistrée sur les tâches : quels projets, quels filtres, groupée par quoi, comptée ou additionnée, et affichée en tableau ou en graphique.", + "The name the report is listed under": "Le nom sous lequel le rapport est listé", + "What the report shows and who it is for": "Ce que montre le rapport et pour qui il est", + "Nextcloud user id of the person who saved the report": "Identifiant Nextcloud de la personne qui a enregistré le rapport", + "Who can open the report": "Qui peut ouvrir le rapport", + "Only me": "Moi seul", + "Everyone who can read its projects": "Toute personne pouvant lire ses projets", + "The projects the report covers, at most fifty": "Les projets couverts par le rapport, cinquante au plus", + "Filters": "Filtres", + "Task fields and the value each must equal": "Champs de tâche et la valeur que chacun doit égaler", + "The task field the report groups on": "Le champ de tâche sur lequel le rapport groupe", + "Count the tasks, or add up a number on them": "Compter les tâches, ou additionner un nombre sur elles", + "Sum": "Somme", + "Sum of": "Somme de", + "The number added up when the measure is a sum": "Le nombre additionné quand la mesure est une somme", + "Story points": "Points d'effort", + "Estimated duration": "Durée estimée", + "How the report is shown": "Comment le rapport est affiché", + "Issue type": "Type de ticket", + "Task fields and the value each must equal; empty when the report covers every task": "Champs de tâche et la valeur que chacun doit avoir ; vide si le rapport couvre toutes les tâches", + "The status a task must have": "Le statut qu'une tâche doit avoir", + "The priority a task must have": "La priorité qu'une tâche doit avoir", + "The user a task must be assigned to": "L'utilisateur auquel une tâche doit être assignée", + "A label a task must carry": "Une étiquette qu'une tâche doit porter", + "The board column a task must be in": "La colonne du tableau où une tâche doit se trouver", + "The issue type a task must have": "Le type de ticket qu'une tâche doit avoir", + "Manager groups": "Groupes gestionnaires", + "Member groups": "Groupes membres", + "Viewer groups": "Groupes lecteurs", + "Viewers": "Lecteurs", + "Owning group": "Groupe propriétaire", + "Nextcloud groups whose members manage the project": "Groupes Nextcloud dont les membres gèrent le projet", + "Nextcloud groups whose members work on the project": "Groupes Nextcloud dont les membres travaillent sur le projet", + "Nextcloud groups whose members may read the project": "Groupes Nextcloud dont les membres peuvent lire le projet", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utilisateurs Nextcloud qui gèrent le projet : paramètres, membres et travail", + "Nextcloud user ids who may read the project and its work but not change it": "Utilisateurs Nextcloud qui peuvent lire le projet et son travail sans le modifier", + "The Nextcloud group that owns the project with its creator, at most one": "Le groupe Nextcloud qui possède le projet avec son créateur, un au plus", + "Nextcloud user ids who may read this through the project": "Utilisateurs Nextcloud qui peuvent lire ceci via le projet", + "Nextcloud groups whose members may change this through the project": "Groupes Nextcloud dont les membres peuvent modifier ceci via le projet", + "Nextcloud groups whose members may read this through the project": "Groupes Nextcloud dont les membres peuvent lire ceci via le projet", + "Search for a person or a group…": "Rechercher une personne ou un groupe…", + "No one found. Your admin's sharing settings decide who you can find.": "Personne n’a été trouvé. Les paramètres de partage de votre administrateur déterminent qui vous pouvez trouver.", + "Type at least two characters": "Saisissez au moins deux caractères", + "Everyone in this group": "Tout le monde dans ce groupe", + "Could not search for people. Please try again.": "La recherche de personnes a échoué. Veuillez réessayer.", + "Could not remove the group": "Impossible de retirer le groupe", + "Only the owner and managers change who is on this project.": "Seuls le propriétaire et les gestionnaires changent qui fait partie de ce projet.", + "Role of {name}": "Rôle de {name}", + "Manager": "Gestionnaire", + "Member": "Membre", + "Viewer": "Lecteur", + "Could not change the role": "Impossible de modifier le rôle", + "Owned by group: {name}": "Propriété du groupe : {name}", + "No group owns this project.": "Aucun groupe ne possède ce projet.", + "Owned by group": "Propriété du groupe", + "Search for a group…": "Rechercher un groupe…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Aucun groupe trouvé. Les paramètres de partage de votre administrateur déterminent les groupes que vous pouvez trouver.", + "No owning group": "Aucun groupe propriétaire", + "Could not search for groups. Please try again.": "Impossible de rechercher des groupes. Veuillez réessayer.", + "Could not change the owning group": "Impossible de modifier le groupe propriétaire", + "You can read this project. Only its members change it.": "Vous pouvez lire ce projet. Seuls ses membres le modifient.", + "Course": "Cours", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Le cours enseigné dans cette leçon, par exemple une option, lorsque l'application d'apprentissage de l'école le connaît.", + "Online meeting link": "Lien de la leçon en ligne", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Où les élèves rejoignent cette leçon en ligne. Le bouton Rejoindre n'apparaît que pour un lien https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/fr.json b/l10n/fr.json index 35bd1be0..55232c39 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -199,7 +199,1167 @@ "Could not delete label": "Impossible de supprimer l'étiquette", "Delete label \"{title}\"? It will be removed from {count} task.": "Supprimer l'étiquette « {title} » ? Elle sera retirée de {count} tâche.", "Label deleted and removed from {count} task": "Étiquette supprimée et retirée de {count} tâche", - "used by {count} task": "utilisée par {count} tâche" + "used by {count} task": "utilisée par {count} tâche", + "Active projects": "Projets actifs", + "Archived projects": "Projets archivés", + "Boards": "Tableaux", + "My projects": "Mes projets", + "Portfolio": "Portefeuille", + "Project board": "Tableau du projet", + "Projects I am in": "Projets auxquels je participe", + "Timeline": "Chronologie", + "Timesheet": "Feuille de temps", + "Features & roadmap": "Fonctionnalités et feuille de route", + "Flow": "Flux", + "Flows": "Flux", + "Reports": "Rapports", + "Pick a report to open it.": "Choisissez un rapport pour l'ouvrir.", + "In progress": "En cours", + "Date": "Date", + "Due": "Échéance", + "Assignee": "Assigné à", + "Who": "Qui", + "What": "Quoi", + "Minutes": "Minutes", + "Entries": "Entrées", + "Most recent": "Les plus récents", + "Per person": "Par personne", + "By status": "Par statut", + "By priority": "Par priorité", + "Task status": "Statut des tâches", + "Time spent": "Temps passé", + "Capacity": "Capacité", + "Due soonest": "Échéance la plus proche", + "Minutes logged": "Minutes enregistrées", + "Nothing is due": "Rien n'est à échéance", + "Nothing logged yet": "Rien d'enregistré pour l'instant", + "What is open, what is blocked, and what is overdue.": "Ce qui est ouvert, bloqué et en retard.", + "How allocation is spread across the people working on projects.": "Comment la charge se répartit entre les personnes travaillant sur les projets.", + "Hours logged, and the projects they went to.": "Les heures enregistrées et les projets auxquels elles sont allées.", + "Billable": "Facturable", + "Budget: {amount}": "Budget : {amount}", + "Loading projects": "Chargement des projets", + "No projects for this client yet": "Aucun projet pour ce client pour l'instant", + "Open in Planninq": "Ouvrir dans Planninq", + "This project could not be found": "Ce projet est introuvable", + "Untitled project": "Projet sans titre", + "and {count} more": "et {count} de plus", + "Store": "Boutique", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installez des registres, schémas et flux publiés par d'autres organisations.", + "Work Date": "Date de travail", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Actions de la colonne", + "Columns": "Colonnes", + "Could not remove the column. Please try again.": "Impossible de supprimer la colonne. Veuillez réessayer.", + "Could not save the column. Please try again.": "Impossible d'enregistrer la colonne. Veuillez réessayer.", + "Done column": "Colonne terminée", + "Edit column": "Modifier la colonne", + "Keep the card's status": "Conserver le statut de la carte", + "Move its cards to": "Déplacer ses cartes vers", + "Move left": "Déplacer à gauche", + "Move right": "Déplacer à droite", + "Status of cards moved here": "Statut des cartes déplacées ici", + "The last done column cannot be removed.": "La dernière colonne terminée ne peut pas être supprimée.", + "WIP limit": "Limite WIP", + "over limit": "au-dessus de la limite", + "The status a card gets when it is moved into this column.": "Le statut qu'une carte reçoit lorsqu'elle est déplacée dans cette colonne.", + "All priorities": "Toutes les priorités", + "Could not create the task. Please try again.": "Impossible de créer la tâche. Veuillez réessayer.", + "Created": "Créée", + "Move to backlog": "Vers le backlog", + "Move to board": "Vers le tableau", + "New task": "Nouvelle tâche", + "Nothing in the backlog": "Rien dans le backlog", + "Rank": "Rang", + "Sort by": "Trier par", + "Sort by rank to reorder": "Triez par rang pour réordonner", + "Task actions": "Actions de la tâche", + "All labels": "Toutes les étiquettes", + "Filter tasks by label": "Filtrer les tâches par étiquette", + "View timeline": "Voir la chronologie", + "Board": "Tableau", + "List": "Liste", + "Column": "Colonne", + "Board or list": "Tableau ou liste", + "Log": "Journal", + "Add entry": "Ajouter une entrée", + "Show": "Afficher", + "No actions yet": "Aucune action pour l'instant", + "Closed": "Fermé", + "Entry actions": "Actions de l'entrée", + "Add action": "Ajouter une action", + "by {author}": "par {author}", + "saved {time}": "enregistré {time}", + "Attendees: {names}": "Participants : {names}", + "Add the first entry": "Ajouter la première entrée", + "Issues": "Problèmes", + "Lessons learned": "Enseignements", + "Meetings": "Réunions", + "Decisions": "Décisions", + "Actions": "Actions", + "Issue": "Problème", + "Lesson learned": "Enseignement", + "Meeting": "Réunion", + "Decision": "Décision", + "About this project": "À propos de ce projet", + "No description yet": "Pas encore de description", + "Start date": "Date de début", + "Not set": "Non défini", + "End date": "Date de fin", + "Progress": "Avancement", + "No tasks yet": "Pas encore de tâches", + "Open the board": "Ouvrir le tableau", + "People": "Personnes", + "Owner": "Propriétaire", + "Latest log entries": "Dernières entrées", + "Open the log": "Ouvrir le journal", + "{done} of {total} tasks done": "{done} tâches terminées sur {total}", + "Edit entry": "Modifier l'entrée", + "Type": "Type", + "Attendees": "Participants", + "Issue is closed": "Le problème est fermé", + "Could not save the entry. Please try again.": "Impossible d'enregistrer l'entrée. Veuillez réessayer.", + "From: {title}": "Issu de : {title}", + "What needs to happen": "Ce qui doit être fait", + "Could not create the action. Please try again.": "Impossible de créer l'action. Veuillez réessayer.", + "The action was created but could not be linked to the entry.": "L'action a été créée mais n'a pas pu être liée à l'entrée.", + "Project pages": "Pages du projet", + "Overview": "Vue d'ensemble", + "Risks": "Risques", + "Log entry": "Entrée de journal", + "A short name for the entry": "Un nom court pour l'entrée", + "Project": "Projet", + "The project this entry belongs to": "Le projet auquel appartient cette entrée", + "What kind of entry this is": "Le type d'entrée", + "When it happened": "Quand cela s'est produit", + "What happened, in Markdown": "Ce qui s'est passé, en Markdown", + "Whether an issue is still open": "Si un problème est encore ouvert", + "The people at a meeting": "Les personnes présentes à une réunion", + "Tasks that came out of this entry": "Les tâches issues de cette entrée", + "Add risk": "Ajouter un risque", + "Risk": "Risque", + "Score": "Score", + "Response": "Réponse", + "Review date": "Date de révision", + "no longer on the project": "ne fait plus partie du projet", + "Edit {title}": "Modifier {title}", + "No risks recorded yet": "Aucun risque consigné pour l'instant", + "Add the first risk": "Ajouter le premier risque", + "Medium": "Moyen", + "Mitigating": "En atténuation", + "Occurred": "Survenu", + "Avoid": "Éviter", + "Reduce": "Réduire", + "Transfer": "Transférer", + "Accept": "Accepter", + "Highest open risks": "Risques ouverts les plus élevés", + "No open risks": "Aucun risque ouvert", + "Open the risk register": "Ouvrir le registre des risques", + "Edit risk": "Modifier le risque", + "What could go wrong": "Ce qui pourrait mal tourner", + "Likelihood": "Probabilité", + "Impact": "Impact", + "Score {score}": "Score {score}", + "Countermeasures": "Contre-mesures", + "Could not save the risk. Please try again.": "Impossible d'enregistrer le risque. Veuillez réessayer.", + "Risks by likelihood and impact": "Risques par probabilité et impact", + "Risk scale": "Échelle de risque", + "The levels every project scores its risks on, and where low turns into medium and high": "Les niveaux sur lesquels chaque projet évalue ses risques, et où faible devient moyen puis élevé", + "Number of levels": "Nombre de niveaux", + "Likelihood labels": "Libellés de probabilité", + "Impact labels": "Libellés d'impact", + "Level {level}": "Niveau {level}", + "Medium from score": "Moyen à partir du score", + "High from score": "Élevé à partir du score", + "Risk scale saved": "Échelle de risque enregistrée", + "1 risk uses level {level}. Change it first.": "1 risque utilise le niveau {level}. Modifiez-le d'abord.", + "{count} risks use level {level}. Change them first.": "{count} risques utilisent le niveau {level}. Modifiez-les d'abord.", + "Every level needs a label, and high must start above medium.": "Chaque niveau a besoin d'un libellé, et élevé doit commencer au-dessus de moyen.", + "The project this risk belongs to": "Le projet auquel appartient ce risque", + "The cause and the effect, in Markdown": "La cause et l'effet, en Markdown", + "Category": "Catégorie", + "A free grouping, such as planning, budget or supplier": "Un regroupement libre, comme planning, budget ou fournisseur", + "How likely it is, on the admin's risk scale": "Sa probabilité, sur l'échelle de risque de l'administrateur", + "How hard it would hit, on the admin's risk scale": "La gravité de son impact, sur l'échelle de risque de l'administrateur", + "Likelihood times impact, calculated by the server": "Probabilité multipliée par l'impact, calculée par le serveur", + "Where the risk stands": "Où en est le risque", + "The person who watches this risk": "La personne qui surveille ce risque", + "How the project answers the risk": "Comment le projet répond au risque", + "What is done to prevent it or soften it, in Markdown": "Ce qui est fait pour l'éviter ou l'atténuer, en Markdown", + "When to look at this risk again": "Quand réexaminer ce risque", + "Very low": "Très faible", + "Very high": "Très élevé", + "All projects": "Tous les projets", + "Project status report": "Rapport d'état du projet", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Un rapport daté sur la situation d'un projet en matière d'argent, d'organisation, de temps, d'information, de qualité et de risque (les aspects GROTIK), chacun avec une note.", + "The project this report is about": "Le projet concerné par ce rapport", + "Report date": "Date du rapport", + "The day the report describes": "Le jour que décrit le rapport", + "Money": "Argent", + "How the project stands on this aspect": "La situation du projet pour cet aspect", + "On track": "Dans les temps", + "At risk": "À risque", + "Off track": "Hors trajectoire", + "Money note": "Note sur l'argent", + "A short explanation of this status": "Une courte explication de cet état", + "Organisation": "Organisation", + "Organisation note": "Note sur l'organisation", + "Time": "Temps", + "Time note": "Note sur le temps", + "Information": "Information", + "Information note": "Note sur l'information", + "Quality": "Qualité", + "Quality note": "Note sur la qualité", + "Risk note": "Note sur le risque", + "Overall": "Global", + "The worst of the six statuses, calculated by the server": "Le pire des six états, calculé par le serveur", + "Health: money": "Santé : argent", + "Copied from the newest status report": "Copié du rapport d'état le plus récent", + "Health: organisation": "Santé : organisation", + "Health: time": "Santé : temps", + "Health: information": "Santé : information", + "Health: quality": "Santé : qualité", + "Health: risk": "Santé : risque", + "Health: overall": "Santé : global", + "Health: report date": "Santé : date du rapport", + "The date of the newest status report": "La date du rapport d'état le plus récent", + "New report": "Nouveau rapport", + "Only the project owner writes status reports.": "Seul le propriétaire du projet rédige les rapports d'état.", + "Latest report, {date}": "Dernier rapport, {date}", + "Aspect": "Aspect", + "Note": "Note", + "Report history": "Historique des rapports", + "Author": "Auteur", + "No status reports yet": "Aucun rapport d'état pour l'instant", + "Write the first report": "Rédiger le premier rapport", + "Choose a status for every aspect to save the report.": "Choisissez un état pour chaque aspect pour enregistrer le rapport.", + "Suggested: on track.": "Suggestion : dans les temps.", + "Suggested: at risk.": "Suggestion : à risque.", + "Suggested: off track.": "Suggestion : hors trajectoire.", + "1 task is past its due date.": "1 tâche a dépassé son échéance.", + "{count} tasks are past their due date.": "{count} tâches ont dépassé leur échéance.", + "The end date has passed with 1 open task.": "La date de fin est passée avec 1 tâche ouverte.", + "The end date has passed with {count} open tasks.": "La date de fin est passée avec {count} tâches ouvertes.", + "No open task is past its due date.": "Aucune tâche ouverte n'a dépassé son échéance.", + "The highest open risk, \"{title}\", scores {score}.": "Le risque ouvert le plus élevé, « {title} », obtient {score}.", + "There are no open risks.": "Il n'y a aucun risque ouvert.", + "Costs are at {percent}% of the budget.": "Les coûts atteignent {percent}% du budget.", + "No suggestion: the project has no budget.": "Pas de suggestion : le projet n'a pas de budget.", + "No suggestion: no costs are recorded for this project yet.": "Pas de suggestion : aucun coût n'est encore enregistré pour ce projet.", + "The report was not saved. Only the project owner can write status reports.": "Le rapport n'a pas été enregistré. Seul le propriétaire du projet peut rédiger des rapports d'état.", + "No report": "Aucun rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Un groupe de projets menés par les mêmes personnes, comme un service ou un programme. Ses responsables lisent chaque projet qu'il contient.", + "The name of the portfolio": "Le nom du portefeuille", + "What the portfolio holds and who runs it": "Ce que contient le portefeuille et qui le pilote", + "A colour for the portfolio's section in project lists": "Une couleur pour la section du portefeuille dans les listes de projets", + "Managers": "Responsables", + "Nextcloud user UIDs of the people who run the portfolio": "Identifiants Nextcloud des personnes qui pilotent le portefeuille", + "Order": "Ordre", + "Where the portfolio comes in project lists, lowest first": "La place du portefeuille dans les listes de projets, du plus bas au plus haut", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "L'échelle de risque propre à ce portefeuille, en JSON, de même forme que celle de l'application. Vide signifie l'échelle de l'application.", + "Portfolio readers": "Lecteurs du portefeuille", + "Nextcloud user UIDs of the managers of the project's portfolio": "Identifiants Nextcloud des responsables du portefeuille du projet", + "The portfolio this project belongs to": "Le portefeuille auquel appartient ce projet", + "No portfolio": "Aucun portefeuille", + "All portfolios": "Tous les portefeuilles", + "You read this project as a manager of its portfolio. Only its members change it.": "Vous lisez ce projet en tant que responsable de son portefeuille. Seuls ses membres le modifient.", + "Portfolios": "Portefeuilles", + "Portfolio status": "Statut du portefeuille", + "No portfolios yet": "Aucun portefeuille pour l'instant", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Un administrateur ajoute des portefeuilles sous Projets, Portefeuilles. Les projets d'un portefeuille figurent ici avec leur statut.", + "Roll-up": "Synthèse", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} dans les temps, {atRisk} à risque, {offTrack} hors trajectoire, {noReport} sans rapport", + "No project in this portfolio that you can read.": "Aucun projet de ce portefeuille que vous pouvez lire.", + "Start": "Début", + "End": "Fin", + "Budget": "Budget", + "Last report": "Dernier rapport", + "Out of date": "Périmé", + "Portfolio timeline": "Chronologie du portefeuille", + "Zoom": "Zoom", + "Could not load the timeline": "Impossible de charger la chronologie", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Un administrateur ajoute des portefeuilles sous Projets, Portefeuilles. Les projets d'un portefeuille figurent ici sur une seule chronologie.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Ouvrez un projet pour voir ses phases et ses tâches. La chronologie est en lecture seule.", + "Phase: {title}": "Phase : {title}", + "Left out because you cannot read them: {count} projects": "Omis car vous ne pouvez pas les lire : {count} projets", + "Week": "Semaine", + "Day": "Jour", + "Month": "Mois", + "Please try again later.": "Veuillez réessayer plus tard.", + "Status reports": "Rapports d'état", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Après combien de jours le dernier rapport d'état d'un projet est marqué comme périmé dans la vue du portefeuille", + "Reporting period (days)": "Période de rapport (jours)", + "The reporting period is a whole number of days from 1 to 365.": "La période de rapport est un nombre entier de jours de 1 à 365.", + "Reporting period saved": "Période de rapport enregistrée", + "The reporting period was not saved. Please try again.": "La période de rapport n'a pas été enregistrée. Veuillez réessayer.", + "Every project of a portfolio with its status per aspect, rolled up.": "Chaque projet d'un portefeuille avec son statut par aspect, synthétisé.", + "The projects of a portfolio on one timeline.": "Les projets d'un portefeuille sur une seule chronologie.", + "Phases": "Phases", + "Add phase": "Ajouter une phase", + "No phases yet": "Aucune phase pour l'instant", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Découpez le projet en phases, comme l'initiation, la définition et la réalisation. Une phase se clôt dès que son document de clôture est téléversé.", + "{hours} hours": "{hours} heures", + "Concluding document: {title}": "Document de clôture : {title}", + "Concluding document missing": "Document de clôture manquant", + "Move {title} up": "Monter {title}", + "Move {title} down": "Descendre {title}", + "Close phase": "Clore la phase", + "Phase": "Phase", + "Files": "Fichiers", + "Notes": "Notes", + "Audit trail": "Piste d'audit", + "Edit phase": "Modifier la phase", + "Name": "Nom", + "Budget hours": "Heures budgétées", + "Could not save the phase. Please try again.": "Impossible d'enregistrer la phase. Veuillez réessayer.", + "Close phase {title}": "Clore la phase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Une phase se clôt avec son document de clôture : téléversez-le ici ou choisissez un des fichiers de la phase.", + "Concluding document": "Document de clôture", + "This phase has no files yet.": "Cette phase n'a pas encore de fichiers.", + "Upload a document": "Téléverser un document", + "The document was not uploaded. Please try again.": "Le document n'a pas été téléversé. Veuillez réessayer.", + "Upload the concluding document before you close this phase.": "Téléversez le document de clôture avant de clore cette phase.", + "This phase cannot be closed from its current status.": "Cette phase ne peut pas être close depuis son statut actuel.", + "The phase was not closed. Please try again.": "La phase n'a pas été close. Veuillez réessayer.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "L'identifiant du fichier de cette phase qui la clôt. La phase ne peut être terminée qu'une fois celui-ci renseigné et le fichier joint.", + "Import from Microsoft Project": "Importer depuis Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Choisissez un planning enregistré depuis Microsoft Project au format XML. Rien n'est importé avant votre confirmation.", + "Plan file": "Fichier de planning", + "What the import creates": "Ce que l'import crée", + "Tasks": "Tâches", + "Sub-tasks": "Sous-tâches", + "Milestones": "Jalons", + "Links": "Liens", + "Already imported, updated in place: {count}": "Déjà importés, mis à jour sur place : {count}", + "What does not carry over": "Ce qui n'est pas repris", + "Tasks with resources, which are not imported: {count}": "Tâches avec des ressources, qui ne sont pas importées : {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tâches au-delà du niveau 3, placées sous leur tâche de niveau 2 : {count}", + "Links other than finish-to-start, imported as related links: {count}": "Liens autres que fin-début, importés comme liens associés : {count}", + "Link lags, which are dropped: {count}": "Décalages de liens, qui sont abandonnés : {count}", + "Links to a summary task, which are not imported: {count}": "Liens vers une tâche récapitulative, qui ne sont pas importés : {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Liens vers des tâches hors de ce planning, qui ne sont pas importés : {count}", + "No longer in the plan": "Plus dans le planning", + "These stay in the project; remove them yourself if they are no longer needed.": "Ils restent dans le projet ; supprimez-les vous-même s'ils ne sont plus nécessaires.", + "Import": "Importer", + "Close": "Fermer", + "The plan is imported: {created} created, {updated} updated.": "Le planning est importé : {created} créés, {updated} mis à jour.", + "Links that would close a loop were left out: {count}": "Les liens qui fermeraient une boucle ont été omis : {count}", + "The import stopped part-way. Run it again to finish it.": "L'import s'est arrêté en cours de route. Relancez-le pour le terminer.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Enregistrez le planning dans Microsoft Project via Fichier, Enregistrer sous, format XML, puis importez ce fichier.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ce fichier déclare un DOCTYPE ou des entités, qui ne sont pas acceptés.", + "The file is larger than 10 MB.": "Le fichier dépasse 10 Mo.", + "The plan has more than 2,000 tasks, more than one import takes.": "Le planning compte plus de 2 000 tâches, plus qu'un import n'en accepte.", + "This file is not a Microsoft Project plan in XML format.": "Ce fichier n'est pas un planning Microsoft Project au format XML.", + "Choose a file to import.": "Choisissez un fichier à importer.", + "Only the project owner can import a plan.": "Seul le propriétaire du projet peut importer un planning.", + "The plan could not be read. Please try again.": "Le planning n'a pas pu être lu. Veuillez réessayer.", + "Linked case: {title}": "Dossier lié : {title}", + "Linked to a case": "Lié à un dossier", + "Hand over to case": "Transmettre au dossier", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copie sans modification chaque fichier du projet et de ses tâches, ainsi qu'un fichier décrivant le projet, vers le dossier lié.", + "{date} by {user}": "{date} par {user}", + "Files copied: {count}": "Fichiers copiés : {count}", + "Files that failed: {names}": "Fichiers en échec : {names}", + "The handover failed. Please try again.": "La transmission a échoué. Veuillez réessayer.", + "The linked case could not be found, or you cannot open it.": "Le dossier lié est introuvable, ou vous ne pouvez pas l'ouvrir.", + "Case handovers": "Transmissions au dossier", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Chaque transmission des fichiers et métadonnées du projet à son dossier : quand, par qui, à quel dossier, chaque fichier copié avec son SHA-256, et les fichiers en échec.", + "Finance": "Finances", + "Add cost line": "Ajouter une ligne de coût", + "Delivery terms": "Conditions de livraison", + "Billing model": "Mode de facturation", + "Budget in euro": "Budget en euros", + "Budget in hours": "Budget en heures", + "Hourly rate in euro": "Taux horaire en euros", + "Planned start": "Début prévu", + "Planned end": "Fin prévue", + "Planned dates": "Dates prévues", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Aucun budget convenu", + "Hours": "Heures", + "Only the project owner and the portfolio managers see the amounts.": "Seuls le propriétaire du projet et les gestionnaires du portefeuille voient les montants.", + "Budget against cost per category": "Budget face aux coûts par catégorie", + "Labour (booked time)": "Main-d'œuvre (temps saisi)", + "No category": "Aucune catégorie", + "Hours are not available": "Les heures ne sont pas disponibles", + "Not yet assigned to a category": "Pas encore affecté à une catégorie", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} dépensés, {remaining} restants", + "Budget against cost per phase": "Budget face aux coûts par phase", + "No phase": "Aucune phase", + "Cost lines": "Lignes de coût", + "From the finance system": "Du système financier", + "Edit cost line {amount}": "Modifier la ligne de coût {amount}", + "No cost lines yet": "Aucune ligne de coût pour l'instant", + "Commitments": "Engagements", + "Actual cost": "Coût réel", + "Forecast": "Prévision", + "Remaining": "Restant", + "Not planned yet": "Pas encore planifié", + "{start} to {end}": "{start} au {end}", + "The terms were not saved. Please try again.": "Les conditions n'ont pas été enregistrées. Veuillez réessayer.", + "Terms saved": "Conditions enregistrées", + "Fixed price": "Prix forfaitaire", + "Hourly": "À l'heure", + "Not billed": "Non facturé", + "Commitment": "Engagement", + "Edit cost line": "Modifier la ligne de coût", + "Kind": "Type", + "Amount in euro": "Montant en euros", + "Remove": "Supprimer", + "Could not save the cost line. Only the project owner changes the money of a project.": "Impossible d'enregistrer la ligne de coût. Seul le propriétaire du projet modifie l'argent d'un projet.", + "Could not remove the cost line. Please try again.": "Impossible de supprimer la ligne de coût. Veuillez réessayer.", + "{amount} over budget": "{amount} au-delà du budget", + "Cost categories": "Catégories de coûts", + "The categories every project splits its budget and costs into, one per line": "Les catégories dans lesquelles chaque projet répartit son budget et ses coûts, une par ligne", + "Categories": "Catégories", + "Give at least one category, each name once.": "Indiquez au moins une catégorie, chaque nom une seule fois.", + "Cost categories saved": "Catégories de coûts enregistrées", + "The cost categories were not saved. Please try again.": "Les catégories de coûts n'ont pas été enregistrées. Veuillez réessayer.", + "Finance line": "Ligne financière", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Un montant d'un projet : un budget, un engagement, un coût réel ou une prévision, dans une catégorie de coûts et éventuellement une phase. Saisi par le propriétaire du projet, ou par le système financier via l'application d'intégration.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Le projet auquel ce montant appartient. Vide pour une ligne du système financier dont le numéro de projet ne correspond à aucun projet.", + "The phase this amount belongs to, if any": "La phase à laquelle ce montant appartient, le cas échéant", + "The cost category, one of the categories the admin set up": "La catégorie de coûts, l'une des catégories définies par l'administrateur", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Si le montant est un budget, un engagement, un coût réel ou une prévision", + "Amount": "Montant", + "The amount in the reporting currency (euro)": "Le montant dans la devise de rapport (euro)", + "The date the amount was booked or is expected": "La date à laquelle le montant a été comptabilisé ou est attendu", + "What the amount is for": "L'objet du montant", + "Whether a person entered the line or the finance system sent it": "Si une personne a saisi la ligne ou si le système financier l'a envoyée", + "Entered by hand": "Saisi à la main", + "Finance line id": "Identifiant de la ligne financière", + "The finance system's own id of this line. One imported line per id.": "L'identifiant propre de cette ligne dans le système financier. Une ligne importée par identifiant.", + "Project number": "Numéro de projet", + "The project number the finance system sent, matched against the project key": "Le numéro de projet envoyé par le système financier, comparé à la clé du projet", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Le portefeuille du projet de la ligne, copié du projet pour que les totaux du portefeuille n'aient besoin que d'un filtre", + "Finance readers": "Lecteurs financiers", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID Nextcloud des personnes autorisées à voir ce montant : le propriétaire du projet et les gestionnaires de son portefeuille", + "Project owner": "Propriétaire du projet", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID Nextcloud du propriétaire du projet, qui peut modifier et supprimer les lignes saisies à la main", + "How the client pays: not billed, a fixed price, or by the hour.": "Comment le client paie : non facturé, prix forfaitaire ou à l'heure.", + "Portfolio finance": "Finances du portefeuille", + "You cannot see the money of any project in this portfolio": "Vous ne pouvez voir l'argent d'aucun projet de ce portefeuille", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Le serveur a renvoyé des lignes de coût de projets hors de ce portefeuille, ces totaux peuvent donc être faux.", + "Projects left out because you cannot see their money: {count}": "Projets écartés car vous ne pouvez pas voir leur argent : {count}", + "Unmatched finance lines": "Lignes financières non rattachées", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, engagements, coût réel et prévision totalisés sur un portefeuille.", + "Subprojects": "Sous-projets", + "{done} of {total}": "{done} sur {total}", + "{done} of {total} tasks done, including subprojects": "{done} tâches terminées sur {total}, sous-projets compris", + "Show the subprojects of {title}": "Afficher les sous-projets de {title}", + "Hide the subprojects of {title}": "Masquer les sous-projets de {title}", + "Part of": "Fait partie de", + "No parent project": "Aucun projet parent", + "A project cannot sit under one of its own subprojects.": "Un projet ne peut pas se placer sous l'un de ses propres sous-projets.", + "Projects nest three levels deep at most: programme, project and subproject.": "Les projets s'imbriquent sur trois niveaux au plus : programme, projet et sous-projet.", + "Parent project": "Projet parent", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Le projet sous lequel se place ce projet, par exemple un programme. Les projets s'imbriquent sur trois niveaux au plus.", + "Yes": "Oui", + "No": "Non", + "{label} (required)": "{label} (obligatoire)", + "{label} is required": "{label} est obligatoire", + "Project field": "Champ de projet", + "A field an admin adds to every project, such as a policy area or a contract value.": "Un champ qu'un administrateur ajoute à chaque projet, comme un domaine d'action ou une valeur de contrat.", + "Key": "Clé", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Le nom fixe sous lequel la valeur est enregistrée, en lower camel case. Gardez-le dès que des projets l'utilisent.", + "Label": "Libellé", + "The name people see next to the field": "Le nom que les personnes voient à côté du champ", + "What the field holds": "Ce que contient le champ", + "Text": "Texte", + "Number": "Nombre", + "Choice": "Choix", + "Person": "Personne", + "Yes or no": "Oui ou non", + "Options": "Options", + "The choices of a choice field": "Les choix d'un champ à choix", + "Required": "Obligatoire", + "Whether a project must fill in the field": "Si un projet doit remplir le champ", + "Where the field appears, lowest first": "Où le champ apparaît, le plus bas d'abord", + "Applies to": "S'applique à", + "What the field is added to": "Ce à quoi le champ est ajouté", + "Custom fields": "Champs personnalisés", + "The values of the project fields an admin defined, keyed by the field's key.": "Les valeurs des champs de projet définis par un administrateur, selon la clé du champ.", + "Project fields": "Champs de projet", + "Related": "Liés", + "Remove link": "Retirer le lien", + "Link type": "Type de lien", + "Relates to": "Lié à", + "Duplicates": "Duplique", + "Project key": "Clé du projet", + "Every task number starts with it, such as VERG-42.": "Chaque numéro de tâche commence par elle, par exemple VERG-42.", + "This key is already used by another project.": "Cette clé est déjà utilisée par un autre projet.", + "Use 2 to 10 letters and digits, starting with a letter.": "Utilisez 2 à 10 lettres et chiffres, en commençant par une lettre.", + "The key cannot change once tasks carry it.": "La clé ne peut plus changer une fois que des tâches la portent.", + "Project saved. The existing tasks get their numbers in the background.": "Projet enregistré. Les tâches existantes reçoivent leur numéro en arrière-plan.", + "Next task number": "Numéro de la prochaine tâche", + "The number the next task of this project gets in its key. Only the system writes it.": "Le numéro que la prochaine tâche de ce projet reçoit dans sa clé. Seul le système l’écrit.", + "Restore {title}": "Restaurer {title}", + "Restore": "Restaurer", + "Project restored": "Projet restauré", + "Could not restore the project": "Impossible de restaurer le projet", + "Bring this project back to the active list.": "Remettre ce projet dans la liste des projets actifs.", + "Restore project": "Restaurer le projet", + "Request reason": "Motif de la demande", + "Why the requester needs this project. Filled in when the project is requested.": "Pourquoi le demandeur a besoin de ce projet. Renseigné lors de la demande.", + "Reviewed by": "Examiné par", + "The user who approved or rejected the request.": "L’utilisateur qui a approuvé ou refusé la demande.", + "Reviewed at": "Examiné le", + "When the request was approved or rejected.": "Quand la demande a été approuvée ou refusée.", + "Review note": "Note d’examen", + "The reviewer's reason, shown to the requester when a request is not approved.": "La raison de l’examinateur, affichée au demandeur quand une demande n’est pas approuvée.", + "Members of these groups": "Membres de ces groupes", + "Groups that may create projects": "Groupes autorisés à créer des projets", + "The group {group} no longer exists. Save to remove it.": "Le groupe {group} n’existe plus. Enregistrez pour le retirer.", + "Review project request": "Examiner la demande de projet", + "Requested by": "Demandé par", + "Why it is needed": "Pourquoi il est nécessaire", + "Desired start date": "Date de début souhaitée", + "Why is it not approved?": "Pourquoi n’est-il pas approuvé ?", + "Give a reason. The requester sees it.": "Indiquez une raison. Le demandeur la verra.", + "Approve": "Approuver", + "Reject": "Refuser", + "Reject request": "Refuser la demande", + "The review was not saved. Try again.": "L’examen n’a pas été enregistré. Réessayez.", + "This project is waiting for review": "Ce projet attend un examen", + "This request was not approved": "Cette demande n’a pas été approuvée", + "Reason: {note}": "Raison : {note}", + "Review request": "Examiner la demande", + "Request a project": "Demander un projet", + "Step {step} of 2": "Étape {step} sur 2", + "Why is this project needed?": "Pourquoi ce projet est-il nécessaire ?", + "Give a reason. The reviewer reads it.": "Indiquez une raison. L’examinateur la lira.", + "Back": "Retour", + "Next": "Suivant", + "Send request": "Envoyer la demande", + "The request was not sent. Try again.": "La demande n’a pas été envoyée. Réessayez.", + "Requested": "Demandé", + "Not approved": "Non approuvé", + "Your request was sent": "Votre demande a été envoyée", + "Let everyone else request a project": "Permettre à tous les autres de demander un projet", + "Add a task": "Ajouter une tâche", + "Delete task": "Supprimer la tâche", + "Edit task": "Modifier la tâche", + "Write": "Écrire", + "Preview": "Aperçu", + "Markdown works here: headings, lists and links.": "Le Markdown fonctionne ici : titres, listes et liens.", + "Could not save the task. Please try again.": "Impossible d'enregistrer la tâche. Veuillez réessayer.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Du temps a été saisi sur \"{title}\", elle ne peut donc pas être supprimée. Vous pouvez l'annuler à la place : les saisies de temps sont conservées.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Supprimer \"{title}\" ? Ses liens vers d'autres tâches sont aussi supprimés. Cette action est irréversible.", + "Keep task": "Garder la tâche", + "Cancel task": "Annuler la tâche", + "Only the reporter, the project owner or an admin can delete this task.": "Seul le rapporteur, le propriétaire du projet ou un administrateur peut supprimer cette tâche.", + "Could not delete the task. Please try again.": "Impossible de supprimer la tâche. Veuillez réessayer.", + "Could not cancel the task. Please try again.": "Impossible d'annuler la tâche. Veuillez réessayer.", + "Responsible": "Responsable", + "Also working on this": "Travaille aussi dessus", + "Labels": "Étiquettes", + "Could not change the priority. Please try again.": "Impossible de modifier la priorité. Veuillez réessayer.", + "Other project members who work on this task alongside the person responsible.": "Autres membres du projet qui travaillent sur cette tâche avec la personne responsable.", + "Duplicate": "Dupliquer", + "Could not copy the task. Please try again.": "Impossible de copier la tâche. Veuillez réessayer.", + "Subtasks": "Sous-tâches", + "{done} of {total} done": "{done} sur {total} terminées", + "Add a subtask": "Ajouter une sous-tâche", + "Checklist": "Liste de contrôle", + "Checklist item actions": "Actions de l'élément de liste", + "Add a checklist item": "Ajouter un élément à la liste", + "Subtasks: {estimate} estimated, {logged} logged": "Sous-tâches : {estimate} estimées, {logged} saisies", + "Total estimate: {total}": "Estimation totale : {total}", + "Part of {title}": "Fait partie de {title}", + "Checklist: {count} done": "Liste de contrôle : {count} terminés", + "This task has subtasks: {count}.": "Cette tâche a des sous-tâches : {count}.", + "Keep subtasks as separate tasks": "Garder les sous-tâches comme tâches séparées", + "Delete subtasks too": "Supprimer aussi les sous-tâches", + "Copy of {title}": "Copie de {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "La tâche a été copiée, mais pas toutes ses sous-tâches. Vérifiez la copie.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Petites étapes au sein de la tâche. Chaque élément a un identifiant, un texte et indique s'il est terminé.", + "Open work per person and per project.": "Travail ouvert par personne et par projet.", + "View": "Affichage", + "By person": "Par personne", + "By project": "Par projet", + "Hours left": "Heures restantes", + "Tasks without an estimate": "Tâches sans estimation", + "Due in 14 days": "Échéance dans 14 jours", + "Shared": "Partagées", + "Unassigned": "Non assignées", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Travail affiché pour les projets que vous pouvez voir. Les heures comptent pour la personne responsable ; les tâches partagées sont comptées sans heures.", + "No open work in these projects.": "Aucun travail ouvert dans ces projets.", + "Open work": "Travail ouvert", + "{count} open tasks": "{count} tâches ouvertes", + "Create a project to see capacity here.": "Créez un projet pour voir la capacité ici.", + "My tasks": "Mes tâches", + "Show all my tasks": "Afficher toutes mes tâches", + "No tasks assigned to you": "Aucune tâche ne vous est assignée", + "Browse projects": "Parcourir les projets", + "Later": "Plus tard", + "Due {date}": "Échéance {date}", + "Could not change the status. Please try again.": "Impossible de modifier le statut. Veuillez réessayer.", + "Completed today": "Terminées aujourd'hui", + "My open tasks": "Mes tâches ouvertes", + "My overdue tasks": "Mes tâches en retard", + "My tasks in progress": "Mes tâches en cours", + "Pin to the top": "Épingler en haut", + "Unpin": "Désépingler", + "Pinned": "Épinglé", + "Actions for {title}": "Actions pour {title}", + "Could not save your project order. Please try again.": "Impossible d'enregistrer l'ordre de vos projets. Veuillez réessayer.", + "No boards yet": "Aucun tableau pour l'instant", + "Create a project to get a board.": "Créez un projet pour obtenir un tableau.", + "Use the Projects page to create and manage your projects and tasks.": "Utilisez la page Projets pour créer et gérer vos projets et vos tâches.", + "Go to projects": "Aller aux projets", + "You are not a member of any projects yet.": "Vous n'êtes encore membre d'aucun projet.", + "Could not search for users. Please try again.": "Impossible de rechercher des utilisateurs. Veuillez réessayer.", + "Project creation is restricted to administrators.": "La création de projets est réservée aux administrateurs.", + "Only the project owner or an administrator can delete this project.": "Seul le propriétaire du projet ou un administrateur peut supprimer ce projet.", + "No projects are available to you yet. Ask an administrator to create one.": "Aucun projet ne vous est encore accessible. Demandez à un administrateur d'en créer un.", + "Due: {date}": "Échéance : {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Les tâches avec une date de début ou d'échéance apparaissent sur la chronologie. Ajoutez des dates pour les voir ici.", + "You do not have access to this project.": "Vous n'avez pas accès à ce projet.", + "Zoom level": "Niveau de zoom", + "Unscheduled": "Non planifiées", + "Start: {date}": "Début : {date}", + "Today": "Aujourd'hui", + "No scheduled tasks": "Aucune tâche planifiée", + "An unexpected error occurred.": "Une erreur inattendue s'est produite.", + "Column {number} name": "Nom de la colonne {number}", + "Failed to save creation policy": "Impossible d'enregistrer la règle de création", + "All authenticated users": "Tous les utilisateurs connectés", + "Control who may create new projects": "Définir qui peut créer de nouveaux projets", + "Administrators only": "Administrateurs uniquement", + "Project creation": "Création de projets", + "Allow project creation": "Autoriser la création de projets", + "Creation policy saved successfully": "Règle de création enregistrée", + "Initializing…": "Initialisation…", + "e.g. 2h 30m, 90m, 1.5h": "ex. 2h 30m, 90m, 1.5h", + "Log time": "Saisir du temps", + "Save estimate": "Enregistrer l'estimation", + "Logged: {logged}": "Saisi : {logged}", + "over by {amount}": "dépassement de {amount}", + "Time tracking": "Suivi du temps", + "Estimate": "Estimation", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Saisissez une estimation valide (ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Saisissez une durée valide (ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Impossible d'enregistrer la saisie de temps. Veuillez réessayer.", + "Edit time entry": "Modifier la saisie de temps", + "Duration": "Durée", + "Date range": "Période", + "Last week": "Semaine dernière", + "No time logged": "Aucun temps saisi", + "Log time on a task to see it here.": "Saisissez du temps sur une tâche pour le voir ici.", + "To date": "Date de fin", + "This week": "Cette semaine", + "Total: {total}": "Total : {total}", + "From date": "Date de début", + "Custom range": "Période personnalisée", + "All time": "Toute la période", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Impossible de supprimer une tâche, des données peuvent donc subsister. Supprimez à nouveau le projet.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Impossible de supprimer une saisie de temps, des données peuvent donc subsister. Supprimez à nouveau le projet.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Impossible de supprimer une colonne, des données peuvent donc subsister. Supprimez à nouveau le projet.", + "Could not delete the project. Please try again.": "Impossible de supprimer le projet. Veuillez réessayer.", + "Notification settings": "Paramètres de notification", + "Configure when due-date reminders are sent": "Définir quand les rappels d'échéance sont envoyés", + "Due-date reminder lead time (hours)": "Délai du rappel d'échéance (heures)", + "Lead time must be between 1 and 336 hours": "Le délai doit être compris entre 1 et 336 heures", + "Reminder lead time saved successfully": "Délai du rappel enregistré", + "Failed to save reminder lead time": "Impossible d'enregistrer le délai du rappel", + "Notifications": "Notifications", + "Notify me 1 day before a task's due date": "Me prévenir 1 jour avant l'échéance d'une tâche", + "Draft": "Brouillon", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Indique si le cours est un brouillon que seul son enseignant voit, s'il a lieu ou s'il est annulé.", + "New release": "Nouvelle version", + "Roadmap chart. The same releases and epics are listed below.": "Graphique de la feuille de route. Les mêmes versions et épopées sont listées ci-dessous.", + "Nothing on the roadmap yet": "Rien sur la feuille de route pour l'instant", + "Releases with a target date and epics with dated tasks appear here.": "Les versions avec une date cible et les épopées avec des tâches datées apparaissent ici.", + "Releases": "Versions", + "No releases yet": "Aucune version pour l'instant", + "Target date: {date}": "Date cible : {date}", + "No target date": "Aucune date cible", + "Edit {name}": "Modifier {name}", + "Mark {name} as released": "Marquer {name} comme publiée", + "Mark as released": "Marquer comme publiée", + "Epics": "Épopées", + "No epics yet. Open a task to make it an epic.": "Aucune épopée pour l'instant. Ouvrez une tâche pour en faire une épopée.", + "Not scheduled yet": "Pas encore planifiée", + "Planned": "Prévue", + "Released": "Publiée", + "Edit release": "Modifier la version", + "Target date": "Date cible", + "Could not save the release. Please try again.": "Impossible d'enregistrer la version. Veuillez réessayer.", + "Every task of this release is done or cancelled.": "Chaque tâche de cette version est terminée ou annulée.", + "Not finished yet: {count}": "Pas encore terminées : {count}", + "What happens to these tasks?": "Que deviennent ces tâches ?", + "Move to {name}": "Déplacer vers {name}", + "Remove the release": "Retirer la version", + "Keep it on {name}": "Les laisser sur {name}", + "Could not mark the release as released. Please try again.": "Impossible de marquer la version comme publiée. Veuillez réessayer.", + "Roadmap": "Feuille de route", + "Tasks or roadmap": "Tâches ou feuille de route", + "Release": "Version", + "Epic": "Épopée", + "This task is an epic": "Cette tâche est une épopée", + "A named, dated delivery of a project that its tasks are planned against.": "Une livraison nommée et datée d'un projet, sur laquelle ses tâches sont planifiées.", + "Name of the release": "Nom de la version", + "The project this release belongs to": "Le projet auquel appartient cette version", + "What this release delivers": "Ce que livre cette version", + "When work on the release starts": "Quand le travail sur la version commence", + "The date the release is due": "La date à laquelle la version est attendue", + "Whether the release is planned, released or archived": "Si la version est prévue, publiée ou archivée", + "Released on": "Publiée le", + "When the release was marked as released": "Quand la version a été marquée comme publiée", + "The release this task is planned for": "La version pour laquelle cette tâche est planifiée", + "Board view options": "Options d'affichage du tableau", + "Colour cards": "Colorer les cartes", + "No colour": "Aucune couleur", + "By label": "Par étiquette", + "Swimlanes": "Couloirs", + "No swimlanes": "Aucun couloir", + "By assignee": "Par responsable", + "By epic": "Par epic", + "No assignee": "Non attribuée", + "No epic": "Aucun epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Les cartes restent dans la ligne de leur epic. Modifiez l'epic sur la page de la tâche.", + "Hand over to": "Confier à", + "Could not save your board view. It applies until you reload.": "Votre affichage du tableau n'a pas été enregistré. Il s'applique jusqu'au rechargement.", + "Timetable wish": "Souhait d'emploi du temps", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Un souhait que le générateur prend en compte. Il respecte toujours un souhait strict, et un souhait souple quand il le peut.", + "Whether the wish is about a teacher, a group, a room or one activity": "Si le souhait concerne un enseignant, un groupe, une salle ou une activité", + "Teacher": "Enseignant", + "Group": "Groupe", + "Reference": "Référence", + "The user, group, room or activity the wish is about": "L'utilisateur, le groupe, la salle ou l'activité concernés", + "What the wish asks for": "Ce que le souhait demande", + "Not on these periods": "Pas sur ces créneaux", + "Preferably not on these periods": "De préférence pas sur ces créneaux", + "At most a number of lessons a day": "Au plus un nombre de cours par jour", + "No free periods between lessons": "Pas de trous entre les cours", + "Always the same room": "Toujours la même salle", + "Periods": "Créneaux", + "The periods of the week the wish is about, such as wed-5": "Les créneaux de la semaine concernés, par exemple wed-5", + "Limit": "Limite", + "The most lessons a day, for a wish of that kind": "Le nombre maximal de cours par jour, pour ce type de souhait", + "Strength": "Force", + "Whether the generator must keep the wish or should keep it": "Si le générateur doit ou devrait respecter le souhait", + "Hard": "Strict", + "Soft": "Souple", + "Weight": "Poids", + "How much a soft wish counts, from 1 to 3": "Le poids d'un souhait souple, de 1 à 3", + "Why the wish exists": "Pourquoi ce souhait existe", + "Timetable scenario": "Scénario d'emploi du temps", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Un modèle de semaine, créé par le générateur ou repris de l'emploi du temps actuel. Il garde ses données d'entrée et son respect des souhaits.", + "The name timetablers know the scenario by": "Le nom sous lequel les planificateurs connaissent le scénario", + "Whether the generator made it or it came from the current timetable": "Si le générateur l'a créé ou s'il vient de l'emploi du temps actuel", + "Generated": "Généré", + "From the current timetable": "Depuis l'emploi du temps actuel", + "Week of": "Semaine du", + "The Monday of the first week of the window": "Le lundi de la première semaine de la période", + "Window start": "Début de la période", + "The first day the week pattern applies to": "Le premier jour où le modèle de semaine s'applique", + "Window end": "Fin de la période", + "The last day the week pattern applies to": "Le dernier jour où le modèle de semaine s'applique", + "Waiting, generating, done, failed, or published as draft lessons": "En attente, en cours, terminé, échoué ou publié en cours brouillons", + "Waiting": "En attente", + "Generating": "Génération en cours", + "Failed": "Échoué", + "Published": "Publié", + "Seed": "Graine", + "The number the generator starts from, so a run can be repeated": "Le nombre de départ du générateur, pour pouvoir répéter un calcul", + "Input": "Entrée", + "The periods, rooms, lessons and wishes the scenario was made from": "Les créneaux, salles, cours et souhaits d'où vient le scénario", + "Placements": "Placements", + "Each lesson with the period and room it was given": "Chaque cours avec le créneau et la salle obtenus", + "Unplaced lessons": "Cours non placés", + "Lessons without a place, each with the hard wish that blocked it": "Cours sans place, chacun avec le souhait strict qui l'a bloqué", + "Broken wishes": "Souhaits non respectés", + "The wishes this scenario breaks, with the lessons that break them": "Les souhaits que ce scénario enfreint, avec les cours en cause", + "Measures": "Mesures", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Cours placés, souhaits enfreints, trous des enseignants, cours par jour et usage des salles", + "Reason": "Raison", + "Why the run failed": "Pourquoi le calcul a échoué", + "Published at": "Publié le", + "When the scenario was written out as draft lessons": "Quand le scénario a été écrit en cours brouillons", + "Edit wish": "Modifier le souhait", + "New wish": "Nouveau souhait", + "Hard: the generator always keeps it": "Strict : le générateur le respecte toujours", + "Soft: the generator keeps it where it can": "Souple : le générateur le respecte quand il le peut", + "Weight (1 to 3)": "Poids (1 à 3)", + "Most lessons a day": "Nombre maximal de cours par jour", + "Period": "Créneau", + "{day} period {number}": "{day} créneau {number}", + "Teacher (user name)": "Enseignant (nom d'utilisateur)", + "Activity (group:subject)": "Activité (groupe:matière)", + "Say who or what the wish is about.": "Indiquez qui ou quoi concerne le souhait.", + "Choose at least one period.": "Choisissez au moins un créneau.", + "The limit is a whole number of 1 or more.": "La limite est un nombre entier de 1 ou plus.", + "Timetable": "Emploi du temps", + "Wishes": "Souhaits", + "Timetable wishes": "Souhaits d'emploi du temps", + "Generator run": "Exécution du générateur", + "Generator progress": "Progression du générateur", + "The run failed: {reason}": "L'exécution a échoué : {reason}", + "{placed} of {lessons} lessons placed": "{placed} cours placés sur {lessons}", + "Generate again": "Générer à nouveau", + "Generate": "Générer", + "Every lesson has a place.": "Chaque cours a une place.", + "Lesson": "Cours", + "No free period and room": "Aucun créneau ni salle libre", + "Broken soft wishes": "Souhaits souples non respectés", + "Every soft wish is kept.": "Chaque souhait souple est respecté.", + "Wish": "Souhait", + "Lessons": "Cours", + "Generating: {percent}% of the time budget used": "Génération : {percent} % du temps utilisé", + "Waiting to start": "En attente de démarrage", + "Published as draft lessons": "Publié en cours brouillons", + "Could not read the scenario.": "Impossible de lire le scénario.", + "Could not start the run.": "Impossible de lancer l'exécution.", + "Scenarios": "Scénarios", + "Timetable scenarios": "Scénarios d'emploi du temps", + "Scenario": "Scénario", + "Take the current timetable": "Reprendre l'emploi du temps actuel", + "Could not take the current timetable.": "Impossible de reprendre l'emploi du temps actuel.", + "Broken hard wishes": "Souhaits stricts non respectés", + "Not on a period of the week grid": "Pas sur un créneau de la grille hebdomadaire", + "Compare scenarios": "Comparer des scénarios", + "Scenarios to compare": "Scénarios à comparer", + "Choose two or three scenarios to compare them.": "Choisissez deux ou trois scénarios pour les comparer.", + "Measure": "Mesure", + "Best": "Meilleur", + "Lessons that differ": "Cours qui diffèrent", + "No lesson differs.": "Aucun cours ne diffère.", + "Not placed": "Non placé", + "{period} in {room}": "{period} en {room}", + "Lessons placed": "Cours placés", + "Lessons without a place": "Cours sans place", + "Clashes": "Conflits", + "Hard wishes broken": "Souhaits stricts non respectés", + "Soft wishes broken": "Souhaits souples non respectés", + "Soft wishes broken, weighted": "Souhaits souples non respectés, pondérés", + "Free periods between lessons, all teachers": "Heures creuses, tous les enseignants", + "Most free periods of one teacher": "Plus d'heures creuses pour un enseignant", + "Most lessons of one group on a day": "Plus de cours d'un groupe en un jour", + "Room use": "Occupation des salles", + "Publish as draft lessons": "Publier comme cours brouillons", + "Draft lessons written: {count}": "Cours brouillons écrits : {count}", + "Could not publish the scenario.": "Impossible de publier le scénario.", + "Rules": "Règles", + "Rules for {column}": "Règles pour {column}", + "When a card enters this column": "Quand une carte entre dans cette colonne", + "Action": "Action", + "Set the priority": "Définir la priorité", + "Assign to": "Attribuer à", + "Assign the person who moved the card": "Attribuer à la personne qui a déplacé la carte", + "Remove the assignee": "Retirer le responsable", + "Add a label": "Ajouter une étiquette", + "No longer a project member": "N'est plus membre du projet", + "This label no longer exists": "Cette étiquette n'existe plus", + "Add rule": "Ajouter une règle", + "Remove rule": "Supprimer la règle", + "No rules yet. Add one to change a card when it enters this column.": "Aucune règle pour l'instant. Ajoutez-en une pour modifier une carte quand elle entre dans cette colonne.", + "Could not save the rules. Please try again.": "Impossible d'enregistrer les règles. Veuillez réessayer.", + "1 rule runs when a card enters this column": "1 règle s'applique quand une carte entre dans cette colonne", + "{count} rules run when a card enters this column": "{count} règles s'appliquent quand une carte entre dans cette colonne", + "Rules applied: {changes}": "Règles appliquées : {changes}", + "assigned to {name}": "attribuée à {name}", + "assignee removed": "responsable retiré", + "priority {priority}": "priorité {priority}", + "label {label}": "étiquette {label}", + "What happens to a card when it enters this column, applied in list order.": "Ce qui arrive à une carte quand elle entre dans cette colonne, dans l'ordre de la liste.", + "Value": "Valeur", + "What the rule does to the card.": "Ce que la règle fait à la carte.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "La priorité, l'identifiant d'utilisateur ou l'identifiant d'étiquette utilisé par l'action ; vide pour les actions sans valeur.", + "is not": "n'est pas", + "{dimension} is not": "{dimension} n'est pas", + "Saved filters": "Filtres enregistrés", + "No saved filters yet": "Aucun filtre enregistré", + "Save filter": "Enregistrer le filtre", + "Rename \"{name}\"": "Renommer « {name} »", + "Delete \"{name}\"": "Supprimer « {name} »", + "Clear filters": "Effacer les filtres", + "Showing {shown} of {total} tasks": "{shown} tâches affichées sur {total}", + "Me": "Moi", + "No date": "Sans date", + "Rename saved filter": "Renommer le filtre enregistré", + "Share with the project": "Partager avec le projet", + "Give the filter a name": "Donnez un nom au filtre", + "Could not save the filter. Please try again.": "Impossible d'enregistrer le filtre. Veuillez réessayer.", + "Some labels in \"{name}\" no longer exist and were left out.": "Certaines étiquettes de « {name} » n'existent plus et ont été ignorées.", + "Could not delete the filter. Please try again.": "Impossible de supprimer le filtre. Veuillez réessayer.", + "Saved filter": "Filtre enregistré", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Un filtre de tableau nommé d'un projet, visible seulement par la personne qui l'a enregistré, sauf s'il est partagé avec le projet.", + "The project whose board the filter applies to": "Le projet dont le tableau utilise le filtre", + "The name the filter is listed under": "Le nom sous lequel le filtre est listé", + "Saved by": "Enregistré par", + "Nextcloud user id of the person who saved the filter": "Identifiant Nextcloud de la personne qui a enregistré le filtre", + "Shared with the project": "Partagé avec le projet", + "Whether every project member sees and applies the filter": "Si chaque membre du projet voit et peut appliquer le filtre", + "Criteria": "Critères", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Le filtre : responsable, étiquette, priorité et échéance, chacun avec est ou n'est pas et ses valeurs", + "Cross-project view": "Vue multiprojet", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Une sélection enregistrée de projets dont les tâches sont affichées ensemble par statut, partagée avec les personnes qu'elle nomme.", + "Shared with": "Partagée avec", + "The name the view is listed under": "Le nom sous lequel la vue est listée", + "Nextcloud user id of the person who saved the view": "Identifiant Nextcloud de la personne qui a enregistré la vue", + "Nextcloud user ids of the people the view is shared with": "Identifiants Nextcloud des personnes avec qui la vue est partagée", + "The projects whose tasks the view shows, at most twenty": "Les projets dont la vue affiche les tâches, vingt au maximum", + "1 project in this view is hidden from you.": "1 projet de cette vue vous est masqué.", + "{count} projects in this view are hidden from you.": "{count} projets de cette vue vous sont masqués.", + "{project} has no column for {status}.": "{project} n'a pas de colonne pour {status}.", + "This view does not exist or is not shared with you.": "Cette vue n'existe pas ou n'est pas partagée avec vous.", + "\"{task}\" moved to {status}.": "« {task} » déplacée vers {status}.", + "Project: {title}": "Projet : {title}", + "Cross-project views": "Vues multiprojets", + "New view": "Nouvelle vue", + "Edit view": "Modifier la vue", + "Delete view": "Supprimer la vue", + "Give the view a name": "Donnez un nom à la vue", + "Pick at least one project": "Choisissez au moins un projet", + "A view shows at most {max} projects": "Une vue affiche au plus {max} projets", + "Could not save the view. Please try again.": "Impossible d'enregistrer la vue. Veuillez réessayer.", + "Could not delete the view. Please try again.": "Impossible de supprimer la vue. Veuillez réessayer.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Supprimer « {title} » ? Les projets et leurs tâches restent tels quels.", + "People see the tasks of the projects they are in, never more.": "Chacun voit les tâches des projets dont il fait partie, jamais plus.", + "No views yet. A view shows the tasks of several of your projects together.": "Aucune vue pour l'instant. Une vue affiche ensemble les tâches de plusieurs de vos projets.", + "Projects in view: {count}": "Projets dans la vue : {count}", + "Notify me when a task is assigned to me": "M'avertir quand une tâche m'est attribuée", + "Also send these to me by email": "M'envoyer aussi ces notifications par e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Ajoutez une adresse e-mail dans vos paramètres personnels Nextcloud pour recevoir des e-mails.", + "Code link": "Lien de code", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Un commit, une branche, une demande de fusion ou un ticket sur une forge de code qui concerne une tâche.", + "The task the link belongs to": "La tâche à laquelle appartient le lien", + "The project of the task": "Le projet de la tâche", + "Task key": "Clé de tâche", + "The task key the forge text named, such as VC-12": "La clé de tâche citée dans le texte de la forge, par exemple VC-12", + "What the link points at": "Ce vers quoi pointe le lien", + "Link": "Lien", + "The address of the item in the forge": "L'adresse de l'élément sur la forge", + "The commit message, branch name or merge request title": "Le message de commit, le nom de branche ou le titre de la demande de fusion", + "Repository": "Dépôt", + "The repository, such as acme/portal": "Le dépôt, par exemple acme/portal", + "Forge id": "Identifiant sur la forge", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "L'identifiant propre de l'élément sur la forge, par exemple github:acme/portal#42 ou un hash de commit", + "State": "État", + "The state of a merge request or issue": "L'état d'une demande de fusion ou d'un ticket", + "Who made the commit or opened the merge request": "Qui a fait le commit ou ouvert la demande de fusion", + "When the commit was made or the merge request last changed": "Quand le commit a été fait ou la demande de fusion a changé pour la dernière fois", + "Added by": "Ajouté par", + "Whether a person added the link or the integration wrote it": "Si une personne a ajouté le lien ou si l'intégration l'a écrit", + "Nextcloud user UIDs of project members": "Identifiants Nextcloud des membres du projet", + "Add link": "Ajouter un lien", + "Added by hand": "Ajouté à la main", + "Branch": "Branche", + "Code": "Code", + "Commit": "Commit", + "From the integration": "Par l'intégration", + "Link to a commit, branch or merge request": "Lien vers un commit, une branche ou une demande de fusion", + "Merge request": "Demande de fusion", + "Merged": "Fusionnée", + "No code linked yet. Name {key} in a commit message or paste a link.": "Aucun code lié pour l'instant. Citez {key} dans un message de commit ou collez un lien.", + "No code linked yet. Paste a link to a commit or merge request.": "Aucun code lié pour l'instant. Collez un lien vers un commit ou une demande de fusion.", + "Paste a web address that starts with https://.": "Collez une adresse web qui commence par https://.", + "Remove link {title}": "Retirer le lien {title}", + "The link could not be added.": "Le lien n'a pas pu être ajouté.", + "The link could not be removed.": "Le lien n'a pas pu être retiré.", + "This link is already on the task.": "Ce lien est déjà sur la tâche.", + "Code forges": "Forges de code", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Liez les commits et pull requests GitHub aux tâches. Integriq reçoit les événements ; planninq n'appelle jamais GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Téléchargez la configuration et importez-la dans Integriq. Saisissez ensuite un secret dans la règle \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Dans GitHub, ajoutez au dépôt un webhook avec cette adresse et le même secret. Choisissez le type de contenu application/json et les événements push et pull request :", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Citez la clé de tâche, par exemple VC-12, dans un message de commit, un nom de branche ou le titre d'une pull request. Le lien apparaît alors sur cette tâche.", + "Without Integriq, project members can still paste a link on the task page.": "Sans Integriq, les membres du projet peuvent toujours coller un lien sur la page de la tâche.", + "Download the Integriq configuration": "Télécharger la configuration Integriq", + "Calendar": "Calendrier", + "Previous": "Précédent", + "Calendar view": "Vue du calendrier", + "Starts:": "Commence :", + "No tasks with a date in this month.": "Aucune tâche datée ce mois-ci.", + "Week of {start} to {end}": "Semaine du {start} au {end}", + "My calendar": "Mon calendrier", + "Show as list": "Afficher en liste", + "Show as calendar": "Afficher en calendrier", + "Open my calendar": "Ouvrir mon calendrier", + "Nextcloud Tasks": "Tâches Nextcloud", + "Show my tasks in Nextcloud Tasks": "Afficher mes tâches dans Tâches Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Les tâches qui vous sont attribuées ou partagées avec vous apparaissent dans une liste « Planninq » dans Tâches et Agenda de Nextcloud. Les modifications faites là-bas sont remplacées à la prochaine modification dans Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ce serveur ne peut pas écrire dans Tâches Nextcloud, l'export n'est donc pas disponible.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Géré par Planninq. Les modifications faites ici sont remplacées à la prochaine modification dans Planninq.", + "Working days and holidays": "Jours ouvrés et jours fériés", + "Dates set on the timeline skip the days that are not working days.": "Les dates posées sur la chronologie sautent les jours non ouvrés.", + "Working weekdays": "Jours ouvrés de la semaine", + "Non-working days": "Jours non ouvrés", + "No non-working days yet.": "Aucun jour non ouvré pour l'instant.", + "Add day": "Ajouter un jour", + "Year": "Année", + "Add Dutch national holidays": "Ajouter les jours fériés néerlandais", + "Save working days": "Enregistrer les jours ouvrés", + "Choose at least one working weekday.": "Choisissez au moins un jour ouvré.", + "Working days saved.": "Jours ouvrés enregistrés.", + "Could not save the working days.": "Impossible d'enregistrer les jours ouvrés.", + "New Year's Day": "Jour de l'An", + "Easter Sunday": "Dimanche de Pâques", + "Easter Monday": "Lundi de Pâques", + "King's Day": "Fête du Roi", + "Liberation Day": "Jour de la Libération", + "Ascension Day": "Ascension", + "Whit Sunday": "Dimanche de Pentecôte", + "Whit Monday": "Lundi de Pentecôte", + "Christmas Day": "Noël", + "Boxing Day": "Lendemain de Noël", + "Dates of {title}": "Dates de {title}", + "The due date cannot be before the start date.": "La date d'échéance ne peut pas précéder la date de début.", + "{title}, from {start} to {end}": "{title}, du {start} au {end}", + "The dates could not be saved.": "Impossible d'enregistrer les dates.", + "{title} now runs from {start} to {end}": "{title} court maintenant du {start} au {end}", + "Auto-scheduling": "Planification automatique", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Si activé, reporter une échéance sur la chronologie propose de décaler aussi les tâches qu'elle bloque.", + "Move blocked tasks along when a task slips": "Décaler les tâches bloquées quand une tâche prend du retard", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Sur la chronologie, une échéance plus tardive propose de décaler les tâches bloquées. Seuls les liens « bloque » comptent, et les tâches ne sont décalées que vers plus tard.", + "Move the tasks that wait for {title}?": "Décaler les tâches qui attendent {title} ?", + "These tasks wait for it and would start after its new due date:": "Ces tâches l'attendent et commenceraient après sa nouvelle échéance :", + "{count} tasks would move; the first {limit} are listed.": "{count} tâches seraient décalées ; les {limit} premières sont listées.", + "Now": "Maintenant", + "After the move": "Après le décalage", + "Only this task": "Seulement cette tâche", + "Move all": "Tout décaler", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Arrêté à {title} : ses dates n'ont pas pu être enregistrées. Les tâches précédentes ont été décalées.", + "Cumulative flow": "Flux cumulé", + "Show as chart": "Afficher en graphique", + "Show as table": "Afficher en tableau", + "Tasks per column per day": "Tâches par colonne et par jour", + "Tasks without recorded history in this period: {count}": "Tâches sans historique enregistré sur cette période : {count}", + "Lead and cycle time": "Délai et temps de cycle", + "No tasks were finished in this period.": "Aucune tâche n'a été terminée sur cette période.", + "Finished tasks": "Tâches terminées", + "Cycle time, average": "Temps de cycle, moyenne", + "Cycle time, 85th percentile": "Temps de cycle, 85e centile", + "Lead time, average": "Délai, moyenne", + "Tasks whose finish time was estimated from their history: {count}": "Tâches dont l'heure de fin a été estimée à partir de l'historique : {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Temps de cycle de chaque tâche terminée, avec la moyenne et le 85e centile", + "Slowest tasks": "Tâches les plus lentes", + "cycle {cycle}, lead {lead}": "cycle {cycle}, délai {lead}", + "{days} days": "{days} jours", + "Could not load the flow of this project.": "Impossible de charger le flux de ce projet.", + "Last {days} days": "{days} derniers jours", + "Portfolio flow": "Flux du portefeuille", + "An admin adds portfolios under Projects, Portfolios.": "Un administrateur ajoute des portefeuilles sous Projets, Portefeuilles.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projets non affichés, car 50 au plus sont affichés à la fois : {count}", + "Could not load the flow of this portfolio.": "Impossible de charger le flux de ce portefeuille.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flux cumulé et temps de cycle sur les projets d'un portefeuille.", + "Edit report": "Modifier le rapport", + "Only tasks where": "Seulement les tâches où", + "Group by": "Grouper par", + "Display": "Affichage", + "Share with everyone who can read its projects": "Partager avec toute personne pouvant lire ses projets", + "The report could not be saved.": "Le rapport n'a pas pu être enregistré.", + "Number of tasks": "Nombre de tâches", + "Bar": "Barres", + "Donut": "Anneau", + "Table": "Tableau", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} des {total} projets de ce rapport ne vous sont pas visibles", + "No tasks match this report.": "Aucune tâche ne correspond à ce rapport.", + "None": "Aucun", + "Could not load this report.": "Impossible de charger ce rapport.", + "Report": "Rapport", + "Your reports": "Vos rapports", + "My reports": "Mes rapports", + "Shared reports": "Rapports partagés", + "You have not built a report yet.": "Vous n'avez encore créé aucun rapport.", + "Nobody has shared a report with you yet.": "Personne n'a encore partagé de rapport avec vous.", + "Reports you built over tasks, and the ones shared with you.": "Les rapports que vous avez créés sur les tâches, et ceux partagés avec vous.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Une requête enregistrée sur les tâches : quels projets, quels filtres, groupée par quoi, comptée ou additionnée, et affichée en tableau ou en graphique.", + "The name the report is listed under": "Le nom sous lequel le rapport est listé", + "What the report shows and who it is for": "Ce que montre le rapport et pour qui il est", + "Nextcloud user id of the person who saved the report": "Identifiant Nextcloud de la personne qui a enregistré le rapport", + "Who can open the report": "Qui peut ouvrir le rapport", + "Only me": "Moi seul", + "Everyone who can read its projects": "Toute personne pouvant lire ses projets", + "The projects the report covers, at most fifty": "Les projets couverts par le rapport, cinquante au plus", + "Filters": "Filtres", + "Task fields and the value each must equal": "Champs de tâche et la valeur que chacun doit égaler", + "The task field the report groups on": "Le champ de tâche sur lequel le rapport groupe", + "Count the tasks, or add up a number on them": "Compter les tâches, ou additionner un nombre sur elles", + "Sum": "Somme", + "Sum of": "Somme de", + "The number added up when the measure is a sum": "Le nombre additionné quand la mesure est une somme", + "Story points": "Points d'effort", + "Estimated duration": "Durée estimée", + "How the report is shown": "Comment le rapport est affiché", + "Issue type": "Type de ticket", + "Task fields and the value each must equal; empty when the report covers every task": "Champs de tâche et la valeur que chacun doit avoir ; vide si le rapport couvre toutes les tâches", + "The status a task must have": "Le statut qu'une tâche doit avoir", + "The priority a task must have": "La priorité qu'une tâche doit avoir", + "The user a task must be assigned to": "L'utilisateur auquel une tâche doit être assignée", + "A label a task must carry": "Une étiquette qu'une tâche doit porter", + "The board column a task must be in": "La colonne du tableau où une tâche doit se trouver", + "The issue type a task must have": "Le type de ticket qu'une tâche doit avoir", + "Manager groups": "Groupes gestionnaires", + "Member groups": "Groupes membres", + "Viewer groups": "Groupes lecteurs", + "Viewers": "Lecteurs", + "Owning group": "Groupe propriétaire", + "Nextcloud groups whose members manage the project": "Groupes Nextcloud dont les membres gèrent le projet", + "Nextcloud groups whose members work on the project": "Groupes Nextcloud dont les membres travaillent sur le projet", + "Nextcloud groups whose members may read the project": "Groupes Nextcloud dont les membres peuvent lire le projet", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utilisateurs Nextcloud qui gèrent le projet : paramètres, membres et travail", + "Nextcloud user ids who may read the project and its work but not change it": "Utilisateurs Nextcloud qui peuvent lire le projet et son travail sans le modifier", + "The Nextcloud group that owns the project with its creator, at most one": "Le groupe Nextcloud qui possède le projet avec son créateur, un au plus", + "Nextcloud user ids who may read this through the project": "Utilisateurs Nextcloud qui peuvent lire ceci via le projet", + "Nextcloud groups whose members may change this through the project": "Groupes Nextcloud dont les membres peuvent modifier ceci via le projet", + "Nextcloud groups whose members may read this through the project": "Groupes Nextcloud dont les membres peuvent lire ceci via le projet", + "Search for a person or a group…": "Rechercher une personne ou un groupe…", + "No one found. Your admin's sharing settings decide who you can find.": "Personne n’a été trouvé. Les paramètres de partage de votre administrateur déterminent qui vous pouvez trouver.", + "Type at least two characters": "Saisissez au moins deux caractères", + "Everyone in this group": "Tout le monde dans ce groupe", + "Could not search for people. Please try again.": "La recherche de personnes a échoué. Veuillez réessayer.", + "Could not remove the group": "Impossible de retirer le groupe", + "Only the owner and managers change who is on this project.": "Seuls le propriétaire et les gestionnaires changent qui fait partie de ce projet.", + "Role of {name}": "Rôle de {name}", + "Manager": "Gestionnaire", + "Member": "Membre", + "Viewer": "Lecteur", + "Could not change the role": "Impossible de modifier le rôle", + "Owned by group: {name}": "Propriété du groupe : {name}", + "No group owns this project.": "Aucun groupe ne possède ce projet.", + "Owned by group": "Propriété du groupe", + "Search for a group…": "Rechercher un groupe…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Aucun groupe trouvé. Les paramètres de partage de votre administrateur déterminent les groupes que vous pouvez trouver.", + "No owning group": "Aucun groupe propriétaire", + "Could not search for groups. Please try again.": "Impossible de rechercher des groupes. Veuillez réessayer.", + "Could not change the owning group": "Impossible de modifier le groupe propriétaire", + "You can read this project. Only its members change it.": "Vous pouvez lire ce projet. Seuls ses membres le modifient.", + "Course": "Cours", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Le cours enseigné dans cette leçon, par exemple une option, lorsque l'application d'apprentissage de l'école le connaît.", + "Online meeting link": "Lien de la leçon en ligne", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Où les élèves rejoignent cette leçon en ligne. Le bouton Rejoindre n'apparaît que pour un lien https." }, "plurals": null } diff --git a/l10n/ga.js b/l10n/ga.js index 0f8b7f73..1078724b 100644 --- a/l10n/ga.js +++ b/l10n/ga.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Tionscadail ghníomhacha", + "Archived projects": "Tionscadail chartlainne", + "Boards": "Cláir", + "My projects": "Mo thionscadail", + "Portfolio": "Punann", + "Project board": "Clár an tionscadail", + "Projects I am in": "Tionscadail a bhfuil baint agam leo", + "Timeline": "Amlíne", + "Timesheet": "Bileog ama", + "Features & roadmap": "Gnéithe agus treochlár", + "Flow": "Sruth", + "Flows": "Sruthanna", + "Reports": "Tuairiscí", + "Pick a report to open it.": "Roghnaigh tuairisc chun í a oscailt.", + "In progress": "Ar siúl", + "Date": "Dáta", + "Due": "Spriocdháta", + "Assignee": "Sannta do", + "Who": "Cé", + "What": "Cad", + "Minutes": "Nóiméad", + "Entries": "Iontrálacha", + "Most recent": "Is déanaí", + "Per person": "In aghaidh an duine", + "By status": "De réir stádais", + "By priority": "De réir tosaíochta", + "Task status": "Stádas tascanna", + "Time spent": "Am caite", + "Capacity": "Cumas", + "Due soonest": "Spriocdháta is luaithe", + "Minutes logged": "Nóiméid taifeadta", + "Nothing is due": "Níl aon rud dlite", + "Nothing logged yet": "Níl aon rud taifeadta go fóill", + "What is open, what is blocked, and what is overdue.": "Cad atá oscailte, cad atá bactha, agus cad atá thar téarma.", + "How allocation is spread across the people working on projects.": "Conas atá an t-ualach roinnte ar na daoine a oibríonn ar thionscadail.", + "Hours logged, and the projects they went to.": "Na huaireanta taifeadta agus na tionscadail chucu.", + "Billable": "Inmhuirearaithe", + "Budget: {amount}": "Buiséad: {amount}", + "Loading projects": "Tionscadail á luchtú", + "No projects for this client yet": "Níl aon tionscadal ann fós don chliant seo", + "Open in Planninq": "Oscail i Planninq", + "This project could not be found": "Níorbh fhéidir an tionscadal seo a aimsiú", + "Untitled project": "Tionscadal gan teideal", + "and {count} more": "agus {count} eile", + "Store": "Siopa", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Suiteáil cláir, scéimeanna agus sruthanna a d'fhoilsigh eagraíochtaí eile.", + "Work Date": "Dáta oibre", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Gníomhartha colúin", + "Columns": "Colúin", + "Could not remove the column. Please try again.": "Níorbh fhéidir an colún a bhaint. Bain triail eile as.", + "Could not save the column. Please try again.": "Níorbh fhéidir an colún a shábháil. Bain triail eile as.", + "Done column": "Colún críochnaithe", + "Edit column": "Cuir an colún in eagar", + "Keep the card's status": "Coinnigh stádas an chárta", + "Move its cards to": "Bog a chártaí go", + "Move left": "Bog ar chlé", + "Move right": "Bog ar dheis", + "Status of cards moved here": "Stádas na gcártaí a bhogtar anseo", + "The last done column cannot be removed.": "Ní féidir an colún críochnaithe deireanach a bhaint.", + "WIP limit": "Teorainn WIP", + "over limit": "os cionn na teorann", + "The status a card gets when it is moved into this column.": "An stádas a fhaigheann cárta nuair a bhogtar isteach sa cholún seo é.", + "All priorities": "Gach tosaíocht", + "Could not create the task. Please try again.": "Níorbh fhéidir an tasc a chruthú. Bain triail eile as.", + "Created": "Cruthaithe", + "Move to backlog": "Chuig an mbacliosta", + "Move to board": "Chuig an gclár", + "New task": "Tasc nua", + "Nothing in the backlog": "Níl aon rud sa bhacliosta", + "Rank": "Rangú", + "Sort by": "Sórtáil de réir", + "Sort by rank to reorder": "Sórtáil de réir rangaithe chun an t-ord a athrú", + "Task actions": "Gníomhartha taisc", + "All labels": "Gach lipéad", + "Filter tasks by label": "Scag tascanna de réir lipéid", + "View timeline": "Féach ar an amlíne", + "Board": "Clár", + "List": "Liosta", + "Column": "Colún", + "Board or list": "Clár nó liosta", + "Log": "Loga", + "Add entry": "Cuir iontráil leis", + "Show": "Taispeáin", + "No actions yet": "Níl aon ghníomhartha fós", + "Closed": "Dúnta", + "Entry actions": "Gníomhartha iontrála", + "Add action": "Cuir gníomh leis", + "by {author}": "le {author}", + "saved {time}": "sábháilte {time}", + "Attendees: {names}": "Lucht freastail: {names}", + "Add the first entry": "Cuir an chéad iontráil leis", + "Issues": "Saincheisteanna", + "Lessons learned": "Ceachtanna foghlamtha", + "Meetings": "Cruinnithe", + "Decisions": "Cinntí", + "Actions": "Gníomhartha", + "Issue": "Saincheist", + "Lesson learned": "Ceacht foghlamtha", + "Meeting": "Cruinniú", + "Decision": "Cinneadh", + "About this project": "Faoin tionscadal seo", + "No description yet": "Níl aon chur síos fós", + "Start date": "Dáta tosaigh", + "Not set": "Gan socrú", + "End date": "Dáta deiridh", + "Progress": "Dul chun cinn", + "No tasks yet": "Níl aon tascanna fós", + "Open the board": "Oscail an clár", + "People": "Daoine", + "Owner": "Úinéir", + "Latest log entries": "Na hiontrálacha is déanaí", + "Open the log": "Oscail an loga", + "{done} of {total} tasks done": "{done} as {total} tasc déanta", + "Edit entry": "Cuir an iontráil in eagar", + "Type": "Cineál", + "Attendees": "Lucht freastail", + "Issue is closed": "Tá an tsaincheist dúnta", + "Could not save the entry. Please try again.": "Níorbh fhéidir an iontráil a shábháil. Bain triail eile as.", + "From: {title}": "Ó: {title}", + "What needs to happen": "Cad is gá a dhéanamh", + "Could not create the action. Please try again.": "Níorbh fhéidir an gníomh a chruthú. Bain triail eile as.", + "The action was created but could not be linked to the entry.": "Cruthaíodh an gníomh ach níorbh fhéidir é a nascadh leis an iontráil.", + "Project pages": "Leathanaigh an tionscadail", + "Overview": "Forbhreathnú", + "Risks": "Rioscaí", + "Log entry": "Iontráil loga", + "A short name for the entry": "Ainm gearr don iontráil", + "Project": "Tionscadal", + "The project this entry belongs to": "An tionscadal lena mbaineann an iontráil seo", + "What kind of entry this is": "Cén cineál iontrála é seo", + "When it happened": "Cathain a tharla sé", + "What happened, in Markdown": "Cad a tharla, i Markdown", + "Whether an issue is still open": "An bhfuil saincheist fós oscailte", + "The people at a meeting": "Na daoine ag cruinniú", + "Tasks that came out of this entry": "Tascanna a d'eascair ón iontráil seo", + "Add risk": "Cuir riosca leis", + "Risk": "Riosca", + "Score": "Scór", + "Response": "Freagairt", + "Review date": "Dáta athbhreithnithe", + "no longer on the project": "níl sé ar an tionscadal a thuilleadh", + "Edit {title}": "Cuir {title} in eagar", + "No risks recorded yet": "Níl aon rioscaí taifeadta fós", + "Add the first risk": "Cuir an chéad riosca leis", + "Medium": "Meánach", + "Mitigating": "Á mhaolú", + "Occurred": "Tharla", + "Avoid": "Seachain", + "Reduce": "Laghdaigh", + "Transfer": "Aistrigh", + "Accept": "Glac leis", + "Highest open risks": "Na rioscaí oscailte is airde", + "No open risks": "Níl aon rioscaí oscailte", + "Open the risk register": "Oscail an clár rioscaí", + "Edit risk": "Cuir riosca in eagar", + "What could go wrong": "Cad a d'fhéadfadh dul mícheart", + "Likelihood": "Dóchúlacht", + "Impact": "Tionchar", + "Score {score}": "Scór {score}", + "Countermeasures": "Frithbhearta", + "Could not save the risk. Please try again.": "Níorbh fhéidir an riosca a shábháil. Bain triail eile as.", + "Risks by likelihood and impact": "Rioscaí de réir dóchúlachta agus tionchair", + "Risk scale": "Scála riosca", + "The levels every project scores its risks on, and where low turns into medium and high": "Na leibhéil ar a scórálann gach tionscadal a rioscaí, agus an áit a n-éiríonn íseal ina mheánach agus ina ard", + "Number of levels": "Líon na leibhéal", + "Likelihood labels": "Lipéid dóchúlachta", + "Impact labels": "Lipéid tionchair", + "Level {level}": "Leibhéal {level}", + "Medium from score": "Meánach ón scór", + "High from score": "Ard ón scór", + "Risk scale saved": "Sábháladh an scála riosca", + "1 risk uses level {level}. Change it first.": "Úsáideann 1 riosca leibhéal {level}. Athraigh é ar dtús.", + "{count} risks use level {level}. Change them first.": "Úsáideann {count} riosca leibhéal {level}. Athraigh iad ar dtús.", + "Every level needs a label, and high must start above medium.": "Tá lipéad de dhíth ar gach leibhéal, agus caithfidh ard tosú os cionn meánach.", + "The project this risk belongs to": "An tionscadal lena mbaineann an riosca seo", + "The cause and the effect, in Markdown": "An chúis agus an toradh, i Markdown", + "Category": "Catagóir", + "A free grouping, such as planning, budget or supplier": "Grúpáil shaor, mar phleanáil, buiséad nó soláthraí", + "How likely it is, on the admin's risk scale": "Cé chomh dóchúil is atá sé, ar scála riosca an riarthóra", + "How hard it would hit, on the admin's risk scale": "Cé chomh crua is a bhuailfeadh sé, ar scála riosca an riarthóra", + "Likelihood times impact, calculated by the server": "Dóchúlacht faoi thionchar, arna ríomh ag an bhfreastalaí", + "Where the risk stands": "Cá bhfuil an riosca", + "The person who watches this risk": "An duine a choinníonn súil ar an riosca seo", + "How the project answers the risk": "Conas a fhreagraíonn an tionscadal an riosca", + "What is done to prevent it or soften it, in Markdown": "Cad a dhéantar chun é a chosc nó a mhaolú, i Markdown", + "When to look at this risk again": "Cathain an riosca a athbhreithniú", + "Very low": "An-íseal", + "Very high": "An-ard", + "All projects": "Gach tionscadal", + "Project status report": "Tuarascáil stádais tionscadail", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Tuarascáil dhátaithe ar an gcaoi a bhfuil tionscadal ó thaobh airgid, eagraíochta, ama, faisnéise, cáilíochta agus riosca (gnéithe GROTIK), gach ceann le nóta.", + "The project this report is about": "An tionscadal a bhfuil an tuarascáil faoi", + "Report date": "Dáta na tuarascála", + "The day the report describes": "An lá a chuireann an tuarascáil síos air", + "Money": "Airgead", + "How the project stands on this aspect": "Conas atá an tionscadal ó thaobh na gné seo", + "On track": "De réir an phlean", + "At risk": "I mbaol", + "Off track": "As an bplean", + "Money note": "Nóta ar airgead", + "A short explanation of this status": "Míniú gearr ar an stádas seo", + "Organisation": "Eagraíocht", + "Organisation note": "Nóta ar eagraíocht", + "Time": "Am", + "Time note": "Nóta ar am", + "Information": "Faisnéis", + "Information note": "Nóta ar fhaisnéis", + "Quality": "Cáilíocht", + "Quality note": "Nóta ar cháilíocht", + "Risk note": "Nóta ar riosca", + "Overall": "Iomlán", + "The worst of the six statuses, calculated by the server": "An ceann is measa de na sé stádas, ríofa ag an bhfreastalaí", + "Health: money": "Sláinte: airgead", + "Copied from the newest status report": "Cóipeáilte ón tuarascáil stádais is déanaí", + "Health: organisation": "Sláinte: eagraíocht", + "Health: time": "Sláinte: am", + "Health: information": "Sláinte: faisnéis", + "Health: quality": "Sláinte: cáilíocht", + "Health: risk": "Sláinte: riosca", + "Health: overall": "Sláinte: iomlán", + "Health: report date": "Sláinte: dáta na tuarascála", + "The date of the newest status report": "Dáta na tuarascála stádais is déanaí", + "New report": "Tuarascáil nua", + "Only the project owner writes status reports.": "Ní scríobhann ach úinéir an tionscadail tuarascálacha stádais.", + "Latest report, {date}": "An tuarascáil is déanaí, {date}", + "Aspect": "Gné", + "Note": "Nóta", + "Report history": "Stair na dtuarascálacha", + "Author": "Údar", + "No status reports yet": "Níl aon tuarascáil stádais fós", + "Write the first report": "Scríobh an chéad tuarascáil", + "Choose a status for every aspect to save the report.": "Roghnaigh stádas do gach gné chun an tuarascáil a shábháil.", + "Suggested: on track.": "Moladh: de réir an phlean.", + "Suggested: at risk.": "Moladh: i mbaol.", + "Suggested: off track.": "Moladh: as an bplean.", + "1 task is past its due date.": "Tá 1 tasc thar a spriocdháta.", + "{count} tasks are past their due date.": "Tascanna thar a spriocdháta: {count}.", + "The end date has passed with 1 open task.": "Tá an dáta deiridh caite agus 1 tasc oscailte.", + "The end date has passed with {count} open tasks.": "Tá an dáta deiridh caite, tascanna oscailte: {count}.", + "No open task is past its due date.": "Níl aon tasc oscailte thar a spriocdháta.", + "The highest open risk, \"{title}\", scores {score}.": "Tá scór {score} ag an riosca oscailte is airde, \"{title}\".", + "There are no open risks.": "Níl aon riosca oscailte.", + "Costs are at {percent}% of the budget.": "Tá na costais ag {percent}% den bhuiséad.", + "No suggestion: the project has no budget.": "Gan mholadh: níl buiséad ag an tionscadal.", + "No suggestion: no costs are recorded for this project yet.": "Gan mholadh: níl aon chostas taifeadta don tionscadal seo fós.", + "The report was not saved. Only the project owner can write status reports.": "Níor sábháladh an tuarascáil. Ní féidir ach le húinéir an tionscadail tuarascálacha stádais a scríobh.", + "No report": "Gan tuarascáil", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Grúpa tionscadal a reáchtálann na daoine céanna, mar roinn nó clár. Léann a bhainisteoirí gach tionscadal ann.", + "The name of the portfolio": "Ainm na punainne", + "What the portfolio holds and who runs it": "Cad atá sa phunann agus cé a reáchtálann í", + "A colour for the portfolio's section in project lists": "Dath do chuid na punainne i liostaí tionscadal", + "Managers": "Bainisteoirí", + "Nextcloud user UIDs of the people who run the portfolio": "Aitheantais úsáideora Nextcloud na ndaoine a reáchtálann an phunann", + "Order": "Ord", + "Where the portfolio comes in project lists, lowest first": "Áit na punainne i liostaí tionscadal, an ceann is ísle ar dtús", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Scála riosca na punainne seo féin mar JSON, sa chruth céanna le scála an aip ar fad. Ciallaíonn folamh scála an aip.", + "Portfolio readers": "Léitheoirí na punainne", + "Nextcloud user UIDs of the managers of the project's portfolio": "Aitheantais úsáideora Nextcloud bhainisteoirí phunann an tionscadail", + "The portfolio this project belongs to": "An phunann lena mbaineann an tionscadal seo", + "No portfolio": "Gan punann", + "All portfolios": "Gach punann", + "You read this project as a manager of its portfolio. Only its members change it.": "Léann tú an tionscadal seo mar bhainisteoir ar a phunann. Ní athraíonn ach a bhaill é.", + "Portfolios": "Punanna", + "Portfolio status": "Stádas na punainne", + "No portfolios yet": "Níl aon phunann fós", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Cuireann riarthóir punanna leis faoi Tionscadail, Punanna. Liostaítear tionscadail punainne anseo lena stádas.", + "Roll-up": "Achoimre", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} ar an sprioc, {atRisk} i mbaol, {offTrack} as an sprioc, {noReport} gan tuairisc", + "No project in this portfolio that you can read.": "Níl aon tionscadal sa phunann seo is féidir leat a léamh.", + "Start": "Tús", + "End": "Deireadh", + "Budget": "Buiséad", + "Last report": "Tuairisc dheireanach", + "Out of date": "As dáta", + "Portfolio timeline": "Amlíne na punainne", + "Zoom": "Súmáil", + "Could not load the timeline": "Níorbh fhéidir an amlíne a lódáil", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Cuireann riarthóir punanna leis faoi Tionscadail, Punanna. Taispeántar tionscadail punainne anseo ar amlíne amháin.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Oscail tionscadal chun a chéimeanna agus a thascanna a fheiceáil. Is le léamh amháin an amlíne.", + "Phase: {title}": "Céim: {title}", + "Left out because you cannot read them: {count} projects": "Fágtha ar lár mar nach féidir leat iad a léamh: {count} tionscadal", + "Week": "Seachtain", + "Day": "Lá", + "Month": "Mí", + "Please try again later.": "Bain triail eile as ar ball.", + "Status reports": "Tuairiscí stádais", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Tar éis cé mhéad lá a mharcáiltear an tuairisc stádais is déanaí de thionscadal as dáta i bhforbhreathnú na punainne", + "Reporting period (days)": "Tréimhse tuairiscithe (laethanta)", + "The reporting period is a whole number of days from 1 to 365.": "Is slánuimhir laethanta ó 1 go 365 an tréimhse tuairiscithe.", + "Reporting period saved": "Tréimhse tuairiscithe sábháilte", + "The reporting period was not saved. Please try again.": "Níor sábháladh an tréimhse tuairiscithe. Bain triail eile as.", + "Every project of a portfolio with its status per aspect, rolled up.": "Gach tionscadal de phunann lena stádas de réir gné, achoimrithe.", + "The projects of a portfolio on one timeline.": "Tionscadail punainne ar amlíne amháin.", + "Phases": "Céimeanna", + "Add phase": "Cuir céim leis", + "No phases yet": "Níl aon chéim fós", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Roinn an tionscadal ina chéimeanna, mar thionscnamh, sainmhíniú agus cur i bhfeidhm. Dúnann céim nuair a uaslódáiltear a doiciméad deiridh.", + "{hours} hours": "{hours} uair", + "Concluding document: {title}": "Doiciméad deiridh: {title}", + "Concluding document missing": "Doiciméad deiridh ar iarraidh", + "Move {title} up": "Bog {title} suas", + "Move {title} down": "Bog {title} síos", + "Close phase": "Dún an chéim", + "Phase": "Céim", + "Files": "Comhaid", + "Notes": "Nótaí", + "Audit trail": "Rian iniúchta", + "Edit phase": "Cuir an chéim in eagar", + "Name": "Ainm", + "Budget hours": "Uaireanta buiséid", + "Could not save the phase. Please try again.": "Níorbh fhéidir an chéim a shábháil. Bain triail eile as.", + "Close phase {title}": "Dún an chéim {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Dúnann céim lena doiciméad deiridh: uaslódáil anseo é nó roghnaigh ceann de chomhaid na céime.", + "Concluding document": "Doiciméad deiridh", + "This phase has no files yet.": "Níl aon chomhad ag an gcéim seo fós.", + "Upload a document": "Uaslódáil doiciméad", + "The document was not uploaded. Please try again.": "Níor uaslódáladh an doiciméad. Bain triail eile as.", + "Upload the concluding document before you close this phase.": "Uaslódáil an doiciméad deiridh sula ndúnann tú an chéim seo.", + "This phase cannot be closed from its current status.": "Ní féidir an chéim seo a dhúnadh óna stádas reatha.", + "The phase was not closed. Please try again.": "Níor dúnadh an chéim. Bain triail eile as.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Aitheantas an chomhaid ar an gcéim seo a chríochnaíonn í. Ní féidir an chéim a chríochnú go dtí go bhfuil sé socraithe agus an comhad ceangailte.", + "Import from Microsoft Project": "Iompórtáil ó Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Roghnaigh plean a sábháladh ó Microsoft Project i bhformáid XML. Ní iompórtáiltear aon rud go dtí go ndeimhníonn tú.", + "Plan file": "Comhad an phlean", + "What the import creates": "An méid a chruthaíonn an iompórtáil", + "Tasks": "Tascanna", + "Sub-tasks": "Fothascanna", + "Milestones": "Clocha míle", + "Links": "Naisc", + "Already imported, updated in place: {count}": "Iompórtáilte cheana, nuashonraithe ina n-áit: {count}", + "What does not carry over": "An méid nach n-aistrítear", + "Tasks with resources, which are not imported: {count}": "Tascanna le hacmhainní, nach n-iompórtáiltear: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tascanna níos doimhne ná leibhéal 3, curtha faoina dtasc ag leibhéal 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Naisc seachas críoch-go-tús, iompórtáilte mar naisc ghaolmhara: {count}", + "Link lags, which are dropped: {count}": "Moilleanna nasc, a ligtear ar lár: {count}", + "Links to a summary task, which are not imported: {count}": "Naisc le tasc achomair, nach n-iompórtáiltear: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Naisc le tascanna lasmuigh den phlean seo, nach n-iompórtáiltear: {count}", + "No longer in the plan": "Níl sé sa phlean a thuilleadh", + "These stay in the project; remove them yourself if they are no longer needed.": "Fanann siad sa tionscadal; bain féin iad mura bhfuil gá leo a thuilleadh.", + "Import": "Iompórtáil", + "Close": "Dún", + "The plan is imported: {created} created, {updated} updated.": "Tá an plean iompórtáilte: {created} cruthaithe, {updated} nuashonraithe.", + "Links that would close a loop were left out: {count}": "Fágadh ar lár naisc a dhúnfadh lúb: {count}", + "The import stopped part-way. Run it again to finish it.": "Stad an iompórtáil leath bealaigh. Rith arís í chun í a chríochnú.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Sábháil an plean i Microsoft Project le Comhad, Sábháil mar, formáid XML, agus iompórtáil an comhad sin.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Fógraíonn an comhad seo DOCTYPE nó aonáin, nach nglactar leo.", + "The file is larger than 10 MB.": "Tá an comhad níos mó ná 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Tá níos mó ná 2,000 tasc sa phlean, níos mó ná a ghlacann iompórtáil amháin.", + "This file is not a Microsoft Project plan in XML format.": "Ní plean Microsoft Project i bhformáid XML é an comhad seo.", + "Choose a file to import.": "Roghnaigh comhad le hiompórtáil.", + "Only the project owner can import a plan.": "Ní féidir ach le húinéir an tionscadail plean a iompórtáil.", + "The plan could not be read. Please try again.": "Níorbh fhéidir an plean a léamh. Bain triail eile as.", + "Linked case: {title}": "Cás nasctha: {title}", + "Linked to a case": "Nasctha le cás", + "Hand over to case": "Tabhair don chás", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Cóipeálann sé gach comhad den tionscadal agus dá thascanna, agus comhad a chuireann síos ar an tionscadal, gan athrú chuig an gcás nasctha.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Comhaid cóipeáilte: {count}", + "Files that failed: {names}": "Comhaid a theip: {names}", + "The handover failed. Please try again.": "Theip ar an tabhairt. Bain triail eile as.", + "The linked case could not be found, or you cannot open it.": "Níor aimsíodh an cás nasctha, nó ní féidir leat é a oscailt.", + "Case handovers": "Tabhairtí don chás", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Gach uair a tugadh comhaid agus meiteashonraí an tionscadail dá chás: cathain, cé, cén cás, gach comhad cóipeáilte lena SHA-256, agus na comhaid a theip.", + "Finance": "Airgeadas", + "Add cost line": "Cuir líne costais leis", + "Delivery terms": "Téarmaí seachadta", + "Billing model": "Samhail bhillí", + "Budget in euro": "Buiséad in euro", + "Budget in hours": "Buiséad in uaireanta", + "Hourly rate in euro": "Ráta in aghaidh na huaire in euro", + "Planned start": "Tús pleanáilte", + "Planned end": "Deireadh pleanáilte", + "Planned dates": "Dátaí pleanáilte", + "Budget {amount}": "Buiséad {amount}", + "No budget agreed": "Níor comhaontaíodh buiséad", + "Hours": "Uaireanta", + "Only the project owner and the portfolio managers see the amounts.": "Ní fheiceann ach úinéir an tionscadail agus bainisteoirí na punainne na suimeanna.", + "Budget against cost per category": "Buiséad i gcoinne costais de réir catagóire", + "Labour (booked time)": "Saothar (am taifeadta)", + "No category": "Gan catagóir", + "Hours are not available": "Níl na huaireanta ar fáil", + "Not yet assigned to a category": "Gan sannadh do chatagóir fós", + "Total": "Iomlán", + "{spent} spent, {remaining} remaining": "{spent} caite, {remaining} fágtha", + "Budget against cost per phase": "Buiséad i gcoinne costais de réir céime", + "No phase": "Gan chéim", + "Cost lines": "Línte costais", + "From the finance system": "Ón gcóras airgeadais", + "Edit cost line {amount}": "Cuir an líne costais {amount} in eagar", + "No cost lines yet": "Níl aon línte costais fós", + "Commitments": "Gealltanais", + "Actual cost": "Costas iarbhír", + "Forecast": "Réamhaisnéis", + "Remaining": "Fágtha", + "Not planned yet": "Níl sé pleanáilte fós", + "{start} to {end}": "{start} go {end}", + "The terms were not saved. Please try again.": "Níor sábháladh na téarmaí. Bain triail eile as.", + "Terms saved": "Téarmaí sábháilte", + "Fixed price": "Praghas seasta", + "Hourly": "In aghaidh na huaire", + "Not billed": "Gan bhilleáil", + "Commitment": "Gealltanas", + "Edit cost line": "Cuir líne costais in eagar", + "Kind": "Cineál", + "Amount in euro": "Suim in euro", + "Remove": "Bain", + "Could not save the cost line. Only the project owner changes the money of a project.": "Níorbh fhéidir an líne costais a shábháil. Ní athraíonn ach úinéir an tionscadail airgead tionscadail.", + "Could not remove the cost line. Please try again.": "Níorbh fhéidir an líne costais a bhaint. Bain triail eile as.", + "{amount} over budget": "{amount} thar an mbuiséad", + "Cost categories": "Catagóirí costais", + "The categories every project splits its budget and costs into, one per line": "Na catagóirí ina roinneann gach tionscadal a bhuiséad agus a chostais, ceann in aghaidh an líne", + "Categories": "Catagóirí", + "Give at least one category, each name once.": "Tabhair catagóir amháin ar a laghad, gach ainm uair amháin.", + "Cost categories saved": "Catagóirí costais sábháilte", + "The cost categories were not saved. Please try again.": "Níor sábháladh na catagóirí costais. Bain triail eile as.", + "Finance line": "Líne airgeadais", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Suim airgid amháin ar thionscadal: buiséad, gealltanas, costas iarbhír nó réamhaisnéis, i gcatagóir costais agus i gcéim más mian. Iontráilte ag úinéir an tionscadail, nó seolta ag an gcóras airgeadais tríd an aip chomhtháthaithe.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "An tionscadal lena mbaineann an tsuim seo. Folamh do líne ón gcóras airgeadais nach n-oireann a huimhir tionscadail d'aon tionscadal.", + "The phase this amount belongs to, if any": "An chéim lena mbaineann an tsuim seo, más ann di", + "The cost category, one of the categories the admin set up": "An chatagóir costais, ceann de na catagóirí a shocraigh an riarthóir", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Cé acu buiséad, gealltanas, costas iarbhír nó réamhaisnéis atá sa tsuim", + "Amount": "Suim", + "The amount in the reporting currency (euro)": "An tsuim san airgeadra tuairiscithe (euro)", + "The date the amount was booked or is expected": "An dáta ar cuireadh an tsuim isteach nó a bhfuiltear ag súil léi", + "What the amount is for": "Cad chuige an tsuim", + "Whether a person entered the line or the finance system sent it": "Cé acu duine a d'iontráil an líne nó an córas airgeadais a sheol í", + "Entered by hand": "Iontráilte de láimh", + "Finance line id": "Aitheantas na líne airgeadais", + "The finance system's own id of this line. One imported line per id.": "Aitheantas na líne seo féin sa chóras airgeadais. Líne iompórtáilte amháin in aghaidh an aitheantais.", + "Project number": "Uimhir tionscadail", + "The project number the finance system sent, matched against the project key": "An uimhir tionscadail a sheol an córas airgeadais, curtha i gcomparáid le heochair an tionscadail", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Punann thionscadal na líne, cóipeáilte ón tionscadal ionas nach mbeidh ach scagaire amháin ag teastáil d'iomláin na punainne", + "Finance readers": "Léitheoirí airgeadais", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UIDanna úsáideora Nextcloud na ndaoine a fhéadfaidh an tsuim a fheiceáil: úinéir an tionscadail agus bainisteoirí a phunainne", + "Project owner": "Úinéir an tionscadail", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID úsáideora Nextcloud úinéir an tionscadail, a fhéadfaidh línte láimhe a athrú agus a bhaint", + "How the client pays: not billed, a fixed price, or by the hour.": "Conas a íocann an cliant: gan bhilleáil, praghas seasta nó in aghaidh na huaire.", + "Portfolio finance": "Airgeadas na punainne", + "You cannot see the money of any project in this portfolio": "Ní fheiceann tú airgead aon tionscadail sa phunann seo", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Sheol an freastalaí línte costais ó thionscadail lasmuigh den phunann seo, mar sin d'fhéadfadh na hiomláin a bheith mícheart.", + "Projects left out because you cannot see their money: {count}": "Tionscadail fágtha amach toisc nach bhfeiceann tú a n-airgead: {count}", + "Unmatched finance lines": "Línte airgeadais gan mheaitseáil", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Buiséad, gealltanais, costas iarbhír agus réamhaisnéis iomlánaithe thar phunann.", + "Subprojects": "Fothionscadail", + "{done} of {total}": "{done} as {total}", + "{done} of {total} tasks done, including subprojects": "{done} as {total} tasc déanta, fothionscadail san áireamh", + "Show the subprojects of {title}": "Taispeáin fothionscadail {title}", + "Hide the subprojects of {title}": "Folaigh fothionscadail {title}", + "Part of": "Cuid de", + "No parent project": "Gan máthairthionscadal", + "A project cannot sit under one of its own subprojects.": "Ní féidir le tionscadal suí faoi cheann dá fhothionscadail féin.", + "Projects nest three levels deep at most: programme, project and subproject.": "Neadaíonn tionscadail trí leibhéal ar a mhéad: clár, tionscadal agus fothionscadal.", + "Parent project": "Máthairthionscadal", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "An tionscadal a bhfuil an tionscadal seo faoi, mar shampla clár. Neadaíonn tionscadail trí leibhéal ar a mhéad.", + "Yes": "Tá", + "No": "Níl", + "{label} (required)": "{label} (riachtanach)", + "{label} is required": "Tá {label} riachtanach", + "Project field": "Réimse tionscadail", + "A field an admin adds to every project, such as a policy area or a contract value.": "Réimse a chuireann riarthóir le gach tionscadal, mar réimse beartais nó luach conartha.", + "Key": "Eochair", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "An t-ainm buan faoina stóráiltear an luach, i lower camel case. Coinnigh é nuair a úsáideann tionscadail é.", + "Label": "Lipéad", + "The name people see next to the field": "An t-ainm a fheiceann daoine in aice leis an réimse", + "What the field holds": "Cad atá sa réimse", + "Text": "Téacs", + "Number": "Uimhir", + "Choice": "Rogha", + "Person": "Duine", + "Yes or no": "Tá nó níl", + "Options": "Roghanna", + "The choices of a choice field": "Roghanna réimse rogha", + "Required": "Riachtanach", + "Whether a project must fill in the field": "Cé acu an gcaithfidh tionscadal an réimse a líonadh", + "Where the field appears, lowest first": "Cá bhfeictear an réimse, an ceann is ísle ar dtús", + "Applies to": "Baineann le", + "What the field is added to": "Cad lena gcuirtear an réimse", + "Custom fields": "Réimsí féin", + "The values of the project fields an admin defined, keyed by the field's key.": "Luachanna na réimsí tionscadail a shainigh riarthóir, de réir eochair an réimse.", + "Project fields": "Réimsí tionscadail", + "Related": "Gaolmhar", + "Remove link": "Bain an nasc", + "Link type": "Cineál naisc", + "Relates to": "Bainteach le", + "Duplicates": "Dúblaíonn", + "Project key": "Eochair an tionscadail", + "Every task number starts with it, such as VERG-42.": "Tosaíonn gach uimhir tasc léi, mar shampla VERG-42.", + "This key is already used by another project.": "Tá an eochair seo in úsáid cheana ag tionscadal eile.", + "Use 2 to 10 letters and digits, starting with a letter.": "Úsáid 2 go 10 litir agus digit, ag tosú le litir.", + "The key cannot change once tasks carry it.": "Ní féidir an eochair a athrú nuair atá sí ar thascanna.", + "Project saved. The existing tasks get their numbers in the background.": "Sábháladh an tionscadal. Faigheann na tascanna atá ann a n-uimhreacha sa chúlra.", + "Next task number": "Uimhir an chéad taisc eile", + "The number the next task of this project gets in its key. Only the system writes it.": "An uimhir a fhaigheann an chéad tasc eile den tionscadal seo ina eochair. Ní scríobhann ach an córas í.", + "Restore {title}": "Athchóirigh {title}", + "Restore": "Athchóirigh", + "Project restored": "Athchóiríodh an tionscadal", + "Could not restore the project": "Níorbh fhéidir an tionscadal a athchóiriú", + "Bring this project back to the active list.": "Cuir an tionscadal seo ar ais ar liosta na dtionscadal gníomhach.", + "Restore project": "Athchóirigh an tionscadal", + "Request reason": "Cúis an iarratais", + "Why the requester needs this project. Filled in when the project is requested.": "Cén fáth a bhfuil an tionscadal seo de dhíth ar an iarratasóir. Líontar é leis an iarratas.", + "Reviewed by": "Athbhreithnithe ag", + "The user who approved or rejected the request.": "An t-úsáideoir a d’fhaomh nó a dhiúltaigh an t-iarratas.", + "Reviewed at": "Athbhreithnithe ar", + "When the request was approved or rejected.": "Cathain a faomhadh nó a diúltaíodh an t-iarratas.", + "Review note": "Nóta athbhreithnithe", + "The reviewer's reason, shown to the requester when a request is not approved.": "Cúis an athbhreithneora, a fheiceann an t-iarratasóir nuair nach bhfaomhtar iarratas.", + "Members of these groups": "Baill na ngrúpaí seo", + "Groups that may create projects": "Grúpaí ar féidir leo tionscadail a chruthú", + "The group {group} no longer exists. Save to remove it.": "Níl an grúpa {group} ann a thuilleadh. Sábháil chun é a bhaint.", + "Review project request": "Athbhreithnigh an t-iarratas tionscadail", + "Requested by": "Iarrtha ag", + "Why it is needed": "Cén fáth a bhfuil sé de dhíth", + "Desired start date": "Dáta tosaigh inmhianaithe", + "Why is it not approved?": "Cén fáth nach bhfaomhtar é?", + "Give a reason. The requester sees it.": "Tabhair cúis. Feicfidh an t-iarratasóir í.", + "Approve": "Faomh", + "Reject": "Diúltaigh", + "Reject request": "Diúltaigh don iarratas", + "The review was not saved. Try again.": "Níor sábháladh an t-athbhreithniú. Bain triail eile as.", + "This project is waiting for review": "Tá an tionscadal seo ag fanacht le hathbhreithniú", + "This request was not approved": "Níor faomhadh an t-iarratas seo", + "Reason: {note}": "Cúis: {note}", + "Review request": "Athbhreithnigh an t-iarratas", + "Request a project": "Iarr tionscadal", + "Step {step} of 2": "Céim {step} de 2", + "Why is this project needed?": "Cén fáth a bhfuil an tionscadal seo de dhíth?", + "Give a reason. The reviewer reads it.": "Tabhair cúis. Léifidh an t-athbhreithneoir í.", + "Back": "Siar", + "Next": "Ar aghaidh", + "Send request": "Seol an t-iarratas", + "The request was not sent. Try again.": "Níor seoladh an t-iarratas. Bain triail eile as.", + "Requested": "Iarrtha", + "Not approved": "Gan fhaomhadh", + "Your request was sent": "Seoladh d’iarratas", + "Let everyone else request a project": "Lig do gach duine eile tionscadal a iarraidh", + "Add a task": "Cuir tasc leis", + "Delete task": "Scrios an tasc", + "Edit task": "Cuir an tasc in eagar", + "Write": "Scríobh", + "Preview": "Réamhamharc", + "Markdown works here: headings, lists and links.": "Oibríonn Markdown anseo: ceannteidil, liostaí agus naisc.", + "Could not save the task. Please try again.": "Níorbh fhéidir an tasc a shábháil. Bain triail eile as.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Tá am logáilte ar \"{title}\", mar sin ní féidir é a scriosadh. Is féidir leat é a chealú ina ionad: fanann na hiontrálacha ama.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Scrios \"{title}\"? Baintear a naisc le tascanna eile freisin. Ní féidir é seo a chealú.", + "Keep task": "Coinnigh an tasc", + "Cancel task": "Cealaigh an tasc", + "Only the reporter, the project owner or an admin can delete this task.": "Ní féidir ach leis an tuairisceoir, le húinéir an tionscadail nó le riarthóir an tasc seo a scriosadh.", + "Could not delete the task. Please try again.": "Níorbh fhéidir an tasc a scriosadh. Bain triail eile as.", + "Could not cancel the task. Please try again.": "Níorbh fhéidir an tasc a chealú. Bain triail eile as.", + "Responsible": "Freagrach", + "Also working on this": "Ag obair air seo freisin", + "Labels": "Lipéid", + "Could not change the priority. Please try again.": "Níorbh fhéidir an tosaíocht a athrú. Bain triail eile as.", + "Other project members who work on this task alongside the person responsible.": "Baill eile den tionscadal atá ag obair ar an tasc seo in éineacht leis an duine freagrach.", + "Duplicate": "Dúblaigh", + "Could not copy the task. Please try again.": "Níorbh fhéidir an tasc a chóipeáil. Bain triail eile as.", + "Subtasks": "Fo-thascanna", + "{done} of {total} done": "{done} as {total} déanta", + "Add a subtask": "Cuir fo-thasc leis", + "Checklist": "Seicliosta", + "Checklist item actions": "Gníomhartha míre seicliosta", + "Add a checklist item": "Cuir mír seicliosta leis", + "Subtasks: {estimate} estimated, {logged} logged": "Fo-thascanna: {estimate} measta, {logged} logáilte", + "Total estimate: {total}": "Meastachán iomlán: {total}", + "Part of {title}": "Cuid de {title}", + "Checklist: {count} done": "Seicliosta: {count} déanta", + "This task has subtasks: {count}.": "Tá fo-thascanna ag an tasc seo: {count}.", + "Keep subtasks as separate tasks": "Coinnigh na fo-thascanna mar thascanna ar leith", + "Delete subtasks too": "Scrios na fo-thascanna freisin", + "Copy of {title}": "Cóip de {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Cóipeáladh an tasc, ach ní a fo-thascanna go léir. Seiceáil an chóip.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Céimeanna beaga laistigh den tasc. Tá aitheantas, téacs agus stádas déanta ag gach mír.", + "Open work per person and per project.": "Obair oscailte de réir duine agus de réir tionscadail.", + "View": "Amharc", + "By person": "De réir duine", + "By project": "De réir tionscadail", + "Hours left": "Uaireanta fágtha", + "Tasks without an estimate": "Tascanna gan meastachán", + "Due in 14 days": "Dlite laistigh de 14 lá", + "Shared": "Roinnte", + "Unassigned": "Gan sannadh", + "{hours} h": "{hours} u", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Taispeántar an obair sna tionscadail is féidir leat a fheiceáil. Comhairtear na huaireanta don duine freagrach; comhairtear tascanna roinnte gan uaireanta.", + "No open work in these projects.": "Níl aon obair oscailte sna tionscadail seo.", + "Open work": "Obair oscailte", + "{count} open tasks": "{count} tasc oscailte", + "Create a project to see capacity here.": "Cruthaigh tionscadal chun an acmhainn a fheiceáil anseo.", + "My tasks": "Mo thascanna", + "Show all my tasks": "Taispeáin mo thascanna go léir", + "No tasks assigned to you": "Níl aon tascanna sannta duit", + "Browse projects": "Brabhsáil tionscadail", + "Later": "Níos déanaí", + "Due {date}": "Dlite {date}", + "Could not change the status. Please try again.": "Níorbh fhéidir an stádas a athrú. Bain triail eile as.", + "Completed today": "Críochnaithe inniu", + "My open tasks": "Mo thascanna oscailte", + "My overdue tasks": "Mo thascanna thar téarma", + "My tasks in progress": "Mo thascanna ar siúl", + "Pin to the top": "Pionnáil ag an mbarr", + "Unpin": "Díphionnáil", + "Pinned": "Pionnáilte", + "Actions for {title}": "Gníomhartha do {title}", + "Could not save your project order. Please try again.": "Níorbh fhéidir ord do thionscadal a shábháil. Bain triail eile as.", + "No boards yet": "Níl aon chláir fós", + "Create a project to get a board.": "Cruthaigh tionscadal chun clár a fháil.", + "Use the Projects page to create and manage your projects and tasks.": "Úsáid an leathanach Tionscadail chun do thionscadail agus do thascanna a chruthú agus a bhainistiú.", + "Go to projects": "Téigh go dtí na tionscadail", + "You are not a member of any projects yet.": "Níl tú i do bhall d'aon tionscadal fós.", + "Could not search for users. Please try again.": "Níorbh fhéidir úsáideoirí a chuardach. Bain triail eile as.", + "Project creation is restricted to administrators.": "Ní féidir ach le riarthóirí tionscadail a chruthú.", + "Only the project owner or an administrator can delete this project.": "Ní féidir ach le húinéir an tionscadail nó le riarthóir an tionscadal seo a scriosadh.", + "No projects are available to you yet. Ask an administrator to create one.": "Níl aon tionscadail ar fáil duit fós. Iarr ar riarthóir ceann a chruthú.", + "Due: {date}": "Dlite: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Taispeántar tascanna a bhfuil dáta tosaigh nó dáta dlite acu ar an amlíne. Cuir dátaí leo chun iad a fheiceáil anseo.", + "You do not have access to this project.": "Níl rochtain agat ar an tionscadal seo.", + "Zoom level": "Leibhéal súmála", + "Unscheduled": "Gan sceideal", + "Start: {date}": "Tús: {date}", + "Today": "Inniu", + "No scheduled tasks": "Níl aon tascanna sceidealaithe", + "An unexpected error occurred.": "Tharla earráid gan choinne.", + "Column {number} name": "Ainm cholún {number}", + "Failed to save creation policy": "Níorbh fhéidir an polasaí cruthaithe a shábháil", + "All authenticated users": "Gach úsáideoir fíordheimhnithe", + "Control who may create new projects": "Rialaigh cé a fhéadann tionscadail nua a chruthú", + "Administrators only": "Riarthóirí amháin", + "Project creation": "Cruthú tionscadal", + "Allow project creation": "Ceadaigh cruthú tionscadal", + "Creation policy saved successfully": "Sábháladh an polasaí cruthaithe", + "Initializing…": "Á thosú…", + "e.g. 2h 30m, 90m, 1.5h": "m.sh. 2h 30m, 90m, 1.5h", + "Log time": "Logáil am", + "Save estimate": "Sábháil meastachán", + "Logged: {logged}": "Logáilte: {logged}", + "over by {amount}": "thar {amount}", + "Time tracking": "Rianú ama", + "Estimate": "Meastachán", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Cuir isteach meastachán bailí (m.sh. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Cuir isteach fad bailí (m.sh. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Níorbh fhéidir an iontráil ama a shábháil. Bain triail eile as.", + "Edit time entry": "Cuir iontráil ama in eagar", + "Duration": "Fad", + "Date range": "Raon dátaí", + "Last week": "An tseachtain seo caite", + "No time logged": "Níl aon am logáilte", + "Log time on a task to see it here.": "Logáil am ar thasc chun é a fheiceáil anseo.", + "To date": "Go dáta", + "This week": "An tseachtain seo", + "Total: {total}": "Iomlán: {total}", + "From date": "Ó dháta", + "Custom range": "Raon saincheaptha", + "All time": "An t-am ar fad", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Níorbh fhéidir tasc a scriosadh, mar sin d'fhéadfadh sonraí fanacht. Scrios an tionscadal arís.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Níorbh fhéidir iontráil ama a scriosadh, mar sin d'fhéadfadh sonraí fanacht. Scrios an tionscadal arís.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Níorbh fhéidir colún a scriosadh, mar sin d'fhéadfadh sonraí fanacht. Scrios an tionscadal arís.", + "Could not delete the project. Please try again.": "Níorbh fhéidir an tionscadal a scriosadh. Bain triail eile as.", + "Notification settings": "Socruithe fógraí", + "Configure when due-date reminders are sent": "Socraigh cathain a sheoltar meabhrúcháin dáta dlite", + "Due-date reminder lead time (hours)": "Am réamhrá an mheabhrúcháin (uaireanta)", + "Lead time must be between 1 and 336 hours": "Caithfidh an t-am a bheith idir 1 agus 336 uair", + "Reminder lead time saved successfully": "Sábháladh am an mheabhrúcháin", + "Failed to save reminder lead time": "Níorbh fhéidir am an mheabhrúcháin a shábháil", + "Notifications": "Fógraí", + "Notify me 1 day before a task's due date": "Cuir in iúl dom 1 lá roimh dháta dlite taisc", + "Draft": "Dréacht", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "An dréacht é an ceacht nach bhfeiceann ach a mhúinteoir, an mbeidh sé ar siúl nó an bhfuil sé curtha ar ceal.", + "New release": "Eisiúint nua", + "Roadmap chart. The same releases and epics are listed below.": "Cairt an treochláir. Tá na heisiúintí agus na heipicí céanna liostaithe thíos.", + "Nothing on the roadmap yet": "Níl aon rud ar an treochlár fós", + "Releases with a target date and epics with dated tasks appear here.": "Taispeántar anseo eisiúintí a bhfuil spriocdháta acu agus eipicí a bhfuil tascanna dátaithe acu.", + "Releases": "Eisiúintí", + "No releases yet": "Níl aon eisiúint ann fós", + "Target date: {date}": "Spriocdháta: {date}", + "No target date": "Gan spriocdháta", + "Edit {name}": "Cuir {name} in eagar", + "Mark {name} as released": "Marcáil {name} mar eisithe", + "Mark as released": "Marcáil mar eisithe", + "Epics": "Eipicí", + "No epics yet. Open a task to make it an epic.": "Níl aon eipic ann fós. Oscail tasc chun eipic a dhéanamh de.", + "Not scheduled yet": "Gan sceideal fós", + "Planned": "Pleanáilte", + "Released": "Eisithe", + "Edit release": "Cuir an eisiúint in eagar", + "Target date": "Spriocdháta", + "Could not save the release. Please try again.": "Níorbh fhéidir an eisiúint a shábháil. Bain triail eile as.", + "Every task of this release is done or cancelled.": "Tá gach tasc den eisiúint seo déanta nó curtha ar ceal.", + "Not finished yet: {count}": "Gan chríochnú fós: {count}", + "What happens to these tasks?": "Cad a tharlaíonn do na tascanna seo?", + "Move to {name}": "Bog go {name}", + "Remove the release": "Bain an eisiúint", + "Keep it on {name}": "Fág iad ar {name}", + "Could not mark the release as released. Please try again.": "Níorbh fhéidir an eisiúint a mharcáil mar eisithe. Bain triail eile as.", + "Roadmap": "Treochlár", + "Tasks or roadmap": "Tascanna nó treochlár", + "Release": "Eisiúint", + "Epic": "Eipic", + "This task is an epic": "Is eipic é an tasc seo", + "A named, dated delivery of a project that its tasks are planned against.": "Seachadadh ainmnithe dátaithe de thionscadal a bpleanáiltear a thascanna ina choinne.", + "Name of the release": "Ainm na heisiúna", + "The project this release belongs to": "An tionscadal lena mbaineann an eisiúint seo", + "What this release delivers": "Cad a sheachadann an eisiúint seo", + "When work on the release starts": "Cathain a thosaíonn an obair ar an eisiúint", + "The date the release is due": "An dáta a bhfuil an eisiúint dlite", + "Whether the release is planned, released or archived": "Cibé an bhfuil an eisiúint pleanáilte, eisithe nó cartlannaithe", + "Released on": "Eisithe ar", + "When the release was marked as released": "Cathain a marcáladh an eisiúint mar eisithe", + "The release this task is planned for": "An eisiúint a bhfuil an tasc seo pleanáilte di", + "Board view options": "Roghanna amhairc an chláir", + "Colour cards": "Dathaigh cártaí", + "No colour": "Gan dath", + "By label": "De réir lipéid", + "Swimlanes": "Lánaí", + "No swimlanes": "Gan lánaí", + "By assignee": "De réir sannaí", + "By epic": "De réir eipice", + "No assignee": "Gan sannadh", + "No epic": "Gan eipic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Fanann cártaí i ró a n-eipice. Athraigh an eipic ar leathanach an tasc.", + "Hand over to": "Tabhair do", + "Could not save your board view. It applies until you reload.": "Níor sábháladh amharc an chláir. Tá sé i bhfeidhm go dtí go n-athlódálann tú.", + "Timetable wish": "Mian amchláir", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Mian a mheasann an gineadóir. Coinníonn sé mian docht i gcónaí, agus mian bog nuair is féidir.", + "Whether the wish is about a teacher, a group, a room or one activity": "Cé acu múinteoir, grúpa, seomra nó gníomhaíocht atá i gceist leis an mian", + "Teacher": "Múinteoir", + "Group": "Grúpa", + "Reference": "Tagairt", + "The user, group, room or activity the wish is about": "An t-úsáideoir, an grúpa, an seomra nó an ghníomhaíocht atá i gceist", + "What the wish asks for": "Cad a iarrann an mian", + "Not on these periods": "Ní ar na tréimhsí seo", + "Preferably not on these periods": "B'fhearr gan a bheith ar na tréimhsí seo", + "At most a number of lessons a day": "Líon ceachtanna sa lá ar a mhéad", + "No free periods between lessons": "Gan bearnaí idir ceachtanna", + "Always the same room": "An seomra céanna i gcónaí", + "Periods": "Tréimhsí", + "The periods of the week the wish is about, such as wed-5": "Tréimhsí na seachtaine atá i gceist, mar shampla wed-5", + "Limit": "Teorainn", + "The most lessons a day, for a wish of that kind": "An líon is mó ceachtanna sa lá, do mhian den chineál sin", + "Strength": "Neart", + "Whether the generator must keep the wish or should keep it": "Cé acu a chaithfidh nó ar cheart don ghineadóir an mian a choinneáil", + "Hard": "Docht", + "Soft": "Bog", + "Weight": "Meáchan", + "How much a soft wish counts, from 1 to 3": "Cé mhéad a chomhaireann mian bog, ó 1 go 3", + "Why the wish exists": "Cén fáth a bhfuil an mian ann", + "Timetable scenario": "Cás amchláir", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Patrún seachtaine amháin, déanta ag an ngineadóir nó tógtha ón amchlár reatha. Coinníonn sé a ionchur agus cé chomh maith is a choinníonn sé na mianta.", + "The name timetablers know the scenario by": "An t-ainm a bhfuil aithne ag lucht amchlár ar an gcás faoi", + "Whether the generator made it or it came from the current timetable": "Cé acu an gineadóir a rinne é nó an as an amchlár reatha a tháinig sé", + "Generated": "Ginte", + "From the current timetable": "Ón amchlár reatha", + "Week of": "Seachtain an", + "The Monday of the first week of the window": "Luan na chéad seachtaine den tréimhse", + "Window start": "Tús na tréimhse", + "The first day the week pattern applies to": "An chéad lá a bhaineann an patrún seachtaine leis", + "Window end": "Deireadh na tréimhse", + "The last day the week pattern applies to": "An lá deireanach a bhaineann an patrún seachtaine leis", + "Waiting, generating, done, failed, or published as draft lessons": "Ag fanacht, á ghiniúint, déanta, theip air nó foilsithe mar dhréachtcheachtanna", + "Waiting": "Ag fanacht", + "Generating": "Á ghiniúint", + "Failed": "Theip air", + "Published": "Foilsithe", + "Seed": "Síol", + "The number the generator starts from, so a run can be repeated": "An uimhir a dtosaíonn an gineadóir léi, ionas gur féidir rith a athdhéanamh", + "Input": "Ionchur", + "The periods, rooms, lessons and wishes the scenario was made from": "Na tréimhsí, seomraí, ceachtanna agus mianta ónar rinneadh an cás", + "Placements": "Socruithe", + "Each lesson with the period and room it was given": "Gach ceacht leis an tréimhse agus an seomra a fuair sé", + "Unplaced lessons": "Ceachtanna gan socrú", + "Lessons without a place, each with the hard wish that blocked it": "Ceachtanna gan áit, gach ceann leis an mian docht a chuir bac air", + "Broken wishes": "Mianta briste", + "The wishes this scenario breaks, with the lessons that break them": "Na mianta a bhriseann an cás seo, leis na ceachtanna a bhriseann iad", + "Measures": "Tomhais", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Ceachtanna socraithe, mianta briste, bearnaí múinteoirí, ceachtanna sa lá agus úsáid seomraí", + "Reason": "Cúis", + "Why the run failed": "Cén fáth ar theip ar an rith", + "Published at": "Foilsithe ar", + "When the scenario was written out as draft lessons": "Cathain a scríobhadh an cás mar dhréachtcheachtanna", + "Edit wish": "Cuir mian in eagar", + "New wish": "Mian nua", + "Hard: the generator always keeps it": "Docht: coinníonn an gineadóir i gcónaí é", + "Soft: the generator keeps it where it can": "Bog: coinníonn an gineadóir é nuair is féidir", + "Weight (1 to 3)": "Meáchan (1 go 3)", + "Most lessons a day": "Uasmhéid ceachtanna in aghaidh an lae", + "Period": "Tréimhse", + "{day} period {number}": "{day} tréimhse {number}", + "Teacher (user name)": "Múinteoir (ainm úsáideora)", + "Activity (group:subject)": "Gníomhaíocht (grúpa:ábhar)", + "Say who or what the wish is about.": "Luaigh cé nó cad lena mbaineann an mian.", + "Choose at least one period.": "Roghnaigh tréimhse amháin ar a laghad.", + "The limit is a whole number of 1 or more.": "Is slánuimhir 1 nó níos mó an teorainn.", + "Timetable": "Clár ama", + "Wishes": "Mianta", + "Timetable wishes": "Mianta an chláir ama", + "Generator run": "Rith an ghineadóra", + "Generator progress": "Dul chun cinn an ghineadóra", + "The run failed: {reason}": "Theip ar an rith: {reason}", + "{placed} of {lessons} lessons placed": "{placed} as {lessons} ceacht curtha", + "Generate again": "Gin arís", + "Generate": "Gin", + "Every lesson has a place.": "Tá áit ag gach ceacht.", + "Lesson": "Ceacht", + "No free period and room": "Níl tréimhse ná seomra saor", + "Broken soft wishes": "Mianta boga briste", + "Every soft wish is kept.": "Coinnítear gach mian bhog.", + "Wish": "Mian", + "Lessons": "Ceachtanna", + "Generating: {percent}% of the time budget used": "Ag giniúint: {percent}% den am úsáidte", + "Waiting to start": "Ag fanacht le tosú", + "Published as draft lessons": "Foilsithe mar dhréachtcheachtanna", + "Could not read the scenario.": "Níorbh fhéidir an cás a léamh.", + "Could not start the run.": "Níorbh fhéidir an rith a thosú.", + "Scenarios": "Cásanna", + "Timetable scenarios": "Cásanna an chláir ama", + "Scenario": "Cás", + "Take the current timetable": "Tóg an clár ama reatha", + "Could not take the current timetable.": "Níorbh fhéidir an clár ama reatha a thógáil.", + "Broken hard wishes": "Mianta éigeantacha briste", + "Not on a period of the week grid": "Ní ar thréimhse de ghreille na seachtaine", + "Compare scenarios": "Cuir cásanna i gcomparáid", + "Scenarios to compare": "Cásanna le cur i gcomparáid", + "Choose two or three scenarios to compare them.": "Roghnaigh dhá nó trí chás chun iad a chur i gcomparáid.", + "Measure": "Tomhas", + "Best": "Is fearr", + "Lessons that differ": "Ceachtanna atá difriúil", + "No lesson differs.": "Níl aon cheacht difriúil.", + "Not placed": "Gan chur", + "{period} in {room}": "{period} i {room}", + "Lessons placed": "Ceachtanna curtha", + "Lessons without a place": "Ceachtanna gan áit", + "Clashes": "Coimhlintí", + "Hard wishes broken": "Mianta docht briste", + "Soft wishes broken": "Mianta boga briste", + "Soft wishes broken, weighted": "Mianta boga briste, ualaithe", + "Free periods between lessons, all teachers": "Tréimhsí saora, gach múinteoir", + "Most free periods of one teacher": "Na tréimhsí saora is mó ag múinteoir amháin", + "Most lessons of one group on a day": "Na ceachtanna is mó ag grúpa amháin in aon lá", + "Room use": "Úsáid seomraí", + "Publish as draft lessons": "Foilsigh mar dhréachtcheachtanna", + "Draft lessons written: {count}": "Dréachtcheachtanna scríofa: {count}", + "Could not publish the scenario.": "Níorbh fhéidir an cás a fhoilsiú.", + "Rules": "Rialacha", + "Rules for {column}": "Rialacha do {column}", + "When a card enters this column": "Nuair a théann cárta isteach sa cholún seo", + "Action": "Gníomh", + "Set the priority": "Socraigh an tosaíocht", + "Assign to": "Sann do", + "Assign the person who moved the card": "Sann don duine a bhog an cárta", + "Remove the assignee": "Bain an sannaí", + "Add a label": "Cuir lipéad leis", + "No longer a project member": "Ní ball den tionscadal é a thuilleadh", + "This label no longer exists": "Níl an lipéad seo ann a thuilleadh", + "Add rule": "Cuir riail leis", + "Remove rule": "Bain riail", + "No rules yet. Add one to change a card when it enters this column.": "Níl aon rialacha fós. Cuir ceann leis chun cárta a athrú nuair a théann sé isteach sa cholún seo.", + "Could not save the rules. Please try again.": "Níorbh fhéidir na rialacha a shábháil. Bain triail eile as.", + "1 rule runs when a card enters this column": "Ritheann 1 riail nuair a théann cárta isteach sa cholún seo", + "{count} rules run when a card enters this column": "Ritheann {count} riail nuair a théann cárta isteach sa cholún seo", + "Rules applied: {changes}": "Rialacha curtha i bhfeidhm: {changes}", + "assigned to {name}": "sannta do {name}", + "assignee removed": "sannaí bainte", + "priority {priority}": "tosaíocht {priority}", + "label {label}": "lipéad {label}", + "What happens to a card when it enters this column, applied in list order.": "Cad a tharlaíonn do chárta nuair a théann sé isteach sa cholún seo, in ord an liosta.", + "Value": "Luach", + "What the rule does to the card.": "Cad a dhéanann an riail leis an gcárta.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "An tosaíocht, aitheantas an úsáideora nó aitheantas an lipéid a úsáideann an gníomh; folamh do ghníomhartha gan luach.", + "is not": "níl", + "{dimension} is not": "{dimension} níl", + "Saved filters": "Scagairí sábháilte", + "No saved filters yet": "Níl aon scagairí sábháilte fós", + "Save filter": "Sábháil an scagaire", + "Rename \"{name}\"": "Athainmnigh \"{name}\"", + "Delete \"{name}\"": "Scrios \"{name}\"", + "Clear filters": "Glan na scagairí", + "Showing {shown} of {total} tasks": "Ag taispeáint {shown} as {total} tasc", + "Me": "Mise", + "No date": "Gan dáta", + "Rename saved filter": "Athainmnigh an scagaire sábháilte", + "Share with the project": "Comhroinn leis an tionscadal", + "Give the filter a name": "Tabhair ainm don scagaire", + "Could not save the filter. Please try again.": "Níorbh fhéidir an scagaire a shábháil. Bain triail eile as.", + "Some labels in \"{name}\" no longer exist and were left out.": "Níl roinnt lipéad in \"{name}\" ann a thuilleadh agus fágadh ar lár iad.", + "Could not delete the filter. Please try again.": "Níorbh fhéidir an scagaire a scriosadh. Bain triail eile as.", + "Saved filter": "Scagaire sábháilte", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Scagaire cláir ainmnithe de thionscadal amháin, príobháideach don duine a shábháil é mura bhfuil sé comhroinnte leis an tionscadal.", + "The project whose board the filter applies to": "An tionscadal a mbaineann an scagaire lena chlár", + "The name the filter is listed under": "An t-ainm faoina liostaítear an scagaire", + "Saved by": "Sábháilte ag", + "Nextcloud user id of the person who saved the filter": "Aitheantas úsáideora Nextcloud an duine a shábháil an scagaire", + "Shared with the project": "Comhroinnte leis an tionscadal", + "Whether every project member sees and applies the filter": "Cé acu a fheiceann gach ball den tionscadal an scagaire agus an féidir leo é a chur i bhfeidhm", + "Criteria": "Critéir", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "An scagaire: sannaí, lipéad, tosaíocht agus dáta dlite, gach ceann le is nó níl agus a luachanna", + "Cross-project view": "Amharc trasna tionscadal", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Rogha shábháilte tionscadal a dtaispeántar a dtascanna le chéile i lánaí stádais, roinnte leis na daoine a ainmníonn sí.", + "Shared with": "Roinnte le", + "The name the view is listed under": "An t-ainm faoina liostaítear an t-amharc", + "Nextcloud user id of the person who saved the view": "Aitheantas úsáideora Nextcloud an duine a shábháil an t-amharc", + "Nextcloud user ids of the people the view is shared with": "Aitheantais úsáideora Nextcloud na ndaoine a bhfuil an t-amharc roinnte leo", + "The projects whose tasks the view shows, at most twenty": "Na tionscadail a dtaispeánann an t-amharc a dtascanna, fiche ar a mhéad", + "1 project in this view is hidden from you.": "Tá 1 tionscadal san amharc seo i bhfolach ort.", + "{count} projects in this view are hidden from you.": "Tionscadail san amharc seo atá i bhfolach ort: {count}.", + "{project} has no column for {status}.": "Níl colún ag {project} do {status}.", + "This view does not exist or is not shared with you.": "Níl an t-amharc seo ann nó níl sé roinnte leat.", + "\"{task}\" moved to {status}.": "Bogadh \"{task}\" go {status}.", + "Project: {title}": "Tionscadal: {title}", + "Cross-project views": "Amharcanna trasna tionscadal", + "New view": "Amharc nua", + "Edit view": "Cuir an t-amharc in eagar", + "Delete view": "Scrios an t-amharc", + "Give the view a name": "Tabhair ainm don amharc", + "Pick at least one project": "Roghnaigh tionscadal amháin ar a laghad", + "A view shows at most {max} projects": "Taispeánann amharc {max} tionscadal ar a mhéad", + "Could not save the view. Please try again.": "Níorbh fhéidir an t-amharc a shábháil. Bain triail eile as.", + "Could not delete the view. Please try again.": "Níorbh fhéidir an t-amharc a scriosadh. Bain triail eile as.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Scrios \"{title}\"? Fanann na tionscadail agus a dtascanna mar atá siad.", + "People see the tasks of the projects they are in, never more.": "Ní fheiceann duine ach tascanna na dtionscadal a bhfuil sé iontu.", + "No views yet. A view shows the tasks of several of your projects together.": "Níl aon amharc fós. Taispeánann amharc tascanna roinnt de do thionscadail le chéile.", + "Projects in view: {count}": "Tionscadail san amharc: {count}", + "Notify me when a task is assigned to me": "Cuir in iúl dom nuair a shanntar tasc dom", + "Also send these to me by email": "Seol iad seo chugam i ríomhphost freisin", + "Add an email address in your Nextcloud personal settings to get mail.": "Cuir seoladh ríomhphoist le do shocruithe pearsanta Nextcloud chun ríomhphost a fháil.", + "Code link": "Nasc cóid", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, brainse, iarratas cumaisc nó saincheist ar ardán cóid a bhaineann le tasc.", + "The task the link belongs to": "An tasc lena mbaineann an nasc", + "The project of the task": "Tionscadal an taisc", + "Task key": "Eochair an taisc", + "The task key the forge text named, such as VC-12": "Eochair an taisc a luaigh téacs an ardáin, mar shampla VC-12", + "What the link points at": "Cad air a dtagraíonn an nasc", + "Link": "Nasc", + "The address of the item in the forge": "Seoladh na míre ar an ardán cóid", + "The commit message, branch name or merge request title": "Teachtaireacht an commit, ainm na brainse nó teideal an iarratais cumaisc", + "Repository": "Stór", + "The repository, such as acme/portal": "An stór, mar shampla acme/portal", + "Forge id": "Aitheantas ar an ardán", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Aitheantas féin na míre ar an ardán cóid, mar shampla github:acme/portal#42 nó hais commit", + "State": "Staid", + "The state of a merge request or issue": "Staid iarratais cumaisc nó saincheiste", + "Who made the commit or opened the merge request": "Cé a rinne an commit nó a d'oscail an t-iarratas cumaisc", + "When the commit was made or the merge request last changed": "Cathain a rinneadh an commit nó a d'athraigh an t-iarratas cumaisc den uair dheireanach", + "Added by": "Curtha leis ag", + "Whether a person added the link or the integration wrote it": "Ar chuir duine an nasc leis nó ar scríobh an comhtháthú é", + "Nextcloud user UIDs of project members": "Aitheantais úsáideora Nextcloud bhaill an tionscadail", + "Add link": "Cuir nasc leis", + "Added by hand": "Curtha leis de láimh", + "Branch": "Brainse", + "Code": "Cód", + "Commit": "Commit", + "From the integration": "Ón gcomhtháthú", + "Link to a commit, branch or merge request": "Nasc chuig commit, brainse nó iarratas cumaisc", + "Merge request": "Iarratas cumaisc", + "Merged": "Cumaiscthe", + "No code linked yet. Name {key} in a commit message or paste a link.": "Níl aon chód nasctha fós. Luaigh {key} i dteachtaireacht commit nó greamaigh nasc.", + "No code linked yet. Paste a link to a commit or merge request.": "Níl aon chód nasctha fós. Greamaigh nasc chuig commit nó iarratas cumaisc.", + "Paste a web address that starts with https://.": "Greamaigh seoladh gréasáin a thosaíonn le https://.", + "Remove link {title}": "Bain an nasc {title}", + "The link could not be added.": "Níorbh fhéidir an nasc a chur leis.", + "The link could not be removed.": "Níorbh fhéidir an nasc a bhaint.", + "This link is already on the task.": "Tá an nasc seo ar an tasc cheana.", + "Code forges": "Ardáin chóid", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Nasc commits agus pull requests GitHub le tascanna. Faigheann Integriq na himeachtaí; ní ghlaonn planninq ar GitHub riamh.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Íoslódáil an chumraíocht agus iompórtáil isteach in Integriq í. Ansin líon rún isteach sa riail \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "In GitHub, cuir webhook leis an stór leis an seoladh seo agus an rún céanna. Roghnaigh an cineál ábhair application/json agus na himeachtaí push agus pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Luaigh eochair an taisc, mar shampla VC-12, i dteachtaireacht commit, in ainm brainse nó i dteideal pull request. Ansin feictear an nasc ar an tasc sin.", + "Without Integriq, project members can still paste a link on the task page.": "Gan Integriq, is féidir le baill an tionscadail nasc a ghreamú ar leathanach an taisc fós.", + "Download the Integriq configuration": "Íoslódáil cumraíocht Integriq", + "Calendar": "Féilire", + "Previous": "Roimhe seo", + "Calendar view": "Amharc féilire", + "Starts:": "Tosaíonn:", + "No tasks with a date in this month.": "Níl aon tascanna le dáta an mhí seo.", + "Week of {start} to {end}": "Seachtain ó {start} go {end}", + "My calendar": "Mo fhéilire", + "Show as list": "Taispeáin mar liosta", + "Show as calendar": "Taispeáin mar fhéilire", + "Open my calendar": "Oscail mo fhéilire", + "Nextcloud Tasks": "Tascanna Nextcloud", + "Show my tasks in Nextcloud Tasks": "Taispeáin mo thascanna i dTascanna Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Feictear na tascanna a sannadh duit nó a roinneadh leat i liosta \"Planninq\" i dTascanna agus i bhFéilire Nextcloud. Cuirtear an chéad athrú eile in Planninq in ionad athruithe a dhéantar ansin.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ní féidir leis an bhfreastalaí seo scríobh chuig Tascanna Nextcloud, mar sin níl an easpórtáil ar fáil.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Á bhainistiú ag Planninq. Cuirtear an chéad athrú eile in Planninq in ionad athruithe a dhéantar anseo.", + "Working days and holidays": "Laethanta oibre agus laethanta saoire", + "Dates set on the timeline skip the days that are not working days.": "Scipeálann dátaí a shocraítear ar an amlíne na laethanta nach laethanta oibre iad.", + "Working weekdays": "Laethanta oibre na seachtaine", + "Non-working days": "Laethanta neamhoibre", + "No non-working days yet.": "Níl aon laethanta neamhoibre fós.", + "Add day": "Cuir lá leis", + "Year": "Bliain", + "Add Dutch national holidays": "Cuir laethanta saoire náisiúnta na hÍsiltíre leis", + "Save working days": "Sábháil laethanta oibre", + "Choose at least one working weekday.": "Roghnaigh lá oibre amháin ar a laghad.", + "Working days saved.": "Sábháladh na laethanta oibre.", + "Could not save the working days.": "Níorbh fhéidir na laethanta oibre a shábháil.", + "New Year's Day": "Lá Caille", + "Easter Sunday": "Domhnach Cásca", + "Easter Monday": "Luan Cásca", + "King's Day": "Lá an Rí", + "Liberation Day": "Lá na Saoirse", + "Ascension Day": "Déardaoin Deasghabhála", + "Whit Sunday": "Domhnach Cincíse", + "Whit Monday": "Luan Cincíse", + "Christmas Day": "Lá Nollag", + "Boxing Day": "Lá Fhéile Stiofáin", + "Dates of {title}": "Dátaí {title}", + "The due date cannot be before the start date.": "Ní féidir leis an dáta dlite a bheith roimh an dáta tosaigh.", + "{title}, from {start} to {end}": "{title}, ó {start} go {end}", + "The dates could not be saved.": "Níorbh fhéidir na dátaí a shábháil.", + "{title} now runs from {start} to {end}": "Tá {title} ar siúl anois ó {start} go {end}", + "Auto-scheduling": "Sceidealú uathoibríoch", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Nuair atá sé ar siúl, nuair a bhogtar dáta dlite níos déanaí ar an amlíne tairgtear na tascanna a bhlocálann sé a bhogadh freisin.", + "Move blocked tasks along when a task slips": "Bog tascanna blocáilte nuair a théann tasc chun moille", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Ar an amlíne, tairgeann dáta dlite níos déanaí na tascanna blocáilte a bhogadh. Ní áirítear ach naisc \"blocálann\", agus ní bhogtar tascanna ach níos déanaí.", + "Move the tasks that wait for {title}?": "Bog na tascanna atá ag fanacht ar {title}?", + "These tasks wait for it and would start after its new due date:": "Tá na tascanna seo ag fanacht air agus thosóidís tar éis an dáta dlite nua:", + "{count} tasks would move; the first {limit} are listed.": "Bhogfaí {count} tasc; taispeántar na chéad {limit}.", + "Now": "Anois", + "After the move": "Tar éis an aistrithe", + "Only this task": "An tasc seo amháin", + "Move all": "Bog iad go léir", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stoptha ag {title}: níorbh fhéidir na dátaí a shábháil. Bogadh na tascanna roimhe.", + "Cumulative flow": "Sreabhadh carnach", + "Show as chart": "Taispeáin mar chairt", + "Show as table": "Taispeáin mar thábla", + "Tasks per column per day": "Tascanna in aghaidh an cholúin in aghaidh an lae", + "Tasks without recorded history in this period: {count}": "Tascanna gan stair taifeadta sa tréimhse seo: {count}", + "Lead and cycle time": "Am seachadta agus am timthrialla", + "No tasks were finished in this period.": "Níor críochnaíodh aon tasc sa tréimhse seo.", + "Finished tasks": "Tascanna críochnaithe", + "Cycle time, average": "Am timthrialla, meán", + "Cycle time, 85th percentile": "Am timthrialla, 85ú peircintíl", + "Lead time, average": "Am seachadta, meán", + "Tasks whose finish time was estimated from their history: {count}": "Tascanna ar measadh a n-am críochnaithe óna stair: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Am timthrialla gach taisc chríochnaithe, leis an meán agus an 85ú peircintíl", + "Slowest tasks": "Na tascanna is moille", + "cycle {cycle}, lead {lead}": "timthriall {cycle}, seachadadh {lead}", + "{days} days": "{days} lá", + "Could not load the flow of this project.": "Níorbh fhéidir sreabhadh an tionscadail seo a lódáil.", + "Last {days} days": "Na {days} lá deiridh", + "Portfolio flow": "Sreabhadh punainne", + "An admin adds portfolios under Projects, Portfolios.": "Cuireann riarthóir punanna leis faoi Tionscadail, Punanna.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Tionscadail nach dtaispeántar, mar ní thaispeántar níos mó ná 50 ag an am céanna: {count}", + "Could not load the flow of this portfolio.": "Níorbh fhéidir sreabhadh na punainne seo a lódáil.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Sreabhadh carnach agus am timthrialla thar thionscadail punainne.", + "Edit report": "Cuir an tuarascáil in eagar", + "Only tasks where": "Tascanna amháin ina", + "Group by": "Grúpáil de réir", + "Display": "Taispeáint", + "Share with everyone who can read its projects": "Comhroinn le gach duine ar féidir leo a tionscadail a léamh", + "The report could not be saved.": "Níorbh fhéidir an tuarascáil a shábháil.", + "Number of tasks": "Líon na dtascanna", + "Bar": "Barra", + "Donut": "Fáinne", + "Table": "Tábla", + "{hidden} of {total} projects in this report are not visible to you": "Níl {hidden} as {total} tionscadal sa tuarascáil seo le feiceáil agat", + "No tasks match this report.": "Níl aon tasc ag teacht leis an tuarascáil seo.", + "None": "Dada", + "Could not load this report.": "Níorbh fhéidir an tuarascáil seo a lódáil.", + "Report": "Tuarascáil", + "Your reports": "Do thuarascálacha", + "My reports": "Mo thuarascálacha", + "Shared reports": "Tuarascálacha comhroinnte", + "You have not built a report yet.": "Níl tuarascáil déanta agat fós.", + "Nobody has shared a report with you yet.": "Níor chomhroinn aon duine tuarascáil leat fós.", + "Reports you built over tasks, and the ones shared with you.": "Tuarascálacha a rinne tú ar thascanna, agus na cinn a comhroinneadh leat.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Ceist shábháilte ar thascanna: cé na tionscadail, cé na scagairí, grúpáilte de réir cad, comhairthe nó suimithe, agus taispeánta mar thábla nó mar chairt.", + "The name the report is listed under": "An t-ainm faoina bhfuil an tuarascáil liostaithe", + "What the report shows and who it is for": "Cad a thaispeánann an tuarascáil agus cé dó í", + "Nextcloud user id of the person who saved the report": "Aitheantas úsáideora Nextcloud an duine a shábháil an tuarascáil", + "Who can open the report": "Cé atá in ann an tuarascáil a oscailt", + "Only me": "Mise amháin", + "Everyone who can read its projects": "Gach duine ar féidir leo a tionscadail a léamh", + "The projects the report covers, at most fifty": "Na tionscadail a chlúdaíonn an tuarascáil, caoga ar a mhéad", + "Filters": "Scagairí", + "Task fields and the value each must equal": "Réimsí taisc agus an luach ar gá do gach ceann a bheith cothrom leis", + "The task field the report groups on": "An réimse taisc a ghrúpálann an tuarascáil de réir", + "Count the tasks, or add up a number on them": "Comhair na tascanna, nó suimigh uimhir orthu", + "Sum": "Suim", + "Sum of": "Suim de", + "The number added up when the measure is a sum": "An uimhir a shuimítear nuair is suim an tomhas", + "Story points": "Pointí scéil", + "Estimated duration": "Fad measta", + "How the report is shown": "Conas a thaispeántar an tuarascáil", + "Issue type": "Cineál ceisteanna", + "Task fields and the value each must equal; empty when the report covers every task": "Réimsí tasc agus an luach nach mór a bheith ag gach ceann; folamh nuair a chlúdaíonn an tuarascáil gach tasc", + "The status a task must have": "An stádas nach mór a bheith ag tasc", + "The priority a task must have": "An tosaíocht nach mór a bheith ag tasc", + "The user a task must be assigned to": "An t-úsáideoir nach mór tasc a bheith sannta dó", + "A label a task must carry": "Lipéad nach mór a bheith ar thasc", + "The board column a task must be in": "An colún cláir nach mór tasc a bheith ann", + "The issue type a task must have": "An cineál ceisteanna nach mór a bheith ag tasc", + "Manager groups": "Grúpaí bainisteoirí", + "Member groups": "Grúpaí ball", + "Viewer groups": "Grúpaí léitheoirí", + "Viewers": "Léitheoirí", + "Owning group": "Grúpa úinéara", + "Nextcloud groups whose members manage the project": "Grúpaí Nextcloud a bhainistíonn a gcuid ball an tionscadal", + "Nextcloud groups whose members work on the project": "Grúpaí Nextcloud a n-oibríonn a gcuid ball ar an tionscadal", + "Nextcloud groups whose members may read the project": "Grúpaí Nextcloud ar féidir lena gcuid ball an tionscadal a léamh", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Úsáideoirí Nextcloud a bhainistíonn an tionscadal: socruithe, baill agus obair", + "Nextcloud user ids who may read the project and its work but not change it": "Úsáideoirí Nextcloud ar féidir leo an tionscadal agus a chuid oibre a léamh ach gan iad a athrú", + "The Nextcloud group that owns the project with its creator, at most one": "An grúpa Nextcloud ar leis an tionscadal in éineacht lena chruthaitheoir, ceann amháin ar a mhéad", + "Nextcloud user ids who may read this through the project": "Úsáideoirí Nextcloud ar féidir leo é seo a léamh tríd an tionscadal", + "Nextcloud groups whose members may change this through the project": "Grúpaí Nextcloud ar féidir lena gcuid ball é seo a athrú tríd an tionscadal", + "Nextcloud groups whose members may read this through the project": "Grúpaí Nextcloud ar féidir lena gcuid ball é seo a léamh tríd an tionscadal", + "Search for a person or a group…": "Cuardaigh duine nó grúpa…", + "No one found. Your admin's sharing settings decide who you can find.": "Níor aimsíodh aon duine. Socruithe comhroinnte do riarthóra a shocraíonn cé atá le fáil agat.", + "Type at least two characters": "Clóscríobh dhá charachtar ar a laghad", + "Everyone in this group": "Gach duine sa ghrúpa seo", + "Could not search for people. Please try again.": "Níorbh fhéidir daoine a chuardach. Bain triail eile as.", + "Could not remove the group": "Níorbh fhéidir an grúpa a bhaint", + "Only the owner and managers change who is on this project.": "Ní athraíonn ach an t-úinéir agus na bainisteoirí cé atá ar an tionscadal seo.", + "Role of {name}": "Ról {name}", + "Manager": "Bainisteoir", + "Member": "Ball", + "Viewer": "Léitheoir", + "Could not change the role": "Níorbh fhéidir an ról a athrú", + "Owned by group: {name}": "Faoi úinéireacht an ghrúpa: {name}", + "No group owns this project.": "Níl aon ghrúpa ina úinéir ar an tionscadal seo.", + "Owned by group": "Faoi úinéireacht grúpa", + "Search for a group…": "Cuardaigh grúpa…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Níor aimsíodh aon ghrúpa. Socruithe comhroinnte do riarthóra a shocraíonn na grúpaí is féidir leat a aimsiú.", + "No owning group": "Gan grúpa úinéara", + "Could not search for groups. Please try again.": "Níorbh fhéidir grúpaí a chuardach. Bain triail eile as.", + "Could not change the owning group": "Níorbh fhéidir an grúpa úinéara a athrú", + "You can read this project. Only its members change it.": "Is féidir leat an tionscadal seo a léamh. Ní athraíonn ach a bhaill é.", + "Course": "Cúrsa", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "An cúrsa a mhúintear sa cheacht seo, mar shampla ábhar roghnach, nuair is eol d'aip foghlama na scoile é.", + "Online meeting link": "Nasc an cheachta ar líne", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Áit a nglacann daltaí páirt sa cheacht seo ar líne. Ní thaispeántar an cnaipe Glac páirt ach le nasc https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ga.json b/l10n/ga.json index a0440b6a..be681ef3 100644 --- a/l10n/ga.json +++ b/l10n/ga.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Tionscadail ghníomhacha", + "Archived projects": "Tionscadail chartlainne", + "Boards": "Cláir", + "My projects": "Mo thionscadail", + "Portfolio": "Punann", + "Project board": "Clár an tionscadail", + "Projects I am in": "Tionscadail a bhfuil baint agam leo", + "Timeline": "Amlíne", + "Timesheet": "Bileog ama", + "Features & roadmap": "Gnéithe agus treochlár", + "Flow": "Sruth", + "Flows": "Sruthanna", + "Reports": "Tuairiscí", + "Pick a report to open it.": "Roghnaigh tuairisc chun í a oscailt.", + "In progress": "Ar siúl", + "Date": "Dáta", + "Due": "Spriocdháta", + "Assignee": "Sannta do", + "Who": "Cé", + "What": "Cad", + "Minutes": "Nóiméad", + "Entries": "Iontrálacha", + "Most recent": "Is déanaí", + "Per person": "In aghaidh an duine", + "By status": "De réir stádais", + "By priority": "De réir tosaíochta", + "Task status": "Stádas tascanna", + "Time spent": "Am caite", + "Capacity": "Cumas", + "Due soonest": "Spriocdháta is luaithe", + "Minutes logged": "Nóiméid taifeadta", + "Nothing is due": "Níl aon rud dlite", + "Nothing logged yet": "Níl aon rud taifeadta go fóill", + "What is open, what is blocked, and what is overdue.": "Cad atá oscailte, cad atá bactha, agus cad atá thar téarma.", + "How allocation is spread across the people working on projects.": "Conas atá an t-ualach roinnte ar na daoine a oibríonn ar thionscadail.", + "Hours logged, and the projects they went to.": "Na huaireanta taifeadta agus na tionscadail chucu.", + "Billable": "Inmhuirearaithe", + "Budget: {amount}": "Buiséad: {amount}", + "Loading projects": "Tionscadail á luchtú", + "No projects for this client yet": "Níl aon tionscadal ann fós don chliant seo", + "Open in Planninq": "Oscail i Planninq", + "This project could not be found": "Níorbh fhéidir an tionscadal seo a aimsiú", + "Untitled project": "Tionscadal gan teideal", + "and {count} more": "agus {count} eile", + "Store": "Siopa", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Suiteáil cláir, scéimeanna agus sruthanna a d'fhoilsigh eagraíochtaí eile.", + "Work Date": "Dáta oibre", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Gníomhartha colúin", + "Columns": "Colúin", + "Could not remove the column. Please try again.": "Níorbh fhéidir an colún a bhaint. Bain triail eile as.", + "Could not save the column. Please try again.": "Níorbh fhéidir an colún a shábháil. Bain triail eile as.", + "Done column": "Colún críochnaithe", + "Edit column": "Cuir an colún in eagar", + "Keep the card's status": "Coinnigh stádas an chárta", + "Move its cards to": "Bog a chártaí go", + "Move left": "Bog ar chlé", + "Move right": "Bog ar dheis", + "Status of cards moved here": "Stádas na gcártaí a bhogtar anseo", + "The last done column cannot be removed.": "Ní féidir an colún críochnaithe deireanach a bhaint.", + "WIP limit": "Teorainn WIP", + "over limit": "os cionn na teorann", + "The status a card gets when it is moved into this column.": "An stádas a fhaigheann cárta nuair a bhogtar isteach sa cholún seo é.", + "All priorities": "Gach tosaíocht", + "Could not create the task. Please try again.": "Níorbh fhéidir an tasc a chruthú. Bain triail eile as.", + "Created": "Cruthaithe", + "Move to backlog": "Chuig an mbacliosta", + "Move to board": "Chuig an gclár", + "New task": "Tasc nua", + "Nothing in the backlog": "Níl aon rud sa bhacliosta", + "Rank": "Rangú", + "Sort by": "Sórtáil de réir", + "Sort by rank to reorder": "Sórtáil de réir rangaithe chun an t-ord a athrú", + "Task actions": "Gníomhartha taisc", + "All labels": "Gach lipéad", + "Filter tasks by label": "Scag tascanna de réir lipéid", + "View timeline": "Féach ar an amlíne", + "Board": "Clár", + "List": "Liosta", + "Column": "Colún", + "Board or list": "Clár nó liosta", + "Log": "Loga", + "Add entry": "Cuir iontráil leis", + "Show": "Taispeáin", + "No actions yet": "Níl aon ghníomhartha fós", + "Closed": "Dúnta", + "Entry actions": "Gníomhartha iontrála", + "Add action": "Cuir gníomh leis", + "by {author}": "le {author}", + "saved {time}": "sábháilte {time}", + "Attendees: {names}": "Lucht freastail: {names}", + "Add the first entry": "Cuir an chéad iontráil leis", + "Issues": "Saincheisteanna", + "Lessons learned": "Ceachtanna foghlamtha", + "Meetings": "Cruinnithe", + "Decisions": "Cinntí", + "Actions": "Gníomhartha", + "Issue": "Saincheist", + "Lesson learned": "Ceacht foghlamtha", + "Meeting": "Cruinniú", + "Decision": "Cinneadh", + "About this project": "Faoin tionscadal seo", + "No description yet": "Níl aon chur síos fós", + "Start date": "Dáta tosaigh", + "Not set": "Gan socrú", + "End date": "Dáta deiridh", + "Progress": "Dul chun cinn", + "No tasks yet": "Níl aon tascanna fós", + "Open the board": "Oscail an clár", + "People": "Daoine", + "Owner": "Úinéir", + "Latest log entries": "Na hiontrálacha is déanaí", + "Open the log": "Oscail an loga", + "{done} of {total} tasks done": "{done} as {total} tasc déanta", + "Edit entry": "Cuir an iontráil in eagar", + "Type": "Cineál", + "Attendees": "Lucht freastail", + "Issue is closed": "Tá an tsaincheist dúnta", + "Could not save the entry. Please try again.": "Níorbh fhéidir an iontráil a shábháil. Bain triail eile as.", + "From: {title}": "Ó: {title}", + "What needs to happen": "Cad is gá a dhéanamh", + "Could not create the action. Please try again.": "Níorbh fhéidir an gníomh a chruthú. Bain triail eile as.", + "The action was created but could not be linked to the entry.": "Cruthaíodh an gníomh ach níorbh fhéidir é a nascadh leis an iontráil.", + "Project pages": "Leathanaigh an tionscadail", + "Overview": "Forbhreathnú", + "Risks": "Rioscaí", + "Log entry": "Iontráil loga", + "A short name for the entry": "Ainm gearr don iontráil", + "Project": "Tionscadal", + "The project this entry belongs to": "An tionscadal lena mbaineann an iontráil seo", + "What kind of entry this is": "Cén cineál iontrála é seo", + "When it happened": "Cathain a tharla sé", + "What happened, in Markdown": "Cad a tharla, i Markdown", + "Whether an issue is still open": "An bhfuil saincheist fós oscailte", + "The people at a meeting": "Na daoine ag cruinniú", + "Tasks that came out of this entry": "Tascanna a d'eascair ón iontráil seo", + "Add risk": "Cuir riosca leis", + "Risk": "Riosca", + "Score": "Scór", + "Response": "Freagairt", + "Review date": "Dáta athbhreithnithe", + "no longer on the project": "níl sé ar an tionscadal a thuilleadh", + "Edit {title}": "Cuir {title} in eagar", + "No risks recorded yet": "Níl aon rioscaí taifeadta fós", + "Add the first risk": "Cuir an chéad riosca leis", + "Medium": "Meánach", + "Mitigating": "Á mhaolú", + "Occurred": "Tharla", + "Avoid": "Seachain", + "Reduce": "Laghdaigh", + "Transfer": "Aistrigh", + "Accept": "Glac leis", + "Highest open risks": "Na rioscaí oscailte is airde", + "No open risks": "Níl aon rioscaí oscailte", + "Open the risk register": "Oscail an clár rioscaí", + "Edit risk": "Cuir riosca in eagar", + "What could go wrong": "Cad a d'fhéadfadh dul mícheart", + "Likelihood": "Dóchúlacht", + "Impact": "Tionchar", + "Score {score}": "Scór {score}", + "Countermeasures": "Frithbhearta", + "Could not save the risk. Please try again.": "Níorbh fhéidir an riosca a shábháil. Bain triail eile as.", + "Risks by likelihood and impact": "Rioscaí de réir dóchúlachta agus tionchair", + "Risk scale": "Scála riosca", + "The levels every project scores its risks on, and where low turns into medium and high": "Na leibhéil ar a scórálann gach tionscadal a rioscaí, agus an áit a n-éiríonn íseal ina mheánach agus ina ard", + "Number of levels": "Líon na leibhéal", + "Likelihood labels": "Lipéid dóchúlachta", + "Impact labels": "Lipéid tionchair", + "Level {level}": "Leibhéal {level}", + "Medium from score": "Meánach ón scór", + "High from score": "Ard ón scór", + "Risk scale saved": "Sábháladh an scála riosca", + "1 risk uses level {level}. Change it first.": "Úsáideann 1 riosca leibhéal {level}. Athraigh é ar dtús.", + "{count} risks use level {level}. Change them first.": "Úsáideann {count} riosca leibhéal {level}. Athraigh iad ar dtús.", + "Every level needs a label, and high must start above medium.": "Tá lipéad de dhíth ar gach leibhéal, agus caithfidh ard tosú os cionn meánach.", + "The project this risk belongs to": "An tionscadal lena mbaineann an riosca seo", + "The cause and the effect, in Markdown": "An chúis agus an toradh, i Markdown", + "Category": "Catagóir", + "A free grouping, such as planning, budget or supplier": "Grúpáil shaor, mar phleanáil, buiséad nó soláthraí", + "How likely it is, on the admin's risk scale": "Cé chomh dóchúil is atá sé, ar scála riosca an riarthóra", + "How hard it would hit, on the admin's risk scale": "Cé chomh crua is a bhuailfeadh sé, ar scála riosca an riarthóra", + "Likelihood times impact, calculated by the server": "Dóchúlacht faoi thionchar, arna ríomh ag an bhfreastalaí", + "Where the risk stands": "Cá bhfuil an riosca", + "The person who watches this risk": "An duine a choinníonn súil ar an riosca seo", + "How the project answers the risk": "Conas a fhreagraíonn an tionscadal an riosca", + "What is done to prevent it or soften it, in Markdown": "Cad a dhéantar chun é a chosc nó a mhaolú, i Markdown", + "When to look at this risk again": "Cathain an riosca a athbhreithniú", + "Very low": "An-íseal", + "Very high": "An-ard", + "All projects": "Gach tionscadal", + "Project status report": "Tuarascáil stádais tionscadail", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Tuarascáil dhátaithe ar an gcaoi a bhfuil tionscadal ó thaobh airgid, eagraíochta, ama, faisnéise, cáilíochta agus riosca (gnéithe GROTIK), gach ceann le nóta.", + "The project this report is about": "An tionscadal a bhfuil an tuarascáil faoi", + "Report date": "Dáta na tuarascála", + "The day the report describes": "An lá a chuireann an tuarascáil síos air", + "Money": "Airgead", + "How the project stands on this aspect": "Conas atá an tionscadal ó thaobh na gné seo", + "On track": "De réir an phlean", + "At risk": "I mbaol", + "Off track": "As an bplean", + "Money note": "Nóta ar airgead", + "A short explanation of this status": "Míniú gearr ar an stádas seo", + "Organisation": "Eagraíocht", + "Organisation note": "Nóta ar eagraíocht", + "Time": "Am", + "Time note": "Nóta ar am", + "Information": "Faisnéis", + "Information note": "Nóta ar fhaisnéis", + "Quality": "Cáilíocht", + "Quality note": "Nóta ar cháilíocht", + "Risk note": "Nóta ar riosca", + "Overall": "Iomlán", + "The worst of the six statuses, calculated by the server": "An ceann is measa de na sé stádas, ríofa ag an bhfreastalaí", + "Health: money": "Sláinte: airgead", + "Copied from the newest status report": "Cóipeáilte ón tuarascáil stádais is déanaí", + "Health: organisation": "Sláinte: eagraíocht", + "Health: time": "Sláinte: am", + "Health: information": "Sláinte: faisnéis", + "Health: quality": "Sláinte: cáilíocht", + "Health: risk": "Sláinte: riosca", + "Health: overall": "Sláinte: iomlán", + "Health: report date": "Sláinte: dáta na tuarascála", + "The date of the newest status report": "Dáta na tuarascála stádais is déanaí", + "New report": "Tuarascáil nua", + "Only the project owner writes status reports.": "Ní scríobhann ach úinéir an tionscadail tuarascálacha stádais.", + "Latest report, {date}": "An tuarascáil is déanaí, {date}", + "Aspect": "Gné", + "Note": "Nóta", + "Report history": "Stair na dtuarascálacha", + "Author": "Údar", + "No status reports yet": "Níl aon tuarascáil stádais fós", + "Write the first report": "Scríobh an chéad tuarascáil", + "Choose a status for every aspect to save the report.": "Roghnaigh stádas do gach gné chun an tuarascáil a shábháil.", + "Suggested: on track.": "Moladh: de réir an phlean.", + "Suggested: at risk.": "Moladh: i mbaol.", + "Suggested: off track.": "Moladh: as an bplean.", + "1 task is past its due date.": "Tá 1 tasc thar a spriocdháta.", + "{count} tasks are past their due date.": "Tascanna thar a spriocdháta: {count}.", + "The end date has passed with 1 open task.": "Tá an dáta deiridh caite agus 1 tasc oscailte.", + "The end date has passed with {count} open tasks.": "Tá an dáta deiridh caite, tascanna oscailte: {count}.", + "No open task is past its due date.": "Níl aon tasc oscailte thar a spriocdháta.", + "The highest open risk, \"{title}\", scores {score}.": "Tá scór {score} ag an riosca oscailte is airde, \"{title}\".", + "There are no open risks.": "Níl aon riosca oscailte.", + "Costs are at {percent}% of the budget.": "Tá na costais ag {percent}% den bhuiséad.", + "No suggestion: the project has no budget.": "Gan mholadh: níl buiséad ag an tionscadal.", + "No suggestion: no costs are recorded for this project yet.": "Gan mholadh: níl aon chostas taifeadta don tionscadal seo fós.", + "The report was not saved. Only the project owner can write status reports.": "Níor sábháladh an tuarascáil. Ní féidir ach le húinéir an tionscadail tuarascálacha stádais a scríobh.", + "No report": "Gan tuarascáil", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Grúpa tionscadal a reáchtálann na daoine céanna, mar roinn nó clár. Léann a bhainisteoirí gach tionscadal ann.", + "The name of the portfolio": "Ainm na punainne", + "What the portfolio holds and who runs it": "Cad atá sa phunann agus cé a reáchtálann í", + "A colour for the portfolio's section in project lists": "Dath do chuid na punainne i liostaí tionscadal", + "Managers": "Bainisteoirí", + "Nextcloud user UIDs of the people who run the portfolio": "Aitheantais úsáideora Nextcloud na ndaoine a reáchtálann an phunann", + "Order": "Ord", + "Where the portfolio comes in project lists, lowest first": "Áit na punainne i liostaí tionscadal, an ceann is ísle ar dtús", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Scála riosca na punainne seo féin mar JSON, sa chruth céanna le scála an aip ar fad. Ciallaíonn folamh scála an aip.", + "Portfolio readers": "Léitheoirí na punainne", + "Nextcloud user UIDs of the managers of the project's portfolio": "Aitheantais úsáideora Nextcloud bhainisteoirí phunann an tionscadail", + "The portfolio this project belongs to": "An phunann lena mbaineann an tionscadal seo", + "No portfolio": "Gan punann", + "All portfolios": "Gach punann", + "You read this project as a manager of its portfolio. Only its members change it.": "Léann tú an tionscadal seo mar bhainisteoir ar a phunann. Ní athraíonn ach a bhaill é.", + "Portfolios": "Punanna", + "Portfolio status": "Stádas na punainne", + "No portfolios yet": "Níl aon phunann fós", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Cuireann riarthóir punanna leis faoi Tionscadail, Punanna. Liostaítear tionscadail punainne anseo lena stádas.", + "Roll-up": "Achoimre", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} ar an sprioc, {atRisk} i mbaol, {offTrack} as an sprioc, {noReport} gan tuairisc", + "No project in this portfolio that you can read.": "Níl aon tionscadal sa phunann seo is féidir leat a léamh.", + "Start": "Tús", + "End": "Deireadh", + "Budget": "Buiséad", + "Last report": "Tuairisc dheireanach", + "Out of date": "As dáta", + "Portfolio timeline": "Amlíne na punainne", + "Zoom": "Súmáil", + "Could not load the timeline": "Níorbh fhéidir an amlíne a lódáil", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Cuireann riarthóir punanna leis faoi Tionscadail, Punanna. Taispeántar tionscadail punainne anseo ar amlíne amháin.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Oscail tionscadal chun a chéimeanna agus a thascanna a fheiceáil. Is le léamh amháin an amlíne.", + "Phase: {title}": "Céim: {title}", + "Left out because you cannot read them: {count} projects": "Fágtha ar lár mar nach féidir leat iad a léamh: {count} tionscadal", + "Week": "Seachtain", + "Day": "Lá", + "Month": "Mí", + "Please try again later.": "Bain triail eile as ar ball.", + "Status reports": "Tuairiscí stádais", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Tar éis cé mhéad lá a mharcáiltear an tuairisc stádais is déanaí de thionscadal as dáta i bhforbhreathnú na punainne", + "Reporting period (days)": "Tréimhse tuairiscithe (laethanta)", + "The reporting period is a whole number of days from 1 to 365.": "Is slánuimhir laethanta ó 1 go 365 an tréimhse tuairiscithe.", + "Reporting period saved": "Tréimhse tuairiscithe sábháilte", + "The reporting period was not saved. Please try again.": "Níor sábháladh an tréimhse tuairiscithe. Bain triail eile as.", + "Every project of a portfolio with its status per aspect, rolled up.": "Gach tionscadal de phunann lena stádas de réir gné, achoimrithe.", + "The projects of a portfolio on one timeline.": "Tionscadail punainne ar amlíne amháin.", + "Phases": "Céimeanna", + "Add phase": "Cuir céim leis", + "No phases yet": "Níl aon chéim fós", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Roinn an tionscadal ina chéimeanna, mar thionscnamh, sainmhíniú agus cur i bhfeidhm. Dúnann céim nuair a uaslódáiltear a doiciméad deiridh.", + "{hours} hours": "{hours} uair", + "Concluding document: {title}": "Doiciméad deiridh: {title}", + "Concluding document missing": "Doiciméad deiridh ar iarraidh", + "Move {title} up": "Bog {title} suas", + "Move {title} down": "Bog {title} síos", + "Close phase": "Dún an chéim", + "Phase": "Céim", + "Files": "Comhaid", + "Notes": "Nótaí", + "Audit trail": "Rian iniúchta", + "Edit phase": "Cuir an chéim in eagar", + "Name": "Ainm", + "Budget hours": "Uaireanta buiséid", + "Could not save the phase. Please try again.": "Níorbh fhéidir an chéim a shábháil. Bain triail eile as.", + "Close phase {title}": "Dún an chéim {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Dúnann céim lena doiciméad deiridh: uaslódáil anseo é nó roghnaigh ceann de chomhaid na céime.", + "Concluding document": "Doiciméad deiridh", + "This phase has no files yet.": "Níl aon chomhad ag an gcéim seo fós.", + "Upload a document": "Uaslódáil doiciméad", + "The document was not uploaded. Please try again.": "Níor uaslódáladh an doiciméad. Bain triail eile as.", + "Upload the concluding document before you close this phase.": "Uaslódáil an doiciméad deiridh sula ndúnann tú an chéim seo.", + "This phase cannot be closed from its current status.": "Ní féidir an chéim seo a dhúnadh óna stádas reatha.", + "The phase was not closed. Please try again.": "Níor dúnadh an chéim. Bain triail eile as.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Aitheantas an chomhaid ar an gcéim seo a chríochnaíonn í. Ní féidir an chéim a chríochnú go dtí go bhfuil sé socraithe agus an comhad ceangailte.", + "Import from Microsoft Project": "Iompórtáil ó Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Roghnaigh plean a sábháladh ó Microsoft Project i bhformáid XML. Ní iompórtáiltear aon rud go dtí go ndeimhníonn tú.", + "Plan file": "Comhad an phlean", + "What the import creates": "An méid a chruthaíonn an iompórtáil", + "Tasks": "Tascanna", + "Sub-tasks": "Fothascanna", + "Milestones": "Clocha míle", + "Links": "Naisc", + "Already imported, updated in place: {count}": "Iompórtáilte cheana, nuashonraithe ina n-áit: {count}", + "What does not carry over": "An méid nach n-aistrítear", + "Tasks with resources, which are not imported: {count}": "Tascanna le hacmhainní, nach n-iompórtáiltear: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tascanna níos doimhne ná leibhéal 3, curtha faoina dtasc ag leibhéal 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Naisc seachas críoch-go-tús, iompórtáilte mar naisc ghaolmhara: {count}", + "Link lags, which are dropped: {count}": "Moilleanna nasc, a ligtear ar lár: {count}", + "Links to a summary task, which are not imported: {count}": "Naisc le tasc achomair, nach n-iompórtáiltear: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Naisc le tascanna lasmuigh den phlean seo, nach n-iompórtáiltear: {count}", + "No longer in the plan": "Níl sé sa phlean a thuilleadh", + "These stay in the project; remove them yourself if they are no longer needed.": "Fanann siad sa tionscadal; bain féin iad mura bhfuil gá leo a thuilleadh.", + "Import": "Iompórtáil", + "Close": "Dún", + "The plan is imported: {created} created, {updated} updated.": "Tá an plean iompórtáilte: {created} cruthaithe, {updated} nuashonraithe.", + "Links that would close a loop were left out: {count}": "Fágadh ar lár naisc a dhúnfadh lúb: {count}", + "The import stopped part-way. Run it again to finish it.": "Stad an iompórtáil leath bealaigh. Rith arís í chun í a chríochnú.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Sábháil an plean i Microsoft Project le Comhad, Sábháil mar, formáid XML, agus iompórtáil an comhad sin.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Fógraíonn an comhad seo DOCTYPE nó aonáin, nach nglactar leo.", + "The file is larger than 10 MB.": "Tá an comhad níos mó ná 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Tá níos mó ná 2,000 tasc sa phlean, níos mó ná a ghlacann iompórtáil amháin.", + "This file is not a Microsoft Project plan in XML format.": "Ní plean Microsoft Project i bhformáid XML é an comhad seo.", + "Choose a file to import.": "Roghnaigh comhad le hiompórtáil.", + "Only the project owner can import a plan.": "Ní féidir ach le húinéir an tionscadail plean a iompórtáil.", + "The plan could not be read. Please try again.": "Níorbh fhéidir an plean a léamh. Bain triail eile as.", + "Linked case: {title}": "Cás nasctha: {title}", + "Linked to a case": "Nasctha le cás", + "Hand over to case": "Tabhair don chás", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Cóipeálann sé gach comhad den tionscadal agus dá thascanna, agus comhad a chuireann síos ar an tionscadal, gan athrú chuig an gcás nasctha.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Comhaid cóipeáilte: {count}", + "Files that failed: {names}": "Comhaid a theip: {names}", + "The handover failed. Please try again.": "Theip ar an tabhairt. Bain triail eile as.", + "The linked case could not be found, or you cannot open it.": "Níor aimsíodh an cás nasctha, nó ní féidir leat é a oscailt.", + "Case handovers": "Tabhairtí don chás", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Gach uair a tugadh comhaid agus meiteashonraí an tionscadail dá chás: cathain, cé, cén cás, gach comhad cóipeáilte lena SHA-256, agus na comhaid a theip.", + "Finance": "Airgeadas", + "Add cost line": "Cuir líne costais leis", + "Delivery terms": "Téarmaí seachadta", + "Billing model": "Samhail bhillí", + "Budget in euro": "Buiséad in euro", + "Budget in hours": "Buiséad in uaireanta", + "Hourly rate in euro": "Ráta in aghaidh na huaire in euro", + "Planned start": "Tús pleanáilte", + "Planned end": "Deireadh pleanáilte", + "Planned dates": "Dátaí pleanáilte", + "Budget {amount}": "Buiséad {amount}", + "No budget agreed": "Níor comhaontaíodh buiséad", + "Hours": "Uaireanta", + "Only the project owner and the portfolio managers see the amounts.": "Ní fheiceann ach úinéir an tionscadail agus bainisteoirí na punainne na suimeanna.", + "Budget against cost per category": "Buiséad i gcoinne costais de réir catagóire", + "Labour (booked time)": "Saothar (am taifeadta)", + "No category": "Gan catagóir", + "Hours are not available": "Níl na huaireanta ar fáil", + "Not yet assigned to a category": "Gan sannadh do chatagóir fós", + "Total": "Iomlán", + "{spent} spent, {remaining} remaining": "{spent} caite, {remaining} fágtha", + "Budget against cost per phase": "Buiséad i gcoinne costais de réir céime", + "No phase": "Gan chéim", + "Cost lines": "Línte costais", + "From the finance system": "Ón gcóras airgeadais", + "Edit cost line {amount}": "Cuir an líne costais {amount} in eagar", + "No cost lines yet": "Níl aon línte costais fós", + "Commitments": "Gealltanais", + "Actual cost": "Costas iarbhír", + "Forecast": "Réamhaisnéis", + "Remaining": "Fágtha", + "Not planned yet": "Níl sé pleanáilte fós", + "{start} to {end}": "{start} go {end}", + "The terms were not saved. Please try again.": "Níor sábháladh na téarmaí. Bain triail eile as.", + "Terms saved": "Téarmaí sábháilte", + "Fixed price": "Praghas seasta", + "Hourly": "In aghaidh na huaire", + "Not billed": "Gan bhilleáil", + "Commitment": "Gealltanas", + "Edit cost line": "Cuir líne costais in eagar", + "Kind": "Cineál", + "Amount in euro": "Suim in euro", + "Remove": "Bain", + "Could not save the cost line. Only the project owner changes the money of a project.": "Níorbh fhéidir an líne costais a shábháil. Ní athraíonn ach úinéir an tionscadail airgead tionscadail.", + "Could not remove the cost line. Please try again.": "Níorbh fhéidir an líne costais a bhaint. Bain triail eile as.", + "{amount} over budget": "{amount} thar an mbuiséad", + "Cost categories": "Catagóirí costais", + "The categories every project splits its budget and costs into, one per line": "Na catagóirí ina roinneann gach tionscadal a bhuiséad agus a chostais, ceann in aghaidh an líne", + "Categories": "Catagóirí", + "Give at least one category, each name once.": "Tabhair catagóir amháin ar a laghad, gach ainm uair amháin.", + "Cost categories saved": "Catagóirí costais sábháilte", + "The cost categories were not saved. Please try again.": "Níor sábháladh na catagóirí costais. Bain triail eile as.", + "Finance line": "Líne airgeadais", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Suim airgid amháin ar thionscadal: buiséad, gealltanas, costas iarbhír nó réamhaisnéis, i gcatagóir costais agus i gcéim más mian. Iontráilte ag úinéir an tionscadail, nó seolta ag an gcóras airgeadais tríd an aip chomhtháthaithe.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "An tionscadal lena mbaineann an tsuim seo. Folamh do líne ón gcóras airgeadais nach n-oireann a huimhir tionscadail d'aon tionscadal.", + "The phase this amount belongs to, if any": "An chéim lena mbaineann an tsuim seo, más ann di", + "The cost category, one of the categories the admin set up": "An chatagóir costais, ceann de na catagóirí a shocraigh an riarthóir", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Cé acu buiséad, gealltanas, costas iarbhír nó réamhaisnéis atá sa tsuim", + "Amount": "Suim", + "The amount in the reporting currency (euro)": "An tsuim san airgeadra tuairiscithe (euro)", + "The date the amount was booked or is expected": "An dáta ar cuireadh an tsuim isteach nó a bhfuiltear ag súil léi", + "What the amount is for": "Cad chuige an tsuim", + "Whether a person entered the line or the finance system sent it": "Cé acu duine a d'iontráil an líne nó an córas airgeadais a sheol í", + "Entered by hand": "Iontráilte de láimh", + "Finance line id": "Aitheantas na líne airgeadais", + "The finance system's own id of this line. One imported line per id.": "Aitheantas na líne seo féin sa chóras airgeadais. Líne iompórtáilte amháin in aghaidh an aitheantais.", + "Project number": "Uimhir tionscadail", + "The project number the finance system sent, matched against the project key": "An uimhir tionscadail a sheol an córas airgeadais, curtha i gcomparáid le heochair an tionscadail", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Punann thionscadal na líne, cóipeáilte ón tionscadal ionas nach mbeidh ach scagaire amháin ag teastáil d'iomláin na punainne", + "Finance readers": "Léitheoirí airgeadais", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UIDanna úsáideora Nextcloud na ndaoine a fhéadfaidh an tsuim a fheiceáil: úinéir an tionscadail agus bainisteoirí a phunainne", + "Project owner": "Úinéir an tionscadail", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID úsáideora Nextcloud úinéir an tionscadail, a fhéadfaidh línte láimhe a athrú agus a bhaint", + "How the client pays: not billed, a fixed price, or by the hour.": "Conas a íocann an cliant: gan bhilleáil, praghas seasta nó in aghaidh na huaire.", + "Portfolio finance": "Airgeadas na punainne", + "You cannot see the money of any project in this portfolio": "Ní fheiceann tú airgead aon tionscadail sa phunann seo", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Sheol an freastalaí línte costais ó thionscadail lasmuigh den phunann seo, mar sin d'fhéadfadh na hiomláin a bheith mícheart.", + "Projects left out because you cannot see their money: {count}": "Tionscadail fágtha amach toisc nach bhfeiceann tú a n-airgead: {count}", + "Unmatched finance lines": "Línte airgeadais gan mheaitseáil", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Buiséad, gealltanais, costas iarbhír agus réamhaisnéis iomlánaithe thar phunann.", + "Subprojects": "Fothionscadail", + "{done} of {total}": "{done} as {total}", + "{done} of {total} tasks done, including subprojects": "{done} as {total} tasc déanta, fothionscadail san áireamh", + "Show the subprojects of {title}": "Taispeáin fothionscadail {title}", + "Hide the subprojects of {title}": "Folaigh fothionscadail {title}", + "Part of": "Cuid de", + "No parent project": "Gan máthairthionscadal", + "A project cannot sit under one of its own subprojects.": "Ní féidir le tionscadal suí faoi cheann dá fhothionscadail féin.", + "Projects nest three levels deep at most: programme, project and subproject.": "Neadaíonn tionscadail trí leibhéal ar a mhéad: clár, tionscadal agus fothionscadal.", + "Parent project": "Máthairthionscadal", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "An tionscadal a bhfuil an tionscadal seo faoi, mar shampla clár. Neadaíonn tionscadail trí leibhéal ar a mhéad.", + "Yes": "Tá", + "No": "Níl", + "{label} (required)": "{label} (riachtanach)", + "{label} is required": "Tá {label} riachtanach", + "Project field": "Réimse tionscadail", + "A field an admin adds to every project, such as a policy area or a contract value.": "Réimse a chuireann riarthóir le gach tionscadal, mar réimse beartais nó luach conartha.", + "Key": "Eochair", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "An t-ainm buan faoina stóráiltear an luach, i lower camel case. Coinnigh é nuair a úsáideann tionscadail é.", + "Label": "Lipéad", + "The name people see next to the field": "An t-ainm a fheiceann daoine in aice leis an réimse", + "What the field holds": "Cad atá sa réimse", + "Text": "Téacs", + "Number": "Uimhir", + "Choice": "Rogha", + "Person": "Duine", + "Yes or no": "Tá nó níl", + "Options": "Roghanna", + "The choices of a choice field": "Roghanna réimse rogha", + "Required": "Riachtanach", + "Whether a project must fill in the field": "Cé acu an gcaithfidh tionscadal an réimse a líonadh", + "Where the field appears, lowest first": "Cá bhfeictear an réimse, an ceann is ísle ar dtús", + "Applies to": "Baineann le", + "What the field is added to": "Cad lena gcuirtear an réimse", + "Custom fields": "Réimsí féin", + "The values of the project fields an admin defined, keyed by the field's key.": "Luachanna na réimsí tionscadail a shainigh riarthóir, de réir eochair an réimse.", + "Project fields": "Réimsí tionscadail", + "Related": "Gaolmhar", + "Remove link": "Bain an nasc", + "Link type": "Cineál naisc", + "Relates to": "Bainteach le", + "Duplicates": "Dúblaíonn", + "Project key": "Eochair an tionscadail", + "Every task number starts with it, such as VERG-42.": "Tosaíonn gach uimhir tasc léi, mar shampla VERG-42.", + "This key is already used by another project.": "Tá an eochair seo in úsáid cheana ag tionscadal eile.", + "Use 2 to 10 letters and digits, starting with a letter.": "Úsáid 2 go 10 litir agus digit, ag tosú le litir.", + "The key cannot change once tasks carry it.": "Ní féidir an eochair a athrú nuair atá sí ar thascanna.", + "Project saved. The existing tasks get their numbers in the background.": "Sábháladh an tionscadal. Faigheann na tascanna atá ann a n-uimhreacha sa chúlra.", + "Next task number": "Uimhir an chéad taisc eile", + "The number the next task of this project gets in its key. Only the system writes it.": "An uimhir a fhaigheann an chéad tasc eile den tionscadal seo ina eochair. Ní scríobhann ach an córas í.", + "Restore {title}": "Athchóirigh {title}", + "Restore": "Athchóirigh", + "Project restored": "Athchóiríodh an tionscadal", + "Could not restore the project": "Níorbh fhéidir an tionscadal a athchóiriú", + "Bring this project back to the active list.": "Cuir an tionscadal seo ar ais ar liosta na dtionscadal gníomhach.", + "Restore project": "Athchóirigh an tionscadal", + "Request reason": "Cúis an iarratais", + "Why the requester needs this project. Filled in when the project is requested.": "Cén fáth a bhfuil an tionscadal seo de dhíth ar an iarratasóir. Líontar é leis an iarratas.", + "Reviewed by": "Athbhreithnithe ag", + "The user who approved or rejected the request.": "An t-úsáideoir a d’fhaomh nó a dhiúltaigh an t-iarratas.", + "Reviewed at": "Athbhreithnithe ar", + "When the request was approved or rejected.": "Cathain a faomhadh nó a diúltaíodh an t-iarratas.", + "Review note": "Nóta athbhreithnithe", + "The reviewer's reason, shown to the requester when a request is not approved.": "Cúis an athbhreithneora, a fheiceann an t-iarratasóir nuair nach bhfaomhtar iarratas.", + "Members of these groups": "Baill na ngrúpaí seo", + "Groups that may create projects": "Grúpaí ar féidir leo tionscadail a chruthú", + "The group {group} no longer exists. Save to remove it.": "Níl an grúpa {group} ann a thuilleadh. Sábháil chun é a bhaint.", + "Review project request": "Athbhreithnigh an t-iarratas tionscadail", + "Requested by": "Iarrtha ag", + "Why it is needed": "Cén fáth a bhfuil sé de dhíth", + "Desired start date": "Dáta tosaigh inmhianaithe", + "Why is it not approved?": "Cén fáth nach bhfaomhtar é?", + "Give a reason. The requester sees it.": "Tabhair cúis. Feicfidh an t-iarratasóir í.", + "Approve": "Faomh", + "Reject": "Diúltaigh", + "Reject request": "Diúltaigh don iarratas", + "The review was not saved. Try again.": "Níor sábháladh an t-athbhreithniú. Bain triail eile as.", + "This project is waiting for review": "Tá an tionscadal seo ag fanacht le hathbhreithniú", + "This request was not approved": "Níor faomhadh an t-iarratas seo", + "Reason: {note}": "Cúis: {note}", + "Review request": "Athbhreithnigh an t-iarratas", + "Request a project": "Iarr tionscadal", + "Step {step} of 2": "Céim {step} de 2", + "Why is this project needed?": "Cén fáth a bhfuil an tionscadal seo de dhíth?", + "Give a reason. The reviewer reads it.": "Tabhair cúis. Léifidh an t-athbhreithneoir í.", + "Back": "Siar", + "Next": "Ar aghaidh", + "Send request": "Seol an t-iarratas", + "The request was not sent. Try again.": "Níor seoladh an t-iarratas. Bain triail eile as.", + "Requested": "Iarrtha", + "Not approved": "Gan fhaomhadh", + "Your request was sent": "Seoladh d’iarratas", + "Let everyone else request a project": "Lig do gach duine eile tionscadal a iarraidh", + "Add a task": "Cuir tasc leis", + "Delete task": "Scrios an tasc", + "Edit task": "Cuir an tasc in eagar", + "Write": "Scríobh", + "Preview": "Réamhamharc", + "Markdown works here: headings, lists and links.": "Oibríonn Markdown anseo: ceannteidil, liostaí agus naisc.", + "Could not save the task. Please try again.": "Níorbh fhéidir an tasc a shábháil. Bain triail eile as.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Tá am logáilte ar \"{title}\", mar sin ní féidir é a scriosadh. Is féidir leat é a chealú ina ionad: fanann na hiontrálacha ama.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Scrios \"{title}\"? Baintear a naisc le tascanna eile freisin. Ní féidir é seo a chealú.", + "Keep task": "Coinnigh an tasc", + "Cancel task": "Cealaigh an tasc", + "Only the reporter, the project owner or an admin can delete this task.": "Ní féidir ach leis an tuairisceoir, le húinéir an tionscadail nó le riarthóir an tasc seo a scriosadh.", + "Could not delete the task. Please try again.": "Níorbh fhéidir an tasc a scriosadh. Bain triail eile as.", + "Could not cancel the task. Please try again.": "Níorbh fhéidir an tasc a chealú. Bain triail eile as.", + "Responsible": "Freagrach", + "Also working on this": "Ag obair air seo freisin", + "Labels": "Lipéid", + "Could not change the priority. Please try again.": "Níorbh fhéidir an tosaíocht a athrú. Bain triail eile as.", + "Other project members who work on this task alongside the person responsible.": "Baill eile den tionscadal atá ag obair ar an tasc seo in éineacht leis an duine freagrach.", + "Duplicate": "Dúblaigh", + "Could not copy the task. Please try again.": "Níorbh fhéidir an tasc a chóipeáil. Bain triail eile as.", + "Subtasks": "Fo-thascanna", + "{done} of {total} done": "{done} as {total} déanta", + "Add a subtask": "Cuir fo-thasc leis", + "Checklist": "Seicliosta", + "Checklist item actions": "Gníomhartha míre seicliosta", + "Add a checklist item": "Cuir mír seicliosta leis", + "Subtasks: {estimate} estimated, {logged} logged": "Fo-thascanna: {estimate} measta, {logged} logáilte", + "Total estimate: {total}": "Meastachán iomlán: {total}", + "Part of {title}": "Cuid de {title}", + "Checklist: {count} done": "Seicliosta: {count} déanta", + "This task has subtasks: {count}.": "Tá fo-thascanna ag an tasc seo: {count}.", + "Keep subtasks as separate tasks": "Coinnigh na fo-thascanna mar thascanna ar leith", + "Delete subtasks too": "Scrios na fo-thascanna freisin", + "Copy of {title}": "Cóip de {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Cóipeáladh an tasc, ach ní a fo-thascanna go léir. Seiceáil an chóip.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Céimeanna beaga laistigh den tasc. Tá aitheantas, téacs agus stádas déanta ag gach mír.", + "Open work per person and per project.": "Obair oscailte de réir duine agus de réir tionscadail.", + "View": "Amharc", + "By person": "De réir duine", + "By project": "De réir tionscadail", + "Hours left": "Uaireanta fágtha", + "Tasks without an estimate": "Tascanna gan meastachán", + "Due in 14 days": "Dlite laistigh de 14 lá", + "Shared": "Roinnte", + "Unassigned": "Gan sannadh", + "{hours} h": "{hours} u", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Taispeántar an obair sna tionscadail is féidir leat a fheiceáil. Comhairtear na huaireanta don duine freagrach; comhairtear tascanna roinnte gan uaireanta.", + "No open work in these projects.": "Níl aon obair oscailte sna tionscadail seo.", + "Open work": "Obair oscailte", + "{count} open tasks": "{count} tasc oscailte", + "Create a project to see capacity here.": "Cruthaigh tionscadal chun an acmhainn a fheiceáil anseo.", + "My tasks": "Mo thascanna", + "Show all my tasks": "Taispeáin mo thascanna go léir", + "No tasks assigned to you": "Níl aon tascanna sannta duit", + "Browse projects": "Brabhsáil tionscadail", + "Later": "Níos déanaí", + "Due {date}": "Dlite {date}", + "Could not change the status. Please try again.": "Níorbh fhéidir an stádas a athrú. Bain triail eile as.", + "Completed today": "Críochnaithe inniu", + "My open tasks": "Mo thascanna oscailte", + "My overdue tasks": "Mo thascanna thar téarma", + "My tasks in progress": "Mo thascanna ar siúl", + "Pin to the top": "Pionnáil ag an mbarr", + "Unpin": "Díphionnáil", + "Pinned": "Pionnáilte", + "Actions for {title}": "Gníomhartha do {title}", + "Could not save your project order. Please try again.": "Níorbh fhéidir ord do thionscadal a shábháil. Bain triail eile as.", + "No boards yet": "Níl aon chláir fós", + "Create a project to get a board.": "Cruthaigh tionscadal chun clár a fháil.", + "Use the Projects page to create and manage your projects and tasks.": "Úsáid an leathanach Tionscadail chun do thionscadail agus do thascanna a chruthú agus a bhainistiú.", + "Go to projects": "Téigh go dtí na tionscadail", + "You are not a member of any projects yet.": "Níl tú i do bhall d'aon tionscadal fós.", + "Could not search for users. Please try again.": "Níorbh fhéidir úsáideoirí a chuardach. Bain triail eile as.", + "Project creation is restricted to administrators.": "Ní féidir ach le riarthóirí tionscadail a chruthú.", + "Only the project owner or an administrator can delete this project.": "Ní féidir ach le húinéir an tionscadail nó le riarthóir an tionscadal seo a scriosadh.", + "No projects are available to you yet. Ask an administrator to create one.": "Níl aon tionscadail ar fáil duit fós. Iarr ar riarthóir ceann a chruthú.", + "Due: {date}": "Dlite: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Taispeántar tascanna a bhfuil dáta tosaigh nó dáta dlite acu ar an amlíne. Cuir dátaí leo chun iad a fheiceáil anseo.", + "You do not have access to this project.": "Níl rochtain agat ar an tionscadal seo.", + "Zoom level": "Leibhéal súmála", + "Unscheduled": "Gan sceideal", + "Start: {date}": "Tús: {date}", + "Today": "Inniu", + "No scheduled tasks": "Níl aon tascanna sceidealaithe", + "An unexpected error occurred.": "Tharla earráid gan choinne.", + "Column {number} name": "Ainm cholún {number}", + "Failed to save creation policy": "Níorbh fhéidir an polasaí cruthaithe a shábháil", + "All authenticated users": "Gach úsáideoir fíordheimhnithe", + "Control who may create new projects": "Rialaigh cé a fhéadann tionscadail nua a chruthú", + "Administrators only": "Riarthóirí amháin", + "Project creation": "Cruthú tionscadal", + "Allow project creation": "Ceadaigh cruthú tionscadal", + "Creation policy saved successfully": "Sábháladh an polasaí cruthaithe", + "Initializing…": "Á thosú…", + "e.g. 2h 30m, 90m, 1.5h": "m.sh. 2h 30m, 90m, 1.5h", + "Log time": "Logáil am", + "Save estimate": "Sábháil meastachán", + "Logged: {logged}": "Logáilte: {logged}", + "over by {amount}": "thar {amount}", + "Time tracking": "Rianú ama", + "Estimate": "Meastachán", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Cuir isteach meastachán bailí (m.sh. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Cuir isteach fad bailí (m.sh. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Níorbh fhéidir an iontráil ama a shábháil. Bain triail eile as.", + "Edit time entry": "Cuir iontráil ama in eagar", + "Duration": "Fad", + "Date range": "Raon dátaí", + "Last week": "An tseachtain seo caite", + "No time logged": "Níl aon am logáilte", + "Log time on a task to see it here.": "Logáil am ar thasc chun é a fheiceáil anseo.", + "To date": "Go dáta", + "This week": "An tseachtain seo", + "Total: {total}": "Iomlán: {total}", + "From date": "Ó dháta", + "Custom range": "Raon saincheaptha", + "All time": "An t-am ar fad", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Níorbh fhéidir tasc a scriosadh, mar sin d'fhéadfadh sonraí fanacht. Scrios an tionscadal arís.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Níorbh fhéidir iontráil ama a scriosadh, mar sin d'fhéadfadh sonraí fanacht. Scrios an tionscadal arís.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Níorbh fhéidir colún a scriosadh, mar sin d'fhéadfadh sonraí fanacht. Scrios an tionscadal arís.", + "Could not delete the project. Please try again.": "Níorbh fhéidir an tionscadal a scriosadh. Bain triail eile as.", + "Notification settings": "Socruithe fógraí", + "Configure when due-date reminders are sent": "Socraigh cathain a sheoltar meabhrúcháin dáta dlite", + "Due-date reminder lead time (hours)": "Am réamhrá an mheabhrúcháin (uaireanta)", + "Lead time must be between 1 and 336 hours": "Caithfidh an t-am a bheith idir 1 agus 336 uair", + "Reminder lead time saved successfully": "Sábháladh am an mheabhrúcháin", + "Failed to save reminder lead time": "Níorbh fhéidir am an mheabhrúcháin a shábháil", + "Notifications": "Fógraí", + "Notify me 1 day before a task's due date": "Cuir in iúl dom 1 lá roimh dháta dlite taisc", + "Draft": "Dréacht", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "An dréacht é an ceacht nach bhfeiceann ach a mhúinteoir, an mbeidh sé ar siúl nó an bhfuil sé curtha ar ceal.", + "New release": "Eisiúint nua", + "Roadmap chart. The same releases and epics are listed below.": "Cairt an treochláir. Tá na heisiúintí agus na heipicí céanna liostaithe thíos.", + "Nothing on the roadmap yet": "Níl aon rud ar an treochlár fós", + "Releases with a target date and epics with dated tasks appear here.": "Taispeántar anseo eisiúintí a bhfuil spriocdháta acu agus eipicí a bhfuil tascanna dátaithe acu.", + "Releases": "Eisiúintí", + "No releases yet": "Níl aon eisiúint ann fós", + "Target date: {date}": "Spriocdháta: {date}", + "No target date": "Gan spriocdháta", + "Edit {name}": "Cuir {name} in eagar", + "Mark {name} as released": "Marcáil {name} mar eisithe", + "Mark as released": "Marcáil mar eisithe", + "Epics": "Eipicí", + "No epics yet. Open a task to make it an epic.": "Níl aon eipic ann fós. Oscail tasc chun eipic a dhéanamh de.", + "Not scheduled yet": "Gan sceideal fós", + "Planned": "Pleanáilte", + "Released": "Eisithe", + "Edit release": "Cuir an eisiúint in eagar", + "Target date": "Spriocdháta", + "Could not save the release. Please try again.": "Níorbh fhéidir an eisiúint a shábháil. Bain triail eile as.", + "Every task of this release is done or cancelled.": "Tá gach tasc den eisiúint seo déanta nó curtha ar ceal.", + "Not finished yet: {count}": "Gan chríochnú fós: {count}", + "What happens to these tasks?": "Cad a tharlaíonn do na tascanna seo?", + "Move to {name}": "Bog go {name}", + "Remove the release": "Bain an eisiúint", + "Keep it on {name}": "Fág iad ar {name}", + "Could not mark the release as released. Please try again.": "Níorbh fhéidir an eisiúint a mharcáil mar eisithe. Bain triail eile as.", + "Roadmap": "Treochlár", + "Tasks or roadmap": "Tascanna nó treochlár", + "Release": "Eisiúint", + "Epic": "Eipic", + "This task is an epic": "Is eipic é an tasc seo", + "A named, dated delivery of a project that its tasks are planned against.": "Seachadadh ainmnithe dátaithe de thionscadal a bpleanáiltear a thascanna ina choinne.", + "Name of the release": "Ainm na heisiúna", + "The project this release belongs to": "An tionscadal lena mbaineann an eisiúint seo", + "What this release delivers": "Cad a sheachadann an eisiúint seo", + "When work on the release starts": "Cathain a thosaíonn an obair ar an eisiúint", + "The date the release is due": "An dáta a bhfuil an eisiúint dlite", + "Whether the release is planned, released or archived": "Cibé an bhfuil an eisiúint pleanáilte, eisithe nó cartlannaithe", + "Released on": "Eisithe ar", + "When the release was marked as released": "Cathain a marcáladh an eisiúint mar eisithe", + "The release this task is planned for": "An eisiúint a bhfuil an tasc seo pleanáilte di", + "Board view options": "Roghanna amhairc an chláir", + "Colour cards": "Dathaigh cártaí", + "No colour": "Gan dath", + "By label": "De réir lipéid", + "Swimlanes": "Lánaí", + "No swimlanes": "Gan lánaí", + "By assignee": "De réir sannaí", + "By epic": "De réir eipice", + "No assignee": "Gan sannadh", + "No epic": "Gan eipic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Fanann cártaí i ró a n-eipice. Athraigh an eipic ar leathanach an tasc.", + "Hand over to": "Tabhair do", + "Could not save your board view. It applies until you reload.": "Níor sábháladh amharc an chláir. Tá sé i bhfeidhm go dtí go n-athlódálann tú.", + "Timetable wish": "Mian amchláir", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Mian a mheasann an gineadóir. Coinníonn sé mian docht i gcónaí, agus mian bog nuair is féidir.", + "Whether the wish is about a teacher, a group, a room or one activity": "Cé acu múinteoir, grúpa, seomra nó gníomhaíocht atá i gceist leis an mian", + "Teacher": "Múinteoir", + "Group": "Grúpa", + "Reference": "Tagairt", + "The user, group, room or activity the wish is about": "An t-úsáideoir, an grúpa, an seomra nó an ghníomhaíocht atá i gceist", + "What the wish asks for": "Cad a iarrann an mian", + "Not on these periods": "Ní ar na tréimhsí seo", + "Preferably not on these periods": "B'fhearr gan a bheith ar na tréimhsí seo", + "At most a number of lessons a day": "Líon ceachtanna sa lá ar a mhéad", + "No free periods between lessons": "Gan bearnaí idir ceachtanna", + "Always the same room": "An seomra céanna i gcónaí", + "Periods": "Tréimhsí", + "The periods of the week the wish is about, such as wed-5": "Tréimhsí na seachtaine atá i gceist, mar shampla wed-5", + "Limit": "Teorainn", + "The most lessons a day, for a wish of that kind": "An líon is mó ceachtanna sa lá, do mhian den chineál sin", + "Strength": "Neart", + "Whether the generator must keep the wish or should keep it": "Cé acu a chaithfidh nó ar cheart don ghineadóir an mian a choinneáil", + "Hard": "Docht", + "Soft": "Bog", + "Weight": "Meáchan", + "How much a soft wish counts, from 1 to 3": "Cé mhéad a chomhaireann mian bog, ó 1 go 3", + "Why the wish exists": "Cén fáth a bhfuil an mian ann", + "Timetable scenario": "Cás amchláir", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Patrún seachtaine amháin, déanta ag an ngineadóir nó tógtha ón amchlár reatha. Coinníonn sé a ionchur agus cé chomh maith is a choinníonn sé na mianta.", + "The name timetablers know the scenario by": "An t-ainm a bhfuil aithne ag lucht amchlár ar an gcás faoi", + "Whether the generator made it or it came from the current timetable": "Cé acu an gineadóir a rinne é nó an as an amchlár reatha a tháinig sé", + "Generated": "Ginte", + "From the current timetable": "Ón amchlár reatha", + "Week of": "Seachtain an", + "The Monday of the first week of the window": "Luan na chéad seachtaine den tréimhse", + "Window start": "Tús na tréimhse", + "The first day the week pattern applies to": "An chéad lá a bhaineann an patrún seachtaine leis", + "Window end": "Deireadh na tréimhse", + "The last day the week pattern applies to": "An lá deireanach a bhaineann an patrún seachtaine leis", + "Waiting, generating, done, failed, or published as draft lessons": "Ag fanacht, á ghiniúint, déanta, theip air nó foilsithe mar dhréachtcheachtanna", + "Waiting": "Ag fanacht", + "Generating": "Á ghiniúint", + "Failed": "Theip air", + "Published": "Foilsithe", + "Seed": "Síol", + "The number the generator starts from, so a run can be repeated": "An uimhir a dtosaíonn an gineadóir léi, ionas gur féidir rith a athdhéanamh", + "Input": "Ionchur", + "The periods, rooms, lessons and wishes the scenario was made from": "Na tréimhsí, seomraí, ceachtanna agus mianta ónar rinneadh an cás", + "Placements": "Socruithe", + "Each lesson with the period and room it was given": "Gach ceacht leis an tréimhse agus an seomra a fuair sé", + "Unplaced lessons": "Ceachtanna gan socrú", + "Lessons without a place, each with the hard wish that blocked it": "Ceachtanna gan áit, gach ceann leis an mian docht a chuir bac air", + "Broken wishes": "Mianta briste", + "The wishes this scenario breaks, with the lessons that break them": "Na mianta a bhriseann an cás seo, leis na ceachtanna a bhriseann iad", + "Measures": "Tomhais", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Ceachtanna socraithe, mianta briste, bearnaí múinteoirí, ceachtanna sa lá agus úsáid seomraí", + "Reason": "Cúis", + "Why the run failed": "Cén fáth ar theip ar an rith", + "Published at": "Foilsithe ar", + "When the scenario was written out as draft lessons": "Cathain a scríobhadh an cás mar dhréachtcheachtanna", + "Edit wish": "Cuir mian in eagar", + "New wish": "Mian nua", + "Hard: the generator always keeps it": "Docht: coinníonn an gineadóir i gcónaí é", + "Soft: the generator keeps it where it can": "Bog: coinníonn an gineadóir é nuair is féidir", + "Weight (1 to 3)": "Meáchan (1 go 3)", + "Most lessons a day": "Uasmhéid ceachtanna in aghaidh an lae", + "Period": "Tréimhse", + "{day} period {number}": "{day} tréimhse {number}", + "Teacher (user name)": "Múinteoir (ainm úsáideora)", + "Activity (group:subject)": "Gníomhaíocht (grúpa:ábhar)", + "Say who or what the wish is about.": "Luaigh cé nó cad lena mbaineann an mian.", + "Choose at least one period.": "Roghnaigh tréimhse amháin ar a laghad.", + "The limit is a whole number of 1 or more.": "Is slánuimhir 1 nó níos mó an teorainn.", + "Timetable": "Clár ama", + "Wishes": "Mianta", + "Timetable wishes": "Mianta an chláir ama", + "Generator run": "Rith an ghineadóra", + "Generator progress": "Dul chun cinn an ghineadóra", + "The run failed: {reason}": "Theip ar an rith: {reason}", + "{placed} of {lessons} lessons placed": "{placed} as {lessons} ceacht curtha", + "Generate again": "Gin arís", + "Generate": "Gin", + "Every lesson has a place.": "Tá áit ag gach ceacht.", + "Lesson": "Ceacht", + "No free period and room": "Níl tréimhse ná seomra saor", + "Broken soft wishes": "Mianta boga briste", + "Every soft wish is kept.": "Coinnítear gach mian bhog.", + "Wish": "Mian", + "Lessons": "Ceachtanna", + "Generating: {percent}% of the time budget used": "Ag giniúint: {percent}% den am úsáidte", + "Waiting to start": "Ag fanacht le tosú", + "Published as draft lessons": "Foilsithe mar dhréachtcheachtanna", + "Could not read the scenario.": "Níorbh fhéidir an cás a léamh.", + "Could not start the run.": "Níorbh fhéidir an rith a thosú.", + "Scenarios": "Cásanna", + "Timetable scenarios": "Cásanna an chláir ama", + "Scenario": "Cás", + "Take the current timetable": "Tóg an clár ama reatha", + "Could not take the current timetable.": "Níorbh fhéidir an clár ama reatha a thógáil.", + "Broken hard wishes": "Mianta éigeantacha briste", + "Not on a period of the week grid": "Ní ar thréimhse de ghreille na seachtaine", + "Compare scenarios": "Cuir cásanna i gcomparáid", + "Scenarios to compare": "Cásanna le cur i gcomparáid", + "Choose two or three scenarios to compare them.": "Roghnaigh dhá nó trí chás chun iad a chur i gcomparáid.", + "Measure": "Tomhas", + "Best": "Is fearr", + "Lessons that differ": "Ceachtanna atá difriúil", + "No lesson differs.": "Níl aon cheacht difriúil.", + "Not placed": "Gan chur", + "{period} in {room}": "{period} i {room}", + "Lessons placed": "Ceachtanna curtha", + "Lessons without a place": "Ceachtanna gan áit", + "Clashes": "Coimhlintí", + "Hard wishes broken": "Mianta docht briste", + "Soft wishes broken": "Mianta boga briste", + "Soft wishes broken, weighted": "Mianta boga briste, ualaithe", + "Free periods between lessons, all teachers": "Tréimhsí saora, gach múinteoir", + "Most free periods of one teacher": "Na tréimhsí saora is mó ag múinteoir amháin", + "Most lessons of one group on a day": "Na ceachtanna is mó ag grúpa amháin in aon lá", + "Room use": "Úsáid seomraí", + "Publish as draft lessons": "Foilsigh mar dhréachtcheachtanna", + "Draft lessons written: {count}": "Dréachtcheachtanna scríofa: {count}", + "Could not publish the scenario.": "Níorbh fhéidir an cás a fhoilsiú.", + "Rules": "Rialacha", + "Rules for {column}": "Rialacha do {column}", + "When a card enters this column": "Nuair a théann cárta isteach sa cholún seo", + "Action": "Gníomh", + "Set the priority": "Socraigh an tosaíocht", + "Assign to": "Sann do", + "Assign the person who moved the card": "Sann don duine a bhog an cárta", + "Remove the assignee": "Bain an sannaí", + "Add a label": "Cuir lipéad leis", + "No longer a project member": "Ní ball den tionscadal é a thuilleadh", + "This label no longer exists": "Níl an lipéad seo ann a thuilleadh", + "Add rule": "Cuir riail leis", + "Remove rule": "Bain riail", + "No rules yet. Add one to change a card when it enters this column.": "Níl aon rialacha fós. Cuir ceann leis chun cárta a athrú nuair a théann sé isteach sa cholún seo.", + "Could not save the rules. Please try again.": "Níorbh fhéidir na rialacha a shábháil. Bain triail eile as.", + "1 rule runs when a card enters this column": "Ritheann 1 riail nuair a théann cárta isteach sa cholún seo", + "{count} rules run when a card enters this column": "Ritheann {count} riail nuair a théann cárta isteach sa cholún seo", + "Rules applied: {changes}": "Rialacha curtha i bhfeidhm: {changes}", + "assigned to {name}": "sannta do {name}", + "assignee removed": "sannaí bainte", + "priority {priority}": "tosaíocht {priority}", + "label {label}": "lipéad {label}", + "What happens to a card when it enters this column, applied in list order.": "Cad a tharlaíonn do chárta nuair a théann sé isteach sa cholún seo, in ord an liosta.", + "Value": "Luach", + "What the rule does to the card.": "Cad a dhéanann an riail leis an gcárta.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "An tosaíocht, aitheantas an úsáideora nó aitheantas an lipéid a úsáideann an gníomh; folamh do ghníomhartha gan luach.", + "is not": "níl", + "{dimension} is not": "{dimension} níl", + "Saved filters": "Scagairí sábháilte", + "No saved filters yet": "Níl aon scagairí sábháilte fós", + "Save filter": "Sábháil an scagaire", + "Rename \"{name}\"": "Athainmnigh \"{name}\"", + "Delete \"{name}\"": "Scrios \"{name}\"", + "Clear filters": "Glan na scagairí", + "Showing {shown} of {total} tasks": "Ag taispeáint {shown} as {total} tasc", + "Me": "Mise", + "No date": "Gan dáta", + "Rename saved filter": "Athainmnigh an scagaire sábháilte", + "Share with the project": "Comhroinn leis an tionscadal", + "Give the filter a name": "Tabhair ainm don scagaire", + "Could not save the filter. Please try again.": "Níorbh fhéidir an scagaire a shábháil. Bain triail eile as.", + "Some labels in \"{name}\" no longer exist and were left out.": "Níl roinnt lipéad in \"{name}\" ann a thuilleadh agus fágadh ar lár iad.", + "Could not delete the filter. Please try again.": "Níorbh fhéidir an scagaire a scriosadh. Bain triail eile as.", + "Saved filter": "Scagaire sábháilte", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Scagaire cláir ainmnithe de thionscadal amháin, príobháideach don duine a shábháil é mura bhfuil sé comhroinnte leis an tionscadal.", + "The project whose board the filter applies to": "An tionscadal a mbaineann an scagaire lena chlár", + "The name the filter is listed under": "An t-ainm faoina liostaítear an scagaire", + "Saved by": "Sábháilte ag", + "Nextcloud user id of the person who saved the filter": "Aitheantas úsáideora Nextcloud an duine a shábháil an scagaire", + "Shared with the project": "Comhroinnte leis an tionscadal", + "Whether every project member sees and applies the filter": "Cé acu a fheiceann gach ball den tionscadal an scagaire agus an féidir leo é a chur i bhfeidhm", + "Criteria": "Critéir", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "An scagaire: sannaí, lipéad, tosaíocht agus dáta dlite, gach ceann le is nó níl agus a luachanna", + "Cross-project view": "Amharc trasna tionscadal", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Rogha shábháilte tionscadal a dtaispeántar a dtascanna le chéile i lánaí stádais, roinnte leis na daoine a ainmníonn sí.", + "Shared with": "Roinnte le", + "The name the view is listed under": "An t-ainm faoina liostaítear an t-amharc", + "Nextcloud user id of the person who saved the view": "Aitheantas úsáideora Nextcloud an duine a shábháil an t-amharc", + "Nextcloud user ids of the people the view is shared with": "Aitheantais úsáideora Nextcloud na ndaoine a bhfuil an t-amharc roinnte leo", + "The projects whose tasks the view shows, at most twenty": "Na tionscadail a dtaispeánann an t-amharc a dtascanna, fiche ar a mhéad", + "1 project in this view is hidden from you.": "Tá 1 tionscadal san amharc seo i bhfolach ort.", + "{count} projects in this view are hidden from you.": "Tionscadail san amharc seo atá i bhfolach ort: {count}.", + "{project} has no column for {status}.": "Níl colún ag {project} do {status}.", + "This view does not exist or is not shared with you.": "Níl an t-amharc seo ann nó níl sé roinnte leat.", + "\"{task}\" moved to {status}.": "Bogadh \"{task}\" go {status}.", + "Project: {title}": "Tionscadal: {title}", + "Cross-project views": "Amharcanna trasna tionscadal", + "New view": "Amharc nua", + "Edit view": "Cuir an t-amharc in eagar", + "Delete view": "Scrios an t-amharc", + "Give the view a name": "Tabhair ainm don amharc", + "Pick at least one project": "Roghnaigh tionscadal amháin ar a laghad", + "A view shows at most {max} projects": "Taispeánann amharc {max} tionscadal ar a mhéad", + "Could not save the view. Please try again.": "Níorbh fhéidir an t-amharc a shábháil. Bain triail eile as.", + "Could not delete the view. Please try again.": "Níorbh fhéidir an t-amharc a scriosadh. Bain triail eile as.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Scrios \"{title}\"? Fanann na tionscadail agus a dtascanna mar atá siad.", + "People see the tasks of the projects they are in, never more.": "Ní fheiceann duine ach tascanna na dtionscadal a bhfuil sé iontu.", + "No views yet. A view shows the tasks of several of your projects together.": "Níl aon amharc fós. Taispeánann amharc tascanna roinnt de do thionscadail le chéile.", + "Projects in view: {count}": "Tionscadail san amharc: {count}", + "Notify me when a task is assigned to me": "Cuir in iúl dom nuair a shanntar tasc dom", + "Also send these to me by email": "Seol iad seo chugam i ríomhphost freisin", + "Add an email address in your Nextcloud personal settings to get mail.": "Cuir seoladh ríomhphoist le do shocruithe pearsanta Nextcloud chun ríomhphost a fháil.", + "Code link": "Nasc cóid", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, brainse, iarratas cumaisc nó saincheist ar ardán cóid a bhaineann le tasc.", + "The task the link belongs to": "An tasc lena mbaineann an nasc", + "The project of the task": "Tionscadal an taisc", + "Task key": "Eochair an taisc", + "The task key the forge text named, such as VC-12": "Eochair an taisc a luaigh téacs an ardáin, mar shampla VC-12", + "What the link points at": "Cad air a dtagraíonn an nasc", + "Link": "Nasc", + "The address of the item in the forge": "Seoladh na míre ar an ardán cóid", + "The commit message, branch name or merge request title": "Teachtaireacht an commit, ainm na brainse nó teideal an iarratais cumaisc", + "Repository": "Stór", + "The repository, such as acme/portal": "An stór, mar shampla acme/portal", + "Forge id": "Aitheantas ar an ardán", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Aitheantas féin na míre ar an ardán cóid, mar shampla github:acme/portal#42 nó hais commit", + "State": "Staid", + "The state of a merge request or issue": "Staid iarratais cumaisc nó saincheiste", + "Who made the commit or opened the merge request": "Cé a rinne an commit nó a d'oscail an t-iarratas cumaisc", + "When the commit was made or the merge request last changed": "Cathain a rinneadh an commit nó a d'athraigh an t-iarratas cumaisc den uair dheireanach", + "Added by": "Curtha leis ag", + "Whether a person added the link or the integration wrote it": "Ar chuir duine an nasc leis nó ar scríobh an comhtháthú é", + "Nextcloud user UIDs of project members": "Aitheantais úsáideora Nextcloud bhaill an tionscadail", + "Add link": "Cuir nasc leis", + "Added by hand": "Curtha leis de láimh", + "Branch": "Brainse", + "Code": "Cód", + "Commit": "Commit", + "From the integration": "Ón gcomhtháthú", + "Link to a commit, branch or merge request": "Nasc chuig commit, brainse nó iarratas cumaisc", + "Merge request": "Iarratas cumaisc", + "Merged": "Cumaiscthe", + "No code linked yet. Name {key} in a commit message or paste a link.": "Níl aon chód nasctha fós. Luaigh {key} i dteachtaireacht commit nó greamaigh nasc.", + "No code linked yet. Paste a link to a commit or merge request.": "Níl aon chód nasctha fós. Greamaigh nasc chuig commit nó iarratas cumaisc.", + "Paste a web address that starts with https://.": "Greamaigh seoladh gréasáin a thosaíonn le https://.", + "Remove link {title}": "Bain an nasc {title}", + "The link could not be added.": "Níorbh fhéidir an nasc a chur leis.", + "The link could not be removed.": "Níorbh fhéidir an nasc a bhaint.", + "This link is already on the task.": "Tá an nasc seo ar an tasc cheana.", + "Code forges": "Ardáin chóid", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Nasc commits agus pull requests GitHub le tascanna. Faigheann Integriq na himeachtaí; ní ghlaonn planninq ar GitHub riamh.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Íoslódáil an chumraíocht agus iompórtáil isteach in Integriq í. Ansin líon rún isteach sa riail \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "In GitHub, cuir webhook leis an stór leis an seoladh seo agus an rún céanna. Roghnaigh an cineál ábhair application/json agus na himeachtaí push agus pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Luaigh eochair an taisc, mar shampla VC-12, i dteachtaireacht commit, in ainm brainse nó i dteideal pull request. Ansin feictear an nasc ar an tasc sin.", + "Without Integriq, project members can still paste a link on the task page.": "Gan Integriq, is féidir le baill an tionscadail nasc a ghreamú ar leathanach an taisc fós.", + "Download the Integriq configuration": "Íoslódáil cumraíocht Integriq", + "Calendar": "Féilire", + "Previous": "Roimhe seo", + "Calendar view": "Amharc féilire", + "Starts:": "Tosaíonn:", + "No tasks with a date in this month.": "Níl aon tascanna le dáta an mhí seo.", + "Week of {start} to {end}": "Seachtain ó {start} go {end}", + "My calendar": "Mo fhéilire", + "Show as list": "Taispeáin mar liosta", + "Show as calendar": "Taispeáin mar fhéilire", + "Open my calendar": "Oscail mo fhéilire", + "Nextcloud Tasks": "Tascanna Nextcloud", + "Show my tasks in Nextcloud Tasks": "Taispeáin mo thascanna i dTascanna Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Feictear na tascanna a sannadh duit nó a roinneadh leat i liosta \"Planninq\" i dTascanna agus i bhFéilire Nextcloud. Cuirtear an chéad athrú eile in Planninq in ionad athruithe a dhéantar ansin.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ní féidir leis an bhfreastalaí seo scríobh chuig Tascanna Nextcloud, mar sin níl an easpórtáil ar fáil.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Á bhainistiú ag Planninq. Cuirtear an chéad athrú eile in Planninq in ionad athruithe a dhéantar anseo.", + "Working days and holidays": "Laethanta oibre agus laethanta saoire", + "Dates set on the timeline skip the days that are not working days.": "Scipeálann dátaí a shocraítear ar an amlíne na laethanta nach laethanta oibre iad.", + "Working weekdays": "Laethanta oibre na seachtaine", + "Non-working days": "Laethanta neamhoibre", + "No non-working days yet.": "Níl aon laethanta neamhoibre fós.", + "Add day": "Cuir lá leis", + "Year": "Bliain", + "Add Dutch national holidays": "Cuir laethanta saoire náisiúnta na hÍsiltíre leis", + "Save working days": "Sábháil laethanta oibre", + "Choose at least one working weekday.": "Roghnaigh lá oibre amháin ar a laghad.", + "Working days saved.": "Sábháladh na laethanta oibre.", + "Could not save the working days.": "Níorbh fhéidir na laethanta oibre a shábháil.", + "New Year's Day": "Lá Caille", + "Easter Sunday": "Domhnach Cásca", + "Easter Monday": "Luan Cásca", + "King's Day": "Lá an Rí", + "Liberation Day": "Lá na Saoirse", + "Ascension Day": "Déardaoin Deasghabhála", + "Whit Sunday": "Domhnach Cincíse", + "Whit Monday": "Luan Cincíse", + "Christmas Day": "Lá Nollag", + "Boxing Day": "Lá Fhéile Stiofáin", + "Dates of {title}": "Dátaí {title}", + "The due date cannot be before the start date.": "Ní féidir leis an dáta dlite a bheith roimh an dáta tosaigh.", + "{title}, from {start} to {end}": "{title}, ó {start} go {end}", + "The dates could not be saved.": "Níorbh fhéidir na dátaí a shábháil.", + "{title} now runs from {start} to {end}": "Tá {title} ar siúl anois ó {start} go {end}", + "Auto-scheduling": "Sceidealú uathoibríoch", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Nuair atá sé ar siúl, nuair a bhogtar dáta dlite níos déanaí ar an amlíne tairgtear na tascanna a bhlocálann sé a bhogadh freisin.", + "Move blocked tasks along when a task slips": "Bog tascanna blocáilte nuair a théann tasc chun moille", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Ar an amlíne, tairgeann dáta dlite níos déanaí na tascanna blocáilte a bhogadh. Ní áirítear ach naisc \"blocálann\", agus ní bhogtar tascanna ach níos déanaí.", + "Move the tasks that wait for {title}?": "Bog na tascanna atá ag fanacht ar {title}?", + "These tasks wait for it and would start after its new due date:": "Tá na tascanna seo ag fanacht air agus thosóidís tar éis an dáta dlite nua:", + "{count} tasks would move; the first {limit} are listed.": "Bhogfaí {count} tasc; taispeántar na chéad {limit}.", + "Now": "Anois", + "After the move": "Tar éis an aistrithe", + "Only this task": "An tasc seo amháin", + "Move all": "Bog iad go léir", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stoptha ag {title}: níorbh fhéidir na dátaí a shábháil. Bogadh na tascanna roimhe.", + "Cumulative flow": "Sreabhadh carnach", + "Show as chart": "Taispeáin mar chairt", + "Show as table": "Taispeáin mar thábla", + "Tasks per column per day": "Tascanna in aghaidh an cholúin in aghaidh an lae", + "Tasks without recorded history in this period: {count}": "Tascanna gan stair taifeadta sa tréimhse seo: {count}", + "Lead and cycle time": "Am seachadta agus am timthrialla", + "No tasks were finished in this period.": "Níor críochnaíodh aon tasc sa tréimhse seo.", + "Finished tasks": "Tascanna críochnaithe", + "Cycle time, average": "Am timthrialla, meán", + "Cycle time, 85th percentile": "Am timthrialla, 85ú peircintíl", + "Lead time, average": "Am seachadta, meán", + "Tasks whose finish time was estimated from their history: {count}": "Tascanna ar measadh a n-am críochnaithe óna stair: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Am timthrialla gach taisc chríochnaithe, leis an meán agus an 85ú peircintíl", + "Slowest tasks": "Na tascanna is moille", + "cycle {cycle}, lead {lead}": "timthriall {cycle}, seachadadh {lead}", + "{days} days": "{days} lá", + "Could not load the flow of this project.": "Níorbh fhéidir sreabhadh an tionscadail seo a lódáil.", + "Last {days} days": "Na {days} lá deiridh", + "Portfolio flow": "Sreabhadh punainne", + "An admin adds portfolios under Projects, Portfolios.": "Cuireann riarthóir punanna leis faoi Tionscadail, Punanna.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Tionscadail nach dtaispeántar, mar ní thaispeántar níos mó ná 50 ag an am céanna: {count}", + "Could not load the flow of this portfolio.": "Níorbh fhéidir sreabhadh na punainne seo a lódáil.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Sreabhadh carnach agus am timthrialla thar thionscadail punainne.", + "Edit report": "Cuir an tuarascáil in eagar", + "Only tasks where": "Tascanna amháin ina", + "Group by": "Grúpáil de réir", + "Display": "Taispeáint", + "Share with everyone who can read its projects": "Comhroinn le gach duine ar féidir leo a tionscadail a léamh", + "The report could not be saved.": "Níorbh fhéidir an tuarascáil a shábháil.", + "Number of tasks": "Líon na dtascanna", + "Bar": "Barra", + "Donut": "Fáinne", + "Table": "Tábla", + "{hidden} of {total} projects in this report are not visible to you": "Níl {hidden} as {total} tionscadal sa tuarascáil seo le feiceáil agat", + "No tasks match this report.": "Níl aon tasc ag teacht leis an tuarascáil seo.", + "None": "Dada", + "Could not load this report.": "Níorbh fhéidir an tuarascáil seo a lódáil.", + "Report": "Tuarascáil", + "Your reports": "Do thuarascálacha", + "My reports": "Mo thuarascálacha", + "Shared reports": "Tuarascálacha comhroinnte", + "You have not built a report yet.": "Níl tuarascáil déanta agat fós.", + "Nobody has shared a report with you yet.": "Níor chomhroinn aon duine tuarascáil leat fós.", + "Reports you built over tasks, and the ones shared with you.": "Tuarascálacha a rinne tú ar thascanna, agus na cinn a comhroinneadh leat.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Ceist shábháilte ar thascanna: cé na tionscadail, cé na scagairí, grúpáilte de réir cad, comhairthe nó suimithe, agus taispeánta mar thábla nó mar chairt.", + "The name the report is listed under": "An t-ainm faoina bhfuil an tuarascáil liostaithe", + "What the report shows and who it is for": "Cad a thaispeánann an tuarascáil agus cé dó í", + "Nextcloud user id of the person who saved the report": "Aitheantas úsáideora Nextcloud an duine a shábháil an tuarascáil", + "Who can open the report": "Cé atá in ann an tuarascáil a oscailt", + "Only me": "Mise amháin", + "Everyone who can read its projects": "Gach duine ar féidir leo a tionscadail a léamh", + "The projects the report covers, at most fifty": "Na tionscadail a chlúdaíonn an tuarascáil, caoga ar a mhéad", + "Filters": "Scagairí", + "Task fields and the value each must equal": "Réimsí taisc agus an luach ar gá do gach ceann a bheith cothrom leis", + "The task field the report groups on": "An réimse taisc a ghrúpálann an tuarascáil de réir", + "Count the tasks, or add up a number on them": "Comhair na tascanna, nó suimigh uimhir orthu", + "Sum": "Suim", + "Sum of": "Suim de", + "The number added up when the measure is a sum": "An uimhir a shuimítear nuair is suim an tomhas", + "Story points": "Pointí scéil", + "Estimated duration": "Fad measta", + "How the report is shown": "Conas a thaispeántar an tuarascáil", + "Issue type": "Cineál ceisteanna", + "Task fields and the value each must equal; empty when the report covers every task": "Réimsí tasc agus an luach nach mór a bheith ag gach ceann; folamh nuair a chlúdaíonn an tuarascáil gach tasc", + "The status a task must have": "An stádas nach mór a bheith ag tasc", + "The priority a task must have": "An tosaíocht nach mór a bheith ag tasc", + "The user a task must be assigned to": "An t-úsáideoir nach mór tasc a bheith sannta dó", + "A label a task must carry": "Lipéad nach mór a bheith ar thasc", + "The board column a task must be in": "An colún cláir nach mór tasc a bheith ann", + "The issue type a task must have": "An cineál ceisteanna nach mór a bheith ag tasc", + "Manager groups": "Grúpaí bainisteoirí", + "Member groups": "Grúpaí ball", + "Viewer groups": "Grúpaí léitheoirí", + "Viewers": "Léitheoirí", + "Owning group": "Grúpa úinéara", + "Nextcloud groups whose members manage the project": "Grúpaí Nextcloud a bhainistíonn a gcuid ball an tionscadal", + "Nextcloud groups whose members work on the project": "Grúpaí Nextcloud a n-oibríonn a gcuid ball ar an tionscadal", + "Nextcloud groups whose members may read the project": "Grúpaí Nextcloud ar féidir lena gcuid ball an tionscadal a léamh", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Úsáideoirí Nextcloud a bhainistíonn an tionscadal: socruithe, baill agus obair", + "Nextcloud user ids who may read the project and its work but not change it": "Úsáideoirí Nextcloud ar féidir leo an tionscadal agus a chuid oibre a léamh ach gan iad a athrú", + "The Nextcloud group that owns the project with its creator, at most one": "An grúpa Nextcloud ar leis an tionscadal in éineacht lena chruthaitheoir, ceann amháin ar a mhéad", + "Nextcloud user ids who may read this through the project": "Úsáideoirí Nextcloud ar féidir leo é seo a léamh tríd an tionscadal", + "Nextcloud groups whose members may change this through the project": "Grúpaí Nextcloud ar féidir lena gcuid ball é seo a athrú tríd an tionscadal", + "Nextcloud groups whose members may read this through the project": "Grúpaí Nextcloud ar féidir lena gcuid ball é seo a léamh tríd an tionscadal", + "Search for a person or a group…": "Cuardaigh duine nó grúpa…", + "No one found. Your admin's sharing settings decide who you can find.": "Níor aimsíodh aon duine. Socruithe comhroinnte do riarthóra a shocraíonn cé atá le fáil agat.", + "Type at least two characters": "Clóscríobh dhá charachtar ar a laghad", + "Everyone in this group": "Gach duine sa ghrúpa seo", + "Could not search for people. Please try again.": "Níorbh fhéidir daoine a chuardach. Bain triail eile as.", + "Could not remove the group": "Níorbh fhéidir an grúpa a bhaint", + "Only the owner and managers change who is on this project.": "Ní athraíonn ach an t-úinéir agus na bainisteoirí cé atá ar an tionscadal seo.", + "Role of {name}": "Ról {name}", + "Manager": "Bainisteoir", + "Member": "Ball", + "Viewer": "Léitheoir", + "Could not change the role": "Níorbh fhéidir an ról a athrú", + "Owned by group: {name}": "Faoi úinéireacht an ghrúpa: {name}", + "No group owns this project.": "Níl aon ghrúpa ina úinéir ar an tionscadal seo.", + "Owned by group": "Faoi úinéireacht grúpa", + "Search for a group…": "Cuardaigh grúpa…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Níor aimsíodh aon ghrúpa. Socruithe comhroinnte do riarthóra a shocraíonn na grúpaí is féidir leat a aimsiú.", + "No owning group": "Gan grúpa úinéara", + "Could not search for groups. Please try again.": "Níorbh fhéidir grúpaí a chuardach. Bain triail eile as.", + "Could not change the owning group": "Níorbh fhéidir an grúpa úinéara a athrú", + "You can read this project. Only its members change it.": "Is féidir leat an tionscadal seo a léamh. Ní athraíonn ach a bhaill é.", + "Course": "Cúrsa", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "An cúrsa a mhúintear sa cheacht seo, mar shampla ábhar roghnach, nuair is eol d'aip foghlama na scoile é.", + "Online meeting link": "Nasc an cheachta ar líne", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Áit a nglacann daltaí páirt sa cheacht seo ar líne. Ní thaispeántar an cnaipe Glac páirt ach le nasc https." }, "plurals": null } diff --git a/l10n/hr.js b/l10n/hr.js index c9cdc5ee..96f9aa69 100644 --- a/l10n/hr.js +++ b/l10n/hr.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktivni projekti", + "Archived projects": "Arhivirani projekti", + "Boards": "Ploče", + "My projects": "Moji projekti", + "Portfolio": "Portfelj", + "Project board": "Ploča projekta", + "Projects I am in": "Projekti u kojima sudjelujem", + "Timeline": "Vremenska crta", + "Timesheet": "Evidencija vremena", + "Features & roadmap": "Značajke i plan razvoja", + "Flow": "Tijek", + "Flows": "Tijekovi", + "Reports": "Izvješća", + "Pick a report to open it.": "Odaberite izvješće da ga otvorite.", + "In progress": "U tijeku", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodijeljeno", + "Who": "Tko", + "What": "Što", + "Minutes": "Minute", + "Entries": "Unosi", + "Most recent": "Najnovije", + "Per person": "Po osobi", + "By status": "Po statusu", + "By priority": "Po prioritetu", + "Task status": "Status zadatka", + "Time spent": "Utrošeno vrijeme", + "Capacity": "Kapacitet", + "Due soonest": "Najskorije dospijeva", + "Minutes logged": "Zabilježene minute", + "Nothing is due": "Ništa ne dospijeva", + "Nothing logged yet": "Još ništa nije zabilježeno", + "What is open, what is blocked, and what is overdue.": "Što je otvoreno, što blokirano i što kasni.", + "How allocation is spread across the people working on projects.": "Kako je opterećenje raspoređeno među ljudima na projektima.", + "Hours logged, and the projects they went to.": "Zabilježeni sati i projekti na koje su otišli.", + "Billable": "Naplativo", + "Budget: {amount}": "Proračun: {amount}", + "Loading projects": "Učitavanje projekata", + "No projects for this client yet": "Još nema projekata za ovog klijenta", + "Open in Planninq": "Otvori u Planninqu", + "This project could not be found": "Ovaj projekt nije pronađen", + "Untitled project": "Projekt bez naziva", + "and {count} more": "i još {count}", + "Store": "Trgovina", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instalirajte registre, sheme i tokove koje su objavile druge organizacije.", + "Work Date": "Datum rada", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Radnje stupca", + "Columns": "Stupci", + "Could not remove the column. Please try again.": "Stupac nije moguće ukloniti. Pokušajte ponovno.", + "Could not save the column. Please try again.": "Stupac nije moguće spremiti. Pokušajte ponovno.", + "Done column": "Stupac završenih", + "Edit column": "Uredi stupac", + "Keep the card's status": "Zadrži status kartice", + "Move its cards to": "Premjesti njegove kartice u", + "Move left": "Pomakni lijevo", + "Move right": "Pomakni desno", + "Status of cards moved here": "Status kartica premještenih ovdje", + "The last done column cannot be removed.": "Posljednji stupac završenih ne može se ukloniti.", + "WIP limit": "WIP ograničenje", + "over limit": "iznad ograničenja", + "The status a card gets when it is moved into this column.": "Status koji kartica dobiva kada se premjesti u ovaj stupac.", + "All priorities": "Svi prioriteti", + "Could not create the task. Please try again.": "Zadatak nije moguće stvoriti. Pokušajte ponovno.", + "Created": "Stvoreno", + "Move to backlog": "U zaostatak", + "Move to board": "Na ploču", + "New task": "Novi zadatak", + "Nothing in the backlog": "Ništa u zaostatku", + "Rank": "Rang", + "Sort by": "Poredaj po", + "Sort by rank to reorder": "Poredajte po rangu za promjenu redoslijeda", + "Task actions": "Radnje zadatka", + "All labels": "Sve oznake", + "Filter tasks by label": "Filtriraj zadatke po oznaci", + "View timeline": "Prikaži vremensku crtu", + "Board": "Ploča", + "List": "Popis", + "Column": "Stupac", + "Board or list": "Ploča ili popis", + "Log": "Dnevnik", + "Add entry": "Dodaj zapis", + "Show": "Prikaži", + "No actions yet": "Još nema radnji", + "Closed": "Zatvoreno", + "Entry actions": "Radnje zapisa", + "Add action": "Dodaj radnju", + "by {author}": "autor {author}", + "saved {time}": "spremljeno {time}", + "Attendees: {names}": "Prisutni: {names}", + "Add the first entry": "Dodaj prvi zapis", + "Issues": "Problemi", + "Lessons learned": "Naučene lekcije", + "Meetings": "Sastanci", + "Decisions": "Odluke", + "Actions": "Radnje", + "Issue": "Problem", + "Lesson learned": "Naučena lekcija", + "Meeting": "Sastanak", + "Decision": "Odluka", + "About this project": "O ovom projektu", + "No description yet": "Još nema opisa", + "Start date": "Datum početka", + "Not set": "Nije postavljeno", + "End date": "Datum završetka", + "Progress": "Napredak", + "No tasks yet": "Još nema zadataka", + "Open the board": "Otvori ploču", + "People": "Osobe", + "Owner": "Vlasnik", + "Latest log entries": "Najnoviji zapisi", + "Open the log": "Otvori dnevnik", + "{done} of {total} tasks done": "{done} od {total} zadataka gotovo", + "Edit entry": "Uredi zapis", + "Type": "Vrsta", + "Attendees": "Prisutni", + "Issue is closed": "Problem je zatvoren", + "Could not save the entry. Please try again.": "Zapis nije moguće spremiti. Pokušajte ponovno.", + "From: {title}": "Iz: {title}", + "What needs to happen": "Što treba učiniti", + "Could not create the action. Please try again.": "Radnju nije moguće stvoriti. Pokušajte ponovno.", + "The action was created but could not be linked to the entry.": "Radnja je stvorena, ali je nije moguće povezati sa zapisom.", + "Project pages": "Stranice projekta", + "Overview": "Pregled", + "Risks": "Rizici", + "Log entry": "Zapis dnevnika", + "A short name for the entry": "Kratak naziv zapisa", + "Project": "Projekt", + "The project this entry belongs to": "Projekt kojem ovaj zapis pripada", + "What kind of entry this is": "Koja je ovo vrsta zapisa", + "When it happened": "Kada se dogodilo", + "What happened, in Markdown": "Što se dogodilo, u Markdownu", + "Whether an issue is still open": "Je li problem još otvoren", + "The people at a meeting": "Osobe na sastanku", + "Tasks that came out of this entry": "Zadaci proizašli iz ovog zapisa", + "Add risk": "Dodaj rizik", + "Risk": "Rizik", + "Score": "Ocjena", + "Response": "Odgovor", + "Review date": "Datum pregleda", + "no longer on the project": "više nije na projektu", + "Edit {title}": "Uredi {title}", + "No risks recorded yet": "Još nema zabilježenih rizika", + "Add the first risk": "Dodaj prvi rizik", + "Medium": "Srednje", + "Mitigating": "Ublažava se", + "Occurred": "Nastupio", + "Avoid": "Izbjeći", + "Reduce": "Smanjiti", + "Transfer": "Prenijeti", + "Accept": "Prihvatiti", + "Highest open risks": "Najviši otvoreni rizici", + "No open risks": "Nema otvorenih rizika", + "Open the risk register": "Otvori registar rizika", + "Edit risk": "Uredi rizik", + "What could go wrong": "Što može poći po zlu", + "Likelihood": "Vjerojatnost", + "Impact": "Utjecaj", + "Score {score}": "Ocjena {score}", + "Countermeasures": "Protumjere", + "Could not save the risk. Please try again.": "Rizik nije moguće spremiti. Pokušajte ponovno.", + "Risks by likelihood and impact": "Rizici po vjerojatnosti i utjecaju", + "Risk scale": "Ljestvica rizika", + "The levels every project scores its risks on, and where low turns into medium and high": "Razine na kojima svaki projekt ocjenjuje rizike i gdje nisko prelazi u srednje i visoko", + "Number of levels": "Broj razina", + "Likelihood labels": "Oznake vjerojatnosti", + "Impact labels": "Oznake utjecaja", + "Level {level}": "Razina {level}", + "Medium from score": "Srednje od ocjene", + "High from score": "Visoko od ocjene", + "Risk scale saved": "Ljestvica rizika spremljena", + "1 risk uses level {level}. Change it first.": "1 rizik koristi razinu {level}. Najprije ga promijenite.", + "{count} risks use level {level}. Change them first.": "{count} rizika koristi razinu {level}. Najprije ih promijenite.", + "Every level needs a label, and high must start above medium.": "Svaka razina treba oznaku, a visoko mora početi iznad srednjeg.", + "The project this risk belongs to": "Projekt kojem ovaj rizik pripada", + "The cause and the effect, in Markdown": "Uzrok i posljedica, u Markdownu", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Slobodno grupiranje, npr. planiranje, proračun ili dobavljač", + "How likely it is, on the admin's risk scale": "Koliko je vjerojatno, na ljestvici rizika administratora", + "How hard it would hit, on the admin's risk scale": "Koliko bi snažno pogodilo, na ljestvici rizika administratora", + "Likelihood times impact, calculated by the server": "Vjerojatnost puta utjecaj, izračunao poslužitelj", + "Where the risk stands": "Gdje je rizik", + "The person who watches this risk": "Osoba koja prati ovaj rizik", + "How the project answers the risk": "Kako projekt odgovara na rizik", + "What is done to prevent it or soften it, in Markdown": "Što se čini da se spriječi ili ublaži, u Markdownu", + "When to look at this risk again": "Kada ponovno pregledati ovaj rizik", + "Very low": "Vrlo nisko", + "Very high": "Vrlo visoko", + "All projects": "Svi projekti", + "Project status report": "Izvješće o stanju projekta", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datirano izvješće o tome kako projekt stoji s novcem, organizacijom, vremenom, informacijama, kvalitetom i rizikom (GROTIK aspekti), svaki s bilješkom.", + "The project this report is about": "Projekt na koji se izvješće odnosi", + "Report date": "Datum izvješća", + "The day the report describes": "Dan koji izvješće opisuje", + "Money": "Novac", + "How the project stands on this aspect": "Kako projekt stoji u ovom aspektu", + "On track": "Prema planu", + "At risk": "Ugroženo", + "Off track": "Izvan plana", + "Money note": "Bilješka o novcu", + "A short explanation of this status": "Kratko objašnjenje ovog stanja", + "Organisation": "Organizacija", + "Organisation note": "Bilješka o organizaciji", + "Time": "Vrijeme", + "Time note": "Bilješka o vremenu", + "Information": "Informacije", + "Information note": "Bilješka o informacijama", + "Quality": "Kvaliteta", + "Quality note": "Bilješka o kvaliteti", + "Risk note": "Bilješka o riziku", + "Overall": "Ukupno", + "The worst of the six statuses, calculated by the server": "Najlošije od šest stanja, izračunava ga poslužitelj", + "Health: money": "Stanje: novac", + "Copied from the newest status report": "Preuzeto iz najnovijeg izvješća o stanju", + "Health: organisation": "Stanje: organizacija", + "Health: time": "Stanje: vrijeme", + "Health: information": "Stanje: informacije", + "Health: quality": "Stanje: kvaliteta", + "Health: risk": "Stanje: rizik", + "Health: overall": "Stanje: ukupno", + "Health: report date": "Stanje: datum izvješća", + "The date of the newest status report": "Datum najnovijeg izvješća o stanju", + "New report": "Novo izvješće", + "Only the project owner writes status reports.": "Izvješća o stanju piše samo vlasnik projekta.", + "Latest report, {date}": "Posljednje izvješće, {date}", + "Aspect": "Aspekt", + "Note": "Bilješka", + "Report history": "Povijest izvješća", + "Author": "Autor", + "No status reports yet": "Još nema izvješća o stanju", + "Write the first report": "Napiši prvo izvješće", + "Choose a status for every aspect to save the report.": "Za spremanje izvješća odaberite stanje za svaki aspekt.", + "Suggested: on track.": "Prijedlog: prema planu.", + "Suggested: at risk.": "Prijedlog: ugroženo.", + "Suggested: off track.": "Prijedlog: izvan plana.", + "1 task is past its due date.": "1 zadatak je prekoračio rok.", + "{count} tasks are past their due date.": "Zadaci koji su prekoračili rok: {count}.", + "The end date has passed with 1 open task.": "Datum završetka je prošao s 1 otvorenim zadatkom.", + "The end date has passed with {count} open tasks.": "Datum završetka je prošao, otvoreni zadaci: {count}.", + "No open task is past its due date.": "Nijedan otvoreni zadatak nije prekoračio rok.", + "The highest open risk, \"{title}\", scores {score}.": "Najveći otvoreni rizik, \"{title}\", ima ocjenu {score}.", + "There are no open risks.": "Nema otvorenih rizika.", + "Costs are at {percent}% of the budget.": "Troškovi su na {percent}% proračuna.", + "No suggestion: the project has no budget.": "Nema prijedloga: projekt nema proračun.", + "No suggestion: no costs are recorded for this project yet.": "Nema prijedloga: za ovaj projekt još nisu zabilježeni troškovi.", + "The report was not saved. Only the project owner can write status reports.": "Izvješće nije spremljeno. Izvješća o stanju može pisati samo vlasnik projekta.", + "No report": "Nema izvješća", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Skupina projekata koje vode isti ljudi, na primjer odjel ili program. Njezini voditelji čitaju svaki projekt u njoj.", + "The name of the portfolio": "Naziv portfelja", + "What the portfolio holds and who runs it": "Što portfelj sadrži i tko ga vodi", + "A colour for the portfolio's section in project lists": "Boja odjeljka portfelja u popisima projekata", + "Managers": "Voditelji", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud korisnički ID-ovi ljudi koji vode portfelj", + "Order": "Redoslijed", + "Where the portfolio comes in project lists, lowest first": "Gdje je portfelj u popisima projekata, najniži prvi", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Vlastita ljestvica rizika ovog portfelja kao JSON, u istom obliku kao ljestvica cijele aplikacije. Prazno znači ljestvicu aplikacije.", + "Portfolio readers": "Čitatelji portfelja", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud korisnički ID-ovi voditelja portfelja projekta", + "The portfolio this project belongs to": "Portfelj kojem ovaj projekt pripada", + "No portfolio": "Bez portfelja", + "All portfolios": "Svi portfelji", + "You read this project as a manager of its portfolio. Only its members change it.": "Ovaj projekt čitate kao voditelj njegova portfelja. Mijenjaju ga samo njegovi članovi.", + "Portfolios": "Portfelji", + "Portfolio status": "Stanje portfelja", + "No portfolios yet": "Još nema portfelja", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administrator dodaje portfelje u Projekti, Portfelji. Projekti u portfelju ovdje su navedeni sa svojim stanjem.", + "Roll-up": "Sažetak", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} prema planu, {atRisk} ugroženo, {offTrack} izvan plana, {noReport} bez izvješća", + "No project in this portfolio that you can read.": "U ovom portfelju nema projekta koji možete čitati.", + "Start": "Početak", + "End": "Kraj", + "Budget": "Proračun", + "Last report": "Zadnje izvješće", + "Out of date": "Zastarjelo", + "Portfolio timeline": "Vremenska crta portfelja", + "Zoom": "Zumiranje", + "Could not load the timeline": "Vremensku crtu nije moguće učitati", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administrator dodaje portfelje u Projekti, Portfelji. Projekti u portfelju ovdje su na jednoj vremenskoj crti.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Otvorite projekt da biste vidjeli njegove faze i zadatke. Vremenska crta je samo za čitanje.", + "Phase: {title}": "Faza: {title}", + "Left out because you cannot read them: {count} projects": "Izostavljeno jer ih ne možete čitati: {count} projekata", + "Week": "Tjedan", + "Day": "Dan", + "Month": "Mjesec", + "Please try again later.": "Pokušajte ponovno kasnije.", + "Status reports": "Izvješća o stanju", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Nakon koliko dana se zadnje izvješće o stanju projekta u pregledu portfelja označava kao zastarjelo", + "Reporting period (days)": "Razdoblje izvještavanja (dani)", + "The reporting period is a whole number of days from 1 to 365.": "Razdoblje izvještavanja je cijeli broj dana od 1 do 365.", + "Reporting period saved": "Razdoblje izvještavanja spremljeno", + "The reporting period was not saved. Please try again.": "Razdoblje izvještavanja nije spremljeno. Pokušajte ponovno.", + "Every project of a portfolio with its status per aspect, rolled up.": "Svaki projekt portfelja sa stanjem po aspektima, sažeto.", + "The projects of a portfolio on one timeline.": "Projekti portfelja na jednoj vremenskoj crti.", + "Phases": "Faze", + "Add phase": "Dodaj fazu", + "No phases yet": "Još nema faza", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Podijelite projekt u faze, primjerice pokretanje, definiciju i provedbu. Faza se zatvara kad se učita njezin završni dokument.", + "{hours} hours": "{hours} sati", + "Concluding document: {title}": "Završni dokument: {title}", + "Concluding document missing": "Nedostaje završni dokument", + "Move {title} up": "Pomakni {title} gore", + "Move {title} down": "Pomakni {title} dolje", + "Close phase": "Zatvori fazu", + "Phase": "Faza", + "Files": "Datoteke", + "Notes": "Bilješke", + "Audit trail": "Revizijski trag", + "Edit phase": "Uredi fazu", + "Name": "Naziv", + "Budget hours": "Planirani sati", + "Could not save the phase. Please try again.": "Fazu nije moguće spremiti. Pokušajte ponovno.", + "Close phase {title}": "Zatvori fazu {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Faza se zatvara završnim dokumentom: učitajte ga ovdje ili odaberite jednu od datoteka faze.", + "Concluding document": "Završni dokument", + "This phase has no files yet.": "Ova faza još nema datoteka.", + "Upload a document": "Učitaj dokument", + "The document was not uploaded. Please try again.": "Dokument nije učitan. Pokušajte ponovno.", + "Upload the concluding document before you close this phase.": "Učitajte završni dokument prije zatvaranja ove faze.", + "This phase cannot be closed from its current status.": "Ova se faza ne može zatvoriti iz trenutnog stanja.", + "The phase was not closed. Please try again.": "Faza nije zatvorena. Pokušajte ponovno.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID datoteke ove faze koja je zatvara. Faza se može dovršiti tek kad je postavljen i datoteka je priložena.", + "Import from Microsoft Project": "Uvezi iz Microsoft Projecta", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Odaberite plan spremljen iz Microsoft Projecta u XML formatu. Ništa se ne uvozi dok ne potvrdite.", + "Plan file": "Datoteka plana", + "What the import creates": "Što uvoz stvara", + "Tasks": "Zadaci", + "Sub-tasks": "Podzadaci", + "Milestones": "Prekretnice", + "Links": "Veze", + "Already imported, updated in place: {count}": "Već uvezeno, ažurirano na mjestu: {count}", + "What does not carry over": "Što se ne prenosi", + "Tasks with resources, which are not imported: {count}": "Zadaci s resursima, koji se ne uvoze: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Zadaci dublje od razine 3, smješteni pod svoj zadatak razine 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Veze osim kraj-početak, uvezene kao povezane veze: {count}", + "Link lags, which are dropped: {count}": "Kašnjenja veza, koja se odbacuju: {count}", + "Links to a summary task, which are not imported: {count}": "Veze prema zbirnom zadatku, koje se ne uvoze: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Veze prema zadacima izvan ovog plana, koje se ne uvoze: {count}", + "No longer in the plan": "Više nije u planu", + "These stay in the project; remove them yourself if they are no longer needed.": "Ostaju u projektu; uklonite ih sami ako više nisu potrebni.", + "Import": "Uvezi", + "Close": "Zatvori", + "The plan is imported: {created} created, {updated} updated.": "Plan je uvezen: stvoreno {created}, ažurirano {updated}.", + "Links that would close a loop were left out: {count}": "Veze koje bi zatvorile petlju izostavljene su: {count}", + "The import stopped part-way. Run it again to finish it.": "Uvoz se zaustavio na pola puta. Pokrenite ga ponovno da ga dovršite.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Spremite plan u Microsoft Projectu putem Datoteka, Spremi kao, XML format, i uvezite tu datoteku.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ova datoteka deklarira DOCTYPE ili entitete, koji se ne prihvaćaju.", + "The file is larger than 10 MB.": "Datoteka je veća od 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plan ima više od 2.000 zadataka, više nego što jedan uvoz prima.", + "This file is not a Microsoft Project plan in XML format.": "Ova datoteka nije plan Microsoft Projecta u XML formatu.", + "Choose a file to import.": "Odaberite datoteku za uvoz.", + "Only the project owner can import a plan.": "Samo vlasnik projekta može uvesti plan.", + "The plan could not be read. Please try again.": "Plan nije moguće pročitati. Pokušajte ponovno.", + "Linked case: {title}": "Povezani predmet: {title}", + "Linked to a case": "Povezano s predmetom", + "Hand over to case": "Predaj predmetu", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Nepromijenjeno kopira svaku datoteku projekta i njegovih zadataka te datoteku koja opisuje projekt u povezani predmet.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopirane datoteke: {count}", + "Files that failed: {names}": "Neuspjele datoteke: {names}", + "The handover failed. Please try again.": "Predaja nije uspjela. Pokušajte ponovno.", + "The linked case could not be found, or you cannot open it.": "Povezani predmet nije pronađen ili ga ne možete otvoriti.", + "Case handovers": "Predaje predmetu", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Svaka predaja datoteka i metapodataka projekta njegovu predmetu: kada, tko, kojem predmetu, svaka kopirana datoteka s njezinim SHA-256 i neuspjele datoteke.", + "Finance": "Financije", + "Add cost line": "Dodaj stavku troška", + "Delivery terms": "Uvjeti isporuke", + "Billing model": "Model naplate", + "Budget in euro": "Proračun u eurima", + "Budget in hours": "Proračun u satima", + "Hourly rate in euro": "Satnica u eurima", + "Planned start": "Planirani početak", + "Planned end": "Planirani završetak", + "Planned dates": "Planirani datumi", + "Budget {amount}": "Proračun {amount}", + "No budget agreed": "Proračun nije dogovoren", + "Hours": "Sati", + "Only the project owner and the portfolio managers see the amounts.": "Iznose vide samo vlasnik projekta i upravitelji portfelja.", + "Budget against cost per category": "Proračun naspram troškova po kategoriji", + "Labour (booked time)": "Rad (evidentirani sati)", + "No category": "Bez kategorije", + "Hours are not available": "Sati nisu dostupni", + "Not yet assigned to a category": "Još nije dodijeljeno kategoriji", + "Total": "Ukupno", + "{spent} spent, {remaining} remaining": "{spent} potrošeno, {remaining} preostalo", + "Budget against cost per phase": "Proračun naspram troškova po fazi", + "No phase": "Bez faze", + "Cost lines": "Stavke troška", + "From the finance system": "Iz financijskog sustava", + "Edit cost line {amount}": "Uredi stavku troška {amount}", + "No cost lines yet": "Još nema stavki troška", + "Commitments": "Obveze", + "Actual cost": "Stvarni trošak", + "Forecast": "Prognoza", + "Remaining": "Preostalo", + "Not planned yet": "Još nije planirano", + "{start} to {end}": "{start} do {end}", + "The terms were not saved. Please try again.": "Uvjeti nisu spremljeni. Pokušajte ponovno.", + "Terms saved": "Uvjeti spremljeni", + "Fixed price": "Fiksna cijena", + "Hourly": "Po satu", + "Not billed": "Ne naplaćuje se", + "Commitment": "Obveza", + "Edit cost line": "Uredi stavku troška", + "Kind": "Vrsta", + "Amount in euro": "Iznos u eurima", + "Remove": "Ukloni", + "Could not save the cost line. Only the project owner changes the money of a project.": "Stavku troška nije moguće spremiti. Novac projekta mijenja samo vlasnik projekta.", + "Could not remove the cost line. Please try again.": "Stavku troška nije moguće ukloniti. Pokušajte ponovno.", + "{amount} over budget": "{amount} iznad proračuna", + "Cost categories": "Kategorije troškova", + "The categories every project splits its budget and costs into, one per line": "Kategorije na koje svaki projekt dijeli svoj proračun i troškove, jedna po retku", + "Categories": "Kategorije", + "Give at least one category, each name once.": "Navedite barem jednu kategoriju, svaki naziv jednom.", + "Cost categories saved": "Kategorije troškova spremljene", + "The cost categories were not saved. Please try again.": "Kategorije troškova nisu spremljene. Pokušajte ponovno.", + "Finance line": "Financijska stavka", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Jedan novčani iznos projekta: proračun, obveza, stvarni trošak ili prognoza, u kategoriji troškova i po želji u fazi. Unosi je vlasnik projekta ili je šalje financijski sustav putem aplikacije za integraciju.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt kojem iznos pripada. Prazno za stavku iz financijskog sustava čiji broj projekta ne odgovara nijednom projektu.", + "The phase this amount belongs to, if any": "Faza kojoj iznos pripada, ako postoji", + "The cost category, one of the categories the admin set up": "Kategorija troškova, jedna od kategorija koje je postavio administrator", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Je li iznos proračun, obveza, stvarni trošak ili prognoza", + "Amount": "Iznos", + "The amount in the reporting currency (euro)": "Iznos u izvještajnoj valuti (euro)", + "The date the amount was booked or is expected": "Datum kada je iznos knjižen ili se očekuje", + "What the amount is for": "Za što je iznos", + "Whether a person entered the line or the finance system sent it": "Je li stavku unijela osoba ili ju je poslao financijski sustav", + "Entered by hand": "Uneseno ručno", + "Finance line id": "Id financijske stavke", + "The finance system's own id of this line. One imported line per id.": "Vlastiti id ove stavke u financijskom sustavu. Jedna uvezena stavka po id-u.", + "Project number": "Broj projekta", + "The project number the finance system sent, matched against the project key": "Broj projekta koji je poslao financijski sustav, uspoređen s ključem projekta", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfelj projekta stavke, preuzet s projekta da bi zbrojevi portfelja trebali jedan filtar", + "Finance readers": "Čitatelji financija", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-ovi korisnika Nextclouda koji smiju vidjeti ovaj iznos: vlasnik projekta i upravitelji njegova portfelja", + "Project owner": "Vlasnik projekta", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID korisnika Nextclouda vlasnika projekta, koji smije mijenjati i uklanjati ručne stavke", + "How the client pays: not billed, a fixed price, or by the hour.": "Kako klijent plaća: ne naplaćuje se, fiksna cijena ili po satu.", + "Portfolio finance": "Financije portfelja", + "You cannot see the money of any project in this portfolio": "Ne možete vidjeti novac nijednog projekta u ovom portfelju", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Poslužitelj je vratio stavke troška projekata izvan ovog portfelja, pa ovi zbrojevi mogu biti pogrešni.", + "Projects left out because you cannot see their money: {count}": "Izostavljeni projekti jer ne možete vidjeti njihov novac: {count}", + "Unmatched finance lines": "Nepovezane financijske stavke", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Proračun, obveze, stvarni trošak i prognoza zbrojeni za portfelj.", + "Subprojects": "Potprojekti", + "{done} of {total}": "{done} od {total}", + "{done} of {total} tasks done, including subprojects": "{done} od {total} zadataka gotovo, uključujući potprojekte", + "Show the subprojects of {title}": "Prikaži potprojekte {title}", + "Hide the subprojects of {title}": "Sakrij potprojekte {title}", + "Part of": "Dio", + "No parent project": "Bez nadređenog projekta", + "A project cannot sit under one of its own subprojects.": "Projekt ne može biti ispod jednog od svojih potprojekata.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekti se ugnježđuju najviše tri razine duboko: program, projekt i potprojekt.", + "Parent project": "Nadređeni projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt ispod kojeg je ovaj projekt, npr. program. Projekti se ugnježđuju najviše tri razine duboko.", + "Yes": "Da", + "No": "Ne", + "{label} (required)": "{label} (obavezno)", + "{label} is required": "{label} je obavezno", + "Project field": "Polje projekta", + "A field an admin adds to every project, such as a policy area or a contract value.": "Polje koje administrator dodaje svakom projektu, npr. područje politike ili vrijednost ugovora.", + "Key": "Ključ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stalni naziv pod kojim se vrijednost sprema, u lower camel case. Zadržite ga kad ga projekti koriste.", + "Label": "Oznaka", + "The name people see next to the field": "Naziv koji ljudi vide pokraj polja", + "What the field holds": "Što polje sadrži", + "Text": "Tekst", + "Number": "Broj", + "Choice": "Izbor", + "Person": "Osoba", + "Yes or no": "Da ili ne", + "Options": "Mogućnosti", + "The choices of a choice field": "Mogućnosti polja izbora", + "Required": "Obavezno", + "Whether a project must fill in the field": "Mora li projekt ispuniti polje", + "Where the field appears, lowest first": "Gdje se polje pojavljuje, najniže prvo", + "Applies to": "Vrijedi za", + "What the field is added to": "Čemu se polje dodaje", + "Custom fields": "Vlastita polja", + "The values of the project fields an admin defined, keyed by the field's key.": "Vrijednosti polja projekta koja je definirao administrator, prema ključu polja.", + "Project fields": "Polja projekta", + "Related": "Povezano", + "Remove link": "Ukloni poveznicu", + "Link type": "Vrsta poveznice", + "Relates to": "Povezano s", + "Duplicates": "Duplicira", + "Project key": "Ključ projekta", + "Every task number starts with it, such as VERG-42.": "Svaki broj zadatka počinje njime, na primjer VERG-42.", + "This key is already used by another project.": "Ovaj ključ već koristi drugi projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Koristite od 2 do 10 slova i znamenki, počevši slovom.", + "The key cannot change once tasks carry it.": "Ključ se ne može promijeniti kad ga zadaci nose.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt je spremljen. Postojeći zadaci dobivaju brojeve u pozadini.", + "Next task number": "Broj sljedećeg zadatka", + "The number the next task of this project gets in its key. Only the system writes it.": "Broj koji sljedeći zadatak ovog projekta dobiva u svom ključu. Upisuje ga samo sustav.", + "Restore {title}": "Vrati {title}", + "Restore": "Vrati", + "Project restored": "Projekt je vraćen", + "Could not restore the project": "Projekt nije moguće vratiti", + "Bring this project back to the active list.": "Vrati ovaj projekt na popis aktivnih projekata.", + "Restore project": "Vrati projekt", + "Request reason": "Razlog zahtjeva", + "Why the requester needs this project. Filled in when the project is requested.": "Zašto podnositelju treba ovaj projekt. Ispunjava se pri zahtjevu.", + "Reviewed by": "Pregledao", + "The user who approved or rejected the request.": "Korisnik koji je odobrio ili odbio zahtjev.", + "Reviewed at": "Pregledano", + "When the request was approved or rejected.": "Kada je zahtjev odobren ili odbijen.", + "Review note": "Napomena pregledavatelja", + "The reviewer's reason, shown to the requester when a request is not approved.": "Razlog pregledavatelja koji podnositelj vidi kad zahtjev nije odobren.", + "Members of these groups": "Članovi ovih grupa", + "Groups that may create projects": "Grupe koje smiju stvarati projekte", + "The group {group} no longer exists. Save to remove it.": "Grupa {group} više ne postoji. Spremite da biste je uklonili.", + "Review project request": "Pregledaj zahtjev za projekt", + "Requested by": "Zatražio", + "Why it is needed": "Zašto je potreban", + "Desired start date": "Željeni datum početka", + "Why is it not approved?": "Zašto nije odobren?", + "Give a reason. The requester sees it.": "Navedite razlog. Podnositelj će ga vidjeti.", + "Approve": "Odobri", + "Reject": "Odbij", + "Reject request": "Odbij zahtjev", + "The review was not saved. Try again.": "Pregled nije spremljen. Pokušajte ponovno.", + "This project is waiting for review": "Ovaj projekt čeka pregled", + "This request was not approved": "Ovaj zahtjev nije odobren", + "Reason: {note}": "Razlog: {note}", + "Review request": "Pregledaj zahtjev", + "Request a project": "Zatraži projekt", + "Step {step} of 2": "Korak {step} od 2", + "Why is this project needed?": "Zašto je ovaj projekt potreban?", + "Give a reason. The reviewer reads it.": "Navedite razlog. Pregledavatelj će ga pročitati.", + "Back": "Natrag", + "Next": "Dalje", + "Send request": "Pošalji zahtjev", + "The request was not sent. Try again.": "Zahtjev nije poslan. Pokušajte ponovno.", + "Requested": "Zatraženo", + "Not approved": "Nije odobreno", + "Your request was sent": "Vaš zahtjev je poslan", + "Let everyone else request a project": "Dopusti svima ostalima da zatraže projekt", + "Add a task": "Dodaj zadatak", + "Delete task": "Izbriši zadatak", + "Edit task": "Uredi zadatak", + "Write": "Piši", + "Preview": "Pregled", + "Markdown works here: headings, lists and links.": "Ovdje radi Markdown: naslovi, popisi i poveznice.", + "Could not save the task. Please try again.": "Zadatak nije moguće spremiti. Pokušajte ponovno.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Na zadatku \"{title}\" evidentirano je vrijeme pa se ne može izbrisati. Umjesto toga možete ga otkazati: zapisi vremena ostaju.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Izbrisati \"{title}\"? Uklonit će se i njegove veze s drugim zadacima. Ovo se ne može poništiti.", + "Keep task": "Zadrži zadatak", + "Cancel task": "Otkaži zadatak", + "Only the reporter, the project owner or an admin can delete this task.": "Ovaj zadatak može izbrisati samo prijavitelj, vlasnik projekta ili administrator.", + "Could not delete the task. Please try again.": "Zadatak nije moguće izbrisati. Pokušajte ponovno.", + "Could not cancel the task. Please try again.": "Zadatak nije moguće otkazati. Pokušajte ponovno.", + "Responsible": "Odgovorna osoba", + "Also working on this": "Na ovome rade i", + "Labels": "Oznake", + "Could not change the priority. Please try again.": "Prioritet nije moguće promijeniti. Pokušajte ponovno.", + "Other project members who work on this task alongside the person responsible.": "Ostali članovi projekta koji na ovom zadatku rade zajedno s odgovornom osobom.", + "Duplicate": "Dupliciraj", + "Could not copy the task. Please try again.": "Zadatak nije moguće kopirati. Pokušajte ponovno.", + "Subtasks": "Podzadaci", + "{done} of {total} done": "Gotovo {done} od {total}", + "Add a subtask": "Dodaj podzadatak", + "Checklist": "Kontrolni popis", + "Checklist item actions": "Radnje stavke popisa", + "Add a checklist item": "Dodaj stavku popisa", + "Subtasks: {estimate} estimated, {logged} logged": "Podzadaci: procjena {estimate}, evidentirano {logged}", + "Total estimate: {total}": "Ukupna procjena: {total}", + "Part of {title}": "Dio zadatka {title}", + "Checklist: {count} done": "Kontrolni popis: gotovo {count}", + "This task has subtasks: {count}.": "Ovaj zadatak ima podzadatke: {count}.", + "Keep subtasks as separate tasks": "Zadrži podzadatke kao zasebne zadatke", + "Delete subtasks too": "Izbriši i podzadatke", + "Copy of {title}": "Kopija: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Zadatak je kopiran, ali ne i svi njegovi podzadaci. Provjerite kopiju.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Mali koraci unutar zadatka. Svaka stavka ima id, tekst i podatak je li gotova.", + "Open work per person and per project.": "Otvoreni posao po osobi i po projektu.", + "View": "Prikaz", + "By person": "Po osobi", + "By project": "Po projektu", + "Hours left": "Preostali sati", + "Tasks without an estimate": "Zadaci bez procjene", + "Due in 14 days": "Rok u 14 dana", + "Shared": "Dijeljeno", + "Unassigned": "Nedodijeljeno", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Prikazuje se posao u projektima koje možete vidjeti. Sati se računaju odgovornoj osobi; dijeljeni zadaci računaju se bez sati.", + "No open work in these projects.": "Nema otvorenog posla u ovim projektima.", + "Open work": "Otvoreni posao", + "{count} open tasks": "{count} otvorenih zadataka", + "Create a project to see capacity here.": "Izradite projekt da biste ovdje vidjeli kapacitet.", + "My tasks": "Moji zadaci", + "Show all my tasks": "Prikaži sve moje zadatke", + "No tasks assigned to you": "Nemate dodijeljenih zadataka", + "Browse projects": "Pregledaj projekte", + "Later": "Kasnije", + "Due {date}": "Rok {date}", + "Could not change the status. Please try again.": "Status nije moguće promijeniti. Pokušajte ponovno.", + "Completed today": "Dovršeno danas", + "My open tasks": "Moji otvoreni zadaci", + "My overdue tasks": "Moji zakašnjeli zadaci", + "My tasks in progress": "Moji zadaci u tijeku", + "Pin to the top": "Prikvači na vrh", + "Unpin": "Otkvači", + "Pinned": "Prikvačeno", + "Actions for {title}": "Radnje za {title}", + "Could not save your project order. Please try again.": "Redoslijed projekata nije moguće spremiti. Pokušajte ponovno.", + "No boards yet": "Još nema ploča", + "Create a project to get a board.": "Izradite projekt da biste dobili ploču.", + "Use the Projects page to create and manage your projects and tasks.": "Na stranici Projekti izrađujte i upravljajte svojim projektima i zadacima.", + "Go to projects": "Idi na projekte", + "You are not a member of any projects yet.": "Još niste član nijednog projekta.", + "Could not search for users. Please try again.": "Pretraživanje korisnika nije uspjelo. Pokušajte ponovno.", + "Project creation is restricted to administrators.": "Projekte mogu izrađivati samo administratori.", + "Only the project owner or an administrator can delete this project.": "Ovaj projekt može izbrisati samo vlasnik projekta ili administrator.", + "No projects are available to you yet. Ask an administrator to create one.": "Još nemate dostupnih projekata. Zamolite administratora da izradi jedan.", + "Due: {date}": "Rok: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Zadaci s datumom početka ili rokom prikazuju se na vremenskoj crti. Dodajte datume da biste ih ovdje vidjeli.", + "You do not have access to this project.": "Nemate pristup ovom projektu.", + "Zoom level": "Razina zumiranja", + "Unscheduled": "Neplanirano", + "Start: {date}": "Početak: {date}", + "Today": "Danas", + "No scheduled tasks": "Nema planiranih zadataka", + "An unexpected error occurred.": "Došlo je do neočekivane pogreške.", + "Column {number} name": "Naziv stupca {number}", + "Failed to save creation policy": "Pravilo izrade nije moguće spremiti", + "All authenticated users": "Svi prijavljeni korisnici", + "Control who may create new projects": "Odredite tko smije izrađivati nove projekte", + "Administrators only": "Samo administratori", + "Project creation": "Izrada projekata", + "Allow project creation": "Dopusti izradu projekata", + "Creation policy saved successfully": "Pravilo izrade spremljeno", + "Initializing…": "Pokretanje…", + "e.g. 2h 30m, 90m, 1.5h": "npr. 2h 30m, 90m, 1.5h", + "Log time": "Upiši vrijeme", + "Save estimate": "Spremi procjenu", + "Logged: {logged}": "Upisano: {logged}", + "over by {amount}": "prekoračeno za {amount}", + "Time tracking": "Evidencija vremena", + "Estimate": "Procjena", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Unesite valjanu procjenu (npr. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Unesite valjano trajanje (npr. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Unos vremena nije moguće spremiti. Pokušajte ponovno.", + "Edit time entry": "Uredi unos vremena", + "Duration": "Trajanje", + "Date range": "Razdoblje", + "Last week": "Prošli tjedan", + "No time logged": "Nema upisanog vremena", + "Log time on a task to see it here.": "Upišite vrijeme na zadatak da biste ga ovdje vidjeli.", + "To date": "Do datuma", + "This week": "Ovaj tjedan", + "Total: {total}": "Ukupno: {total}", + "From date": "Od datuma", + "Custom range": "Prilagođeno razdoblje", + "All time": "Cijelo vrijeme", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Zadatak nije moguće izbrisati pa podaci mogu ostati. Ponovno izbrišite projekt.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Unos vremena nije moguće izbrisati pa podaci mogu ostati. Ponovno izbrišite projekt.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Stupac nije moguće izbrisati pa podaci mogu ostati. Ponovno izbrišite projekt.", + "Could not delete the project. Please try again.": "Projekt nije moguće izbrisati. Pokušajte ponovno.", + "Notification settings": "Postavke obavijesti", + "Configure when due-date reminders are sent": "Odredite kada se šalju podsjetnici na rokove", + "Due-date reminder lead time (hours)": "Vrijeme podsjetnika prije roka (sati)", + "Lead time must be between 1 and 336 hours": "Vrijeme mora biti između 1 i 336 sati", + "Reminder lead time saved successfully": "Vrijeme podsjetnika spremljeno", + "Failed to save reminder lead time": "Vrijeme podsjetnika nije moguće spremiti", + "Notifications": "Obavijesti", + "Notify me 1 day before a task's due date": "Obavijesti me 1 dan prije roka zadatka", + "Draft": "Nacrt", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Je li sat nacrt koji vidi samo njegov nastavnik, održava li se ili je otkazan.", + "New release": "Novo izdanje", + "Roadmap chart. The same releases and epics are listed below.": "Grafikon plana razvoja. Ista izdanja i epovi navedeni su ispod.", + "Nothing on the roadmap yet": "Još ništa na planu razvoja", + "Releases with a target date and epics with dated tasks appear here.": "Ovdje se prikazuju izdanja s ciljnim datumom i epovi sa zadacima koji imaju datum.", + "Releases": "Izdanja", + "No releases yet": "Još nema izdanja", + "Target date: {date}": "Ciljni datum: {date}", + "No target date": "Nema ciljnog datuma", + "Edit {name}": "Uredi {name}", + "Mark {name} as released": "Označi {name} kao objavljeno", + "Mark as released": "Označi kao objavljeno", + "Epics": "Epovi", + "No epics yet. Open a task to make it an epic.": "Još nema epova. Otvorite zadatak da biste ga pretvorili u ep.", + "Not scheduled yet": "Još nije zakazano", + "Planned": "Planirano", + "Released": "Objavljeno", + "Edit release": "Uredi izdanje", + "Target date": "Ciljni datum", + "Could not save the release. Please try again.": "Izdanje nije moguće spremiti. Pokušajte ponovno.", + "Every task of this release is done or cancelled.": "Svaki zadatak ovog izdanja je dovršen ili otkazan.", + "Not finished yet: {count}": "Još nije dovršeno: {count}", + "What happens to these tasks?": "Što se događa s ovim zadacima?", + "Move to {name}": "Premjesti u {name}", + "Remove the release": "Ukloni izdanje", + "Keep it on {name}": "Ostavi ih na {name}", + "Could not mark the release as released. Please try again.": "Izdanje nije moguće označiti kao objavljeno. Pokušajte ponovno.", + "Roadmap": "Plan razvoja", + "Tasks or roadmap": "Zadaci ili plan razvoja", + "Release": "Izdanje", + "Epic": "Ep", + "This task is an epic": "Ovaj zadatak je ep", + "A named, dated delivery of a project that its tasks are planned against.": "Imenovana isporuka projekta s datumom prema kojoj se planiraju njegovi zadaci.", + "Name of the release": "Naziv izdanja", + "The project this release belongs to": "Projekt kojem pripada ovo izdanje", + "What this release delivers": "Što ovo izdanje isporučuje", + "When work on the release starts": "Kada počinje rad na izdanju", + "The date the release is due": "Datum do kojeg izdanje treba biti gotovo", + "Whether the release is planned, released or archived": "Je li izdanje planirano, objavljeno ili arhivirano", + "Released on": "Objavljeno", + "When the release was marked as released": "Kada je izdanje označeno kao objavljeno", + "The release this task is planned for": "Izdanje za koje je ovaj zadatak planiran", + "Board view options": "Mogućnosti prikaza ploče", + "Colour cards": "Oboji kartice", + "No colour": "Bez boje", + "By label": "Po oznaci", + "Swimlanes": "Plivaće staze", + "No swimlanes": "Bez plivaćih staza", + "By assignee": "Po dodijeljenoj osobi", + "By epic": "Po epicu", + "No assignee": "Nije dodijeljeno", + "No epic": "Bez epica", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartice ostaju u retku svog epica. Promijenite epic na stranici zadatka.", + "Hand over to": "Predaj osobi", + "Could not save your board view. It applies until you reload.": "Prikaz ploče nije spremljen. Vrijedi dok ne učitate stranicu ponovno.", + "Timetable wish": "Želja za raspored", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Želja koju generator uzima u obzir. Tvrdu želju uvijek poštuje, meku gdje može.", + "Whether the wish is about a teacher, a group, a room or one activity": "Odnosi li se želja na nastavnika, skupinu, prostoriju ili jednu aktivnost", + "Teacher": "Nastavnik", + "Group": "Skupina", + "Reference": "Poveznica", + "The user, group, room or activity the wish is about": "Korisnik, skupina, prostorija ili aktivnost na koju se želja odnosi", + "What the wish asks for": "Što želja traži", + "Not on these periods": "Ne u ovim satima", + "Preferably not on these periods": "Radije ne u ovim satima", + "At most a number of lessons a day": "Najviše određen broj sati dnevno", + "No free periods between lessons": "Bez rupa između sati", + "Always the same room": "Uvijek ista prostorija", + "Periods": "Sati", + "The periods of the week the wish is about, such as wed-5": "Sati u tjednu na koje se želja odnosi, npr. wed-5", + "Limit": "Granica", + "The most lessons a day, for a wish of that kind": "Najviše sati dnevno, za želju te vrste", + "Strength": "Snaga", + "Whether the generator must keep the wish or should keep it": "Mora li ili bi li generator trebao poštovati želju", + "Hard": "Tvrda", + "Soft": "Meka", + "Weight": "Težina", + "How much a soft wish counts, from 1 to 3": "Koliko meka želja vrijedi, od 1 do 3", + "Why the wish exists": "Zašto želja postoji", + "Timetable scenario": "Scenarij rasporeda", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jedan tjedni obrazac, koji je napravio generator ili je preuzet iz trenutnog rasporeda. Čuva svoj ulaz i koliko dobro poštuje želje.", + "The name timetablers know the scenario by": "Naziv pod kojim sastavljači rasporeda znaju scenarij", + "Whether the generator made it or it came from the current timetable": "Je li ga napravio generator ili dolazi iz trenutnog rasporeda", + "Generated": "Generirano", + "From the current timetable": "Iz trenutnog rasporeda", + "Week of": "Tjedan od", + "The Monday of the first week of the window": "Ponedjeljak prvog tjedna razdoblja", + "Window start": "Početak razdoblja", + "The first day the week pattern applies to": "Prvi dan na koji se tjedni obrazac odnosi", + "Window end": "Kraj razdoblja", + "The last day the week pattern applies to": "Zadnji dan na koji se tjedni obrazac odnosi", + "Waiting, generating, done, failed, or published as draft lessons": "Čeka, generira se, gotovo, neuspjelo ili objavljeno kao nacrti sati", + "Waiting": "Čeka", + "Generating": "Generira se", + "Failed": "Neuspjelo", + "Published": "Objavljeno", + "Seed": "Sjeme", + "The number the generator starts from, so a run can be repeated": "Broj od kojeg generator kreće, kako bi se pokretanje moglo ponoviti", + "Input": "Ulaz", + "The periods, rooms, lessons and wishes the scenario was made from": "Sati, prostorije, nastavni sati i želje od kojih je nastao scenarij", + "Placements": "Smještaji", + "Each lesson with the period and room it was given": "Svaki nastavni sat sa satom i prostorijom koje je dobio", + "Unplaced lessons": "Nesmješteni sati", + "Lessons without a place, each with the hard wish that blocked it": "Sati bez mjesta, svaki s tvrdom željom koja ga je zaustavila", + "Broken wishes": "Prekršene želje", + "The wishes this scenario breaks, with the lessons that break them": "Želje koje ovaj scenarij krši, sa satima koji ih krše", + "Measures": "Mjere", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Smješteni sati, prekršene želje, rupe nastavnika, sati dnevno i korištenje prostorija", + "Reason": "Razlog", + "Why the run failed": "Zašto pokretanje nije uspjelo", + "Published at": "Objavljeno", + "When the scenario was written out as draft lessons": "Kada je scenarij zapisan kao nacrti sati", + "Edit wish": "Uredi želju", + "New wish": "Nova želja", + "Hard: the generator always keeps it": "Obavezno: generator je uvijek poštuje", + "Soft: the generator keeps it where it can": "Fleksibilno: generator je poštuje gdje može", + "Weight (1 to 3)": "Težina (1 do 3)", + "Most lessons a day": "Najviše sati dnevno", + "Period": "Sat", + "{day} period {number}": "{day} sat {number}", + "Teacher (user name)": "Nastavnik (korisničko ime)", + "Activity (group:subject)": "Aktivnost (grupa:predmet)", + "Say who or what the wish is about.": "Navedite na koga ili što se želja odnosi.", + "Choose at least one period.": "Odaberite barem jedan sat.", + "The limit is a whole number of 1 or more.": "Ograničenje je cijeli broj od 1 ili više.", + "Timetable": "Raspored", + "Wishes": "Želje", + "Timetable wishes": "Želje za raspored", + "Generator run": "Pokretanje generatora", + "Generator progress": "Napredak generatora", + "The run failed: {reason}": "Pokretanje nije uspjelo: {reason}", + "{placed} of {lessons} lessons placed": "Smješteno {placed} od {lessons} sati", + "Generate again": "Generiraj ponovno", + "Generate": "Generiraj", + "Every lesson has a place.": "Svaki sat ima mjesto.", + "Lesson": "Sat", + "No free period and room": "Nema slobodnog sata i učionice", + "Broken soft wishes": "Prekršene fleksibilne želje", + "Every soft wish is kept.": "Svaka fleksibilna želja je poštovana.", + "Wish": "Želja", + "Lessons": "Sati", + "Generating: {percent}% of the time budget used": "Generiranje: iskorišteno {percent}% vremena", + "Waiting to start": "Čeka početak", + "Published as draft lessons": "Objavljeno kao nacrti sati", + "Could not read the scenario.": "Scenarij nije moguće pročitati.", + "Could not start the run.": "Pokretanje nije moguće započeti.", + "Scenarios": "Scenariji", + "Timetable scenarios": "Scenariji rasporeda", + "Scenario": "Scenarij", + "Take the current timetable": "Preuzmi trenutačni raspored", + "Could not take the current timetable.": "Trenutačni raspored nije moguće preuzeti.", + "Broken hard wishes": "Prekršene obvezne želje", + "Not on a period of the week grid": "Nije na satu tjedne mreže", + "Compare scenarios": "Usporedi scenarije", + "Scenarios to compare": "Scenariji za usporedbu", + "Choose two or three scenarios to compare them.": "Odaberite dva ili tri scenarija za usporedbu.", + "Measure": "Mjera", + "Best": "Najbolje", + "Lessons that differ": "Sati koji se razlikuju", + "No lesson differs.": "Nijedan sat se ne razlikuje.", + "Not placed": "Nije smješteno", + "{period} in {room}": "{period} u {room}", + "Lessons placed": "Smješteni sati", + "Lessons without a place": "Sati bez mjesta", + "Clashes": "Sukobi", + "Hard wishes broken": "Prekršene obavezne želje", + "Soft wishes broken": "Prekršene fleksibilne želje", + "Soft wishes broken, weighted": "Prekršene fleksibilne želje, ponderirano", + "Free periods between lessons, all teachers": "Prazni sati, svi nastavnici", + "Most free periods of one teacher": "Najviše praznih sati jednog nastavnika", + "Most lessons of one group on a day": "Najviše sati jedne grupe u danu", + "Room use": "Korištenje učionica", + "Publish as draft lessons": "Objavi kao nacrte sati", + "Draft lessons written: {count}": "Zapisani nacrti sati: {count}", + "Could not publish the scenario.": "Scenarij nije moguće objaviti.", + "Rules": "Pravila", + "Rules for {column}": "Pravila za {column}", + "When a card enters this column": "Kada kartica uđe u ovaj stupac", + "Action": "Radnja", + "Set the priority": "Postavi prioritet", + "Assign to": "Dodijeli osobi", + "Assign the person who moved the card": "Dodijeli osobi koja je premjestila karticu", + "Remove the assignee": "Ukloni dodijeljenu osobu", + "Add a label": "Dodaj oznaku", + "No longer a project member": "Više nije član projekta", + "This label no longer exists": "Ova oznaka više ne postoji", + "Add rule": "Dodaj pravilo", + "Remove rule": "Ukloni pravilo", + "No rules yet. Add one to change a card when it enters this column.": "Još nema pravila. Dodajte jedno kako biste promijenili karticu kada uđe u ovaj stupac.", + "Could not save the rules. Please try again.": "Pravila nije moguće spremiti. Pokušajte ponovno.", + "1 rule runs when a card enters this column": "1 pravilo se izvršava kada kartica uđe u ovaj stupac", + "{count} rules run when a card enters this column": "Broj pravila koja se izvršavaju kada kartica uđe u ovaj stupac: {count}", + "Rules applied: {changes}": "Primijenjena pravila: {changes}", + "assigned to {name}": "dodijeljeno osobi {name}", + "assignee removed": "dodijeljena osoba uklonjena", + "priority {priority}": "prioritet {priority}", + "label {label}": "oznaka {label}", + "What happens to a card when it enters this column, applied in list order.": "Što se događa s karticom kada uđe u ovaj stupac, redoslijedom popisa.", + "Value": "Vrijednost", + "What the rule does to the card.": "Što pravilo radi s karticom.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioritet, ID korisnika ili ID oznake koji radnja koristi; prazno za radnje bez vrijednosti.", + "is not": "nije", + "{dimension} is not": "{dimension} nije", + "Saved filters": "Spremljeni filtri", + "No saved filters yet": "Još nema spremljenih filtara", + "Save filter": "Spremi filtar", + "Rename \"{name}\"": "Preimenuj „{name}”", + "Delete \"{name}\"": "Izbriši „{name}”", + "Clear filters": "Očisti filtre", + "Showing {shown} of {total} tasks": "Prikazano {shown} od {total} zadataka", + "Me": "Ja", + "No date": "Bez datuma", + "Rename saved filter": "Preimenuj spremljeni filtar", + "Share with the project": "Podijeli s projektom", + "Give the filter a name": "Dajte filtru naziv", + "Could not save the filter. Please try again.": "Filtar nije moguće spremiti. Pokušajte ponovno.", + "Some labels in \"{name}\" no longer exist and were left out.": "Neke oznake u „{name}” više ne postoje i izostavljene su.", + "Could not delete the filter. Please try again.": "Filtar nije moguće izbrisati. Pokušajte ponovno.", + "Saved filter": "Spremljeni filtar", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Imenovani filtar ploče jednog projekta, privatan za osobu koja ga je spremila, osim ako je podijeljen s projektom.", + "The project whose board the filter applies to": "Projekt na čijoj se ploči filtar primjenjuje", + "The name the filter is listed under": "Naziv pod kojim je filtar naveden", + "Saved by": "Spremio/la", + "Nextcloud user id of the person who saved the filter": "Nextcloud ID korisnika koji je spremio filtar", + "Shared with the project": "Podijeljeno s projektom", + "Whether every project member sees and applies the filter": "Vidi li svaki član projekta filtar i može li ga primijeniti", + "Criteria": "Kriteriji", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtar: dodijeljena osoba, oznaka, prioritet i rok, svaki s je ili nije i svojim vrijednostima", + "Cross-project view": "Međuprojektni prikaz", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Spremljeni odabir projekata čiji se zadaci prikazuju zajedno u stupcima statusa, podijeljen s navedenim osobama.", + "Shared with": "Podijeljeno s", + "The name the view is listed under": "Naziv pod kojim je prikaz naveden", + "Nextcloud user id of the person who saved the view": "Nextcloud korisnički ID osobe koja je spremila prikaz", + "Nextcloud user ids of the people the view is shared with": "Nextcloud korisnički ID-ovi osoba s kojima je prikaz podijeljen", + "The projects whose tasks the view shows, at most twenty": "Projekti čije zadatke prikaz prikazuje, najviše dvadeset", + "1 project in this view is hidden from you.": "1 projekt u ovom prikazu skriven je od vas.", + "{count} projects in this view are hidden from you.": "Projekti u ovom prikazu skriveni od vas: {count}.", + "{project} has no column for {status}.": "Projekt {project} nema stupac za status {status}.", + "This view does not exist or is not shared with you.": "Ovaj prikaz ne postoji ili nije podijeljen s vama.", + "\"{task}\" moved to {status}.": "\"{task}\" premješteno u {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Međuprojektni prikazi", + "New view": "Novi prikaz", + "Edit view": "Uredi prikaz", + "Delete view": "Izbriši prikaz", + "Give the view a name": "Dajte prikazu naziv", + "Pick at least one project": "Odaberite barem jedan projekt", + "A view shows at most {max} projects": "Prikaz prikazuje najviše {max} projekata", + "Could not save the view. Please try again.": "Prikaz nije moguće spremiti. Pokušajte ponovno.", + "Could not delete the view. Please try again.": "Prikaz nije moguće izbrisati. Pokušajte ponovno.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Izbrisati \"{title}\"? Projekti i njihovi zadaci ostaju kakvi jesu.", + "People see the tasks of the projects they are in, never more.": "Svatko vidi samo zadatke projekata u kojima jest.", + "No views yet. A view shows the tasks of several of your projects together.": "Još nema prikaza. Prikaz prikazuje zadatke više vaših projekata zajedno.", + "Projects in view: {count}": "Projekti u prikazu: {count}", + "Notify me when a task is assigned to me": "Obavijesti me kad mi se dodijeli zadatak", + "Also send these to me by email": "Šalji mi ih i e-poštom", + "Add an email address in your Nextcloud personal settings to get mail.": "Dodajte adresu e-pošte u osobnim postavkama Nextclouda da biste primali e-poštu.", + "Code link": "Poveznica na kod", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, grana, zahtjev za spajanje ili zadatak na platformi za kod koji se odnosi na zadatak.", + "The task the link belongs to": "Zadatak kojem poveznica pripada", + "The project of the task": "Projekt zadatka", + "Task key": "Ključ zadatka", + "The task key the forge text named, such as VC-12": "Ključ zadatka naveden u tekstu platforme, npr. VC-12", + "What the link points at": "Na što poveznica pokazuje", + "Link": "Poveznica", + "The address of the item in the forge": "Adresa stavke na platformi za kod", + "The commit message, branch name or merge request title": "Poruka commita, naziv grane ili naslov zahtjeva za spajanje", + "Repository": "Repozitorij", + "The repository, such as acme/portal": "Repozitorij, npr. acme/portal", + "Forge id": "Id na platformi", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Vlastiti id stavke na platformi za kod, npr. github:acme/portal#42 ili hash commita", + "State": "Stanje", + "The state of a merge request or issue": "Stanje zahtjeva za spajanje ili prijave", + "Who made the commit or opened the merge request": "Tko je napravio commit ili otvorio zahtjev za spajanje", + "When the commit was made or the merge request last changed": "Kada je napravljen commit ili se zahtjev za spajanje zadnji put promijenio", + "Added by": "Dodao", + "Whether a person added the link or the integration wrote it": "Je li poveznicu dodala osoba ili ju je zapisala integracija", + "Nextcloud user UIDs of project members": "Nextcloud korisnički ID-ovi članova projekta", + "Add link": "Dodaj poveznicu", + "Added by hand": "Dodano ručno", + "Branch": "Grana", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Iz integracije", + "Link to a commit, branch or merge request": "Poveznica na commit, granu ili zahtjev za spajanje", + "Merge request": "Zahtjev za spajanje", + "Merged": "Spojeno", + "No code linked yet. Name {key} in a commit message or paste a link.": "Još nema povezanog koda. Navedite {key} u poruci commita ili zalijepite poveznicu.", + "No code linked yet. Paste a link to a commit or merge request.": "Još nema povezanog koda. Zalijepite poveznicu na commit ili zahtjev za spajanje.", + "Paste a web address that starts with https://.": "Zalijepite web-adresu koja počinje s https://.", + "Remove link {title}": "Ukloni poveznicu {title}", + "The link could not be added.": "Poveznicu nije bilo moguće dodati.", + "The link could not be removed.": "Poveznicu nije bilo moguće ukloniti.", + "This link is already on the task.": "Ova poveznica već je na zadatku.", + "Code forges": "Platforme za kod", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Povežite commitove i pull requestove s GitHuba sa zadacima. Integriq prima događaje; planninq nikad ne poziva GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Preuzmite konfiguraciju i uvezite je u Integriq. Zatim upišite tajnu u pravilo \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "U GitHubu repozitoriju dodajte webhook s ovom adresom i istom tajnom. Odaberite vrstu sadržaja application/json te događaje push i pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Navedite ključ zadatka, npr. VC-12, u poruci commita, nazivu grane ili naslovu pull requesta. Poveznica se tada pojavljuje na tom zadatku.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriqa članovi projekta i dalje mogu zalijepiti poveznicu na stranici zadatka.", + "Download the Integriq configuration": "Preuzmi konfiguraciju za Integriq", + "Calendar": "Kalendar", + "Previous": "Prethodno", + "Calendar view": "Prikaz kalendara", + "Starts:": "Počinje:", + "No tasks with a date in this month.": "Ovaj mjesec nema zadataka s datumom.", + "Week of {start} to {end}": "Tjedan od {start} do {end}", + "My calendar": "Moj kalendar", + "Show as list": "Prikaži kao popis", + "Show as calendar": "Prikaži kao kalendar", + "Open my calendar": "Otvori moj kalendar", + "Nextcloud Tasks": "Nextcloud Zadaci", + "Show my tasks in Nextcloud Tasks": "Prikaži moje zadatke u Nextcloud Zadacima", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Zadaci dodijeljeni vama ili podijeljeni s vama prikazuju se na popisu \"Planninq\" u Nextcloud Zadacima i Kalendaru. Promjene napravljene ondje zamjenjuju se sljedećom promjenom u Planninqu.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ovaj poslužitelj ne može pisati u Nextcloud Zadatke pa izvoz nije dostupan.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Upravlja Planninq. Promjene napravljene ovdje zamjenjuju se sljedećom promjenom u Planninqu.", + "Working days and holidays": "Radni dani i praznici", + "Dates set on the timeline skip the days that are not working days.": "Datumi postavljeni na vremenskoj crti preskaču dane koji nisu radni.", + "Working weekdays": "Radni dani u tjednu", + "Non-working days": "Neradni dani", + "No non-working days yet.": "Još nema neradnih dana.", + "Add day": "Dodaj dan", + "Year": "Godina", + "Add Dutch national holidays": "Dodaj nizozemske državne praznike", + "Save working days": "Spremi radne dane", + "Choose at least one working weekday.": "Odaberite barem jedan radni dan.", + "Working days saved.": "Radni dani spremljeni.", + "Could not save the working days.": "Radne dane nije bilo moguće spremiti.", + "New Year's Day": "Nova godina", + "Easter Sunday": "Uskrs", + "Easter Monday": "Uskrsni ponedjeljak", + "King's Day": "Kraljev dan", + "Liberation Day": "Dan oslobođenja", + "Ascension Day": "Uzašašće", + "Whit Sunday": "Duhovi", + "Whit Monday": "Duhovski ponedjeljak", + "Christmas Day": "Božić", + "Boxing Day": "Sveti Stjepan", + "Dates of {title}": "Datumi za {title}", + "The due date cannot be before the start date.": "Rok ne može biti prije datuma početka.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Datume nije bilo moguće spremiti.", + "{title} now runs from {start} to {end}": "{title} sada traje od {start} do {end}", + "Auto-scheduling": "Automatsko planiranje", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kad je uključeno, kasniji rok na vremenskoj crti nudi pomicanje zadataka koje blokira.", + "Move blocked tasks along when a task slips": "Pomakni blokirane zadatke kad zadatak kasni", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na vremenskoj crti kasniji rok nudi pomicanje blokiranih zadataka. Broje se samo veze \"blokira\", a zadaci se pomiču samo kasnije.", + "Move the tasks that wait for {title}?": "Pomaknuti zadatke koji čekaju {title}?", + "These tasks wait for it and would start after its new due date:": "Ovi zadaci ga čekaju i počeli bi nakon novog roka:", + "{count} tasks would move; the first {limit} are listed.": "Pomaknulo bi se {count} zadataka; prikazano je prvih {limit}.", + "Now": "Sada", + "After the move": "Nakon pomaka", + "Only this task": "Samo ovaj zadatak", + "Move all": "Pomakni sve", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Zaustavljeno kod {title}: datume nije bilo moguće spremiti. Zadaci prije njega su pomaknuti.", + "Cumulative flow": "Kumulativni tok", + "Show as chart": "Prikaži kao grafikon", + "Show as table": "Prikaži kao tablicu", + "Tasks per column per day": "Zadaci po stupcu po danu", + "Tasks without recorded history in this period: {count}": "Zadaci bez zabilježene povijesti u ovom razdoblju: {count}", + "Lead and cycle time": "Vrijeme isporuke i vrijeme ciklusa", + "No tasks were finished in this period.": "U ovom razdoblju nije dovršen nijedan zadatak.", + "Finished tasks": "Dovršeni zadaci", + "Cycle time, average": "Vrijeme ciklusa, prosjek", + "Cycle time, 85th percentile": "Vrijeme ciklusa, 85. percentil", + "Lead time, average": "Vrijeme isporuke, prosjek", + "Tasks whose finish time was estimated from their history: {count}": "Zadaci čije je vrijeme završetka procijenjeno iz povijesti: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Vrijeme ciklusa svakog dovršenog zadatka, s prosjekom i 85. percentilom", + "Slowest tasks": "Najsporiji zadaci", + "cycle {cycle}, lead {lead}": "ciklus {cycle}, isporuka {lead}", + "{days} days": "{days} dana", + "Could not load the flow of this project.": "Tok ovog projekta nije moguće učitati.", + "Last {days} days": "Zadnjih {days} dana", + "Portfolio flow": "Tok portfelja", + "An admin adds portfolios under Projects, Portfolios.": "Administrator dodaje portfelje pod Projekti, Portfelji.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekti koji nisu prikazani jer se odjednom prikazuje najviše 50: {count}", + "Could not load the flow of this portfolio.": "Tok ovog portfelja nije moguće učitati.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativni tok i vrijeme ciklusa kroz projekte portfelja.", + "Edit report": "Uredi izvješće", + "Only tasks where": "Samo zadaci gdje", + "Group by": "Grupiraj po", + "Display": "Prikaz", + "Share with everyone who can read its projects": "Podijeli sa svima koji mogu čitati njegove projekte", + "The report could not be saved.": "Izvješće nije moguće spremiti.", + "Number of tasks": "Broj zadataka", + "Bar": "Stupci", + "Donut": "Prsten", + "Table": "Tablica", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} od {total} projekata u ovom izvješću nije vidljivo za vas", + "No tasks match this report.": "Nijedan zadatak ne odgovara ovom izvješću.", + "None": "Ništa", + "Could not load this report.": "Ovo izvješće nije moguće učitati.", + "Report": "Izvješće", + "Your reports": "Vaša izvješća", + "My reports": "Moja izvješća", + "Shared reports": "Dijeljena izvješća", + "You have not built a report yet.": "Još niste izradili izvješće.", + "Nobody has shared a report with you yet.": "Još nitko nije podijelio izvješće s vama.", + "Reports you built over tasks, and the ones shared with you.": "Izvješća koja ste izradili nad zadacima, i ona podijeljena s vama.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Spremljeni upit nad zadacima: koji projekti, koji filtri, grupirano po čemu, prebrojano ili zbrojeno, i prikazano kao tablica ili grafikon.", + "The name the report is listed under": "Naziv pod kojim je izvješće navedeno", + "What the report shows and who it is for": "Što izvješće prikazuje i kome je namijenjeno", + "Nextcloud user id of the person who saved the report": "Nextcloud ID korisnika koji je spremio izvješće", + "Who can open the report": "Tko može otvoriti izvješće", + "Only me": "Samo ja", + "Everyone who can read its projects": "Svi koji mogu čitati njegove projekte", + "The projects the report covers, at most fifty": "Projekti koje izvješće obuhvaća, najviše pedeset", + "Filters": "Filtri", + "Task fields and the value each must equal": "Polja zadatka i vrijednost kojoj svako mora biti jednako", + "The task field the report groups on": "Polje zadatka po kojem izvješće grupira", + "Count the tasks, or add up a number on them": "Prebroji zadatke ili zbroji broj na njima", + "Sum": "Zbroj", + "Sum of": "Zbroj polja", + "The number added up when the measure is a sum": "Broj koji se zbraja kad je mjera zbroj", + "Story points": "Bodovi priče", + "Estimated duration": "Procijenjeno trajanje", + "How the report is shown": "Kako se izvješće prikazuje", + "Issue type": "Vrsta zahtjeva", + "Task fields and the value each must equal; empty when the report covers every task": "Polja zadatka i vrijednost koju svako mora imati; prazno kad izvješće obuhvaća sve zadatke", + "The status a task must have": "Status koji zadatak mora imati", + "The priority a task must have": "Prioritet koji zadatak mora imati", + "The user a task must be assigned to": "Korisnik kojem zadatak mora biti dodijeljen", + "A label a task must carry": "Oznaka koju zadatak mora imati", + "The board column a task must be in": "Stupac ploče u kojem zadatak mora biti", + "The issue type a task must have": "Vrsta zahtjeva koju zadatak mora imati", + "Manager groups": "Grupe voditelja", + "Member groups": "Grupe članova", + "Viewer groups": "Grupe čitatelja", + "Viewers": "Čitatelji", + "Owning group": "Vlasnička grupa", + "Nextcloud groups whose members manage the project": "Nextcloud grupe čiji članovi vode projekt", + "Nextcloud groups whose members work on the project": "Nextcloud grupe čiji članovi rade na projektu", + "Nextcloud groups whose members may read the project": "Nextcloud grupe čiji članovi smiju čitati projekt", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud korisnici koji vode projekt: postavke, članove i rad", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud korisnici koji smiju čitati projekt i njegov rad, ali ga ne mijenjati", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud grupa koja posjeduje projekt zajedno s njegovim autorom, najviše jedna", + "Nextcloud user ids who may read this through the project": "Nextcloud korisnici koji ovo smiju čitati kroz projekt", + "Nextcloud groups whose members may change this through the project": "Nextcloud grupe čiji članovi ovo smiju mijenjati kroz projekt", + "Nextcloud groups whose members may read this through the project": "Nextcloud grupe čiji članovi ovo smiju čitati kroz projekt", + "Search for a person or a group…": "Traži osobu ili grupu…", + "No one found. Your admin's sharing settings decide who you can find.": "Nitko nije pronađen. Postavke dijeljenja vašeg administratora određuju koga možete pronaći.", + "Type at least two characters": "Unesite barem dva znaka", + "Everyone in this group": "Svi u ovoj grupi", + "Could not search for people. Please try again.": "Pretraživanje osoba nije uspjelo. Pokušajte ponovno.", + "Could not remove the group": "Grupu nije moguće ukloniti", + "Only the owner and managers change who is on this project.": "Samo vlasnik i upravitelji mijenjaju tko je na ovom projektu.", + "Role of {name}": "Uloga: {name}", + "Manager": "Upravitelj", + "Member": "Član", + "Viewer": "Čitatelj", + "Could not change the role": "Ulogu nije moguće promijeniti", + "Owned by group: {name}": "U vlasništvu grupe: {name}", + "No group owns this project.": "Nijedna grupa nije vlasnik ovog projekta.", + "Owned by group": "U vlasništvu grupe", + "Search for a group…": "Potraži grupu…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nije pronađena nijedna grupa. Postavke dijeljenja vašeg administratora određuju koje grupe možete pronaći.", + "No owning group": "Bez grupe vlasnika", + "Could not search for groups. Please try again.": "Pretraživanje grupa nije uspjelo. Pokušajte ponovno.", + "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", + "You can read this project. Only its members change it.": "Ovaj projekt možete čitati. Mijenjaju ga samo njegovi članovi.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet koji se predaje na ovom satu, na primjer izborni predmet, kad ga školska aplikacija za učenje poznaje.", + "Online meeting link": "Poveznica na online sat", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdje se učenici pridružuju ovom satu online. Gumb Pridruži se prikazuje se samo za https poveznicu." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hr.json b/l10n/hr.json index 237f7002..ad0ecaaa 100644 --- a/l10n/hr.json +++ b/l10n/hr.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktivni projekti", + "Archived projects": "Arhivirani projekti", + "Boards": "Ploče", + "My projects": "Moji projekti", + "Portfolio": "Portfelj", + "Project board": "Ploča projekta", + "Projects I am in": "Projekti u kojima sudjelujem", + "Timeline": "Vremenska crta", + "Timesheet": "Evidencija vremena", + "Features & roadmap": "Značajke i plan razvoja", + "Flow": "Tijek", + "Flows": "Tijekovi", + "Reports": "Izvješća", + "Pick a report to open it.": "Odaberite izvješće da ga otvorite.", + "In progress": "U tijeku", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodijeljeno", + "Who": "Tko", + "What": "Što", + "Minutes": "Minute", + "Entries": "Unosi", + "Most recent": "Najnovije", + "Per person": "Po osobi", + "By status": "Po statusu", + "By priority": "Po prioritetu", + "Task status": "Status zadatka", + "Time spent": "Utrošeno vrijeme", + "Capacity": "Kapacitet", + "Due soonest": "Najskorije dospijeva", + "Minutes logged": "Zabilježene minute", + "Nothing is due": "Ništa ne dospijeva", + "Nothing logged yet": "Još ništa nije zabilježeno", + "What is open, what is blocked, and what is overdue.": "Što je otvoreno, što blokirano i što kasni.", + "How allocation is spread across the people working on projects.": "Kako je opterećenje raspoređeno među ljudima na projektima.", + "Hours logged, and the projects they went to.": "Zabilježeni sati i projekti na koje su otišli.", + "Billable": "Naplativo", + "Budget: {amount}": "Proračun: {amount}", + "Loading projects": "Učitavanje projekata", + "No projects for this client yet": "Još nema projekata za ovog klijenta", + "Open in Planninq": "Otvori u Planninqu", + "This project could not be found": "Ovaj projekt nije pronađen", + "Untitled project": "Projekt bez naziva", + "and {count} more": "i još {count}", + "Store": "Trgovina", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instalirajte registre, sheme i tokove koje su objavile druge organizacije.", + "Work Date": "Datum rada", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Radnje stupca", + "Columns": "Stupci", + "Could not remove the column. Please try again.": "Stupac nije moguće ukloniti. Pokušajte ponovno.", + "Could not save the column. Please try again.": "Stupac nije moguće spremiti. Pokušajte ponovno.", + "Done column": "Stupac završenih", + "Edit column": "Uredi stupac", + "Keep the card's status": "Zadrži status kartice", + "Move its cards to": "Premjesti njegove kartice u", + "Move left": "Pomakni lijevo", + "Move right": "Pomakni desno", + "Status of cards moved here": "Status kartica premještenih ovdje", + "The last done column cannot be removed.": "Posljednji stupac završenih ne može se ukloniti.", + "WIP limit": "WIP ograničenje", + "over limit": "iznad ograničenja", + "The status a card gets when it is moved into this column.": "Status koji kartica dobiva kada se premjesti u ovaj stupac.", + "All priorities": "Svi prioriteti", + "Could not create the task. Please try again.": "Zadatak nije moguće stvoriti. Pokušajte ponovno.", + "Created": "Stvoreno", + "Move to backlog": "U zaostatak", + "Move to board": "Na ploču", + "New task": "Novi zadatak", + "Nothing in the backlog": "Ništa u zaostatku", + "Rank": "Rang", + "Sort by": "Poredaj po", + "Sort by rank to reorder": "Poredajte po rangu za promjenu redoslijeda", + "Task actions": "Radnje zadatka", + "All labels": "Sve oznake", + "Filter tasks by label": "Filtriraj zadatke po oznaci", + "View timeline": "Prikaži vremensku crtu", + "Board": "Ploča", + "List": "Popis", + "Column": "Stupac", + "Board or list": "Ploča ili popis", + "Log": "Dnevnik", + "Add entry": "Dodaj zapis", + "Show": "Prikaži", + "No actions yet": "Još nema radnji", + "Closed": "Zatvoreno", + "Entry actions": "Radnje zapisa", + "Add action": "Dodaj radnju", + "by {author}": "autor {author}", + "saved {time}": "spremljeno {time}", + "Attendees: {names}": "Prisutni: {names}", + "Add the first entry": "Dodaj prvi zapis", + "Issues": "Problemi", + "Lessons learned": "Naučene lekcije", + "Meetings": "Sastanci", + "Decisions": "Odluke", + "Actions": "Radnje", + "Issue": "Problem", + "Lesson learned": "Naučena lekcija", + "Meeting": "Sastanak", + "Decision": "Odluka", + "About this project": "O ovom projektu", + "No description yet": "Još nema opisa", + "Start date": "Datum početka", + "Not set": "Nije postavljeno", + "End date": "Datum završetka", + "Progress": "Napredak", + "No tasks yet": "Još nema zadataka", + "Open the board": "Otvori ploču", + "People": "Osobe", + "Owner": "Vlasnik", + "Latest log entries": "Najnoviji zapisi", + "Open the log": "Otvori dnevnik", + "{done} of {total} tasks done": "{done} od {total} zadataka gotovo", + "Edit entry": "Uredi zapis", + "Type": "Vrsta", + "Attendees": "Prisutni", + "Issue is closed": "Problem je zatvoren", + "Could not save the entry. Please try again.": "Zapis nije moguće spremiti. Pokušajte ponovno.", + "From: {title}": "Iz: {title}", + "What needs to happen": "Što treba učiniti", + "Could not create the action. Please try again.": "Radnju nije moguće stvoriti. Pokušajte ponovno.", + "The action was created but could not be linked to the entry.": "Radnja je stvorena, ali je nije moguće povezati sa zapisom.", + "Project pages": "Stranice projekta", + "Overview": "Pregled", + "Risks": "Rizici", + "Log entry": "Zapis dnevnika", + "A short name for the entry": "Kratak naziv zapisa", + "Project": "Projekt", + "The project this entry belongs to": "Projekt kojem ovaj zapis pripada", + "What kind of entry this is": "Koja je ovo vrsta zapisa", + "When it happened": "Kada se dogodilo", + "What happened, in Markdown": "Što se dogodilo, u Markdownu", + "Whether an issue is still open": "Je li problem još otvoren", + "The people at a meeting": "Osobe na sastanku", + "Tasks that came out of this entry": "Zadaci proizašli iz ovog zapisa", + "Add risk": "Dodaj rizik", + "Risk": "Rizik", + "Score": "Ocjena", + "Response": "Odgovor", + "Review date": "Datum pregleda", + "no longer on the project": "više nije na projektu", + "Edit {title}": "Uredi {title}", + "No risks recorded yet": "Još nema zabilježenih rizika", + "Add the first risk": "Dodaj prvi rizik", + "Medium": "Srednje", + "Mitigating": "Ublažava se", + "Occurred": "Nastupio", + "Avoid": "Izbjeći", + "Reduce": "Smanjiti", + "Transfer": "Prenijeti", + "Accept": "Prihvatiti", + "Highest open risks": "Najviši otvoreni rizici", + "No open risks": "Nema otvorenih rizika", + "Open the risk register": "Otvori registar rizika", + "Edit risk": "Uredi rizik", + "What could go wrong": "Što može poći po zlu", + "Likelihood": "Vjerojatnost", + "Impact": "Utjecaj", + "Score {score}": "Ocjena {score}", + "Countermeasures": "Protumjere", + "Could not save the risk. Please try again.": "Rizik nije moguće spremiti. Pokušajte ponovno.", + "Risks by likelihood and impact": "Rizici po vjerojatnosti i utjecaju", + "Risk scale": "Ljestvica rizika", + "The levels every project scores its risks on, and where low turns into medium and high": "Razine na kojima svaki projekt ocjenjuje rizike i gdje nisko prelazi u srednje i visoko", + "Number of levels": "Broj razina", + "Likelihood labels": "Oznake vjerojatnosti", + "Impact labels": "Oznake utjecaja", + "Level {level}": "Razina {level}", + "Medium from score": "Srednje od ocjene", + "High from score": "Visoko od ocjene", + "Risk scale saved": "Ljestvica rizika spremljena", + "1 risk uses level {level}. Change it first.": "1 rizik koristi razinu {level}. Najprije ga promijenite.", + "{count} risks use level {level}. Change them first.": "{count} rizika koristi razinu {level}. Najprije ih promijenite.", + "Every level needs a label, and high must start above medium.": "Svaka razina treba oznaku, a visoko mora početi iznad srednjeg.", + "The project this risk belongs to": "Projekt kojem ovaj rizik pripada", + "The cause and the effect, in Markdown": "Uzrok i posljedica, u Markdownu", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Slobodno grupiranje, npr. planiranje, proračun ili dobavljač", + "How likely it is, on the admin's risk scale": "Koliko je vjerojatno, na ljestvici rizika administratora", + "How hard it would hit, on the admin's risk scale": "Koliko bi snažno pogodilo, na ljestvici rizika administratora", + "Likelihood times impact, calculated by the server": "Vjerojatnost puta utjecaj, izračunao poslužitelj", + "Where the risk stands": "Gdje je rizik", + "The person who watches this risk": "Osoba koja prati ovaj rizik", + "How the project answers the risk": "Kako projekt odgovara na rizik", + "What is done to prevent it or soften it, in Markdown": "Što se čini da se spriječi ili ublaži, u Markdownu", + "When to look at this risk again": "Kada ponovno pregledati ovaj rizik", + "Very low": "Vrlo nisko", + "Very high": "Vrlo visoko", + "All projects": "Svi projekti", + "Project status report": "Izvješće o stanju projekta", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datirano izvješće o tome kako projekt stoji s novcem, organizacijom, vremenom, informacijama, kvalitetom i rizikom (GROTIK aspekti), svaki s bilješkom.", + "The project this report is about": "Projekt na koji se izvješće odnosi", + "Report date": "Datum izvješća", + "The day the report describes": "Dan koji izvješće opisuje", + "Money": "Novac", + "How the project stands on this aspect": "Kako projekt stoji u ovom aspektu", + "On track": "Prema planu", + "At risk": "Ugroženo", + "Off track": "Izvan plana", + "Money note": "Bilješka o novcu", + "A short explanation of this status": "Kratko objašnjenje ovog stanja", + "Organisation": "Organizacija", + "Organisation note": "Bilješka o organizaciji", + "Time": "Vrijeme", + "Time note": "Bilješka o vremenu", + "Information": "Informacije", + "Information note": "Bilješka o informacijama", + "Quality": "Kvaliteta", + "Quality note": "Bilješka o kvaliteti", + "Risk note": "Bilješka o riziku", + "Overall": "Ukupno", + "The worst of the six statuses, calculated by the server": "Najlošije od šest stanja, izračunava ga poslužitelj", + "Health: money": "Stanje: novac", + "Copied from the newest status report": "Preuzeto iz najnovijeg izvješća o stanju", + "Health: organisation": "Stanje: organizacija", + "Health: time": "Stanje: vrijeme", + "Health: information": "Stanje: informacije", + "Health: quality": "Stanje: kvaliteta", + "Health: risk": "Stanje: rizik", + "Health: overall": "Stanje: ukupno", + "Health: report date": "Stanje: datum izvješća", + "The date of the newest status report": "Datum najnovijeg izvješća o stanju", + "New report": "Novo izvješće", + "Only the project owner writes status reports.": "Izvješća o stanju piše samo vlasnik projekta.", + "Latest report, {date}": "Posljednje izvješće, {date}", + "Aspect": "Aspekt", + "Note": "Bilješka", + "Report history": "Povijest izvješća", + "Author": "Autor", + "No status reports yet": "Još nema izvješća o stanju", + "Write the first report": "Napiši prvo izvješće", + "Choose a status for every aspect to save the report.": "Za spremanje izvješća odaberite stanje za svaki aspekt.", + "Suggested: on track.": "Prijedlog: prema planu.", + "Suggested: at risk.": "Prijedlog: ugroženo.", + "Suggested: off track.": "Prijedlog: izvan plana.", + "1 task is past its due date.": "1 zadatak je prekoračio rok.", + "{count} tasks are past their due date.": "Zadaci koji su prekoračili rok: {count}.", + "The end date has passed with 1 open task.": "Datum završetka je prošao s 1 otvorenim zadatkom.", + "The end date has passed with {count} open tasks.": "Datum završetka je prošao, otvoreni zadaci: {count}.", + "No open task is past its due date.": "Nijedan otvoreni zadatak nije prekoračio rok.", + "The highest open risk, \"{title}\", scores {score}.": "Najveći otvoreni rizik, \"{title}\", ima ocjenu {score}.", + "There are no open risks.": "Nema otvorenih rizika.", + "Costs are at {percent}% of the budget.": "Troškovi su na {percent}% proračuna.", + "No suggestion: the project has no budget.": "Nema prijedloga: projekt nema proračun.", + "No suggestion: no costs are recorded for this project yet.": "Nema prijedloga: za ovaj projekt još nisu zabilježeni troškovi.", + "The report was not saved. Only the project owner can write status reports.": "Izvješće nije spremljeno. Izvješća o stanju može pisati samo vlasnik projekta.", + "No report": "Nema izvješća", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Skupina projekata koje vode isti ljudi, na primjer odjel ili program. Njezini voditelji čitaju svaki projekt u njoj.", + "The name of the portfolio": "Naziv portfelja", + "What the portfolio holds and who runs it": "Što portfelj sadrži i tko ga vodi", + "A colour for the portfolio's section in project lists": "Boja odjeljka portfelja u popisima projekata", + "Managers": "Voditelji", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud korisnički ID-ovi ljudi koji vode portfelj", + "Order": "Redoslijed", + "Where the portfolio comes in project lists, lowest first": "Gdje je portfelj u popisima projekata, najniži prvi", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Vlastita ljestvica rizika ovog portfelja kao JSON, u istom obliku kao ljestvica cijele aplikacije. Prazno znači ljestvicu aplikacije.", + "Portfolio readers": "Čitatelji portfelja", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud korisnički ID-ovi voditelja portfelja projekta", + "The portfolio this project belongs to": "Portfelj kojem ovaj projekt pripada", + "No portfolio": "Bez portfelja", + "All portfolios": "Svi portfelji", + "You read this project as a manager of its portfolio. Only its members change it.": "Ovaj projekt čitate kao voditelj njegova portfelja. Mijenjaju ga samo njegovi članovi.", + "Portfolios": "Portfelji", + "Portfolio status": "Stanje portfelja", + "No portfolios yet": "Još nema portfelja", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administrator dodaje portfelje u Projekti, Portfelji. Projekti u portfelju ovdje su navedeni sa svojim stanjem.", + "Roll-up": "Sažetak", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} prema planu, {atRisk} ugroženo, {offTrack} izvan plana, {noReport} bez izvješća", + "No project in this portfolio that you can read.": "U ovom portfelju nema projekta koji možete čitati.", + "Start": "Početak", + "End": "Kraj", + "Budget": "Proračun", + "Last report": "Zadnje izvješće", + "Out of date": "Zastarjelo", + "Portfolio timeline": "Vremenska crta portfelja", + "Zoom": "Zumiranje", + "Could not load the timeline": "Vremensku crtu nije moguće učitati", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administrator dodaje portfelje u Projekti, Portfelji. Projekti u portfelju ovdje su na jednoj vremenskoj crti.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Otvorite projekt da biste vidjeli njegove faze i zadatke. Vremenska crta je samo za čitanje.", + "Phase: {title}": "Faza: {title}", + "Left out because you cannot read them: {count} projects": "Izostavljeno jer ih ne možete čitati: {count} projekata", + "Week": "Tjedan", + "Day": "Dan", + "Month": "Mjesec", + "Please try again later.": "Pokušajte ponovno kasnije.", + "Status reports": "Izvješća o stanju", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Nakon koliko dana se zadnje izvješće o stanju projekta u pregledu portfelja označava kao zastarjelo", + "Reporting period (days)": "Razdoblje izvještavanja (dani)", + "The reporting period is a whole number of days from 1 to 365.": "Razdoblje izvještavanja je cijeli broj dana od 1 do 365.", + "Reporting period saved": "Razdoblje izvještavanja spremljeno", + "The reporting period was not saved. Please try again.": "Razdoblje izvještavanja nije spremljeno. Pokušajte ponovno.", + "Every project of a portfolio with its status per aspect, rolled up.": "Svaki projekt portfelja sa stanjem po aspektima, sažeto.", + "The projects of a portfolio on one timeline.": "Projekti portfelja na jednoj vremenskoj crti.", + "Phases": "Faze", + "Add phase": "Dodaj fazu", + "No phases yet": "Još nema faza", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Podijelite projekt u faze, primjerice pokretanje, definiciju i provedbu. Faza se zatvara kad se učita njezin završni dokument.", + "{hours} hours": "{hours} sati", + "Concluding document: {title}": "Završni dokument: {title}", + "Concluding document missing": "Nedostaje završni dokument", + "Move {title} up": "Pomakni {title} gore", + "Move {title} down": "Pomakni {title} dolje", + "Close phase": "Zatvori fazu", + "Phase": "Faza", + "Files": "Datoteke", + "Notes": "Bilješke", + "Audit trail": "Revizijski trag", + "Edit phase": "Uredi fazu", + "Name": "Naziv", + "Budget hours": "Planirani sati", + "Could not save the phase. Please try again.": "Fazu nije moguće spremiti. Pokušajte ponovno.", + "Close phase {title}": "Zatvori fazu {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Faza se zatvara završnim dokumentom: učitajte ga ovdje ili odaberite jednu od datoteka faze.", + "Concluding document": "Završni dokument", + "This phase has no files yet.": "Ova faza još nema datoteka.", + "Upload a document": "Učitaj dokument", + "The document was not uploaded. Please try again.": "Dokument nije učitan. Pokušajte ponovno.", + "Upload the concluding document before you close this phase.": "Učitajte završni dokument prije zatvaranja ove faze.", + "This phase cannot be closed from its current status.": "Ova se faza ne može zatvoriti iz trenutnog stanja.", + "The phase was not closed. Please try again.": "Faza nije zatvorena. Pokušajte ponovno.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID datoteke ove faze koja je zatvara. Faza se može dovršiti tek kad je postavljen i datoteka je priložena.", + "Import from Microsoft Project": "Uvezi iz Microsoft Projecta", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Odaberite plan spremljen iz Microsoft Projecta u XML formatu. Ništa se ne uvozi dok ne potvrdite.", + "Plan file": "Datoteka plana", + "What the import creates": "Što uvoz stvara", + "Tasks": "Zadaci", + "Sub-tasks": "Podzadaci", + "Milestones": "Prekretnice", + "Links": "Veze", + "Already imported, updated in place: {count}": "Već uvezeno, ažurirano na mjestu: {count}", + "What does not carry over": "Što se ne prenosi", + "Tasks with resources, which are not imported: {count}": "Zadaci s resursima, koji se ne uvoze: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Zadaci dublje od razine 3, smješteni pod svoj zadatak razine 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Veze osim kraj-početak, uvezene kao povezane veze: {count}", + "Link lags, which are dropped: {count}": "Kašnjenja veza, koja se odbacuju: {count}", + "Links to a summary task, which are not imported: {count}": "Veze prema zbirnom zadatku, koje se ne uvoze: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Veze prema zadacima izvan ovog plana, koje se ne uvoze: {count}", + "No longer in the plan": "Više nije u planu", + "These stay in the project; remove them yourself if they are no longer needed.": "Ostaju u projektu; uklonite ih sami ako više nisu potrebni.", + "Import": "Uvezi", + "Close": "Zatvori", + "The plan is imported: {created} created, {updated} updated.": "Plan je uvezen: stvoreno {created}, ažurirano {updated}.", + "Links that would close a loop were left out: {count}": "Veze koje bi zatvorile petlju izostavljene su: {count}", + "The import stopped part-way. Run it again to finish it.": "Uvoz se zaustavio na pola puta. Pokrenite ga ponovno da ga dovršite.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Spremite plan u Microsoft Projectu putem Datoteka, Spremi kao, XML format, i uvezite tu datoteku.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ova datoteka deklarira DOCTYPE ili entitete, koji se ne prihvaćaju.", + "The file is larger than 10 MB.": "Datoteka je veća od 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plan ima više od 2.000 zadataka, više nego što jedan uvoz prima.", + "This file is not a Microsoft Project plan in XML format.": "Ova datoteka nije plan Microsoft Projecta u XML formatu.", + "Choose a file to import.": "Odaberite datoteku za uvoz.", + "Only the project owner can import a plan.": "Samo vlasnik projekta može uvesti plan.", + "The plan could not be read. Please try again.": "Plan nije moguće pročitati. Pokušajte ponovno.", + "Linked case: {title}": "Povezani predmet: {title}", + "Linked to a case": "Povezano s predmetom", + "Hand over to case": "Predaj predmetu", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Nepromijenjeno kopira svaku datoteku projekta i njegovih zadataka te datoteku koja opisuje projekt u povezani predmet.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopirane datoteke: {count}", + "Files that failed: {names}": "Neuspjele datoteke: {names}", + "The handover failed. Please try again.": "Predaja nije uspjela. Pokušajte ponovno.", + "The linked case could not be found, or you cannot open it.": "Povezani predmet nije pronađen ili ga ne možete otvoriti.", + "Case handovers": "Predaje predmetu", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Svaka predaja datoteka i metapodataka projekta njegovu predmetu: kada, tko, kojem predmetu, svaka kopirana datoteka s njezinim SHA-256 i neuspjele datoteke.", + "Finance": "Financije", + "Add cost line": "Dodaj stavku troška", + "Delivery terms": "Uvjeti isporuke", + "Billing model": "Model naplate", + "Budget in euro": "Proračun u eurima", + "Budget in hours": "Proračun u satima", + "Hourly rate in euro": "Satnica u eurima", + "Planned start": "Planirani početak", + "Planned end": "Planirani završetak", + "Planned dates": "Planirani datumi", + "Budget {amount}": "Proračun {amount}", + "No budget agreed": "Proračun nije dogovoren", + "Hours": "Sati", + "Only the project owner and the portfolio managers see the amounts.": "Iznose vide samo vlasnik projekta i upravitelji portfelja.", + "Budget against cost per category": "Proračun naspram troškova po kategoriji", + "Labour (booked time)": "Rad (evidentirani sati)", + "No category": "Bez kategorije", + "Hours are not available": "Sati nisu dostupni", + "Not yet assigned to a category": "Još nije dodijeljeno kategoriji", + "Total": "Ukupno", + "{spent} spent, {remaining} remaining": "{spent} potrošeno, {remaining} preostalo", + "Budget against cost per phase": "Proračun naspram troškova po fazi", + "No phase": "Bez faze", + "Cost lines": "Stavke troška", + "From the finance system": "Iz financijskog sustava", + "Edit cost line {amount}": "Uredi stavku troška {amount}", + "No cost lines yet": "Još nema stavki troška", + "Commitments": "Obveze", + "Actual cost": "Stvarni trošak", + "Forecast": "Prognoza", + "Remaining": "Preostalo", + "Not planned yet": "Još nije planirano", + "{start} to {end}": "{start} do {end}", + "The terms were not saved. Please try again.": "Uvjeti nisu spremljeni. Pokušajte ponovno.", + "Terms saved": "Uvjeti spremljeni", + "Fixed price": "Fiksna cijena", + "Hourly": "Po satu", + "Not billed": "Ne naplaćuje se", + "Commitment": "Obveza", + "Edit cost line": "Uredi stavku troška", + "Kind": "Vrsta", + "Amount in euro": "Iznos u eurima", + "Remove": "Ukloni", + "Could not save the cost line. Only the project owner changes the money of a project.": "Stavku troška nije moguće spremiti. Novac projekta mijenja samo vlasnik projekta.", + "Could not remove the cost line. Please try again.": "Stavku troška nije moguće ukloniti. Pokušajte ponovno.", + "{amount} over budget": "{amount} iznad proračuna", + "Cost categories": "Kategorije troškova", + "The categories every project splits its budget and costs into, one per line": "Kategorije na koje svaki projekt dijeli svoj proračun i troškove, jedna po retku", + "Categories": "Kategorije", + "Give at least one category, each name once.": "Navedite barem jednu kategoriju, svaki naziv jednom.", + "Cost categories saved": "Kategorije troškova spremljene", + "The cost categories were not saved. Please try again.": "Kategorije troškova nisu spremljene. Pokušajte ponovno.", + "Finance line": "Financijska stavka", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Jedan novčani iznos projekta: proračun, obveza, stvarni trošak ili prognoza, u kategoriji troškova i po želji u fazi. Unosi je vlasnik projekta ili je šalje financijski sustav putem aplikacije za integraciju.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt kojem iznos pripada. Prazno za stavku iz financijskog sustava čiji broj projekta ne odgovara nijednom projektu.", + "The phase this amount belongs to, if any": "Faza kojoj iznos pripada, ako postoji", + "The cost category, one of the categories the admin set up": "Kategorija troškova, jedna od kategorija koje je postavio administrator", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Je li iznos proračun, obveza, stvarni trošak ili prognoza", + "Amount": "Iznos", + "The amount in the reporting currency (euro)": "Iznos u izvještajnoj valuti (euro)", + "The date the amount was booked or is expected": "Datum kada je iznos knjižen ili se očekuje", + "What the amount is for": "Za što je iznos", + "Whether a person entered the line or the finance system sent it": "Je li stavku unijela osoba ili ju je poslao financijski sustav", + "Entered by hand": "Uneseno ručno", + "Finance line id": "Id financijske stavke", + "The finance system's own id of this line. One imported line per id.": "Vlastiti id ove stavke u financijskom sustavu. Jedna uvezena stavka po id-u.", + "Project number": "Broj projekta", + "The project number the finance system sent, matched against the project key": "Broj projekta koji je poslao financijski sustav, uspoređen s ključem projekta", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfelj projekta stavke, preuzet s projekta da bi zbrojevi portfelja trebali jedan filtar", + "Finance readers": "Čitatelji financija", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-ovi korisnika Nextclouda koji smiju vidjeti ovaj iznos: vlasnik projekta i upravitelji njegova portfelja", + "Project owner": "Vlasnik projekta", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID korisnika Nextclouda vlasnika projekta, koji smije mijenjati i uklanjati ručne stavke", + "How the client pays: not billed, a fixed price, or by the hour.": "Kako klijent plaća: ne naplaćuje se, fiksna cijena ili po satu.", + "Portfolio finance": "Financije portfelja", + "You cannot see the money of any project in this portfolio": "Ne možete vidjeti novac nijednog projekta u ovom portfelju", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Poslužitelj je vratio stavke troška projekata izvan ovog portfelja, pa ovi zbrojevi mogu biti pogrešni.", + "Projects left out because you cannot see their money: {count}": "Izostavljeni projekti jer ne možete vidjeti njihov novac: {count}", + "Unmatched finance lines": "Nepovezane financijske stavke", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Proračun, obveze, stvarni trošak i prognoza zbrojeni za portfelj.", + "Subprojects": "Potprojekti", + "{done} of {total}": "{done} od {total}", + "{done} of {total} tasks done, including subprojects": "{done} od {total} zadataka gotovo, uključujući potprojekte", + "Show the subprojects of {title}": "Prikaži potprojekte {title}", + "Hide the subprojects of {title}": "Sakrij potprojekte {title}", + "Part of": "Dio", + "No parent project": "Bez nadređenog projekta", + "A project cannot sit under one of its own subprojects.": "Projekt ne može biti ispod jednog od svojih potprojekata.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekti se ugnježđuju najviše tri razine duboko: program, projekt i potprojekt.", + "Parent project": "Nadređeni projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt ispod kojeg je ovaj projekt, npr. program. Projekti se ugnježđuju najviše tri razine duboko.", + "Yes": "Da", + "No": "Ne", + "{label} (required)": "{label} (obavezno)", + "{label} is required": "{label} je obavezno", + "Project field": "Polje projekta", + "A field an admin adds to every project, such as a policy area or a contract value.": "Polje koje administrator dodaje svakom projektu, npr. područje politike ili vrijednost ugovora.", + "Key": "Ključ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stalni naziv pod kojim se vrijednost sprema, u lower camel case. Zadržite ga kad ga projekti koriste.", + "Label": "Oznaka", + "The name people see next to the field": "Naziv koji ljudi vide pokraj polja", + "What the field holds": "Što polje sadrži", + "Text": "Tekst", + "Number": "Broj", + "Choice": "Izbor", + "Person": "Osoba", + "Yes or no": "Da ili ne", + "Options": "Mogućnosti", + "The choices of a choice field": "Mogućnosti polja izbora", + "Required": "Obavezno", + "Whether a project must fill in the field": "Mora li projekt ispuniti polje", + "Where the field appears, lowest first": "Gdje se polje pojavljuje, najniže prvo", + "Applies to": "Vrijedi za", + "What the field is added to": "Čemu se polje dodaje", + "Custom fields": "Vlastita polja", + "The values of the project fields an admin defined, keyed by the field's key.": "Vrijednosti polja projekta koja je definirao administrator, prema ključu polja.", + "Project fields": "Polja projekta", + "Related": "Povezano", + "Remove link": "Ukloni poveznicu", + "Link type": "Vrsta poveznice", + "Relates to": "Povezano s", + "Duplicates": "Duplicira", + "Project key": "Ključ projekta", + "Every task number starts with it, such as VERG-42.": "Svaki broj zadatka počinje njime, na primjer VERG-42.", + "This key is already used by another project.": "Ovaj ključ već koristi drugi projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Koristite od 2 do 10 slova i znamenki, počevši slovom.", + "The key cannot change once tasks carry it.": "Ključ se ne može promijeniti kad ga zadaci nose.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt je spremljen. Postojeći zadaci dobivaju brojeve u pozadini.", + "Next task number": "Broj sljedećeg zadatka", + "The number the next task of this project gets in its key. Only the system writes it.": "Broj koji sljedeći zadatak ovog projekta dobiva u svom ključu. Upisuje ga samo sustav.", + "Restore {title}": "Vrati {title}", + "Restore": "Vrati", + "Project restored": "Projekt je vraćen", + "Could not restore the project": "Projekt nije moguće vratiti", + "Bring this project back to the active list.": "Vrati ovaj projekt na popis aktivnih projekata.", + "Restore project": "Vrati projekt", + "Request reason": "Razlog zahtjeva", + "Why the requester needs this project. Filled in when the project is requested.": "Zašto podnositelju treba ovaj projekt. Ispunjava se pri zahtjevu.", + "Reviewed by": "Pregledao", + "The user who approved or rejected the request.": "Korisnik koji je odobrio ili odbio zahtjev.", + "Reviewed at": "Pregledano", + "When the request was approved or rejected.": "Kada je zahtjev odobren ili odbijen.", + "Review note": "Napomena pregledavatelja", + "The reviewer's reason, shown to the requester when a request is not approved.": "Razlog pregledavatelja koji podnositelj vidi kad zahtjev nije odobren.", + "Members of these groups": "Članovi ovih grupa", + "Groups that may create projects": "Grupe koje smiju stvarati projekte", + "The group {group} no longer exists. Save to remove it.": "Grupa {group} više ne postoji. Spremite da biste je uklonili.", + "Review project request": "Pregledaj zahtjev za projekt", + "Requested by": "Zatražio", + "Why it is needed": "Zašto je potreban", + "Desired start date": "Željeni datum početka", + "Why is it not approved?": "Zašto nije odobren?", + "Give a reason. The requester sees it.": "Navedite razlog. Podnositelj će ga vidjeti.", + "Approve": "Odobri", + "Reject": "Odbij", + "Reject request": "Odbij zahtjev", + "The review was not saved. Try again.": "Pregled nije spremljen. Pokušajte ponovno.", + "This project is waiting for review": "Ovaj projekt čeka pregled", + "This request was not approved": "Ovaj zahtjev nije odobren", + "Reason: {note}": "Razlog: {note}", + "Review request": "Pregledaj zahtjev", + "Request a project": "Zatraži projekt", + "Step {step} of 2": "Korak {step} od 2", + "Why is this project needed?": "Zašto je ovaj projekt potreban?", + "Give a reason. The reviewer reads it.": "Navedite razlog. Pregledavatelj će ga pročitati.", + "Back": "Natrag", + "Next": "Dalje", + "Send request": "Pošalji zahtjev", + "The request was not sent. Try again.": "Zahtjev nije poslan. Pokušajte ponovno.", + "Requested": "Zatraženo", + "Not approved": "Nije odobreno", + "Your request was sent": "Vaš zahtjev je poslan", + "Let everyone else request a project": "Dopusti svima ostalima da zatraže projekt", + "Add a task": "Dodaj zadatak", + "Delete task": "Izbriši zadatak", + "Edit task": "Uredi zadatak", + "Write": "Piši", + "Preview": "Pregled", + "Markdown works here: headings, lists and links.": "Ovdje radi Markdown: naslovi, popisi i poveznice.", + "Could not save the task. Please try again.": "Zadatak nije moguće spremiti. Pokušajte ponovno.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Na zadatku \"{title}\" evidentirano je vrijeme pa se ne može izbrisati. Umjesto toga možete ga otkazati: zapisi vremena ostaju.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Izbrisati \"{title}\"? Uklonit će se i njegove veze s drugim zadacima. Ovo se ne može poništiti.", + "Keep task": "Zadrži zadatak", + "Cancel task": "Otkaži zadatak", + "Only the reporter, the project owner or an admin can delete this task.": "Ovaj zadatak može izbrisati samo prijavitelj, vlasnik projekta ili administrator.", + "Could not delete the task. Please try again.": "Zadatak nije moguće izbrisati. Pokušajte ponovno.", + "Could not cancel the task. Please try again.": "Zadatak nije moguće otkazati. Pokušajte ponovno.", + "Responsible": "Odgovorna osoba", + "Also working on this": "Na ovome rade i", + "Labels": "Oznake", + "Could not change the priority. Please try again.": "Prioritet nije moguće promijeniti. Pokušajte ponovno.", + "Other project members who work on this task alongside the person responsible.": "Ostali članovi projekta koji na ovom zadatku rade zajedno s odgovornom osobom.", + "Duplicate": "Dupliciraj", + "Could not copy the task. Please try again.": "Zadatak nije moguće kopirati. Pokušajte ponovno.", + "Subtasks": "Podzadaci", + "{done} of {total} done": "Gotovo {done} od {total}", + "Add a subtask": "Dodaj podzadatak", + "Checklist": "Kontrolni popis", + "Checklist item actions": "Radnje stavke popisa", + "Add a checklist item": "Dodaj stavku popisa", + "Subtasks: {estimate} estimated, {logged} logged": "Podzadaci: procjena {estimate}, evidentirano {logged}", + "Total estimate: {total}": "Ukupna procjena: {total}", + "Part of {title}": "Dio zadatka {title}", + "Checklist: {count} done": "Kontrolni popis: gotovo {count}", + "This task has subtasks: {count}.": "Ovaj zadatak ima podzadatke: {count}.", + "Keep subtasks as separate tasks": "Zadrži podzadatke kao zasebne zadatke", + "Delete subtasks too": "Izbriši i podzadatke", + "Copy of {title}": "Kopija: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Zadatak je kopiran, ali ne i svi njegovi podzadaci. Provjerite kopiju.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Mali koraci unutar zadatka. Svaka stavka ima id, tekst i podatak je li gotova.", + "Open work per person and per project.": "Otvoreni posao po osobi i po projektu.", + "View": "Prikaz", + "By person": "Po osobi", + "By project": "Po projektu", + "Hours left": "Preostali sati", + "Tasks without an estimate": "Zadaci bez procjene", + "Due in 14 days": "Rok u 14 dana", + "Shared": "Dijeljeno", + "Unassigned": "Nedodijeljeno", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Prikazuje se posao u projektima koje možete vidjeti. Sati se računaju odgovornoj osobi; dijeljeni zadaci računaju se bez sati.", + "No open work in these projects.": "Nema otvorenog posla u ovim projektima.", + "Open work": "Otvoreni posao", + "{count} open tasks": "{count} otvorenih zadataka", + "Create a project to see capacity here.": "Izradite projekt da biste ovdje vidjeli kapacitet.", + "My tasks": "Moji zadaci", + "Show all my tasks": "Prikaži sve moje zadatke", + "No tasks assigned to you": "Nemate dodijeljenih zadataka", + "Browse projects": "Pregledaj projekte", + "Later": "Kasnije", + "Due {date}": "Rok {date}", + "Could not change the status. Please try again.": "Status nije moguće promijeniti. Pokušajte ponovno.", + "Completed today": "Dovršeno danas", + "My open tasks": "Moji otvoreni zadaci", + "My overdue tasks": "Moji zakašnjeli zadaci", + "My tasks in progress": "Moji zadaci u tijeku", + "Pin to the top": "Prikvači na vrh", + "Unpin": "Otkvači", + "Pinned": "Prikvačeno", + "Actions for {title}": "Radnje za {title}", + "Could not save your project order. Please try again.": "Redoslijed projekata nije moguće spremiti. Pokušajte ponovno.", + "No boards yet": "Još nema ploča", + "Create a project to get a board.": "Izradite projekt da biste dobili ploču.", + "Use the Projects page to create and manage your projects and tasks.": "Na stranici Projekti izrađujte i upravljajte svojim projektima i zadacima.", + "Go to projects": "Idi na projekte", + "You are not a member of any projects yet.": "Još niste član nijednog projekta.", + "Could not search for users. Please try again.": "Pretraživanje korisnika nije uspjelo. Pokušajte ponovno.", + "Project creation is restricted to administrators.": "Projekte mogu izrađivati samo administratori.", + "Only the project owner or an administrator can delete this project.": "Ovaj projekt može izbrisati samo vlasnik projekta ili administrator.", + "No projects are available to you yet. Ask an administrator to create one.": "Još nemate dostupnih projekata. Zamolite administratora da izradi jedan.", + "Due: {date}": "Rok: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Zadaci s datumom početka ili rokom prikazuju se na vremenskoj crti. Dodajte datume da biste ih ovdje vidjeli.", + "You do not have access to this project.": "Nemate pristup ovom projektu.", + "Zoom level": "Razina zumiranja", + "Unscheduled": "Neplanirano", + "Start: {date}": "Početak: {date}", + "Today": "Danas", + "No scheduled tasks": "Nema planiranih zadataka", + "An unexpected error occurred.": "Došlo je do neočekivane pogreške.", + "Column {number} name": "Naziv stupca {number}", + "Failed to save creation policy": "Pravilo izrade nije moguće spremiti", + "All authenticated users": "Svi prijavljeni korisnici", + "Control who may create new projects": "Odredite tko smije izrađivati nove projekte", + "Administrators only": "Samo administratori", + "Project creation": "Izrada projekata", + "Allow project creation": "Dopusti izradu projekata", + "Creation policy saved successfully": "Pravilo izrade spremljeno", + "Initializing…": "Pokretanje…", + "e.g. 2h 30m, 90m, 1.5h": "npr. 2h 30m, 90m, 1.5h", + "Log time": "Upiši vrijeme", + "Save estimate": "Spremi procjenu", + "Logged: {logged}": "Upisano: {logged}", + "over by {amount}": "prekoračeno za {amount}", + "Time tracking": "Evidencija vremena", + "Estimate": "Procjena", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Unesite valjanu procjenu (npr. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Unesite valjano trajanje (npr. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Unos vremena nije moguće spremiti. Pokušajte ponovno.", + "Edit time entry": "Uredi unos vremena", + "Duration": "Trajanje", + "Date range": "Razdoblje", + "Last week": "Prošli tjedan", + "No time logged": "Nema upisanog vremena", + "Log time on a task to see it here.": "Upišite vrijeme na zadatak da biste ga ovdje vidjeli.", + "To date": "Do datuma", + "This week": "Ovaj tjedan", + "Total: {total}": "Ukupno: {total}", + "From date": "Od datuma", + "Custom range": "Prilagođeno razdoblje", + "All time": "Cijelo vrijeme", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Zadatak nije moguće izbrisati pa podaci mogu ostati. Ponovno izbrišite projekt.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Unos vremena nije moguće izbrisati pa podaci mogu ostati. Ponovno izbrišite projekt.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Stupac nije moguće izbrisati pa podaci mogu ostati. Ponovno izbrišite projekt.", + "Could not delete the project. Please try again.": "Projekt nije moguće izbrisati. Pokušajte ponovno.", + "Notification settings": "Postavke obavijesti", + "Configure when due-date reminders are sent": "Odredite kada se šalju podsjetnici na rokove", + "Due-date reminder lead time (hours)": "Vrijeme podsjetnika prije roka (sati)", + "Lead time must be between 1 and 336 hours": "Vrijeme mora biti između 1 i 336 sati", + "Reminder lead time saved successfully": "Vrijeme podsjetnika spremljeno", + "Failed to save reminder lead time": "Vrijeme podsjetnika nije moguće spremiti", + "Notifications": "Obavijesti", + "Notify me 1 day before a task's due date": "Obavijesti me 1 dan prije roka zadatka", + "Draft": "Nacrt", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Je li sat nacrt koji vidi samo njegov nastavnik, održava li se ili je otkazan.", + "New release": "Novo izdanje", + "Roadmap chart. The same releases and epics are listed below.": "Grafikon plana razvoja. Ista izdanja i epovi navedeni su ispod.", + "Nothing on the roadmap yet": "Još ništa na planu razvoja", + "Releases with a target date and epics with dated tasks appear here.": "Ovdje se prikazuju izdanja s ciljnim datumom i epovi sa zadacima koji imaju datum.", + "Releases": "Izdanja", + "No releases yet": "Još nema izdanja", + "Target date: {date}": "Ciljni datum: {date}", + "No target date": "Nema ciljnog datuma", + "Edit {name}": "Uredi {name}", + "Mark {name} as released": "Označi {name} kao objavljeno", + "Mark as released": "Označi kao objavljeno", + "Epics": "Epovi", + "No epics yet. Open a task to make it an epic.": "Još nema epova. Otvorite zadatak da biste ga pretvorili u ep.", + "Not scheduled yet": "Još nije zakazano", + "Planned": "Planirano", + "Released": "Objavljeno", + "Edit release": "Uredi izdanje", + "Target date": "Ciljni datum", + "Could not save the release. Please try again.": "Izdanje nije moguće spremiti. Pokušajte ponovno.", + "Every task of this release is done or cancelled.": "Svaki zadatak ovog izdanja je dovršen ili otkazan.", + "Not finished yet: {count}": "Još nije dovršeno: {count}", + "What happens to these tasks?": "Što se događa s ovim zadacima?", + "Move to {name}": "Premjesti u {name}", + "Remove the release": "Ukloni izdanje", + "Keep it on {name}": "Ostavi ih na {name}", + "Could not mark the release as released. Please try again.": "Izdanje nije moguće označiti kao objavljeno. Pokušajte ponovno.", + "Roadmap": "Plan razvoja", + "Tasks or roadmap": "Zadaci ili plan razvoja", + "Release": "Izdanje", + "Epic": "Ep", + "This task is an epic": "Ovaj zadatak je ep", + "A named, dated delivery of a project that its tasks are planned against.": "Imenovana isporuka projekta s datumom prema kojoj se planiraju njegovi zadaci.", + "Name of the release": "Naziv izdanja", + "The project this release belongs to": "Projekt kojem pripada ovo izdanje", + "What this release delivers": "Što ovo izdanje isporučuje", + "When work on the release starts": "Kada počinje rad na izdanju", + "The date the release is due": "Datum do kojeg izdanje treba biti gotovo", + "Whether the release is planned, released or archived": "Je li izdanje planirano, objavljeno ili arhivirano", + "Released on": "Objavljeno", + "When the release was marked as released": "Kada je izdanje označeno kao objavljeno", + "The release this task is planned for": "Izdanje za koje je ovaj zadatak planiran", + "Board view options": "Mogućnosti prikaza ploče", + "Colour cards": "Oboji kartice", + "No colour": "Bez boje", + "By label": "Po oznaci", + "Swimlanes": "Plivaće staze", + "No swimlanes": "Bez plivaćih staza", + "By assignee": "Po dodijeljenoj osobi", + "By epic": "Po epicu", + "No assignee": "Nije dodijeljeno", + "No epic": "Bez epica", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartice ostaju u retku svog epica. Promijenite epic na stranici zadatka.", + "Hand over to": "Predaj osobi", + "Could not save your board view. It applies until you reload.": "Prikaz ploče nije spremljen. Vrijedi dok ne učitate stranicu ponovno.", + "Timetable wish": "Želja za raspored", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Želja koju generator uzima u obzir. Tvrdu želju uvijek poštuje, meku gdje može.", + "Whether the wish is about a teacher, a group, a room or one activity": "Odnosi li se želja na nastavnika, skupinu, prostoriju ili jednu aktivnost", + "Teacher": "Nastavnik", + "Group": "Skupina", + "Reference": "Poveznica", + "The user, group, room or activity the wish is about": "Korisnik, skupina, prostorija ili aktivnost na koju se želja odnosi", + "What the wish asks for": "Što želja traži", + "Not on these periods": "Ne u ovim satima", + "Preferably not on these periods": "Radije ne u ovim satima", + "At most a number of lessons a day": "Najviše određen broj sati dnevno", + "No free periods between lessons": "Bez rupa između sati", + "Always the same room": "Uvijek ista prostorija", + "Periods": "Sati", + "The periods of the week the wish is about, such as wed-5": "Sati u tjednu na koje se želja odnosi, npr. wed-5", + "Limit": "Granica", + "The most lessons a day, for a wish of that kind": "Najviše sati dnevno, za želju te vrste", + "Strength": "Snaga", + "Whether the generator must keep the wish or should keep it": "Mora li ili bi li generator trebao poštovati želju", + "Hard": "Tvrda", + "Soft": "Meka", + "Weight": "Težina", + "How much a soft wish counts, from 1 to 3": "Koliko meka želja vrijedi, od 1 do 3", + "Why the wish exists": "Zašto želja postoji", + "Timetable scenario": "Scenarij rasporeda", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jedan tjedni obrazac, koji je napravio generator ili je preuzet iz trenutnog rasporeda. Čuva svoj ulaz i koliko dobro poštuje želje.", + "The name timetablers know the scenario by": "Naziv pod kojim sastavljači rasporeda znaju scenarij", + "Whether the generator made it or it came from the current timetable": "Je li ga napravio generator ili dolazi iz trenutnog rasporeda", + "Generated": "Generirano", + "From the current timetable": "Iz trenutnog rasporeda", + "Week of": "Tjedan od", + "The Monday of the first week of the window": "Ponedjeljak prvog tjedna razdoblja", + "Window start": "Početak razdoblja", + "The first day the week pattern applies to": "Prvi dan na koji se tjedni obrazac odnosi", + "Window end": "Kraj razdoblja", + "The last day the week pattern applies to": "Zadnji dan na koji se tjedni obrazac odnosi", + "Waiting, generating, done, failed, or published as draft lessons": "Čeka, generira se, gotovo, neuspjelo ili objavljeno kao nacrti sati", + "Waiting": "Čeka", + "Generating": "Generira se", + "Failed": "Neuspjelo", + "Published": "Objavljeno", + "Seed": "Sjeme", + "The number the generator starts from, so a run can be repeated": "Broj od kojeg generator kreće, kako bi se pokretanje moglo ponoviti", + "Input": "Ulaz", + "The periods, rooms, lessons and wishes the scenario was made from": "Sati, prostorije, nastavni sati i želje od kojih je nastao scenarij", + "Placements": "Smještaji", + "Each lesson with the period and room it was given": "Svaki nastavni sat sa satom i prostorijom koje je dobio", + "Unplaced lessons": "Nesmješteni sati", + "Lessons without a place, each with the hard wish that blocked it": "Sati bez mjesta, svaki s tvrdom željom koja ga je zaustavila", + "Broken wishes": "Prekršene želje", + "The wishes this scenario breaks, with the lessons that break them": "Želje koje ovaj scenarij krši, sa satima koji ih krše", + "Measures": "Mjere", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Smješteni sati, prekršene želje, rupe nastavnika, sati dnevno i korištenje prostorija", + "Reason": "Razlog", + "Why the run failed": "Zašto pokretanje nije uspjelo", + "Published at": "Objavljeno", + "When the scenario was written out as draft lessons": "Kada je scenarij zapisan kao nacrti sati", + "Edit wish": "Uredi želju", + "New wish": "Nova želja", + "Hard: the generator always keeps it": "Obavezno: generator je uvijek poštuje", + "Soft: the generator keeps it where it can": "Fleksibilno: generator je poštuje gdje može", + "Weight (1 to 3)": "Težina (1 do 3)", + "Most lessons a day": "Najviše sati dnevno", + "Period": "Sat", + "{day} period {number}": "{day} sat {number}", + "Teacher (user name)": "Nastavnik (korisničko ime)", + "Activity (group:subject)": "Aktivnost (grupa:predmet)", + "Say who or what the wish is about.": "Navedite na koga ili što se želja odnosi.", + "Choose at least one period.": "Odaberite barem jedan sat.", + "The limit is a whole number of 1 or more.": "Ograničenje je cijeli broj od 1 ili više.", + "Timetable": "Raspored", + "Wishes": "Želje", + "Timetable wishes": "Želje za raspored", + "Generator run": "Pokretanje generatora", + "Generator progress": "Napredak generatora", + "The run failed: {reason}": "Pokretanje nije uspjelo: {reason}", + "{placed} of {lessons} lessons placed": "Smješteno {placed} od {lessons} sati", + "Generate again": "Generiraj ponovno", + "Generate": "Generiraj", + "Every lesson has a place.": "Svaki sat ima mjesto.", + "Lesson": "Sat", + "No free period and room": "Nema slobodnog sata i učionice", + "Broken soft wishes": "Prekršene fleksibilne želje", + "Every soft wish is kept.": "Svaka fleksibilna želja je poštovana.", + "Wish": "Želja", + "Lessons": "Sati", + "Generating: {percent}% of the time budget used": "Generiranje: iskorišteno {percent}% vremena", + "Waiting to start": "Čeka početak", + "Published as draft lessons": "Objavljeno kao nacrti sati", + "Could not read the scenario.": "Scenarij nije moguće pročitati.", + "Could not start the run.": "Pokretanje nije moguće započeti.", + "Scenarios": "Scenariji", + "Timetable scenarios": "Scenariji rasporeda", + "Scenario": "Scenarij", + "Take the current timetable": "Preuzmi trenutačni raspored", + "Could not take the current timetable.": "Trenutačni raspored nije moguće preuzeti.", + "Broken hard wishes": "Prekršene obvezne želje", + "Not on a period of the week grid": "Nije na satu tjedne mreže", + "Compare scenarios": "Usporedi scenarije", + "Scenarios to compare": "Scenariji za usporedbu", + "Choose two or three scenarios to compare them.": "Odaberite dva ili tri scenarija za usporedbu.", + "Measure": "Mjera", + "Best": "Najbolje", + "Lessons that differ": "Sati koji se razlikuju", + "No lesson differs.": "Nijedan sat se ne razlikuje.", + "Not placed": "Nije smješteno", + "{period} in {room}": "{period} u {room}", + "Lessons placed": "Smješteni sati", + "Lessons without a place": "Sati bez mjesta", + "Clashes": "Sukobi", + "Hard wishes broken": "Prekršene obavezne želje", + "Soft wishes broken": "Prekršene fleksibilne želje", + "Soft wishes broken, weighted": "Prekršene fleksibilne želje, ponderirano", + "Free periods between lessons, all teachers": "Prazni sati, svi nastavnici", + "Most free periods of one teacher": "Najviše praznih sati jednog nastavnika", + "Most lessons of one group on a day": "Najviše sati jedne grupe u danu", + "Room use": "Korištenje učionica", + "Publish as draft lessons": "Objavi kao nacrte sati", + "Draft lessons written: {count}": "Zapisani nacrti sati: {count}", + "Could not publish the scenario.": "Scenarij nije moguće objaviti.", + "Rules": "Pravila", + "Rules for {column}": "Pravila za {column}", + "When a card enters this column": "Kada kartica uđe u ovaj stupac", + "Action": "Radnja", + "Set the priority": "Postavi prioritet", + "Assign to": "Dodijeli osobi", + "Assign the person who moved the card": "Dodijeli osobi koja je premjestila karticu", + "Remove the assignee": "Ukloni dodijeljenu osobu", + "Add a label": "Dodaj oznaku", + "No longer a project member": "Više nije član projekta", + "This label no longer exists": "Ova oznaka više ne postoji", + "Add rule": "Dodaj pravilo", + "Remove rule": "Ukloni pravilo", + "No rules yet. Add one to change a card when it enters this column.": "Još nema pravila. Dodajte jedno kako biste promijenili karticu kada uđe u ovaj stupac.", + "Could not save the rules. Please try again.": "Pravila nije moguće spremiti. Pokušajte ponovno.", + "1 rule runs when a card enters this column": "1 pravilo se izvršava kada kartica uđe u ovaj stupac", + "{count} rules run when a card enters this column": "Broj pravila koja se izvršavaju kada kartica uđe u ovaj stupac: {count}", + "Rules applied: {changes}": "Primijenjena pravila: {changes}", + "assigned to {name}": "dodijeljeno osobi {name}", + "assignee removed": "dodijeljena osoba uklonjena", + "priority {priority}": "prioritet {priority}", + "label {label}": "oznaka {label}", + "What happens to a card when it enters this column, applied in list order.": "Što se događa s karticom kada uđe u ovaj stupac, redoslijedom popisa.", + "Value": "Vrijednost", + "What the rule does to the card.": "Što pravilo radi s karticom.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioritet, ID korisnika ili ID oznake koji radnja koristi; prazno za radnje bez vrijednosti.", + "is not": "nije", + "{dimension} is not": "{dimension} nije", + "Saved filters": "Spremljeni filtri", + "No saved filters yet": "Još nema spremljenih filtara", + "Save filter": "Spremi filtar", + "Rename \"{name}\"": "Preimenuj „{name}”", + "Delete \"{name}\"": "Izbriši „{name}”", + "Clear filters": "Očisti filtre", + "Showing {shown} of {total} tasks": "Prikazano {shown} od {total} zadataka", + "Me": "Ja", + "No date": "Bez datuma", + "Rename saved filter": "Preimenuj spremljeni filtar", + "Share with the project": "Podijeli s projektom", + "Give the filter a name": "Dajte filtru naziv", + "Could not save the filter. Please try again.": "Filtar nije moguće spremiti. Pokušajte ponovno.", + "Some labels in \"{name}\" no longer exist and were left out.": "Neke oznake u „{name}” više ne postoje i izostavljene su.", + "Could not delete the filter. Please try again.": "Filtar nije moguće izbrisati. Pokušajte ponovno.", + "Saved filter": "Spremljeni filtar", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Imenovani filtar ploče jednog projekta, privatan za osobu koja ga je spremila, osim ako je podijeljen s projektom.", + "The project whose board the filter applies to": "Projekt na čijoj se ploči filtar primjenjuje", + "The name the filter is listed under": "Naziv pod kojim je filtar naveden", + "Saved by": "Spremio/la", + "Nextcloud user id of the person who saved the filter": "Nextcloud ID korisnika koji je spremio filtar", + "Shared with the project": "Podijeljeno s projektom", + "Whether every project member sees and applies the filter": "Vidi li svaki član projekta filtar i može li ga primijeniti", + "Criteria": "Kriteriji", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtar: dodijeljena osoba, oznaka, prioritet i rok, svaki s je ili nije i svojim vrijednostima", + "Cross-project view": "Međuprojektni prikaz", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Spremljeni odabir projekata čiji se zadaci prikazuju zajedno u stupcima statusa, podijeljen s navedenim osobama.", + "Shared with": "Podijeljeno s", + "The name the view is listed under": "Naziv pod kojim je prikaz naveden", + "Nextcloud user id of the person who saved the view": "Nextcloud korisnički ID osobe koja je spremila prikaz", + "Nextcloud user ids of the people the view is shared with": "Nextcloud korisnički ID-ovi osoba s kojima je prikaz podijeljen", + "The projects whose tasks the view shows, at most twenty": "Projekti čije zadatke prikaz prikazuje, najviše dvadeset", + "1 project in this view is hidden from you.": "1 projekt u ovom prikazu skriven je od vas.", + "{count} projects in this view are hidden from you.": "Projekti u ovom prikazu skriveni od vas: {count}.", + "{project} has no column for {status}.": "Projekt {project} nema stupac za status {status}.", + "This view does not exist or is not shared with you.": "Ovaj prikaz ne postoji ili nije podijeljen s vama.", + "\"{task}\" moved to {status}.": "\"{task}\" premješteno u {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Međuprojektni prikazi", + "New view": "Novi prikaz", + "Edit view": "Uredi prikaz", + "Delete view": "Izbriši prikaz", + "Give the view a name": "Dajte prikazu naziv", + "Pick at least one project": "Odaberite barem jedan projekt", + "A view shows at most {max} projects": "Prikaz prikazuje najviše {max} projekata", + "Could not save the view. Please try again.": "Prikaz nije moguće spremiti. Pokušajte ponovno.", + "Could not delete the view. Please try again.": "Prikaz nije moguće izbrisati. Pokušajte ponovno.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Izbrisati \"{title}\"? Projekti i njihovi zadaci ostaju kakvi jesu.", + "People see the tasks of the projects they are in, never more.": "Svatko vidi samo zadatke projekata u kojima jest.", + "No views yet. A view shows the tasks of several of your projects together.": "Još nema prikaza. Prikaz prikazuje zadatke više vaših projekata zajedno.", + "Projects in view: {count}": "Projekti u prikazu: {count}", + "Notify me when a task is assigned to me": "Obavijesti me kad mi se dodijeli zadatak", + "Also send these to me by email": "Šalji mi ih i e-poštom", + "Add an email address in your Nextcloud personal settings to get mail.": "Dodajte adresu e-pošte u osobnim postavkama Nextclouda da biste primali e-poštu.", + "Code link": "Poveznica na kod", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, grana, zahtjev za spajanje ili zadatak na platformi za kod koji se odnosi na zadatak.", + "The task the link belongs to": "Zadatak kojem poveznica pripada", + "The project of the task": "Projekt zadatka", + "Task key": "Ključ zadatka", + "The task key the forge text named, such as VC-12": "Ključ zadatka naveden u tekstu platforme, npr. VC-12", + "What the link points at": "Na što poveznica pokazuje", + "Link": "Poveznica", + "The address of the item in the forge": "Adresa stavke na platformi za kod", + "The commit message, branch name or merge request title": "Poruka commita, naziv grane ili naslov zahtjeva za spajanje", + "Repository": "Repozitorij", + "The repository, such as acme/portal": "Repozitorij, npr. acme/portal", + "Forge id": "Id na platformi", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Vlastiti id stavke na platformi za kod, npr. github:acme/portal#42 ili hash commita", + "State": "Stanje", + "The state of a merge request or issue": "Stanje zahtjeva za spajanje ili prijave", + "Who made the commit or opened the merge request": "Tko je napravio commit ili otvorio zahtjev za spajanje", + "When the commit was made or the merge request last changed": "Kada je napravljen commit ili se zahtjev za spajanje zadnji put promijenio", + "Added by": "Dodao", + "Whether a person added the link or the integration wrote it": "Je li poveznicu dodala osoba ili ju je zapisala integracija", + "Nextcloud user UIDs of project members": "Nextcloud korisnički ID-ovi članova projekta", + "Add link": "Dodaj poveznicu", + "Added by hand": "Dodano ručno", + "Branch": "Grana", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Iz integracije", + "Link to a commit, branch or merge request": "Poveznica na commit, granu ili zahtjev za spajanje", + "Merge request": "Zahtjev za spajanje", + "Merged": "Spojeno", + "No code linked yet. Name {key} in a commit message or paste a link.": "Još nema povezanog koda. Navedite {key} u poruci commita ili zalijepite poveznicu.", + "No code linked yet. Paste a link to a commit or merge request.": "Još nema povezanog koda. Zalijepite poveznicu na commit ili zahtjev za spajanje.", + "Paste a web address that starts with https://.": "Zalijepite web-adresu koja počinje s https://.", + "Remove link {title}": "Ukloni poveznicu {title}", + "The link could not be added.": "Poveznicu nije bilo moguće dodati.", + "The link could not be removed.": "Poveznicu nije bilo moguće ukloniti.", + "This link is already on the task.": "Ova poveznica već je na zadatku.", + "Code forges": "Platforme za kod", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Povežite commitove i pull requestove s GitHuba sa zadacima. Integriq prima događaje; planninq nikad ne poziva GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Preuzmite konfiguraciju i uvezite je u Integriq. Zatim upišite tajnu u pravilo \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "U GitHubu repozitoriju dodajte webhook s ovom adresom i istom tajnom. Odaberite vrstu sadržaja application/json te događaje push i pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Navedite ključ zadatka, npr. VC-12, u poruci commita, nazivu grane ili naslovu pull requesta. Poveznica se tada pojavljuje na tom zadatku.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriqa članovi projekta i dalje mogu zalijepiti poveznicu na stranici zadatka.", + "Download the Integriq configuration": "Preuzmi konfiguraciju za Integriq", + "Calendar": "Kalendar", + "Previous": "Prethodno", + "Calendar view": "Prikaz kalendara", + "Starts:": "Počinje:", + "No tasks with a date in this month.": "Ovaj mjesec nema zadataka s datumom.", + "Week of {start} to {end}": "Tjedan od {start} do {end}", + "My calendar": "Moj kalendar", + "Show as list": "Prikaži kao popis", + "Show as calendar": "Prikaži kao kalendar", + "Open my calendar": "Otvori moj kalendar", + "Nextcloud Tasks": "Nextcloud Zadaci", + "Show my tasks in Nextcloud Tasks": "Prikaži moje zadatke u Nextcloud Zadacima", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Zadaci dodijeljeni vama ili podijeljeni s vama prikazuju se na popisu \"Planninq\" u Nextcloud Zadacima i Kalendaru. Promjene napravljene ondje zamjenjuju se sljedećom promjenom u Planninqu.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ovaj poslužitelj ne može pisati u Nextcloud Zadatke pa izvoz nije dostupan.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Upravlja Planninq. Promjene napravljene ovdje zamjenjuju se sljedećom promjenom u Planninqu.", + "Working days and holidays": "Radni dani i praznici", + "Dates set on the timeline skip the days that are not working days.": "Datumi postavljeni na vremenskoj crti preskaču dane koji nisu radni.", + "Working weekdays": "Radni dani u tjednu", + "Non-working days": "Neradni dani", + "No non-working days yet.": "Još nema neradnih dana.", + "Add day": "Dodaj dan", + "Year": "Godina", + "Add Dutch national holidays": "Dodaj nizozemske državne praznike", + "Save working days": "Spremi radne dane", + "Choose at least one working weekday.": "Odaberite barem jedan radni dan.", + "Working days saved.": "Radni dani spremljeni.", + "Could not save the working days.": "Radne dane nije bilo moguće spremiti.", + "New Year's Day": "Nova godina", + "Easter Sunday": "Uskrs", + "Easter Monday": "Uskrsni ponedjeljak", + "King's Day": "Kraljev dan", + "Liberation Day": "Dan oslobođenja", + "Ascension Day": "Uzašašće", + "Whit Sunday": "Duhovi", + "Whit Monday": "Duhovski ponedjeljak", + "Christmas Day": "Božić", + "Boxing Day": "Sveti Stjepan", + "Dates of {title}": "Datumi za {title}", + "The due date cannot be before the start date.": "Rok ne može biti prije datuma početka.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Datume nije bilo moguće spremiti.", + "{title} now runs from {start} to {end}": "{title} sada traje od {start} do {end}", + "Auto-scheduling": "Automatsko planiranje", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kad je uključeno, kasniji rok na vremenskoj crti nudi pomicanje zadataka koje blokira.", + "Move blocked tasks along when a task slips": "Pomakni blokirane zadatke kad zadatak kasni", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na vremenskoj crti kasniji rok nudi pomicanje blokiranih zadataka. Broje se samo veze \"blokira\", a zadaci se pomiču samo kasnije.", + "Move the tasks that wait for {title}?": "Pomaknuti zadatke koji čekaju {title}?", + "These tasks wait for it and would start after its new due date:": "Ovi zadaci ga čekaju i počeli bi nakon novog roka:", + "{count} tasks would move; the first {limit} are listed.": "Pomaknulo bi se {count} zadataka; prikazano je prvih {limit}.", + "Now": "Sada", + "After the move": "Nakon pomaka", + "Only this task": "Samo ovaj zadatak", + "Move all": "Pomakni sve", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Zaustavljeno kod {title}: datume nije bilo moguće spremiti. Zadaci prije njega su pomaknuti.", + "Cumulative flow": "Kumulativni tok", + "Show as chart": "Prikaži kao grafikon", + "Show as table": "Prikaži kao tablicu", + "Tasks per column per day": "Zadaci po stupcu po danu", + "Tasks without recorded history in this period: {count}": "Zadaci bez zabilježene povijesti u ovom razdoblju: {count}", + "Lead and cycle time": "Vrijeme isporuke i vrijeme ciklusa", + "No tasks were finished in this period.": "U ovom razdoblju nije dovršen nijedan zadatak.", + "Finished tasks": "Dovršeni zadaci", + "Cycle time, average": "Vrijeme ciklusa, prosjek", + "Cycle time, 85th percentile": "Vrijeme ciklusa, 85. percentil", + "Lead time, average": "Vrijeme isporuke, prosjek", + "Tasks whose finish time was estimated from their history: {count}": "Zadaci čije je vrijeme završetka procijenjeno iz povijesti: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Vrijeme ciklusa svakog dovršenog zadatka, s prosjekom i 85. percentilom", + "Slowest tasks": "Najsporiji zadaci", + "cycle {cycle}, lead {lead}": "ciklus {cycle}, isporuka {lead}", + "{days} days": "{days} dana", + "Could not load the flow of this project.": "Tok ovog projekta nije moguće učitati.", + "Last {days} days": "Zadnjih {days} dana", + "Portfolio flow": "Tok portfelja", + "An admin adds portfolios under Projects, Portfolios.": "Administrator dodaje portfelje pod Projekti, Portfelji.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekti koji nisu prikazani jer se odjednom prikazuje najviše 50: {count}", + "Could not load the flow of this portfolio.": "Tok ovog portfelja nije moguće učitati.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativni tok i vrijeme ciklusa kroz projekte portfelja.", + "Edit report": "Uredi izvješće", + "Only tasks where": "Samo zadaci gdje", + "Group by": "Grupiraj po", + "Display": "Prikaz", + "Share with everyone who can read its projects": "Podijeli sa svima koji mogu čitati njegove projekte", + "The report could not be saved.": "Izvješće nije moguće spremiti.", + "Number of tasks": "Broj zadataka", + "Bar": "Stupci", + "Donut": "Prsten", + "Table": "Tablica", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} od {total} projekata u ovom izvješću nije vidljivo za vas", + "No tasks match this report.": "Nijedan zadatak ne odgovara ovom izvješću.", + "None": "Ništa", + "Could not load this report.": "Ovo izvješće nije moguće učitati.", + "Report": "Izvješće", + "Your reports": "Vaša izvješća", + "My reports": "Moja izvješća", + "Shared reports": "Dijeljena izvješća", + "You have not built a report yet.": "Još niste izradili izvješće.", + "Nobody has shared a report with you yet.": "Još nitko nije podijelio izvješće s vama.", + "Reports you built over tasks, and the ones shared with you.": "Izvješća koja ste izradili nad zadacima, i ona podijeljena s vama.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Spremljeni upit nad zadacima: koji projekti, koji filtri, grupirano po čemu, prebrojano ili zbrojeno, i prikazano kao tablica ili grafikon.", + "The name the report is listed under": "Naziv pod kojim je izvješće navedeno", + "What the report shows and who it is for": "Što izvješće prikazuje i kome je namijenjeno", + "Nextcloud user id of the person who saved the report": "Nextcloud ID korisnika koji je spremio izvješće", + "Who can open the report": "Tko može otvoriti izvješće", + "Only me": "Samo ja", + "Everyone who can read its projects": "Svi koji mogu čitati njegove projekte", + "The projects the report covers, at most fifty": "Projekti koje izvješće obuhvaća, najviše pedeset", + "Filters": "Filtri", + "Task fields and the value each must equal": "Polja zadatka i vrijednost kojoj svako mora biti jednako", + "The task field the report groups on": "Polje zadatka po kojem izvješće grupira", + "Count the tasks, or add up a number on them": "Prebroji zadatke ili zbroji broj na njima", + "Sum": "Zbroj", + "Sum of": "Zbroj polja", + "The number added up when the measure is a sum": "Broj koji se zbraja kad je mjera zbroj", + "Story points": "Bodovi priče", + "Estimated duration": "Procijenjeno trajanje", + "How the report is shown": "Kako se izvješće prikazuje", + "Issue type": "Vrsta zahtjeva", + "Task fields and the value each must equal; empty when the report covers every task": "Polja zadatka i vrijednost koju svako mora imati; prazno kad izvješće obuhvaća sve zadatke", + "The status a task must have": "Status koji zadatak mora imati", + "The priority a task must have": "Prioritet koji zadatak mora imati", + "The user a task must be assigned to": "Korisnik kojem zadatak mora biti dodijeljen", + "A label a task must carry": "Oznaka koju zadatak mora imati", + "The board column a task must be in": "Stupac ploče u kojem zadatak mora biti", + "The issue type a task must have": "Vrsta zahtjeva koju zadatak mora imati", + "Manager groups": "Grupe voditelja", + "Member groups": "Grupe članova", + "Viewer groups": "Grupe čitatelja", + "Viewers": "Čitatelji", + "Owning group": "Vlasnička grupa", + "Nextcloud groups whose members manage the project": "Nextcloud grupe čiji članovi vode projekt", + "Nextcloud groups whose members work on the project": "Nextcloud grupe čiji članovi rade na projektu", + "Nextcloud groups whose members may read the project": "Nextcloud grupe čiji članovi smiju čitati projekt", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud korisnici koji vode projekt: postavke, članove i rad", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud korisnici koji smiju čitati projekt i njegov rad, ali ga ne mijenjati", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud grupa koja posjeduje projekt zajedno s njegovim autorom, najviše jedna", + "Nextcloud user ids who may read this through the project": "Nextcloud korisnici koji ovo smiju čitati kroz projekt", + "Nextcloud groups whose members may change this through the project": "Nextcloud grupe čiji članovi ovo smiju mijenjati kroz projekt", + "Nextcloud groups whose members may read this through the project": "Nextcloud grupe čiji članovi ovo smiju čitati kroz projekt", + "Search for a person or a group…": "Traži osobu ili grupu…", + "No one found. Your admin's sharing settings decide who you can find.": "Nitko nije pronađen. Postavke dijeljenja vašeg administratora određuju koga možete pronaći.", + "Type at least two characters": "Unesite barem dva znaka", + "Everyone in this group": "Svi u ovoj grupi", + "Could not search for people. Please try again.": "Pretraživanje osoba nije uspjelo. Pokušajte ponovno.", + "Could not remove the group": "Grupu nije moguće ukloniti", + "Only the owner and managers change who is on this project.": "Samo vlasnik i upravitelji mijenjaju tko je na ovom projektu.", + "Role of {name}": "Uloga: {name}", + "Manager": "Upravitelj", + "Member": "Član", + "Viewer": "Čitatelj", + "Could not change the role": "Ulogu nije moguće promijeniti", + "Owned by group: {name}": "U vlasništvu grupe: {name}", + "No group owns this project.": "Nijedna grupa nije vlasnik ovog projekta.", + "Owned by group": "U vlasništvu grupe", + "Search for a group…": "Potraži grupu…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nije pronađena nijedna grupa. Postavke dijeljenja vašeg administratora određuju koje grupe možete pronaći.", + "No owning group": "Bez grupe vlasnika", + "Could not search for groups. Please try again.": "Pretraživanje grupa nije uspjelo. Pokušajte ponovno.", + "Could not change the owning group": "Grupu vlasnika nije moguće promijeniti", + "You can read this project. Only its members change it.": "Ovaj projekt možete čitati. Mijenjaju ga samo njegovi članovi.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet koji se predaje na ovom satu, na primjer izborni predmet, kad ga školska aplikacija za učenje poznaje.", + "Online meeting link": "Poveznica na online sat", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdje se učenici pridružuju ovom satu online. Gumb Pridruži se prikazuje se samo za https poveznicu." }, "plurals": null } diff --git a/l10n/hu.js b/l10n/hu.js index 2f92b771..bada38fa 100644 --- a/l10n/hu.js +++ b/l10n/hu.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktív projektek", + "Archived projects": "Archivált projektek", + "Boards": "Táblák", + "My projects": "Saját projektjeim", + "Portfolio": "Portfólió", + "Project board": "Projekttábla", + "Projects I am in": "Projektek, amelyekben részt veszek", + "Timeline": "Idővonal", + "Timesheet": "Munkaidő-nyilvántartás", + "Features & roadmap": "Funkciók és ütemterv", + "Flow": "Folyamat", + "Flows": "Folyamatok", + "Reports": "Jelentések", + "Pick a report to open it.": "Válasszon egy jelentést a megnyitáshoz.", + "In progress": "Folyamatban", + "Date": "Dátum", + "Due": "Határidő", + "Assignee": "Felelős", + "Who": "Ki", + "What": "Mit", + "Minutes": "Perc", + "Entries": "Bejegyzések", + "Most recent": "Legutóbbi", + "Per person": "Személyenként", + "By status": "Állapot szerint", + "By priority": "Prioritás szerint", + "Task status": "Feladatok állapota", + "Time spent": "Ráfordított idő", + "Capacity": "Kapacitás", + "Due soonest": "Legkorábban esedékes", + "Minutes logged": "Rögzített percek", + "Nothing is due": "Semmi sem esedékes", + "Nothing logged yet": "Még nincs rögzítve semmi", + "What is open, what is blocked, and what is overdue.": "Mi van nyitva, mi van blokkolva és mi késik.", + "How allocation is spread across the people working on projects.": "Hogyan oszlik meg a terhelés a projekteken dolgozók között.", + "Hours logged, and the projects they went to.": "A rögzített órák és a projektek, amelyekre fordították.", + "Billable": "Számlázható", + "Budget: {amount}": "Költségkeret: {amount}", + "Loading projects": "Projektek betöltése", + "No projects for this client yet": "Ehhez az ügyfélhez még nincsenek projektek", + "Open in Planninq": "Megnyitás a Planninqben", + "This project could not be found": "Ez a projekt nem található", + "Untitled project": "Névtelen projekt", + "and {count} more": "és még {count}", + "Store": "Áruház", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Telepítsen más szervezetek által közzétett nyilvántartásokat, sémákat és folyamatokat.", + "Work Date": "Munkadátum", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Oszlopműveletek", + "Columns": "Oszlopok", + "Could not remove the column. Please try again.": "Az oszlopot nem sikerült eltávolítani. Próbálja újra.", + "Could not save the column. Please try again.": "Az oszlopot nem sikerült menteni. Próbálja újra.", + "Done column": "Kész oszlop", + "Edit column": "Oszlop szerkesztése", + "Keep the card's status": "A kártya állapotának megtartása", + "Move its cards to": "Kártyáinak áthelyezése ide", + "Move left": "Mozgatás balra", + "Move right": "Mozgatás jobbra", + "Status of cards moved here": "Az ide mozgatott kártyák állapota", + "The last done column cannot be removed.": "Az utolsó kész oszlop nem távolítható el.", + "WIP limit": "WIP-korlát", + "over limit": "korlát felett", + "The status a card gets when it is moved into this column.": "Az állapot, amelyet egy kártya kap, amikor ebbe az oszlopba kerül.", + "All priorities": "Minden prioritás", + "Could not create the task. Please try again.": "A feladatot nem sikerült létrehozni. Próbálja újra.", + "Created": "Létrehozva", + "Move to backlog": "A backlogba", + "Move to board": "A táblára", + "New task": "Új feladat", + "Nothing in the backlog": "A backlog üres", + "Rank": "Sorrend", + "Sort by": "Rendezés", + "Sort by rank to reorder": "Az átrendezéshez rendezzen sorrend szerint", + "Task actions": "Feladatműveletek", + "All labels": "Minden címke", + "Filter tasks by label": "Feladatok szűrése címke szerint", + "View timeline": "Idővonal megtekintése", + "Board": "Tábla", + "List": "Lista", + "Column": "Oszlop", + "Board or list": "Tábla vagy lista", + "Log": "Napló", + "Add entry": "Bejegyzés hozzáadása", + "Show": "Megjelenítés", + "No actions yet": "Még nincsenek teendők", + "Closed": "Lezárva", + "Entry actions": "Bejegyzés műveletei", + "Add action": "Teendő hozzáadása", + "by {author}": "szerző: {author}", + "saved {time}": "mentve: {time}", + "Attendees: {names}": "Résztvevők: {names}", + "Add the first entry": "Az első bejegyzés hozzáadása", + "Issues": "Problémák", + "Lessons learned": "Tanulságok", + "Meetings": "Megbeszélések", + "Decisions": "Döntések", + "Actions": "Teendők", + "Issue": "Probléma", + "Lesson learned": "Tanulság", + "Meeting": "Megbeszélés", + "Decision": "Döntés", + "About this project": "A projektről", + "No description yet": "Még nincs leírás", + "Start date": "Kezdő dátum", + "Not set": "Nincs beállítva", + "End date": "Záró dátum", + "Progress": "Előrehaladás", + "No tasks yet": "Még nincsenek feladatok", + "Open the board": "Tábla megnyitása", + "People": "Személyek", + "Owner": "Tulajdonos", + "Latest log entries": "Legutóbbi bejegyzések", + "Open the log": "Napló megnyitása", + "{done} of {total} tasks done": "{total} feladatból {done} kész", + "Edit entry": "Bejegyzés szerkesztése", + "Type": "Fajta", + "Attendees": "Résztvevők", + "Issue is closed": "A probléma lezárva", + "Could not save the entry. Please try again.": "A bejegyzést nem sikerült menteni. Próbálja újra.", + "From: {title}": "Forrás: {title}", + "What needs to happen": "Mit kell tenni", + "Could not create the action. Please try again.": "A teendőt nem sikerült létrehozni. Próbálja újra.", + "The action was created but could not be linked to the entry.": "A teendő létrejött, de nem sikerült a bejegyzéshez kapcsolni.", + "Project pages": "Projektoldalak", + "Overview": "Áttekintés", + "Risks": "Kockázatok", + "Log entry": "Naplóbejegyzés", + "A short name for the entry": "A bejegyzés rövid neve", + "Project": "Projekt", + "The project this entry belongs to": "A projekt, amelyhez a bejegyzés tartozik", + "What kind of entry this is": "Milyen fajta bejegyzés ez", + "When it happened": "Mikor történt", + "What happened, in Markdown": "Mi történt, Markdownban", + "Whether an issue is still open": "Nyitott-e még a probléma", + "The people at a meeting": "A megbeszélés résztvevői", + "Tasks that came out of this entry": "A bejegyzésből született feladatok", + "Add risk": "Kockázat hozzáadása", + "Risk": "Kockázat", + "Score": "Pontszám", + "Response": "Válasz", + "Review date": "Felülvizsgálat dátuma", + "no longer on the project": "már nem tagja a projektnek", + "Edit {title}": "{title} szerkesztése", + "No risks recorded yet": "Még nincsenek rögzített kockázatok", + "Add the first risk": "Az első kockázat hozzáadása", + "Medium": "Közepes", + "Mitigating": "Enyhítés alatt", + "Occurred": "Bekövetkezett", + "Avoid": "Elkerülés", + "Reduce": "Csökkentés", + "Transfer": "Áthárítás", + "Accept": "Elfogadás", + "Highest open risks": "Legmagasabb nyitott kockázatok", + "No open risks": "Nincsenek nyitott kockázatok", + "Open the risk register": "Kockázatnyilvántartás megnyitása", + "Edit risk": "Kockázat szerkesztése", + "What could go wrong": "Mi mehet félre", + "Likelihood": "Valószínűség", + "Impact": "Hatás", + "Score {score}": "Pontszám: {score}", + "Countermeasures": "Ellenintézkedések", + "Could not save the risk. Please try again.": "A kockázatot nem sikerült menteni. Próbálja újra.", + "Risks by likelihood and impact": "Kockázatok valószínűség és hatás szerint", + "Risk scale": "Kockázati skála", + "The levels every project scores its risks on, and where low turns into medium and high": "A szintek, amelyeken minden projekt pontozza a kockázatait, és ahol az alacsony közepesbe és magasba vált", + "Number of levels": "Szintek száma", + "Likelihood labels": "Valószínűség címkéi", + "Impact labels": "Hatás címkéi", + "Level {level}": "{level}. szint", + "Medium from score": "Közepes ettől a pontszámtól", + "High from score": "Magas ettől a pontszámtól", + "Risk scale saved": "Kockázati skála mentve", + "1 risk uses level {level}. Change it first.": "1 kockázat a(z) {level}. szintet használja. Előbb módosítsa.", + "{count} risks use level {level}. Change them first.": "{count} kockázat a(z) {level}. szintet használja. Előbb módosítsa őket.", + "Every level needs a label, and high must start above medium.": "Minden szintnek kell címke, és a magasnak a közepes fölött kell kezdődnie.", + "The project this risk belongs to": "A projekt, amelyhez a kockázat tartozik", + "The cause and the effect, in Markdown": "Az ok és az okozat, Markdownban", + "Category": "Kategória", + "A free grouping, such as planning, budget or supplier": "Szabad csoportosítás, pl. ütemezés, költségvetés vagy beszállító", + "How likely it is, on the admin's risk scale": "Mennyire valószínű, a rendszergazda kockázati skáláján", + "How hard it would hit, on the admin's risk scale": "Mennyire súlyosan érintene, a rendszergazda kockázati skáláján", + "Likelihood times impact, calculated by the server": "Valószínűség szorozva a hatással, a kiszolgáló számolja", + "Where the risk stands": "Hol tart a kockázat", + "The person who watches this risk": "A személy, aki figyeli a kockázatot", + "How the project answers the risk": "Hogyan válaszol a projekt a kockázatra", + "What is done to prevent it or soften it, in Markdown": "Mit tesznek a megelőzésére vagy enyhítésére, Markdownban", + "When to look at this risk again": "Mikor kell újra megvizsgálni a kockázatot", + "Very low": "Nagyon alacsony", + "Very high": "Nagyon magas", + "All projects": "Minden projekt", + "Project status report": "Projekt állapotjelentés", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Keltezett jelentés arról, hogyan áll egy projekt pénz, szervezet, idő, információ, minőség és kockázat tekintetében (a GROTIK-szempontok), mindegyik megjegyzéssel.", + "The project this report is about": "A projekt, amelyről a jelentés szól", + "Report date": "Jelentés dátuma", + "The day the report describes": "A nap, amelyet a jelentés leír", + "Money": "Pénz", + "How the project stands on this aspect": "Hogyan áll a projekt ebben a szempontban", + "On track": "Terv szerint", + "At risk": "Veszélyben", + "Off track": "Letért a tervről", + "Money note": "Megjegyzés a pénzről", + "A short explanation of this status": "Rövid magyarázat ehhez az állapothoz", + "Organisation": "Szervezet", + "Organisation note": "Megjegyzés a szervezetről", + "Time": "Idő", + "Time note": "Megjegyzés az időről", + "Information": "Információ", + "Information note": "Megjegyzés az információról", + "Quality": "Minőség", + "Quality note": "Megjegyzés a minőségről", + "Risk note": "Megjegyzés a kockázatról", + "Overall": "Összesen", + "The worst of the six statuses, calculated by the server": "A hat állapot közül a legrosszabb, a szerver számítja", + "Health: money": "Állapot: pénz", + "Copied from the newest status report": "A legújabb állapotjelentésből átvéve", + "Health: organisation": "Állapot: szervezet", + "Health: time": "Állapot: idő", + "Health: information": "Állapot: információ", + "Health: quality": "Állapot: minőség", + "Health: risk": "Állapot: kockázat", + "Health: overall": "Állapot: összesen", + "Health: report date": "Állapot: jelentés dátuma", + "The date of the newest status report": "A legújabb állapotjelentés dátuma", + "New report": "Új jelentés", + "Only the project owner writes status reports.": "Állapotjelentést csak a projekt tulajdonosa ír.", + "Latest report, {date}": "Legutóbbi jelentés, {date}", + "Aspect": "Szempont", + "Note": "Megjegyzés", + "Report history": "Jelentések előzményei", + "Author": "Szerző", + "No status reports yet": "Még nincs állapotjelentés", + "Write the first report": "Az első jelentés megírása", + "Choose a status for every aspect to save the report.": "A jelentés mentéséhez válasszon állapotot minden szemponthoz.", + "Suggested: on track.": "Javaslat: terv szerint.", + "Suggested: at risk.": "Javaslat: veszélyben.", + "Suggested: off track.": "Javaslat: letért a tervről.", + "1 task is past its due date.": "1 feladat lejárt.", + "{count} tasks are past their due date.": "Lejárt feladatok: {count}.", + "The end date has passed with 1 open task.": "A záró dátum elmúlt, 1 feladat nyitott.", + "The end date has passed with {count} open tasks.": "A záró dátum elmúlt, nyitott feladatok: {count}.", + "No open task is past its due date.": "Egyik nyitott feladat sem járt le.", + "The highest open risk, \"{title}\", scores {score}.": "A legmagasabb nyitott kockázat, „{title}”, pontszáma {score}.", + "There are no open risks.": "Nincs nyitott kockázat.", + "Costs are at {percent}% of the budget.": "A költségek a költségvetés {percent}%-án állnak.", + "No suggestion: the project has no budget.": "Nincs javaslat: a projektnek nincs költségvetése.", + "No suggestion: no costs are recorded for this project yet.": "Nincs javaslat: ehhez a projekthez még nincs rögzített költség.", + "The report was not saved. Only the project owner can write status reports.": "A jelentés nem lett mentve. Állapotjelentést csak a projekt tulajdonosa írhat.", + "No report": "Nincs jelentés", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Ugyanazon emberek által vezetett projektek csoportja, például egy osztály vagy egy program. A felelősei minden benne lévő projektet olvasnak.", + "The name of the portfolio": "A portfólió neve", + "What the portfolio holds and who runs it": "Mit tartalmaz a portfólió, és ki vezeti", + "A colour for the portfolio's section in project lists": "A portfólió szakaszának színe a projektlistákban", + "Managers": "Felelősök", + "Nextcloud user UIDs of the people who run the portfolio": "A portfóliót vezető személyek Nextcloud-felhasználóazonosítói", + "Order": "Sorrend", + "Where the portfolio comes in project lists, lowest first": "A portfólió helye a projektlistákban, a legkisebb elöl", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "A portfólió saját kockázati skálája JSON-ként, az egész alkalmazás skálájával azonos formában. Üresen az alkalmazás skáláját jelenti.", + "Portfolio readers": "Portfólió-olvasók", + "Nextcloud user UIDs of the managers of the project's portfolio": "A projekt portfóliója felelőseinek Nextcloud-felhasználóazonosítói", + "The portfolio this project belongs to": "A portfólió, amelyhez a projekt tartozik", + "No portfolio": "Nincs portfólió", + "All portfolios": "Összes portfólió", + "You read this project as a manager of its portfolio. Only its members change it.": "Ezt a projektet a portfóliója felelőseként olvassa. Csak a tagjai módosítják.", + "Portfolios": "Portfóliók", + "Portfolio status": "Portfólió állapota", + "No portfolios yet": "Még nincs portfólió", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Egy rendszergazda a Projektek, Portfóliók alatt ad hozzá portfóliókat. A portfólió projektjei itt szerepelnek az állapotukkal.", + "Roll-up": "Összesítés", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} terv szerint, {atRisk} veszélyben, {offTrack} letért, {noReport} jelentés nélkül", + "No project in this portfolio that you can read.": "Ebben a portfólióban nincs olyan projekt, amelyet olvashatsz.", + "Start": "Kezdés", + "End": "Vége", + "Budget": "Költségvetés", + "Last report": "Utolsó jelentés", + "Out of date": "Elavult", + "Portfolio timeline": "Portfólió idővonala", + "Zoom": "Nagyítás", + "Could not load the timeline": "Az idővonal nem tölthető be", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Egy rendszergazda a Projektek, Portfóliók alatt ad hozzá portfóliókat. A portfólió projektjei itt egy idővonalon láthatók.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Nyiss meg egy projektet a fázisai és feladatai megtekintéséhez. Az idővonal csak olvasható.", + "Phase: {title}": "Fázis: {title}", + "Left out because you cannot read them: {count} projects": "Kihagyva, mert nem olvashatod őket: {count} projekt", + "Week": "Hét", + "Day": "Nap", + "Month": "Hónap", + "Please try again later.": "Próbáld újra később.", + "Status reports": "Állapotjelentések", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Hány nap után jelölődik elavultnak egy projekt legutóbbi állapotjelentése a portfólió áttekintésében", + "Reporting period (days)": "Jelentési időszak (nap)", + "The reporting period is a whole number of days from 1 to 365.": "A jelentési időszak egész számú nap 1 és 365 között.", + "Reporting period saved": "Jelentési időszak mentve", + "The reporting period was not saved. Please try again.": "A jelentési időszak nem lett mentve. Próbáld újra.", + "Every project of a portfolio with its status per aspect, rolled up.": "A portfólió minden projektje az aspektusonkénti állapotával, összesítve.", + "The projects of a portfolio on one timeline.": "A portfólió projektjei egy idővonalon.", + "Phases": "Fázisok", + "Add phase": "Fázis hozzáadása", + "No phases yet": "Még nincs fázis", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Oszd fázisokra a projektet, például indításra, meghatározásra és megvalósításra. Egy fázis akkor zárul, amikor a záródokumentuma fel van töltve.", + "{hours} hours": "{hours} óra", + "Concluding document: {title}": "Záródokumentum: {title}", + "Concluding document missing": "Hiányzik a záródokumentum", + "Move {title} up": "{title} feljebb", + "Move {title} down": "{title} lejjebb", + "Close phase": "Fázis lezárása", + "Phase": "Fázis", + "Files": "Fájlok", + "Notes": "Jegyzetek", + "Audit trail": "Naplózás", + "Edit phase": "Fázis szerkesztése", + "Name": "Név", + "Budget hours": "Tervezett órák", + "Could not save the phase. Please try again.": "A fázist nem sikerült menteni. Próbáld újra.", + "Close phase {title}": "{title} fázis lezárása", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Egy fázis a záródokumentumával zárul: töltsd fel itt, vagy válaszd ki a fázis egyik fájlját.", + "Concluding document": "Záródokumentum", + "This phase has no files yet.": "Ennek a fázisnak még nincsenek fájljai.", + "Upload a document": "Dokumentum feltöltése", + "The document was not uploaded. Please try again.": "A dokumentum nem lett feltöltve. Próbáld újra.", + "Upload the concluding document before you close this phase.": "Töltsd fel a záródokumentumot, mielőtt lezárod ezt a fázist.", + "This phase cannot be closed from its current status.": "Ez a fázis a jelenlegi állapotából nem zárható le.", + "The phase was not closed. Please try again.": "A fázis nem lett lezárva. Próbáld újra.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "A fázist lezáró fájl azonosítója ezen a fázison. A fázis csak akkor fejezhető be, ha ki van töltve és a fájl csatolva van.", + "Import from Microsoft Project": "Importálás Microsoft Projectből", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Válasszon egy Microsoft Projectből XML formátumban mentett tervet. Semmi sem kerül importálásra, amíg meg nem erősíti.", + "Plan file": "Tervfájl", + "What the import creates": "Mit hoz létre az importálás", + "Tasks": "Feladatok", + "Sub-tasks": "Részfeladatok", + "Milestones": "Mérföldkövek", + "Links": "Kapcsolatok", + "Already imported, updated in place: {count}": "Már importálva, helyben frissítve: {count}", + "What does not carry over": "Ami nem kerül át", + "Tasks with resources, which are not imported: {count}": "Erőforrásokkal rendelkező feladatok, amelyek nem kerülnek importálásra: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "A 3. szintnél mélyebb feladatok, a 2. szintű feladatuk alá helyezve: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Nem befejezés-kezdés kapcsolatok, kapcsolódó kapcsolatként importálva: {count}", + "Link lags, which are dropped: {count}": "Kapcsolatok késleltetései, amelyek elmaradnak: {count}", + "Links to a summary task, which are not imported: {count}": "Összesítő feladatra mutató kapcsolatok, amelyek nem kerülnek importálásra: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "E terven kívüli feladatokra mutató kapcsolatok, amelyek nem kerülnek importálásra: {count}", + "No longer in the plan": "Már nincs a tervben", + "These stay in the project; remove them yourself if they are no longer needed.": "Ezek a projektben maradnak; távolítsa el őket, ha már nincs rájuk szükség.", + "Import": "Importálás", + "Close": "Bezárás", + "The plan is imported: {created} created, {updated} updated.": "A terv importálva: {created} létrehozva, {updated} frissítve.", + "Links that would close a loop were left out: {count}": "A hurkot bezáró kapcsolatok kimaradtak: {count}", + "The import stopped part-way. Run it again to finish it.": "Az importálás félúton leállt. Futtassa újra a befejezéshez.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Mentse a tervet a Microsoft Projectben a Fájl, Mentés másként, XML formátum menüvel, és importálja azt a fájlt.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ez a fájl DOCTYPE-ot vagy entitásokat deklarál, amelyek nem elfogadottak.", + "The file is larger than 10 MB.": "A fájl nagyobb 10 MB-nál.", + "The plan has more than 2,000 tasks, more than one import takes.": "A tervben több mint 2000 feladat van, több, mint amennyit egy importálás elfogad.", + "This file is not a Microsoft Project plan in XML format.": "Ez a fájl nem XML formátumú Microsoft Project-terv.", + "Choose a file to import.": "Válasszon egy importálandó fájlt.", + "Only the project owner can import a plan.": "Csak a projekt tulajdonosa importálhat tervet.", + "The plan could not be read. Please try again.": "A tervet nem sikerült beolvasni. Próbálja újra.", + "Linked case: {title}": "Kapcsolt ügy: {title}", + "Linked to a case": "Ügyhöz kapcsolva", + "Hand over to case": "Átadás az ügynek", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Változatlanul átmásolja a projekt és feladatai minden fájlját, valamint a projektet leíró fájlt a kapcsolt ügybe.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Átmásolt fájlok: {count}", + "Files that failed: {names}": "Sikertelen fájlok: {names}", + "The handover failed. Please try again.": "Az átadás nem sikerült. Próbálja újra.", + "The linked case could not be found, or you cannot open it.": "A kapcsolt ügy nem található, vagy nem nyithatja meg.", + "Case handovers": "Átadások az ügynek", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "A projekt fájljainak és metaadatainak minden átadása az ügyének: mikor, ki, melyik ügynek, minden átmásolt fájl a SHA-256 értékével, és a sikertelen fájlok.", + "Finance": "Pénzügyek", + "Add cost line": "Költségsor hozzáadása", + "Delivery terms": "Szállítási feltételek", + "Billing model": "Számlázási modell", + "Budget in euro": "Költségkeret euróban", + "Budget in hours": "Költségkeret órában", + "Hourly rate in euro": "Óradíj euróban", + "Planned start": "Tervezett kezdés", + "Planned end": "Tervezett befejezés", + "Planned dates": "Tervezett dátumok", + "Budget {amount}": "Költségkeret: {amount}", + "No budget agreed": "Nincs egyeztetett költségkeret", + "Hours": "Órák", + "Only the project owner and the portfolio managers see the amounts.": "Az összegeket csak a projekt tulajdonosa és a portfólió vezetői látják.", + "Budget against cost per category": "Költségkeret és költségek kategóriánként", + "Labour (booked time)": "Munka (rögzített idő)", + "No category": "Nincs kategória", + "Hours are not available": "Az órák nem érhetők el", + "Not yet assigned to a category": "Még nincs kategóriához rendelve", + "Total": "Összesen", + "{spent} spent, {remaining} remaining": "{spent} elköltve, {remaining} maradt", + "Budget against cost per phase": "Költségkeret és költségek szakaszonként", + "No phase": "Nincs szakasz", + "Cost lines": "Költségsorok", + "From the finance system": "A pénzügyi rendszerből", + "Edit cost line {amount}": "A(z) {amount} költségsor szerkesztése", + "No cost lines yet": "Még nincsenek költségsorok", + "Commitments": "Kötelezettségek", + "Actual cost": "Tényleges költség", + "Forecast": "Előrejelzés", + "Remaining": "Maradék", + "Not planned yet": "Még nincs ütemezve", + "{start} to {end}": "{start} és {end} között", + "The terms were not saved. Please try again.": "A feltételek nem lettek mentve. Próbáld újra.", + "Terms saved": "Feltételek mentve", + "Fixed price": "Fix ár", + "Hourly": "Óradíjas", + "Not billed": "Nem számlázott", + "Commitment": "Kötelezettség", + "Edit cost line": "Költségsor szerkesztése", + "Kind": "Fajta", + "Amount in euro": "Összeg euróban", + "Remove": "Eltávolítás", + "Could not save the cost line. Only the project owner changes the money of a project.": "A költségsor nem menthető. Egy projekt pénzét csak a projekt tulajdonosa módosítja.", + "Could not remove the cost line. Please try again.": "A költségsor nem távolítható el. Próbáld újra.", + "{amount} over budget": "{amount} a költségkeret felett", + "Cost categories": "Költségkategóriák", + "The categories every project splits its budget and costs into, one per line": "A kategóriák, amelyekre minden projekt felosztja a költségkeretét és költségeit, soronként egy", + "Categories": "Kategóriák", + "Give at least one category, each name once.": "Adj meg legalább egy kategóriát, minden nevet egyszer.", + "Cost categories saved": "Költségkategóriák mentve", + "The cost categories were not saved. Please try again.": "A költségkategóriák nem lettek mentve. Próbáld újra.", + "Finance line": "Pénzügyi sor", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Egy projekt egy pénzösszege: költségkeret, kötelezettség, tényleges költség vagy előrejelzés, költségkategóriában és opcionálisan szakaszban. A projekt tulajdonosa rögzíti, vagy a pénzügyi rendszer küldi az integrációs alkalmazáson keresztül.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "A projekt, amelyhez az összeg tartozik. Üres, ha a pénzügyi rendszerből érkező sor projektszáma egyetlen projekthez sem illik.", + "The phase this amount belongs to, if any": "A szakasz, amelyhez az összeg tartozik, ha van ilyen", + "The cost category, one of the categories the admin set up": "A költségkategória, az adminisztrátor által beállított kategóriák egyike", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Az összeg költségkeret, kötelezettség, tényleges költség vagy előrejelzés-e", + "Amount": "Összeg", + "The amount in the reporting currency (euro)": "Az összeg a jelentési pénznemben (euró)", + "The date the amount was booked or is expected": "Az összeg könyvelésének vagy várható dátuma", + "What the amount is for": "Mire szól az összeg", + "Whether a person entered the line or the finance system sent it": "Egy személy rögzítette a sort, vagy a pénzügyi rendszer küldte", + "Entered by hand": "Kézzel rögzítve", + "Finance line id": "Pénzügyi sor azonosítója", + "The finance system's own id of this line. One imported line per id.": "A sor saját azonosítója a pénzügyi rendszerben. Azonosítónként egy importált sor.", + "Project number": "Projektszám", + "The project number the finance system sent, matched against the project key": "A pénzügyi rendszer által küldött projektszám, a projekt kulcsával összevetve", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "A sor projektjének portfóliója, a projektből átvéve, hogy a portfólió összesítéseihez egy szűrő elég legyen", + "Finance readers": "Pénzügyi olvasók", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Azoknak a Nextcloud-felhasználói azonosítói, akik láthatják az összeget: a projekt tulajdonosa és a portfólió vezetői", + "Project owner": "Projekt tulajdonosa", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "A projekt tulajdonosának Nextcloud-felhasználói azonosítója, aki módosíthatja és eltávolíthatja a kézi sorokat", + "How the client pays: not billed, a fixed price, or by the hour.": "Hogyan fizet az ügyfél: nincs számlázva, fix ár vagy óradíjas.", + "Portfolio finance": "Portfólió pénzügyei", + "You cannot see the money of any project in this portfolio": "A portfólió egyik projektjének pénzét sem láthatod", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "A kiszolgáló a portfólión kívüli projektek költségsorait is visszaadta, ezért az összesítések hibásak lehetnek.", + "Projects left out because you cannot see their money: {count}": "Kihagyott projektek, mert nem láthatod a pénzüket: {count}", + "Unmatched finance lines": "Nem egyeztetett pénzügyi sorok", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Költségkeret, kötelezettségek, tényleges költség és előrejelzés egy portfólióra összesítve.", + "Subprojects": "Alprojektek", + "{done} of {total}": "{done}/{total}", + "{done} of {total} tasks done, including subprojects": "{done}/{total} feladat kész, az alprojektekkel együtt", + "Show the subprojects of {title}": "{title} alprojektjeinek megjelenítése", + "Hide the subprojects of {title}": "{title} alprojektjeinek elrejtése", + "Part of": "Része ennek", + "No parent project": "Nincs szülőprojekt", + "A project cannot sit under one of its own subprojects.": "Egy projekt nem kerülhet a saját alprojektjei egyike alá.", + "Projects nest three levels deep at most: programme, project and subproject.": "A projektek legfeljebb három szint mélyen ágyazhatók: program, projekt és alprojekt.", + "Parent project": "Szülőprojekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "A projekt, amely alá ez a projekt tartozik, például egy program. A projektek legfeljebb három szint mélyen ágyazhatók.", + "Yes": "Igen", + "No": "Nem", + "{label} (required)": "{label} (kötelező)", + "{label} is required": "{label} kitöltése kötelező", + "Project field": "Projektmező", + "A field an admin adds to every project, such as a policy area or a contract value.": "Egy mező, amelyet egy adminisztrátor minden projekthez hozzáad, például szakpolitikai terület vagy szerződéses érték.", + "Key": "Kulcs", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Az állandó név, amely alatt az érték tárolódik, lower camel case formában. Tartsd meg, ha projektek használják.", + "Label": "Címke", + "The name people see next to the field": "A mező mellett látható név", + "What the field holds": "Mit tartalmaz a mező", + "Text": "Szöveg", + "Number": "Szám", + "Choice": "Választás", + "Person": "Személy", + "Yes or no": "Igen vagy nem", + "Options": "Lehetőségek", + "The choices of a choice field": "Egy választómező lehetőségei", + "Required": "Kötelező", + "Whether a project must fill in the field": "Ki kell-e töltenie a projektnek a mezőt", + "Where the field appears, lowest first": "Hol jelenik meg a mező, a legkisebb elöl", + "Applies to": "Vonatkozik", + "What the field is added to": "Mihez adják a mezőt", + "Custom fields": "Saját mezők", + "The values of the project fields an admin defined, keyed by the field's key.": "Az adminisztrátor által megadott projektmezők értékei a mező kulcsa szerint.", + "Project fields": "Projektmezők", + "Related": "Kapcsolódó", + "Remove link": "Kapcsolat eltávolítása", + "Link type": "Kapcsolat típusa", + "Relates to": "Kapcsolódik ehhez", + "Duplicates": "Megkettőzi", + "Project key": "Projektkulcs", + "Every task number starts with it, such as VERG-42.": "Minden feladatszám ezzel kezdődik, például VERG-42.", + "This key is already used by another project.": "Ezt a kulcsot már egy másik projekt használja.", + "Use 2 to 10 letters and digits, starting with a letter.": "Használjon 2–10 betűt és számjegyet, betűvel kezdve.", + "The key cannot change once tasks carry it.": "A kulcs nem változhat, ha már feladatok viselik.", + "Project saved. The existing tasks get their numbers in the background.": "A projekt mentve. A meglévő feladatok a háttérben kapják meg a számukat.", + "Next task number": "Következő feladatszám", + "The number the next task of this project gets in its key. Only the system writes it.": "A szám, amelyet a projekt következő feladata a kulcsában kap. Csak a rendszer írja.", + "Restore {title}": "{title} visszaállítása", + "Restore": "Visszaállítás", + "Project restored": "A projekt visszaállítva", + "Could not restore the project": "A projektet nem sikerült visszaállítani", + "Bring this project back to the active list.": "A projekt visszakerül az aktív projektek listájába.", + "Restore project": "Projekt visszaállítása", + "Request reason": "A kérés indoka", + "Why the requester needs this project. Filled in when the project is requested.": "Miért van szüksége a kérelmezőnek erre a projektre. A kérésnél kell kitölteni.", + "Reviewed by": "Elbírálta", + "The user who approved or rejected the request.": "A felhasználó, aki jóváhagyta vagy elutasította a kérést.", + "Reviewed at": "Elbírálás ideje", + "When the request was approved or rejected.": "Mikor hagyták jóvá vagy utasították el a kérést.", + "Review note": "Elbírálói megjegyzés", + "The reviewer's reason, shown to the requester when a request is not approved.": "Az elbíráló indoka, amelyet a kérelmező lát, ha a kérést nem hagyják jóvá.", + "Members of these groups": "Ezeknek a csoportoknak a tagjai", + "Groups that may create projects": "Csoportok, amelyek projektet hozhatnak létre", + "The group {group} no longer exists. Save to remove it.": "A(z) {group} csoport már nem létezik. Mentse el az eltávolításhoz.", + "Review project request": "Projektkérés elbírálása", + "Requested by": "Kérte", + "Why it is needed": "Miért van rá szükség", + "Desired start date": "Kívánt kezdő dátum", + "Why is it not approved?": "Miért nincs jóváhagyva?", + "Give a reason. The requester sees it.": "Adjon meg indokot. A kérelmező látni fogja.", + "Approve": "Jóváhagyás", + "Reject": "Elutasítás", + "Reject request": "Kérés elutasítása", + "The review was not saved. Try again.": "Az elbírálás nem mentődött. Próbálja újra.", + "This project is waiting for review": "Ez a projekt elbírálásra vár", + "This request was not approved": "Ezt a kérést nem hagyták jóvá", + "Reason: {note}": "Indok: {note}", + "Review request": "Kérés elbírálása", + "Request a project": "Projekt kérése", + "Step {step} of 2": "{step}. lépés a 2-ből", + "Why is this project needed?": "Miért van szükség erre a projektre?", + "Give a reason. The reviewer reads it.": "Adjon meg indokot. Az elbíráló elolvassa.", + "Back": "Vissza", + "Next": "Tovább", + "Send request": "Kérés küldése", + "The request was not sent. Try again.": "A kérés nem ment el. Próbálja újra.", + "Requested": "Kérve", + "Not approved": "Nincs jóváhagyva", + "Your request was sent": "A kérését elküldtük", + "Let everyone else request a project": "Mindenki más kérhet projektet", + "Add a task": "Feladat hozzáadása", + "Delete task": "Feladat törlése", + "Edit task": "Feladat szerkesztése", + "Write": "Írás", + "Preview": "Előnézet", + "Markdown works here: headings, lists and links.": "Itt működik a Markdown: címsorok, listák és hivatkozások.", + "Could not save the task. Please try again.": "A feladatot nem sikerült menteni. Próbálja újra.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "A(z) \"{title}\" feladaton rögzített idő van, ezért nem törölhető. Helyette visszavonhatja: az időbejegyzések megmaradnak.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Törli a(z) \"{title}\" feladatot? A más feladatokra mutató kapcsolatai is törlődnek. Ez nem vonható vissza.", + "Keep task": "Feladat megtartása", + "Cancel task": "Feladat visszavonása", + "Only the reporter, the project owner or an admin can delete this task.": "Ezt a feladatot csak a bejelentő, a projekt tulajdonosa vagy egy rendszergazda törölheti.", + "Could not delete the task. Please try again.": "A feladatot nem sikerült törölni. Próbálja újra.", + "Could not cancel the task. Please try again.": "A feladatot nem sikerült visszavonni. Próbálja újra.", + "Responsible": "Felelős", + "Also working on this": "Szintén dolgoznak rajta", + "Labels": "Címkék", + "Could not change the priority. Please try again.": "A prioritást nem sikerült módosítani. Próbálja újra.", + "Other project members who work on this task alongside the person responsible.": "A projekt további tagjai, akik a felelőssel együtt dolgoznak ezen a feladaton.", + "Duplicate": "Másolat készítése", + "Could not copy the task. Please try again.": "A feladatot nem sikerült másolni. Próbálja újra.", + "Subtasks": "Részfeladatok", + "{done} of {total} done": "{done} / {total} kész", + "Add a subtask": "Részfeladat hozzáadása", + "Checklist": "Ellenőrzőlista", + "Checklist item actions": "Listaelem műveletei", + "Add a checklist item": "Listaelem hozzáadása", + "Subtasks: {estimate} estimated, {logged} logged": "Részfeladatok: {estimate} becsült, {logged} rögzített", + "Total estimate: {total}": "Teljes becslés: {total}", + "Part of {title}": "A(z) {title} része", + "Checklist: {count} done": "Ellenőrzőlista: {count} kész", + "This task has subtasks: {count}.": "Ennek a feladatnak részfeladatai vannak: {count}.", + "Keep subtasks as separate tasks": "Részfeladatok megtartása különálló feladatként", + "Delete subtasks too": "Részfeladatok törlése is", + "Copy of {title}": "Másolat: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "A feladat másolása megtörtént, de nem az összes részfeladaté. Ellenőrizze a másolatot.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Kis lépések a feladaton belül. Minden elemnek van azonosítója, szövege és jelzése, hogy kész-e.", + "Open work per person and per project.": "Nyitott munka személyenként és projektenként.", + "View": "Nézet", + "By person": "Személyenként", + "By project": "Projektenként", + "Hours left": "Hátralévő órák", + "Tasks without an estimate": "Becslés nélküli feladatok", + "Due in 14 days": "14 napon belül esedékes", + "Shared": "Megosztott", + "Unassigned": "Nincs hozzárendelve", + "{hours} h": "{hours} ó", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "A látható projektek munkája jelenik meg. Az órák a felelős személyhez számítanak; a megosztott feladatok órák nélkül számítanak.", + "No open work in these projects.": "Ezekben a projektekben nincs nyitott munka.", + "Open work": "Nyitott munka", + "{count} open tasks": "{count} nyitott feladat", + "Create a project to see capacity here.": "Hozzon létre egy projektet, hogy itt lássa a kapacitást.", + "My tasks": "Saját feladataim", + "Show all my tasks": "Összes saját feladatom mutatása", + "No tasks assigned to you": "Nincs önhöz rendelt feladat", + "Browse projects": "Projektek böngészése", + "Later": "Később", + "Due {date}": "Határidő: {date}", + "Could not change the status. Please try again.": "Az állapotot nem sikerült módosítani. Próbálja újra.", + "Completed today": "Ma befejezett", + "My open tasks": "Nyitott feladataim", + "My overdue tasks": "Lejárt feladataim", + "My tasks in progress": "Folyamatban lévő feladataim", + "Pin to the top": "Kitűzés felülre", + "Unpin": "Kitűzés megszüntetése", + "Pinned": "Kitűzve", + "Actions for {title}": "Műveletek: {title}", + "Could not save your project order. Please try again.": "A projektek sorrendjét nem sikerült menteni. Próbálja újra.", + "No boards yet": "Még nincsenek táblák", + "Create a project to get a board.": "Hozzon létre egy projektet, hogy táblája legyen.", + "Use the Projects page to create and manage your projects and tasks.": "A Projektek oldalon hozhatja létre és kezelheti projektjeit és feladatait.", + "Go to projects": "Ugrás a projektekhez", + "You are not a member of any projects yet.": "Még egyetlen projektnek sem tagja.", + "Could not search for users. Please try again.": "A felhasználók keresése nem sikerült. Próbálja újra.", + "Project creation is restricted to administrators.": "Projektet csak rendszergazdák hozhatnak létre.", + "Only the project owner or an administrator can delete this project.": "Ezt a projektet csak a projekt tulajdonosa vagy egy rendszergazda törölheti.", + "No projects are available to you yet. Ask an administrator to create one.": "Még nincs elérhető projektje. Kérjen meg egy rendszergazdát, hogy hozzon létre egyet.", + "Due: {date}": "Határidő: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "A kezdő dátummal vagy határidővel rendelkező feladatok megjelennek az idővonalon. Adjon meg dátumokat, hogy itt lássa őket.", + "You do not have access to this project.": "Nincs hozzáférése ehhez a projekthez.", + "Zoom level": "Nagyítási szint", + "Unscheduled": "Ütemezetlen", + "Start: {date}": "Kezdés: {date}", + "Today": "Ma", + "No scheduled tasks": "Nincsenek ütemezett feladatok", + "An unexpected error occurred.": "Váratlan hiba történt.", + "Column {number} name": "A(z) {number}. oszlop neve", + "Failed to save creation policy": "A létrehozási szabályt nem sikerült menteni", + "All authenticated users": "Minden bejelentkezett felhasználó", + "Control who may create new projects": "Határozza meg, ki hozhat létre új projekteket", + "Administrators only": "Csak rendszergazdák", + "Project creation": "Projektek létrehozása", + "Allow project creation": "Projektek létrehozásának engedélyezése", + "Creation policy saved successfully": "A létrehozási szabály mentve", + "Initializing…": "Indítás…", + "e.g. 2h 30m, 90m, 1.5h": "pl. 2h 30m, 90m, 1.5h", + "Log time": "Idő rögzítése", + "Save estimate": "Becslés mentése", + "Logged: {logged}": "Rögzítve: {logged}", + "over by {amount}": "{amount} túllépés", + "Time tracking": "Időkövetés", + "Estimate": "Becslés", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Adjon meg érvényes becslést (pl. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Adjon meg érvényes időtartamot (pl. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Az időbejegyzést nem sikerült menteni. Próbálja újra.", + "Edit time entry": "Időbejegyzés szerkesztése", + "Duration": "Időtartam", + "Date range": "Időszak", + "Last week": "Múlt hét", + "No time logged": "Nincs rögzített idő", + "Log time on a task to see it here.": "Rögzítsen időt egy feladaton, hogy itt lássa.", + "To date": "Záró dátum", + "This week": "Ez a hét", + "Total: {total}": "Összesen: {total}", + "From date": "Kezdő dátum", + "Custom range": "Egyéni időszak", + "All time": "Teljes idő", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Egy feladatot nem sikerült törölni, ezért adatok maradhattak. Törölje újra a projektet.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Egy időbejegyzést nem sikerült törölni, ezért adatok maradhattak. Törölje újra a projektet.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Egy oszlopot nem sikerült törölni, ezért adatok maradhattak. Törölje újra a projektet.", + "Could not delete the project. Please try again.": "A projektet nem sikerült törölni. Próbálja újra.", + "Notification settings": "Értesítési beállítások", + "Configure when due-date reminders are sent": "Adja meg, mikor küldjön a rendszer határidő-emlékeztetőt", + "Due-date reminder lead time (hours)": "Emlékeztető előtti idő (óra)", + "Lead time must be between 1 and 336 hours": "Az időnek 1 és 336 óra között kell lennie", + "Reminder lead time saved successfully": "Az emlékeztető ideje mentve", + "Failed to save reminder lead time": "Az emlékeztető idejét nem sikerült menteni", + "Notifications": "Értesítések", + "Notify me 1 day before a task's due date": "Értesítsen 1 nappal egy feladat határideje előtt", + "Draft": "Vázlat", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Az óra csak a tanára által látható vázlat, megtartják, vagy elmarad.", + "New release": "Új kiadás", + "Roadmap chart. The same releases and epics are listed below.": "Ütemterv-diagram. Ugyanezek a kiadások és epikek lent listában is szerepelnek.", + "Nothing on the roadmap yet": "Az ütemterven még nincs semmi", + "Releases with a target date and epics with dated tasks appear here.": "Itt jelennek meg a céldátummal rendelkező kiadások és a dátumozott feladatokkal rendelkező epikek.", + "Releases": "Kiadások", + "No releases yet": "Még nincsenek kiadások", + "Target date: {date}": "Céldátum: {date}", + "No target date": "Nincs céldátum", + "Edit {name}": "{name} szerkesztése", + "Mark {name} as released": "{name} megjelölése kiadottként", + "Mark as released": "Megjelölés kiadottként", + "Epics": "Epikek", + "No epics yet. Open a task to make it an epic.": "Még nincsenek epikek. Nyisson meg egy feladatot, hogy epikké tegye.", + "Not scheduled yet": "Még nincs ütemezve", + "Planned": "Tervezett", + "Released": "Kiadva", + "Edit release": "Kiadás szerkesztése", + "Target date": "Céldátum", + "Could not save the release. Please try again.": "A kiadást nem sikerült menteni. Próbálja újra.", + "Every task of this release is done or cancelled.": "A kiadás minden feladata kész vagy megszakítva.", + "Not finished yet: {count}": "Még nincs kész: {count}", + "What happens to these tasks?": "Mi történjen ezekkel a feladatokkal?", + "Move to {name}": "Áthelyezés ide: {name}", + "Remove the release": "A kiadás eltávolítása", + "Keep it on {name}": "Maradjanak itt: {name}", + "Could not mark the release as released. Please try again.": "A kiadást nem sikerült kiadottként megjelölni. Próbálja újra.", + "Roadmap": "Ütemterv", + "Tasks or roadmap": "Feladatok vagy ütemterv", + "Release": "Kiadás", + "Epic": "Epik", + "This task is an epic": "Ez a feladat epik", + "A named, dated delivery of a project that its tasks are planned against.": "Egy projekt elnevezett, dátumozott szállítása, amelyre a feladatait tervezik.", + "Name of the release": "A kiadás neve", + "The project this release belongs to": "A projekt, amelyhez ez a kiadás tartozik", + "What this release delivers": "Mit szállít ez a kiadás", + "When work on the release starts": "Mikor kezdődik a munka a kiadáson", + "The date the release is due": "A dátum, amikorra a kiadásnak el kell készülnie", + "Whether the release is planned, released or archived": "A kiadás tervezett, kiadott vagy archivált", + "Released on": "Kiadva ekkor", + "When the release was marked as released": "Mikor jelölték a kiadást kiadottként", + "The release this task is planned for": "A kiadás, amelyre ez a feladat tervezve van", + "Board view options": "Tábla nézetbeállításai", + "Colour cards": "Kártyák színezése", + "No colour": "Nincs szín", + "By label": "Címke szerint", + "Swimlanes": "Sávok", + "No swimlanes": "Nincsenek sávok", + "By assignee": "Felelős szerint", + "By epic": "Epic szerint", + "No assignee": "Nincs felelős", + "No epic": "Nincs epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "A kártyák az epicjük sorában maradnak. Az epicet a feladat oldalán módosíthatja.", + "Hand over to": "Átadás neki", + "Could not save your board view. It applies until you reload.": "A tábla nézetét nem sikerült menteni. Az újratöltésig érvényes.", + "Timetable wish": "Órarendi kívánság", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Kívánság, amelyet a generátor figyelembe vesz. A kötelezőt mindig betartja, a rugalmasat, ahol tudja.", + "Whether the wish is about a teacher, a group, a room or one activity": "A kívánság tanárra, csoportra, teremre vagy egy foglalkozásra vonatkozik", + "Teacher": "Tanár", + "Group": "Csoport", + "Reference": "Hivatkozás", + "The user, group, room or activity the wish is about": "A felhasználó, csoport, terem vagy foglalkozás, amelyre a kívánság vonatkozik", + "What the wish asks for": "Mit kér a kívánság", + "Not on these periods": "Ne ezekben az órákban", + "Preferably not on these periods": "Lehetőleg ne ezekben az órákban", + "At most a number of lessons a day": "Legfeljebb adott számú óra naponta", + "No free periods between lessons": "Nincs lyukasóra az órák között", + "Always the same room": "Mindig ugyanaz a terem", + "Periods": "Órák", + "The periods of the week the wish is about, such as wed-5": "A hét órái, amelyekre a kívánság vonatkozik, pl. wed-5", + "Limit": "Korlát", + "The most lessons a day, for a wish of that kind": "A napi legtöbb óra, ilyen fajta kívánságnál", + "Strength": "Erősség", + "Whether the generator must keep the wish or should keep it": "A generátornak be kell-e tartania a kívánságot, vagy csak illene", + "Hard": "Kötelező", + "Soft": "Rugalmas", + "Weight": "Súly", + "How much a soft wish counts, from 1 to 3": "Mennyit számít egy rugalmas kívánság, 1-től 3-ig", + "Why the wish exists": "Miért van a kívánság", + "Timetable scenario": "Órarendi forgatókönyv", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Egy heti minta, amelyet a generátor készített vagy a jelenlegi órarendből vettünk. Megőrzi a bemenetét és azt, mennyire tartja be a kívánságokat.", + "The name timetablers know the scenario by": "A név, amelyen az órarendkészítők ismerik a forgatókönyvet", + "Whether the generator made it or it came from the current timetable": "A generátor készítette, vagy a jelenlegi órarendből származik", + "Generated": "Generált", + "From the current timetable": "A jelenlegi órarendből", + "Week of": "Hét kezdete", + "The Monday of the first week of the window": "Az időszak első hetének hétfője", + "Window start": "Időszak kezdete", + "The first day the week pattern applies to": "Az első nap, amelyre a heti minta vonatkozik", + "Window end": "Időszak vége", + "The last day the week pattern applies to": "Az utolsó nap, amelyre a heti minta vonatkozik", + "Waiting, generating, done, failed, or published as draft lessons": "Várakozik, készül, kész, sikertelen vagy piszkozatórákként közzétéve", + "Waiting": "Várakozik", + "Generating": "Készül", + "Failed": "Sikertelen", + "Published": "Közzétéve", + "Seed": "Kezdőérték", + "The number the generator starts from, so a run can be repeated": "A szám, amelyről a generátor indul, hogy egy futás megismételhető legyen", + "Input": "Bemenet", + "The periods, rooms, lessons and wishes the scenario was made from": "Az órák, termek, foglalkozások és kívánságok, amelyekből a forgatókönyv készült", + "Placements": "Elhelyezések", + "Each lesson with the period and room it was given": "Minden foglalkozás a kapott órával és teremmel", + "Unplaced lessons": "Elhelyezetlen foglalkozások", + "Lessons without a place, each with the hard wish that blocked it": "Hely nélküli foglalkozások, mindegyik a kötelező kívánsággal, amely megakadályozta", + "Broken wishes": "Megszegett kívánságok", + "The wishes this scenario breaks, with the lessons that break them": "A kívánságok, amelyeket ez a forgatókönyv megszeg, a megszegő foglalkozásokkal", + "Measures": "Mérőszámok", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Elhelyezett foglalkozások, megszegett kívánságok, tanári lyukasórák, napi órák és teremhasználat", + "Reason": "Ok", + "Why the run failed": "Miért volt sikertelen a futás", + "Published at": "Közzétéve", + "When the scenario was written out as draft lessons": "Mikor íródott ki a forgatókönyv piszkozatórákként", + "Edit wish": "Kívánság szerkesztése", + "New wish": "Új kívánság", + "Hard: the generator always keeps it": "Kötelező: a generátor mindig betartja", + "Soft: the generator keeps it where it can": "Rugalmas: a generátor betartja, ahol tudja", + "Weight (1 to 3)": "Súly (1-től 3-ig)", + "Most lessons a day": "Legfeljebb ennyi óra naponta", + "Period": "Óra", + "{day} period {number}": "{day} {number}. óra", + "Teacher (user name)": "Tanár (felhasználónév)", + "Activity (group:subject)": "Tevékenység (csoport:tantárgy)", + "Say who or what the wish is about.": "Adja meg, kire vagy mire vonatkozik a kívánság.", + "Choose at least one period.": "Válasszon legalább egy órát.", + "The limit is a whole number of 1 or more.": "A korlát legalább 1 egész szám.", + "Timetable": "Órarend", + "Wishes": "Kívánságok", + "Timetable wishes": "Órarendi kívánságok", + "Generator run": "Generátorfuttatás", + "Generator progress": "A generátor haladása", + "The run failed: {reason}": "A futtatás sikertelen: {reason}", + "{placed} of {lessons} lessons placed": "{lessons} órából {placed} elhelyezve", + "Generate again": "Újragenerálás", + "Generate": "Generálás", + "Every lesson has a place.": "Minden órának van helye.", + "Lesson": "Óra", + "No free period and room": "Nincs szabad óra és terem", + "Broken soft wishes": "Megsértett rugalmas kívánságok", + "Every soft wish is kept.": "Minden rugalmas kívánság teljesül.", + "Wish": "Kívánság", + "Lessons": "Órák", + "Generating: {percent}% of the time budget used": "Generálás: az idő {percent}%-a elhasználva", + "Waiting to start": "Indításra vár", + "Published as draft lessons": "Óratervezetként közzétéve", + "Could not read the scenario.": "A forgatókönyv nem olvasható.", + "Could not start the run.": "A futtatás nem indítható.", + "Scenarios": "Forgatókönyvek", + "Timetable scenarios": "Órarendi forgatókönyvek", + "Scenario": "Forgatókönyv", + "Take the current timetable": "Jelenlegi órarend átvétele", + "Could not take the current timetable.": "Nem sikerült átvenni a jelenlegi órarendet.", + "Broken hard wishes": "Megszegett kötelező kívánságok", + "Not on a period of the week grid": "Nem a heti rács egy óráján van", + "Compare scenarios": "Forgatókönyvek összehasonlítása", + "Scenarios to compare": "Összehasonlítandó forgatókönyvek", + "Choose two or three scenarios to compare them.": "Válasszon két vagy három forgatókönyvet az összehasonlításhoz.", + "Measure": "Mérőszám", + "Best": "Legjobb", + "Lessons that differ": "Eltérő órák", + "No lesson differs.": "Egyik óra sem tér el.", + "Not placed": "Nincs elhelyezve", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Elhelyezett órák", + "Lessons without a place": "Hely nélküli órák", + "Clashes": "Ütközések", + "Hard wishes broken": "Megsértett kötelező kívánságok", + "Soft wishes broken": "Megsértett rugalmas kívánságok", + "Soft wishes broken, weighted": "Megsértett rugalmas kívánságok, súlyozva", + "Free periods between lessons, all teachers": "Lyukasórák, minden tanár", + "Most free periods of one teacher": "Egy tanár legtöbb lyukasórája", + "Most lessons of one group on a day": "Egy csoport legtöbb órája egy napon", + "Room use": "Teremkihasználtság", + "Publish as draft lessons": "Közzététel óratervezetként", + "Draft lessons written: {count}": "Megírt óratervezetek: {count}", + "Could not publish the scenario.": "Nem sikerült közzétenni a forgatókönyvet.", + "Rules": "Szabályok", + "Rules for {column}": "{column} szabályai", + "When a card enters this column": "Amikor egy kártya ebbe az oszlopba kerül", + "Action": "Művelet", + "Set the priority": "Prioritás beállítása", + "Assign to": "Hozzárendelés", + "Assign the person who moved the card": "Hozzárendelés ahhoz, aki a kártyát áthelyezte", + "Remove the assignee": "Felelős eltávolítása", + "Add a label": "Címke hozzáadása", + "No longer a project member": "Már nem tagja a projektnek", + "This label no longer exists": "Ez a címke már nem létezik", + "Add rule": "Szabály hozzáadása", + "Remove rule": "Szabály eltávolítása", + "No rules yet. Add one to change a card when it enters this column.": "Még nincsenek szabályok. Adjon hozzá egyet, hogy a kártya megváltozzon, amikor ebbe az oszlopba kerül.", + "Could not save the rules. Please try again.": "A szabályokat nem sikerült menteni. Próbálja újra.", + "1 rule runs when a card enters this column": "1 szabály fut le, amikor egy kártya ebbe az oszlopba kerül", + "{count} rules run when a card enters this column": "{count} szabály fut le, amikor egy kártya ebbe az oszlopba kerül", + "Rules applied: {changes}": "Alkalmazott szabályok: {changes}", + "assigned to {name}": "felelős: {name}", + "assignee removed": "felelős eltávolítva", + "priority {priority}": "prioritás: {priority}", + "label {label}": "címke: {label}", + "What happens to a card when it enters this column, applied in list order.": "Mi történik egy kártyával, amikor ebbe az oszlopba kerül, a lista sorrendjében.", + "Value": "Érték", + "What the rule does to the card.": "Mit tesz a szabály a kártyával.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "A prioritás, a felhasználói azonosító vagy a címkeazonosító, amelyet a művelet használ; érték nélküli műveleteknél üres.", + "is not": "nem", + "{dimension} is not": "{dimension} nem", + "Saved filters": "Mentett szűrők", + "No saved filters yet": "Még nincsenek mentett szűrők", + "Save filter": "Szűrő mentése", + "Rename \"{name}\"": "„{name}” átnevezése", + "Delete \"{name}\"": "„{name}” törlése", + "Clear filters": "Szűrők törlése", + "Showing {shown} of {total} tasks": "{shown} / {total} feladat látható", + "Me": "Én", + "No date": "Nincs dátum", + "Rename saved filter": "Mentett szűrő átnevezése", + "Share with the project": "Megosztás a projekttel", + "Give the filter a name": "Adjon nevet a szűrőnek", + "Could not save the filter. Please try again.": "A szűrőt nem sikerült menteni. Próbálja újra.", + "Some labels in \"{name}\" no longer exist and were left out.": "A(z) „{name}” néhány címkéje már nem létezik, ezért kimaradt.", + "Could not delete the filter. Please try again.": "A szűrőt nem sikerült törölni. Próbálja újra.", + "Saved filter": "Mentett szűrő", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Egy projekt elnevezett táblaszűrője, csak a mentője látja, hacsak nincs megosztva a projekttel.", + "The project whose board the filter applies to": "A projekt, amelynek tábláján a szűrő működik", + "The name the filter is listed under": "A név, amelyen a szűrő a listában szerepel", + "Saved by": "Mentette", + "Nextcloud user id of the person who saved the filter": "A szűrőt mentő személy Nextcloud-felhasználói azonosítója", + "Shared with the project": "Megosztva a projekttel", + "Whether every project member sees and applies the filter": "Látja-e és alkalmazhatja-e a szűrőt minden projekttag", + "Criteria": "Feltételek", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "A szűrő: felelős, címke, prioritás és határidő, mindegyik egyenlő vagy nem egyenlő feltétellel és értékekkel", + "Cross-project view": "Projekteken átívelő nézet", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Projektek mentett válogatása, amelyek feladatai együtt jelennek meg állapot szerinti sávokban, megosztva a megnevezett személyekkel.", + "Shared with": "Megosztva", + "The name the view is listed under": "A név, amelyen a nézet szerepel", + "Nextcloud user id of the person who saved the view": "A nézetet mentő személy Nextcloud felhasználói azonosítója", + "Nextcloud user ids of the people the view is shared with": "Azon személyek Nextcloud felhasználói azonosítói, akikkel a nézet meg van osztva", + "The projects whose tasks the view shows, at most twenty": "A projektek, amelyek feladatait a nézet mutatja, legfeljebb húsz", + "1 project in this view is hidden from you.": "A nézet 1 projektje rejtve van előled.", + "{count} projects in this view are hidden from you.": "A nézet {count} projektje rejtve van előled.", + "{project} has no column for {status}.": "A(z) {project} projektnek nincs oszlopa ehhez: {status}.", + "This view does not exist or is not shared with you.": "Ez a nézet nem létezik, vagy nincs megosztva veled.", + "\"{task}\" moved to {status}.": "\"{task}\" áthelyezve ide: {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Projekteken átívelő nézetek", + "New view": "Új nézet", + "Edit view": "Nézet szerkesztése", + "Delete view": "Nézet törlése", + "Give the view a name": "Adj nevet a nézetnek", + "Pick at least one project": "Válassz legalább egy projektet", + "A view shows at most {max} projects": "Egy nézet legfeljebb {max} projektet mutat", + "Could not save the view. Please try again.": "A nézetet nem sikerült menteni. Próbáld újra.", + "Could not delete the view. Please try again.": "A nézetet nem sikerült törölni. Próbáld újra.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Törlöd: \"{title}\"? A projektek és feladataik változatlanok maradnak.", + "People see the tasks of the projects they are in, never more.": "Mindenki csak azoknak a projekteknek a feladatait látja, amelyekben benne van.", + "No views yet. A view shows the tasks of several of your projects together.": "Még nincs nézet. Egy nézet több projekted feladatait mutatja együtt.", + "Projects in view: {count}": "Projektek a nézetben: {count}", + "Notify me when a task is assigned to me": "Értesíts, ha feladatot kapok", + "Also send these to me by email": "Küldd el ezeket e-mailben is", + "Add an email address in your Nextcloud personal settings to get mail.": "E-mailek fogadásához adj meg e-mail-címet a Nextcloud személyes beállításaiban.", + "Code link": "Kódhivatkozás", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Egy kódplatformon lévő commit, ág, egyesítési kérés vagy hibajegy, amely egy feladathoz kapcsolódik.", + "The task the link belongs to": "A feladat, amelyhez a hivatkozás tartozik", + "The project of the task": "A feladat projektje", + "Task key": "Feladatkulcs", + "The task key the forge text named, such as VC-12": "A kódplatform szövegében szereplő feladatkulcs, például VC-12", + "What the link points at": "Mire mutat a hivatkozás", + "Link": "Hivatkozás", + "The address of the item in the forge": "Az elem címe a kódplatformon", + "The commit message, branch name or merge request title": "A commit üzenete, az ág neve vagy az egyesítési kérés címe", + "Repository": "Tároló", + "The repository, such as acme/portal": "A tároló, például acme/portal", + "Forge id": "Azonosító a platformon", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Az elem saját azonosítója a kódplatformon, például github:acme/portal#42 vagy egy commit-hash", + "State": "Állapot", + "The state of a merge request or issue": "Egy egyesítési kérés vagy hibajegy állapota", + "Who made the commit or opened the merge request": "Ki készítette a commitot vagy nyitotta az egyesítési kérést", + "When the commit was made or the merge request last changed": "Mikor készült a commit vagy változott utoljára az egyesítési kérés", + "Added by": "Hozzáadta", + "Whether a person added the link or the integration wrote it": "Egy személy adta-e hozzá a hivatkozást, vagy az integráció írta", + "Nextcloud user UIDs of project members": "A projekttagok Nextcloud-felhasználóazonosítói", + "Add link": "Hivatkozás hozzáadása", + "Added by hand": "Kézzel hozzáadva", + "Branch": "Ág", + "Code": "Kód", + "Commit": "Commit", + "From the integration": "Az integrációból", + "Link to a commit, branch or merge request": "Hivatkozás commitra, ágra vagy egyesítési kérésre", + "Merge request": "Egyesítési kérés", + "Merged": "Egyesítve", + "No code linked yet. Name {key} in a commit message or paste a link.": "Még nincs kód hozzákapcsolva. Írja be a(z) {key} kulcsot egy commit üzenetébe, vagy illesszen be egy hivatkozást.", + "No code linked yet. Paste a link to a commit or merge request.": "Még nincs kód hozzákapcsolva. Illesszen be egy hivatkozást egy commitra vagy egyesítési kérésre.", + "Paste a web address that starts with https://.": "Illesszen be egy https:// kezdetű webcímet.", + "Remove link {title}": "A(z) {title} hivatkozás eltávolítása", + "The link could not be added.": "A hivatkozást nem sikerült hozzáadni.", + "The link could not be removed.": "A hivatkozást nem sikerült eltávolítani.", + "This link is already on the task.": "Ez a hivatkozás már a feladaton van.", + "Code forges": "Kódplatformok", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Kapcsolja a GitHub commitjait és pull requestjeit feladatokhoz. Az Integriq fogadja az eseményeket; a planninq sosem hívja a GitHubot.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Töltse le a konfigurációt, és importálja az Integriqbe. Ezután adjon meg egy titkot a \"Check the GitHub signature\" szabályban.", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "A GitHubban adjon a tárolóhoz webhookot ezzel a címmel és ugyanazzal a titokkal. Válassza az application/json tartalomtípust és a push és pull request eseményeket:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Írja a feladatkulcsot, például VC-12, egy commit üzenetébe, egy ág nevébe vagy egy pull request címébe. A hivatkozás ekkor megjelenik annál a feladatnál.", + "Without Integriq, project members can still paste a link on the task page.": "Integriq nélkül a projekttagok továbbra is beilleszthetnek hivatkozást a feladat oldalán.", + "Download the Integriq configuration": "Az Integriq-konfiguráció letöltése", + "Calendar": "Naptár", + "Previous": "Előző", + "Calendar view": "Naptárnézet", + "Starts:": "Kezdés:", + "No tasks with a date in this month.": "Ebben a hónapban nincs dátummal rendelkező feladat.", + "Week of {start} to {end}": "Hét: {start} – {end}", + "My calendar": "Saját naptár", + "Show as list": "Megjelenítés listaként", + "Show as calendar": "Megjelenítés naptárként", + "Open my calendar": "Saját naptár megnyitása", + "Nextcloud Tasks": "Nextcloud Feladatok", + "Show my tasks in Nextcloud Tasks": "A feladataim megjelenítése a Nextcloud Feladatokban", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "A neked kiosztott vagy veled megosztott feladatok egy \"Planninq\" listában jelennek meg a Nextcloud Feladatokban és Naptárban. Az ott végzett módosításokat a Planninq következő módosítása felülírja.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ez a kiszolgáló nem tud írni a Nextcloud Feladatokba, ezért az exportálás nem érhető el.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "A Planninq kezeli. Az itt végzett módosításokat a Planninq következő módosítása felülírja.", + "Working days and holidays": "Munkanapok és ünnepnapok", + "Dates set on the timeline skip the days that are not working days.": "Az idővonalon beállított dátumok kihagyják a nem munkanapokat.", + "Working weekdays": "A hét munkanapjai", + "Non-working days": "Munkaszüneti napok", + "No non-working days yet.": "Még nincsenek munkaszüneti napok.", + "Add day": "Nap hozzáadása", + "Year": "Év", + "Add Dutch national holidays": "Holland nemzeti ünnepek hozzáadása", + "Save working days": "Munkanapok mentése", + "Choose at least one working weekday.": "Válassz legalább egy munkanapot.", + "Working days saved.": "Munkanapok mentve.", + "Could not save the working days.": "A munkanapokat nem sikerült menteni.", + "New Year's Day": "Újév", + "Easter Sunday": "Húsvétvasárnap", + "Easter Monday": "Húsvéthétfő", + "King's Day": "Királynap", + "Liberation Day": "A felszabadulás napja", + "Ascension Day": "Áldozócsütörtök", + "Whit Sunday": "Pünkösdvasárnap", + "Whit Monday": "Pünkösdhétfő", + "Christmas Day": "Karácsony", + "Boxing Day": "Karácsony másnapja", + "Dates of {title}": "{title} dátumai", + "The due date cannot be before the start date.": "A határidő nem lehet a kezdő dátum előtt.", + "{title}, from {start} to {end}": "{title}, {start} – {end}", + "The dates could not be saved.": "A dátumokat nem sikerült menteni.", + "{title} now runs from {start} to {end}": "{title} mostantól {start} – {end}", + "Auto-scheduling": "Automatikus ütemezés", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Ha be van kapcsolva, egy határidő késleltetése az idővonalon felajánlja az általa blokkolt feladatok eltolását is.", + "Move blocked tasks along when a task slips": "Blokkolt feladatok eltolása, ha egy feladat csúszik", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Az idővonalon egy későbbi határidő felajánlja a blokkolt feladatok eltolását. Csak a \"blokkolja\" kapcsolatok számítanak, és a feladatok csak későbbre tolódnak.", + "Move the tasks that wait for {title}?": "Eltolod a(z) {title} feladatra váró feladatokat?", + "These tasks wait for it and would start after its new due date:": "Ezek a feladatok rá várnak, és az új határidő után kezdődnének:", + "{count} tasks would move; the first {limit} are listed.": "{count} feladat tolódna el; az első {limit} látható.", + "Now": "Most", + "After the move": "Az eltolás után", + "Only this task": "Csak ez a feladat", + "Move all": "Összes eltolása", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Megállt ennél: {title}: a dátumokat nem sikerült menteni. Az előtte lévő feladatok eltolódtak.", + "Cumulative flow": "Kumulatív áramlás", + "Show as chart": "Megjelenítés diagramként", + "Show as table": "Megjelenítés táblázatként", + "Tasks per column per day": "Feladatok oszloponként naponta", + "Tasks without recorded history in this period: {count}": "Rögzített előzmények nélküli feladatok ebben az időszakban: {count}", + "Lead and cycle time": "Átfutási idő és ciklusidő", + "No tasks were finished in this period.": "Ebben az időszakban egy feladat sem fejeződött be.", + "Finished tasks": "Befejezett feladatok", + "Cycle time, average": "Ciklusidő, átlag", + "Cycle time, 85th percentile": "Ciklusidő, 85. percentilis", + "Lead time, average": "Átfutási idő, átlag", + "Tasks whose finish time was estimated from their history: {count}": "Feladatok, amelyek befejezési idejét az előzményekből becsültük: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Minden befejezett feladat ciklusideje az átlaggal és a 85. percentilissel", + "Slowest tasks": "Leglassabb feladatok", + "cycle {cycle}, lead {lead}": "ciklus {cycle}, átfutás {lead}", + "{days} days": "{days} nap", + "Could not load the flow of this project.": "A projekt áramlása nem tölthető be.", + "Last {days} days": "Utolsó {days} nap", + "Portfolio flow": "Portfólió-áramlás", + "An admin adds portfolios under Projects, Portfolios.": "Egy rendszergazda a Projektek, Portfóliók alatt ad hozzá portfóliókat.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Nem megjelenített projektek, mert egyszerre legfeljebb 50 jelenik meg: {count}", + "Could not load the flow of this portfolio.": "A portfólió áramlása nem tölthető be.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulatív áramlás és ciklusidő egy portfólió projektjein.", + "Edit report": "Jelentés szerkesztése", + "Only tasks where": "Csak azok a feladatok, ahol", + "Group by": "Csoportosítás", + "Display": "Megjelenítés", + "Share with everyone who can read its projects": "Megosztás mindenkivel, aki olvashatja a projektjeit", + "The report could not be saved.": "A jelentés nem menthető.", + "Number of tasks": "Feladatok száma", + "Bar": "Oszlop", + "Donut": "Gyűrű", + "Table": "Táblázat", + "{hidden} of {total} projects in this report are not visible to you": "A jelentés {total} projektjéből {hidden} nem látható számodra", + "No tasks match this report.": "Egy feladat sem felel meg a jelentésnek.", + "None": "Nincs", + "Could not load this report.": "A jelentés nem tölthető be.", + "Report": "Jelentés", + "Your reports": "Jelentéseid", + "My reports": "Saját jelentések", + "Shared reports": "Megosztott jelentések", + "You have not built a report yet.": "Még nem készítettél jelentést.", + "Nobody has shared a report with you yet.": "Még senki nem osztott meg veled jelentést.", + "Reports you built over tasks, and the ones shared with you.": "A feladatokról általad készített jelentések, és a veled megosztottak.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Mentett lekérdezés feladatokról: mely projektek, mely szűrők, mi szerint csoportosítva, megszámolva vagy összegezve, táblázatként vagy diagramként.", + "The name the report is listed under": "A név, amelyen a jelentés a listában szerepel", + "What the report shows and who it is for": "Mit mutat a jelentés, és kinek szól", + "Nextcloud user id of the person who saved the report": "A jelentést mentő személy Nextcloud felhasználói azonosítója", + "Who can open the report": "Ki nyithatja meg a jelentést", + "Only me": "Csak én", + "Everyone who can read its projects": "Mindenki, aki olvashatja a projektjeit", + "The projects the report covers, at most fifty": "A jelentés által lefedett projektek, legfeljebb ötven", + "Filters": "Szűrők", + "Task fields and the value each must equal": "Feladatmezők és az érték, amellyel mindegyiknek egyeznie kell", + "The task field the report groups on": "A feladatmező, amely szerint a jelentés csoportosít", + "Count the tasks, or add up a number on them": "A feladatok megszámolása vagy egy számuk összegzése", + "Sum": "Összeg", + "Sum of": "Összeg ebből", + "The number added up when the measure is a sum": "Az összegzett szám, ha a mérték összeg", + "Story points": "Sztoripontok", + "Estimated duration": "Becsült időtartam", + "How the report is shown": "Hogyan jelenik meg a jelentés", + "Issue type": "Jegytípus", + "Task fields and the value each must equal; empty when the report covers every task": "A feladat mezői és az érték, amellyel mindegyiknek egyeznie kell; üres, ha a jelentés minden feladatra kiterjed", + "The status a task must have": "Az állapot, amellyel a feladatnak rendelkeznie kell", + "The priority a task must have": "A prioritás, amellyel a feladatnak rendelkeznie kell", + "The user a task must be assigned to": "A felhasználó, akihez a feladatot hozzá kell rendelni", + "A label a task must carry": "Egy címke, amelyet a feladatnak viselnie kell", + "The board column a task must be in": "A tábla oszlopa, amelyben a feladatnak lennie kell", + "The issue type a task must have": "A jegytípus, amellyel a feladatnak rendelkeznie kell", + "Manager groups": "Vezetői csoportok", + "Member groups": "Tagcsoportok", + "Viewer groups": "Olvasói csoportok", + "Viewers": "Olvasók", + "Owning group": "Tulajdonos csoport", + "Nextcloud groups whose members manage the project": "Nextcloud-csoportok, amelyek tagjai a projektet vezetik", + "Nextcloud groups whose members work on the project": "Nextcloud-csoportok, amelyek tagjai a projekten dolgoznak", + "Nextcloud groups whose members may read the project": "Nextcloud-csoportok, amelyek tagjai olvashatják a projektet", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-felhasználók, akik a projektet vezetik: beállítások, tagok és munka", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-felhasználók, akik olvashatják a projektet és munkáját, de nem módosíthatják", + "The Nextcloud group that owns the project with its creator, at most one": "A Nextcloud-csoport, amely a létrehozóval együtt birtokolja a projektet, legfeljebb egy", + "Nextcloud user ids who may read this through the project": "Nextcloud-felhasználók, akik ezt a projekten keresztül olvashatják", + "Nextcloud groups whose members may change this through the project": "Nextcloud-csoportok, amelyek tagjai ezt a projekten keresztül módosíthatják", + "Nextcloud groups whose members may read this through the project": "Nextcloud-csoportok, amelyek tagjai ezt a projekten keresztül olvashatják", + "Search for a person or a group…": "Személy vagy csoport keresése…", + "No one found. Your admin's sharing settings decide who you can find.": "Senki sem található. A rendszergazda megosztási beállításai döntik el, kiket találhatsz meg.", + "Type at least two characters": "Írj be legalább két karaktert", + "Everyone in this group": "Mindenki ebben a csoportban", + "Could not search for people. Please try again.": "Nem sikerült személyeket keresni. Próbáld újra.", + "Could not remove the group": "Nem sikerült eltávolítani a csoportot", + "Only the owner and managers change who is on this project.": "Csak a tulajdonos és a kezelők módosítják, ki van a projektben.", + "Role of {name}": "{name} szerepe", + "Manager": "Kezelő", + "Member": "Tag", + "Viewer": "Olvasó", + "Could not change the role": "Nem sikerült módosítani a szerepet", + "Owned by group: {name}": "A csoport tulajdona: {name}", + "No group owns this project.": "Egy csoport sem tulajdonosa ennek a projektnek.", + "Owned by group": "Csoport tulajdona", + "Search for a group…": "Csoport keresése…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nem található csoport. A rendszergazda megosztási beállításai döntik el, mely csoportokat találhatod meg.", + "No owning group": "Nincs tulajdonos csoport", + "Could not search for groups. Please try again.": "Nem sikerült csoportokat keresni. Próbáld újra.", + "Could not change the owning group": "Nem sikerült módosítani a tulajdonos csoportot", + "You can read this project. Only its members change it.": "Olvashatod ezt a projektet. Csak a tagjai módosítják.", + "Course": "Kurzus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "A kurzus, amelyet ezen az órán tanítanak, például egy választható tárgy, ha az iskola tanulási alkalmazása ismeri.", + "Online meeting link": "Online óra hivatkozása", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Ahol a tanulók online csatlakoznak ehhez az órához. A Csatlakozás gomb csak https-hivatkozásnál jelenik meg." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/hu.json b/l10n/hu.json index 3dbc035a..7eec03f1 100644 --- a/l10n/hu.json +++ b/l10n/hu.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktív projektek", + "Archived projects": "Archivált projektek", + "Boards": "Táblák", + "My projects": "Saját projektjeim", + "Portfolio": "Portfólió", + "Project board": "Projekttábla", + "Projects I am in": "Projektek, amelyekben részt veszek", + "Timeline": "Idővonal", + "Timesheet": "Munkaidő-nyilvántartás", + "Features & roadmap": "Funkciók és ütemterv", + "Flow": "Folyamat", + "Flows": "Folyamatok", + "Reports": "Jelentések", + "Pick a report to open it.": "Válasszon egy jelentést a megnyitáshoz.", + "In progress": "Folyamatban", + "Date": "Dátum", + "Due": "Határidő", + "Assignee": "Felelős", + "Who": "Ki", + "What": "Mit", + "Minutes": "Perc", + "Entries": "Bejegyzések", + "Most recent": "Legutóbbi", + "Per person": "Személyenként", + "By status": "Állapot szerint", + "By priority": "Prioritás szerint", + "Task status": "Feladatok állapota", + "Time spent": "Ráfordított idő", + "Capacity": "Kapacitás", + "Due soonest": "Legkorábban esedékes", + "Minutes logged": "Rögzített percek", + "Nothing is due": "Semmi sem esedékes", + "Nothing logged yet": "Még nincs rögzítve semmi", + "What is open, what is blocked, and what is overdue.": "Mi van nyitva, mi van blokkolva és mi késik.", + "How allocation is spread across the people working on projects.": "Hogyan oszlik meg a terhelés a projekteken dolgozók között.", + "Hours logged, and the projects they went to.": "A rögzített órák és a projektek, amelyekre fordították.", + "Billable": "Számlázható", + "Budget: {amount}": "Költségkeret: {amount}", + "Loading projects": "Projektek betöltése", + "No projects for this client yet": "Ehhez az ügyfélhez még nincsenek projektek", + "Open in Planninq": "Megnyitás a Planninqben", + "This project could not be found": "Ez a projekt nem található", + "Untitled project": "Névtelen projekt", + "and {count} more": "és még {count}", + "Store": "Áruház", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Telepítsen más szervezetek által közzétett nyilvántartásokat, sémákat és folyamatokat.", + "Work Date": "Munkadátum", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Oszlopműveletek", + "Columns": "Oszlopok", + "Could not remove the column. Please try again.": "Az oszlopot nem sikerült eltávolítani. Próbálja újra.", + "Could not save the column. Please try again.": "Az oszlopot nem sikerült menteni. Próbálja újra.", + "Done column": "Kész oszlop", + "Edit column": "Oszlop szerkesztése", + "Keep the card's status": "A kártya állapotának megtartása", + "Move its cards to": "Kártyáinak áthelyezése ide", + "Move left": "Mozgatás balra", + "Move right": "Mozgatás jobbra", + "Status of cards moved here": "Az ide mozgatott kártyák állapota", + "The last done column cannot be removed.": "Az utolsó kész oszlop nem távolítható el.", + "WIP limit": "WIP-korlát", + "over limit": "korlát felett", + "The status a card gets when it is moved into this column.": "Az állapot, amelyet egy kártya kap, amikor ebbe az oszlopba kerül.", + "All priorities": "Minden prioritás", + "Could not create the task. Please try again.": "A feladatot nem sikerült létrehozni. Próbálja újra.", + "Created": "Létrehozva", + "Move to backlog": "A backlogba", + "Move to board": "A táblára", + "New task": "Új feladat", + "Nothing in the backlog": "A backlog üres", + "Rank": "Sorrend", + "Sort by": "Rendezés", + "Sort by rank to reorder": "Az átrendezéshez rendezzen sorrend szerint", + "Task actions": "Feladatműveletek", + "All labels": "Minden címke", + "Filter tasks by label": "Feladatok szűrése címke szerint", + "View timeline": "Idővonal megtekintése", + "Board": "Tábla", + "List": "Lista", + "Column": "Oszlop", + "Board or list": "Tábla vagy lista", + "Log": "Napló", + "Add entry": "Bejegyzés hozzáadása", + "Show": "Megjelenítés", + "No actions yet": "Még nincsenek teendők", + "Closed": "Lezárva", + "Entry actions": "Bejegyzés műveletei", + "Add action": "Teendő hozzáadása", + "by {author}": "szerző: {author}", + "saved {time}": "mentve: {time}", + "Attendees: {names}": "Résztvevők: {names}", + "Add the first entry": "Az első bejegyzés hozzáadása", + "Issues": "Problémák", + "Lessons learned": "Tanulságok", + "Meetings": "Megbeszélések", + "Decisions": "Döntések", + "Actions": "Teendők", + "Issue": "Probléma", + "Lesson learned": "Tanulság", + "Meeting": "Megbeszélés", + "Decision": "Döntés", + "About this project": "A projektről", + "No description yet": "Még nincs leírás", + "Start date": "Kezdő dátum", + "Not set": "Nincs beállítva", + "End date": "Záró dátum", + "Progress": "Előrehaladás", + "No tasks yet": "Még nincsenek feladatok", + "Open the board": "Tábla megnyitása", + "People": "Személyek", + "Owner": "Tulajdonos", + "Latest log entries": "Legutóbbi bejegyzések", + "Open the log": "Napló megnyitása", + "{done} of {total} tasks done": "{total} feladatból {done} kész", + "Edit entry": "Bejegyzés szerkesztése", + "Type": "Fajta", + "Attendees": "Résztvevők", + "Issue is closed": "A probléma lezárva", + "Could not save the entry. Please try again.": "A bejegyzést nem sikerült menteni. Próbálja újra.", + "From: {title}": "Forrás: {title}", + "What needs to happen": "Mit kell tenni", + "Could not create the action. Please try again.": "A teendőt nem sikerült létrehozni. Próbálja újra.", + "The action was created but could not be linked to the entry.": "A teendő létrejött, de nem sikerült a bejegyzéshez kapcsolni.", + "Project pages": "Projektoldalak", + "Overview": "Áttekintés", + "Risks": "Kockázatok", + "Log entry": "Naplóbejegyzés", + "A short name for the entry": "A bejegyzés rövid neve", + "Project": "Projekt", + "The project this entry belongs to": "A projekt, amelyhez a bejegyzés tartozik", + "What kind of entry this is": "Milyen fajta bejegyzés ez", + "When it happened": "Mikor történt", + "What happened, in Markdown": "Mi történt, Markdownban", + "Whether an issue is still open": "Nyitott-e még a probléma", + "The people at a meeting": "A megbeszélés résztvevői", + "Tasks that came out of this entry": "A bejegyzésből született feladatok", + "Add risk": "Kockázat hozzáadása", + "Risk": "Kockázat", + "Score": "Pontszám", + "Response": "Válasz", + "Review date": "Felülvizsgálat dátuma", + "no longer on the project": "már nem tagja a projektnek", + "Edit {title}": "{title} szerkesztése", + "No risks recorded yet": "Még nincsenek rögzített kockázatok", + "Add the first risk": "Az első kockázat hozzáadása", + "Medium": "Közepes", + "Mitigating": "Enyhítés alatt", + "Occurred": "Bekövetkezett", + "Avoid": "Elkerülés", + "Reduce": "Csökkentés", + "Transfer": "Áthárítás", + "Accept": "Elfogadás", + "Highest open risks": "Legmagasabb nyitott kockázatok", + "No open risks": "Nincsenek nyitott kockázatok", + "Open the risk register": "Kockázatnyilvántartás megnyitása", + "Edit risk": "Kockázat szerkesztése", + "What could go wrong": "Mi mehet félre", + "Likelihood": "Valószínűség", + "Impact": "Hatás", + "Score {score}": "Pontszám: {score}", + "Countermeasures": "Ellenintézkedések", + "Could not save the risk. Please try again.": "A kockázatot nem sikerült menteni. Próbálja újra.", + "Risks by likelihood and impact": "Kockázatok valószínűség és hatás szerint", + "Risk scale": "Kockázati skála", + "The levels every project scores its risks on, and where low turns into medium and high": "A szintek, amelyeken minden projekt pontozza a kockázatait, és ahol az alacsony közepesbe és magasba vált", + "Number of levels": "Szintek száma", + "Likelihood labels": "Valószínűség címkéi", + "Impact labels": "Hatás címkéi", + "Level {level}": "{level}. szint", + "Medium from score": "Közepes ettől a pontszámtól", + "High from score": "Magas ettől a pontszámtól", + "Risk scale saved": "Kockázati skála mentve", + "1 risk uses level {level}. Change it first.": "1 kockázat a(z) {level}. szintet használja. Előbb módosítsa.", + "{count} risks use level {level}. Change them first.": "{count} kockázat a(z) {level}. szintet használja. Előbb módosítsa őket.", + "Every level needs a label, and high must start above medium.": "Minden szintnek kell címke, és a magasnak a közepes fölött kell kezdődnie.", + "The project this risk belongs to": "A projekt, amelyhez a kockázat tartozik", + "The cause and the effect, in Markdown": "Az ok és az okozat, Markdownban", + "Category": "Kategória", + "A free grouping, such as planning, budget or supplier": "Szabad csoportosítás, pl. ütemezés, költségvetés vagy beszállító", + "How likely it is, on the admin's risk scale": "Mennyire valószínű, a rendszergazda kockázati skáláján", + "How hard it would hit, on the admin's risk scale": "Mennyire súlyosan érintene, a rendszergazda kockázati skáláján", + "Likelihood times impact, calculated by the server": "Valószínűség szorozva a hatással, a kiszolgáló számolja", + "Where the risk stands": "Hol tart a kockázat", + "The person who watches this risk": "A személy, aki figyeli a kockázatot", + "How the project answers the risk": "Hogyan válaszol a projekt a kockázatra", + "What is done to prevent it or soften it, in Markdown": "Mit tesznek a megelőzésére vagy enyhítésére, Markdownban", + "When to look at this risk again": "Mikor kell újra megvizsgálni a kockázatot", + "Very low": "Nagyon alacsony", + "Very high": "Nagyon magas", + "All projects": "Minden projekt", + "Project status report": "Projekt állapotjelentés", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Keltezett jelentés arról, hogyan áll egy projekt pénz, szervezet, idő, információ, minőség és kockázat tekintetében (a GROTIK-szempontok), mindegyik megjegyzéssel.", + "The project this report is about": "A projekt, amelyről a jelentés szól", + "Report date": "Jelentés dátuma", + "The day the report describes": "A nap, amelyet a jelentés leír", + "Money": "Pénz", + "How the project stands on this aspect": "Hogyan áll a projekt ebben a szempontban", + "On track": "Terv szerint", + "At risk": "Veszélyben", + "Off track": "Letért a tervről", + "Money note": "Megjegyzés a pénzről", + "A short explanation of this status": "Rövid magyarázat ehhez az állapothoz", + "Organisation": "Szervezet", + "Organisation note": "Megjegyzés a szervezetről", + "Time": "Idő", + "Time note": "Megjegyzés az időről", + "Information": "Információ", + "Information note": "Megjegyzés az információról", + "Quality": "Minőség", + "Quality note": "Megjegyzés a minőségről", + "Risk note": "Megjegyzés a kockázatról", + "Overall": "Összesen", + "The worst of the six statuses, calculated by the server": "A hat állapot közül a legrosszabb, a szerver számítja", + "Health: money": "Állapot: pénz", + "Copied from the newest status report": "A legújabb állapotjelentésből átvéve", + "Health: organisation": "Állapot: szervezet", + "Health: time": "Állapot: idő", + "Health: information": "Állapot: információ", + "Health: quality": "Állapot: minőség", + "Health: risk": "Állapot: kockázat", + "Health: overall": "Állapot: összesen", + "Health: report date": "Állapot: jelentés dátuma", + "The date of the newest status report": "A legújabb állapotjelentés dátuma", + "New report": "Új jelentés", + "Only the project owner writes status reports.": "Állapotjelentést csak a projekt tulajdonosa ír.", + "Latest report, {date}": "Legutóbbi jelentés, {date}", + "Aspect": "Szempont", + "Note": "Megjegyzés", + "Report history": "Jelentések előzményei", + "Author": "Szerző", + "No status reports yet": "Még nincs állapotjelentés", + "Write the first report": "Az első jelentés megírása", + "Choose a status for every aspect to save the report.": "A jelentés mentéséhez válasszon állapotot minden szemponthoz.", + "Suggested: on track.": "Javaslat: terv szerint.", + "Suggested: at risk.": "Javaslat: veszélyben.", + "Suggested: off track.": "Javaslat: letért a tervről.", + "1 task is past its due date.": "1 feladat lejárt.", + "{count} tasks are past their due date.": "Lejárt feladatok: {count}.", + "The end date has passed with 1 open task.": "A záró dátum elmúlt, 1 feladat nyitott.", + "The end date has passed with {count} open tasks.": "A záró dátum elmúlt, nyitott feladatok: {count}.", + "No open task is past its due date.": "Egyik nyitott feladat sem járt le.", + "The highest open risk, \"{title}\", scores {score}.": "A legmagasabb nyitott kockázat, „{title}”, pontszáma {score}.", + "There are no open risks.": "Nincs nyitott kockázat.", + "Costs are at {percent}% of the budget.": "A költségek a költségvetés {percent}%-án állnak.", + "No suggestion: the project has no budget.": "Nincs javaslat: a projektnek nincs költségvetése.", + "No suggestion: no costs are recorded for this project yet.": "Nincs javaslat: ehhez a projekthez még nincs rögzített költség.", + "The report was not saved. Only the project owner can write status reports.": "A jelentés nem lett mentve. Állapotjelentést csak a projekt tulajdonosa írhat.", + "No report": "Nincs jelentés", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Ugyanazon emberek által vezetett projektek csoportja, például egy osztály vagy egy program. A felelősei minden benne lévő projektet olvasnak.", + "The name of the portfolio": "A portfólió neve", + "What the portfolio holds and who runs it": "Mit tartalmaz a portfólió, és ki vezeti", + "A colour for the portfolio's section in project lists": "A portfólió szakaszának színe a projektlistákban", + "Managers": "Felelősök", + "Nextcloud user UIDs of the people who run the portfolio": "A portfóliót vezető személyek Nextcloud-felhasználóazonosítói", + "Order": "Sorrend", + "Where the portfolio comes in project lists, lowest first": "A portfólió helye a projektlistákban, a legkisebb elöl", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "A portfólió saját kockázati skálája JSON-ként, az egész alkalmazás skálájával azonos formában. Üresen az alkalmazás skáláját jelenti.", + "Portfolio readers": "Portfólió-olvasók", + "Nextcloud user UIDs of the managers of the project's portfolio": "A projekt portfóliója felelőseinek Nextcloud-felhasználóazonosítói", + "The portfolio this project belongs to": "A portfólió, amelyhez a projekt tartozik", + "No portfolio": "Nincs portfólió", + "All portfolios": "Összes portfólió", + "You read this project as a manager of its portfolio. Only its members change it.": "Ezt a projektet a portfóliója felelőseként olvassa. Csak a tagjai módosítják.", + "Portfolios": "Portfóliók", + "Portfolio status": "Portfólió állapota", + "No portfolios yet": "Még nincs portfólió", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Egy rendszergazda a Projektek, Portfóliók alatt ad hozzá portfóliókat. A portfólió projektjei itt szerepelnek az állapotukkal.", + "Roll-up": "Összesítés", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} terv szerint, {atRisk} veszélyben, {offTrack} letért, {noReport} jelentés nélkül", + "No project in this portfolio that you can read.": "Ebben a portfólióban nincs olyan projekt, amelyet olvashatsz.", + "Start": "Kezdés", + "End": "Vége", + "Budget": "Költségvetés", + "Last report": "Utolsó jelentés", + "Out of date": "Elavult", + "Portfolio timeline": "Portfólió idővonala", + "Zoom": "Nagyítás", + "Could not load the timeline": "Az idővonal nem tölthető be", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Egy rendszergazda a Projektek, Portfóliók alatt ad hozzá portfóliókat. A portfólió projektjei itt egy idővonalon láthatók.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Nyiss meg egy projektet a fázisai és feladatai megtekintéséhez. Az idővonal csak olvasható.", + "Phase: {title}": "Fázis: {title}", + "Left out because you cannot read them: {count} projects": "Kihagyva, mert nem olvashatod őket: {count} projekt", + "Week": "Hét", + "Day": "Nap", + "Month": "Hónap", + "Please try again later.": "Próbáld újra később.", + "Status reports": "Állapotjelentések", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Hány nap után jelölődik elavultnak egy projekt legutóbbi állapotjelentése a portfólió áttekintésében", + "Reporting period (days)": "Jelentési időszak (nap)", + "The reporting period is a whole number of days from 1 to 365.": "A jelentési időszak egész számú nap 1 és 365 között.", + "Reporting period saved": "Jelentési időszak mentve", + "The reporting period was not saved. Please try again.": "A jelentési időszak nem lett mentve. Próbáld újra.", + "Every project of a portfolio with its status per aspect, rolled up.": "A portfólió minden projektje az aspektusonkénti állapotával, összesítve.", + "The projects of a portfolio on one timeline.": "A portfólió projektjei egy idővonalon.", + "Phases": "Fázisok", + "Add phase": "Fázis hozzáadása", + "No phases yet": "Még nincs fázis", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Oszd fázisokra a projektet, például indításra, meghatározásra és megvalósításra. Egy fázis akkor zárul, amikor a záródokumentuma fel van töltve.", + "{hours} hours": "{hours} óra", + "Concluding document: {title}": "Záródokumentum: {title}", + "Concluding document missing": "Hiányzik a záródokumentum", + "Move {title} up": "{title} feljebb", + "Move {title} down": "{title} lejjebb", + "Close phase": "Fázis lezárása", + "Phase": "Fázis", + "Files": "Fájlok", + "Notes": "Jegyzetek", + "Audit trail": "Naplózás", + "Edit phase": "Fázis szerkesztése", + "Name": "Név", + "Budget hours": "Tervezett órák", + "Could not save the phase. Please try again.": "A fázist nem sikerült menteni. Próbáld újra.", + "Close phase {title}": "{title} fázis lezárása", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Egy fázis a záródokumentumával zárul: töltsd fel itt, vagy válaszd ki a fázis egyik fájlját.", + "Concluding document": "Záródokumentum", + "This phase has no files yet.": "Ennek a fázisnak még nincsenek fájljai.", + "Upload a document": "Dokumentum feltöltése", + "The document was not uploaded. Please try again.": "A dokumentum nem lett feltöltve. Próbáld újra.", + "Upload the concluding document before you close this phase.": "Töltsd fel a záródokumentumot, mielőtt lezárod ezt a fázist.", + "This phase cannot be closed from its current status.": "Ez a fázis a jelenlegi állapotából nem zárható le.", + "The phase was not closed. Please try again.": "A fázis nem lett lezárva. Próbáld újra.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "A fázist lezáró fájl azonosítója ezen a fázison. A fázis csak akkor fejezhető be, ha ki van töltve és a fájl csatolva van.", + "Import from Microsoft Project": "Importálás Microsoft Projectből", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Válasszon egy Microsoft Projectből XML formátumban mentett tervet. Semmi sem kerül importálásra, amíg meg nem erősíti.", + "Plan file": "Tervfájl", + "What the import creates": "Mit hoz létre az importálás", + "Tasks": "Feladatok", + "Sub-tasks": "Részfeladatok", + "Milestones": "Mérföldkövek", + "Links": "Kapcsolatok", + "Already imported, updated in place: {count}": "Már importálva, helyben frissítve: {count}", + "What does not carry over": "Ami nem kerül át", + "Tasks with resources, which are not imported: {count}": "Erőforrásokkal rendelkező feladatok, amelyek nem kerülnek importálásra: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "A 3. szintnél mélyebb feladatok, a 2. szintű feladatuk alá helyezve: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Nem befejezés-kezdés kapcsolatok, kapcsolódó kapcsolatként importálva: {count}", + "Link lags, which are dropped: {count}": "Kapcsolatok késleltetései, amelyek elmaradnak: {count}", + "Links to a summary task, which are not imported: {count}": "Összesítő feladatra mutató kapcsolatok, amelyek nem kerülnek importálásra: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "E terven kívüli feladatokra mutató kapcsolatok, amelyek nem kerülnek importálásra: {count}", + "No longer in the plan": "Már nincs a tervben", + "These stay in the project; remove them yourself if they are no longer needed.": "Ezek a projektben maradnak; távolítsa el őket, ha már nincs rájuk szükség.", + "Import": "Importálás", + "Close": "Bezárás", + "The plan is imported: {created} created, {updated} updated.": "A terv importálva: {created} létrehozva, {updated} frissítve.", + "Links that would close a loop were left out: {count}": "A hurkot bezáró kapcsolatok kimaradtak: {count}", + "The import stopped part-way. Run it again to finish it.": "Az importálás félúton leállt. Futtassa újra a befejezéshez.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Mentse a tervet a Microsoft Projectben a Fájl, Mentés másként, XML formátum menüvel, és importálja azt a fájlt.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ez a fájl DOCTYPE-ot vagy entitásokat deklarál, amelyek nem elfogadottak.", + "The file is larger than 10 MB.": "A fájl nagyobb 10 MB-nál.", + "The plan has more than 2,000 tasks, more than one import takes.": "A tervben több mint 2000 feladat van, több, mint amennyit egy importálás elfogad.", + "This file is not a Microsoft Project plan in XML format.": "Ez a fájl nem XML formátumú Microsoft Project-terv.", + "Choose a file to import.": "Válasszon egy importálandó fájlt.", + "Only the project owner can import a plan.": "Csak a projekt tulajdonosa importálhat tervet.", + "The plan could not be read. Please try again.": "A tervet nem sikerült beolvasni. Próbálja újra.", + "Linked case: {title}": "Kapcsolt ügy: {title}", + "Linked to a case": "Ügyhöz kapcsolva", + "Hand over to case": "Átadás az ügynek", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Változatlanul átmásolja a projekt és feladatai minden fájlját, valamint a projektet leíró fájlt a kapcsolt ügybe.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Átmásolt fájlok: {count}", + "Files that failed: {names}": "Sikertelen fájlok: {names}", + "The handover failed. Please try again.": "Az átadás nem sikerült. Próbálja újra.", + "The linked case could not be found, or you cannot open it.": "A kapcsolt ügy nem található, vagy nem nyithatja meg.", + "Case handovers": "Átadások az ügynek", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "A projekt fájljainak és metaadatainak minden átadása az ügyének: mikor, ki, melyik ügynek, minden átmásolt fájl a SHA-256 értékével, és a sikertelen fájlok.", + "Finance": "Pénzügyek", + "Add cost line": "Költségsor hozzáadása", + "Delivery terms": "Szállítási feltételek", + "Billing model": "Számlázási modell", + "Budget in euro": "Költségkeret euróban", + "Budget in hours": "Költségkeret órában", + "Hourly rate in euro": "Óradíj euróban", + "Planned start": "Tervezett kezdés", + "Planned end": "Tervezett befejezés", + "Planned dates": "Tervezett dátumok", + "Budget {amount}": "Költségkeret: {amount}", + "No budget agreed": "Nincs egyeztetett költségkeret", + "Hours": "Órák", + "Only the project owner and the portfolio managers see the amounts.": "Az összegeket csak a projekt tulajdonosa és a portfólió vezetői látják.", + "Budget against cost per category": "Költségkeret és költségek kategóriánként", + "Labour (booked time)": "Munka (rögzített idő)", + "No category": "Nincs kategória", + "Hours are not available": "Az órák nem érhetők el", + "Not yet assigned to a category": "Még nincs kategóriához rendelve", + "Total": "Összesen", + "{spent} spent, {remaining} remaining": "{spent} elköltve, {remaining} maradt", + "Budget against cost per phase": "Költségkeret és költségek szakaszonként", + "No phase": "Nincs szakasz", + "Cost lines": "Költségsorok", + "From the finance system": "A pénzügyi rendszerből", + "Edit cost line {amount}": "A(z) {amount} költségsor szerkesztése", + "No cost lines yet": "Még nincsenek költségsorok", + "Commitments": "Kötelezettségek", + "Actual cost": "Tényleges költség", + "Forecast": "Előrejelzés", + "Remaining": "Maradék", + "Not planned yet": "Még nincs ütemezve", + "{start} to {end}": "{start} és {end} között", + "The terms were not saved. Please try again.": "A feltételek nem lettek mentve. Próbáld újra.", + "Terms saved": "Feltételek mentve", + "Fixed price": "Fix ár", + "Hourly": "Óradíjas", + "Not billed": "Nem számlázott", + "Commitment": "Kötelezettség", + "Edit cost line": "Költségsor szerkesztése", + "Kind": "Fajta", + "Amount in euro": "Összeg euróban", + "Remove": "Eltávolítás", + "Could not save the cost line. Only the project owner changes the money of a project.": "A költségsor nem menthető. Egy projekt pénzét csak a projekt tulajdonosa módosítja.", + "Could not remove the cost line. Please try again.": "A költségsor nem távolítható el. Próbáld újra.", + "{amount} over budget": "{amount} a költségkeret felett", + "Cost categories": "Költségkategóriák", + "The categories every project splits its budget and costs into, one per line": "A kategóriák, amelyekre minden projekt felosztja a költségkeretét és költségeit, soronként egy", + "Categories": "Kategóriák", + "Give at least one category, each name once.": "Adj meg legalább egy kategóriát, minden nevet egyszer.", + "Cost categories saved": "Költségkategóriák mentve", + "The cost categories were not saved. Please try again.": "A költségkategóriák nem lettek mentve. Próbáld újra.", + "Finance line": "Pénzügyi sor", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Egy projekt egy pénzösszege: költségkeret, kötelezettség, tényleges költség vagy előrejelzés, költségkategóriában és opcionálisan szakaszban. A projekt tulajdonosa rögzíti, vagy a pénzügyi rendszer küldi az integrációs alkalmazáson keresztül.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "A projekt, amelyhez az összeg tartozik. Üres, ha a pénzügyi rendszerből érkező sor projektszáma egyetlen projekthez sem illik.", + "The phase this amount belongs to, if any": "A szakasz, amelyhez az összeg tartozik, ha van ilyen", + "The cost category, one of the categories the admin set up": "A költségkategória, az adminisztrátor által beállított kategóriák egyike", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Az összeg költségkeret, kötelezettség, tényleges költség vagy előrejelzés-e", + "Amount": "Összeg", + "The amount in the reporting currency (euro)": "Az összeg a jelentési pénznemben (euró)", + "The date the amount was booked or is expected": "Az összeg könyvelésének vagy várható dátuma", + "What the amount is for": "Mire szól az összeg", + "Whether a person entered the line or the finance system sent it": "Egy személy rögzítette a sort, vagy a pénzügyi rendszer küldte", + "Entered by hand": "Kézzel rögzítve", + "Finance line id": "Pénzügyi sor azonosítója", + "The finance system's own id of this line. One imported line per id.": "A sor saját azonosítója a pénzügyi rendszerben. Azonosítónként egy importált sor.", + "Project number": "Projektszám", + "The project number the finance system sent, matched against the project key": "A pénzügyi rendszer által küldött projektszám, a projekt kulcsával összevetve", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "A sor projektjének portfóliója, a projektből átvéve, hogy a portfólió összesítéseihez egy szűrő elég legyen", + "Finance readers": "Pénzügyi olvasók", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Azoknak a Nextcloud-felhasználói azonosítói, akik láthatják az összeget: a projekt tulajdonosa és a portfólió vezetői", + "Project owner": "Projekt tulajdonosa", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "A projekt tulajdonosának Nextcloud-felhasználói azonosítója, aki módosíthatja és eltávolíthatja a kézi sorokat", + "How the client pays: not billed, a fixed price, or by the hour.": "Hogyan fizet az ügyfél: nincs számlázva, fix ár vagy óradíjas.", + "Portfolio finance": "Portfólió pénzügyei", + "You cannot see the money of any project in this portfolio": "A portfólió egyik projektjének pénzét sem láthatod", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "A kiszolgáló a portfólión kívüli projektek költségsorait is visszaadta, ezért az összesítések hibásak lehetnek.", + "Projects left out because you cannot see their money: {count}": "Kihagyott projektek, mert nem láthatod a pénzüket: {count}", + "Unmatched finance lines": "Nem egyeztetett pénzügyi sorok", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Költségkeret, kötelezettségek, tényleges költség és előrejelzés egy portfólióra összesítve.", + "Subprojects": "Alprojektek", + "{done} of {total}": "{done}/{total}", + "{done} of {total} tasks done, including subprojects": "{done}/{total} feladat kész, az alprojektekkel együtt", + "Show the subprojects of {title}": "{title} alprojektjeinek megjelenítése", + "Hide the subprojects of {title}": "{title} alprojektjeinek elrejtése", + "Part of": "Része ennek", + "No parent project": "Nincs szülőprojekt", + "A project cannot sit under one of its own subprojects.": "Egy projekt nem kerülhet a saját alprojektjei egyike alá.", + "Projects nest three levels deep at most: programme, project and subproject.": "A projektek legfeljebb három szint mélyen ágyazhatók: program, projekt és alprojekt.", + "Parent project": "Szülőprojekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "A projekt, amely alá ez a projekt tartozik, például egy program. A projektek legfeljebb három szint mélyen ágyazhatók.", + "Yes": "Igen", + "No": "Nem", + "{label} (required)": "{label} (kötelező)", + "{label} is required": "{label} kitöltése kötelező", + "Project field": "Projektmező", + "A field an admin adds to every project, such as a policy area or a contract value.": "Egy mező, amelyet egy adminisztrátor minden projekthez hozzáad, például szakpolitikai terület vagy szerződéses érték.", + "Key": "Kulcs", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Az állandó név, amely alatt az érték tárolódik, lower camel case formában. Tartsd meg, ha projektek használják.", + "Label": "Címke", + "The name people see next to the field": "A mező mellett látható név", + "What the field holds": "Mit tartalmaz a mező", + "Text": "Szöveg", + "Number": "Szám", + "Choice": "Választás", + "Person": "Személy", + "Yes or no": "Igen vagy nem", + "Options": "Lehetőségek", + "The choices of a choice field": "Egy választómező lehetőségei", + "Required": "Kötelező", + "Whether a project must fill in the field": "Ki kell-e töltenie a projektnek a mezőt", + "Where the field appears, lowest first": "Hol jelenik meg a mező, a legkisebb elöl", + "Applies to": "Vonatkozik", + "What the field is added to": "Mihez adják a mezőt", + "Custom fields": "Saját mezők", + "The values of the project fields an admin defined, keyed by the field's key.": "Az adminisztrátor által megadott projektmezők értékei a mező kulcsa szerint.", + "Project fields": "Projektmezők", + "Related": "Kapcsolódó", + "Remove link": "Kapcsolat eltávolítása", + "Link type": "Kapcsolat típusa", + "Relates to": "Kapcsolódik ehhez", + "Duplicates": "Megkettőzi", + "Project key": "Projektkulcs", + "Every task number starts with it, such as VERG-42.": "Minden feladatszám ezzel kezdődik, például VERG-42.", + "This key is already used by another project.": "Ezt a kulcsot már egy másik projekt használja.", + "Use 2 to 10 letters and digits, starting with a letter.": "Használjon 2–10 betűt és számjegyet, betűvel kezdve.", + "The key cannot change once tasks carry it.": "A kulcs nem változhat, ha már feladatok viselik.", + "Project saved. The existing tasks get their numbers in the background.": "A projekt mentve. A meglévő feladatok a háttérben kapják meg a számukat.", + "Next task number": "Következő feladatszám", + "The number the next task of this project gets in its key. Only the system writes it.": "A szám, amelyet a projekt következő feladata a kulcsában kap. Csak a rendszer írja.", + "Restore {title}": "{title} visszaállítása", + "Restore": "Visszaállítás", + "Project restored": "A projekt visszaállítva", + "Could not restore the project": "A projektet nem sikerült visszaállítani", + "Bring this project back to the active list.": "A projekt visszakerül az aktív projektek listájába.", + "Restore project": "Projekt visszaállítása", + "Request reason": "A kérés indoka", + "Why the requester needs this project. Filled in when the project is requested.": "Miért van szüksége a kérelmezőnek erre a projektre. A kérésnél kell kitölteni.", + "Reviewed by": "Elbírálta", + "The user who approved or rejected the request.": "A felhasználó, aki jóváhagyta vagy elutasította a kérést.", + "Reviewed at": "Elbírálás ideje", + "When the request was approved or rejected.": "Mikor hagyták jóvá vagy utasították el a kérést.", + "Review note": "Elbírálói megjegyzés", + "The reviewer's reason, shown to the requester when a request is not approved.": "Az elbíráló indoka, amelyet a kérelmező lát, ha a kérést nem hagyják jóvá.", + "Members of these groups": "Ezeknek a csoportoknak a tagjai", + "Groups that may create projects": "Csoportok, amelyek projektet hozhatnak létre", + "The group {group} no longer exists. Save to remove it.": "A(z) {group} csoport már nem létezik. Mentse el az eltávolításhoz.", + "Review project request": "Projektkérés elbírálása", + "Requested by": "Kérte", + "Why it is needed": "Miért van rá szükség", + "Desired start date": "Kívánt kezdő dátum", + "Why is it not approved?": "Miért nincs jóváhagyva?", + "Give a reason. The requester sees it.": "Adjon meg indokot. A kérelmező látni fogja.", + "Approve": "Jóváhagyás", + "Reject": "Elutasítás", + "Reject request": "Kérés elutasítása", + "The review was not saved. Try again.": "Az elbírálás nem mentődött. Próbálja újra.", + "This project is waiting for review": "Ez a projekt elbírálásra vár", + "This request was not approved": "Ezt a kérést nem hagyták jóvá", + "Reason: {note}": "Indok: {note}", + "Review request": "Kérés elbírálása", + "Request a project": "Projekt kérése", + "Step {step} of 2": "{step}. lépés a 2-ből", + "Why is this project needed?": "Miért van szükség erre a projektre?", + "Give a reason. The reviewer reads it.": "Adjon meg indokot. Az elbíráló elolvassa.", + "Back": "Vissza", + "Next": "Tovább", + "Send request": "Kérés küldése", + "The request was not sent. Try again.": "A kérés nem ment el. Próbálja újra.", + "Requested": "Kérve", + "Not approved": "Nincs jóváhagyva", + "Your request was sent": "A kérését elküldtük", + "Let everyone else request a project": "Mindenki más kérhet projektet", + "Add a task": "Feladat hozzáadása", + "Delete task": "Feladat törlése", + "Edit task": "Feladat szerkesztése", + "Write": "Írás", + "Preview": "Előnézet", + "Markdown works here: headings, lists and links.": "Itt működik a Markdown: címsorok, listák és hivatkozások.", + "Could not save the task. Please try again.": "A feladatot nem sikerült menteni. Próbálja újra.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "A(z) \"{title}\" feladaton rögzített idő van, ezért nem törölhető. Helyette visszavonhatja: az időbejegyzések megmaradnak.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Törli a(z) \"{title}\" feladatot? A más feladatokra mutató kapcsolatai is törlődnek. Ez nem vonható vissza.", + "Keep task": "Feladat megtartása", + "Cancel task": "Feladat visszavonása", + "Only the reporter, the project owner or an admin can delete this task.": "Ezt a feladatot csak a bejelentő, a projekt tulajdonosa vagy egy rendszergazda törölheti.", + "Could not delete the task. Please try again.": "A feladatot nem sikerült törölni. Próbálja újra.", + "Could not cancel the task. Please try again.": "A feladatot nem sikerült visszavonni. Próbálja újra.", + "Responsible": "Felelős", + "Also working on this": "Szintén dolgoznak rajta", + "Labels": "Címkék", + "Could not change the priority. Please try again.": "A prioritást nem sikerült módosítani. Próbálja újra.", + "Other project members who work on this task alongside the person responsible.": "A projekt további tagjai, akik a felelőssel együtt dolgoznak ezen a feladaton.", + "Duplicate": "Másolat készítése", + "Could not copy the task. Please try again.": "A feladatot nem sikerült másolni. Próbálja újra.", + "Subtasks": "Részfeladatok", + "{done} of {total} done": "{done} / {total} kész", + "Add a subtask": "Részfeladat hozzáadása", + "Checklist": "Ellenőrzőlista", + "Checklist item actions": "Listaelem műveletei", + "Add a checklist item": "Listaelem hozzáadása", + "Subtasks: {estimate} estimated, {logged} logged": "Részfeladatok: {estimate} becsült, {logged} rögzített", + "Total estimate: {total}": "Teljes becslés: {total}", + "Part of {title}": "A(z) {title} része", + "Checklist: {count} done": "Ellenőrzőlista: {count} kész", + "This task has subtasks: {count}.": "Ennek a feladatnak részfeladatai vannak: {count}.", + "Keep subtasks as separate tasks": "Részfeladatok megtartása különálló feladatként", + "Delete subtasks too": "Részfeladatok törlése is", + "Copy of {title}": "Másolat: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "A feladat másolása megtörtént, de nem az összes részfeladaté. Ellenőrizze a másolatot.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Kis lépések a feladaton belül. Minden elemnek van azonosítója, szövege és jelzése, hogy kész-e.", + "Open work per person and per project.": "Nyitott munka személyenként és projektenként.", + "View": "Nézet", + "By person": "Személyenként", + "By project": "Projektenként", + "Hours left": "Hátralévő órák", + "Tasks without an estimate": "Becslés nélküli feladatok", + "Due in 14 days": "14 napon belül esedékes", + "Shared": "Megosztott", + "Unassigned": "Nincs hozzárendelve", + "{hours} h": "{hours} ó", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "A látható projektek munkája jelenik meg. Az órák a felelős személyhez számítanak; a megosztott feladatok órák nélkül számítanak.", + "No open work in these projects.": "Ezekben a projektekben nincs nyitott munka.", + "Open work": "Nyitott munka", + "{count} open tasks": "{count} nyitott feladat", + "Create a project to see capacity here.": "Hozzon létre egy projektet, hogy itt lássa a kapacitást.", + "My tasks": "Saját feladataim", + "Show all my tasks": "Összes saját feladatom mutatása", + "No tasks assigned to you": "Nincs önhöz rendelt feladat", + "Browse projects": "Projektek böngészése", + "Later": "Később", + "Due {date}": "Határidő: {date}", + "Could not change the status. Please try again.": "Az állapotot nem sikerült módosítani. Próbálja újra.", + "Completed today": "Ma befejezett", + "My open tasks": "Nyitott feladataim", + "My overdue tasks": "Lejárt feladataim", + "My tasks in progress": "Folyamatban lévő feladataim", + "Pin to the top": "Kitűzés felülre", + "Unpin": "Kitűzés megszüntetése", + "Pinned": "Kitűzve", + "Actions for {title}": "Műveletek: {title}", + "Could not save your project order. Please try again.": "A projektek sorrendjét nem sikerült menteni. Próbálja újra.", + "No boards yet": "Még nincsenek táblák", + "Create a project to get a board.": "Hozzon létre egy projektet, hogy táblája legyen.", + "Use the Projects page to create and manage your projects and tasks.": "A Projektek oldalon hozhatja létre és kezelheti projektjeit és feladatait.", + "Go to projects": "Ugrás a projektekhez", + "You are not a member of any projects yet.": "Még egyetlen projektnek sem tagja.", + "Could not search for users. Please try again.": "A felhasználók keresése nem sikerült. Próbálja újra.", + "Project creation is restricted to administrators.": "Projektet csak rendszergazdák hozhatnak létre.", + "Only the project owner or an administrator can delete this project.": "Ezt a projektet csak a projekt tulajdonosa vagy egy rendszergazda törölheti.", + "No projects are available to you yet. Ask an administrator to create one.": "Még nincs elérhető projektje. Kérjen meg egy rendszergazdát, hogy hozzon létre egyet.", + "Due: {date}": "Határidő: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "A kezdő dátummal vagy határidővel rendelkező feladatok megjelennek az idővonalon. Adjon meg dátumokat, hogy itt lássa őket.", + "You do not have access to this project.": "Nincs hozzáférése ehhez a projekthez.", + "Zoom level": "Nagyítási szint", + "Unscheduled": "Ütemezetlen", + "Start: {date}": "Kezdés: {date}", + "Today": "Ma", + "No scheduled tasks": "Nincsenek ütemezett feladatok", + "An unexpected error occurred.": "Váratlan hiba történt.", + "Column {number} name": "A(z) {number}. oszlop neve", + "Failed to save creation policy": "A létrehozási szabályt nem sikerült menteni", + "All authenticated users": "Minden bejelentkezett felhasználó", + "Control who may create new projects": "Határozza meg, ki hozhat létre új projekteket", + "Administrators only": "Csak rendszergazdák", + "Project creation": "Projektek létrehozása", + "Allow project creation": "Projektek létrehozásának engedélyezése", + "Creation policy saved successfully": "A létrehozási szabály mentve", + "Initializing…": "Indítás…", + "e.g. 2h 30m, 90m, 1.5h": "pl. 2h 30m, 90m, 1.5h", + "Log time": "Idő rögzítése", + "Save estimate": "Becslés mentése", + "Logged: {logged}": "Rögzítve: {logged}", + "over by {amount}": "{amount} túllépés", + "Time tracking": "Időkövetés", + "Estimate": "Becslés", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Adjon meg érvényes becslést (pl. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Adjon meg érvényes időtartamot (pl. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Az időbejegyzést nem sikerült menteni. Próbálja újra.", + "Edit time entry": "Időbejegyzés szerkesztése", + "Duration": "Időtartam", + "Date range": "Időszak", + "Last week": "Múlt hét", + "No time logged": "Nincs rögzített idő", + "Log time on a task to see it here.": "Rögzítsen időt egy feladaton, hogy itt lássa.", + "To date": "Záró dátum", + "This week": "Ez a hét", + "Total: {total}": "Összesen: {total}", + "From date": "Kezdő dátum", + "Custom range": "Egyéni időszak", + "All time": "Teljes idő", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Egy feladatot nem sikerült törölni, ezért adatok maradhattak. Törölje újra a projektet.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Egy időbejegyzést nem sikerült törölni, ezért adatok maradhattak. Törölje újra a projektet.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Egy oszlopot nem sikerült törölni, ezért adatok maradhattak. Törölje újra a projektet.", + "Could not delete the project. Please try again.": "A projektet nem sikerült törölni. Próbálja újra.", + "Notification settings": "Értesítési beállítások", + "Configure when due-date reminders are sent": "Adja meg, mikor küldjön a rendszer határidő-emlékeztetőt", + "Due-date reminder lead time (hours)": "Emlékeztető előtti idő (óra)", + "Lead time must be between 1 and 336 hours": "Az időnek 1 és 336 óra között kell lennie", + "Reminder lead time saved successfully": "Az emlékeztető ideje mentve", + "Failed to save reminder lead time": "Az emlékeztető idejét nem sikerült menteni", + "Notifications": "Értesítések", + "Notify me 1 day before a task's due date": "Értesítsen 1 nappal egy feladat határideje előtt", + "Draft": "Vázlat", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Az óra csak a tanára által látható vázlat, megtartják, vagy elmarad.", + "New release": "Új kiadás", + "Roadmap chart. The same releases and epics are listed below.": "Ütemterv-diagram. Ugyanezek a kiadások és epikek lent listában is szerepelnek.", + "Nothing on the roadmap yet": "Az ütemterven még nincs semmi", + "Releases with a target date and epics with dated tasks appear here.": "Itt jelennek meg a céldátummal rendelkező kiadások és a dátumozott feladatokkal rendelkező epikek.", + "Releases": "Kiadások", + "No releases yet": "Még nincsenek kiadások", + "Target date: {date}": "Céldátum: {date}", + "No target date": "Nincs céldátum", + "Edit {name}": "{name} szerkesztése", + "Mark {name} as released": "{name} megjelölése kiadottként", + "Mark as released": "Megjelölés kiadottként", + "Epics": "Epikek", + "No epics yet. Open a task to make it an epic.": "Még nincsenek epikek. Nyisson meg egy feladatot, hogy epikké tegye.", + "Not scheduled yet": "Még nincs ütemezve", + "Planned": "Tervezett", + "Released": "Kiadva", + "Edit release": "Kiadás szerkesztése", + "Target date": "Céldátum", + "Could not save the release. Please try again.": "A kiadást nem sikerült menteni. Próbálja újra.", + "Every task of this release is done or cancelled.": "A kiadás minden feladata kész vagy megszakítva.", + "Not finished yet: {count}": "Még nincs kész: {count}", + "What happens to these tasks?": "Mi történjen ezekkel a feladatokkal?", + "Move to {name}": "Áthelyezés ide: {name}", + "Remove the release": "A kiadás eltávolítása", + "Keep it on {name}": "Maradjanak itt: {name}", + "Could not mark the release as released. Please try again.": "A kiadást nem sikerült kiadottként megjelölni. Próbálja újra.", + "Roadmap": "Ütemterv", + "Tasks or roadmap": "Feladatok vagy ütemterv", + "Release": "Kiadás", + "Epic": "Epik", + "This task is an epic": "Ez a feladat epik", + "A named, dated delivery of a project that its tasks are planned against.": "Egy projekt elnevezett, dátumozott szállítása, amelyre a feladatait tervezik.", + "Name of the release": "A kiadás neve", + "The project this release belongs to": "A projekt, amelyhez ez a kiadás tartozik", + "What this release delivers": "Mit szállít ez a kiadás", + "When work on the release starts": "Mikor kezdődik a munka a kiadáson", + "The date the release is due": "A dátum, amikorra a kiadásnak el kell készülnie", + "Whether the release is planned, released or archived": "A kiadás tervezett, kiadott vagy archivált", + "Released on": "Kiadva ekkor", + "When the release was marked as released": "Mikor jelölték a kiadást kiadottként", + "The release this task is planned for": "A kiadás, amelyre ez a feladat tervezve van", + "Board view options": "Tábla nézetbeállításai", + "Colour cards": "Kártyák színezése", + "No colour": "Nincs szín", + "By label": "Címke szerint", + "Swimlanes": "Sávok", + "No swimlanes": "Nincsenek sávok", + "By assignee": "Felelős szerint", + "By epic": "Epic szerint", + "No assignee": "Nincs felelős", + "No epic": "Nincs epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "A kártyák az epicjük sorában maradnak. Az epicet a feladat oldalán módosíthatja.", + "Hand over to": "Átadás neki", + "Could not save your board view. It applies until you reload.": "A tábla nézetét nem sikerült menteni. Az újratöltésig érvényes.", + "Timetable wish": "Órarendi kívánság", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Kívánság, amelyet a generátor figyelembe vesz. A kötelezőt mindig betartja, a rugalmasat, ahol tudja.", + "Whether the wish is about a teacher, a group, a room or one activity": "A kívánság tanárra, csoportra, teremre vagy egy foglalkozásra vonatkozik", + "Teacher": "Tanár", + "Group": "Csoport", + "Reference": "Hivatkozás", + "The user, group, room or activity the wish is about": "A felhasználó, csoport, terem vagy foglalkozás, amelyre a kívánság vonatkozik", + "What the wish asks for": "Mit kér a kívánság", + "Not on these periods": "Ne ezekben az órákban", + "Preferably not on these periods": "Lehetőleg ne ezekben az órákban", + "At most a number of lessons a day": "Legfeljebb adott számú óra naponta", + "No free periods between lessons": "Nincs lyukasóra az órák között", + "Always the same room": "Mindig ugyanaz a terem", + "Periods": "Órák", + "The periods of the week the wish is about, such as wed-5": "A hét órái, amelyekre a kívánság vonatkozik, pl. wed-5", + "Limit": "Korlát", + "The most lessons a day, for a wish of that kind": "A napi legtöbb óra, ilyen fajta kívánságnál", + "Strength": "Erősség", + "Whether the generator must keep the wish or should keep it": "A generátornak be kell-e tartania a kívánságot, vagy csak illene", + "Hard": "Kötelező", + "Soft": "Rugalmas", + "Weight": "Súly", + "How much a soft wish counts, from 1 to 3": "Mennyit számít egy rugalmas kívánság, 1-től 3-ig", + "Why the wish exists": "Miért van a kívánság", + "Timetable scenario": "Órarendi forgatókönyv", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Egy heti minta, amelyet a generátor készített vagy a jelenlegi órarendből vettünk. Megőrzi a bemenetét és azt, mennyire tartja be a kívánságokat.", + "The name timetablers know the scenario by": "A név, amelyen az órarendkészítők ismerik a forgatókönyvet", + "Whether the generator made it or it came from the current timetable": "A generátor készítette, vagy a jelenlegi órarendből származik", + "Generated": "Generált", + "From the current timetable": "A jelenlegi órarendből", + "Week of": "Hét kezdete", + "The Monday of the first week of the window": "Az időszak első hetének hétfője", + "Window start": "Időszak kezdete", + "The first day the week pattern applies to": "Az első nap, amelyre a heti minta vonatkozik", + "Window end": "Időszak vége", + "The last day the week pattern applies to": "Az utolsó nap, amelyre a heti minta vonatkozik", + "Waiting, generating, done, failed, or published as draft lessons": "Várakozik, készül, kész, sikertelen vagy piszkozatórákként közzétéve", + "Waiting": "Várakozik", + "Generating": "Készül", + "Failed": "Sikertelen", + "Published": "Közzétéve", + "Seed": "Kezdőérték", + "The number the generator starts from, so a run can be repeated": "A szám, amelyről a generátor indul, hogy egy futás megismételhető legyen", + "Input": "Bemenet", + "The periods, rooms, lessons and wishes the scenario was made from": "Az órák, termek, foglalkozások és kívánságok, amelyekből a forgatókönyv készült", + "Placements": "Elhelyezések", + "Each lesson with the period and room it was given": "Minden foglalkozás a kapott órával és teremmel", + "Unplaced lessons": "Elhelyezetlen foglalkozások", + "Lessons without a place, each with the hard wish that blocked it": "Hely nélküli foglalkozások, mindegyik a kötelező kívánsággal, amely megakadályozta", + "Broken wishes": "Megszegett kívánságok", + "The wishes this scenario breaks, with the lessons that break them": "A kívánságok, amelyeket ez a forgatókönyv megszeg, a megszegő foglalkozásokkal", + "Measures": "Mérőszámok", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Elhelyezett foglalkozások, megszegett kívánságok, tanári lyukasórák, napi órák és teremhasználat", + "Reason": "Ok", + "Why the run failed": "Miért volt sikertelen a futás", + "Published at": "Közzétéve", + "When the scenario was written out as draft lessons": "Mikor íródott ki a forgatókönyv piszkozatórákként", + "Edit wish": "Kívánság szerkesztése", + "New wish": "Új kívánság", + "Hard: the generator always keeps it": "Kötelező: a generátor mindig betartja", + "Soft: the generator keeps it where it can": "Rugalmas: a generátor betartja, ahol tudja", + "Weight (1 to 3)": "Súly (1-től 3-ig)", + "Most lessons a day": "Legfeljebb ennyi óra naponta", + "Period": "Óra", + "{day} period {number}": "{day} {number}. óra", + "Teacher (user name)": "Tanár (felhasználónév)", + "Activity (group:subject)": "Tevékenység (csoport:tantárgy)", + "Say who or what the wish is about.": "Adja meg, kire vagy mire vonatkozik a kívánság.", + "Choose at least one period.": "Válasszon legalább egy órát.", + "The limit is a whole number of 1 or more.": "A korlát legalább 1 egész szám.", + "Timetable": "Órarend", + "Wishes": "Kívánságok", + "Timetable wishes": "Órarendi kívánságok", + "Generator run": "Generátorfuttatás", + "Generator progress": "A generátor haladása", + "The run failed: {reason}": "A futtatás sikertelen: {reason}", + "{placed} of {lessons} lessons placed": "{lessons} órából {placed} elhelyezve", + "Generate again": "Újragenerálás", + "Generate": "Generálás", + "Every lesson has a place.": "Minden órának van helye.", + "Lesson": "Óra", + "No free period and room": "Nincs szabad óra és terem", + "Broken soft wishes": "Megsértett rugalmas kívánságok", + "Every soft wish is kept.": "Minden rugalmas kívánság teljesül.", + "Wish": "Kívánság", + "Lessons": "Órák", + "Generating: {percent}% of the time budget used": "Generálás: az idő {percent}%-a elhasználva", + "Waiting to start": "Indításra vár", + "Published as draft lessons": "Óratervezetként közzétéve", + "Could not read the scenario.": "A forgatókönyv nem olvasható.", + "Could not start the run.": "A futtatás nem indítható.", + "Scenarios": "Forgatókönyvek", + "Timetable scenarios": "Órarendi forgatókönyvek", + "Scenario": "Forgatókönyv", + "Take the current timetable": "Jelenlegi órarend átvétele", + "Could not take the current timetable.": "Nem sikerült átvenni a jelenlegi órarendet.", + "Broken hard wishes": "Megszegett kötelező kívánságok", + "Not on a period of the week grid": "Nem a heti rács egy óráján van", + "Compare scenarios": "Forgatókönyvek összehasonlítása", + "Scenarios to compare": "Összehasonlítandó forgatókönyvek", + "Choose two or three scenarios to compare them.": "Válasszon két vagy három forgatókönyvet az összehasonlításhoz.", + "Measure": "Mérőszám", + "Best": "Legjobb", + "Lessons that differ": "Eltérő órák", + "No lesson differs.": "Egyik óra sem tér el.", + "Not placed": "Nincs elhelyezve", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Elhelyezett órák", + "Lessons without a place": "Hely nélküli órák", + "Clashes": "Ütközések", + "Hard wishes broken": "Megsértett kötelező kívánságok", + "Soft wishes broken": "Megsértett rugalmas kívánságok", + "Soft wishes broken, weighted": "Megsértett rugalmas kívánságok, súlyozva", + "Free periods between lessons, all teachers": "Lyukasórák, minden tanár", + "Most free periods of one teacher": "Egy tanár legtöbb lyukasórája", + "Most lessons of one group on a day": "Egy csoport legtöbb órája egy napon", + "Room use": "Teremkihasználtság", + "Publish as draft lessons": "Közzététel óratervezetként", + "Draft lessons written: {count}": "Megírt óratervezetek: {count}", + "Could not publish the scenario.": "Nem sikerült közzétenni a forgatókönyvet.", + "Rules": "Szabályok", + "Rules for {column}": "{column} szabályai", + "When a card enters this column": "Amikor egy kártya ebbe az oszlopba kerül", + "Action": "Művelet", + "Set the priority": "Prioritás beállítása", + "Assign to": "Hozzárendelés", + "Assign the person who moved the card": "Hozzárendelés ahhoz, aki a kártyát áthelyezte", + "Remove the assignee": "Felelős eltávolítása", + "Add a label": "Címke hozzáadása", + "No longer a project member": "Már nem tagja a projektnek", + "This label no longer exists": "Ez a címke már nem létezik", + "Add rule": "Szabály hozzáadása", + "Remove rule": "Szabály eltávolítása", + "No rules yet. Add one to change a card when it enters this column.": "Még nincsenek szabályok. Adjon hozzá egyet, hogy a kártya megváltozzon, amikor ebbe az oszlopba kerül.", + "Could not save the rules. Please try again.": "A szabályokat nem sikerült menteni. Próbálja újra.", + "1 rule runs when a card enters this column": "1 szabály fut le, amikor egy kártya ebbe az oszlopba kerül", + "{count} rules run when a card enters this column": "{count} szabály fut le, amikor egy kártya ebbe az oszlopba kerül", + "Rules applied: {changes}": "Alkalmazott szabályok: {changes}", + "assigned to {name}": "felelős: {name}", + "assignee removed": "felelős eltávolítva", + "priority {priority}": "prioritás: {priority}", + "label {label}": "címke: {label}", + "What happens to a card when it enters this column, applied in list order.": "Mi történik egy kártyával, amikor ebbe az oszlopba kerül, a lista sorrendjében.", + "Value": "Érték", + "What the rule does to the card.": "Mit tesz a szabály a kártyával.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "A prioritás, a felhasználói azonosító vagy a címkeazonosító, amelyet a művelet használ; érték nélküli műveleteknél üres.", + "is not": "nem", + "{dimension} is not": "{dimension} nem", + "Saved filters": "Mentett szűrők", + "No saved filters yet": "Még nincsenek mentett szűrők", + "Save filter": "Szűrő mentése", + "Rename \"{name}\"": "„{name}” átnevezése", + "Delete \"{name}\"": "„{name}” törlése", + "Clear filters": "Szűrők törlése", + "Showing {shown} of {total} tasks": "{shown} / {total} feladat látható", + "Me": "Én", + "No date": "Nincs dátum", + "Rename saved filter": "Mentett szűrő átnevezése", + "Share with the project": "Megosztás a projekttel", + "Give the filter a name": "Adjon nevet a szűrőnek", + "Could not save the filter. Please try again.": "A szűrőt nem sikerült menteni. Próbálja újra.", + "Some labels in \"{name}\" no longer exist and were left out.": "A(z) „{name}” néhány címkéje már nem létezik, ezért kimaradt.", + "Could not delete the filter. Please try again.": "A szűrőt nem sikerült törölni. Próbálja újra.", + "Saved filter": "Mentett szűrő", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Egy projekt elnevezett táblaszűrője, csak a mentője látja, hacsak nincs megosztva a projekttel.", + "The project whose board the filter applies to": "A projekt, amelynek tábláján a szűrő működik", + "The name the filter is listed under": "A név, amelyen a szűrő a listában szerepel", + "Saved by": "Mentette", + "Nextcloud user id of the person who saved the filter": "A szűrőt mentő személy Nextcloud-felhasználói azonosítója", + "Shared with the project": "Megosztva a projekttel", + "Whether every project member sees and applies the filter": "Látja-e és alkalmazhatja-e a szűrőt minden projekttag", + "Criteria": "Feltételek", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "A szűrő: felelős, címke, prioritás és határidő, mindegyik egyenlő vagy nem egyenlő feltétellel és értékekkel", + "Cross-project view": "Projekteken átívelő nézet", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Projektek mentett válogatása, amelyek feladatai együtt jelennek meg állapot szerinti sávokban, megosztva a megnevezett személyekkel.", + "Shared with": "Megosztva", + "The name the view is listed under": "A név, amelyen a nézet szerepel", + "Nextcloud user id of the person who saved the view": "A nézetet mentő személy Nextcloud felhasználói azonosítója", + "Nextcloud user ids of the people the view is shared with": "Azon személyek Nextcloud felhasználói azonosítói, akikkel a nézet meg van osztva", + "The projects whose tasks the view shows, at most twenty": "A projektek, amelyek feladatait a nézet mutatja, legfeljebb húsz", + "1 project in this view is hidden from you.": "A nézet 1 projektje rejtve van előled.", + "{count} projects in this view are hidden from you.": "A nézet {count} projektje rejtve van előled.", + "{project} has no column for {status}.": "A(z) {project} projektnek nincs oszlopa ehhez: {status}.", + "This view does not exist or is not shared with you.": "Ez a nézet nem létezik, vagy nincs megosztva veled.", + "\"{task}\" moved to {status}.": "\"{task}\" áthelyezve ide: {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Projekteken átívelő nézetek", + "New view": "Új nézet", + "Edit view": "Nézet szerkesztése", + "Delete view": "Nézet törlése", + "Give the view a name": "Adj nevet a nézetnek", + "Pick at least one project": "Válassz legalább egy projektet", + "A view shows at most {max} projects": "Egy nézet legfeljebb {max} projektet mutat", + "Could not save the view. Please try again.": "A nézetet nem sikerült menteni. Próbáld újra.", + "Could not delete the view. Please try again.": "A nézetet nem sikerült törölni. Próbáld újra.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Törlöd: \"{title}\"? A projektek és feladataik változatlanok maradnak.", + "People see the tasks of the projects they are in, never more.": "Mindenki csak azoknak a projekteknek a feladatait látja, amelyekben benne van.", + "No views yet. A view shows the tasks of several of your projects together.": "Még nincs nézet. Egy nézet több projekted feladatait mutatja együtt.", + "Projects in view: {count}": "Projektek a nézetben: {count}", + "Notify me when a task is assigned to me": "Értesíts, ha feladatot kapok", + "Also send these to me by email": "Küldd el ezeket e-mailben is", + "Add an email address in your Nextcloud personal settings to get mail.": "E-mailek fogadásához adj meg e-mail-címet a Nextcloud személyes beállításaiban.", + "Code link": "Kódhivatkozás", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Egy kódplatformon lévő commit, ág, egyesítési kérés vagy hibajegy, amely egy feladathoz kapcsolódik.", + "The task the link belongs to": "A feladat, amelyhez a hivatkozás tartozik", + "The project of the task": "A feladat projektje", + "Task key": "Feladatkulcs", + "The task key the forge text named, such as VC-12": "A kódplatform szövegében szereplő feladatkulcs, például VC-12", + "What the link points at": "Mire mutat a hivatkozás", + "Link": "Hivatkozás", + "The address of the item in the forge": "Az elem címe a kódplatformon", + "The commit message, branch name or merge request title": "A commit üzenete, az ág neve vagy az egyesítési kérés címe", + "Repository": "Tároló", + "The repository, such as acme/portal": "A tároló, például acme/portal", + "Forge id": "Azonosító a platformon", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Az elem saját azonosítója a kódplatformon, például github:acme/portal#42 vagy egy commit-hash", + "State": "Állapot", + "The state of a merge request or issue": "Egy egyesítési kérés vagy hibajegy állapota", + "Who made the commit or opened the merge request": "Ki készítette a commitot vagy nyitotta az egyesítési kérést", + "When the commit was made or the merge request last changed": "Mikor készült a commit vagy változott utoljára az egyesítési kérés", + "Added by": "Hozzáadta", + "Whether a person added the link or the integration wrote it": "Egy személy adta-e hozzá a hivatkozást, vagy az integráció írta", + "Nextcloud user UIDs of project members": "A projekttagok Nextcloud-felhasználóazonosítói", + "Add link": "Hivatkozás hozzáadása", + "Added by hand": "Kézzel hozzáadva", + "Branch": "Ág", + "Code": "Kód", + "Commit": "Commit", + "From the integration": "Az integrációból", + "Link to a commit, branch or merge request": "Hivatkozás commitra, ágra vagy egyesítési kérésre", + "Merge request": "Egyesítési kérés", + "Merged": "Egyesítve", + "No code linked yet. Name {key} in a commit message or paste a link.": "Még nincs kód hozzákapcsolva. Írja be a(z) {key} kulcsot egy commit üzenetébe, vagy illesszen be egy hivatkozást.", + "No code linked yet. Paste a link to a commit or merge request.": "Még nincs kód hozzákapcsolva. Illesszen be egy hivatkozást egy commitra vagy egyesítési kérésre.", + "Paste a web address that starts with https://.": "Illesszen be egy https:// kezdetű webcímet.", + "Remove link {title}": "A(z) {title} hivatkozás eltávolítása", + "The link could not be added.": "A hivatkozást nem sikerült hozzáadni.", + "The link could not be removed.": "A hivatkozást nem sikerült eltávolítani.", + "This link is already on the task.": "Ez a hivatkozás már a feladaton van.", + "Code forges": "Kódplatformok", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Kapcsolja a GitHub commitjait és pull requestjeit feladatokhoz. Az Integriq fogadja az eseményeket; a planninq sosem hívja a GitHubot.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Töltse le a konfigurációt, és importálja az Integriqbe. Ezután adjon meg egy titkot a \"Check the GitHub signature\" szabályban.", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "A GitHubban adjon a tárolóhoz webhookot ezzel a címmel és ugyanazzal a titokkal. Válassza az application/json tartalomtípust és a push és pull request eseményeket:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Írja a feladatkulcsot, például VC-12, egy commit üzenetébe, egy ág nevébe vagy egy pull request címébe. A hivatkozás ekkor megjelenik annál a feladatnál.", + "Without Integriq, project members can still paste a link on the task page.": "Integriq nélkül a projekttagok továbbra is beilleszthetnek hivatkozást a feladat oldalán.", + "Download the Integriq configuration": "Az Integriq-konfiguráció letöltése", + "Calendar": "Naptár", + "Previous": "Előző", + "Calendar view": "Naptárnézet", + "Starts:": "Kezdés:", + "No tasks with a date in this month.": "Ebben a hónapban nincs dátummal rendelkező feladat.", + "Week of {start} to {end}": "Hét: {start} – {end}", + "My calendar": "Saját naptár", + "Show as list": "Megjelenítés listaként", + "Show as calendar": "Megjelenítés naptárként", + "Open my calendar": "Saját naptár megnyitása", + "Nextcloud Tasks": "Nextcloud Feladatok", + "Show my tasks in Nextcloud Tasks": "A feladataim megjelenítése a Nextcloud Feladatokban", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "A neked kiosztott vagy veled megosztott feladatok egy \"Planninq\" listában jelennek meg a Nextcloud Feladatokban és Naptárban. Az ott végzett módosításokat a Planninq következő módosítása felülírja.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ez a kiszolgáló nem tud írni a Nextcloud Feladatokba, ezért az exportálás nem érhető el.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "A Planninq kezeli. Az itt végzett módosításokat a Planninq következő módosítása felülírja.", + "Working days and holidays": "Munkanapok és ünnepnapok", + "Dates set on the timeline skip the days that are not working days.": "Az idővonalon beállított dátumok kihagyják a nem munkanapokat.", + "Working weekdays": "A hét munkanapjai", + "Non-working days": "Munkaszüneti napok", + "No non-working days yet.": "Még nincsenek munkaszüneti napok.", + "Add day": "Nap hozzáadása", + "Year": "Év", + "Add Dutch national holidays": "Holland nemzeti ünnepek hozzáadása", + "Save working days": "Munkanapok mentése", + "Choose at least one working weekday.": "Válassz legalább egy munkanapot.", + "Working days saved.": "Munkanapok mentve.", + "Could not save the working days.": "A munkanapokat nem sikerült menteni.", + "New Year's Day": "Újév", + "Easter Sunday": "Húsvétvasárnap", + "Easter Monday": "Húsvéthétfő", + "King's Day": "Királynap", + "Liberation Day": "A felszabadulás napja", + "Ascension Day": "Áldozócsütörtök", + "Whit Sunday": "Pünkösdvasárnap", + "Whit Monday": "Pünkösdhétfő", + "Christmas Day": "Karácsony", + "Boxing Day": "Karácsony másnapja", + "Dates of {title}": "{title} dátumai", + "The due date cannot be before the start date.": "A határidő nem lehet a kezdő dátum előtt.", + "{title}, from {start} to {end}": "{title}, {start} – {end}", + "The dates could not be saved.": "A dátumokat nem sikerült menteni.", + "{title} now runs from {start} to {end}": "{title} mostantól {start} – {end}", + "Auto-scheduling": "Automatikus ütemezés", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Ha be van kapcsolva, egy határidő késleltetése az idővonalon felajánlja az általa blokkolt feladatok eltolását is.", + "Move blocked tasks along when a task slips": "Blokkolt feladatok eltolása, ha egy feladat csúszik", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Az idővonalon egy későbbi határidő felajánlja a blokkolt feladatok eltolását. Csak a \"blokkolja\" kapcsolatok számítanak, és a feladatok csak későbbre tolódnak.", + "Move the tasks that wait for {title}?": "Eltolod a(z) {title} feladatra váró feladatokat?", + "These tasks wait for it and would start after its new due date:": "Ezek a feladatok rá várnak, és az új határidő után kezdődnének:", + "{count} tasks would move; the first {limit} are listed.": "{count} feladat tolódna el; az első {limit} látható.", + "Now": "Most", + "After the move": "Az eltolás után", + "Only this task": "Csak ez a feladat", + "Move all": "Összes eltolása", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Megállt ennél: {title}: a dátumokat nem sikerült menteni. Az előtte lévő feladatok eltolódtak.", + "Cumulative flow": "Kumulatív áramlás", + "Show as chart": "Megjelenítés diagramként", + "Show as table": "Megjelenítés táblázatként", + "Tasks per column per day": "Feladatok oszloponként naponta", + "Tasks without recorded history in this period: {count}": "Rögzített előzmények nélküli feladatok ebben az időszakban: {count}", + "Lead and cycle time": "Átfutási idő és ciklusidő", + "No tasks were finished in this period.": "Ebben az időszakban egy feladat sem fejeződött be.", + "Finished tasks": "Befejezett feladatok", + "Cycle time, average": "Ciklusidő, átlag", + "Cycle time, 85th percentile": "Ciklusidő, 85. percentilis", + "Lead time, average": "Átfutási idő, átlag", + "Tasks whose finish time was estimated from their history: {count}": "Feladatok, amelyek befejezési idejét az előzményekből becsültük: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Minden befejezett feladat ciklusideje az átlaggal és a 85. percentilissel", + "Slowest tasks": "Leglassabb feladatok", + "cycle {cycle}, lead {lead}": "ciklus {cycle}, átfutás {lead}", + "{days} days": "{days} nap", + "Could not load the flow of this project.": "A projekt áramlása nem tölthető be.", + "Last {days} days": "Utolsó {days} nap", + "Portfolio flow": "Portfólió-áramlás", + "An admin adds portfolios under Projects, Portfolios.": "Egy rendszergazda a Projektek, Portfóliók alatt ad hozzá portfóliókat.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Nem megjelenített projektek, mert egyszerre legfeljebb 50 jelenik meg: {count}", + "Could not load the flow of this portfolio.": "A portfólió áramlása nem tölthető be.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulatív áramlás és ciklusidő egy portfólió projektjein.", + "Edit report": "Jelentés szerkesztése", + "Only tasks where": "Csak azok a feladatok, ahol", + "Group by": "Csoportosítás", + "Display": "Megjelenítés", + "Share with everyone who can read its projects": "Megosztás mindenkivel, aki olvashatja a projektjeit", + "The report could not be saved.": "A jelentés nem menthető.", + "Number of tasks": "Feladatok száma", + "Bar": "Oszlop", + "Donut": "Gyűrű", + "Table": "Táblázat", + "{hidden} of {total} projects in this report are not visible to you": "A jelentés {total} projektjéből {hidden} nem látható számodra", + "No tasks match this report.": "Egy feladat sem felel meg a jelentésnek.", + "None": "Nincs", + "Could not load this report.": "A jelentés nem tölthető be.", + "Report": "Jelentés", + "Your reports": "Jelentéseid", + "My reports": "Saját jelentések", + "Shared reports": "Megosztott jelentések", + "You have not built a report yet.": "Még nem készítettél jelentést.", + "Nobody has shared a report with you yet.": "Még senki nem osztott meg veled jelentést.", + "Reports you built over tasks, and the ones shared with you.": "A feladatokról általad készített jelentések, és a veled megosztottak.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Mentett lekérdezés feladatokról: mely projektek, mely szűrők, mi szerint csoportosítva, megszámolva vagy összegezve, táblázatként vagy diagramként.", + "The name the report is listed under": "A név, amelyen a jelentés a listában szerepel", + "What the report shows and who it is for": "Mit mutat a jelentés, és kinek szól", + "Nextcloud user id of the person who saved the report": "A jelentést mentő személy Nextcloud felhasználói azonosítója", + "Who can open the report": "Ki nyithatja meg a jelentést", + "Only me": "Csak én", + "Everyone who can read its projects": "Mindenki, aki olvashatja a projektjeit", + "The projects the report covers, at most fifty": "A jelentés által lefedett projektek, legfeljebb ötven", + "Filters": "Szűrők", + "Task fields and the value each must equal": "Feladatmezők és az érték, amellyel mindegyiknek egyeznie kell", + "The task field the report groups on": "A feladatmező, amely szerint a jelentés csoportosít", + "Count the tasks, or add up a number on them": "A feladatok megszámolása vagy egy számuk összegzése", + "Sum": "Összeg", + "Sum of": "Összeg ebből", + "The number added up when the measure is a sum": "Az összegzett szám, ha a mérték összeg", + "Story points": "Sztoripontok", + "Estimated duration": "Becsült időtartam", + "How the report is shown": "Hogyan jelenik meg a jelentés", + "Issue type": "Jegytípus", + "Task fields and the value each must equal; empty when the report covers every task": "A feladat mezői és az érték, amellyel mindegyiknek egyeznie kell; üres, ha a jelentés minden feladatra kiterjed", + "The status a task must have": "Az állapot, amellyel a feladatnak rendelkeznie kell", + "The priority a task must have": "A prioritás, amellyel a feladatnak rendelkeznie kell", + "The user a task must be assigned to": "A felhasználó, akihez a feladatot hozzá kell rendelni", + "A label a task must carry": "Egy címke, amelyet a feladatnak viselnie kell", + "The board column a task must be in": "A tábla oszlopa, amelyben a feladatnak lennie kell", + "The issue type a task must have": "A jegytípus, amellyel a feladatnak rendelkeznie kell", + "Manager groups": "Vezetői csoportok", + "Member groups": "Tagcsoportok", + "Viewer groups": "Olvasói csoportok", + "Viewers": "Olvasók", + "Owning group": "Tulajdonos csoport", + "Nextcloud groups whose members manage the project": "Nextcloud-csoportok, amelyek tagjai a projektet vezetik", + "Nextcloud groups whose members work on the project": "Nextcloud-csoportok, amelyek tagjai a projekten dolgoznak", + "Nextcloud groups whose members may read the project": "Nextcloud-csoportok, amelyek tagjai olvashatják a projektet", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-felhasználók, akik a projektet vezetik: beállítások, tagok és munka", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-felhasználók, akik olvashatják a projektet és munkáját, de nem módosíthatják", + "The Nextcloud group that owns the project with its creator, at most one": "A Nextcloud-csoport, amely a létrehozóval együtt birtokolja a projektet, legfeljebb egy", + "Nextcloud user ids who may read this through the project": "Nextcloud-felhasználók, akik ezt a projekten keresztül olvashatják", + "Nextcloud groups whose members may change this through the project": "Nextcloud-csoportok, amelyek tagjai ezt a projekten keresztül módosíthatják", + "Nextcloud groups whose members may read this through the project": "Nextcloud-csoportok, amelyek tagjai ezt a projekten keresztül olvashatják", + "Search for a person or a group…": "Személy vagy csoport keresése…", + "No one found. Your admin's sharing settings decide who you can find.": "Senki sem található. A rendszergazda megosztási beállításai döntik el, kiket találhatsz meg.", + "Type at least two characters": "Írj be legalább két karaktert", + "Everyone in this group": "Mindenki ebben a csoportban", + "Could not search for people. Please try again.": "Nem sikerült személyeket keresni. Próbáld újra.", + "Could not remove the group": "Nem sikerült eltávolítani a csoportot", + "Only the owner and managers change who is on this project.": "Csak a tulajdonos és a kezelők módosítják, ki van a projektben.", + "Role of {name}": "{name} szerepe", + "Manager": "Kezelő", + "Member": "Tag", + "Viewer": "Olvasó", + "Could not change the role": "Nem sikerült módosítani a szerepet", + "Owned by group: {name}": "A csoport tulajdona: {name}", + "No group owns this project.": "Egy csoport sem tulajdonosa ennek a projektnek.", + "Owned by group": "Csoport tulajdona", + "Search for a group…": "Csoport keresése…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nem található csoport. A rendszergazda megosztási beállításai döntik el, mely csoportokat találhatod meg.", + "No owning group": "Nincs tulajdonos csoport", + "Could not search for groups. Please try again.": "Nem sikerült csoportokat keresni. Próbáld újra.", + "Could not change the owning group": "Nem sikerült módosítani a tulajdonos csoportot", + "You can read this project. Only its members change it.": "Olvashatod ezt a projektet. Csak a tagjai módosítják.", + "Course": "Kurzus", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "A kurzus, amelyet ezen az órán tanítanak, például egy választható tárgy, ha az iskola tanulási alkalmazása ismeri.", + "Online meeting link": "Online óra hivatkozása", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Ahol a tanulók online csatlakoznak ehhez az órához. A Csatlakozás gomb csak https-hivatkozásnál jelenik meg." }, "plurals": null } diff --git a/l10n/is.js b/l10n/is.js index 1387e157..79e347cc 100644 --- a/l10n/is.js +++ b/l10n/is.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Virk verkefni", + "Archived projects": "Skjalfest verkefni", + "Boards": "Töflur", + "My projects": "Verkefnin mín", + "Portfolio": "Eignasafn", + "Project board": "Verkefnatafla", + "Projects I am in": "Verkefni sem ég tek þátt í", + "Timeline": "Tímalína", + "Timesheet": "Tímaskráning", + "Features & roadmap": "Eiginleikar og vegvísir", + "Flow": "Ferli", + "Flows": "Ferli", + "Reports": "Skýrslur", + "Pick a report to open it.": "Veldu skýrslu til að opna hana.", + "In progress": "Í vinnslu", + "Date": "Dagsetning", + "Due": "Skiladagur", + "Assignee": "Úthlutað", + "Who": "Hver", + "What": "Hvað", + "Minutes": "Mínútur", + "Entries": "Færslur", + "Most recent": "Nýjast", + "Per person": "Á mann", + "By status": "Eftir stöðu", + "By priority": "Eftir forgangi", + "Task status": "Staða verkefna", + "Time spent": "Tími sem varið er", + "Capacity": "Afkastageta", + "Due soonest": "Fyrst á skiladegi", + "Minutes logged": "Skráðar mínútur", + "Nothing is due": "Ekkert er á skiladegi", + "Nothing logged yet": "Ekkert skráð enn", + "What is open, what is blocked, and what is overdue.": "Hvað er opið, hvað er lokað og hvað er of seint.", + "How allocation is spread across the people working on projects.": "Hvernig álagið dreifist á fólkið sem vinnur að verkefnum.", + "Hours logged, and the projects they went to.": "Skráðar klukkustundir og verkefnin sem þær fóru í.", + "Billable": "Reikningsfært", + "Budget: {amount}": "Fjárhagsáætlun: {amount}", + "Loading projects": "Hleð verkefnum", + "No projects for this client yet": "Engin verkefni fyrir þennan viðskiptavin enn", + "Open in Planninq": "Opna í Planninq", + "This project could not be found": "Þetta verkefni fannst ekki", + "Untitled project": "Ónefnt verkefni", + "and {count} more": "og {count} til viðbótar", + "Store": "Verslun", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Settu upp skrár, skemu og flæði sem aðrar stofnanir hafa birt.", + "Work Date": "Vinnudagsetning", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Aðgerðir dálks", + "Columns": "Dálkar", + "Could not remove the column. Please try again.": "Ekki tókst að fjarlægja dálkinn. Reyndu aftur.", + "Could not save the column. Please try again.": "Ekki tókst að vista dálkinn. Reyndu aftur.", + "Done column": "Lokið-dálkur", + "Edit column": "Breyta dálki", + "Keep the card's status": "Halda stöðu spjaldsins", + "Move its cards to": "Færa spjöld hans í", + "Move left": "Færa til vinstri", + "Move right": "Færa til hægri", + "Status of cards moved here": "Staða spjalda sem eru færð hingað", + "The last done column cannot be removed.": "Ekki er hægt að fjarlægja síðasta lokið-dálkinn.", + "WIP limit": "WIP-mörk", + "over limit": "yfir mörkum", + "The status a card gets when it is moved into this column.": "Staðan sem spjald fær þegar það er fært í þennan dálk.", + "All priorities": "Allar forgangsraðanir", + "Could not create the task. Please try again.": "Ekki tókst að búa til verkefnið. Reyndu aftur.", + "Created": "Búið til", + "Move to backlog": "Í biðlistann", + "Move to board": "Á töfluna", + "New task": "Nýtt verkefni", + "Nothing in the backlog": "Ekkert í biðlistanum", + "Rank": "Röð", + "Sort by": "Raða eftir", + "Sort by rank to reorder": "Raðaðu eftir röð til að endurraða", + "Task actions": "Aðgerðir verkefnis", + "All labels": "Öll merki", + "Filter tasks by label": "Sía verkefni eftir merki", + "View timeline": "Skoða tímalínu", + "Board": "Tafla", + "List": "Listi", + "Column": "Dálkur", + "Board or list": "Tafla eða listi", + "Log": "Dagbók", + "Add entry": "Bæta við færslu", + "Show": "Sýna", + "No actions yet": "Engar aðgerðir enn", + "Closed": "Lokað", + "Entry actions": "Aðgerðir færslu", + "Add action": "Bæta við aðgerð", + "by {author}": "eftir {author}", + "saved {time}": "vistað {time}", + "Attendees: {names}": "Viðstaddir: {names}", + "Add the first entry": "Bæta við fyrstu færslunni", + "Issues": "Vandamál", + "Lessons learned": "Lærdómur", + "Meetings": "Fundir", + "Decisions": "Ákvarðanir", + "Actions": "Aðgerðir", + "Issue": "Vandamál", + "Lesson learned": "Lærdómur", + "Meeting": "Fundur", + "Decision": "Ákvörðun", + "About this project": "Um þetta verkefni", + "No description yet": "Engin lýsing enn", + "Start date": "Upphafsdagur", + "Not set": "Ekki stillt", + "End date": "Lokadagur", + "Progress": "Framvinda", + "No tasks yet": "Engin verkefni enn", + "Open the board": "Opna töfluna", + "People": "Fólk", + "Owner": "Eigandi", + "Latest log entries": "Nýjustu færslur", + "Open the log": "Opna dagbókina", + "{done} of {total} tasks done": "{done} af {total} verkefnum lokið", + "Edit entry": "Breyta færslu", + "Type": "Tegund", + "Attendees": "Viðstaddir", + "Issue is closed": "Vandamálinu er lokað", + "Could not save the entry. Please try again.": "Ekki tókst að vista færsluna. Reyndu aftur.", + "From: {title}": "Úr: {title}", + "What needs to happen": "Hvað þarf að gerast", + "Could not create the action. Please try again.": "Ekki tókst að búa til aðgerðina. Reyndu aftur.", + "The action was created but could not be linked to the entry.": "Aðgerðin var búin til en ekki tókst að tengja hana við færsluna.", + "Project pages": "Síður verkefnisins", + "Overview": "Yfirlit", + "Risks": "Áhættur", + "Log entry": "Dagbókarfærsla", + "A short name for the entry": "Stutt heiti færslunnar", + "Project": "Verkefni", + "The project this entry belongs to": "Verkefnið sem færslan tilheyrir", + "What kind of entry this is": "Hvers konar færsla þetta er", + "When it happened": "Hvenær það gerðist", + "What happened, in Markdown": "Hvað gerðist, í Markdown", + "Whether an issue is still open": "Hvort vandamál sé enn opið", + "The people at a meeting": "Fólkið á fundi", + "Tasks that came out of this entry": "Verkefni sem spruttu af þessari færslu", + "Add risk": "Bæta við áhættu", + "Risk": "Áhætta", + "Score": "Stig", + "Response": "Viðbrögð", + "Review date": "Endurskoðunardagur", + "no longer on the project": "er ekki lengur í verkefninu", + "Edit {title}": "Breyta {title}", + "No risks recorded yet": "Engar áhættur skráðar enn", + "Add the first risk": "Bæta við fyrstu áhættunni", + "Medium": "Miðlungs", + "Mitigating": "Í mildun", + "Occurred": "Kom fram", + "Avoid": "Forðast", + "Reduce": "Draga úr", + "Transfer": "Færa annað", + "Accept": "Samþykkja", + "Highest open risks": "Hæstu opnu áhættur", + "No open risks": "Engar opnar áhættur", + "Open the risk register": "Opna áhætturegistrið", + "Edit risk": "Breyta áhættu", + "What could go wrong": "Hvað getur farið úrskeiðis", + "Likelihood": "Líkur", + "Impact": "Áhrif", + "Score {score}": "Stig {score}", + "Countermeasures": "Mótvægisaðgerðir", + "Could not save the risk. Please try again.": "Ekki tókst að vista áhættuna. Reyndu aftur.", + "Risks by likelihood and impact": "Áhættur eftir líkum og áhrifum", + "Risk scale": "Áhættukvarði", + "The levels every project scores its risks on, and where low turns into medium and high": "Stigin sem hvert verkefni metur áhættur sínar á, og hvar lágt verður miðlungs og hátt", + "Number of levels": "Fjöldi stiga", + "Likelihood labels": "Heiti fyrir líkur", + "Impact labels": "Heiti fyrir áhrif", + "Level {level}": "Stig {level}", + "Medium from score": "Miðlungs frá stigum", + "High from score": "Hátt frá stigum", + "Risk scale saved": "Áhættukvarði vistaður", + "1 risk uses level {level}. Change it first.": "1 áhætta notar stig {level}. Breyttu henni fyrst.", + "{count} risks use level {level}. Change them first.": "{count} áhættur nota stig {level}. Breyttu þeim fyrst.", + "Every level needs a label, and high must start above medium.": "Hvert stig þarf heiti, og hátt verður að byrja fyrir ofan miðlungs.", + "The project this risk belongs to": "Verkefnið sem áhættan tilheyrir", + "The cause and the effect, in Markdown": "Orsök og afleiðing, í Markdown", + "Category": "Flokkur", + "A free grouping, such as planning, budget or supplier": "Frjáls flokkun, t.d. áætlun, fjárhagsáætlun eða birgir", + "How likely it is, on the admin's risk scale": "Hversu líklegt það er, á áhættukvarða kerfisstjórans", + "How hard it would hit, on the admin's risk scale": "Hversu hart það myndi koma niður, á áhættukvarða kerfisstjórans", + "Likelihood times impact, calculated by the server": "Líkur sinnum áhrif, reiknað af þjóninum", + "Where the risk stands": "Hvar áhættan stendur", + "The person who watches this risk": "Manneskjan sem fylgist með áhættunni", + "How the project answers the risk": "Hvernig verkefnið bregst við áhættunni", + "What is done to prevent it or soften it, in Markdown": "Hvað er gert til að koma í veg fyrir hana eða milda, í Markdown", + "When to look at this risk again": "Hvenær á að skoða áhættuna aftur", + "Very low": "Mjög lágt", + "Very high": "Mjög hátt", + "All projects": "Öll verkefni", + "Project status report": "Stöðuskýrsla verkefnis", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Dagsett skýrsla um hvernig verkefni stendur varðandi fé, skipulag, tíma, upplýsingar, gæði og áhættu (GROTIK-þættirnir), hvert með athugasemd.", + "The project this report is about": "Verkefnið sem skýrslan fjallar um", + "Report date": "Dagsetning skýrslu", + "The day the report describes": "Dagurinn sem skýrslan lýsir", + "Money": "Fé", + "How the project stands on this aspect": "Hvernig verkefnið stendur varðandi þennan þátt", + "On track": "Á áætlun", + "At risk": "Í hættu", + "Off track": "Út af áætlun", + "Money note": "Athugasemd um fé", + "A short explanation of this status": "Stutt skýring á þessari stöðu", + "Organisation": "Skipulag", + "Organisation note": "Athugasemd um skipulag", + "Time": "Tími", + "Time note": "Athugasemd um tíma", + "Information": "Upplýsingar", + "Information note": "Athugasemd um upplýsingar", + "Quality": "Gæði", + "Quality note": "Athugasemd um gæði", + "Risk note": "Athugasemd um áhættu", + "Overall": "Heildarstaða", + "The worst of the six statuses, calculated by the server": "Versta staðan af sex, reiknuð af þjóninum", + "Health: money": "Heilbrigði: fé", + "Copied from the newest status report": "Afritað úr nýjustu stöðuskýrslunni", + "Health: organisation": "Heilbrigði: skipulag", + "Health: time": "Heilbrigði: tími", + "Health: information": "Heilbrigði: upplýsingar", + "Health: quality": "Heilbrigði: gæði", + "Health: risk": "Heilbrigði: áhætta", + "Health: overall": "Heilbrigði: heildarstaða", + "Health: report date": "Heilbrigði: dagsetning skýrslu", + "The date of the newest status report": "Dagsetning nýjustu stöðuskýrslunnar", + "New report": "Ný skýrsla", + "Only the project owner writes status reports.": "Aðeins eigandi verkefnisins skrifar stöðuskýrslur.", + "Latest report, {date}": "Nýjasta skýrsla, {date}", + "Aspect": "Þáttur", + "Note": "Athugasemd", + "Report history": "Skýrslusaga", + "Author": "Höfundur", + "No status reports yet": "Engar stöðuskýrslur enn", + "Write the first report": "Skrifa fyrstu skýrsluna", + "Choose a status for every aspect to save the report.": "Veldu stöðu fyrir hvern þátt til að vista skýrsluna.", + "Suggested: on track.": "Tillaga: á áætlun.", + "Suggested: at risk.": "Tillaga: í hættu.", + "Suggested: off track.": "Tillaga: út af áætlun.", + "1 task is past its due date.": "1 verk er komið fram yfir skiladag.", + "{count} tasks are past their due date.": "{count} verk eru komin fram yfir skiladag.", + "The end date has passed with 1 open task.": "Lokadagur er liðinn með 1 opið verk.", + "The end date has passed with {count} open tasks.": "Lokadagur er liðinn með {count} opin verk.", + "No open task is past its due date.": "Ekkert opið verk er komið fram yfir skiladag.", + "The highest open risk, \"{title}\", scores {score}.": "Hæsta opna áhættan, \"{title}\", fær {score} stig.", + "There are no open risks.": "Engar opnar áhættur.", + "Costs are at {percent}% of the budget.": "Kostnaður er {percent}% af fjárhagsáætlun.", + "No suggestion: the project has no budget.": "Engin tillaga: verkefnið hefur enga fjárhagsáætlun.", + "No suggestion: no costs are recorded for this project yet.": "Engin tillaga: enginn kostnaður hefur enn verið skráður á þetta verkefni.", + "The report was not saved. Only the project owner can write status reports.": "Skýrslan var ekki vistuð. Aðeins eigandi verkefnisins getur skrifað stöðuskýrslur.", + "No report": "Engin skýrsla", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Hópur verkefna sem sama fólkið stýrir, til dæmis deild eða áætlun. Umsjónarmenn hans lesa hvert verkefni í honum.", + "The name of the portfolio": "Heiti safnsins", + "What the portfolio holds and who runs it": "Hvað safnið inniheldur og hver stýrir því", + "A colour for the portfolio's section in project lists": "Litur fyrir hluta safnsins í verkefnalistum", + "Managers": "Umsjónarmenn", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-notendaauðkenni fólksins sem stýrir safninu", + "Order": "Röð", + "Where the portfolio comes in project lists, lowest first": "Hvar safnið kemur í verkefnalistum, lægst fyrst", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Eigin áhættukvarði þessa safns sem JSON, á sama formi og kvarðinn fyrir allt forritið. Tómt þýðir kvarðinn fyrir allt forritið.", + "Portfolio readers": "Lesendur safns", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-notendaauðkenni umsjónarmanna safns verkefnisins", + "The portfolio this project belongs to": "Safnið sem þetta verkefni tilheyrir", + "No portfolio": "Ekkert safn", + "All portfolios": "Öll söfn", + "You read this project as a manager of its portfolio. Only its members change it.": "Þú lest þetta verkefni sem umsjónarmaður safns þess. Aðeins meðlimir þess breyta því.", + "Portfolios": "Söfn", + "Portfolio status": "Staða safns", + "No portfolios yet": "Engin söfn enn", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Kerfisstjóri bætir við söfnum undir Verkefni, Söfn. Verkefni í safni eru talin hér með stöðu sinni.", + "Roll-up": "Samantekt", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} á áætlun, {atRisk} í hættu, {offTrack} af áætlun, {noReport} án skýrslu", + "No project in this portfolio that you can read.": "Ekkert verkefni í þessu safni sem þú getur lesið.", + "Start": "Upphaf", + "End": "Lok", + "Budget": "Fjárhagsáætlun", + "Last report": "Síðasta skýrsla", + "Out of date": "Úrelt", + "Portfolio timeline": "Tímalína safns", + "Zoom": "Aðdráttur", + "Could not load the timeline": "Ekki tókst að hlaða tímalínunni", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Kerfisstjóri bætir við söfnum undir Verkefni, Söfn. Verkefni í safni eru sýnd hér á einni tímalínu.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Opnaðu verkefni til að sjá áfanga þess og verk. Tímalínan er aðeins til lestrar.", + "Phase: {title}": "Áfangi: {title}", + "Left out because you cannot read them: {count} projects": "Sleppt því þú getur ekki lesið þau: {count} verkefni", + "Week": "Vika", + "Day": "Dagur", + "Month": "Mánuður", + "Please try again later.": "Reyndu aftur síðar.", + "Status reports": "Stöðuskýrslur", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Eftir hve marga daga síðasta stöðuskýrsla verkefnis er merkt úrelt í yfirliti safnsins", + "Reporting period (days)": "Skýrslutímabil (dagar)", + "The reporting period is a whole number of days from 1 to 365.": "Skýrslutímabilið er heill fjöldi daga frá 1 til 365.", + "Reporting period saved": "Skýrslutímabil vistað", + "The reporting period was not saved. Please try again.": "Skýrslutímabilið var ekki vistað. Reyndu aftur.", + "Every project of a portfolio with its status per aspect, rolled up.": "Hvert verkefni safns með stöðu eftir þáttum, tekið saman.", + "The projects of a portfolio on one timeline.": "Verkefni safns á einni tímalínu.", + "Phases": "Áfangar", + "Add phase": "Bæta við áfanga", + "No phases yet": "Engir áfangar enn", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Skiptu verkefninu í áfanga, t.d. upphaf, skilgreiningu og framkvæmd. Áfanga lýkur þegar lokaskjal hans hefur verið hlaðið upp.", + "{hours} hours": "{hours} klst.", + "Concluding document: {title}": "Lokaskjal: {title}", + "Concluding document missing": "Lokaskjal vantar", + "Move {title} up": "Færa {title} upp", + "Move {title} down": "Færa {title} niður", + "Close phase": "Loka áfanga", + "Phase": "Áfangi", + "Files": "Skrár", + "Notes": "Athugasemdir", + "Audit trail": "Endurskoðunarslóð", + "Edit phase": "Breyta áfanga", + "Name": "Heiti", + "Budget hours": "Áætlaðar stundir", + "Could not save the phase. Please try again.": "Ekki tókst að vista áfangann. Reyndu aftur.", + "Close phase {title}": "Loka áfanganum {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Áfanga lýkur með lokaskjali sínu: hladdu því upp hér eða veldu eina af skrám áfangans.", + "Concluding document": "Lokaskjal", + "This phase has no files yet.": "Þessi áfangi hefur engar skrár enn.", + "Upload a document": "Hlaða upp skjali", + "The document was not uploaded. Please try again.": "Skjalinu var ekki hlaðið upp. Reyndu aftur.", + "Upload the concluding document before you close this phase.": "Hladdu upp lokaskjalinu áður en þú lokar þessum áfanga.", + "This phase cannot be closed from its current status.": "Ekki er hægt að loka þessum áfanga úr núverandi stöðu hans.", + "The phase was not closed. Please try again.": "Áfanganum var ekki lokað. Reyndu aftur.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Auðkenni skrárinnar á þessum áfanga sem lýkur honum. Aðeins er hægt að ljúka áfanganum þegar það er skráð og skráin er viðhengd.", + "Import from Microsoft Project": "Flytja inn úr Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Veldu áætlun sem var vistuð úr Microsoft Project á XML-sniði. Ekkert er flutt inn fyrr en þú staðfestir.", + "Plan file": "Áætlunarskrá", + "What the import creates": "Það sem innflutningurinn býr til", + "Tasks": "Verk", + "Sub-tasks": "Undirverk", + "Milestones": "Áfangar", + "Links": "Tengingar", + "Already imported, updated in place: {count}": "Þegar innflutt, uppfært á staðnum: {count}", + "What does not carry over": "Það sem flyst ekki með", + "Tasks with resources, which are not imported: {count}": "Verk með tilföng, sem eru ekki flutt inn: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Verk neðar en á stigi 3, sett undir verk sitt á stigi 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Tengingar aðrar en lok-í-upphaf, fluttar inn sem tengdar tengingar: {count}", + "Link lags, which are dropped: {count}": "Tafir á tengingum, sem falla niður: {count}", + "Links to a summary task, which are not imported: {count}": "Tengingar við samantektarverk, sem eru ekki fluttar inn: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Tengingar við verk utan þessarar áætlunar, sem eru ekki fluttar inn: {count}", + "No longer in the plan": "Ekki lengur í áætluninni", + "These stay in the project; remove them yourself if they are no longer needed.": "Þau verða áfram í verkefninu; fjarlægðu þau sjálf ef ekki er lengur þörf fyrir þau.", + "Import": "Flytja inn", + "Close": "Loka", + "The plan is imported: {created} created, {updated} updated.": "Áætlunin er flutt inn: {created} búin til, {updated} uppfærð.", + "Links that would close a loop were left out: {count}": "Tengingum sem myndu loka hring var sleppt: {count}", + "The import stopped part-way. Run it again to finish it.": "Innflutningurinn stöðvaðist á miðri leið. Keyrðu hann aftur til að ljúka honum.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Vistaðu áætlunina í Microsoft Project með Skrá, Vista sem, XML-snið, og fluttu þá skrá inn.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Þessi skrá skilgreinir DOCTYPE eða einingar, sem eru ekki samþykktar.", + "The file is larger than 10 MB.": "Skráin er stærri en 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Áætlunin hefur fleiri en 2.000 verk, fleiri en einn innflutningur tekur.", + "This file is not a Microsoft Project plan in XML format.": "Þessi skrá er ekki Microsoft Project-áætlun á XML-sniði.", + "Choose a file to import.": "Veldu skrá til að flytja inn.", + "Only the project owner can import a plan.": "Aðeins eigandi verkefnisins getur flutt inn áætlun.", + "The plan could not be read. Please try again.": "Ekki tókst að lesa áætlunina. Reyndu aftur.", + "Linked case: {title}": "Tengt mál: {title}", + "Linked to a case": "Tengt máli", + "Hand over to case": "Afhenda máli", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Afritar hverja skrá verkefnisins og verka þess, og skrá sem lýsir verkefninu, óbreytta í tengda málið.", + "{date} by {user}": "{date} af {user}", + "Files copied: {count}": "Skrár afritaðar: {count}", + "Files that failed: {names}": "Skrár sem mistókust: {names}", + "The handover failed. Please try again.": "Afhendingin mistókst. Reyndu aftur.", + "The linked case could not be found, or you cannot open it.": "Tengda málið fannst ekki, eða þú getur ekki opnað það.", + "Case handovers": "Afhendingar til málsins", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Í hvert sinn sem skrár og lýsigögn verkefnisins voru afhent málinu: hvenær, af hverjum, til hvaða máls, hver afrituð skrá með SHA-256 hennar, og skrárnar sem mistókust.", + "Finance": "Fjármál", + "Add cost line": "Bæta við kostnaðarlínu", + "Delivery terms": "Afhendingarskilmálar", + "Billing model": "Reikningslíkan", + "Budget in euro": "Fjárhagsáætlun í evrum", + "Budget in hours": "Fjárhagsáætlun í klukkustundum", + "Hourly rate in euro": "Tímagjald í evrum", + "Planned start": "Áætlað upphaf", + "Planned end": "Áætluð lok", + "Planned dates": "Áætlaðar dagsetningar", + "Budget {amount}": "Fjárhagsáætlun {amount}", + "No budget agreed": "Engin fjárhagsáætlun samþykkt", + "Hours": "Klukkustundir", + "Only the project owner and the portfolio managers see the amounts.": "Aðeins eigandi verkefnisins og stjórnendur safnsins sjá upphæðirnar.", + "Budget against cost per category": "Fjárhagsáætlun á móti kostnaði eftir flokkum", + "Labour (booked time)": "Vinna (skráður tími)", + "No category": "Enginn flokkur", + "Hours are not available": "Klukkustundirnar eru ekki tiltækar", + "Not yet assigned to a category": "Ekki enn úthlutað í flokk", + "Total": "Samtals", + "{spent} spent, {remaining} remaining": "{spent} eytt, {remaining} eftir", + "Budget against cost per phase": "Fjárhagsáætlun á móti kostnaði eftir áföngum", + "No phase": "Enginn áfangi", + "Cost lines": "Kostnaðarlínur", + "From the finance system": "Úr fjárhagskerfinu", + "Edit cost line {amount}": "Breyta kostnaðarlínunni {amount}", + "No cost lines yet": "Engar kostnaðarlínur enn", + "Commitments": "Skuldbindingar", + "Actual cost": "Raunkostnaður", + "Forecast": "Spá", + "Remaining": "Eftir", + "Not planned yet": "Ekki enn áætlað", + "{start} to {end}": "{start} til {end}", + "The terms were not saved. Please try again.": "Skilmálarnir voru ekki vistaðir. Reyndu aftur.", + "Terms saved": "Skilmálar vistaðir", + "Fixed price": "Fast verð", + "Hourly": "Á klukkustund", + "Not billed": "Ekki rukkað", + "Commitment": "Skuldbinding", + "Edit cost line": "Breyta kostnaðarlínu", + "Kind": "Tegund", + "Amount in euro": "Upphæð í evrum", + "Remove": "Fjarlægja", + "Could not save the cost line. Only the project owner changes the money of a project.": "Ekki tókst að vista kostnaðarlínuna. Aðeins eigandi verkefnisins breytir fjármunum verkefnis.", + "Could not remove the cost line. Please try again.": "Ekki tókst að fjarlægja kostnaðarlínuna. Reyndu aftur.", + "{amount} over budget": "{amount} yfir fjárhagsáætlun", + "Cost categories": "Kostnaðarflokkar", + "The categories every project splits its budget and costs into, one per line": "Flokkarnir sem hvert verkefni skiptir fjárhagsáætlun sinni og kostnaði í, einn í hverja línu", + "Categories": "Flokkar", + "Give at least one category, each name once.": "Tilgreindu að minnsta kosti einn flokk, hvert nafn einu sinni.", + "Cost categories saved": "Kostnaðarflokkar vistaðir", + "The cost categories were not saved. Please try again.": "Kostnaðarflokkarnir voru ekki vistaðir. Reyndu aftur.", + "Finance line": "Fjármálalína", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Ein fjárhæð á verkefni: fjárhagsáætlun, skuldbinding, raunkostnaður eða spá, í kostnaðarflokki og mögulega áfanga. Skráð af eiganda verkefnisins eða send af fjárhagskerfinu í gegnum samþættingarforritið.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Verkefnið sem fjárhæðin tilheyrir. Autt fyrir línu úr fjárhagskerfinu þar sem verkefnisnúmerið passar ekki við neitt verkefni.", + "The phase this amount belongs to, if any": "Áfanginn sem fjárhæðin tilheyrir, ef einhver", + "The cost category, one of the categories the admin set up": "Kostnaðarflokkurinn, einn af flokkunum sem stjórnandinn setti upp", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Hvort fjárhæðin er fjárhagsáætlun, skuldbinding, raunkostnaður eða spá", + "Amount": "Fjárhæð", + "The amount in the reporting currency (euro)": "Fjárhæðin í skýrslugjaldmiðlinum (evrur)", + "The date the amount was booked or is expected": "Dagsetningin þegar fjárhæðin var bókuð eða er væntanleg", + "What the amount is for": "Til hvers fjárhæðin er", + "Whether a person entered the line or the finance system sent it": "Hvort manneskja skráði línuna eða fjárhagskerfið sendi hana", + "Entered by hand": "Skráð handvirkt", + "Finance line id": "Auðkenni fjármálalínu", + "The finance system's own id of this line. One imported line per id.": "Eigið auðkenni línunnar í fjárhagskerfinu. Ein innflutt lína á hvert auðkenni.", + "Project number": "Verkefnisnúmer", + "The project number the finance system sent, matched against the project key": "Verkefnisnúmerið sem fjárhagskerfið sendi, borið saman við lykil verkefnisins", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Safn verkefnis línunnar, afritað úr verkefninu svo að heildartölur safnsins þurfi eina síu", + "Finance readers": "Fjármálalesendur", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-notandaauðkenni þeirra sem mega sjá fjárhæðina: eigandi verkefnisins og stjórnendur safnsins", + "Project owner": "Eigandi verkefnis", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-notandaauðkenni eiganda verkefnisins, sem má breyta og fjarlægja handvirkar línur", + "How the client pays: not billed, a fixed price, or by the hour.": "Hvernig viðskiptavinurinn greiðir: ekki rukkað, fast verð eða á klukkustund.", + "Portfolio finance": "Fjármál safns", + "You cannot see the money of any project in this portfolio": "Þú getur ekki séð fjármuni neins verkefnis í þessu safni", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Þjónninn skilaði kostnaðarlínum verkefna utan þessa safns, svo heildartölurnar gætu verið rangar.", + "Projects left out because you cannot see their money: {count}": "Verkefni sleppt af því að þú sérð ekki fjármuni þeirra: {count}", + "Unmatched finance lines": "Ópöruð fjármálalínur", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Fjárhagsáætlun, skuldbindingar, raunkostnaður og spá lögð saman fyrir safn.", + "Subprojects": "Undirverkefni", + "{done} of {total}": "{done} af {total}", + "{done} of {total} tasks done, including subprojects": "{done} af {total} verkum lokið, með undirverkefnum", + "Show the subprojects of {title}": "Sýna undirverkefni {title}", + "Hide the subprojects of {title}": "Fela undirverkefni {title}", + "Part of": "Hluti af", + "No parent project": "Ekkert yfirverkefni", + "A project cannot sit under one of its own subprojects.": "Verkefni getur ekki verið undir einu af sínum eigin undirverkefnum.", + "Projects nest three levels deep at most: programme, project and subproject.": "Verkefni geta verið í mesta lagi þrjú stig: áætlun, verkefni og undirverkefni.", + "Parent project": "Yfirverkefni", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Verkefnið sem þetta verkefni er undir, til dæmis áætlun. Verkefni geta verið í mesta lagi þrjú stig.", + "Yes": "Já", + "No": "Nei", + "{label} (required)": "{label} (skylt)", + "{label} is required": "{label} er skylt", + "Project field": "Verkefnisreitur", + "A field an admin adds to every project, such as a policy area or a contract value.": "Reitur sem stjórnandi bætir við öll verkefni, til dæmis málaflokkur eða samningsvirði.", + "Key": "Lykill", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Fasta nafnið sem gildið er vistað undir, í lower camel case. Haltu því þegar verkefni nota það.", + "Label": "Merki", + "The name people see next to the field": "Nafnið sem fólk sér við reitinn", + "What the field holds": "Hvað reiturinn geymir", + "Text": "Texti", + "Number": "Tala", + "Choice": "Val", + "Person": "Manneskja", + "Yes or no": "Já eða nei", + "Options": "Valkostir", + "The choices of a choice field": "Valkostir valreits", + "Required": "Skylt", + "Whether a project must fill in the field": "Hvort verkefni verði að fylla út reitinn", + "Where the field appears, lowest first": "Hvar reiturinn birtist, lægst fyrst", + "Applies to": "Á við", + "What the field is added to": "Hverju reitnum er bætt við", + "Custom fields": "Eigin reitir", + "The values of the project fields an admin defined, keyed by the field's key.": "Gildi verkefnisreitanna sem stjórnandi skilgreindi, eftir lykli reitsins.", + "Project fields": "Verkefnisreitir", + "Related": "Tengd", + "Remove link": "Fjarlægja tengingu", + "Link type": "Tegund tengingar", + "Relates to": "Tengist", + "Duplicates": "Tvítekur", + "Project key": "Verkefnislykill", + "Every task number starts with it, such as VERG-42.": "Hvert verknúmer byrjar á honum, til dæmis VERG-42.", + "This key is already used by another project.": "Annað verkefni notar þegar þennan lykil.", + "Use 2 to 10 letters and digits, starting with a letter.": "Notaðu 2 til 10 stafi og tölustafi sem byrja á bókstaf.", + "The key cannot change once tasks carry it.": "Ekki er hægt að breyta lyklinum þegar verk bera hann.", + "Project saved. The existing tasks get their numbers in the background.": "Verkefni vistað. Núverandi verk fá númerin sín í bakgrunni.", + "Next task number": "Næsta verknúmer", + "The number the next task of this project gets in its key. Only the system writes it.": "Númerið sem næsta verk þessa verkefnis fær í lykli sínum. Aðeins kerfið skrifar það.", + "Restore {title}": "Endurheimta {title}", + "Restore": "Endurheimta", + "Project restored": "Verkefni endurheimt", + "Could not restore the project": "Ekki tókst að endurheimta verkefnið", + "Bring this project back to the active list.": "Settu þetta verkefni aftur á lista yfir virk verkefni.", + "Restore project": "Endurheimta verkefni", + "Request reason": "Ástæða beiðninnar", + "Why the requester needs this project. Filled in when the project is requested.": "Hvers vegna umsækjandinn þarf þetta verkefni. Fyllt út við beiðnina.", + "Reviewed by": "Yfirfarið af", + "The user who approved or rejected the request.": "Notandinn sem samþykkti eða hafnaði beiðninni.", + "Reviewed at": "Yfirfarið", + "When the request was approved or rejected.": "Hvenær beiðnin var samþykkt eða henni hafnað.", + "Review note": "Athugasemd yfirferðar", + "The reviewer's reason, shown to the requester when a request is not approved.": "Ástæða þess sem yfirfór, sem umsækjandinn sér þegar beiðni er ekki samþykkt.", + "Members of these groups": "Meðlimir þessara hópa", + "Groups that may create projects": "Hópar sem mega stofna verkefni", + "The group {group} no longer exists. Save to remove it.": "Hópurinn {group} er ekki lengur til. Vistaðu til að fjarlægja hann.", + "Review project request": "Yfirfara verkefnisbeiðni", + "Requested by": "Beðið af", + "Why it is needed": "Af hverju þess er þörf", + "Desired start date": "Æskileg upphafsdagsetning", + "Why is it not approved?": "Af hverju er það ekki samþykkt?", + "Give a reason. The requester sees it.": "Gefðu ástæðu. Umsækjandinn sér hana.", + "Approve": "Samþykkja", + "Reject": "Hafna", + "Reject request": "Hafna beiðni", + "The review was not saved. Try again.": "Yfirferðin var ekki vistuð. Reyndu aftur.", + "This project is waiting for review": "Þetta verkefni bíður yfirferðar", + "This request was not approved": "Þessi beiðni var ekki samþykkt", + "Reason: {note}": "Ástæða: {note}", + "Review request": "Yfirfara beiðni", + "Request a project": "Biðja um verkefni", + "Step {step} of 2": "Skref {step} af 2", + "Why is this project needed?": "Af hverju þarf þetta verkefni?", + "Give a reason. The reviewer reads it.": "Gefðu ástæðu. Sá sem yfirfer les hana.", + "Back": "Til baka", + "Next": "Áfram", + "Send request": "Senda beiðni", + "The request was not sent. Try again.": "Beiðnin var ekki send. Reyndu aftur.", + "Requested": "Beðið um", + "Not approved": "Ekki samþykkt", + "Your request was sent": "Beiðnin þín var send", + "Let everyone else request a project": "Leyfa öllum öðrum að biðja um verkefni", + "Add a task": "Bæta við verkefni", + "Delete task": "Eyða verkefni", + "Edit task": "Breyta verkefni", + "Write": "Skrifa", + "Preview": "Forskoðun", + "Markdown works here: headings, lists and links.": "Markdown virkar hér: fyrirsagnir, listar og tenglar.", + "Could not save the task. Please try again.": "Ekki tókst að vista verkefnið. Reyndu aftur.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Tími hefur verið skráður á \"{title}\" og því er ekki hægt að eyða því. Þú getur hætt við það í staðinn: tímaskráningarnar haldast.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Eyða \"{title}\"? Tenglar þess við önnur verkefni eru líka fjarlægðir. Þetta er ekki hægt að afturkalla.", + "Keep task": "Halda verkefni", + "Cancel task": "Hætta við verkefni", + "Only the reporter, the project owner or an admin can delete this task.": "Aðeins sá sem tilkynnti það, eigandi verkefnisins eða stjórnandi getur eytt þessu verkefni.", + "Could not delete the task. Please try again.": "Ekki tókst að eyða verkefninu. Reyndu aftur.", + "Could not cancel the task. Please try again.": "Ekki tókst að hætta við verkefnið. Reyndu aftur.", + "Responsible": "Ábyrgðaraðili", + "Also working on this": "Vinnur líka að þessu", + "Labels": "Merki", + "Could not change the priority. Please try again.": "Ekki tókst að breyta forgangi. Reyndu aftur.", + "Other project members who work on this task alongside the person responsible.": "Aðrir meðlimir verkefnisins sem vinna að þessu verkefni með ábyrgðaraðilanum.", + "Duplicate": "Tvítaka", + "Could not copy the task. Please try again.": "Ekki tókst að afrita verkefnið. Reyndu aftur.", + "Subtasks": "Undirverkefni", + "{done} of {total} done": "{done} af {total} lokið", + "Add a subtask": "Bæta við undirverkefni", + "Checklist": "Gátlisti", + "Checklist item actions": "Aðgerðir fyrir atriði á gátlista", + "Add a checklist item": "Bæta atriði á gátlista", + "Subtasks: {estimate} estimated, {logged} logged": "Undirverkefni: {estimate} áætlað, {logged} skráð", + "Total estimate: {total}": "Heildaráætlun: {total}", + "Part of {title}": "Hluti af {title}", + "Checklist: {count} done": "Gátlisti: {count} lokið", + "This task has subtasks: {count}.": "Þetta verkefni hefur undirverkefni: {count}.", + "Keep subtasks as separate tasks": "Halda undirverkefnum sem sérstökum verkefnum", + "Delete subtasks too": "Eyða undirverkefnum líka", + "Copy of {title}": "Afrit af {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Verkefnið var afritað, en ekki öll undirverkefni þess. Athugaðu afritið.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Lítil skref innan verkefnisins. Hvert atriði hefur auðkenni, texta og hvort því sé lokið.", + "Open work per person and per project.": "Opin vinna eftir einstaklingi og verkefni.", + "View": "Yfirlit", + "By person": "Eftir einstaklingi", + "By project": "Eftir verkefni", + "Hours left": "Klukkustundir eftir", + "Tasks without an estimate": "Verk án áætlunar", + "Due in 14 days": "Á gjalddaga innan 14 daga", + "Shared": "Deilt", + "Unassigned": "Ekki úthlutað", + "{hours} h": "{hours} klst.", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Sýnir vinnu í verkefnunum sem þú sérð. Klukkustundir teljast hjá ábyrgðaraðila; deild verk eru talin án klukkustunda.", + "No open work in these projects.": "Engin opin vinna í þessum verkefnum.", + "Open work": "Opin vinna", + "{count} open tasks": "{count} opin verk", + "Create a project to see capacity here.": "Stofnaðu verkefni til að sjá afkastagetu hér.", + "My tasks": "Verkin mín", + "Show all my tasks": "Sýna öll verkin mín", + "No tasks assigned to you": "Engum verkum úthlutað til þín", + "Browse projects": "Skoða verkefni", + "Later": "Síðar", + "Due {date}": "Gjalddagi {date}", + "Could not change the status. Please try again.": "Ekki tókst að breyta stöðunni. Reyndu aftur.", + "Completed today": "Lokið í dag", + "My open tasks": "Opin verk mín", + "My overdue tasks": "Verk mín í vanskilum", + "My tasks in progress": "Verk mín í vinnslu", + "Pin to the top": "Festa efst", + "Unpin": "Losa", + "Pinned": "Fest", + "Actions for {title}": "Aðgerðir fyrir {title}", + "Could not save your project order. Please try again.": "Ekki tókst að vista röð verkefnanna þinna. Reyndu aftur.", + "No boards yet": "Engar töflur enn", + "Create a project to get a board.": "Stofnaðu verkefni til að fá töflu.", + "Use the Projects page to create and manage your projects and tasks.": "Notaðu síðuna Verkefni til að stofna og stjórna verkefnum og verkum.", + "Go to projects": "Fara í verkefni", + "You are not a member of any projects yet.": "Þú ert ekki enn meðlimur í neinu verkefni.", + "Could not search for users. Please try again.": "Ekki tókst að leita að notendum. Reyndu aftur.", + "Project creation is restricted to administrators.": "Aðeins stjórnendur geta stofnað verkefni.", + "Only the project owner or an administrator can delete this project.": "Aðeins eigandi verkefnisins eða stjórnandi getur eytt þessu verkefni.", + "No projects are available to you yet. Ask an administrator to create one.": "Engin verkefni eru enn í boði fyrir þig. Biddu stjórnanda um að stofna eitt.", + "Due: {date}": "Gjalddagi: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Verk með upphafs- eða gjalddaga birtast á tímalínunni. Bættu við dagsetningum til að sjá þau hér.", + "You do not have access to this project.": "Þú hefur ekki aðgang að þessu verkefni.", + "Zoom level": "Aðdráttarstig", + "Unscheduled": "Óáætlað", + "Start: {date}": "Upphaf: {date}", + "Today": "Í dag", + "No scheduled tasks": "Engin áætluð verk", + "An unexpected error occurred.": "Óvænt villa kom upp.", + "Column {number} name": "Heiti dálks {number}", + "Failed to save creation policy": "Ekki tókst að vista stefnu um stofnun", + "All authenticated users": "Allir innskráðir notendur", + "Control who may create new projects": "Stjórnaðu hverjir mega stofna ný verkefni", + "Administrators only": "Aðeins stjórnendur", + "Project creation": "Stofnun verkefna", + "Allow project creation": "Leyfa stofnun verkefna", + "Creation policy saved successfully": "Stefna um stofnun vistuð", + "Initializing…": "Ræsir…", + "e.g. 2h 30m, 90m, 1.5h": "t.d. 2h 30m, 90m, 1.5h", + "Log time": "Skrá tíma", + "Save estimate": "Vista áætlun", + "Logged: {logged}": "Skráð: {logged}", + "over by {amount}": "{amount} umfram", + "Time tracking": "Tímaskráning", + "Estimate": "Áætlun", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Sláðu inn gilda áætlun (t.d. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Sláðu inn gilda lengd (t.d. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Ekki tókst að vista tímaskráninguna. Reyndu aftur.", + "Edit time entry": "Breyta tímaskráningu", + "Duration": "Lengd", + "Date range": "Tímabil", + "Last week": "Síðasta vika", + "No time logged": "Enginn tími skráður", + "Log time on a task to see it here.": "Skráðu tíma á verk til að sjá hann hér.", + "To date": "Til dags", + "This week": "Þessi vika", + "Total: {total}": "Samtals: {total}", + "From date": "Frá degi", + "Custom range": "Sérsniðið tímabil", + "All time": "Allur tími", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Ekki tókst að eyða verki, svo gögn gætu orðið eftir. Eyddu verkefninu aftur.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Ekki tókst að eyða tímaskráningu, svo gögn gætu orðið eftir. Eyddu verkefninu aftur.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Ekki tókst að eyða dálki, svo gögn gætu orðið eftir. Eyddu verkefninu aftur.", + "Could not delete the project. Please try again.": "Ekki tókst að eyða verkefninu. Reyndu aftur.", + "Notification settings": "Tilkynningastillingar", + "Configure when due-date reminders are sent": "Stilltu hvenær áminningar um gjalddaga eru sendar", + "Due-date reminder lead time (hours)": "Fyrirvari áminningar um gjalddaga (klst.)", + "Lead time must be between 1 and 336 hours": "Fyrirvarinn verður að vera á milli 1 og 336 klst.", + "Reminder lead time saved successfully": "Fyrirvari áminningar vistaður", + "Failed to save reminder lead time": "Ekki tókst að vista fyrirvara áminningar", + "Notifications": "Tilkynningar", + "Notify me 1 day before a task's due date": "Láttu mig vita 1 degi fyrir gjalddaga verks", + "Draft": "Drög", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Hvort kennslustundin er drög sem aðeins kennarinn sér, fer fram eða fellur niður.", + "New release": "Ný útgáfa", + "Roadmap chart. The same releases and epics are listed below.": "Graf yfir vegvísi. Sömu útgáfur og epics eru taldar upp hér að neðan.", + "Nothing on the roadmap yet": "Ekkert á vegvísinum enn", + "Releases with a target date and epics with dated tasks appear here.": "Hér birtast útgáfur með markdagsetningu og epics með dagsettum verkefnum.", + "Releases": "Útgáfur", + "No releases yet": "Engar útgáfur enn", + "Target date: {date}": "Markdagsetning: {date}", + "No target date": "Engin markdagsetning", + "Edit {name}": "Breyta {name}", + "Mark {name} as released": "Merkja {name} sem gefna út", + "Mark as released": "Merkja sem gefið út", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Engin epics enn. Opnaðu verkefni til að gera það að epic.", + "Not scheduled yet": "Ekki tímasett enn", + "Planned": "Áætluð", + "Released": "Gefin út", + "Edit release": "Breyta útgáfu", + "Target date": "Markdagsetning", + "Could not save the release. Please try again.": "Ekki tókst að vista útgáfuna. Reyndu aftur.", + "Every task of this release is done or cancelled.": "Öll verkefni þessarar útgáfu eru lokið eða hætt við.", + "Not finished yet: {count}": "Ekki lokið enn: {count}", + "What happens to these tasks?": "Hvað verður um þessi verkefni?", + "Move to {name}": "Færa í {name}", + "Remove the release": "Fjarlægja útgáfuna", + "Keep it on {name}": "Halda þeim í {name}", + "Could not mark the release as released. Please try again.": "Ekki tókst að merkja útgáfuna sem gefna út. Reyndu aftur.", + "Roadmap": "Vegvísir", + "Tasks or roadmap": "Verkefni eða vegvísir", + "Release": "Útgáfa", + "Epic": "Epic", + "This task is an epic": "Þetta verkefni er epic", + "A named, dated delivery of a project that its tasks are planned against.": "Nefnd, dagsett afhending verkefnis sem verkþættir þess eru skipulagðir á móti.", + "Name of the release": "Heiti útgáfunnar", + "The project this release belongs to": "Verkefnið sem þessi útgáfa tilheyrir", + "What this release delivers": "Hvað þessi útgáfa afhendir", + "When work on the release starts": "Hvenær vinna við útgáfuna hefst", + "The date the release is due": "Dagsetningin sem útgáfan á að vera tilbúin", + "Whether the release is planned, released or archived": "Hvort útgáfan er áætluð, gefin út eða í geymslu", + "Released on": "Gefin út", + "When the release was marked as released": "Hvenær útgáfan var merkt sem gefin út", + "The release this task is planned for": "Útgáfan sem þetta verkefni er áætlað fyrir", + "Board view options": "Birtingarvalkostir töflu", + "Colour cards": "Lita spjöld", + "No colour": "Enginn litur", + "By label": "Eftir merki", + "Swimlanes": "Brautir", + "No swimlanes": "Engar brautir", + "By assignee": "Eftir ábyrgðaraðila", + "By epic": "Eftir bálki", + "No assignee": "Óúthlutað", + "No epic": "Enginn bálkur", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Spjöld haldast í röð síns bálks. Breyttu bálkinum á síðu verkefnisins.", + "Hand over to": "Afhenda", + "Could not save your board view. It applies until you reload.": "Ekki tókst að vista töfluyfirlitið. Það gildir þar til þú endurhleður.", + "Timetable wish": "Stundaskrárósk", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Ósk sem rafallinn tekur tillit til. Harða ósk virðir hann alltaf, mjúka ósk þar sem hægt er.", + "Whether the wish is about a teacher, a group, a room or one activity": "Hvort óskin varðar kennara, hóp, stofu eða eina virkni", + "Teacher": "Kennari", + "Group": "Hópur", + "Reference": "Tilvísun", + "The user, group, room or activity the wish is about": "Notandinn, hópurinn, stofan eða virknin sem óskin varðar", + "What the wish asks for": "Það sem óskin biður um", + "Not on these periods": "Ekki í þessum tímum", + "Preferably not on these periods": "Helst ekki í þessum tímum", + "At most a number of lessons a day": "Mest tiltekinn fjöldi kennslustunda á dag", + "No free periods between lessons": "Engin göt milli kennslustunda", + "Always the same room": "Alltaf sama stofa", + "Periods": "Tímar", + "The periods of the week the wish is about, such as wed-5": "Tímar vikunnar sem óskin varðar, t.d. wed-5", + "Limit": "Mörk", + "The most lessons a day, for a wish of that kind": "Flestar kennslustundir á dag, fyrir ósk af því tagi", + "Strength": "Styrkur", + "Whether the generator must keep the wish or should keep it": "Hvort rafallinn verður eða ætti að virða óskina", + "Hard": "Hörð", + "Soft": "Mjúk", + "Weight": "Vægi", + "How much a soft wish counts, from 1 to 3": "Hve mikið mjúk ósk vegur, frá 1 til 3", + "Why the wish exists": "Hvers vegna óskin er til", + "Timetable scenario": "Stundaskrárdrög", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Eitt vikumynstur, gert af rafalnum eða tekið úr núverandi stundaskrá. Það geymir inntak sitt og hve vel það virðir óskirnar.", + "The name timetablers know the scenario by": "Nafnið sem stundaskrárgerðarfólk þekkir drögin undir", + "Whether the generator made it or it came from the current timetable": "Hvort rafallinn gerði þau eða þau koma úr núverandi stundaskrá", + "Generated": "Búin til", + "From the current timetable": "Úr núverandi stundaskrá", + "Week of": "Vika frá", + "The Monday of the first week of the window": "Mánudagur fyrstu viku tímabilsins", + "Window start": "Upphaf tímabils", + "The first day the week pattern applies to": "Fyrsti dagurinn sem vikumynstrið gildir", + "Window end": "Lok tímabils", + "The last day the week pattern applies to": "Síðasti dagurinn sem vikumynstrið gildir", + "Waiting, generating, done, failed, or published as draft lessons": "Bíður, í vinnslu, lokið, mistókst eða birt sem drög að kennslustundum", + "Waiting": "Bíður", + "Generating": "Í vinnslu", + "Failed": "Mistókst", + "Published": "Birt", + "Seed": "Fræ", + "The number the generator starts from, so a run can be repeated": "Talan sem rafallinn byrjar á, svo hægt sé að endurtaka keyrslu", + "Input": "Inntak", + "The periods, rooms, lessons and wishes the scenario was made from": "Tímarnir, stofurnar, kennslustundirnar og óskirnar sem drögin voru gerð úr", + "Placements": "Staðsetningar", + "Each lesson with the period and room it was given": "Hver kennslustund með tímanum og stofunni sem hún fékk", + "Unplaced lessons": "Óstaðsettar kennslustundir", + "Lessons without a place, each with the hard wish that blocked it": "Kennslustundir án staðar, hver með hörðu óskinni sem stöðvaði hana", + "Broken wishes": "Brotnar óskir", + "The wishes this scenario breaks, with the lessons that break them": "Óskirnar sem drögin brjóta, með kennslustundunum sem brjóta þær", + "Measures": "Mælikvarðar", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Staðsettar kennslustundir, brotnar óskir, göt kennara, kennslustundir á dag og stofunotkun", + "Reason": "Ástæða", + "Why the run failed": "Hvers vegna keyrslan mistókst", + "Published at": "Birt", + "When the scenario was written out as draft lessons": "Hvenær drögin voru skrifuð út sem drög að kennslustundum", + "Edit wish": "Breyta ósk", + "New wish": "Ný ósk", + "Hard: the generator always keeps it": "Föst: rafallinn virðir hana alltaf", + "Soft: the generator keeps it where it can": "Sveigjanleg: rafallinn virðir hana þar sem hann getur", + "Weight (1 to 3)": "Vægi (1 til 3)", + "Most lessons a day": "Mest kennslustundir á dag", + "Period": "Kennslustund", + "{day} period {number}": "{day} kennslustund {number}", + "Teacher (user name)": "Kennari (notandanafn)", + "Activity (group:subject)": "Verkefni (hópur:fag)", + "Say who or what the wish is about.": "Tilgreindu hvern eða hvað óskin varðar.", + "Choose at least one period.": "Veldu að minnsta kosti eina kennslustund.", + "The limit is a whole number of 1 or more.": "Takmarkið er heiltala, 1 eða hærri.", + "Timetable": "Stundaskrá", + "Wishes": "Óskir", + "Timetable wishes": "Óskir um stundaskrá", + "Generator run": "Keyrsla rafals", + "Generator progress": "Framvinda rafals", + "The run failed: {reason}": "Keyrslan mistókst: {reason}", + "{placed} of {lessons} lessons placed": "{placed} af {lessons} kennslustundum raðað", + "Generate again": "Búa til aftur", + "Generate": "Búa til", + "Every lesson has a place.": "Hver kennslustund hefur stað.", + "Lesson": "Kennslustund", + "No free period and room": "Engin laus stund og stofa", + "Broken soft wishes": "Brotnar sveigjanlegar óskir", + "Every soft wish is kept.": "Hver sveigjanleg ósk er virt.", + "Wish": "Ósk", + "Lessons": "Kennslustundir", + "Generating: {percent}% of the time budget used": "Býr til: {percent}% af tímanum notað", + "Waiting to start": "Bíður eftir ræsingu", + "Published as draft lessons": "Birt sem drög að kennslustundum", + "Could not read the scenario.": "Ekki tókst að lesa sviðsmyndina.", + "Could not start the run.": "Ekki tókst að ræsa keyrsluna.", + "Scenarios": "Sviðsmyndir", + "Timetable scenarios": "Sviðsmyndir stundaskrár", + "Scenario": "Sviðsmynd", + "Take the current timetable": "Taka núverandi stundaskrá", + "Could not take the current timetable.": "Ekki tókst að taka núverandi stundaskrá.", + "Broken hard wishes": "Brotnar skilyrðisóskir", + "Not on a period of the week grid": "Ekki á kennslustund í vikutöflunni", + "Compare scenarios": "Bera saman sviðsmyndir", + "Scenarios to compare": "Sviðsmyndir til samanburðar", + "Choose two or three scenarios to compare them.": "Veldu tvær eða þrjár sviðsmyndir til að bera saman.", + "Measure": "Mælikvarði", + "Best": "Best", + "Lessons that differ": "Kennslustundir sem eru ólíkar", + "No lesson differs.": "Engin kennslustund er ólík.", + "Not placed": "Ekki raðað", + "{period} in {room}": "{period} í {room}", + "Lessons placed": "Raðaðar kennslustundir", + "Lessons without a place": "Kennslustundir án staðar", + "Clashes": "Árekstrar", + "Hard wishes broken": "Brotnar fastar óskir", + "Soft wishes broken": "Brotnar sveigjanlegar óskir", + "Soft wishes broken, weighted": "Brotnar sveigjanlegar óskir, vegnar", + "Free periods between lessons, all teachers": "Eyður, allir kennarar", + "Most free periods of one teacher": "Flestar eyður hjá einum kennara", + "Most lessons of one group on a day": "Flestar kennslustundir hjá einum hópi á dag", + "Room use": "Nýting stofa", + "Publish as draft lessons": "Birta sem drög að kennslustundum", + "Draft lessons written: {count}": "Drög að kennslustundum skrifuð: {count}", + "Could not publish the scenario.": "Ekki tókst að birta sviðsmyndina.", + "Rules": "Reglur", + "Rules for {column}": "Reglur fyrir {column}", + "When a card enters this column": "Þegar spjald fer inn í þennan dálk", + "Action": "Aðgerð", + "Set the priority": "Stilla forgang", + "Assign to": "Úthluta til", + "Assign the person who moved the card": "Úthluta til þess sem færði spjaldið", + "Remove the assignee": "Fjarlægja ábyrgðaraðila", + "Add a label": "Bæta við merki", + "No longer a project member": "Ekki lengur í verkefninu", + "This label no longer exists": "Þetta merki er ekki lengur til", + "Add rule": "Bæta við reglu", + "Remove rule": "Fjarlægja reglu", + "No rules yet. Add one to change a card when it enters this column.": "Engar reglur enn. Bættu við reglu til að breyta spjaldi þegar það fer inn í þennan dálk.", + "Could not save the rules. Please try again.": "Ekki tókst að vista reglurnar. Reyndu aftur.", + "1 rule runs when a card enters this column": "1 regla keyrir þegar spjald fer inn í þennan dálk", + "{count} rules run when a card enters this column": "{count} reglur keyra þegar spjald fer inn í þennan dálk", + "Rules applied: {changes}": "Reglur notaðar: {changes}", + "assigned to {name}": "úthlutað til {name}", + "assignee removed": "ábyrgðaraðili fjarlægður", + "priority {priority}": "forgangur {priority}", + "label {label}": "merki {label}", + "What happens to a card when it enters this column, applied in list order.": "Hvað gerist við spjald þegar það fer inn í þennan dálk, í röð listans.", + "Value": "Gildi", + "What the rule does to the card.": "Hvað reglan gerir við spjaldið.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Forgangurinn, notandaauðkennið eða merkjaauðkennið sem aðgerðin notar; autt fyrir aðgerðir án gildis.", + "is not": "er ekki", + "{dimension} is not": "{dimension} er ekki", + "Saved filters": "Vistaðar síur", + "No saved filters yet": "Engar vistaðar síur enn", + "Save filter": "Vista síu", + "Rename \"{name}\"": "Endurnefna „{name}“", + "Delete \"{name}\"": "Eyða „{name}“", + "Clear filters": "Hreinsa síur", + "Showing {shown} of {total} tasks": "Sýnir {shown} af {total} verkefnum", + "Me": "Ég", + "No date": "Engin dagsetning", + "Rename saved filter": "Endurnefna vistaða síu", + "Share with the project": "Deila með verkefninu", + "Give the filter a name": "Gefðu síunni nafn", + "Could not save the filter. Please try again.": "Ekki tókst að vista síuna. Reyndu aftur.", + "Some labels in \"{name}\" no longer exist and were left out.": "Sum merki í „{name}“ eru ekki lengur til og var sleppt.", + "Could not delete the filter. Please try again.": "Ekki tókst að eyða síunni. Reyndu aftur.", + "Saved filter": "Vistuð sía", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Nefnd töflusía eins verkefnis, einkamál þess sem vistaði hana nema henni sé deilt með verkefninu.", + "The project whose board the filter applies to": "Verkefnið sem sían á við um töflu þess", + "The name the filter is listed under": "Nafnið sem sían birtist undir í listanum", + "Saved by": "Vistað af", + "Nextcloud user id of the person who saved the filter": "Nextcloud-notandaauðkenni þess sem vistaði síuna", + "Shared with the project": "Deilt með verkefninu", + "Whether every project member sees and applies the filter": "Hvort allir í verkefninu sjá síuna og geta notað hana", + "Criteria": "Skilyrði", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Sían: ábyrgðaraðili, merki, forgangur og skiladagur, hvert með er eða er ekki og gildum sínum", + "Cross-project view": "Yfirlit þvert á verkefni", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Vistað úrval verkefna þar sem verkin eru sýnd saman í stöðubrautum, deilt með fólkinu sem það nefnir.", + "Shared with": "Deilt með", + "The name the view is listed under": "Nafnið sem yfirlitið er skráð undir", + "Nextcloud user id of the person who saved the view": "Nextcloud-notandaauðkenni þess sem vistaði yfirlitið", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-notandaauðkenni fólksins sem yfirlitinu er deilt með", + "The projects whose tasks the view shows, at most twenty": "Verkefnin sem yfirlitið sýnir verk úr, mest tuttugu", + "1 project in this view is hidden from you.": "1 verkefni í þessu yfirliti er falið fyrir þér.", + "{count} projects in this view are hidden from you.": "{count} verkefni í þessu yfirliti eru falin fyrir þér.", + "{project} has no column for {status}.": "{project} hefur engan dálk fyrir {status}.", + "This view does not exist or is not shared with you.": "Þetta yfirlit er ekki til eða því hefur ekki verið deilt með þér.", + "\"{task}\" moved to {status}.": "\"{task}\" fært í {status}.", + "Project: {title}": "Verkefni: {title}", + "Cross-project views": "Yfirlit þvert á verkefni", + "New view": "Nýtt yfirlit", + "Edit view": "Breyta yfirliti", + "Delete view": "Eyða yfirliti", + "Give the view a name": "Gefðu yfirlitinu nafn", + "Pick at least one project": "Veldu að minnsta kosti eitt verkefni", + "A view shows at most {max} projects": "Yfirlit sýnir mest {max} verkefni", + "Could not save the view. Please try again.": "Ekki tókst að vista yfirlitið. Reyndu aftur.", + "Could not delete the view. Please try again.": "Ekki tókst að eyða yfirlitinu. Reyndu aftur.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Eyða \"{title}\"? Verkefnin og verk þeirra haldast óbreytt.", + "People see the tasks of the projects they are in, never more.": "Fólk sér verk þeirra verkefna sem það er í, aldrei meira.", + "No views yet. A view shows the tasks of several of your projects together.": "Engin yfirlit enn. Yfirlit sýnir verk úr nokkrum verkefnum þínum saman.", + "Projects in view: {count}": "Verkefni í yfirliti: {count}", + "Notify me when a task is assigned to me": "Láttu mig vita þegar mér er úthlutað verki", + "Also send these to me by email": "Sendu mér þetta líka í tölvupósti", + "Add an email address in your Nextcloud personal settings to get mail.": "Bættu við netfangi í persónulegum Nextcloud-stillingum til að fá tölvupóst.", + "Code link": "Kóðatengill", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, grein, samrunabeiðni eða mál á kóðavettvangi sem tengist verkefni.", + "The task the link belongs to": "Verkefnið sem tengillinn tilheyrir", + "The project of the task": "Verkefnið sem verkið tilheyrir", + "Task key": "Verklykill", + "The task key the forge text named, such as VC-12": "Verklykillinn sem texti kóðavettvangsins nefndi, t.d. VC-12", + "What the link points at": "Hvert tengillinn vísar", + "Link": "Tengill", + "The address of the item in the forge": "Vistfang atriðisins á kóðavettvanginum", + "The commit message, branch name or merge request title": "Commit-skilaboðin, heiti greinarinnar eða titill samrunabeiðninnar", + "Repository": "Hirsla", + "The repository, such as acme/portal": "Hirslan, t.d. acme/portal", + "Forge id": "Auðkenni á vettvangi", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Eigið auðkenni atriðisins á kóðavettvanginum, t.d. github:acme/portal#42 eða commit-tætigildi", + "State": "Staða", + "The state of a merge request or issue": "Staða samrunabeiðni eða máls", + "Who made the commit or opened the merge request": "Hver gerði commit-ið eða opnaði samrunabeiðnina", + "When the commit was made or the merge request last changed": "Hvenær commit-ið var gert eða samrunabeiðnin breyttist síðast", + "Added by": "Bætt við af", + "Whether a person added the link or the integration wrote it": "Hvort manneskja bætti tenglinum við eða samþættingin skrifaði hann", + "Nextcloud user UIDs of project members": "Nextcloud-notandaauðkenni verkefnismeðlima", + "Add link": "Bæta við tengli", + "Added by hand": "Bætt við handvirkt", + "Branch": "Grein", + "Code": "Kóði", + "Commit": "Commit", + "From the integration": "Frá samþættingunni", + "Link to a commit, branch or merge request": "Tengill á commit, grein eða samrunabeiðni", + "Merge request": "Samrunabeiðni", + "Merged": "Sameinað", + "No code linked yet. Name {key} in a commit message or paste a link.": "Enginn kóði tengdur enn. Nefndu {key} í commit-skilaboðum eða límdu inn tengil.", + "No code linked yet. Paste a link to a commit or merge request.": "Enginn kóði tengdur enn. Límdu inn tengil á commit eða samrunabeiðni.", + "Paste a web address that starts with https://.": "Límdu inn vefslóð sem byrjar á https://.", + "Remove link {title}": "Fjarlægja tengilinn {title}", + "The link could not be added.": "Ekki tókst að bæta tenglinum við.", + "The link could not be removed.": "Ekki tókst að fjarlægja tengilinn.", + "This link is already on the task.": "Þessi tengill er þegar á verkinu.", + "Code forges": "Kóðavettvangar", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Tengdu commit og pull requests úr GitHub við verk. Integriq tekur við atburðunum; planninq kallar aldrei á GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Sæktu stillingarnar og fluttu þær inn í Integriq. Fylltu svo inn leyndarmál í regluna \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Í GitHub skaltu bæta vefkróki við hirsluna með þessu vistfangi og sama leyndarmáli. Veldu efnistegundina application/json og atburðina push og pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nefndu verklykilinn, t.d. VC-12, í commit-skilaboðum, heiti greinar eða titli pull request. Tengillinn birtist þá á því verki.", + "Without Integriq, project members can still paste a link on the task page.": "Án Integriq geta verkefnismeðlimir samt límt tengil á síðu verksins.", + "Download the Integriq configuration": "Sækja stillingar fyrir Integriq", + "Calendar": "Dagatal", + "Previous": "Fyrri", + "Calendar view": "Dagatalsyfirlit", + "Starts:": "Hefst:", + "No tasks with a date in this month.": "Engin verk með dagsetningu í þessum mánuði.", + "Week of {start} to {end}": "Vika frá {start} til {end}", + "My calendar": "Dagatalið mitt", + "Show as list": "Sýna sem lista", + "Show as calendar": "Sýna sem dagatal", + "Open my calendar": "Opna dagatalið mitt", + "Nextcloud Tasks": "Nextcloud Verkefni", + "Show my tasks in Nextcloud Tasks": "Sýna verkefnin mín í Nextcloud Verkefnum", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Verkefni sem þér er úthlutað eða deilt með þér birtast á listanum \"Planninq\" í Verkefnum og Dagatali Nextcloud. Breytingum sem gerðar eru þar er skipt út við næstu breytingu í Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Þessi þjónn getur ekki skrifað í Nextcloud Verkefni, svo útflutningur er ekki í boði.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Stjórnað af Planninq. Breytingum sem gerðar eru hér er skipt út við næstu breytingu í Planninq.", + "Working days and holidays": "Vinnudagar og frídagar", + "Dates set on the timeline skip the days that are not working days.": "Dagsetningar settar á tímalínunni sleppa dögum sem eru ekki vinnudagar.", + "Working weekdays": "Vinnudagar vikunnar", + "Non-working days": "Frídagar", + "No non-working days yet.": "Engir frídagar enn.", + "Add day": "Bæta við degi", + "Year": "Ár", + "Add Dutch national holidays": "Bæta við hollenskum frídögum", + "Save working days": "Vista vinnudaga", + "Choose at least one working weekday.": "Veldu að minnsta kosti einn vinnudag.", + "Working days saved.": "Vinnudagar vistaðir.", + "Could not save the working days.": "Ekki tókst að vista vinnudagana.", + "New Year's Day": "Nýársdagur", + "Easter Sunday": "Páskadagur", + "Easter Monday": "Annar í páskum", + "King's Day": "Konungsdagurinn", + "Liberation Day": "Frelsisdagurinn", + "Ascension Day": "Uppstigningardagur", + "Whit Sunday": "Hvítasunnudagur", + "Whit Monday": "Annar í hvítasunnu", + "Christmas Day": "Jóladagur", + "Boxing Day": "Annar í jólum", + "Dates of {title}": "Dagsetningar {title}", + "The due date cannot be before the start date.": "Skiladagur getur ekki verið á undan upphafsdegi.", + "{title}, from {start} to {end}": "{title}, frá {start} til {end}", + "The dates could not be saved.": "Ekki tókst að vista dagsetningarnar.", + "{title} now runs from {start} to {end}": "{title} stendur nú frá {start} til {end}", + "Auto-scheduling": "Sjálfvirk tímasetning", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Þegar kveikt er á þessu býðst til að færa verkin sem verk hindrar þegar skiladagur þess er færður aftar á tímalínunni.", + "Move blocked tasks along when a task slips": "Færa hindruð verk með þegar verk tefst", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Á tímalínunni býður seinni skiladagur upp á að færa hindruðu verkin. Aðeins \"hindrar\"-tengsl gilda og verk færast aðeins aftar.", + "Move the tasks that wait for {title}?": "Færa verkin sem bíða eftir {title}?", + "These tasks wait for it and would start after its new due date:": "Þessi verk bíða eftir því og myndu hefjast eftir nýja skiladaginn:", + "{count} tasks would move; the first {limit} are listed.": "{count} verk myndu færast; fyrstu {limit} eru sýnd.", + "Now": "Núna", + "After the move": "Eftir færsluna", + "Only this task": "Aðeins þetta verk", + "Move all": "Færa öll", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stöðvaðist við {title}: ekki tókst að vista dagsetningarnar. Verkin á undan voru færð.", + "Cumulative flow": "Uppsafnað flæði", + "Show as chart": "Sýna sem graf", + "Show as table": "Sýna sem töflu", + "Tasks per column per day": "Verk í dálki á dag", + "Tasks without recorded history in this period: {count}": "Verk án skráðrar sögu á þessu tímabili: {count}", + "Lead and cycle time": "Afhendingartími og lotutími", + "No tasks were finished in this period.": "Engu verki var lokið á þessu tímabili.", + "Finished tasks": "Lokin verk", + "Cycle time, average": "Lotutími, meðaltal", + "Cycle time, 85th percentile": "Lotutími, 85. hundraðshlutamark", + "Lead time, average": "Afhendingartími, meðaltal", + "Tasks whose finish time was estimated from their history: {count}": "Verk þar sem lokatími var áætlaður út frá sögu: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Lotutími hvers lokins verks, með meðaltali og 85. hundraðshlutamarki", + "Slowest tasks": "Hægustu verkin", + "cycle {cycle}, lead {lead}": "lota {cycle}, afhending {lead}", + "{days} days": "{days} dagar", + "Could not load the flow of this project.": "Ekki tókst að hlaða flæði þessa verkefnis.", + "Last {days} days": "Síðustu {days} dagar", + "Portfolio flow": "Flæði safns", + "An admin adds portfolios under Projects, Portfolios.": "Stjórnandi bætir við söfnum undir Verkefni, Söfn.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Verkefni sem ekki eru sýnd, því að hámarki 50 eru sýnd í einu: {count}", + "Could not load the flow of this portfolio.": "Ekki tókst að hlaða flæði þessa safns.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Uppsafnað flæði og lotutími yfir verkefni safns.", + "Edit report": "Breyta skýrslu", + "Only tasks where": "Aðeins verk þar sem", + "Group by": "Flokka eftir", + "Display": "Birting", + "Share with everyone who can read its projects": "Deila með öllum sem geta lesið verkefni hennar", + "The report could not be saved.": "Ekki tókst að vista skýrsluna.", + "Number of tasks": "Fjöldi verka", + "Bar": "Súlur", + "Donut": "Hringur", + "Table": "Tafla", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} af {total} verkefnum í þessari skýrslu eru ekki sýnileg þér", + "No tasks match this report.": "Ekkert verk passar við þessa skýrslu.", + "None": "Ekkert", + "Could not load this report.": "Ekki tókst að hlaða þessari skýrslu.", + "Report": "Skýrsla", + "Your reports": "Skýrslurnar þínar", + "My reports": "Mínar skýrslur", + "Shared reports": "Sameiginlegar skýrslur", + "You have not built a report yet.": "Þú hefur ekki búið til skýrslu enn.", + "Nobody has shared a report with you yet.": "Enginn hefur deilt skýrslu með þér enn.", + "Reports you built over tasks, and the ones shared with you.": "Skýrslur sem þú bjóst til um verk, og þær sem deilt var með þér.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Vistuð fyrirspurn um verk: hvaða verkefni, hvaða síur, flokkað eftir hverju, talið eða lagt saman, og sýnt sem tafla eða graf.", + "The name the report is listed under": "Nafnið sem skýrslan er skráð undir", + "What the report shows and who it is for": "Hvað skýrslan sýnir og fyrir hvern hún er", + "Nextcloud user id of the person who saved the report": "Nextcloud-notandaauðkenni þess sem vistaði skýrsluna", + "Who can open the report": "Hver getur opnað skýrsluna", + "Only me": "Aðeins ég", + "Everyone who can read its projects": "Allir sem geta lesið verkefni hennar", + "The projects the report covers, at most fifty": "Verkefnin sem skýrslan nær yfir, mest fimmtíu", + "Filters": "Síur", + "Task fields and the value each must equal": "Verkreitir og gildið sem hver þeirra þarf að jafngilda", + "The task field the report groups on": "Verkreiturinn sem skýrslan flokkar eftir", + "Count the tasks, or add up a number on them": "Telja verkin eða leggja saman tölu á þeim", + "Sum": "Summa", + "Sum of": "Summa af", + "The number added up when the measure is a sum": "Talan sem er lögð saman þegar mælikvarðinn er summa", + "Story points": "Sögustig", + "Estimated duration": "Áætlaður tími", + "How the report is shown": "Hvernig skýrslan er sýnd", + "Issue type": "Tegund máls", + "Task fields and the value each must equal; empty when the report covers every task": "Reitir verks og gildið sem hvert þarf að hafa; autt þegar skýrslan nær yfir öll verk", + "The status a task must have": "Staðan sem verk þarf að hafa", + "The priority a task must have": "Forgangurinn sem verk þarf að hafa", + "The user a task must be assigned to": "Notandinn sem verk þarf að vera úthlutað", + "A label a task must carry": "Merki sem verk þarf að bera", + "The board column a task must be in": "Töfludálkurinn sem verk þarf að vera í", + "The issue type a task must have": "Tegund máls sem verk þarf að hafa", + "Manager groups": "Stjórnendahópar", + "Member groups": "Meðlimahópar", + "Viewer groups": "Lesendahópar", + "Viewers": "Lesendur", + "Owning group": "Eigandahópur", + "Nextcloud groups whose members manage the project": "Nextcloud-hópar sem stýra verkefninu", + "Nextcloud groups whose members work on the project": "Nextcloud-hópar sem vinna að verkefninu", + "Nextcloud groups whose members may read the project": "Nextcloud-hópar sem mega lesa verkefnið", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-notendur sem stýra verkefninu: stillingum, meðlimum og vinnu", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-notendur sem mega lesa verkefnið og vinnu þess en ekki breyta", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud-hópurinn sem á verkefnið ásamt þeim sem stofnaði það, mest einn", + "Nextcloud user ids who may read this through the project": "Nextcloud-notendur sem mega lesa þetta í gegnum verkefnið", + "Nextcloud groups whose members may change this through the project": "Nextcloud-hópar sem mega breyta þessu í gegnum verkefnið", + "Nextcloud groups whose members may read this through the project": "Nextcloud-hópar sem mega lesa þetta í gegnum verkefnið", + "Search for a person or a group…": "Leita að manneskju eða hópi…", + "No one found. Your admin's sharing settings decide who you can find.": "Enginn fannst. Deilingarstillingar kerfisstjórans ráða hverja þú getur fundið.", + "Type at least two characters": "Sláðu inn að minnsta kosti tvo stafi", + "Everyone in this group": "Allir í þessum hópi", + "Could not search for people. Please try again.": "Ekki tókst að leita að fólki. Reyndu aftur.", + "Could not remove the group": "Ekki tókst að fjarlægja hópinn", + "Only the owner and managers change who is on this project.": "Aðeins eigandinn og stjórnendur breyta því hverjir eru í þessu verkefni.", + "Role of {name}": "Hlutverk {name}", + "Manager": "Stjórnandi", + "Member": "Meðlimur", + "Viewer": "Lesandi", + "Could not change the role": "Ekki tókst að breyta hlutverkinu", + "Owned by group: {name}": "Í eigu hópsins: {name}", + "No group owns this project.": "Enginn hópur á þetta verkefni.", + "Owned by group": "Í eigu hóps", + "Search for a group…": "Leita að hópi…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Enginn hópur fannst. Deilingarstillingar kerfisstjórans ráða hvaða hópa þú getur fundið.", + "No owning group": "Enginn eigandahópur", + "Could not search for groups. Please try again.": "Ekki tókst að leita að hópum. Reyndu aftur.", + "Could not change the owning group": "Ekki tókst að breyta eigandahópnum", + "You can read this project. Only its members change it.": "Þú getur lesið þetta verkefni. Aðeins meðlimir þess breyta því.", + "Course": "Námskeið", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Námskeiðið sem kennt er í þessari kennslustund, til dæmis valáfangi, þegar námsapp skólans þekkir það.", + "Online meeting link": "Tengill á netkennslustund", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvar nemendur taka þátt í þessari kennslustund á netinu. Hnappurinn Taka þátt birtist aðeins fyrir https-tengil." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/is.json b/l10n/is.json index 04d85365..773ee714 100644 --- a/l10n/is.json +++ b/l10n/is.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Virk verkefni", + "Archived projects": "Skjalfest verkefni", + "Boards": "Töflur", + "My projects": "Verkefnin mín", + "Portfolio": "Eignasafn", + "Project board": "Verkefnatafla", + "Projects I am in": "Verkefni sem ég tek þátt í", + "Timeline": "Tímalína", + "Timesheet": "Tímaskráning", + "Features & roadmap": "Eiginleikar og vegvísir", + "Flow": "Ferli", + "Flows": "Ferli", + "Reports": "Skýrslur", + "Pick a report to open it.": "Veldu skýrslu til að opna hana.", + "In progress": "Í vinnslu", + "Date": "Dagsetning", + "Due": "Skiladagur", + "Assignee": "Úthlutað", + "Who": "Hver", + "What": "Hvað", + "Minutes": "Mínútur", + "Entries": "Færslur", + "Most recent": "Nýjast", + "Per person": "Á mann", + "By status": "Eftir stöðu", + "By priority": "Eftir forgangi", + "Task status": "Staða verkefna", + "Time spent": "Tími sem varið er", + "Capacity": "Afkastageta", + "Due soonest": "Fyrst á skiladegi", + "Minutes logged": "Skráðar mínútur", + "Nothing is due": "Ekkert er á skiladegi", + "Nothing logged yet": "Ekkert skráð enn", + "What is open, what is blocked, and what is overdue.": "Hvað er opið, hvað er lokað og hvað er of seint.", + "How allocation is spread across the people working on projects.": "Hvernig álagið dreifist á fólkið sem vinnur að verkefnum.", + "Hours logged, and the projects they went to.": "Skráðar klukkustundir og verkefnin sem þær fóru í.", + "Billable": "Reikningsfært", + "Budget: {amount}": "Fjárhagsáætlun: {amount}", + "Loading projects": "Hleð verkefnum", + "No projects for this client yet": "Engin verkefni fyrir þennan viðskiptavin enn", + "Open in Planninq": "Opna í Planninq", + "This project could not be found": "Þetta verkefni fannst ekki", + "Untitled project": "Ónefnt verkefni", + "and {count} more": "og {count} til viðbótar", + "Store": "Verslun", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Settu upp skrár, skemu og flæði sem aðrar stofnanir hafa birt.", + "Work Date": "Vinnudagsetning", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Aðgerðir dálks", + "Columns": "Dálkar", + "Could not remove the column. Please try again.": "Ekki tókst að fjarlægja dálkinn. Reyndu aftur.", + "Could not save the column. Please try again.": "Ekki tókst að vista dálkinn. Reyndu aftur.", + "Done column": "Lokið-dálkur", + "Edit column": "Breyta dálki", + "Keep the card's status": "Halda stöðu spjaldsins", + "Move its cards to": "Færa spjöld hans í", + "Move left": "Færa til vinstri", + "Move right": "Færa til hægri", + "Status of cards moved here": "Staða spjalda sem eru færð hingað", + "The last done column cannot be removed.": "Ekki er hægt að fjarlægja síðasta lokið-dálkinn.", + "WIP limit": "WIP-mörk", + "over limit": "yfir mörkum", + "The status a card gets when it is moved into this column.": "Staðan sem spjald fær þegar það er fært í þennan dálk.", + "All priorities": "Allar forgangsraðanir", + "Could not create the task. Please try again.": "Ekki tókst að búa til verkefnið. Reyndu aftur.", + "Created": "Búið til", + "Move to backlog": "Í biðlistann", + "Move to board": "Á töfluna", + "New task": "Nýtt verkefni", + "Nothing in the backlog": "Ekkert í biðlistanum", + "Rank": "Röð", + "Sort by": "Raða eftir", + "Sort by rank to reorder": "Raðaðu eftir röð til að endurraða", + "Task actions": "Aðgerðir verkefnis", + "All labels": "Öll merki", + "Filter tasks by label": "Sía verkefni eftir merki", + "View timeline": "Skoða tímalínu", + "Board": "Tafla", + "List": "Listi", + "Column": "Dálkur", + "Board or list": "Tafla eða listi", + "Log": "Dagbók", + "Add entry": "Bæta við færslu", + "Show": "Sýna", + "No actions yet": "Engar aðgerðir enn", + "Closed": "Lokað", + "Entry actions": "Aðgerðir færslu", + "Add action": "Bæta við aðgerð", + "by {author}": "eftir {author}", + "saved {time}": "vistað {time}", + "Attendees: {names}": "Viðstaddir: {names}", + "Add the first entry": "Bæta við fyrstu færslunni", + "Issues": "Vandamál", + "Lessons learned": "Lærdómur", + "Meetings": "Fundir", + "Decisions": "Ákvarðanir", + "Actions": "Aðgerðir", + "Issue": "Vandamál", + "Lesson learned": "Lærdómur", + "Meeting": "Fundur", + "Decision": "Ákvörðun", + "About this project": "Um þetta verkefni", + "No description yet": "Engin lýsing enn", + "Start date": "Upphafsdagur", + "Not set": "Ekki stillt", + "End date": "Lokadagur", + "Progress": "Framvinda", + "No tasks yet": "Engin verkefni enn", + "Open the board": "Opna töfluna", + "People": "Fólk", + "Owner": "Eigandi", + "Latest log entries": "Nýjustu færslur", + "Open the log": "Opna dagbókina", + "{done} of {total} tasks done": "{done} af {total} verkefnum lokið", + "Edit entry": "Breyta færslu", + "Type": "Tegund", + "Attendees": "Viðstaddir", + "Issue is closed": "Vandamálinu er lokað", + "Could not save the entry. Please try again.": "Ekki tókst að vista færsluna. Reyndu aftur.", + "From: {title}": "Úr: {title}", + "What needs to happen": "Hvað þarf að gerast", + "Could not create the action. Please try again.": "Ekki tókst að búa til aðgerðina. Reyndu aftur.", + "The action was created but could not be linked to the entry.": "Aðgerðin var búin til en ekki tókst að tengja hana við færsluna.", + "Project pages": "Síður verkefnisins", + "Overview": "Yfirlit", + "Risks": "Áhættur", + "Log entry": "Dagbókarfærsla", + "A short name for the entry": "Stutt heiti færslunnar", + "Project": "Verkefni", + "The project this entry belongs to": "Verkefnið sem færslan tilheyrir", + "What kind of entry this is": "Hvers konar færsla þetta er", + "When it happened": "Hvenær það gerðist", + "What happened, in Markdown": "Hvað gerðist, í Markdown", + "Whether an issue is still open": "Hvort vandamál sé enn opið", + "The people at a meeting": "Fólkið á fundi", + "Tasks that came out of this entry": "Verkefni sem spruttu af þessari færslu", + "Add risk": "Bæta við áhættu", + "Risk": "Áhætta", + "Score": "Stig", + "Response": "Viðbrögð", + "Review date": "Endurskoðunardagur", + "no longer on the project": "er ekki lengur í verkefninu", + "Edit {title}": "Breyta {title}", + "No risks recorded yet": "Engar áhættur skráðar enn", + "Add the first risk": "Bæta við fyrstu áhættunni", + "Medium": "Miðlungs", + "Mitigating": "Í mildun", + "Occurred": "Kom fram", + "Avoid": "Forðast", + "Reduce": "Draga úr", + "Transfer": "Færa annað", + "Accept": "Samþykkja", + "Highest open risks": "Hæstu opnu áhættur", + "No open risks": "Engar opnar áhættur", + "Open the risk register": "Opna áhætturegistrið", + "Edit risk": "Breyta áhættu", + "What could go wrong": "Hvað getur farið úrskeiðis", + "Likelihood": "Líkur", + "Impact": "Áhrif", + "Score {score}": "Stig {score}", + "Countermeasures": "Mótvægisaðgerðir", + "Could not save the risk. Please try again.": "Ekki tókst að vista áhættuna. Reyndu aftur.", + "Risks by likelihood and impact": "Áhættur eftir líkum og áhrifum", + "Risk scale": "Áhættukvarði", + "The levels every project scores its risks on, and where low turns into medium and high": "Stigin sem hvert verkefni metur áhættur sínar á, og hvar lágt verður miðlungs og hátt", + "Number of levels": "Fjöldi stiga", + "Likelihood labels": "Heiti fyrir líkur", + "Impact labels": "Heiti fyrir áhrif", + "Level {level}": "Stig {level}", + "Medium from score": "Miðlungs frá stigum", + "High from score": "Hátt frá stigum", + "Risk scale saved": "Áhættukvarði vistaður", + "1 risk uses level {level}. Change it first.": "1 áhætta notar stig {level}. Breyttu henni fyrst.", + "{count} risks use level {level}. Change them first.": "{count} áhættur nota stig {level}. Breyttu þeim fyrst.", + "Every level needs a label, and high must start above medium.": "Hvert stig þarf heiti, og hátt verður að byrja fyrir ofan miðlungs.", + "The project this risk belongs to": "Verkefnið sem áhættan tilheyrir", + "The cause and the effect, in Markdown": "Orsök og afleiðing, í Markdown", + "Category": "Flokkur", + "A free grouping, such as planning, budget or supplier": "Frjáls flokkun, t.d. áætlun, fjárhagsáætlun eða birgir", + "How likely it is, on the admin's risk scale": "Hversu líklegt það er, á áhættukvarða kerfisstjórans", + "How hard it would hit, on the admin's risk scale": "Hversu hart það myndi koma niður, á áhættukvarða kerfisstjórans", + "Likelihood times impact, calculated by the server": "Líkur sinnum áhrif, reiknað af þjóninum", + "Where the risk stands": "Hvar áhættan stendur", + "The person who watches this risk": "Manneskjan sem fylgist með áhættunni", + "How the project answers the risk": "Hvernig verkefnið bregst við áhættunni", + "What is done to prevent it or soften it, in Markdown": "Hvað er gert til að koma í veg fyrir hana eða milda, í Markdown", + "When to look at this risk again": "Hvenær á að skoða áhættuna aftur", + "Very low": "Mjög lágt", + "Very high": "Mjög hátt", + "All projects": "Öll verkefni", + "Project status report": "Stöðuskýrsla verkefnis", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Dagsett skýrsla um hvernig verkefni stendur varðandi fé, skipulag, tíma, upplýsingar, gæði og áhættu (GROTIK-þættirnir), hvert með athugasemd.", + "The project this report is about": "Verkefnið sem skýrslan fjallar um", + "Report date": "Dagsetning skýrslu", + "The day the report describes": "Dagurinn sem skýrslan lýsir", + "Money": "Fé", + "How the project stands on this aspect": "Hvernig verkefnið stendur varðandi þennan þátt", + "On track": "Á áætlun", + "At risk": "Í hættu", + "Off track": "Út af áætlun", + "Money note": "Athugasemd um fé", + "A short explanation of this status": "Stutt skýring á þessari stöðu", + "Organisation": "Skipulag", + "Organisation note": "Athugasemd um skipulag", + "Time": "Tími", + "Time note": "Athugasemd um tíma", + "Information": "Upplýsingar", + "Information note": "Athugasemd um upplýsingar", + "Quality": "Gæði", + "Quality note": "Athugasemd um gæði", + "Risk note": "Athugasemd um áhættu", + "Overall": "Heildarstaða", + "The worst of the six statuses, calculated by the server": "Versta staðan af sex, reiknuð af þjóninum", + "Health: money": "Heilbrigði: fé", + "Copied from the newest status report": "Afritað úr nýjustu stöðuskýrslunni", + "Health: organisation": "Heilbrigði: skipulag", + "Health: time": "Heilbrigði: tími", + "Health: information": "Heilbrigði: upplýsingar", + "Health: quality": "Heilbrigði: gæði", + "Health: risk": "Heilbrigði: áhætta", + "Health: overall": "Heilbrigði: heildarstaða", + "Health: report date": "Heilbrigði: dagsetning skýrslu", + "The date of the newest status report": "Dagsetning nýjustu stöðuskýrslunnar", + "New report": "Ný skýrsla", + "Only the project owner writes status reports.": "Aðeins eigandi verkefnisins skrifar stöðuskýrslur.", + "Latest report, {date}": "Nýjasta skýrsla, {date}", + "Aspect": "Þáttur", + "Note": "Athugasemd", + "Report history": "Skýrslusaga", + "Author": "Höfundur", + "No status reports yet": "Engar stöðuskýrslur enn", + "Write the first report": "Skrifa fyrstu skýrsluna", + "Choose a status for every aspect to save the report.": "Veldu stöðu fyrir hvern þátt til að vista skýrsluna.", + "Suggested: on track.": "Tillaga: á áætlun.", + "Suggested: at risk.": "Tillaga: í hættu.", + "Suggested: off track.": "Tillaga: út af áætlun.", + "1 task is past its due date.": "1 verk er komið fram yfir skiladag.", + "{count} tasks are past their due date.": "{count} verk eru komin fram yfir skiladag.", + "The end date has passed with 1 open task.": "Lokadagur er liðinn með 1 opið verk.", + "The end date has passed with {count} open tasks.": "Lokadagur er liðinn með {count} opin verk.", + "No open task is past its due date.": "Ekkert opið verk er komið fram yfir skiladag.", + "The highest open risk, \"{title}\", scores {score}.": "Hæsta opna áhættan, \"{title}\", fær {score} stig.", + "There are no open risks.": "Engar opnar áhættur.", + "Costs are at {percent}% of the budget.": "Kostnaður er {percent}% af fjárhagsáætlun.", + "No suggestion: the project has no budget.": "Engin tillaga: verkefnið hefur enga fjárhagsáætlun.", + "No suggestion: no costs are recorded for this project yet.": "Engin tillaga: enginn kostnaður hefur enn verið skráður á þetta verkefni.", + "The report was not saved. Only the project owner can write status reports.": "Skýrslan var ekki vistuð. Aðeins eigandi verkefnisins getur skrifað stöðuskýrslur.", + "No report": "Engin skýrsla", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Hópur verkefna sem sama fólkið stýrir, til dæmis deild eða áætlun. Umsjónarmenn hans lesa hvert verkefni í honum.", + "The name of the portfolio": "Heiti safnsins", + "What the portfolio holds and who runs it": "Hvað safnið inniheldur og hver stýrir því", + "A colour for the portfolio's section in project lists": "Litur fyrir hluta safnsins í verkefnalistum", + "Managers": "Umsjónarmenn", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-notendaauðkenni fólksins sem stýrir safninu", + "Order": "Röð", + "Where the portfolio comes in project lists, lowest first": "Hvar safnið kemur í verkefnalistum, lægst fyrst", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Eigin áhættukvarði þessa safns sem JSON, á sama formi og kvarðinn fyrir allt forritið. Tómt þýðir kvarðinn fyrir allt forritið.", + "Portfolio readers": "Lesendur safns", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-notendaauðkenni umsjónarmanna safns verkefnisins", + "The portfolio this project belongs to": "Safnið sem þetta verkefni tilheyrir", + "No portfolio": "Ekkert safn", + "All portfolios": "Öll söfn", + "You read this project as a manager of its portfolio. Only its members change it.": "Þú lest þetta verkefni sem umsjónarmaður safns þess. Aðeins meðlimir þess breyta því.", + "Portfolios": "Söfn", + "Portfolio status": "Staða safns", + "No portfolios yet": "Engin söfn enn", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Kerfisstjóri bætir við söfnum undir Verkefni, Söfn. Verkefni í safni eru talin hér með stöðu sinni.", + "Roll-up": "Samantekt", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} á áætlun, {atRisk} í hættu, {offTrack} af áætlun, {noReport} án skýrslu", + "No project in this portfolio that you can read.": "Ekkert verkefni í þessu safni sem þú getur lesið.", + "Start": "Upphaf", + "End": "Lok", + "Budget": "Fjárhagsáætlun", + "Last report": "Síðasta skýrsla", + "Out of date": "Úrelt", + "Portfolio timeline": "Tímalína safns", + "Zoom": "Aðdráttur", + "Could not load the timeline": "Ekki tókst að hlaða tímalínunni", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Kerfisstjóri bætir við söfnum undir Verkefni, Söfn. Verkefni í safni eru sýnd hér á einni tímalínu.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Opnaðu verkefni til að sjá áfanga þess og verk. Tímalínan er aðeins til lestrar.", + "Phase: {title}": "Áfangi: {title}", + "Left out because you cannot read them: {count} projects": "Sleppt því þú getur ekki lesið þau: {count} verkefni", + "Week": "Vika", + "Day": "Dagur", + "Month": "Mánuður", + "Please try again later.": "Reyndu aftur síðar.", + "Status reports": "Stöðuskýrslur", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Eftir hve marga daga síðasta stöðuskýrsla verkefnis er merkt úrelt í yfirliti safnsins", + "Reporting period (days)": "Skýrslutímabil (dagar)", + "The reporting period is a whole number of days from 1 to 365.": "Skýrslutímabilið er heill fjöldi daga frá 1 til 365.", + "Reporting period saved": "Skýrslutímabil vistað", + "The reporting period was not saved. Please try again.": "Skýrslutímabilið var ekki vistað. Reyndu aftur.", + "Every project of a portfolio with its status per aspect, rolled up.": "Hvert verkefni safns með stöðu eftir þáttum, tekið saman.", + "The projects of a portfolio on one timeline.": "Verkefni safns á einni tímalínu.", + "Phases": "Áfangar", + "Add phase": "Bæta við áfanga", + "No phases yet": "Engir áfangar enn", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Skiptu verkefninu í áfanga, t.d. upphaf, skilgreiningu og framkvæmd. Áfanga lýkur þegar lokaskjal hans hefur verið hlaðið upp.", + "{hours} hours": "{hours} klst.", + "Concluding document: {title}": "Lokaskjal: {title}", + "Concluding document missing": "Lokaskjal vantar", + "Move {title} up": "Færa {title} upp", + "Move {title} down": "Færa {title} niður", + "Close phase": "Loka áfanga", + "Phase": "Áfangi", + "Files": "Skrár", + "Notes": "Athugasemdir", + "Audit trail": "Endurskoðunarslóð", + "Edit phase": "Breyta áfanga", + "Name": "Heiti", + "Budget hours": "Áætlaðar stundir", + "Could not save the phase. Please try again.": "Ekki tókst að vista áfangann. Reyndu aftur.", + "Close phase {title}": "Loka áfanganum {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Áfanga lýkur með lokaskjali sínu: hladdu því upp hér eða veldu eina af skrám áfangans.", + "Concluding document": "Lokaskjal", + "This phase has no files yet.": "Þessi áfangi hefur engar skrár enn.", + "Upload a document": "Hlaða upp skjali", + "The document was not uploaded. Please try again.": "Skjalinu var ekki hlaðið upp. Reyndu aftur.", + "Upload the concluding document before you close this phase.": "Hladdu upp lokaskjalinu áður en þú lokar þessum áfanga.", + "This phase cannot be closed from its current status.": "Ekki er hægt að loka þessum áfanga úr núverandi stöðu hans.", + "The phase was not closed. Please try again.": "Áfanganum var ekki lokað. Reyndu aftur.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Auðkenni skrárinnar á þessum áfanga sem lýkur honum. Aðeins er hægt að ljúka áfanganum þegar það er skráð og skráin er viðhengd.", + "Import from Microsoft Project": "Flytja inn úr Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Veldu áætlun sem var vistuð úr Microsoft Project á XML-sniði. Ekkert er flutt inn fyrr en þú staðfestir.", + "Plan file": "Áætlunarskrá", + "What the import creates": "Það sem innflutningurinn býr til", + "Tasks": "Verk", + "Sub-tasks": "Undirverk", + "Milestones": "Áfangar", + "Links": "Tengingar", + "Already imported, updated in place: {count}": "Þegar innflutt, uppfært á staðnum: {count}", + "What does not carry over": "Það sem flyst ekki með", + "Tasks with resources, which are not imported: {count}": "Verk með tilföng, sem eru ekki flutt inn: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Verk neðar en á stigi 3, sett undir verk sitt á stigi 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Tengingar aðrar en lok-í-upphaf, fluttar inn sem tengdar tengingar: {count}", + "Link lags, which are dropped: {count}": "Tafir á tengingum, sem falla niður: {count}", + "Links to a summary task, which are not imported: {count}": "Tengingar við samantektarverk, sem eru ekki fluttar inn: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Tengingar við verk utan þessarar áætlunar, sem eru ekki fluttar inn: {count}", + "No longer in the plan": "Ekki lengur í áætluninni", + "These stay in the project; remove them yourself if they are no longer needed.": "Þau verða áfram í verkefninu; fjarlægðu þau sjálf ef ekki er lengur þörf fyrir þau.", + "Import": "Flytja inn", + "Close": "Loka", + "The plan is imported: {created} created, {updated} updated.": "Áætlunin er flutt inn: {created} búin til, {updated} uppfærð.", + "Links that would close a loop were left out: {count}": "Tengingum sem myndu loka hring var sleppt: {count}", + "The import stopped part-way. Run it again to finish it.": "Innflutningurinn stöðvaðist á miðri leið. Keyrðu hann aftur til að ljúka honum.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Vistaðu áætlunina í Microsoft Project með Skrá, Vista sem, XML-snið, og fluttu þá skrá inn.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Þessi skrá skilgreinir DOCTYPE eða einingar, sem eru ekki samþykktar.", + "The file is larger than 10 MB.": "Skráin er stærri en 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Áætlunin hefur fleiri en 2.000 verk, fleiri en einn innflutningur tekur.", + "This file is not a Microsoft Project plan in XML format.": "Þessi skrá er ekki Microsoft Project-áætlun á XML-sniði.", + "Choose a file to import.": "Veldu skrá til að flytja inn.", + "Only the project owner can import a plan.": "Aðeins eigandi verkefnisins getur flutt inn áætlun.", + "The plan could not be read. Please try again.": "Ekki tókst að lesa áætlunina. Reyndu aftur.", + "Linked case: {title}": "Tengt mál: {title}", + "Linked to a case": "Tengt máli", + "Hand over to case": "Afhenda máli", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Afritar hverja skrá verkefnisins og verka þess, og skrá sem lýsir verkefninu, óbreytta í tengda málið.", + "{date} by {user}": "{date} af {user}", + "Files copied: {count}": "Skrár afritaðar: {count}", + "Files that failed: {names}": "Skrár sem mistókust: {names}", + "The handover failed. Please try again.": "Afhendingin mistókst. Reyndu aftur.", + "The linked case could not be found, or you cannot open it.": "Tengda málið fannst ekki, eða þú getur ekki opnað það.", + "Case handovers": "Afhendingar til málsins", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Í hvert sinn sem skrár og lýsigögn verkefnisins voru afhent málinu: hvenær, af hverjum, til hvaða máls, hver afrituð skrá með SHA-256 hennar, og skrárnar sem mistókust.", + "Finance": "Fjármál", + "Add cost line": "Bæta við kostnaðarlínu", + "Delivery terms": "Afhendingarskilmálar", + "Billing model": "Reikningslíkan", + "Budget in euro": "Fjárhagsáætlun í evrum", + "Budget in hours": "Fjárhagsáætlun í klukkustundum", + "Hourly rate in euro": "Tímagjald í evrum", + "Planned start": "Áætlað upphaf", + "Planned end": "Áætluð lok", + "Planned dates": "Áætlaðar dagsetningar", + "Budget {amount}": "Fjárhagsáætlun {amount}", + "No budget agreed": "Engin fjárhagsáætlun samþykkt", + "Hours": "Klukkustundir", + "Only the project owner and the portfolio managers see the amounts.": "Aðeins eigandi verkefnisins og stjórnendur safnsins sjá upphæðirnar.", + "Budget against cost per category": "Fjárhagsáætlun á móti kostnaði eftir flokkum", + "Labour (booked time)": "Vinna (skráður tími)", + "No category": "Enginn flokkur", + "Hours are not available": "Klukkustundirnar eru ekki tiltækar", + "Not yet assigned to a category": "Ekki enn úthlutað í flokk", + "Total": "Samtals", + "{spent} spent, {remaining} remaining": "{spent} eytt, {remaining} eftir", + "Budget against cost per phase": "Fjárhagsáætlun á móti kostnaði eftir áföngum", + "No phase": "Enginn áfangi", + "Cost lines": "Kostnaðarlínur", + "From the finance system": "Úr fjárhagskerfinu", + "Edit cost line {amount}": "Breyta kostnaðarlínunni {amount}", + "No cost lines yet": "Engar kostnaðarlínur enn", + "Commitments": "Skuldbindingar", + "Actual cost": "Raunkostnaður", + "Forecast": "Spá", + "Remaining": "Eftir", + "Not planned yet": "Ekki enn áætlað", + "{start} to {end}": "{start} til {end}", + "The terms were not saved. Please try again.": "Skilmálarnir voru ekki vistaðir. Reyndu aftur.", + "Terms saved": "Skilmálar vistaðir", + "Fixed price": "Fast verð", + "Hourly": "Á klukkustund", + "Not billed": "Ekki rukkað", + "Commitment": "Skuldbinding", + "Edit cost line": "Breyta kostnaðarlínu", + "Kind": "Tegund", + "Amount in euro": "Upphæð í evrum", + "Remove": "Fjarlægja", + "Could not save the cost line. Only the project owner changes the money of a project.": "Ekki tókst að vista kostnaðarlínuna. Aðeins eigandi verkefnisins breytir fjármunum verkefnis.", + "Could not remove the cost line. Please try again.": "Ekki tókst að fjarlægja kostnaðarlínuna. Reyndu aftur.", + "{amount} over budget": "{amount} yfir fjárhagsáætlun", + "Cost categories": "Kostnaðarflokkar", + "The categories every project splits its budget and costs into, one per line": "Flokkarnir sem hvert verkefni skiptir fjárhagsáætlun sinni og kostnaði í, einn í hverja línu", + "Categories": "Flokkar", + "Give at least one category, each name once.": "Tilgreindu að minnsta kosti einn flokk, hvert nafn einu sinni.", + "Cost categories saved": "Kostnaðarflokkar vistaðir", + "The cost categories were not saved. Please try again.": "Kostnaðarflokkarnir voru ekki vistaðir. Reyndu aftur.", + "Finance line": "Fjármálalína", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Ein fjárhæð á verkefni: fjárhagsáætlun, skuldbinding, raunkostnaður eða spá, í kostnaðarflokki og mögulega áfanga. Skráð af eiganda verkefnisins eða send af fjárhagskerfinu í gegnum samþættingarforritið.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Verkefnið sem fjárhæðin tilheyrir. Autt fyrir línu úr fjárhagskerfinu þar sem verkefnisnúmerið passar ekki við neitt verkefni.", + "The phase this amount belongs to, if any": "Áfanginn sem fjárhæðin tilheyrir, ef einhver", + "The cost category, one of the categories the admin set up": "Kostnaðarflokkurinn, einn af flokkunum sem stjórnandinn setti upp", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Hvort fjárhæðin er fjárhagsáætlun, skuldbinding, raunkostnaður eða spá", + "Amount": "Fjárhæð", + "The amount in the reporting currency (euro)": "Fjárhæðin í skýrslugjaldmiðlinum (evrur)", + "The date the amount was booked or is expected": "Dagsetningin þegar fjárhæðin var bókuð eða er væntanleg", + "What the amount is for": "Til hvers fjárhæðin er", + "Whether a person entered the line or the finance system sent it": "Hvort manneskja skráði línuna eða fjárhagskerfið sendi hana", + "Entered by hand": "Skráð handvirkt", + "Finance line id": "Auðkenni fjármálalínu", + "The finance system's own id of this line. One imported line per id.": "Eigið auðkenni línunnar í fjárhagskerfinu. Ein innflutt lína á hvert auðkenni.", + "Project number": "Verkefnisnúmer", + "The project number the finance system sent, matched against the project key": "Verkefnisnúmerið sem fjárhagskerfið sendi, borið saman við lykil verkefnisins", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Safn verkefnis línunnar, afritað úr verkefninu svo að heildartölur safnsins þurfi eina síu", + "Finance readers": "Fjármálalesendur", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-notandaauðkenni þeirra sem mega sjá fjárhæðina: eigandi verkefnisins og stjórnendur safnsins", + "Project owner": "Eigandi verkefnis", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-notandaauðkenni eiganda verkefnisins, sem má breyta og fjarlægja handvirkar línur", + "How the client pays: not billed, a fixed price, or by the hour.": "Hvernig viðskiptavinurinn greiðir: ekki rukkað, fast verð eða á klukkustund.", + "Portfolio finance": "Fjármál safns", + "You cannot see the money of any project in this portfolio": "Þú getur ekki séð fjármuni neins verkefnis í þessu safni", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Þjónninn skilaði kostnaðarlínum verkefna utan þessa safns, svo heildartölurnar gætu verið rangar.", + "Projects left out because you cannot see their money: {count}": "Verkefni sleppt af því að þú sérð ekki fjármuni þeirra: {count}", + "Unmatched finance lines": "Ópöruð fjármálalínur", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Fjárhagsáætlun, skuldbindingar, raunkostnaður og spá lögð saman fyrir safn.", + "Subprojects": "Undirverkefni", + "{done} of {total}": "{done} af {total}", + "{done} of {total} tasks done, including subprojects": "{done} af {total} verkum lokið, með undirverkefnum", + "Show the subprojects of {title}": "Sýna undirverkefni {title}", + "Hide the subprojects of {title}": "Fela undirverkefni {title}", + "Part of": "Hluti af", + "No parent project": "Ekkert yfirverkefni", + "A project cannot sit under one of its own subprojects.": "Verkefni getur ekki verið undir einu af sínum eigin undirverkefnum.", + "Projects nest three levels deep at most: programme, project and subproject.": "Verkefni geta verið í mesta lagi þrjú stig: áætlun, verkefni og undirverkefni.", + "Parent project": "Yfirverkefni", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Verkefnið sem þetta verkefni er undir, til dæmis áætlun. Verkefni geta verið í mesta lagi þrjú stig.", + "Yes": "Já", + "No": "Nei", + "{label} (required)": "{label} (skylt)", + "{label} is required": "{label} er skylt", + "Project field": "Verkefnisreitur", + "A field an admin adds to every project, such as a policy area or a contract value.": "Reitur sem stjórnandi bætir við öll verkefni, til dæmis málaflokkur eða samningsvirði.", + "Key": "Lykill", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Fasta nafnið sem gildið er vistað undir, í lower camel case. Haltu því þegar verkefni nota það.", + "Label": "Merki", + "The name people see next to the field": "Nafnið sem fólk sér við reitinn", + "What the field holds": "Hvað reiturinn geymir", + "Text": "Texti", + "Number": "Tala", + "Choice": "Val", + "Person": "Manneskja", + "Yes or no": "Já eða nei", + "Options": "Valkostir", + "The choices of a choice field": "Valkostir valreits", + "Required": "Skylt", + "Whether a project must fill in the field": "Hvort verkefni verði að fylla út reitinn", + "Where the field appears, lowest first": "Hvar reiturinn birtist, lægst fyrst", + "Applies to": "Á við", + "What the field is added to": "Hverju reitnum er bætt við", + "Custom fields": "Eigin reitir", + "The values of the project fields an admin defined, keyed by the field's key.": "Gildi verkefnisreitanna sem stjórnandi skilgreindi, eftir lykli reitsins.", + "Project fields": "Verkefnisreitir", + "Related": "Tengd", + "Remove link": "Fjarlægja tengingu", + "Link type": "Tegund tengingar", + "Relates to": "Tengist", + "Duplicates": "Tvítekur", + "Project key": "Verkefnislykill", + "Every task number starts with it, such as VERG-42.": "Hvert verknúmer byrjar á honum, til dæmis VERG-42.", + "This key is already used by another project.": "Annað verkefni notar þegar þennan lykil.", + "Use 2 to 10 letters and digits, starting with a letter.": "Notaðu 2 til 10 stafi og tölustafi sem byrja á bókstaf.", + "The key cannot change once tasks carry it.": "Ekki er hægt að breyta lyklinum þegar verk bera hann.", + "Project saved. The existing tasks get their numbers in the background.": "Verkefni vistað. Núverandi verk fá númerin sín í bakgrunni.", + "Next task number": "Næsta verknúmer", + "The number the next task of this project gets in its key. Only the system writes it.": "Númerið sem næsta verk þessa verkefnis fær í lykli sínum. Aðeins kerfið skrifar það.", + "Restore {title}": "Endurheimta {title}", + "Restore": "Endurheimta", + "Project restored": "Verkefni endurheimt", + "Could not restore the project": "Ekki tókst að endurheimta verkefnið", + "Bring this project back to the active list.": "Settu þetta verkefni aftur á lista yfir virk verkefni.", + "Restore project": "Endurheimta verkefni", + "Request reason": "Ástæða beiðninnar", + "Why the requester needs this project. Filled in when the project is requested.": "Hvers vegna umsækjandinn þarf þetta verkefni. Fyllt út við beiðnina.", + "Reviewed by": "Yfirfarið af", + "The user who approved or rejected the request.": "Notandinn sem samþykkti eða hafnaði beiðninni.", + "Reviewed at": "Yfirfarið", + "When the request was approved or rejected.": "Hvenær beiðnin var samþykkt eða henni hafnað.", + "Review note": "Athugasemd yfirferðar", + "The reviewer's reason, shown to the requester when a request is not approved.": "Ástæða þess sem yfirfór, sem umsækjandinn sér þegar beiðni er ekki samþykkt.", + "Members of these groups": "Meðlimir þessara hópa", + "Groups that may create projects": "Hópar sem mega stofna verkefni", + "The group {group} no longer exists. Save to remove it.": "Hópurinn {group} er ekki lengur til. Vistaðu til að fjarlægja hann.", + "Review project request": "Yfirfara verkefnisbeiðni", + "Requested by": "Beðið af", + "Why it is needed": "Af hverju þess er þörf", + "Desired start date": "Æskileg upphafsdagsetning", + "Why is it not approved?": "Af hverju er það ekki samþykkt?", + "Give a reason. The requester sees it.": "Gefðu ástæðu. Umsækjandinn sér hana.", + "Approve": "Samþykkja", + "Reject": "Hafna", + "Reject request": "Hafna beiðni", + "The review was not saved. Try again.": "Yfirferðin var ekki vistuð. Reyndu aftur.", + "This project is waiting for review": "Þetta verkefni bíður yfirferðar", + "This request was not approved": "Þessi beiðni var ekki samþykkt", + "Reason: {note}": "Ástæða: {note}", + "Review request": "Yfirfara beiðni", + "Request a project": "Biðja um verkefni", + "Step {step} of 2": "Skref {step} af 2", + "Why is this project needed?": "Af hverju þarf þetta verkefni?", + "Give a reason. The reviewer reads it.": "Gefðu ástæðu. Sá sem yfirfer les hana.", + "Back": "Til baka", + "Next": "Áfram", + "Send request": "Senda beiðni", + "The request was not sent. Try again.": "Beiðnin var ekki send. Reyndu aftur.", + "Requested": "Beðið um", + "Not approved": "Ekki samþykkt", + "Your request was sent": "Beiðnin þín var send", + "Let everyone else request a project": "Leyfa öllum öðrum að biðja um verkefni", + "Add a task": "Bæta við verkefni", + "Delete task": "Eyða verkefni", + "Edit task": "Breyta verkefni", + "Write": "Skrifa", + "Preview": "Forskoðun", + "Markdown works here: headings, lists and links.": "Markdown virkar hér: fyrirsagnir, listar og tenglar.", + "Could not save the task. Please try again.": "Ekki tókst að vista verkefnið. Reyndu aftur.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Tími hefur verið skráður á \"{title}\" og því er ekki hægt að eyða því. Þú getur hætt við það í staðinn: tímaskráningarnar haldast.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Eyða \"{title}\"? Tenglar þess við önnur verkefni eru líka fjarlægðir. Þetta er ekki hægt að afturkalla.", + "Keep task": "Halda verkefni", + "Cancel task": "Hætta við verkefni", + "Only the reporter, the project owner or an admin can delete this task.": "Aðeins sá sem tilkynnti það, eigandi verkefnisins eða stjórnandi getur eytt þessu verkefni.", + "Could not delete the task. Please try again.": "Ekki tókst að eyða verkefninu. Reyndu aftur.", + "Could not cancel the task. Please try again.": "Ekki tókst að hætta við verkefnið. Reyndu aftur.", + "Responsible": "Ábyrgðaraðili", + "Also working on this": "Vinnur líka að þessu", + "Labels": "Merki", + "Could not change the priority. Please try again.": "Ekki tókst að breyta forgangi. Reyndu aftur.", + "Other project members who work on this task alongside the person responsible.": "Aðrir meðlimir verkefnisins sem vinna að þessu verkefni með ábyrgðaraðilanum.", + "Duplicate": "Tvítaka", + "Could not copy the task. Please try again.": "Ekki tókst að afrita verkefnið. Reyndu aftur.", + "Subtasks": "Undirverkefni", + "{done} of {total} done": "{done} af {total} lokið", + "Add a subtask": "Bæta við undirverkefni", + "Checklist": "Gátlisti", + "Checklist item actions": "Aðgerðir fyrir atriði á gátlista", + "Add a checklist item": "Bæta atriði á gátlista", + "Subtasks: {estimate} estimated, {logged} logged": "Undirverkefni: {estimate} áætlað, {logged} skráð", + "Total estimate: {total}": "Heildaráætlun: {total}", + "Part of {title}": "Hluti af {title}", + "Checklist: {count} done": "Gátlisti: {count} lokið", + "This task has subtasks: {count}.": "Þetta verkefni hefur undirverkefni: {count}.", + "Keep subtasks as separate tasks": "Halda undirverkefnum sem sérstökum verkefnum", + "Delete subtasks too": "Eyða undirverkefnum líka", + "Copy of {title}": "Afrit af {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Verkefnið var afritað, en ekki öll undirverkefni þess. Athugaðu afritið.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Lítil skref innan verkefnisins. Hvert atriði hefur auðkenni, texta og hvort því sé lokið.", + "Open work per person and per project.": "Opin vinna eftir einstaklingi og verkefni.", + "View": "Yfirlit", + "By person": "Eftir einstaklingi", + "By project": "Eftir verkefni", + "Hours left": "Klukkustundir eftir", + "Tasks without an estimate": "Verk án áætlunar", + "Due in 14 days": "Á gjalddaga innan 14 daga", + "Shared": "Deilt", + "Unassigned": "Ekki úthlutað", + "{hours} h": "{hours} klst.", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Sýnir vinnu í verkefnunum sem þú sérð. Klukkustundir teljast hjá ábyrgðaraðila; deild verk eru talin án klukkustunda.", + "No open work in these projects.": "Engin opin vinna í þessum verkefnum.", + "Open work": "Opin vinna", + "{count} open tasks": "{count} opin verk", + "Create a project to see capacity here.": "Stofnaðu verkefni til að sjá afkastagetu hér.", + "My tasks": "Verkin mín", + "Show all my tasks": "Sýna öll verkin mín", + "No tasks assigned to you": "Engum verkum úthlutað til þín", + "Browse projects": "Skoða verkefni", + "Later": "Síðar", + "Due {date}": "Gjalddagi {date}", + "Could not change the status. Please try again.": "Ekki tókst að breyta stöðunni. Reyndu aftur.", + "Completed today": "Lokið í dag", + "My open tasks": "Opin verk mín", + "My overdue tasks": "Verk mín í vanskilum", + "My tasks in progress": "Verk mín í vinnslu", + "Pin to the top": "Festa efst", + "Unpin": "Losa", + "Pinned": "Fest", + "Actions for {title}": "Aðgerðir fyrir {title}", + "Could not save your project order. Please try again.": "Ekki tókst að vista röð verkefnanna þinna. Reyndu aftur.", + "No boards yet": "Engar töflur enn", + "Create a project to get a board.": "Stofnaðu verkefni til að fá töflu.", + "Use the Projects page to create and manage your projects and tasks.": "Notaðu síðuna Verkefni til að stofna og stjórna verkefnum og verkum.", + "Go to projects": "Fara í verkefni", + "You are not a member of any projects yet.": "Þú ert ekki enn meðlimur í neinu verkefni.", + "Could not search for users. Please try again.": "Ekki tókst að leita að notendum. Reyndu aftur.", + "Project creation is restricted to administrators.": "Aðeins stjórnendur geta stofnað verkefni.", + "Only the project owner or an administrator can delete this project.": "Aðeins eigandi verkefnisins eða stjórnandi getur eytt þessu verkefni.", + "No projects are available to you yet. Ask an administrator to create one.": "Engin verkefni eru enn í boði fyrir þig. Biddu stjórnanda um að stofna eitt.", + "Due: {date}": "Gjalddagi: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Verk með upphafs- eða gjalddaga birtast á tímalínunni. Bættu við dagsetningum til að sjá þau hér.", + "You do not have access to this project.": "Þú hefur ekki aðgang að þessu verkefni.", + "Zoom level": "Aðdráttarstig", + "Unscheduled": "Óáætlað", + "Start: {date}": "Upphaf: {date}", + "Today": "Í dag", + "No scheduled tasks": "Engin áætluð verk", + "An unexpected error occurred.": "Óvænt villa kom upp.", + "Column {number} name": "Heiti dálks {number}", + "Failed to save creation policy": "Ekki tókst að vista stefnu um stofnun", + "All authenticated users": "Allir innskráðir notendur", + "Control who may create new projects": "Stjórnaðu hverjir mega stofna ný verkefni", + "Administrators only": "Aðeins stjórnendur", + "Project creation": "Stofnun verkefna", + "Allow project creation": "Leyfa stofnun verkefna", + "Creation policy saved successfully": "Stefna um stofnun vistuð", + "Initializing…": "Ræsir…", + "e.g. 2h 30m, 90m, 1.5h": "t.d. 2h 30m, 90m, 1.5h", + "Log time": "Skrá tíma", + "Save estimate": "Vista áætlun", + "Logged: {logged}": "Skráð: {logged}", + "over by {amount}": "{amount} umfram", + "Time tracking": "Tímaskráning", + "Estimate": "Áætlun", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Sláðu inn gilda áætlun (t.d. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Sláðu inn gilda lengd (t.d. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Ekki tókst að vista tímaskráninguna. Reyndu aftur.", + "Edit time entry": "Breyta tímaskráningu", + "Duration": "Lengd", + "Date range": "Tímabil", + "Last week": "Síðasta vika", + "No time logged": "Enginn tími skráður", + "Log time on a task to see it here.": "Skráðu tíma á verk til að sjá hann hér.", + "To date": "Til dags", + "This week": "Þessi vika", + "Total: {total}": "Samtals: {total}", + "From date": "Frá degi", + "Custom range": "Sérsniðið tímabil", + "All time": "Allur tími", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Ekki tókst að eyða verki, svo gögn gætu orðið eftir. Eyddu verkefninu aftur.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Ekki tókst að eyða tímaskráningu, svo gögn gætu orðið eftir. Eyddu verkefninu aftur.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Ekki tókst að eyða dálki, svo gögn gætu orðið eftir. Eyddu verkefninu aftur.", + "Could not delete the project. Please try again.": "Ekki tókst að eyða verkefninu. Reyndu aftur.", + "Notification settings": "Tilkynningastillingar", + "Configure when due-date reminders are sent": "Stilltu hvenær áminningar um gjalddaga eru sendar", + "Due-date reminder lead time (hours)": "Fyrirvari áminningar um gjalddaga (klst.)", + "Lead time must be between 1 and 336 hours": "Fyrirvarinn verður að vera á milli 1 og 336 klst.", + "Reminder lead time saved successfully": "Fyrirvari áminningar vistaður", + "Failed to save reminder lead time": "Ekki tókst að vista fyrirvara áminningar", + "Notifications": "Tilkynningar", + "Notify me 1 day before a task's due date": "Láttu mig vita 1 degi fyrir gjalddaga verks", + "Draft": "Drög", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Hvort kennslustundin er drög sem aðeins kennarinn sér, fer fram eða fellur niður.", + "New release": "Ný útgáfa", + "Roadmap chart. The same releases and epics are listed below.": "Graf yfir vegvísi. Sömu útgáfur og epics eru taldar upp hér að neðan.", + "Nothing on the roadmap yet": "Ekkert á vegvísinum enn", + "Releases with a target date and epics with dated tasks appear here.": "Hér birtast útgáfur með markdagsetningu og epics með dagsettum verkefnum.", + "Releases": "Útgáfur", + "No releases yet": "Engar útgáfur enn", + "Target date: {date}": "Markdagsetning: {date}", + "No target date": "Engin markdagsetning", + "Edit {name}": "Breyta {name}", + "Mark {name} as released": "Merkja {name} sem gefna út", + "Mark as released": "Merkja sem gefið út", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Engin epics enn. Opnaðu verkefni til að gera það að epic.", + "Not scheduled yet": "Ekki tímasett enn", + "Planned": "Áætluð", + "Released": "Gefin út", + "Edit release": "Breyta útgáfu", + "Target date": "Markdagsetning", + "Could not save the release. Please try again.": "Ekki tókst að vista útgáfuna. Reyndu aftur.", + "Every task of this release is done or cancelled.": "Öll verkefni þessarar útgáfu eru lokið eða hætt við.", + "Not finished yet: {count}": "Ekki lokið enn: {count}", + "What happens to these tasks?": "Hvað verður um þessi verkefni?", + "Move to {name}": "Færa í {name}", + "Remove the release": "Fjarlægja útgáfuna", + "Keep it on {name}": "Halda þeim í {name}", + "Could not mark the release as released. Please try again.": "Ekki tókst að merkja útgáfuna sem gefna út. Reyndu aftur.", + "Roadmap": "Vegvísir", + "Tasks or roadmap": "Verkefni eða vegvísir", + "Release": "Útgáfa", + "Epic": "Epic", + "This task is an epic": "Þetta verkefni er epic", + "A named, dated delivery of a project that its tasks are planned against.": "Nefnd, dagsett afhending verkefnis sem verkþættir þess eru skipulagðir á móti.", + "Name of the release": "Heiti útgáfunnar", + "The project this release belongs to": "Verkefnið sem þessi útgáfa tilheyrir", + "What this release delivers": "Hvað þessi útgáfa afhendir", + "When work on the release starts": "Hvenær vinna við útgáfuna hefst", + "The date the release is due": "Dagsetningin sem útgáfan á að vera tilbúin", + "Whether the release is planned, released or archived": "Hvort útgáfan er áætluð, gefin út eða í geymslu", + "Released on": "Gefin út", + "When the release was marked as released": "Hvenær útgáfan var merkt sem gefin út", + "The release this task is planned for": "Útgáfan sem þetta verkefni er áætlað fyrir", + "Board view options": "Birtingarvalkostir töflu", + "Colour cards": "Lita spjöld", + "No colour": "Enginn litur", + "By label": "Eftir merki", + "Swimlanes": "Brautir", + "No swimlanes": "Engar brautir", + "By assignee": "Eftir ábyrgðaraðila", + "By epic": "Eftir bálki", + "No assignee": "Óúthlutað", + "No epic": "Enginn bálkur", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Spjöld haldast í röð síns bálks. Breyttu bálkinum á síðu verkefnisins.", + "Hand over to": "Afhenda", + "Could not save your board view. It applies until you reload.": "Ekki tókst að vista töfluyfirlitið. Það gildir þar til þú endurhleður.", + "Timetable wish": "Stundaskrárósk", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Ósk sem rafallinn tekur tillit til. Harða ósk virðir hann alltaf, mjúka ósk þar sem hægt er.", + "Whether the wish is about a teacher, a group, a room or one activity": "Hvort óskin varðar kennara, hóp, stofu eða eina virkni", + "Teacher": "Kennari", + "Group": "Hópur", + "Reference": "Tilvísun", + "The user, group, room or activity the wish is about": "Notandinn, hópurinn, stofan eða virknin sem óskin varðar", + "What the wish asks for": "Það sem óskin biður um", + "Not on these periods": "Ekki í þessum tímum", + "Preferably not on these periods": "Helst ekki í þessum tímum", + "At most a number of lessons a day": "Mest tiltekinn fjöldi kennslustunda á dag", + "No free periods between lessons": "Engin göt milli kennslustunda", + "Always the same room": "Alltaf sama stofa", + "Periods": "Tímar", + "The periods of the week the wish is about, such as wed-5": "Tímar vikunnar sem óskin varðar, t.d. wed-5", + "Limit": "Mörk", + "The most lessons a day, for a wish of that kind": "Flestar kennslustundir á dag, fyrir ósk af því tagi", + "Strength": "Styrkur", + "Whether the generator must keep the wish or should keep it": "Hvort rafallinn verður eða ætti að virða óskina", + "Hard": "Hörð", + "Soft": "Mjúk", + "Weight": "Vægi", + "How much a soft wish counts, from 1 to 3": "Hve mikið mjúk ósk vegur, frá 1 til 3", + "Why the wish exists": "Hvers vegna óskin er til", + "Timetable scenario": "Stundaskrárdrög", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Eitt vikumynstur, gert af rafalnum eða tekið úr núverandi stundaskrá. Það geymir inntak sitt og hve vel það virðir óskirnar.", + "The name timetablers know the scenario by": "Nafnið sem stundaskrárgerðarfólk þekkir drögin undir", + "Whether the generator made it or it came from the current timetable": "Hvort rafallinn gerði þau eða þau koma úr núverandi stundaskrá", + "Generated": "Búin til", + "From the current timetable": "Úr núverandi stundaskrá", + "Week of": "Vika frá", + "The Monday of the first week of the window": "Mánudagur fyrstu viku tímabilsins", + "Window start": "Upphaf tímabils", + "The first day the week pattern applies to": "Fyrsti dagurinn sem vikumynstrið gildir", + "Window end": "Lok tímabils", + "The last day the week pattern applies to": "Síðasti dagurinn sem vikumynstrið gildir", + "Waiting, generating, done, failed, or published as draft lessons": "Bíður, í vinnslu, lokið, mistókst eða birt sem drög að kennslustundum", + "Waiting": "Bíður", + "Generating": "Í vinnslu", + "Failed": "Mistókst", + "Published": "Birt", + "Seed": "Fræ", + "The number the generator starts from, so a run can be repeated": "Talan sem rafallinn byrjar á, svo hægt sé að endurtaka keyrslu", + "Input": "Inntak", + "The periods, rooms, lessons and wishes the scenario was made from": "Tímarnir, stofurnar, kennslustundirnar og óskirnar sem drögin voru gerð úr", + "Placements": "Staðsetningar", + "Each lesson with the period and room it was given": "Hver kennslustund með tímanum og stofunni sem hún fékk", + "Unplaced lessons": "Óstaðsettar kennslustundir", + "Lessons without a place, each with the hard wish that blocked it": "Kennslustundir án staðar, hver með hörðu óskinni sem stöðvaði hana", + "Broken wishes": "Brotnar óskir", + "The wishes this scenario breaks, with the lessons that break them": "Óskirnar sem drögin brjóta, með kennslustundunum sem brjóta þær", + "Measures": "Mælikvarðar", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Staðsettar kennslustundir, brotnar óskir, göt kennara, kennslustundir á dag og stofunotkun", + "Reason": "Ástæða", + "Why the run failed": "Hvers vegna keyrslan mistókst", + "Published at": "Birt", + "When the scenario was written out as draft lessons": "Hvenær drögin voru skrifuð út sem drög að kennslustundum", + "Edit wish": "Breyta ósk", + "New wish": "Ný ósk", + "Hard: the generator always keeps it": "Föst: rafallinn virðir hana alltaf", + "Soft: the generator keeps it where it can": "Sveigjanleg: rafallinn virðir hana þar sem hann getur", + "Weight (1 to 3)": "Vægi (1 til 3)", + "Most lessons a day": "Mest kennslustundir á dag", + "Period": "Kennslustund", + "{day} period {number}": "{day} kennslustund {number}", + "Teacher (user name)": "Kennari (notandanafn)", + "Activity (group:subject)": "Verkefni (hópur:fag)", + "Say who or what the wish is about.": "Tilgreindu hvern eða hvað óskin varðar.", + "Choose at least one period.": "Veldu að minnsta kosti eina kennslustund.", + "The limit is a whole number of 1 or more.": "Takmarkið er heiltala, 1 eða hærri.", + "Timetable": "Stundaskrá", + "Wishes": "Óskir", + "Timetable wishes": "Óskir um stundaskrá", + "Generator run": "Keyrsla rafals", + "Generator progress": "Framvinda rafals", + "The run failed: {reason}": "Keyrslan mistókst: {reason}", + "{placed} of {lessons} lessons placed": "{placed} af {lessons} kennslustundum raðað", + "Generate again": "Búa til aftur", + "Generate": "Búa til", + "Every lesson has a place.": "Hver kennslustund hefur stað.", + "Lesson": "Kennslustund", + "No free period and room": "Engin laus stund og stofa", + "Broken soft wishes": "Brotnar sveigjanlegar óskir", + "Every soft wish is kept.": "Hver sveigjanleg ósk er virt.", + "Wish": "Ósk", + "Lessons": "Kennslustundir", + "Generating: {percent}% of the time budget used": "Býr til: {percent}% af tímanum notað", + "Waiting to start": "Bíður eftir ræsingu", + "Published as draft lessons": "Birt sem drög að kennslustundum", + "Could not read the scenario.": "Ekki tókst að lesa sviðsmyndina.", + "Could not start the run.": "Ekki tókst að ræsa keyrsluna.", + "Scenarios": "Sviðsmyndir", + "Timetable scenarios": "Sviðsmyndir stundaskrár", + "Scenario": "Sviðsmynd", + "Take the current timetable": "Taka núverandi stundaskrá", + "Could not take the current timetable.": "Ekki tókst að taka núverandi stundaskrá.", + "Broken hard wishes": "Brotnar skilyrðisóskir", + "Not on a period of the week grid": "Ekki á kennslustund í vikutöflunni", + "Compare scenarios": "Bera saman sviðsmyndir", + "Scenarios to compare": "Sviðsmyndir til samanburðar", + "Choose two or three scenarios to compare them.": "Veldu tvær eða þrjár sviðsmyndir til að bera saman.", + "Measure": "Mælikvarði", + "Best": "Best", + "Lessons that differ": "Kennslustundir sem eru ólíkar", + "No lesson differs.": "Engin kennslustund er ólík.", + "Not placed": "Ekki raðað", + "{period} in {room}": "{period} í {room}", + "Lessons placed": "Raðaðar kennslustundir", + "Lessons without a place": "Kennslustundir án staðar", + "Clashes": "Árekstrar", + "Hard wishes broken": "Brotnar fastar óskir", + "Soft wishes broken": "Brotnar sveigjanlegar óskir", + "Soft wishes broken, weighted": "Brotnar sveigjanlegar óskir, vegnar", + "Free periods between lessons, all teachers": "Eyður, allir kennarar", + "Most free periods of one teacher": "Flestar eyður hjá einum kennara", + "Most lessons of one group on a day": "Flestar kennslustundir hjá einum hópi á dag", + "Room use": "Nýting stofa", + "Publish as draft lessons": "Birta sem drög að kennslustundum", + "Draft lessons written: {count}": "Drög að kennslustundum skrifuð: {count}", + "Could not publish the scenario.": "Ekki tókst að birta sviðsmyndina.", + "Rules": "Reglur", + "Rules for {column}": "Reglur fyrir {column}", + "When a card enters this column": "Þegar spjald fer inn í þennan dálk", + "Action": "Aðgerð", + "Set the priority": "Stilla forgang", + "Assign to": "Úthluta til", + "Assign the person who moved the card": "Úthluta til þess sem færði spjaldið", + "Remove the assignee": "Fjarlægja ábyrgðaraðila", + "Add a label": "Bæta við merki", + "No longer a project member": "Ekki lengur í verkefninu", + "This label no longer exists": "Þetta merki er ekki lengur til", + "Add rule": "Bæta við reglu", + "Remove rule": "Fjarlægja reglu", + "No rules yet. Add one to change a card when it enters this column.": "Engar reglur enn. Bættu við reglu til að breyta spjaldi þegar það fer inn í þennan dálk.", + "Could not save the rules. Please try again.": "Ekki tókst að vista reglurnar. Reyndu aftur.", + "1 rule runs when a card enters this column": "1 regla keyrir þegar spjald fer inn í þennan dálk", + "{count} rules run when a card enters this column": "{count} reglur keyra þegar spjald fer inn í þennan dálk", + "Rules applied: {changes}": "Reglur notaðar: {changes}", + "assigned to {name}": "úthlutað til {name}", + "assignee removed": "ábyrgðaraðili fjarlægður", + "priority {priority}": "forgangur {priority}", + "label {label}": "merki {label}", + "What happens to a card when it enters this column, applied in list order.": "Hvað gerist við spjald þegar það fer inn í þennan dálk, í röð listans.", + "Value": "Gildi", + "What the rule does to the card.": "Hvað reglan gerir við spjaldið.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Forgangurinn, notandaauðkennið eða merkjaauðkennið sem aðgerðin notar; autt fyrir aðgerðir án gildis.", + "is not": "er ekki", + "{dimension} is not": "{dimension} er ekki", + "Saved filters": "Vistaðar síur", + "No saved filters yet": "Engar vistaðar síur enn", + "Save filter": "Vista síu", + "Rename \"{name}\"": "Endurnefna „{name}“", + "Delete \"{name}\"": "Eyða „{name}“", + "Clear filters": "Hreinsa síur", + "Showing {shown} of {total} tasks": "Sýnir {shown} af {total} verkefnum", + "Me": "Ég", + "No date": "Engin dagsetning", + "Rename saved filter": "Endurnefna vistaða síu", + "Share with the project": "Deila með verkefninu", + "Give the filter a name": "Gefðu síunni nafn", + "Could not save the filter. Please try again.": "Ekki tókst að vista síuna. Reyndu aftur.", + "Some labels in \"{name}\" no longer exist and were left out.": "Sum merki í „{name}“ eru ekki lengur til og var sleppt.", + "Could not delete the filter. Please try again.": "Ekki tókst að eyða síunni. Reyndu aftur.", + "Saved filter": "Vistuð sía", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Nefnd töflusía eins verkefnis, einkamál þess sem vistaði hana nema henni sé deilt með verkefninu.", + "The project whose board the filter applies to": "Verkefnið sem sían á við um töflu þess", + "The name the filter is listed under": "Nafnið sem sían birtist undir í listanum", + "Saved by": "Vistað af", + "Nextcloud user id of the person who saved the filter": "Nextcloud-notandaauðkenni þess sem vistaði síuna", + "Shared with the project": "Deilt með verkefninu", + "Whether every project member sees and applies the filter": "Hvort allir í verkefninu sjá síuna og geta notað hana", + "Criteria": "Skilyrði", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Sían: ábyrgðaraðili, merki, forgangur og skiladagur, hvert með er eða er ekki og gildum sínum", + "Cross-project view": "Yfirlit þvert á verkefni", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Vistað úrval verkefna þar sem verkin eru sýnd saman í stöðubrautum, deilt með fólkinu sem það nefnir.", + "Shared with": "Deilt með", + "The name the view is listed under": "Nafnið sem yfirlitið er skráð undir", + "Nextcloud user id of the person who saved the view": "Nextcloud-notandaauðkenni þess sem vistaði yfirlitið", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-notandaauðkenni fólksins sem yfirlitinu er deilt með", + "The projects whose tasks the view shows, at most twenty": "Verkefnin sem yfirlitið sýnir verk úr, mest tuttugu", + "1 project in this view is hidden from you.": "1 verkefni í þessu yfirliti er falið fyrir þér.", + "{count} projects in this view are hidden from you.": "{count} verkefni í þessu yfirliti eru falin fyrir þér.", + "{project} has no column for {status}.": "{project} hefur engan dálk fyrir {status}.", + "This view does not exist or is not shared with you.": "Þetta yfirlit er ekki til eða því hefur ekki verið deilt með þér.", + "\"{task}\" moved to {status}.": "\"{task}\" fært í {status}.", + "Project: {title}": "Verkefni: {title}", + "Cross-project views": "Yfirlit þvert á verkefni", + "New view": "Nýtt yfirlit", + "Edit view": "Breyta yfirliti", + "Delete view": "Eyða yfirliti", + "Give the view a name": "Gefðu yfirlitinu nafn", + "Pick at least one project": "Veldu að minnsta kosti eitt verkefni", + "A view shows at most {max} projects": "Yfirlit sýnir mest {max} verkefni", + "Could not save the view. Please try again.": "Ekki tókst að vista yfirlitið. Reyndu aftur.", + "Could not delete the view. Please try again.": "Ekki tókst að eyða yfirlitinu. Reyndu aftur.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Eyða \"{title}\"? Verkefnin og verk þeirra haldast óbreytt.", + "People see the tasks of the projects they are in, never more.": "Fólk sér verk þeirra verkefna sem það er í, aldrei meira.", + "No views yet. A view shows the tasks of several of your projects together.": "Engin yfirlit enn. Yfirlit sýnir verk úr nokkrum verkefnum þínum saman.", + "Projects in view: {count}": "Verkefni í yfirliti: {count}", + "Notify me when a task is assigned to me": "Láttu mig vita þegar mér er úthlutað verki", + "Also send these to me by email": "Sendu mér þetta líka í tölvupósti", + "Add an email address in your Nextcloud personal settings to get mail.": "Bættu við netfangi í persónulegum Nextcloud-stillingum til að fá tölvupóst.", + "Code link": "Kóðatengill", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, grein, samrunabeiðni eða mál á kóðavettvangi sem tengist verkefni.", + "The task the link belongs to": "Verkefnið sem tengillinn tilheyrir", + "The project of the task": "Verkefnið sem verkið tilheyrir", + "Task key": "Verklykill", + "The task key the forge text named, such as VC-12": "Verklykillinn sem texti kóðavettvangsins nefndi, t.d. VC-12", + "What the link points at": "Hvert tengillinn vísar", + "Link": "Tengill", + "The address of the item in the forge": "Vistfang atriðisins á kóðavettvanginum", + "The commit message, branch name or merge request title": "Commit-skilaboðin, heiti greinarinnar eða titill samrunabeiðninnar", + "Repository": "Hirsla", + "The repository, such as acme/portal": "Hirslan, t.d. acme/portal", + "Forge id": "Auðkenni á vettvangi", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Eigið auðkenni atriðisins á kóðavettvanginum, t.d. github:acme/portal#42 eða commit-tætigildi", + "State": "Staða", + "The state of a merge request or issue": "Staða samrunabeiðni eða máls", + "Who made the commit or opened the merge request": "Hver gerði commit-ið eða opnaði samrunabeiðnina", + "When the commit was made or the merge request last changed": "Hvenær commit-ið var gert eða samrunabeiðnin breyttist síðast", + "Added by": "Bætt við af", + "Whether a person added the link or the integration wrote it": "Hvort manneskja bætti tenglinum við eða samþættingin skrifaði hann", + "Nextcloud user UIDs of project members": "Nextcloud-notandaauðkenni verkefnismeðlima", + "Add link": "Bæta við tengli", + "Added by hand": "Bætt við handvirkt", + "Branch": "Grein", + "Code": "Kóði", + "Commit": "Commit", + "From the integration": "Frá samþættingunni", + "Link to a commit, branch or merge request": "Tengill á commit, grein eða samrunabeiðni", + "Merge request": "Samrunabeiðni", + "Merged": "Sameinað", + "No code linked yet. Name {key} in a commit message or paste a link.": "Enginn kóði tengdur enn. Nefndu {key} í commit-skilaboðum eða límdu inn tengil.", + "No code linked yet. Paste a link to a commit or merge request.": "Enginn kóði tengdur enn. Límdu inn tengil á commit eða samrunabeiðni.", + "Paste a web address that starts with https://.": "Límdu inn vefslóð sem byrjar á https://.", + "Remove link {title}": "Fjarlægja tengilinn {title}", + "The link could not be added.": "Ekki tókst að bæta tenglinum við.", + "The link could not be removed.": "Ekki tókst að fjarlægja tengilinn.", + "This link is already on the task.": "Þessi tengill er þegar á verkinu.", + "Code forges": "Kóðavettvangar", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Tengdu commit og pull requests úr GitHub við verk. Integriq tekur við atburðunum; planninq kallar aldrei á GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Sæktu stillingarnar og fluttu þær inn í Integriq. Fylltu svo inn leyndarmál í regluna \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Í GitHub skaltu bæta vefkróki við hirsluna með þessu vistfangi og sama leyndarmáli. Veldu efnistegundina application/json og atburðina push og pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nefndu verklykilinn, t.d. VC-12, í commit-skilaboðum, heiti greinar eða titli pull request. Tengillinn birtist þá á því verki.", + "Without Integriq, project members can still paste a link on the task page.": "Án Integriq geta verkefnismeðlimir samt límt tengil á síðu verksins.", + "Download the Integriq configuration": "Sækja stillingar fyrir Integriq", + "Calendar": "Dagatal", + "Previous": "Fyrri", + "Calendar view": "Dagatalsyfirlit", + "Starts:": "Hefst:", + "No tasks with a date in this month.": "Engin verk með dagsetningu í þessum mánuði.", + "Week of {start} to {end}": "Vika frá {start} til {end}", + "My calendar": "Dagatalið mitt", + "Show as list": "Sýna sem lista", + "Show as calendar": "Sýna sem dagatal", + "Open my calendar": "Opna dagatalið mitt", + "Nextcloud Tasks": "Nextcloud Verkefni", + "Show my tasks in Nextcloud Tasks": "Sýna verkefnin mín í Nextcloud Verkefnum", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Verkefni sem þér er úthlutað eða deilt með þér birtast á listanum \"Planninq\" í Verkefnum og Dagatali Nextcloud. Breytingum sem gerðar eru þar er skipt út við næstu breytingu í Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Þessi þjónn getur ekki skrifað í Nextcloud Verkefni, svo útflutningur er ekki í boði.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Stjórnað af Planninq. Breytingum sem gerðar eru hér er skipt út við næstu breytingu í Planninq.", + "Working days and holidays": "Vinnudagar og frídagar", + "Dates set on the timeline skip the days that are not working days.": "Dagsetningar settar á tímalínunni sleppa dögum sem eru ekki vinnudagar.", + "Working weekdays": "Vinnudagar vikunnar", + "Non-working days": "Frídagar", + "No non-working days yet.": "Engir frídagar enn.", + "Add day": "Bæta við degi", + "Year": "Ár", + "Add Dutch national holidays": "Bæta við hollenskum frídögum", + "Save working days": "Vista vinnudaga", + "Choose at least one working weekday.": "Veldu að minnsta kosti einn vinnudag.", + "Working days saved.": "Vinnudagar vistaðir.", + "Could not save the working days.": "Ekki tókst að vista vinnudagana.", + "New Year's Day": "Nýársdagur", + "Easter Sunday": "Páskadagur", + "Easter Monday": "Annar í páskum", + "King's Day": "Konungsdagurinn", + "Liberation Day": "Frelsisdagurinn", + "Ascension Day": "Uppstigningardagur", + "Whit Sunday": "Hvítasunnudagur", + "Whit Monday": "Annar í hvítasunnu", + "Christmas Day": "Jóladagur", + "Boxing Day": "Annar í jólum", + "Dates of {title}": "Dagsetningar {title}", + "The due date cannot be before the start date.": "Skiladagur getur ekki verið á undan upphafsdegi.", + "{title}, from {start} to {end}": "{title}, frá {start} til {end}", + "The dates could not be saved.": "Ekki tókst að vista dagsetningarnar.", + "{title} now runs from {start} to {end}": "{title} stendur nú frá {start} til {end}", + "Auto-scheduling": "Sjálfvirk tímasetning", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Þegar kveikt er á þessu býðst til að færa verkin sem verk hindrar þegar skiladagur þess er færður aftar á tímalínunni.", + "Move blocked tasks along when a task slips": "Færa hindruð verk með þegar verk tefst", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Á tímalínunni býður seinni skiladagur upp á að færa hindruðu verkin. Aðeins \"hindrar\"-tengsl gilda og verk færast aðeins aftar.", + "Move the tasks that wait for {title}?": "Færa verkin sem bíða eftir {title}?", + "These tasks wait for it and would start after its new due date:": "Þessi verk bíða eftir því og myndu hefjast eftir nýja skiladaginn:", + "{count} tasks would move; the first {limit} are listed.": "{count} verk myndu færast; fyrstu {limit} eru sýnd.", + "Now": "Núna", + "After the move": "Eftir færsluna", + "Only this task": "Aðeins þetta verk", + "Move all": "Færa öll", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stöðvaðist við {title}: ekki tókst að vista dagsetningarnar. Verkin á undan voru færð.", + "Cumulative flow": "Uppsafnað flæði", + "Show as chart": "Sýna sem graf", + "Show as table": "Sýna sem töflu", + "Tasks per column per day": "Verk í dálki á dag", + "Tasks without recorded history in this period: {count}": "Verk án skráðrar sögu á þessu tímabili: {count}", + "Lead and cycle time": "Afhendingartími og lotutími", + "No tasks were finished in this period.": "Engu verki var lokið á þessu tímabili.", + "Finished tasks": "Lokin verk", + "Cycle time, average": "Lotutími, meðaltal", + "Cycle time, 85th percentile": "Lotutími, 85. hundraðshlutamark", + "Lead time, average": "Afhendingartími, meðaltal", + "Tasks whose finish time was estimated from their history: {count}": "Verk þar sem lokatími var áætlaður út frá sögu: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Lotutími hvers lokins verks, með meðaltali og 85. hundraðshlutamarki", + "Slowest tasks": "Hægustu verkin", + "cycle {cycle}, lead {lead}": "lota {cycle}, afhending {lead}", + "{days} days": "{days} dagar", + "Could not load the flow of this project.": "Ekki tókst að hlaða flæði þessa verkefnis.", + "Last {days} days": "Síðustu {days} dagar", + "Portfolio flow": "Flæði safns", + "An admin adds portfolios under Projects, Portfolios.": "Stjórnandi bætir við söfnum undir Verkefni, Söfn.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Verkefni sem ekki eru sýnd, því að hámarki 50 eru sýnd í einu: {count}", + "Could not load the flow of this portfolio.": "Ekki tókst að hlaða flæði þessa safns.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Uppsafnað flæði og lotutími yfir verkefni safns.", + "Edit report": "Breyta skýrslu", + "Only tasks where": "Aðeins verk þar sem", + "Group by": "Flokka eftir", + "Display": "Birting", + "Share with everyone who can read its projects": "Deila með öllum sem geta lesið verkefni hennar", + "The report could not be saved.": "Ekki tókst að vista skýrsluna.", + "Number of tasks": "Fjöldi verka", + "Bar": "Súlur", + "Donut": "Hringur", + "Table": "Tafla", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} af {total} verkefnum í þessari skýrslu eru ekki sýnileg þér", + "No tasks match this report.": "Ekkert verk passar við þessa skýrslu.", + "None": "Ekkert", + "Could not load this report.": "Ekki tókst að hlaða þessari skýrslu.", + "Report": "Skýrsla", + "Your reports": "Skýrslurnar þínar", + "My reports": "Mínar skýrslur", + "Shared reports": "Sameiginlegar skýrslur", + "You have not built a report yet.": "Þú hefur ekki búið til skýrslu enn.", + "Nobody has shared a report with you yet.": "Enginn hefur deilt skýrslu með þér enn.", + "Reports you built over tasks, and the ones shared with you.": "Skýrslur sem þú bjóst til um verk, og þær sem deilt var með þér.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Vistuð fyrirspurn um verk: hvaða verkefni, hvaða síur, flokkað eftir hverju, talið eða lagt saman, og sýnt sem tafla eða graf.", + "The name the report is listed under": "Nafnið sem skýrslan er skráð undir", + "What the report shows and who it is for": "Hvað skýrslan sýnir og fyrir hvern hún er", + "Nextcloud user id of the person who saved the report": "Nextcloud-notandaauðkenni þess sem vistaði skýrsluna", + "Who can open the report": "Hver getur opnað skýrsluna", + "Only me": "Aðeins ég", + "Everyone who can read its projects": "Allir sem geta lesið verkefni hennar", + "The projects the report covers, at most fifty": "Verkefnin sem skýrslan nær yfir, mest fimmtíu", + "Filters": "Síur", + "Task fields and the value each must equal": "Verkreitir og gildið sem hver þeirra þarf að jafngilda", + "The task field the report groups on": "Verkreiturinn sem skýrslan flokkar eftir", + "Count the tasks, or add up a number on them": "Telja verkin eða leggja saman tölu á þeim", + "Sum": "Summa", + "Sum of": "Summa af", + "The number added up when the measure is a sum": "Talan sem er lögð saman þegar mælikvarðinn er summa", + "Story points": "Sögustig", + "Estimated duration": "Áætlaður tími", + "How the report is shown": "Hvernig skýrslan er sýnd", + "Issue type": "Tegund máls", + "Task fields and the value each must equal; empty when the report covers every task": "Reitir verks og gildið sem hvert þarf að hafa; autt þegar skýrslan nær yfir öll verk", + "The status a task must have": "Staðan sem verk þarf að hafa", + "The priority a task must have": "Forgangurinn sem verk þarf að hafa", + "The user a task must be assigned to": "Notandinn sem verk þarf að vera úthlutað", + "A label a task must carry": "Merki sem verk þarf að bera", + "The board column a task must be in": "Töfludálkurinn sem verk þarf að vera í", + "The issue type a task must have": "Tegund máls sem verk þarf að hafa", + "Manager groups": "Stjórnendahópar", + "Member groups": "Meðlimahópar", + "Viewer groups": "Lesendahópar", + "Viewers": "Lesendur", + "Owning group": "Eigandahópur", + "Nextcloud groups whose members manage the project": "Nextcloud-hópar sem stýra verkefninu", + "Nextcloud groups whose members work on the project": "Nextcloud-hópar sem vinna að verkefninu", + "Nextcloud groups whose members may read the project": "Nextcloud-hópar sem mega lesa verkefnið", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-notendur sem stýra verkefninu: stillingum, meðlimum og vinnu", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-notendur sem mega lesa verkefnið og vinnu þess en ekki breyta", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud-hópurinn sem á verkefnið ásamt þeim sem stofnaði það, mest einn", + "Nextcloud user ids who may read this through the project": "Nextcloud-notendur sem mega lesa þetta í gegnum verkefnið", + "Nextcloud groups whose members may change this through the project": "Nextcloud-hópar sem mega breyta þessu í gegnum verkefnið", + "Nextcloud groups whose members may read this through the project": "Nextcloud-hópar sem mega lesa þetta í gegnum verkefnið", + "Search for a person or a group…": "Leita að manneskju eða hópi…", + "No one found. Your admin's sharing settings decide who you can find.": "Enginn fannst. Deilingarstillingar kerfisstjórans ráða hverja þú getur fundið.", + "Type at least two characters": "Sláðu inn að minnsta kosti tvo stafi", + "Everyone in this group": "Allir í þessum hópi", + "Could not search for people. Please try again.": "Ekki tókst að leita að fólki. Reyndu aftur.", + "Could not remove the group": "Ekki tókst að fjarlægja hópinn", + "Only the owner and managers change who is on this project.": "Aðeins eigandinn og stjórnendur breyta því hverjir eru í þessu verkefni.", + "Role of {name}": "Hlutverk {name}", + "Manager": "Stjórnandi", + "Member": "Meðlimur", + "Viewer": "Lesandi", + "Could not change the role": "Ekki tókst að breyta hlutverkinu", + "Owned by group: {name}": "Í eigu hópsins: {name}", + "No group owns this project.": "Enginn hópur á þetta verkefni.", + "Owned by group": "Í eigu hóps", + "Search for a group…": "Leita að hópi…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Enginn hópur fannst. Deilingarstillingar kerfisstjórans ráða hvaða hópa þú getur fundið.", + "No owning group": "Enginn eigandahópur", + "Could not search for groups. Please try again.": "Ekki tókst að leita að hópum. Reyndu aftur.", + "Could not change the owning group": "Ekki tókst að breyta eigandahópnum", + "You can read this project. Only its members change it.": "Þú getur lesið þetta verkefni. Aðeins meðlimir þess breyta því.", + "Course": "Námskeið", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Námskeiðið sem kennt er í þessari kennslustund, til dæmis valáfangi, þegar námsapp skólans þekkir það.", + "Online meeting link": "Tengill á netkennslustund", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvar nemendur taka þátt í þessari kennslustund á netinu. Hnappurinn Taka þátt birtist aðeins fyrir https-tengil." }, "plurals": {} } diff --git a/l10n/it.js b/l10n/it.js index 7d1501a9..b0b6a256 100644 --- a/l10n/it.js +++ b/l10n/it.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Impossibile eliminare l'etichetta", "Delete label \"{title}\"? It will be removed from {count} task.": "Eliminare l'etichetta \"{title}\"? Verrà rimossa da {count} attività.", "Label deleted and removed from {count} task": "Etichetta eliminata e rimossa da {count} attività", - "used by {count} task": "usata da {count} attività" + "used by {count} task": "usata da {count} attività", + "Active projects": "Progetti attivi", + "Archived projects": "Progetti archiviati", + "Boards": "Bacheche", + "My projects": "I miei progetti", + "Portfolio": "Portfolio", + "Project board": "Bacheca del progetto", + "Projects I am in": "Progetti a cui partecipo", + "Timeline": "Cronologia", + "Timesheet": "Foglio ore", + "Features & roadmap": "Funzionalità e roadmap", + "Flow": "Flusso", + "Flows": "Flussi", + "Reports": "Report", + "Pick a report to open it.": "Scegli un report per aprirlo.", + "In progress": "In corso", + "Date": "Data", + "Due": "Scadenza", + "Assignee": "Assegnato a", + "Who": "Chi", + "What": "Cosa", + "Minutes": "Minuti", + "Entries": "Voci", + "Most recent": "Più recenti", + "Per person": "Per persona", + "By status": "Per stato", + "By priority": "Per priorità", + "Task status": "Stato delle attività", + "Time spent": "Tempo impiegato", + "Capacity": "Capacità", + "Due soonest": "In scadenza per prime", + "Minutes logged": "Minuti registrati", + "Nothing is due": "Non c'è nulla in scadenza", + "Nothing logged yet": "Ancora nulla registrato", + "What is open, what is blocked, and what is overdue.": "Cosa è aperto, cosa è bloccato e cosa è in ritardo.", + "How allocation is spread across the people working on projects.": "Come il carico è distribuito tra chi lavora sui progetti.", + "Hours logged, and the projects they went to.": "Le ore registrate e i progetti a cui sono andate.", + "Billable": "Fatturabile", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Caricamento progetti", + "No projects for this client yet": "Nessun progetto per questo cliente", + "Open in Planninq": "Apri in Planninq", + "This project could not be found": "Questo progetto non è stato trovato", + "Untitled project": "Progetto senza titolo", + "and {count} more": "e altri {count}", + "Store": "Store", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installa registri, schemi e flussi pubblicati da altre organizzazioni.", + "Work Date": "Data di lavoro", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Azioni della colonna", + "Columns": "Colonne", + "Could not remove the column. Please try again.": "Impossibile rimuovere la colonna. Riprova.", + "Could not save the column. Please try again.": "Impossibile salvare la colonna. Riprova.", + "Done column": "Colonna completati", + "Edit column": "Modifica colonna", + "Keep the card's status": "Mantieni lo stato della scheda", + "Move its cards to": "Sposta le sue schede in", + "Move left": "Sposta a sinistra", + "Move right": "Sposta a destra", + "Status of cards moved here": "Stato delle schede spostate qui", + "The last done column cannot be removed.": "L'ultima colonna completati non può essere rimossa.", + "WIP limit": "Limite WIP", + "over limit": "oltre il limite", + "The status a card gets when it is moved into this column.": "Lo stato che una scheda riceve quando viene spostata in questa colonna.", + "All priorities": "Tutte le priorità", + "Could not create the task. Please try again.": "Impossibile creare l'attività. Riprova.", + "Created": "Creata", + "Move to backlog": "Nel backlog", + "Move to board": "Sulla bacheca", + "New task": "Nuova attività", + "Nothing in the backlog": "Niente nel backlog", + "Rank": "Rango", + "Sort by": "Ordina per", + "Sort by rank to reorder": "Ordina per rango per riordinare", + "Task actions": "Azioni dell'attività", + "All labels": "Tutte le etichette", + "Filter tasks by label": "Filtra le attività per etichetta", + "View timeline": "Visualizza cronologia", + "Board": "Bacheca", + "List": "Elenco", + "Column": "Colonna", + "Board or list": "Bacheca o elenco", + "Log": "Registro", + "Add entry": "Aggiungi voce", + "Show": "Mostra", + "No actions yet": "Ancora nessuna azione", + "Closed": "Chiuso", + "Entry actions": "Azioni della voce", + "Add action": "Aggiungi azione", + "by {author}": "di {author}", + "saved {time}": "salvato {time}", + "Attendees: {names}": "Partecipanti: {names}", + "Add the first entry": "Aggiungi la prima voce", + "Issues": "Problemi", + "Lessons learned": "Lezioni apprese", + "Meetings": "Riunioni", + "Decisions": "Decisioni", + "Actions": "Azioni", + "Issue": "Problema", + "Lesson learned": "Lezione appresa", + "Meeting": "Riunione", + "Decision": "Decisione", + "About this project": "Informazioni sul progetto", + "No description yet": "Ancora nessuna descrizione", + "Start date": "Data di inizio", + "Not set": "Non impostata", + "End date": "Data di fine", + "Progress": "Avanzamento", + "No tasks yet": "Ancora nessuna attività", + "Open the board": "Apri la bacheca", + "People": "Persone", + "Owner": "Proprietario", + "Latest log entries": "Ultime voci", + "Open the log": "Apri il registro", + "{done} of {total} tasks done": "{done} di {total} attività completate", + "Edit entry": "Modifica voce", + "Type": "Tipo", + "Attendees": "Partecipanti", + "Issue is closed": "Il problema è chiuso", + "Could not save the entry. Please try again.": "Impossibile salvare la voce. Riprova.", + "From: {title}": "Da: {title}", + "What needs to happen": "Cosa bisogna fare", + "Could not create the action. Please try again.": "Impossibile creare l'azione. Riprova.", + "The action was created but could not be linked to the entry.": "L'azione è stata creata ma non è stato possibile collegarla alla voce.", + "Project pages": "Pagine del progetto", + "Overview": "Panoramica", + "Risks": "Rischi", + "Log entry": "Voce di registro", + "A short name for the entry": "Un nome breve per la voce", + "Project": "Progetto", + "The project this entry belongs to": "Il progetto a cui appartiene questa voce", + "What kind of entry this is": "Che tipo di voce è", + "When it happened": "Quando è successo", + "What happened, in Markdown": "Cosa è successo, in Markdown", + "Whether an issue is still open": "Se un problema è ancora aperto", + "The people at a meeting": "Le persone presenti a una riunione", + "Tasks that came out of this entry": "Attività nate da questa voce", + "Add risk": "Aggiungi rischio", + "Risk": "Rischio", + "Score": "Punteggio", + "Response": "Risposta", + "Review date": "Data di revisione", + "no longer on the project": "non fa più parte del progetto", + "Edit {title}": "Modifica {title}", + "No risks recorded yet": "Ancora nessun rischio registrato", + "Add the first risk": "Aggiungi il primo rischio", + "Medium": "Medio", + "Mitigating": "In mitigazione", + "Occurred": "Verificato", + "Avoid": "Evitare", + "Reduce": "Ridurre", + "Transfer": "Trasferire", + "Accept": "Accettare", + "Highest open risks": "Rischi aperti più alti", + "No open risks": "Nessun rischio aperto", + "Open the risk register": "Apri il registro dei rischi", + "Edit risk": "Modifica rischio", + "What could go wrong": "Cosa potrebbe andare storto", + "Likelihood": "Probabilità", + "Impact": "Impatto", + "Score {score}": "Punteggio {score}", + "Countermeasures": "Contromisure", + "Could not save the risk. Please try again.": "Impossibile salvare il rischio. Riprova.", + "Risks by likelihood and impact": "Rischi per probabilità e impatto", + "Risk scale": "Scala di rischio", + "The levels every project scores its risks on, and where low turns into medium and high": "I livelli su cui ogni progetto valuta i propri rischi, e dove basso diventa medio e alto", + "Number of levels": "Numero di livelli", + "Likelihood labels": "Etichette di probabilità", + "Impact labels": "Etichette di impatto", + "Level {level}": "Livello {level}", + "Medium from score": "Medio dal punteggio", + "High from score": "Alto dal punteggio", + "Risk scale saved": "Scala di rischio salvata", + "1 risk uses level {level}. Change it first.": "1 rischio usa il livello {level}. Modificalo prima.", + "{count} risks use level {level}. Change them first.": "{count} rischi usano il livello {level}. Modificali prima.", + "Every level needs a label, and high must start above medium.": "Ogni livello ha bisogno di un'etichetta, e alto deve iniziare sopra medio.", + "The project this risk belongs to": "Il progetto a cui appartiene questo rischio", + "The cause and the effect, in Markdown": "La causa e l'effetto, in Markdown", + "Category": "Categoria", + "A free grouping, such as planning, budget or supplier": "Un raggruppamento libero, come pianificazione, budget o fornitore", + "How likely it is, on the admin's risk scale": "Quanto è probabile, sulla scala di rischio dell'amministratore", + "How hard it would hit, on the admin's risk scale": "Quanto colpirebbe, sulla scala di rischio dell'amministratore", + "Likelihood times impact, calculated by the server": "Probabilità per impatto, calcolata dal server", + "Where the risk stands": "A che punto è il rischio", + "The person who watches this risk": "La persona che tiene d'occhio questo rischio", + "How the project answers the risk": "Come il progetto risponde al rischio", + "What is done to prevent it or soften it, in Markdown": "Cosa si fa per prevenirlo o attenuarlo, in Markdown", + "When to look at this risk again": "Quando riesaminare questo rischio", + "Very low": "Molto basso", + "Very high": "Molto alto", + "All projects": "Tutti i progetti", + "Project status report": "Rapporto di stato del progetto", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Un rapporto datato su come sta un progetto per denaro, organizzazione, tempo, informazione, qualità e rischio (gli aspetti GROTIK), ciascuno con una nota.", + "The project this report is about": "Il progetto di cui tratta questo rapporto", + "Report date": "Data del rapporto", + "The day the report describes": "Il giorno descritto dal rapporto", + "Money": "Denaro", + "How the project stands on this aspect": "Come sta il progetto su questo aspetto", + "On track": "In linea", + "At risk": "A rischio", + "Off track": "Fuori rotta", + "Money note": "Nota sul denaro", + "A short explanation of this status": "Una breve spiegazione di questo stato", + "Organisation": "Organizzazione", + "Organisation note": "Nota sull'organizzazione", + "Time": "Tempo", + "Time note": "Nota sul tempo", + "Information": "Informazione", + "Information note": "Nota sull'informazione", + "Quality": "Qualità", + "Quality note": "Nota sulla qualità", + "Risk note": "Nota sul rischio", + "Overall": "Complessivo", + "The worst of the six statuses, calculated by the server": "Il peggiore dei sei stati, calcolato dal server", + "Health: money": "Salute: denaro", + "Copied from the newest status report": "Copiato dal rapporto di stato più recente", + "Health: organisation": "Salute: organizzazione", + "Health: time": "Salute: tempo", + "Health: information": "Salute: informazione", + "Health: quality": "Salute: qualità", + "Health: risk": "Salute: rischio", + "Health: overall": "Salute: complessivo", + "Health: report date": "Salute: data del rapporto", + "The date of the newest status report": "La data del rapporto di stato più recente", + "New report": "Nuovo rapporto", + "Only the project owner writes status reports.": "Solo il proprietario del progetto scrive i rapporti di stato.", + "Latest report, {date}": "Ultimo rapporto, {date}", + "Aspect": "Aspetto", + "Note": "Nota", + "Report history": "Storico dei rapporti", + "Author": "Autore", + "No status reports yet": "Ancora nessun rapporto di stato", + "Write the first report": "Scrivi il primo rapporto", + "Choose a status for every aspect to save the report.": "Scegli uno stato per ogni aspetto per salvare il rapporto.", + "Suggested: on track.": "Suggerimento: in linea.", + "Suggested: at risk.": "Suggerimento: a rischio.", + "Suggested: off track.": "Suggerimento: fuori rotta.", + "1 task is past its due date.": "1 attività ha superato la scadenza.", + "{count} tasks are past their due date.": "{count} attività hanno superato la scadenza.", + "The end date has passed with 1 open task.": "La data di fine è passata con 1 attività aperta.", + "The end date has passed with {count} open tasks.": "La data di fine è passata con {count} attività aperte.", + "No open task is past its due date.": "Nessuna attività aperta ha superato la scadenza.", + "The highest open risk, \"{title}\", scores {score}.": "Il rischio aperto più alto, \"{title}\", ha punteggio {score}.", + "There are no open risks.": "Non ci sono rischi aperti.", + "Costs are at {percent}% of the budget.": "I costi sono al {percent}% del budget.", + "No suggestion: the project has no budget.": "Nessun suggerimento: il progetto non ha un budget.", + "No suggestion: no costs are recorded for this project yet.": "Nessun suggerimento: per questo progetto non sono ancora registrati costi.", + "The report was not saved. Only the project owner can write status reports.": "Il rapporto non è stato salvato. Solo il proprietario del progetto può scrivere rapporti di stato.", + "No report": "Nessun rapporto", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Un gruppo di progetti gestiti dalle stesse persone, come un reparto o un programma. I suoi responsabili leggono ogni progetto che contiene.", + "The name of the portfolio": "Il nome del portafoglio", + "What the portfolio holds and who runs it": "Cosa contiene il portafoglio e chi lo gestisce", + "A colour for the portfolio's section in project lists": "Un colore per la sezione del portafoglio negli elenchi dei progetti", + "Managers": "Responsabili", + "Nextcloud user UIDs of the people who run the portfolio": "ID utente Nextcloud delle persone che gestiscono il portafoglio", + "Order": "Ordine", + "Where the portfolio comes in project lists, lowest first": "La posizione del portafoglio negli elenchi dei progetti, dal più basso", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "La scala di rischio propria di questo portafoglio in JSON, nella stessa forma di quella dell'app. Vuoto significa la scala dell'app.", + "Portfolio readers": "Lettori del portafoglio", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID utente Nextcloud dei responsabili del portafoglio del progetto", + "The portfolio this project belongs to": "Il portafoglio a cui appartiene questo progetto", + "No portfolio": "Nessun portafoglio", + "All portfolios": "Tutti i portafogli", + "You read this project as a manager of its portfolio. Only its members change it.": "Leggi questo progetto come responsabile del suo portafoglio. Solo i membri lo modificano.", + "Portfolios": "Portafogli", + "Portfolio status": "Stato del portafoglio", + "No portfolios yet": "Ancora nessun portafoglio", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Un amministratore aggiunge i portafogli in Progetti, Portafogli. I progetti di un portafoglio sono elencati qui con il loro stato.", + "Roll-up": "Riepilogo", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} in linea, {atRisk} a rischio, {offTrack} fuori rotta, {noReport} senza rapporto", + "No project in this portfolio that you can read.": "Nessun progetto di questo portafoglio che puoi leggere.", + "Start": "Inizio", + "End": "Fine", + "Budget": "Budget", + "Last report": "Ultimo rapporto", + "Out of date": "Non aggiornato", + "Portfolio timeline": "Cronologia del portafoglio", + "Zoom": "Zoom", + "Could not load the timeline": "Impossibile caricare la cronologia", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Un amministratore aggiunge i portafogli in Progetti, Portafogli. I progetti di un portafoglio sono mostrati qui su un'unica cronologia.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Apri un progetto per vedere fasi e attività. La cronologia è di sola lettura.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Esclusi perché non puoi leggerli: {count} progetti", + "Week": "Settimana", + "Day": "Giorno", + "Month": "Mese", + "Please try again later.": "Riprova più tardi.", + "Status reports": "Rapporti di stato", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Dopo quanti giorni l'ultimo rapporto di stato di un progetto è segnato come non aggiornato nella panoramica del portafoglio", + "Reporting period (days)": "Periodo di rendicontazione (giorni)", + "The reporting period is a whole number of days from 1 to 365.": "Il periodo di rendicontazione è un numero intero di giorni da 1 a 365.", + "Reporting period saved": "Periodo di rendicontazione salvato", + "The reporting period was not saved. Please try again.": "Il periodo di rendicontazione non è stato salvato. Riprova.", + "Every project of a portfolio with its status per aspect, rolled up.": "Ogni progetto di un portafoglio con il suo stato per aspetto, riepilogato.", + "The projects of a portfolio on one timeline.": "I progetti di un portafoglio su un'unica cronologia.", + "Phases": "Fasi", + "Add phase": "Aggiungi fase", + "No phases yet": "Ancora nessuna fase", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Suddividi il progetto in fasi, come avvio, definizione e realizzazione. Una fase si chiude quando il suo documento di chiusura è caricato.", + "{hours} hours": "{hours} ore", + "Concluding document: {title}": "Documento di chiusura: {title}", + "Concluding document missing": "Documento di chiusura mancante", + "Move {title} up": "Sposta su {title}", + "Move {title} down": "Sposta giù {title}", + "Close phase": "Chiudi fase", + "Phase": "Fase", + "Files": "File", + "Notes": "Note", + "Audit trail": "Registro di controllo", + "Edit phase": "Modifica fase", + "Name": "Nome", + "Budget hours": "Ore a budget", + "Could not save the phase. Please try again.": "Impossibile salvare la fase. Riprova.", + "Close phase {title}": "Chiudi la fase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Una fase si chiude con il suo documento di chiusura: caricalo qui o scegli uno dei file della fase.", + "Concluding document": "Documento di chiusura", + "This phase has no files yet.": "Questa fase non ha ancora file.", + "Upload a document": "Carica un documento", + "The document was not uploaded. Please try again.": "Il documento non è stato caricato. Riprova.", + "Upload the concluding document before you close this phase.": "Carica il documento di chiusura prima di chiudere questa fase.", + "This phase cannot be closed from its current status.": "Questa fase non può essere chiusa dal suo stato attuale.", + "The phase was not closed. Please try again.": "La fase non è stata chiusa. Riprova.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "L'id del file di questa fase che la chiude. La fase può essere completata solo quando è indicato e il file è allegato.", + "Import from Microsoft Project": "Importa da Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Scegli un piano salvato da Microsoft Project in formato XML. Non viene importato nulla finché non confermi.", + "Plan file": "File del piano", + "What the import creates": "Cosa crea l'importazione", + "Tasks": "Attività", + "Sub-tasks": "Sottoattività", + "Milestones": "Traguardi", + "Links": "Collegamenti", + "Already imported, updated in place: {count}": "Già importati, aggiornati sul posto: {count}", + "What does not carry over": "Cosa non viene riportato", + "Tasks with resources, which are not imported: {count}": "Attività con risorse, che non vengono importate: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Attività oltre il livello 3, poste sotto la loro attività di livello 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Collegamenti diversi da fine-inizio, importati come collegamenti correlati: {count}", + "Link lags, which are dropped: {count}": "Ritardi dei collegamenti, che vengono eliminati: {count}", + "Links to a summary task, which are not imported: {count}": "Collegamenti a un'attività di riepilogo, che non vengono importati: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Collegamenti ad attività esterne a questo piano, che non vengono importati: {count}", + "No longer in the plan": "Non più nel piano", + "These stay in the project; remove them yourself if they are no longer needed.": "Restano nel progetto; rimuovili tu se non servono più.", + "Import": "Importa", + "Close": "Chiudi", + "The plan is imported: {created} created, {updated} updated.": "Il piano è importato: {created} creati, {updated} aggiornati.", + "Links that would close a loop were left out: {count}": "I collegamenti che chiuderebbero un ciclo sono stati omessi: {count}", + "The import stopped part-way. Run it again to finish it.": "L'importazione si è fermata a metà. Eseguila di nuovo per completarla.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Salva il piano in Microsoft Project con File, Salva con nome, formato XML, e importa quel file.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Questo file dichiara un DOCTYPE o delle entità, che non sono accettati.", + "The file is larger than 10 MB.": "Il file supera i 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Il piano ha più di 2.000 attività, più di quante ne accetti un'importazione.", + "This file is not a Microsoft Project plan in XML format.": "Questo file non è un piano Microsoft Project in formato XML.", + "Choose a file to import.": "Scegli un file da importare.", + "Only the project owner can import a plan.": "Solo il proprietario del progetto può importare un piano.", + "The plan could not be read. Please try again.": "Impossibile leggere il piano. Riprova.", + "Linked case: {title}": "Pratica collegata: {title}", + "Linked to a case": "Collegato a una pratica", + "Hand over to case": "Consegna alla pratica", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copia senza modifiche ogni file del progetto e delle sue attività, e un file che descrive il progetto, nella pratica collegata.", + "{date} by {user}": "{date} da {user}", + "Files copied: {count}": "File copiati: {count}", + "Files that failed: {names}": "File non riusciti: {names}", + "The handover failed. Please try again.": "La consegna non è riuscita. Riprova.", + "The linked case could not be found, or you cannot open it.": "La pratica collegata non è stata trovata, oppure non puoi aprirla.", + "Case handovers": "Consegne alla pratica", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Ogni consegna dei file e dei metadati del progetto alla sua pratica: quando, da chi, a quale pratica, ogni file copiato con il suo SHA-256 e i file non riusciti.", + "Finance": "Finanze", + "Add cost line": "Aggiungi riga di costo", + "Delivery terms": "Condizioni di consegna", + "Billing model": "Modello di fatturazione", + "Budget in euro": "Budget in euro", + "Budget in hours": "Budget in ore", + "Hourly rate in euro": "Tariffa oraria in euro", + "Planned start": "Inizio previsto", + "Planned end": "Fine prevista", + "Planned dates": "Date previste", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Nessun budget concordato", + "Hours": "Ore", + "Only the project owner and the portfolio managers see the amounts.": "Solo il proprietario del progetto e i responsabili del portafoglio vedono gli importi.", + "Budget against cost per category": "Budget rispetto ai costi per categoria", + "Labour (booked time)": "Manodopera (ore registrate)", + "No category": "Nessuna categoria", + "Hours are not available": "Le ore non sono disponibili", + "Not yet assigned to a category": "Non ancora assegnato a una categoria", + "Total": "Totale", + "{spent} spent, {remaining} remaining": "{spent} spesi, {remaining} rimanenti", + "Budget against cost per phase": "Budget rispetto ai costi per fase", + "No phase": "Nessuna fase", + "Cost lines": "Righe di costo", + "From the finance system": "Dal sistema finanziario", + "Edit cost line {amount}": "Modifica la riga di costo {amount}", + "No cost lines yet": "Ancora nessuna riga di costo", + "Commitments": "Impegni", + "Actual cost": "Costo effettivo", + "Forecast": "Previsione", + "Remaining": "Rimanente", + "Not planned yet": "Non ancora pianificato", + "{start} to {end}": "Da {start} a {end}", + "The terms were not saved. Please try again.": "Le condizioni non sono state salvate. Riprova.", + "Terms saved": "Condizioni salvate", + "Fixed price": "Prezzo fisso", + "Hourly": "A ore", + "Not billed": "Non fatturato", + "Commitment": "Impegno", + "Edit cost line": "Modifica riga di costo", + "Kind": "Tipo", + "Amount in euro": "Importo in euro", + "Remove": "Rimuovi", + "Could not save the cost line. Only the project owner changes the money of a project.": "Impossibile salvare la riga di costo. Solo il proprietario del progetto modifica il denaro di un progetto.", + "Could not remove the cost line. Please try again.": "Impossibile rimuovere la riga di costo. Riprova.", + "{amount} over budget": "{amount} oltre il budget", + "Cost categories": "Categorie di costo", + "The categories every project splits its budget and costs into, one per line": "Le categorie in cui ogni progetto suddivide budget e costi, una per riga", + "Categories": "Categorie", + "Give at least one category, each name once.": "Indica almeno una categoria, ogni nome una sola volta.", + "Cost categories saved": "Categorie di costo salvate", + "The cost categories were not saved. Please try again.": "Le categorie di costo non sono state salvate. Riprova.", + "Finance line": "Riga finanziaria", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Un importo di un progetto: un budget, un impegno, un costo effettivo o una previsione, in una categoria di costo ed eventualmente una fase. Inserito dal proprietario del progetto o dal sistema finanziario tramite l'app di integrazione.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Il progetto a cui appartiene questo importo. Vuoto per una riga del sistema finanziario il cui numero di progetto non corrisponde a nessun progetto.", + "The phase this amount belongs to, if any": "La fase a cui appartiene questo importo, se presente", + "The cost category, one of the categories the admin set up": "La categoria di costo, una di quelle impostate dall'amministratore", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Se l'importo è un budget, un impegno, un costo effettivo o una previsione", + "Amount": "Importo", + "The amount in the reporting currency (euro)": "L'importo nella valuta di rendicontazione (euro)", + "The date the amount was booked or is expected": "La data in cui l'importo è stato registrato o è previsto", + "What the amount is for": "A cosa serve l'importo", + "Whether a person entered the line or the finance system sent it": "Se una persona ha inserito la riga o l'ha inviata il sistema finanziario", + "Entered by hand": "Inserito a mano", + "Finance line id": "Id della riga finanziaria", + "The finance system's own id of this line. One imported line per id.": "L'id proprio di questa riga nel sistema finanziario. Una riga importata per id.", + "Project number": "Numero di progetto", + "The project number the finance system sent, matched against the project key": "Il numero di progetto inviato dal sistema finanziario, confrontato con la chiave del progetto", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Il portafoglio del progetto della riga, copiato dal progetto perché i totali del portafoglio richiedano un solo filtro", + "Finance readers": "Lettori finanziari", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID Nextcloud delle persone che possono vedere questo importo: il proprietario del progetto e i responsabili del suo portafoglio", + "Project owner": "Proprietario del progetto", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID Nextcloud del proprietario del progetto, che può modificare e rimuovere le righe manuali", + "How the client pays: not billed, a fixed price, or by the hour.": "Come paga il cliente: non fatturato, prezzo fisso o a ore.", + "Portfolio finance": "Finanze del portafoglio", + "You cannot see the money of any project in this portfolio": "Non puoi vedere il denaro di nessun progetto di questo portafoglio", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Il server ha restituito righe di costo di progetti fuori da questo portafoglio, quindi questi totali potrebbero essere errati.", + "Projects left out because you cannot see their money: {count}": "Progetti esclusi perché non puoi vederne il denaro: {count}", + "Unmatched finance lines": "Righe finanziarie non abbinate", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, impegni, costo effettivo e previsione sommati su un portafoglio.", + "Subprojects": "Sottoprogetti", + "{done} of {total}": "{done} di {total}", + "{done} of {total} tasks done, including subprojects": "{done} di {total} attività completate, sottoprogetti inclusi", + "Show the subprojects of {title}": "Mostra i sottoprogetti di {title}", + "Hide the subprojects of {title}": "Nascondi i sottoprogetti di {title}", + "Part of": "Parte di", + "No parent project": "Nessun progetto superiore", + "A project cannot sit under one of its own subprojects.": "Un progetto non può stare sotto uno dei propri sottoprogetti.", + "Projects nest three levels deep at most: programme, project and subproject.": "I progetti si annidano al massimo su tre livelli: programma, progetto e sottoprogetto.", + "Parent project": "Progetto superiore", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Il progetto sotto cui sta questo progetto, ad esempio un programma. I progetti si annidano al massimo su tre livelli.", + "Yes": "Sì", + "No": "No", + "{label} (required)": "{label} (obbligatorio)", + "{label} is required": "{label} è obbligatorio", + "Project field": "Campo di progetto", + "A field an admin adds to every project, such as a policy area or a contract value.": "Un campo che un amministratore aggiunge a ogni progetto, come un'area di intervento o un valore contrattuale.", + "Key": "Chiave", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Il nome fisso con cui il valore viene salvato, in lower camel case. Mantienilo quando i progetti lo usano.", + "Label": "Etichetta", + "The name people see next to the field": "Il nome che le persone vedono accanto al campo", + "What the field holds": "Cosa contiene il campo", + "Text": "Testo", + "Number": "Numero", + "Choice": "Scelta", + "Person": "Persona", + "Yes or no": "Sì o no", + "Options": "Opzioni", + "The choices of a choice field": "Le scelte di un campo a scelta", + "Required": "Obbligatorio", + "Whether a project must fill in the field": "Se un progetto deve compilare il campo", + "Where the field appears, lowest first": "Dove appare il campo, il più basso prima", + "Applies to": "Si applica a", + "What the field is added to": "A cosa viene aggiunto il campo", + "Custom fields": "Campi personalizzati", + "The values of the project fields an admin defined, keyed by the field's key.": "I valori dei campi di progetto definiti da un amministratore, per chiave del campo.", + "Project fields": "Campi di progetto", + "Related": "Correlate", + "Remove link": "Rimuovi il collegamento", + "Link type": "Tipo di collegamento", + "Relates to": "Correlata a", + "Duplicates": "Duplica", + "Project key": "Chiave del progetto", + "Every task number starts with it, such as VERG-42.": "Ogni numero di attività inizia con essa, ad esempio VERG-42.", + "This key is already used by another project.": "Questa chiave è già usata da un altro progetto.", + "Use 2 to 10 letters and digits, starting with a letter.": "Usa da 2 a 10 lettere e cifre, iniziando con una lettera.", + "The key cannot change once tasks carry it.": "La chiave non può cambiare una volta che le attività la portano.", + "Project saved. The existing tasks get their numbers in the background.": "Progetto salvato. Le attività esistenti ricevono il loro numero in background.", + "Next task number": "Numero della prossima attività", + "The number the next task of this project gets in its key. Only the system writes it.": "Il numero che la prossima attività di questo progetto riceve nella sua chiave. Solo il sistema lo scrive.", + "Restore {title}": "Ripristina {title}", + "Restore": "Ripristina", + "Project restored": "Progetto ripristinato", + "Could not restore the project": "Impossibile ripristinare il progetto", + "Bring this project back to the active list.": "Riporta questo progetto nell’elenco dei progetti attivi.", + "Restore project": "Ripristina progetto", + "Request reason": "Motivo della richiesta", + "Why the requester needs this project. Filled in when the project is requested.": "Perché il richiedente ha bisogno di questo progetto. Compilato alla richiesta.", + "Reviewed by": "Esaminato da", + "The user who approved or rejected the request.": "L’utente che ha approvato o respinto la richiesta.", + "Reviewed at": "Esaminato il", + "When the request was approved or rejected.": "Quando la richiesta è stata approvata o respinta.", + "Review note": "Nota di revisione", + "The reviewer's reason, shown to the requester when a request is not approved.": "Il motivo del revisore, mostrato al richiedente quando una richiesta non è approvata.", + "Members of these groups": "Membri di questi gruppi", + "Groups that may create projects": "Gruppi che possono creare progetti", + "The group {group} no longer exists. Save to remove it.": "Il gruppo {group} non esiste più. Salva per rimuoverlo.", + "Review project request": "Esamina la richiesta di progetto", + "Requested by": "Richiesto da", + "Why it is needed": "Perché serve", + "Desired start date": "Data di inizio desiderata", + "Why is it not approved?": "Perché non viene approvato?", + "Give a reason. The requester sees it.": "Indica un motivo. Il richiedente lo vedrà.", + "Approve": "Approva", + "Reject": "Respingi", + "Reject request": "Respingi la richiesta", + "The review was not saved. Try again.": "La revisione non è stata salvata. Riprova.", + "This project is waiting for review": "Questo progetto è in attesa di revisione", + "This request was not approved": "Questa richiesta non è stata approvata", + "Reason: {note}": "Motivo: {note}", + "Review request": "Esamina la richiesta", + "Request a project": "Richiedi un progetto", + "Step {step} of 2": "Passo {step} di 2", + "Why is this project needed?": "Perché serve questo progetto?", + "Give a reason. The reviewer reads it.": "Indica un motivo. Il revisore lo leggerà.", + "Back": "Indietro", + "Next": "Avanti", + "Send request": "Invia richiesta", + "The request was not sent. Try again.": "La richiesta non è stata inviata. Riprova.", + "Requested": "Richiesto", + "Not approved": "Non approvato", + "Your request was sent": "La tua richiesta è stata inviata", + "Let everyone else request a project": "Consenti a tutti gli altri di richiedere un progetto", + "Add a task": "Aggiungi un'attività", + "Delete task": "Elimina attività", + "Edit task": "Modifica attività", + "Write": "Scrivi", + "Preview": "Anteprima", + "Markdown works here: headings, lists and links.": "Qui funziona il Markdown: titoli, elenchi e link.", + "Could not save the task. Please try again.": "Impossibile salvare l'attività. Riprova.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Su \"{title}\" è stato registrato del tempo, quindi non può essere eliminata. Puoi annullarla: le registrazioni di tempo restano.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Eliminare \"{title}\"? Vengono rimossi anche i collegamenti ad altre attività. Questa azione non può essere annullata.", + "Keep task": "Mantieni attività", + "Cancel task": "Annulla attività", + "Only the reporter, the project owner or an admin can delete this task.": "Solo chi l'ha segnalata, il proprietario del progetto o un amministratore può eliminare questa attività.", + "Could not delete the task. Please try again.": "Impossibile eliminare l'attività. Riprova.", + "Could not cancel the task. Please try again.": "Impossibile annullare l'attività. Riprova.", + "Responsible": "Responsabile", + "Also working on this": "Ci lavorano anche", + "Labels": "Etichette", + "Could not change the priority. Please try again.": "Impossibile modificare la priorità. Riprova.", + "Other project members who work on this task alongside the person responsible.": "Altri membri del progetto che lavorano a questa attività insieme al responsabile.", + "Duplicate": "Duplica", + "Could not copy the task. Please try again.": "Impossibile copiare l'attività. Riprova.", + "Subtasks": "Sottoattività", + "{done} of {total} done": "{done} di {total} completate", + "Add a subtask": "Aggiungi una sottoattività", + "Checklist": "Checklist", + "Checklist item actions": "Azioni dell'elemento della checklist", + "Add a checklist item": "Aggiungi un elemento alla checklist", + "Subtasks: {estimate} estimated, {logged} logged": "Sottoattività: {estimate} stimate, {logged} registrate", + "Total estimate: {total}": "Stima totale: {total}", + "Part of {title}": "Parte di {title}", + "Checklist: {count} done": "Checklist: {count} completati", + "This task has subtasks: {count}.": "Questa attività ha sottoattività: {count}.", + "Keep subtasks as separate tasks": "Mantieni le sottoattività come attività separate", + "Delete subtasks too": "Elimina anche le sottoattività", + "Copy of {title}": "Copia di {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "L'attività è stata copiata, ma non tutte le sue sottoattività. Controlla la copia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Piccoli passi all'interno dell'attività. Ogni elemento ha un id, un testo e se è completato.", + "Open work per person and per project.": "Lavoro aperto per persona e per progetto.", + "View": "Vista", + "By person": "Per persona", + "By project": "Per progetto", + "Hours left": "Ore rimanenti", + "Tasks without an estimate": "Attività senza stima", + "Due in 14 days": "In scadenza entro 14 giorni", + "Shared": "Condivise", + "Unassigned": "Non assegnate", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Viene mostrato il lavoro nei progetti che puoi vedere. Le ore contano per la persona responsabile; le attività condivise sono contate senza ore.", + "No open work in these projects.": "Nessun lavoro aperto in questi progetti.", + "Open work": "Lavoro aperto", + "{count} open tasks": "{count} attività aperte", + "Create a project to see capacity here.": "Crea un progetto per vedere qui la capacità.", + "My tasks": "Le mie attività", + "Show all my tasks": "Mostra tutte le mie attività", + "No tasks assigned to you": "Nessuna attività assegnata a te", + "Browse projects": "Sfoglia i progetti", + "Later": "Più avanti", + "Due {date}": "Scadenza {date}", + "Could not change the status. Please try again.": "Impossibile cambiare lo stato. Riprova.", + "Completed today": "Completate oggi", + "My open tasks": "Le mie attività aperte", + "My overdue tasks": "Le mie attività in ritardo", + "My tasks in progress": "Le mie attività in corso", + "Pin to the top": "Fissa in alto", + "Unpin": "Sblocca", + "Pinned": "Fissato", + "Actions for {title}": "Azioni per {title}", + "Could not save your project order. Please try again.": "Impossibile salvare l'ordine dei tuoi progetti. Riprova.", + "No boards yet": "Ancora nessuna bacheca", + "Create a project to get a board.": "Crea un progetto per avere una bacheca.", + "Use the Projects page to create and manage your projects and tasks.": "Usa la pagina Progetti per creare e gestire i tuoi progetti e le tue attività.", + "Go to projects": "Vai ai progetti", + "You are not a member of any projects yet.": "Non sei ancora membro di alcun progetto.", + "Could not search for users. Please try again.": "Impossibile cercare utenti. Riprova.", + "Project creation is restricted to administrators.": "La creazione di progetti è riservata agli amministratori.", + "Only the project owner or an administrator can delete this project.": "Solo il proprietario del progetto o un amministratore può eliminare questo progetto.", + "No projects are available to you yet. Ask an administrator to create one.": "Non hai ancora progetti disponibili. Chiedi a un amministratore di crearne uno.", + "Due: {date}": "Scadenza: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Le attività con una data di inizio o di scadenza compaiono sulla cronologia. Aggiungi le date per vederle qui.", + "You do not have access to this project.": "Non hai accesso a questo progetto.", + "Zoom level": "Livello di zoom", + "Unscheduled": "Non pianificate", + "Start: {date}": "Inizio: {date}", + "Today": "Oggi", + "No scheduled tasks": "Nessuna attività pianificata", + "An unexpected error occurred.": "Si è verificato un errore imprevisto.", + "Column {number} name": "Nome della colonna {number}", + "Failed to save creation policy": "Impossibile salvare la regola di creazione", + "All authenticated users": "Tutti gli utenti autenticati", + "Control who may create new projects": "Stabilisci chi può creare nuovi progetti", + "Administrators only": "Solo amministratori", + "Project creation": "Creazione dei progetti", + "Allow project creation": "Consenti la creazione di progetti", + "Creation policy saved successfully": "Regola di creazione salvata", + "Initializing…": "Avvio in corso…", + "e.g. 2h 30m, 90m, 1.5h": "es. 2h 30m, 90m, 1.5h", + "Log time": "Registra tempo", + "Save estimate": "Salva stima", + "Logged: {logged}": "Registrato: {logged}", + "over by {amount}": "superato di {amount}", + "Time tracking": "Registrazione del tempo", + "Estimate": "Stima", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Inserisci una stima valida (es. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Inserisci una durata valida (es. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Impossibile salvare la registrazione di tempo. Riprova.", + "Edit time entry": "Modifica registrazione di tempo", + "Duration": "Durata", + "Date range": "Periodo", + "Last week": "Settimana scorsa", + "No time logged": "Nessun tempo registrato", + "Log time on a task to see it here.": "Registra tempo su un'attività per vederlo qui.", + "To date": "Fino alla data", + "This week": "Questa settimana", + "Total: {total}": "Totale: {total}", + "From date": "Dalla data", + "Custom range": "Periodo personalizzato", + "All time": "Tutto", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Impossibile eliminare un'attività, quindi potrebbero restare dei dati. Elimina di nuovo il progetto.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Impossibile eliminare una registrazione di tempo, quindi potrebbero restare dei dati. Elimina di nuovo il progetto.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Impossibile eliminare una colonna, quindi potrebbero restare dei dati. Elimina di nuovo il progetto.", + "Could not delete the project. Please try again.": "Impossibile eliminare il progetto. Riprova.", + "Notification settings": "Impostazioni delle notifiche", + "Configure when due-date reminders are sent": "Configura quando vengono inviati i promemoria di scadenza", + "Due-date reminder lead time (hours)": "Anticipo del promemoria di scadenza (ore)", + "Lead time must be between 1 and 336 hours": "L'anticipo deve essere tra 1 e 336 ore", + "Reminder lead time saved successfully": "Anticipo del promemoria salvato", + "Failed to save reminder lead time": "Impossibile salvare l'anticipo del promemoria", + "Notifications": "Notifiche", + "Notify me 1 day before a task's due date": "Avvisami 1 giorno prima della scadenza di un'attività", + "Draft": "Bozza", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Se la lezione è una bozza visibile solo al suo docente, si svolge o è annullata.", + "New release": "Nuova release", + "Roadmap chart. The same releases and epics are listed below.": "Grafico della roadmap. Le stesse release ed epic sono elencate qui sotto.", + "Nothing on the roadmap yet": "Ancora niente nella roadmap", + "Releases with a target date and epics with dated tasks appear here.": "Qui compaiono le release con una data obiettivo e gli epic con attività datate.", + "Releases": "Release", + "No releases yet": "Ancora nessuna release", + "Target date: {date}": "Data obiettivo: {date}", + "No target date": "Nessuna data obiettivo", + "Edit {name}": "Modifica {name}", + "Mark {name} as released": "Segna {name} come rilasciata", + "Mark as released": "Segna come rilasciata", + "Epics": "Epic", + "No epics yet. Open a task to make it an epic.": "Ancora nessun epic. Apri un'attività per renderla un epic.", + "Not scheduled yet": "Non ancora pianificato", + "Planned": "Pianificata", + "Released": "Rilasciata", + "Edit release": "Modifica release", + "Target date": "Data obiettivo", + "Could not save the release. Please try again.": "Impossibile salvare la release. Riprova.", + "Every task of this release is done or cancelled.": "Ogni attività di questa release è completata o annullata.", + "Not finished yet: {count}": "Non ancora finite: {count}", + "What happens to these tasks?": "Cosa succede a queste attività?", + "Move to {name}": "Sposta in {name}", + "Remove the release": "Rimuovi la release", + "Keep it on {name}": "Lasciale su {name}", + "Could not mark the release as released. Please try again.": "Impossibile segnare la release come rilasciata. Riprova.", + "Roadmap": "Roadmap", + "Tasks or roadmap": "Attività o roadmap", + "Release": "Release", + "Epic": "Epic", + "This task is an epic": "Questa attività è un epic", + "A named, dated delivery of a project that its tasks are planned against.": "Una consegna di un progetto con nome e data, su cui vengono pianificate le sue attività.", + "Name of the release": "Nome della release", + "The project this release belongs to": "Il progetto a cui appartiene questa release", + "What this release delivers": "Cosa consegna questa release", + "When work on the release starts": "Quando inizia il lavoro sulla release", + "The date the release is due": "La data in cui è prevista la release", + "Whether the release is planned, released or archived": "Se la release è pianificata, rilasciata o archiviata", + "Released on": "Rilasciata il", + "When the release was marked as released": "Quando la release è stata segnata come rilasciata", + "The release this task is planned for": "La release per cui è pianificata questa attività", + "Board view options": "Opzioni di visualizzazione della bacheca", + "Colour cards": "Colora le schede", + "No colour": "Nessun colore", + "By label": "Per etichetta", + "Swimlanes": "Corsie", + "No swimlanes": "Nessuna corsia", + "By assignee": "Per assegnatario", + "By epic": "Per epic", + "No assignee": "Non assegnata", + "No epic": "Nessuna epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Le schede restano nella riga della loro epic. Cambia l'epic nella pagina dell'attività.", + "Hand over to": "Passa a", + "Could not save your board view. It applies until you reload.": "Impossibile salvare la visualizzazione della bacheca. Vale fino al ricaricamento.", + "Timetable wish": "Desiderata d'orario", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Un desiderata che il generatore considera. Rispetta sempre uno vincolante, e uno flessibile quando può.", + "Whether the wish is about a teacher, a group, a room or one activity": "Se il desiderata riguarda un docente, un gruppo, un'aula o un'attività", + "Teacher": "Docente", + "Group": "Gruppo", + "Reference": "Riferimento", + "The user, group, room or activity the wish is about": "L'utente, il gruppo, l'aula o l'attività di cui si tratta", + "What the wish asks for": "Cosa chiede il desiderata", + "Not on these periods": "Non in queste ore", + "Preferably not on these periods": "Preferibilmente non in queste ore", + "At most a number of lessons a day": "Al massimo un numero di lezioni al giorno", + "No free periods between lessons": "Nessuna ora buca tra le lezioni", + "Always the same room": "Sempre la stessa aula", + "Periods": "Ore", + "The periods of the week the wish is about, such as wed-5": "Le ore della settimana interessate, per esempio wed-5", + "Limit": "Limite", + "The most lessons a day, for a wish of that kind": "Il massimo di lezioni al giorno, per un desiderata di quel tipo", + "Strength": "Forza", + "Whether the generator must keep the wish or should keep it": "Se il generatore deve o dovrebbe rispettare il desiderata", + "Hard": "Vincolante", + "Soft": "Flessibile", + "Weight": "Peso", + "How much a soft wish counts, from 1 to 3": "Quanto conta un desiderata flessibile, da 1 a 3", + "Why the wish exists": "Perché esiste il desiderata", + "Timetable scenario": "Scenario d'orario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Uno schema settimanale, creato dal generatore o preso dall'orario attuale. Conserva i dati di partenza e quanto rispetta i desiderata.", + "The name timetablers know the scenario by": "Il nome con cui chi fa l'orario conosce lo scenario", + "Whether the generator made it or it came from the current timetable": "Se l'ha creato il generatore o viene dall'orario attuale", + "Generated": "Generato", + "From the current timetable": "Dall'orario attuale", + "Week of": "Settimana del", + "The Monday of the first week of the window": "Il lunedì della prima settimana del periodo", + "Window start": "Inizio del periodo", + "The first day the week pattern applies to": "Il primo giorno a cui si applica lo schema settimanale", + "Window end": "Fine del periodo", + "The last day the week pattern applies to": "L'ultimo giorno a cui si applica lo schema settimanale", + "Waiting, generating, done, failed, or published as draft lessons": "In attesa, in generazione, pronto, fallito o pubblicato come lezioni bozza", + "Waiting": "In attesa", + "Generating": "In generazione", + "Failed": "Fallito", + "Published": "Pubblicato", + "Seed": "Seme", + "The number the generator starts from, so a run can be repeated": "Il numero da cui parte il generatore, per poter ripetere un'esecuzione", + "Input": "Dati di partenza", + "The periods, rooms, lessons and wishes the scenario was made from": "Le ore, aule, lezioni e desiderata da cui è nato lo scenario", + "Placements": "Collocazioni", + "Each lesson with the period and room it was given": "Ogni lezione con l'ora e l'aula assegnate", + "Unplaced lessons": "Lezioni non collocate", + "Lessons without a place, each with the hard wish that blocked it": "Lezioni senza posto, ognuna con il desiderata vincolante che l'ha bloccata", + "Broken wishes": "Desiderata non rispettati", + "The wishes this scenario breaks, with the lessons that break them": "I desiderata che questo scenario non rispetta, con le lezioni coinvolte", + "Measures": "Misure", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Lezioni collocate, desiderata non rispettati, ore buche, lezioni al giorno e uso delle aule", + "Reason": "Motivo", + "Why the run failed": "Perché l'esecuzione è fallita", + "Published at": "Pubblicato il", + "When the scenario was written out as draft lessons": "Quando lo scenario è stato scritto come lezioni bozza", + "Edit wish": "Modifica desiderio", + "New wish": "Nuovo desiderio", + "Hard: the generator always keeps it": "Vincolante: il generatore lo rispetta sempre", + "Soft: the generator keeps it where it can": "Flessibile: il generatore lo rispetta quando può", + "Weight (1 to 3)": "Peso (da 1 a 3)", + "Most lessons a day": "Massimo di lezioni al giorno", + "Period": "Ora", + "{day} period {number}": "{day} ora {number}", + "Teacher (user name)": "Docente (nome utente)", + "Activity (group:subject)": "Attività (gruppo:materia)", + "Say who or what the wish is about.": "Indica chi o cosa riguarda il desiderio.", + "Choose at least one period.": "Scegli almeno un'ora.", + "The limit is a whole number of 1 or more.": "Il limite è un numero intero pari o superiore a 1.", + "Timetable": "Orario", + "Wishes": "Desideri", + "Timetable wishes": "Desideri per l'orario", + "Generator run": "Esecuzione del generatore", + "Generator progress": "Avanzamento del generatore", + "The run failed: {reason}": "L'esecuzione non è riuscita: {reason}", + "{placed} of {lessons} lessons placed": "{placed} lezioni su {lessons} collocate", + "Generate again": "Genera di nuovo", + "Generate": "Genera", + "Every lesson has a place.": "Ogni lezione ha un posto.", + "Lesson": "Lezione", + "No free period and room": "Nessuna ora né aula libera", + "Broken soft wishes": "Desideri flessibili non rispettati", + "Every soft wish is kept.": "Ogni desiderio flessibile è rispettato.", + "Wish": "Desiderio", + "Lessons": "Lezioni", + "Generating: {percent}% of the time budget used": "Generazione: {percent}% del tempo usato", + "Waiting to start": "In attesa di avvio", + "Published as draft lessons": "Pubblicato come lezioni in bozza", + "Could not read the scenario.": "Impossibile leggere lo scenario.", + "Could not start the run.": "Impossibile avviare l'esecuzione.", + "Scenarios": "Scenari", + "Timetable scenarios": "Scenari di orario", + "Scenario": "Scenario", + "Take the current timetable": "Prendi l'orario attuale", + "Could not take the current timetable.": "Impossibile prendere l'orario attuale.", + "Broken hard wishes": "Desideri vincolanti non rispettati", + "Not on a period of the week grid": "Non su un'ora della griglia settimanale", + "Compare scenarios": "Confronta scenari", + "Scenarios to compare": "Scenari da confrontare", + "Choose two or three scenarios to compare them.": "Scegli due o tre scenari per confrontarli.", + "Measure": "Misura", + "Best": "Migliore", + "Lessons that differ": "Lezioni che differiscono", + "No lesson differs.": "Nessuna lezione differisce.", + "Not placed": "Non collocata", + "{period} in {room}": "{period} in {room}", + "Lessons placed": "Lezioni collocate", + "Lessons without a place": "Lezioni senza posto", + "Clashes": "Conflitti", + "Hard wishes broken": "Desideri vincolanti non rispettati", + "Soft wishes broken": "Desideri flessibili non rispettati", + "Soft wishes broken, weighted": "Desideri flessibili non rispettati, ponderati", + "Free periods between lessons, all teachers": "Ore buche, tutti i docenti", + "Most free periods of one teacher": "Più ore buche di un docente", + "Most lessons of one group on a day": "Più lezioni di un gruppo in un giorno", + "Room use": "Uso delle aule", + "Publish as draft lessons": "Pubblica come lezioni in bozza", + "Draft lessons written: {count}": "Lezioni in bozza scritte: {count}", + "Could not publish the scenario.": "Impossibile pubblicare lo scenario.", + "Rules": "Regole", + "Rules for {column}": "Regole per {column}", + "When a card enters this column": "Quando una scheda entra in questa colonna", + "Action": "Azione", + "Set the priority": "Imposta la priorità", + "Assign to": "Assegna a", + "Assign the person who moved the card": "Assegna alla persona che ha spostato la scheda", + "Remove the assignee": "Rimuovi l'assegnatario", + "Add a label": "Aggiungi un'etichetta", + "No longer a project member": "Non è più membro del progetto", + "This label no longer exists": "Questa etichetta non esiste più", + "Add rule": "Aggiungi regola", + "Remove rule": "Rimuovi regola", + "No rules yet. Add one to change a card when it enters this column.": "Ancora nessuna regola. Aggiungine una per modificare una scheda quando entra in questa colonna.", + "Could not save the rules. Please try again.": "Impossibile salvare le regole. Riprova.", + "1 rule runs when a card enters this column": "1 regola viene eseguita quando una scheda entra in questa colonna", + "{count} rules run when a card enters this column": "{count} regole vengono eseguite quando una scheda entra in questa colonna", + "Rules applied: {changes}": "Regole applicate: {changes}", + "assigned to {name}": "assegnata a {name}", + "assignee removed": "assegnatario rimosso", + "priority {priority}": "priorità {priority}", + "label {label}": "etichetta {label}", + "What happens to a card when it enters this column, applied in list order.": "Cosa succede a una scheda quando entra in questa colonna, nell'ordine dell'elenco.", + "Value": "Valore", + "What the rule does to the card.": "Cosa fa la regola alla scheda.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "La priorità, l'id utente o l'id etichetta usato dall'azione; vuoto per le azioni senza valore.", + "is not": "non è", + "{dimension} is not": "{dimension} non è", + "Saved filters": "Filtri salvati", + "No saved filters yet": "Nessun filtro salvato", + "Save filter": "Salva filtro", + "Rename \"{name}\"": "Rinomina \"{name}\"", + "Delete \"{name}\"": "Elimina \"{name}\"", + "Clear filters": "Cancella filtri", + "Showing {shown} of {total} tasks": "{shown} di {total} attività visibili", + "Me": "Io", + "No date": "Nessuna data", + "Rename saved filter": "Rinomina filtro salvato", + "Share with the project": "Condividi con il progetto", + "Give the filter a name": "Dai un nome al filtro", + "Could not save the filter. Please try again.": "Impossibile salvare il filtro. Riprova.", + "Some labels in \"{name}\" no longer exist and were left out.": "Alcune etichette in \"{name}\" non esistono più e sono state escluse.", + "Could not delete the filter. Please try again.": "Impossibile eliminare il filtro. Riprova.", + "Saved filter": "Filtro salvato", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Un filtro della bacheca con nome di un progetto, privato per chi lo ha salvato salvo condivisione con il progetto.", + "The project whose board the filter applies to": "Il progetto alla cui bacheca si applica il filtro", + "The name the filter is listed under": "Il nome con cui il filtro compare nell'elenco", + "Saved by": "Salvato da", + "Nextcloud user id of the person who saved the filter": "Id utente Nextcloud di chi ha salvato il filtro", + "Shared with the project": "Condiviso con il progetto", + "Whether every project member sees and applies the filter": "Se ogni membro del progetto vede e può applicare il filtro", + "Criteria": "Criteri", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Il filtro: assegnatario, etichetta, priorità e scadenza, ciascuno con è o non è e i suoi valori", + "Cross-project view": "Vista multiprogetto", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Una selezione salvata di progetti le cui attività sono mostrate insieme in corsie di stato, condivisa con le persone indicate.", + "Shared with": "Condivisa con", + "The name the view is listed under": "Il nome con cui la vista è elencata", + "Nextcloud user id of the person who saved the view": "Id utente Nextcloud della persona che ha salvato la vista", + "Nextcloud user ids of the people the view is shared with": "Id utente Nextcloud delle persone con cui la vista è condivisa", + "The projects whose tasks the view shows, at most twenty": "I progetti di cui la vista mostra le attività, al massimo venti", + "1 project in this view is hidden from you.": "1 progetto di questa vista ti è nascosto.", + "{count} projects in this view are hidden from you.": "{count} progetti di questa vista ti sono nascosti.", + "{project} has no column for {status}.": "{project} non ha una colonna per {status}.", + "This view does not exist or is not shared with you.": "Questa vista non esiste o non è condivisa con te.", + "\"{task}\" moved to {status}.": "\"{task}\" spostata in {status}.", + "Project: {title}": "Progetto: {title}", + "Cross-project views": "Viste multiprogetto", + "New view": "Nuova vista", + "Edit view": "Modifica vista", + "Delete view": "Elimina vista", + "Give the view a name": "Dai un nome alla vista", + "Pick at least one project": "Scegli almeno un progetto", + "A view shows at most {max} projects": "Una vista mostra al massimo {max} progetti", + "Could not save the view. Please try again.": "Impossibile salvare la vista. Riprova.", + "Could not delete the view. Please try again.": "Impossibile eliminare la vista. Riprova.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Eliminare \"{title}\"? I progetti e le loro attività restano come sono.", + "People see the tasks of the projects they are in, never more.": "Ognuno vede le attività dei progetti di cui fa parte, mai di più.", + "No views yet. A view shows the tasks of several of your projects together.": "Ancora nessuna vista. Una vista mostra insieme le attività di più tuoi progetti.", + "Projects in view: {count}": "Progetti nella vista: {count}", + "Notify me when a task is assigned to me": "Avvisami quando mi viene assegnata un'attività", + "Also send these to me by email": "Inviami questi avvisi anche per e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Aggiungi un indirizzo e-mail nelle impostazioni personali di Nextcloud per ricevere e-mail.", + "Code link": "Collegamento al codice", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Un commit, ramo, richiesta di merge o issue in una forge di codice che lavora su un'attività.", + "The task the link belongs to": "L'attività a cui appartiene il collegamento", + "The project of the task": "Il progetto dell'attività", + "Task key": "Chiave dell'attività", + "The task key the forge text named, such as VC-12": "La chiave dell'attività citata nel testo della forge, come VC-12", + "What the link points at": "A cosa punta il collegamento", + "Link": "Collegamento", + "The address of the item in the forge": "L'indirizzo dell'elemento nella forge", + "The commit message, branch name or merge request title": "Il messaggio di commit, il nome del ramo o il titolo della richiesta di merge", + "Repository": "Repository", + "The repository, such as acme/portal": "Il repository, come acme/portal", + "Forge id": "Id nella forge", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "L'id proprio dell'elemento nella forge, come github:acme/portal#42 o un hash di commit", + "State": "Stato", + "The state of a merge request or issue": "Lo stato di una richiesta di merge o di una issue", + "Who made the commit or opened the merge request": "Chi ha fatto il commit o aperto la richiesta di merge", + "When the commit was made or the merge request last changed": "Quando è stato fatto il commit o è cambiata l'ultima volta la richiesta di merge", + "Added by": "Aggiunto da", + "Whether a person added the link or the integration wrote it": "Se una persona ha aggiunto il collegamento o l'ha scritto l'integrazione", + "Nextcloud user UIDs of project members": "UID utente Nextcloud dei membri del progetto", + "Add link": "Aggiungi collegamento", + "Added by hand": "Aggiunto a mano", + "Branch": "Ramo", + "Code": "Codice", + "Commit": "Commit", + "From the integration": "Dall'integrazione", + "Link to a commit, branch or merge request": "Collegamento a un commit, ramo o richiesta di merge", + "Merge request": "Richiesta di merge", + "Merged": "Unita", + "No code linked yet. Name {key} in a commit message or paste a link.": "Nessun codice collegato. Cita {key} in un messaggio di commit o incolla un collegamento.", + "No code linked yet. Paste a link to a commit or merge request.": "Nessun codice collegato. Incolla un collegamento a un commit o a una richiesta di merge.", + "Paste a web address that starts with https://.": "Incolla un indirizzo web che inizia con https://.", + "Remove link {title}": "Rimuovi il collegamento {title}", + "The link could not be added.": "Non è stato possibile aggiungere il collegamento.", + "The link could not be removed.": "Non è stato possibile rimuovere il collegamento.", + "This link is already on the task.": "Questo collegamento è già nell'attività.", + "Code forges": "Forge di codice", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Collega i commit e le pull request di GitHub alle attività. Integriq riceve gli eventi; planninq non chiama mai GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Scarica la configurazione e importala in Integriq. Poi inserisci un segreto nella regola \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "In GitHub, aggiungi al repository un webhook con questo indirizzo e lo stesso segreto. Scegli il tipo di contenuto application/json e gli eventi push e pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Cita la chiave dell'attività, come VC-12, in un messaggio di commit, nel nome di un ramo o nel titolo di una pull request. Il collegamento appare allora su quell'attività.", + "Without Integriq, project members can still paste a link on the task page.": "Senza Integriq, i membri del progetto possono comunque incollare un collegamento nella pagina dell'attività.", + "Download the Integriq configuration": "Scarica la configurazione di Integriq", + "Calendar": "Calendario", + "Previous": "Precedente", + "Calendar view": "Vista del calendario", + "Starts:": "Inizia:", + "No tasks with a date in this month.": "Nessuna attività con una data in questo mese.", + "Week of {start} to {end}": "Settimana dal {start} al {end}", + "My calendar": "Il mio calendario", + "Show as list": "Mostra come elenco", + "Show as calendar": "Mostra come calendario", + "Open my calendar": "Apri il mio calendario", + "Nextcloud Tasks": "Attività di Nextcloud", + "Show my tasks in Nextcloud Tasks": "Mostra le mie attività in Attività di Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Le attività assegnate a te o condivise con te compaiono in un elenco \"Planninq\" in Attività e Calendario di Nextcloud. Le modifiche fatte lì vengono sostituite alla modifica successiva in Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Questo server non può scrivere in Attività di Nextcloud, quindi l'esportazione non è disponibile.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Gestito da Planninq. Le modifiche fatte qui vengono sostituite alla modifica successiva in Planninq.", + "Working days and holidays": "Giorni lavorativi e festivi", + "Dates set on the timeline skip the days that are not working days.": "Le date impostate sulla cronologia saltano i giorni non lavorativi.", + "Working weekdays": "Giorni lavorativi della settimana", + "Non-working days": "Giorni non lavorativi", + "No non-working days yet.": "Ancora nessun giorno non lavorativo.", + "Add day": "Aggiungi giorno", + "Year": "Anno", + "Add Dutch national holidays": "Aggiungi le festività nazionali olandesi", + "Save working days": "Salva i giorni lavorativi", + "Choose at least one working weekday.": "Scegli almeno un giorno lavorativo.", + "Working days saved.": "Giorni lavorativi salvati.", + "Could not save the working days.": "Impossibile salvare i giorni lavorativi.", + "New Year's Day": "Capodanno", + "Easter Sunday": "Domenica di Pasqua", + "Easter Monday": "Lunedì dell'Angelo", + "King's Day": "Festa del Re", + "Liberation Day": "Festa della Liberazione", + "Ascension Day": "Ascensione", + "Whit Sunday": "Domenica di Pentecoste", + "Whit Monday": "Lunedì di Pentecoste", + "Christmas Day": "Natale", + "Boxing Day": "Santo Stefano", + "Dates of {title}": "Date di {title}", + "The due date cannot be before the start date.": "La scadenza non può precedere la data di inizio.", + "{title}, from {start} to {end}": "{title}, dal {start} al {end}", + "The dates could not be saved.": "Impossibile salvare le date.", + "{title} now runs from {start} to {end}": "{title} ora va dal {start} al {end}", + "Auto-scheduling": "Pianificazione automatica", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Se attiva, spostare più avanti una scadenza sulla cronologia propone di spostare anche le attività che blocca.", + "Move blocked tasks along when a task slips": "Sposta le attività bloccate quando un'attività slitta", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Sulla cronologia, una scadenza successiva propone di spostare le attività bloccate. Contano solo i collegamenti \"blocca\" e le attività si spostano solo più avanti.", + "Move the tasks that wait for {title}?": "Spostare le attività che aspettano {title}?", + "These tasks wait for it and would start after its new due date:": "Queste attività la aspettano e inizierebbero dopo la nuova scadenza:", + "{count} tasks would move; the first {limit} are listed.": "{count} attività verrebbero spostate; sono elencate le prime {limit}.", + "Now": "Ora", + "After the move": "Dopo lo spostamento", + "Only this task": "Solo questa attività", + "Move all": "Sposta tutte", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Fermato a {title}: le sue date non sono state salvate. Le attività precedenti sono state spostate.", + "Cumulative flow": "Flusso cumulativo", + "Show as chart": "Mostra come grafico", + "Show as table": "Mostra come tabella", + "Tasks per column per day": "Attività per colonna al giorno", + "Tasks without recorded history in this period: {count}": "Attività senza cronologia registrata in questo periodo: {count}", + "Lead and cycle time": "Lead time e tempo di ciclo", + "No tasks were finished in this period.": "Nessuna attività è stata completata in questo periodo.", + "Finished tasks": "Attività completate", + "Cycle time, average": "Tempo di ciclo, media", + "Cycle time, 85th percentile": "Tempo di ciclo, 85° percentile", + "Lead time, average": "Lead time, media", + "Tasks whose finish time was estimated from their history: {count}": "Attività la cui ora di fine è stata stimata dalla cronologia: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Tempo di ciclo di ogni attività completata, con la media e l'85° percentile", + "Slowest tasks": "Attività più lente", + "cycle {cycle}, lead {lead}": "ciclo {cycle}, lead {lead}", + "{days} days": "{days} giorni", + "Could not load the flow of this project.": "Impossibile caricare il flusso di questo progetto.", + "Last {days} days": "Ultimi {days} giorni", + "Portfolio flow": "Flusso del portafoglio", + "An admin adds portfolios under Projects, Portfolios.": "Un amministratore aggiunge i portafogli in Progetti, Portafogli.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Progetti non mostrati, perché se ne mostrano al massimo 50 alla volta: {count}", + "Could not load the flow of this portfolio.": "Impossibile caricare il flusso di questo portafoglio.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flusso cumulativo e tempo di ciclo sui progetti di un portafoglio.", + "Edit report": "Modifica rapporto", + "Only tasks where": "Solo attività in cui", + "Group by": "Raggruppa per", + "Display": "Visualizzazione", + "Share with everyone who can read its projects": "Condividi con chiunque possa leggerne i progetti", + "The report could not be saved.": "Impossibile salvare il rapporto.", + "Number of tasks": "Numero di attività", + "Bar": "Barre", + "Donut": "Ciambella", + "Table": "Tabella", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} dei {total} progetti di questo rapporto non sono visibili per te", + "No tasks match this report.": "Nessuna attività corrisponde a questo rapporto.", + "None": "Nessuno", + "Could not load this report.": "Impossibile caricare questo rapporto.", + "Report": "Rapporto", + "Your reports": "I tuoi rapporti", + "My reports": "I miei rapporti", + "Shared reports": "Rapporti condivisi", + "You have not built a report yet.": "Non hai ancora creato un rapporto.", + "Nobody has shared a report with you yet.": "Nessuno ha ancora condiviso un rapporto con te.", + "Reports you built over tasks, and the ones shared with you.": "I rapporti che hai creato sulle attività, e quelli condivisi con te.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Una query salvata sulle attività: quali progetti, quali filtri, raggruppata per cosa, contata o sommata, e mostrata come tabella o grafico.", + "The name the report is listed under": "Il nome con cui il rapporto è elencato", + "What the report shows and who it is for": "Cosa mostra il rapporto e per chi è", + "Nextcloud user id of the person who saved the report": "ID utente Nextcloud di chi ha salvato il rapporto", + "Who can open the report": "Chi può aprire il rapporto", + "Only me": "Solo io", + "Everyone who can read its projects": "Chiunque possa leggerne i progetti", + "The projects the report covers, at most fifty": "I progetti coperti dal rapporto, al massimo cinquanta", + "Filters": "Filtri", + "Task fields and the value each must equal": "Campi dell'attività e il valore a cui ciascuno deve essere uguale", + "The task field the report groups on": "Il campo dell'attività su cui il rapporto raggruppa", + "Count the tasks, or add up a number on them": "Contare le attività, o sommare un numero su di esse", + "Sum": "Somma", + "Sum of": "Somma di", + "The number added up when the measure is a sum": "Il numero sommato quando la misura è una somma", + "Story points": "Story point", + "Estimated duration": "Durata stimata", + "How the report is shown": "Come viene mostrato il rapporto", + "Issue type": "Tipo di issue", + "Task fields and the value each must equal; empty when the report covers every task": "Campi dell'attività e il valore che ciascuno deve avere; vuoto se il rapporto copre tutte le attività", + "The status a task must have": "Lo stato che un'attività deve avere", + "The priority a task must have": "La priorità che un'attività deve avere", + "The user a task must be assigned to": "L'utente a cui un'attività deve essere assegnata", + "A label a task must carry": "Un'etichetta che un'attività deve avere", + "The board column a task must be in": "La colonna della bacheca in cui deve trovarsi un'attività", + "The issue type a task must have": "Il tipo di issue che un'attività deve avere", + "Manager groups": "Gruppi gestori", + "Member groups": "Gruppi membri", + "Viewer groups": "Gruppi lettori", + "Viewers": "Lettori", + "Owning group": "Gruppo proprietario", + "Nextcloud groups whose members manage the project": "Gruppi Nextcloud i cui membri gestiscono il progetto", + "Nextcloud groups whose members work on the project": "Gruppi Nextcloud i cui membri lavorano al progetto", + "Nextcloud groups whose members may read the project": "Gruppi Nextcloud i cui membri possono leggere il progetto", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utenti Nextcloud che gestiscono il progetto: impostazioni, membri e lavoro", + "Nextcloud user ids who may read the project and its work but not change it": "Utenti Nextcloud che possono leggere il progetto e il suo lavoro senza modificarlo", + "The Nextcloud group that owns the project with its creator, at most one": "Il gruppo Nextcloud che possiede il progetto con chi l'ha creato, al massimo uno", + "Nextcloud user ids who may read this through the project": "Utenti Nextcloud che possono leggere questo tramite il progetto", + "Nextcloud groups whose members may change this through the project": "Gruppi Nextcloud i cui membri possono modificare questo tramite il progetto", + "Nextcloud groups whose members may read this through the project": "Gruppi Nextcloud i cui membri possono leggere questo tramite il progetto", + "Search for a person or a group…": "Cerca una persona o un gruppo…", + "No one found. Your admin's sharing settings decide who you can find.": "Nessuno trovato. Le impostazioni di condivisione del tuo amministratore decidono chi puoi trovare.", + "Type at least two characters": "Digita almeno due caratteri", + "Everyone in this group": "Tutti in questo gruppo", + "Could not search for people. Please try again.": "Impossibile cercare persone. Riprova.", + "Could not remove the group": "Impossibile rimuovere il gruppo", + "Only the owner and managers change who is on this project.": "Solo il proprietario e i gestori cambiano chi fa parte di questo progetto.", + "Role of {name}": "Ruolo di {name}", + "Manager": "Gestore", + "Member": "Membro", + "Viewer": "Lettore", + "Could not change the role": "Impossibile cambiare il ruolo", + "Owned by group: {name}": "Di proprietà del gruppo: {name}", + "No group owns this project.": "Nessun gruppo possiede questo progetto.", + "Owned by group": "Di proprietà del gruppo", + "Search for a group…": "Cerca un gruppo…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nessun gruppo trovato. Le impostazioni di condivisione del tuo amministratore decidono quali gruppi puoi trovare.", + "No owning group": "Nessun gruppo proprietario", + "Could not search for groups. Please try again.": "Impossibile cercare i gruppi. Riprova.", + "Could not change the owning group": "Impossibile cambiare il gruppo proprietario", + "You can read this project. Only its members change it.": "Puoi leggere questo progetto. Solo i suoi membri lo modificano.", + "Course": "Corso", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il corso insegnato in questa lezione, ad esempio un corso opzionale, quando l'app di apprendimento della scuola lo conosce.", + "Online meeting link": "Link della lezione online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Dove gli studenti partecipano online a questa lezione. Il pulsante Partecipa appare solo con un link https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/it.json b/l10n/it.json index b28320f1..71e450e6 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -199,7 +199,1167 @@ "Could not delete label": "Impossibile eliminare l'etichetta", "Delete label \"{title}\"? It will be removed from {count} task.": "Eliminare l'etichetta \"{title}\"? Verrà rimossa da {count} attività.", "Label deleted and removed from {count} task": "Etichetta eliminata e rimossa da {count} attività", - "used by {count} task": "usata da {count} attività" + "used by {count} task": "usata da {count} attività", + "Active projects": "Progetti attivi", + "Archived projects": "Progetti archiviati", + "Boards": "Bacheche", + "My projects": "I miei progetti", + "Portfolio": "Portfolio", + "Project board": "Bacheca del progetto", + "Projects I am in": "Progetti a cui partecipo", + "Timeline": "Cronologia", + "Timesheet": "Foglio ore", + "Features & roadmap": "Funzionalità e roadmap", + "Flow": "Flusso", + "Flows": "Flussi", + "Reports": "Report", + "Pick a report to open it.": "Scegli un report per aprirlo.", + "In progress": "In corso", + "Date": "Data", + "Due": "Scadenza", + "Assignee": "Assegnato a", + "Who": "Chi", + "What": "Cosa", + "Minutes": "Minuti", + "Entries": "Voci", + "Most recent": "Più recenti", + "Per person": "Per persona", + "By status": "Per stato", + "By priority": "Per priorità", + "Task status": "Stato delle attività", + "Time spent": "Tempo impiegato", + "Capacity": "Capacità", + "Due soonest": "In scadenza per prime", + "Minutes logged": "Minuti registrati", + "Nothing is due": "Non c'è nulla in scadenza", + "Nothing logged yet": "Ancora nulla registrato", + "What is open, what is blocked, and what is overdue.": "Cosa è aperto, cosa è bloccato e cosa è in ritardo.", + "How allocation is spread across the people working on projects.": "Come il carico è distribuito tra chi lavora sui progetti.", + "Hours logged, and the projects they went to.": "Le ore registrate e i progetti a cui sono andate.", + "Billable": "Fatturabile", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Caricamento progetti", + "No projects for this client yet": "Nessun progetto per questo cliente", + "Open in Planninq": "Apri in Planninq", + "This project could not be found": "Questo progetto non è stato trovato", + "Untitled project": "Progetto senza titolo", + "and {count} more": "e altri {count}", + "Store": "Store", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installa registri, schemi e flussi pubblicati da altre organizzazioni.", + "Work Date": "Data di lavoro", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Azioni della colonna", + "Columns": "Colonne", + "Could not remove the column. Please try again.": "Impossibile rimuovere la colonna. Riprova.", + "Could not save the column. Please try again.": "Impossibile salvare la colonna. Riprova.", + "Done column": "Colonna completati", + "Edit column": "Modifica colonna", + "Keep the card's status": "Mantieni lo stato della scheda", + "Move its cards to": "Sposta le sue schede in", + "Move left": "Sposta a sinistra", + "Move right": "Sposta a destra", + "Status of cards moved here": "Stato delle schede spostate qui", + "The last done column cannot be removed.": "L'ultima colonna completati non può essere rimossa.", + "WIP limit": "Limite WIP", + "over limit": "oltre il limite", + "The status a card gets when it is moved into this column.": "Lo stato che una scheda riceve quando viene spostata in questa colonna.", + "All priorities": "Tutte le priorità", + "Could not create the task. Please try again.": "Impossibile creare l'attività. Riprova.", + "Created": "Creata", + "Move to backlog": "Nel backlog", + "Move to board": "Sulla bacheca", + "New task": "Nuova attività", + "Nothing in the backlog": "Niente nel backlog", + "Rank": "Rango", + "Sort by": "Ordina per", + "Sort by rank to reorder": "Ordina per rango per riordinare", + "Task actions": "Azioni dell'attività", + "All labels": "Tutte le etichette", + "Filter tasks by label": "Filtra le attività per etichetta", + "View timeline": "Visualizza cronologia", + "Board": "Bacheca", + "List": "Elenco", + "Column": "Colonna", + "Board or list": "Bacheca o elenco", + "Log": "Registro", + "Add entry": "Aggiungi voce", + "Show": "Mostra", + "No actions yet": "Ancora nessuna azione", + "Closed": "Chiuso", + "Entry actions": "Azioni della voce", + "Add action": "Aggiungi azione", + "by {author}": "di {author}", + "saved {time}": "salvato {time}", + "Attendees: {names}": "Partecipanti: {names}", + "Add the first entry": "Aggiungi la prima voce", + "Issues": "Problemi", + "Lessons learned": "Lezioni apprese", + "Meetings": "Riunioni", + "Decisions": "Decisioni", + "Actions": "Azioni", + "Issue": "Problema", + "Lesson learned": "Lezione appresa", + "Meeting": "Riunione", + "Decision": "Decisione", + "About this project": "Informazioni sul progetto", + "No description yet": "Ancora nessuna descrizione", + "Start date": "Data di inizio", + "Not set": "Non impostata", + "End date": "Data di fine", + "Progress": "Avanzamento", + "No tasks yet": "Ancora nessuna attività", + "Open the board": "Apri la bacheca", + "People": "Persone", + "Owner": "Proprietario", + "Latest log entries": "Ultime voci", + "Open the log": "Apri il registro", + "{done} of {total} tasks done": "{done} di {total} attività completate", + "Edit entry": "Modifica voce", + "Type": "Tipo", + "Attendees": "Partecipanti", + "Issue is closed": "Il problema è chiuso", + "Could not save the entry. Please try again.": "Impossibile salvare la voce. Riprova.", + "From: {title}": "Da: {title}", + "What needs to happen": "Cosa bisogna fare", + "Could not create the action. Please try again.": "Impossibile creare l'azione. Riprova.", + "The action was created but could not be linked to the entry.": "L'azione è stata creata ma non è stato possibile collegarla alla voce.", + "Project pages": "Pagine del progetto", + "Overview": "Panoramica", + "Risks": "Rischi", + "Log entry": "Voce di registro", + "A short name for the entry": "Un nome breve per la voce", + "Project": "Progetto", + "The project this entry belongs to": "Il progetto a cui appartiene questa voce", + "What kind of entry this is": "Che tipo di voce è", + "When it happened": "Quando è successo", + "What happened, in Markdown": "Cosa è successo, in Markdown", + "Whether an issue is still open": "Se un problema è ancora aperto", + "The people at a meeting": "Le persone presenti a una riunione", + "Tasks that came out of this entry": "Attività nate da questa voce", + "Add risk": "Aggiungi rischio", + "Risk": "Rischio", + "Score": "Punteggio", + "Response": "Risposta", + "Review date": "Data di revisione", + "no longer on the project": "non fa più parte del progetto", + "Edit {title}": "Modifica {title}", + "No risks recorded yet": "Ancora nessun rischio registrato", + "Add the first risk": "Aggiungi il primo rischio", + "Medium": "Medio", + "Mitigating": "In mitigazione", + "Occurred": "Verificato", + "Avoid": "Evitare", + "Reduce": "Ridurre", + "Transfer": "Trasferire", + "Accept": "Accettare", + "Highest open risks": "Rischi aperti più alti", + "No open risks": "Nessun rischio aperto", + "Open the risk register": "Apri il registro dei rischi", + "Edit risk": "Modifica rischio", + "What could go wrong": "Cosa potrebbe andare storto", + "Likelihood": "Probabilità", + "Impact": "Impatto", + "Score {score}": "Punteggio {score}", + "Countermeasures": "Contromisure", + "Could not save the risk. Please try again.": "Impossibile salvare il rischio. Riprova.", + "Risks by likelihood and impact": "Rischi per probabilità e impatto", + "Risk scale": "Scala di rischio", + "The levels every project scores its risks on, and where low turns into medium and high": "I livelli su cui ogni progetto valuta i propri rischi, e dove basso diventa medio e alto", + "Number of levels": "Numero di livelli", + "Likelihood labels": "Etichette di probabilità", + "Impact labels": "Etichette di impatto", + "Level {level}": "Livello {level}", + "Medium from score": "Medio dal punteggio", + "High from score": "Alto dal punteggio", + "Risk scale saved": "Scala di rischio salvata", + "1 risk uses level {level}. Change it first.": "1 rischio usa il livello {level}. Modificalo prima.", + "{count} risks use level {level}. Change them first.": "{count} rischi usano il livello {level}. Modificali prima.", + "Every level needs a label, and high must start above medium.": "Ogni livello ha bisogno di un'etichetta, e alto deve iniziare sopra medio.", + "The project this risk belongs to": "Il progetto a cui appartiene questo rischio", + "The cause and the effect, in Markdown": "La causa e l'effetto, in Markdown", + "Category": "Categoria", + "A free grouping, such as planning, budget or supplier": "Un raggruppamento libero, come pianificazione, budget o fornitore", + "How likely it is, on the admin's risk scale": "Quanto è probabile, sulla scala di rischio dell'amministratore", + "How hard it would hit, on the admin's risk scale": "Quanto colpirebbe, sulla scala di rischio dell'amministratore", + "Likelihood times impact, calculated by the server": "Probabilità per impatto, calcolata dal server", + "Where the risk stands": "A che punto è il rischio", + "The person who watches this risk": "La persona che tiene d'occhio questo rischio", + "How the project answers the risk": "Come il progetto risponde al rischio", + "What is done to prevent it or soften it, in Markdown": "Cosa si fa per prevenirlo o attenuarlo, in Markdown", + "When to look at this risk again": "Quando riesaminare questo rischio", + "Very low": "Molto basso", + "Very high": "Molto alto", + "All projects": "Tutti i progetti", + "Project status report": "Rapporto di stato del progetto", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Un rapporto datato su come sta un progetto per denaro, organizzazione, tempo, informazione, qualità e rischio (gli aspetti GROTIK), ciascuno con una nota.", + "The project this report is about": "Il progetto di cui tratta questo rapporto", + "Report date": "Data del rapporto", + "The day the report describes": "Il giorno descritto dal rapporto", + "Money": "Denaro", + "How the project stands on this aspect": "Come sta il progetto su questo aspetto", + "On track": "In linea", + "At risk": "A rischio", + "Off track": "Fuori rotta", + "Money note": "Nota sul denaro", + "A short explanation of this status": "Una breve spiegazione di questo stato", + "Organisation": "Organizzazione", + "Organisation note": "Nota sull'organizzazione", + "Time": "Tempo", + "Time note": "Nota sul tempo", + "Information": "Informazione", + "Information note": "Nota sull'informazione", + "Quality": "Qualità", + "Quality note": "Nota sulla qualità", + "Risk note": "Nota sul rischio", + "Overall": "Complessivo", + "The worst of the six statuses, calculated by the server": "Il peggiore dei sei stati, calcolato dal server", + "Health: money": "Salute: denaro", + "Copied from the newest status report": "Copiato dal rapporto di stato più recente", + "Health: organisation": "Salute: organizzazione", + "Health: time": "Salute: tempo", + "Health: information": "Salute: informazione", + "Health: quality": "Salute: qualità", + "Health: risk": "Salute: rischio", + "Health: overall": "Salute: complessivo", + "Health: report date": "Salute: data del rapporto", + "The date of the newest status report": "La data del rapporto di stato più recente", + "New report": "Nuovo rapporto", + "Only the project owner writes status reports.": "Solo il proprietario del progetto scrive i rapporti di stato.", + "Latest report, {date}": "Ultimo rapporto, {date}", + "Aspect": "Aspetto", + "Note": "Nota", + "Report history": "Storico dei rapporti", + "Author": "Autore", + "No status reports yet": "Ancora nessun rapporto di stato", + "Write the first report": "Scrivi il primo rapporto", + "Choose a status for every aspect to save the report.": "Scegli uno stato per ogni aspetto per salvare il rapporto.", + "Suggested: on track.": "Suggerimento: in linea.", + "Suggested: at risk.": "Suggerimento: a rischio.", + "Suggested: off track.": "Suggerimento: fuori rotta.", + "1 task is past its due date.": "1 attività ha superato la scadenza.", + "{count} tasks are past their due date.": "{count} attività hanno superato la scadenza.", + "The end date has passed with 1 open task.": "La data di fine è passata con 1 attività aperta.", + "The end date has passed with {count} open tasks.": "La data di fine è passata con {count} attività aperte.", + "No open task is past its due date.": "Nessuna attività aperta ha superato la scadenza.", + "The highest open risk, \"{title}\", scores {score}.": "Il rischio aperto più alto, \"{title}\", ha punteggio {score}.", + "There are no open risks.": "Non ci sono rischi aperti.", + "Costs are at {percent}% of the budget.": "I costi sono al {percent}% del budget.", + "No suggestion: the project has no budget.": "Nessun suggerimento: il progetto non ha un budget.", + "No suggestion: no costs are recorded for this project yet.": "Nessun suggerimento: per questo progetto non sono ancora registrati costi.", + "The report was not saved. Only the project owner can write status reports.": "Il rapporto non è stato salvato. Solo il proprietario del progetto può scrivere rapporti di stato.", + "No report": "Nessun rapporto", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Un gruppo di progetti gestiti dalle stesse persone, come un reparto o un programma. I suoi responsabili leggono ogni progetto che contiene.", + "The name of the portfolio": "Il nome del portafoglio", + "What the portfolio holds and who runs it": "Cosa contiene il portafoglio e chi lo gestisce", + "A colour for the portfolio's section in project lists": "Un colore per la sezione del portafoglio negli elenchi dei progetti", + "Managers": "Responsabili", + "Nextcloud user UIDs of the people who run the portfolio": "ID utente Nextcloud delle persone che gestiscono il portafoglio", + "Order": "Ordine", + "Where the portfolio comes in project lists, lowest first": "La posizione del portafoglio negli elenchi dei progetti, dal più basso", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "La scala di rischio propria di questo portafoglio in JSON, nella stessa forma di quella dell'app. Vuoto significa la scala dell'app.", + "Portfolio readers": "Lettori del portafoglio", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID utente Nextcloud dei responsabili del portafoglio del progetto", + "The portfolio this project belongs to": "Il portafoglio a cui appartiene questo progetto", + "No portfolio": "Nessun portafoglio", + "All portfolios": "Tutti i portafogli", + "You read this project as a manager of its portfolio. Only its members change it.": "Leggi questo progetto come responsabile del suo portafoglio. Solo i membri lo modificano.", + "Portfolios": "Portafogli", + "Portfolio status": "Stato del portafoglio", + "No portfolios yet": "Ancora nessun portafoglio", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Un amministratore aggiunge i portafogli in Progetti, Portafogli. I progetti di un portafoglio sono elencati qui con il loro stato.", + "Roll-up": "Riepilogo", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} in linea, {atRisk} a rischio, {offTrack} fuori rotta, {noReport} senza rapporto", + "No project in this portfolio that you can read.": "Nessun progetto di questo portafoglio che puoi leggere.", + "Start": "Inizio", + "End": "Fine", + "Budget": "Budget", + "Last report": "Ultimo rapporto", + "Out of date": "Non aggiornato", + "Portfolio timeline": "Cronologia del portafoglio", + "Zoom": "Zoom", + "Could not load the timeline": "Impossibile caricare la cronologia", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Un amministratore aggiunge i portafogli in Progetti, Portafogli. I progetti di un portafoglio sono mostrati qui su un'unica cronologia.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Apri un progetto per vedere fasi e attività. La cronologia è di sola lettura.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Esclusi perché non puoi leggerli: {count} progetti", + "Week": "Settimana", + "Day": "Giorno", + "Month": "Mese", + "Please try again later.": "Riprova più tardi.", + "Status reports": "Rapporti di stato", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Dopo quanti giorni l'ultimo rapporto di stato di un progetto è segnato come non aggiornato nella panoramica del portafoglio", + "Reporting period (days)": "Periodo di rendicontazione (giorni)", + "The reporting period is a whole number of days from 1 to 365.": "Il periodo di rendicontazione è un numero intero di giorni da 1 a 365.", + "Reporting period saved": "Periodo di rendicontazione salvato", + "The reporting period was not saved. Please try again.": "Il periodo di rendicontazione non è stato salvato. Riprova.", + "Every project of a portfolio with its status per aspect, rolled up.": "Ogni progetto di un portafoglio con il suo stato per aspetto, riepilogato.", + "The projects of a portfolio on one timeline.": "I progetti di un portafoglio su un'unica cronologia.", + "Phases": "Fasi", + "Add phase": "Aggiungi fase", + "No phases yet": "Ancora nessuna fase", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Suddividi il progetto in fasi, come avvio, definizione e realizzazione. Una fase si chiude quando il suo documento di chiusura è caricato.", + "{hours} hours": "{hours} ore", + "Concluding document: {title}": "Documento di chiusura: {title}", + "Concluding document missing": "Documento di chiusura mancante", + "Move {title} up": "Sposta su {title}", + "Move {title} down": "Sposta giù {title}", + "Close phase": "Chiudi fase", + "Phase": "Fase", + "Files": "File", + "Notes": "Note", + "Audit trail": "Registro di controllo", + "Edit phase": "Modifica fase", + "Name": "Nome", + "Budget hours": "Ore a budget", + "Could not save the phase. Please try again.": "Impossibile salvare la fase. Riprova.", + "Close phase {title}": "Chiudi la fase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Una fase si chiude con il suo documento di chiusura: caricalo qui o scegli uno dei file della fase.", + "Concluding document": "Documento di chiusura", + "This phase has no files yet.": "Questa fase non ha ancora file.", + "Upload a document": "Carica un documento", + "The document was not uploaded. Please try again.": "Il documento non è stato caricato. Riprova.", + "Upload the concluding document before you close this phase.": "Carica il documento di chiusura prima di chiudere questa fase.", + "This phase cannot be closed from its current status.": "Questa fase non può essere chiusa dal suo stato attuale.", + "The phase was not closed. Please try again.": "La fase non è stata chiusa. Riprova.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "L'id del file di questa fase che la chiude. La fase può essere completata solo quando è indicato e il file è allegato.", + "Import from Microsoft Project": "Importa da Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Scegli un piano salvato da Microsoft Project in formato XML. Non viene importato nulla finché non confermi.", + "Plan file": "File del piano", + "What the import creates": "Cosa crea l'importazione", + "Tasks": "Attività", + "Sub-tasks": "Sottoattività", + "Milestones": "Traguardi", + "Links": "Collegamenti", + "Already imported, updated in place: {count}": "Già importati, aggiornati sul posto: {count}", + "What does not carry over": "Cosa non viene riportato", + "Tasks with resources, which are not imported: {count}": "Attività con risorse, che non vengono importate: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Attività oltre il livello 3, poste sotto la loro attività di livello 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Collegamenti diversi da fine-inizio, importati come collegamenti correlati: {count}", + "Link lags, which are dropped: {count}": "Ritardi dei collegamenti, che vengono eliminati: {count}", + "Links to a summary task, which are not imported: {count}": "Collegamenti a un'attività di riepilogo, che non vengono importati: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Collegamenti ad attività esterne a questo piano, che non vengono importati: {count}", + "No longer in the plan": "Non più nel piano", + "These stay in the project; remove them yourself if they are no longer needed.": "Restano nel progetto; rimuovili tu se non servono più.", + "Import": "Importa", + "Close": "Chiudi", + "The plan is imported: {created} created, {updated} updated.": "Il piano è importato: {created} creati, {updated} aggiornati.", + "Links that would close a loop were left out: {count}": "I collegamenti che chiuderebbero un ciclo sono stati omessi: {count}", + "The import stopped part-way. Run it again to finish it.": "L'importazione si è fermata a metà. Eseguila di nuovo per completarla.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Salva il piano in Microsoft Project con File, Salva con nome, formato XML, e importa quel file.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Questo file dichiara un DOCTYPE o delle entità, che non sono accettati.", + "The file is larger than 10 MB.": "Il file supera i 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Il piano ha più di 2.000 attività, più di quante ne accetti un'importazione.", + "This file is not a Microsoft Project plan in XML format.": "Questo file non è un piano Microsoft Project in formato XML.", + "Choose a file to import.": "Scegli un file da importare.", + "Only the project owner can import a plan.": "Solo il proprietario del progetto può importare un piano.", + "The plan could not be read. Please try again.": "Impossibile leggere il piano. Riprova.", + "Linked case: {title}": "Pratica collegata: {title}", + "Linked to a case": "Collegato a una pratica", + "Hand over to case": "Consegna alla pratica", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copia senza modifiche ogni file del progetto e delle sue attività, e un file che descrive il progetto, nella pratica collegata.", + "{date} by {user}": "{date} da {user}", + "Files copied: {count}": "File copiati: {count}", + "Files that failed: {names}": "File non riusciti: {names}", + "The handover failed. Please try again.": "La consegna non è riuscita. Riprova.", + "The linked case could not be found, or you cannot open it.": "La pratica collegata non è stata trovata, oppure non puoi aprirla.", + "Case handovers": "Consegne alla pratica", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Ogni consegna dei file e dei metadati del progetto alla sua pratica: quando, da chi, a quale pratica, ogni file copiato con il suo SHA-256 e i file non riusciti.", + "Finance": "Finanze", + "Add cost line": "Aggiungi riga di costo", + "Delivery terms": "Condizioni di consegna", + "Billing model": "Modello di fatturazione", + "Budget in euro": "Budget in euro", + "Budget in hours": "Budget in ore", + "Hourly rate in euro": "Tariffa oraria in euro", + "Planned start": "Inizio previsto", + "Planned end": "Fine prevista", + "Planned dates": "Date previste", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Nessun budget concordato", + "Hours": "Ore", + "Only the project owner and the portfolio managers see the amounts.": "Solo il proprietario del progetto e i responsabili del portafoglio vedono gli importi.", + "Budget against cost per category": "Budget rispetto ai costi per categoria", + "Labour (booked time)": "Manodopera (ore registrate)", + "No category": "Nessuna categoria", + "Hours are not available": "Le ore non sono disponibili", + "Not yet assigned to a category": "Non ancora assegnato a una categoria", + "Total": "Totale", + "{spent} spent, {remaining} remaining": "{spent} spesi, {remaining} rimanenti", + "Budget against cost per phase": "Budget rispetto ai costi per fase", + "No phase": "Nessuna fase", + "Cost lines": "Righe di costo", + "From the finance system": "Dal sistema finanziario", + "Edit cost line {amount}": "Modifica la riga di costo {amount}", + "No cost lines yet": "Ancora nessuna riga di costo", + "Commitments": "Impegni", + "Actual cost": "Costo effettivo", + "Forecast": "Previsione", + "Remaining": "Rimanente", + "Not planned yet": "Non ancora pianificato", + "{start} to {end}": "Da {start} a {end}", + "The terms were not saved. Please try again.": "Le condizioni non sono state salvate. Riprova.", + "Terms saved": "Condizioni salvate", + "Fixed price": "Prezzo fisso", + "Hourly": "A ore", + "Not billed": "Non fatturato", + "Commitment": "Impegno", + "Edit cost line": "Modifica riga di costo", + "Kind": "Tipo", + "Amount in euro": "Importo in euro", + "Remove": "Rimuovi", + "Could not save the cost line. Only the project owner changes the money of a project.": "Impossibile salvare la riga di costo. Solo il proprietario del progetto modifica il denaro di un progetto.", + "Could not remove the cost line. Please try again.": "Impossibile rimuovere la riga di costo. Riprova.", + "{amount} over budget": "{amount} oltre il budget", + "Cost categories": "Categorie di costo", + "The categories every project splits its budget and costs into, one per line": "Le categorie in cui ogni progetto suddivide budget e costi, una per riga", + "Categories": "Categorie", + "Give at least one category, each name once.": "Indica almeno una categoria, ogni nome una sola volta.", + "Cost categories saved": "Categorie di costo salvate", + "The cost categories were not saved. Please try again.": "Le categorie di costo non sono state salvate. Riprova.", + "Finance line": "Riga finanziaria", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Un importo di un progetto: un budget, un impegno, un costo effettivo o una previsione, in una categoria di costo ed eventualmente una fase. Inserito dal proprietario del progetto o dal sistema finanziario tramite l'app di integrazione.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Il progetto a cui appartiene questo importo. Vuoto per una riga del sistema finanziario il cui numero di progetto non corrisponde a nessun progetto.", + "The phase this amount belongs to, if any": "La fase a cui appartiene questo importo, se presente", + "The cost category, one of the categories the admin set up": "La categoria di costo, una di quelle impostate dall'amministratore", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Se l'importo è un budget, un impegno, un costo effettivo o una previsione", + "Amount": "Importo", + "The amount in the reporting currency (euro)": "L'importo nella valuta di rendicontazione (euro)", + "The date the amount was booked or is expected": "La data in cui l'importo è stato registrato o è previsto", + "What the amount is for": "A cosa serve l'importo", + "Whether a person entered the line or the finance system sent it": "Se una persona ha inserito la riga o l'ha inviata il sistema finanziario", + "Entered by hand": "Inserito a mano", + "Finance line id": "Id della riga finanziaria", + "The finance system's own id of this line. One imported line per id.": "L'id proprio di questa riga nel sistema finanziario. Una riga importata per id.", + "Project number": "Numero di progetto", + "The project number the finance system sent, matched against the project key": "Il numero di progetto inviato dal sistema finanziario, confrontato con la chiave del progetto", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Il portafoglio del progetto della riga, copiato dal progetto perché i totali del portafoglio richiedano un solo filtro", + "Finance readers": "Lettori finanziari", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID Nextcloud delle persone che possono vedere questo importo: il proprietario del progetto e i responsabili del suo portafoglio", + "Project owner": "Proprietario del progetto", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID Nextcloud del proprietario del progetto, che può modificare e rimuovere le righe manuali", + "How the client pays: not billed, a fixed price, or by the hour.": "Come paga il cliente: non fatturato, prezzo fisso o a ore.", + "Portfolio finance": "Finanze del portafoglio", + "You cannot see the money of any project in this portfolio": "Non puoi vedere il denaro di nessun progetto di questo portafoglio", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Il server ha restituito righe di costo di progetti fuori da questo portafoglio, quindi questi totali potrebbero essere errati.", + "Projects left out because you cannot see their money: {count}": "Progetti esclusi perché non puoi vederne il denaro: {count}", + "Unmatched finance lines": "Righe finanziarie non abbinate", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, impegni, costo effettivo e previsione sommati su un portafoglio.", + "Subprojects": "Sottoprogetti", + "{done} of {total}": "{done} di {total}", + "{done} of {total} tasks done, including subprojects": "{done} di {total} attività completate, sottoprogetti inclusi", + "Show the subprojects of {title}": "Mostra i sottoprogetti di {title}", + "Hide the subprojects of {title}": "Nascondi i sottoprogetti di {title}", + "Part of": "Parte di", + "No parent project": "Nessun progetto superiore", + "A project cannot sit under one of its own subprojects.": "Un progetto non può stare sotto uno dei propri sottoprogetti.", + "Projects nest three levels deep at most: programme, project and subproject.": "I progetti si annidano al massimo su tre livelli: programma, progetto e sottoprogetto.", + "Parent project": "Progetto superiore", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Il progetto sotto cui sta questo progetto, ad esempio un programma. I progetti si annidano al massimo su tre livelli.", + "Yes": "Sì", + "No": "No", + "{label} (required)": "{label} (obbligatorio)", + "{label} is required": "{label} è obbligatorio", + "Project field": "Campo di progetto", + "A field an admin adds to every project, such as a policy area or a contract value.": "Un campo che un amministratore aggiunge a ogni progetto, come un'area di intervento o un valore contrattuale.", + "Key": "Chiave", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Il nome fisso con cui il valore viene salvato, in lower camel case. Mantienilo quando i progetti lo usano.", + "Label": "Etichetta", + "The name people see next to the field": "Il nome che le persone vedono accanto al campo", + "What the field holds": "Cosa contiene il campo", + "Text": "Testo", + "Number": "Numero", + "Choice": "Scelta", + "Person": "Persona", + "Yes or no": "Sì o no", + "Options": "Opzioni", + "The choices of a choice field": "Le scelte di un campo a scelta", + "Required": "Obbligatorio", + "Whether a project must fill in the field": "Se un progetto deve compilare il campo", + "Where the field appears, lowest first": "Dove appare il campo, il più basso prima", + "Applies to": "Si applica a", + "What the field is added to": "A cosa viene aggiunto il campo", + "Custom fields": "Campi personalizzati", + "The values of the project fields an admin defined, keyed by the field's key.": "I valori dei campi di progetto definiti da un amministratore, per chiave del campo.", + "Project fields": "Campi di progetto", + "Related": "Correlate", + "Remove link": "Rimuovi il collegamento", + "Link type": "Tipo di collegamento", + "Relates to": "Correlata a", + "Duplicates": "Duplica", + "Project key": "Chiave del progetto", + "Every task number starts with it, such as VERG-42.": "Ogni numero di attività inizia con essa, ad esempio VERG-42.", + "This key is already used by another project.": "Questa chiave è già usata da un altro progetto.", + "Use 2 to 10 letters and digits, starting with a letter.": "Usa da 2 a 10 lettere e cifre, iniziando con una lettera.", + "The key cannot change once tasks carry it.": "La chiave non può cambiare una volta che le attività la portano.", + "Project saved. The existing tasks get their numbers in the background.": "Progetto salvato. Le attività esistenti ricevono il loro numero in background.", + "Next task number": "Numero della prossima attività", + "The number the next task of this project gets in its key. Only the system writes it.": "Il numero che la prossima attività di questo progetto riceve nella sua chiave. Solo il sistema lo scrive.", + "Restore {title}": "Ripristina {title}", + "Restore": "Ripristina", + "Project restored": "Progetto ripristinato", + "Could not restore the project": "Impossibile ripristinare il progetto", + "Bring this project back to the active list.": "Riporta questo progetto nell’elenco dei progetti attivi.", + "Restore project": "Ripristina progetto", + "Request reason": "Motivo della richiesta", + "Why the requester needs this project. Filled in when the project is requested.": "Perché il richiedente ha bisogno di questo progetto. Compilato alla richiesta.", + "Reviewed by": "Esaminato da", + "The user who approved or rejected the request.": "L’utente che ha approvato o respinto la richiesta.", + "Reviewed at": "Esaminato il", + "When the request was approved or rejected.": "Quando la richiesta è stata approvata o respinta.", + "Review note": "Nota di revisione", + "The reviewer's reason, shown to the requester when a request is not approved.": "Il motivo del revisore, mostrato al richiedente quando una richiesta non è approvata.", + "Members of these groups": "Membri di questi gruppi", + "Groups that may create projects": "Gruppi che possono creare progetti", + "The group {group} no longer exists. Save to remove it.": "Il gruppo {group} non esiste più. Salva per rimuoverlo.", + "Review project request": "Esamina la richiesta di progetto", + "Requested by": "Richiesto da", + "Why it is needed": "Perché serve", + "Desired start date": "Data di inizio desiderata", + "Why is it not approved?": "Perché non viene approvato?", + "Give a reason. The requester sees it.": "Indica un motivo. Il richiedente lo vedrà.", + "Approve": "Approva", + "Reject": "Respingi", + "Reject request": "Respingi la richiesta", + "The review was not saved. Try again.": "La revisione non è stata salvata. Riprova.", + "This project is waiting for review": "Questo progetto è in attesa di revisione", + "This request was not approved": "Questa richiesta non è stata approvata", + "Reason: {note}": "Motivo: {note}", + "Review request": "Esamina la richiesta", + "Request a project": "Richiedi un progetto", + "Step {step} of 2": "Passo {step} di 2", + "Why is this project needed?": "Perché serve questo progetto?", + "Give a reason. The reviewer reads it.": "Indica un motivo. Il revisore lo leggerà.", + "Back": "Indietro", + "Next": "Avanti", + "Send request": "Invia richiesta", + "The request was not sent. Try again.": "La richiesta non è stata inviata. Riprova.", + "Requested": "Richiesto", + "Not approved": "Non approvato", + "Your request was sent": "La tua richiesta è stata inviata", + "Let everyone else request a project": "Consenti a tutti gli altri di richiedere un progetto", + "Add a task": "Aggiungi un'attività", + "Delete task": "Elimina attività", + "Edit task": "Modifica attività", + "Write": "Scrivi", + "Preview": "Anteprima", + "Markdown works here: headings, lists and links.": "Qui funziona il Markdown: titoli, elenchi e link.", + "Could not save the task. Please try again.": "Impossibile salvare l'attività. Riprova.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Su \"{title}\" è stato registrato del tempo, quindi non può essere eliminata. Puoi annullarla: le registrazioni di tempo restano.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Eliminare \"{title}\"? Vengono rimossi anche i collegamenti ad altre attività. Questa azione non può essere annullata.", + "Keep task": "Mantieni attività", + "Cancel task": "Annulla attività", + "Only the reporter, the project owner or an admin can delete this task.": "Solo chi l'ha segnalata, il proprietario del progetto o un amministratore può eliminare questa attività.", + "Could not delete the task. Please try again.": "Impossibile eliminare l'attività. Riprova.", + "Could not cancel the task. Please try again.": "Impossibile annullare l'attività. Riprova.", + "Responsible": "Responsabile", + "Also working on this": "Ci lavorano anche", + "Labels": "Etichette", + "Could not change the priority. Please try again.": "Impossibile modificare la priorità. Riprova.", + "Other project members who work on this task alongside the person responsible.": "Altri membri del progetto che lavorano a questa attività insieme al responsabile.", + "Duplicate": "Duplica", + "Could not copy the task. Please try again.": "Impossibile copiare l'attività. Riprova.", + "Subtasks": "Sottoattività", + "{done} of {total} done": "{done} di {total} completate", + "Add a subtask": "Aggiungi una sottoattività", + "Checklist": "Checklist", + "Checklist item actions": "Azioni dell'elemento della checklist", + "Add a checklist item": "Aggiungi un elemento alla checklist", + "Subtasks: {estimate} estimated, {logged} logged": "Sottoattività: {estimate} stimate, {logged} registrate", + "Total estimate: {total}": "Stima totale: {total}", + "Part of {title}": "Parte di {title}", + "Checklist: {count} done": "Checklist: {count} completati", + "This task has subtasks: {count}.": "Questa attività ha sottoattività: {count}.", + "Keep subtasks as separate tasks": "Mantieni le sottoattività come attività separate", + "Delete subtasks too": "Elimina anche le sottoattività", + "Copy of {title}": "Copia di {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "L'attività è stata copiata, ma non tutte le sue sottoattività. Controlla la copia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Piccoli passi all'interno dell'attività. Ogni elemento ha un id, un testo e se è completato.", + "Open work per person and per project.": "Lavoro aperto per persona e per progetto.", + "View": "Vista", + "By person": "Per persona", + "By project": "Per progetto", + "Hours left": "Ore rimanenti", + "Tasks without an estimate": "Attività senza stima", + "Due in 14 days": "In scadenza entro 14 giorni", + "Shared": "Condivise", + "Unassigned": "Non assegnate", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Viene mostrato il lavoro nei progetti che puoi vedere. Le ore contano per la persona responsabile; le attività condivise sono contate senza ore.", + "No open work in these projects.": "Nessun lavoro aperto in questi progetti.", + "Open work": "Lavoro aperto", + "{count} open tasks": "{count} attività aperte", + "Create a project to see capacity here.": "Crea un progetto per vedere qui la capacità.", + "My tasks": "Le mie attività", + "Show all my tasks": "Mostra tutte le mie attività", + "No tasks assigned to you": "Nessuna attività assegnata a te", + "Browse projects": "Sfoglia i progetti", + "Later": "Più avanti", + "Due {date}": "Scadenza {date}", + "Could not change the status. Please try again.": "Impossibile cambiare lo stato. Riprova.", + "Completed today": "Completate oggi", + "My open tasks": "Le mie attività aperte", + "My overdue tasks": "Le mie attività in ritardo", + "My tasks in progress": "Le mie attività in corso", + "Pin to the top": "Fissa in alto", + "Unpin": "Sblocca", + "Pinned": "Fissato", + "Actions for {title}": "Azioni per {title}", + "Could not save your project order. Please try again.": "Impossibile salvare l'ordine dei tuoi progetti. Riprova.", + "No boards yet": "Ancora nessuna bacheca", + "Create a project to get a board.": "Crea un progetto per avere una bacheca.", + "Use the Projects page to create and manage your projects and tasks.": "Usa la pagina Progetti per creare e gestire i tuoi progetti e le tue attività.", + "Go to projects": "Vai ai progetti", + "You are not a member of any projects yet.": "Non sei ancora membro di alcun progetto.", + "Could not search for users. Please try again.": "Impossibile cercare utenti. Riprova.", + "Project creation is restricted to administrators.": "La creazione di progetti è riservata agli amministratori.", + "Only the project owner or an administrator can delete this project.": "Solo il proprietario del progetto o un amministratore può eliminare questo progetto.", + "No projects are available to you yet. Ask an administrator to create one.": "Non hai ancora progetti disponibili. Chiedi a un amministratore di crearne uno.", + "Due: {date}": "Scadenza: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Le attività con una data di inizio o di scadenza compaiono sulla cronologia. Aggiungi le date per vederle qui.", + "You do not have access to this project.": "Non hai accesso a questo progetto.", + "Zoom level": "Livello di zoom", + "Unscheduled": "Non pianificate", + "Start: {date}": "Inizio: {date}", + "Today": "Oggi", + "No scheduled tasks": "Nessuna attività pianificata", + "An unexpected error occurred.": "Si è verificato un errore imprevisto.", + "Column {number} name": "Nome della colonna {number}", + "Failed to save creation policy": "Impossibile salvare la regola di creazione", + "All authenticated users": "Tutti gli utenti autenticati", + "Control who may create new projects": "Stabilisci chi può creare nuovi progetti", + "Administrators only": "Solo amministratori", + "Project creation": "Creazione dei progetti", + "Allow project creation": "Consenti la creazione di progetti", + "Creation policy saved successfully": "Regola di creazione salvata", + "Initializing…": "Avvio in corso…", + "e.g. 2h 30m, 90m, 1.5h": "es. 2h 30m, 90m, 1.5h", + "Log time": "Registra tempo", + "Save estimate": "Salva stima", + "Logged: {logged}": "Registrato: {logged}", + "over by {amount}": "superato di {amount}", + "Time tracking": "Registrazione del tempo", + "Estimate": "Stima", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Inserisci una stima valida (es. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Inserisci una durata valida (es. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Impossibile salvare la registrazione di tempo. Riprova.", + "Edit time entry": "Modifica registrazione di tempo", + "Duration": "Durata", + "Date range": "Periodo", + "Last week": "Settimana scorsa", + "No time logged": "Nessun tempo registrato", + "Log time on a task to see it here.": "Registra tempo su un'attività per vederlo qui.", + "To date": "Fino alla data", + "This week": "Questa settimana", + "Total: {total}": "Totale: {total}", + "From date": "Dalla data", + "Custom range": "Periodo personalizzato", + "All time": "Tutto", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Impossibile eliminare un'attività, quindi potrebbero restare dei dati. Elimina di nuovo il progetto.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Impossibile eliminare una registrazione di tempo, quindi potrebbero restare dei dati. Elimina di nuovo il progetto.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Impossibile eliminare una colonna, quindi potrebbero restare dei dati. Elimina di nuovo il progetto.", + "Could not delete the project. Please try again.": "Impossibile eliminare il progetto. Riprova.", + "Notification settings": "Impostazioni delle notifiche", + "Configure when due-date reminders are sent": "Configura quando vengono inviati i promemoria di scadenza", + "Due-date reminder lead time (hours)": "Anticipo del promemoria di scadenza (ore)", + "Lead time must be between 1 and 336 hours": "L'anticipo deve essere tra 1 e 336 ore", + "Reminder lead time saved successfully": "Anticipo del promemoria salvato", + "Failed to save reminder lead time": "Impossibile salvare l'anticipo del promemoria", + "Notifications": "Notifiche", + "Notify me 1 day before a task's due date": "Avvisami 1 giorno prima della scadenza di un'attività", + "Draft": "Bozza", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Se la lezione è una bozza visibile solo al suo docente, si svolge o è annullata.", + "New release": "Nuova release", + "Roadmap chart. The same releases and epics are listed below.": "Grafico della roadmap. Le stesse release ed epic sono elencate qui sotto.", + "Nothing on the roadmap yet": "Ancora niente nella roadmap", + "Releases with a target date and epics with dated tasks appear here.": "Qui compaiono le release con una data obiettivo e gli epic con attività datate.", + "Releases": "Release", + "No releases yet": "Ancora nessuna release", + "Target date: {date}": "Data obiettivo: {date}", + "No target date": "Nessuna data obiettivo", + "Edit {name}": "Modifica {name}", + "Mark {name} as released": "Segna {name} come rilasciata", + "Mark as released": "Segna come rilasciata", + "Epics": "Epic", + "No epics yet. Open a task to make it an epic.": "Ancora nessun epic. Apri un'attività per renderla un epic.", + "Not scheduled yet": "Non ancora pianificato", + "Planned": "Pianificata", + "Released": "Rilasciata", + "Edit release": "Modifica release", + "Target date": "Data obiettivo", + "Could not save the release. Please try again.": "Impossibile salvare la release. Riprova.", + "Every task of this release is done or cancelled.": "Ogni attività di questa release è completata o annullata.", + "Not finished yet: {count}": "Non ancora finite: {count}", + "What happens to these tasks?": "Cosa succede a queste attività?", + "Move to {name}": "Sposta in {name}", + "Remove the release": "Rimuovi la release", + "Keep it on {name}": "Lasciale su {name}", + "Could not mark the release as released. Please try again.": "Impossibile segnare la release come rilasciata. Riprova.", + "Roadmap": "Roadmap", + "Tasks or roadmap": "Attività o roadmap", + "Release": "Release", + "Epic": "Epic", + "This task is an epic": "Questa attività è un epic", + "A named, dated delivery of a project that its tasks are planned against.": "Una consegna di un progetto con nome e data, su cui vengono pianificate le sue attività.", + "Name of the release": "Nome della release", + "The project this release belongs to": "Il progetto a cui appartiene questa release", + "What this release delivers": "Cosa consegna questa release", + "When work on the release starts": "Quando inizia il lavoro sulla release", + "The date the release is due": "La data in cui è prevista la release", + "Whether the release is planned, released or archived": "Se la release è pianificata, rilasciata o archiviata", + "Released on": "Rilasciata il", + "When the release was marked as released": "Quando la release è stata segnata come rilasciata", + "The release this task is planned for": "La release per cui è pianificata questa attività", + "Board view options": "Opzioni di visualizzazione della bacheca", + "Colour cards": "Colora le schede", + "No colour": "Nessun colore", + "By label": "Per etichetta", + "Swimlanes": "Corsie", + "No swimlanes": "Nessuna corsia", + "By assignee": "Per assegnatario", + "By epic": "Per epic", + "No assignee": "Non assegnata", + "No epic": "Nessuna epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Le schede restano nella riga della loro epic. Cambia l'epic nella pagina dell'attività.", + "Hand over to": "Passa a", + "Could not save your board view. It applies until you reload.": "Impossibile salvare la visualizzazione della bacheca. Vale fino al ricaricamento.", + "Timetable wish": "Desiderata d'orario", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Un desiderata che il generatore considera. Rispetta sempre uno vincolante, e uno flessibile quando può.", + "Whether the wish is about a teacher, a group, a room or one activity": "Se il desiderata riguarda un docente, un gruppo, un'aula o un'attività", + "Teacher": "Docente", + "Group": "Gruppo", + "Reference": "Riferimento", + "The user, group, room or activity the wish is about": "L'utente, il gruppo, l'aula o l'attività di cui si tratta", + "What the wish asks for": "Cosa chiede il desiderata", + "Not on these periods": "Non in queste ore", + "Preferably not on these periods": "Preferibilmente non in queste ore", + "At most a number of lessons a day": "Al massimo un numero di lezioni al giorno", + "No free periods between lessons": "Nessuna ora buca tra le lezioni", + "Always the same room": "Sempre la stessa aula", + "Periods": "Ore", + "The periods of the week the wish is about, such as wed-5": "Le ore della settimana interessate, per esempio wed-5", + "Limit": "Limite", + "The most lessons a day, for a wish of that kind": "Il massimo di lezioni al giorno, per un desiderata di quel tipo", + "Strength": "Forza", + "Whether the generator must keep the wish or should keep it": "Se il generatore deve o dovrebbe rispettare il desiderata", + "Hard": "Vincolante", + "Soft": "Flessibile", + "Weight": "Peso", + "How much a soft wish counts, from 1 to 3": "Quanto conta un desiderata flessibile, da 1 a 3", + "Why the wish exists": "Perché esiste il desiderata", + "Timetable scenario": "Scenario d'orario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Uno schema settimanale, creato dal generatore o preso dall'orario attuale. Conserva i dati di partenza e quanto rispetta i desiderata.", + "The name timetablers know the scenario by": "Il nome con cui chi fa l'orario conosce lo scenario", + "Whether the generator made it or it came from the current timetable": "Se l'ha creato il generatore o viene dall'orario attuale", + "Generated": "Generato", + "From the current timetable": "Dall'orario attuale", + "Week of": "Settimana del", + "The Monday of the first week of the window": "Il lunedì della prima settimana del periodo", + "Window start": "Inizio del periodo", + "The first day the week pattern applies to": "Il primo giorno a cui si applica lo schema settimanale", + "Window end": "Fine del periodo", + "The last day the week pattern applies to": "L'ultimo giorno a cui si applica lo schema settimanale", + "Waiting, generating, done, failed, or published as draft lessons": "In attesa, in generazione, pronto, fallito o pubblicato come lezioni bozza", + "Waiting": "In attesa", + "Generating": "In generazione", + "Failed": "Fallito", + "Published": "Pubblicato", + "Seed": "Seme", + "The number the generator starts from, so a run can be repeated": "Il numero da cui parte il generatore, per poter ripetere un'esecuzione", + "Input": "Dati di partenza", + "The periods, rooms, lessons and wishes the scenario was made from": "Le ore, aule, lezioni e desiderata da cui è nato lo scenario", + "Placements": "Collocazioni", + "Each lesson with the period and room it was given": "Ogni lezione con l'ora e l'aula assegnate", + "Unplaced lessons": "Lezioni non collocate", + "Lessons without a place, each with the hard wish that blocked it": "Lezioni senza posto, ognuna con il desiderata vincolante che l'ha bloccata", + "Broken wishes": "Desiderata non rispettati", + "The wishes this scenario breaks, with the lessons that break them": "I desiderata che questo scenario non rispetta, con le lezioni coinvolte", + "Measures": "Misure", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Lezioni collocate, desiderata non rispettati, ore buche, lezioni al giorno e uso delle aule", + "Reason": "Motivo", + "Why the run failed": "Perché l'esecuzione è fallita", + "Published at": "Pubblicato il", + "When the scenario was written out as draft lessons": "Quando lo scenario è stato scritto come lezioni bozza", + "Edit wish": "Modifica desiderio", + "New wish": "Nuovo desiderio", + "Hard: the generator always keeps it": "Vincolante: il generatore lo rispetta sempre", + "Soft: the generator keeps it where it can": "Flessibile: il generatore lo rispetta quando può", + "Weight (1 to 3)": "Peso (da 1 a 3)", + "Most lessons a day": "Massimo di lezioni al giorno", + "Period": "Ora", + "{day} period {number}": "{day} ora {number}", + "Teacher (user name)": "Docente (nome utente)", + "Activity (group:subject)": "Attività (gruppo:materia)", + "Say who or what the wish is about.": "Indica chi o cosa riguarda il desiderio.", + "Choose at least one period.": "Scegli almeno un'ora.", + "The limit is a whole number of 1 or more.": "Il limite è un numero intero pari o superiore a 1.", + "Timetable": "Orario", + "Wishes": "Desideri", + "Timetable wishes": "Desideri per l'orario", + "Generator run": "Esecuzione del generatore", + "Generator progress": "Avanzamento del generatore", + "The run failed: {reason}": "L'esecuzione non è riuscita: {reason}", + "{placed} of {lessons} lessons placed": "{placed} lezioni su {lessons} collocate", + "Generate again": "Genera di nuovo", + "Generate": "Genera", + "Every lesson has a place.": "Ogni lezione ha un posto.", + "Lesson": "Lezione", + "No free period and room": "Nessuna ora né aula libera", + "Broken soft wishes": "Desideri flessibili non rispettati", + "Every soft wish is kept.": "Ogni desiderio flessibile è rispettato.", + "Wish": "Desiderio", + "Lessons": "Lezioni", + "Generating: {percent}% of the time budget used": "Generazione: {percent}% del tempo usato", + "Waiting to start": "In attesa di avvio", + "Published as draft lessons": "Pubblicato come lezioni in bozza", + "Could not read the scenario.": "Impossibile leggere lo scenario.", + "Could not start the run.": "Impossibile avviare l'esecuzione.", + "Scenarios": "Scenari", + "Timetable scenarios": "Scenari di orario", + "Scenario": "Scenario", + "Take the current timetable": "Prendi l'orario attuale", + "Could not take the current timetable.": "Impossibile prendere l'orario attuale.", + "Broken hard wishes": "Desideri vincolanti non rispettati", + "Not on a period of the week grid": "Non su un'ora della griglia settimanale", + "Compare scenarios": "Confronta scenari", + "Scenarios to compare": "Scenari da confrontare", + "Choose two or three scenarios to compare them.": "Scegli due o tre scenari per confrontarli.", + "Measure": "Misura", + "Best": "Migliore", + "Lessons that differ": "Lezioni che differiscono", + "No lesson differs.": "Nessuna lezione differisce.", + "Not placed": "Non collocata", + "{period} in {room}": "{period} in {room}", + "Lessons placed": "Lezioni collocate", + "Lessons without a place": "Lezioni senza posto", + "Clashes": "Conflitti", + "Hard wishes broken": "Desideri vincolanti non rispettati", + "Soft wishes broken": "Desideri flessibili non rispettati", + "Soft wishes broken, weighted": "Desideri flessibili non rispettati, ponderati", + "Free periods between lessons, all teachers": "Ore buche, tutti i docenti", + "Most free periods of one teacher": "Più ore buche di un docente", + "Most lessons of one group on a day": "Più lezioni di un gruppo in un giorno", + "Room use": "Uso delle aule", + "Publish as draft lessons": "Pubblica come lezioni in bozza", + "Draft lessons written: {count}": "Lezioni in bozza scritte: {count}", + "Could not publish the scenario.": "Impossibile pubblicare lo scenario.", + "Rules": "Regole", + "Rules for {column}": "Regole per {column}", + "When a card enters this column": "Quando una scheda entra in questa colonna", + "Action": "Azione", + "Set the priority": "Imposta la priorità", + "Assign to": "Assegna a", + "Assign the person who moved the card": "Assegna alla persona che ha spostato la scheda", + "Remove the assignee": "Rimuovi l'assegnatario", + "Add a label": "Aggiungi un'etichetta", + "No longer a project member": "Non è più membro del progetto", + "This label no longer exists": "Questa etichetta non esiste più", + "Add rule": "Aggiungi regola", + "Remove rule": "Rimuovi regola", + "No rules yet. Add one to change a card when it enters this column.": "Ancora nessuna regola. Aggiungine una per modificare una scheda quando entra in questa colonna.", + "Could not save the rules. Please try again.": "Impossibile salvare le regole. Riprova.", + "1 rule runs when a card enters this column": "1 regola viene eseguita quando una scheda entra in questa colonna", + "{count} rules run when a card enters this column": "{count} regole vengono eseguite quando una scheda entra in questa colonna", + "Rules applied: {changes}": "Regole applicate: {changes}", + "assigned to {name}": "assegnata a {name}", + "assignee removed": "assegnatario rimosso", + "priority {priority}": "priorità {priority}", + "label {label}": "etichetta {label}", + "What happens to a card when it enters this column, applied in list order.": "Cosa succede a una scheda quando entra in questa colonna, nell'ordine dell'elenco.", + "Value": "Valore", + "What the rule does to the card.": "Cosa fa la regola alla scheda.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "La priorità, l'id utente o l'id etichetta usato dall'azione; vuoto per le azioni senza valore.", + "is not": "non è", + "{dimension} is not": "{dimension} non è", + "Saved filters": "Filtri salvati", + "No saved filters yet": "Nessun filtro salvato", + "Save filter": "Salva filtro", + "Rename \"{name}\"": "Rinomina \"{name}\"", + "Delete \"{name}\"": "Elimina \"{name}\"", + "Clear filters": "Cancella filtri", + "Showing {shown} of {total} tasks": "{shown} di {total} attività visibili", + "Me": "Io", + "No date": "Nessuna data", + "Rename saved filter": "Rinomina filtro salvato", + "Share with the project": "Condividi con il progetto", + "Give the filter a name": "Dai un nome al filtro", + "Could not save the filter. Please try again.": "Impossibile salvare il filtro. Riprova.", + "Some labels in \"{name}\" no longer exist and were left out.": "Alcune etichette in \"{name}\" non esistono più e sono state escluse.", + "Could not delete the filter. Please try again.": "Impossibile eliminare il filtro. Riprova.", + "Saved filter": "Filtro salvato", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Un filtro della bacheca con nome di un progetto, privato per chi lo ha salvato salvo condivisione con il progetto.", + "The project whose board the filter applies to": "Il progetto alla cui bacheca si applica il filtro", + "The name the filter is listed under": "Il nome con cui il filtro compare nell'elenco", + "Saved by": "Salvato da", + "Nextcloud user id of the person who saved the filter": "Id utente Nextcloud di chi ha salvato il filtro", + "Shared with the project": "Condiviso con il progetto", + "Whether every project member sees and applies the filter": "Se ogni membro del progetto vede e può applicare il filtro", + "Criteria": "Criteri", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Il filtro: assegnatario, etichetta, priorità e scadenza, ciascuno con è o non è e i suoi valori", + "Cross-project view": "Vista multiprogetto", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Una selezione salvata di progetti le cui attività sono mostrate insieme in corsie di stato, condivisa con le persone indicate.", + "Shared with": "Condivisa con", + "The name the view is listed under": "Il nome con cui la vista è elencata", + "Nextcloud user id of the person who saved the view": "Id utente Nextcloud della persona che ha salvato la vista", + "Nextcloud user ids of the people the view is shared with": "Id utente Nextcloud delle persone con cui la vista è condivisa", + "The projects whose tasks the view shows, at most twenty": "I progetti di cui la vista mostra le attività, al massimo venti", + "1 project in this view is hidden from you.": "1 progetto di questa vista ti è nascosto.", + "{count} projects in this view are hidden from you.": "{count} progetti di questa vista ti sono nascosti.", + "{project} has no column for {status}.": "{project} non ha una colonna per {status}.", + "This view does not exist or is not shared with you.": "Questa vista non esiste o non è condivisa con te.", + "\"{task}\" moved to {status}.": "\"{task}\" spostata in {status}.", + "Project: {title}": "Progetto: {title}", + "Cross-project views": "Viste multiprogetto", + "New view": "Nuova vista", + "Edit view": "Modifica vista", + "Delete view": "Elimina vista", + "Give the view a name": "Dai un nome alla vista", + "Pick at least one project": "Scegli almeno un progetto", + "A view shows at most {max} projects": "Una vista mostra al massimo {max} progetti", + "Could not save the view. Please try again.": "Impossibile salvare la vista. Riprova.", + "Could not delete the view. Please try again.": "Impossibile eliminare la vista. Riprova.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Eliminare \"{title}\"? I progetti e le loro attività restano come sono.", + "People see the tasks of the projects they are in, never more.": "Ognuno vede le attività dei progetti di cui fa parte, mai di più.", + "No views yet. A view shows the tasks of several of your projects together.": "Ancora nessuna vista. Una vista mostra insieme le attività di più tuoi progetti.", + "Projects in view: {count}": "Progetti nella vista: {count}", + "Notify me when a task is assigned to me": "Avvisami quando mi viene assegnata un'attività", + "Also send these to me by email": "Inviami questi avvisi anche per e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Aggiungi un indirizzo e-mail nelle impostazioni personali di Nextcloud per ricevere e-mail.", + "Code link": "Collegamento al codice", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Un commit, ramo, richiesta di merge o issue in una forge di codice che lavora su un'attività.", + "The task the link belongs to": "L'attività a cui appartiene il collegamento", + "The project of the task": "Il progetto dell'attività", + "Task key": "Chiave dell'attività", + "The task key the forge text named, such as VC-12": "La chiave dell'attività citata nel testo della forge, come VC-12", + "What the link points at": "A cosa punta il collegamento", + "Link": "Collegamento", + "The address of the item in the forge": "L'indirizzo dell'elemento nella forge", + "The commit message, branch name or merge request title": "Il messaggio di commit, il nome del ramo o il titolo della richiesta di merge", + "Repository": "Repository", + "The repository, such as acme/portal": "Il repository, come acme/portal", + "Forge id": "Id nella forge", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "L'id proprio dell'elemento nella forge, come github:acme/portal#42 o un hash di commit", + "State": "Stato", + "The state of a merge request or issue": "Lo stato di una richiesta di merge o di una issue", + "Who made the commit or opened the merge request": "Chi ha fatto il commit o aperto la richiesta di merge", + "When the commit was made or the merge request last changed": "Quando è stato fatto il commit o è cambiata l'ultima volta la richiesta di merge", + "Added by": "Aggiunto da", + "Whether a person added the link or the integration wrote it": "Se una persona ha aggiunto il collegamento o l'ha scritto l'integrazione", + "Nextcloud user UIDs of project members": "UID utente Nextcloud dei membri del progetto", + "Add link": "Aggiungi collegamento", + "Added by hand": "Aggiunto a mano", + "Branch": "Ramo", + "Code": "Codice", + "Commit": "Commit", + "From the integration": "Dall'integrazione", + "Link to a commit, branch or merge request": "Collegamento a un commit, ramo o richiesta di merge", + "Merge request": "Richiesta di merge", + "Merged": "Unita", + "No code linked yet. Name {key} in a commit message or paste a link.": "Nessun codice collegato. Cita {key} in un messaggio di commit o incolla un collegamento.", + "No code linked yet. Paste a link to a commit or merge request.": "Nessun codice collegato. Incolla un collegamento a un commit o a una richiesta di merge.", + "Paste a web address that starts with https://.": "Incolla un indirizzo web che inizia con https://.", + "Remove link {title}": "Rimuovi il collegamento {title}", + "The link could not be added.": "Non è stato possibile aggiungere il collegamento.", + "The link could not be removed.": "Non è stato possibile rimuovere il collegamento.", + "This link is already on the task.": "Questo collegamento è già nell'attività.", + "Code forges": "Forge di codice", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Collega i commit e le pull request di GitHub alle attività. Integriq riceve gli eventi; planninq non chiama mai GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Scarica la configurazione e importala in Integriq. Poi inserisci un segreto nella regola \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "In GitHub, aggiungi al repository un webhook con questo indirizzo e lo stesso segreto. Scegli il tipo di contenuto application/json e gli eventi push e pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Cita la chiave dell'attività, come VC-12, in un messaggio di commit, nel nome di un ramo o nel titolo di una pull request. Il collegamento appare allora su quell'attività.", + "Without Integriq, project members can still paste a link on the task page.": "Senza Integriq, i membri del progetto possono comunque incollare un collegamento nella pagina dell'attività.", + "Download the Integriq configuration": "Scarica la configurazione di Integriq", + "Calendar": "Calendario", + "Previous": "Precedente", + "Calendar view": "Vista del calendario", + "Starts:": "Inizia:", + "No tasks with a date in this month.": "Nessuna attività con una data in questo mese.", + "Week of {start} to {end}": "Settimana dal {start} al {end}", + "My calendar": "Il mio calendario", + "Show as list": "Mostra come elenco", + "Show as calendar": "Mostra come calendario", + "Open my calendar": "Apri il mio calendario", + "Nextcloud Tasks": "Attività di Nextcloud", + "Show my tasks in Nextcloud Tasks": "Mostra le mie attività in Attività di Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Le attività assegnate a te o condivise con te compaiono in un elenco \"Planninq\" in Attività e Calendario di Nextcloud. Le modifiche fatte lì vengono sostituite alla modifica successiva in Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Questo server non può scrivere in Attività di Nextcloud, quindi l'esportazione non è disponibile.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Gestito da Planninq. Le modifiche fatte qui vengono sostituite alla modifica successiva in Planninq.", + "Working days and holidays": "Giorni lavorativi e festivi", + "Dates set on the timeline skip the days that are not working days.": "Le date impostate sulla cronologia saltano i giorni non lavorativi.", + "Working weekdays": "Giorni lavorativi della settimana", + "Non-working days": "Giorni non lavorativi", + "No non-working days yet.": "Ancora nessun giorno non lavorativo.", + "Add day": "Aggiungi giorno", + "Year": "Anno", + "Add Dutch national holidays": "Aggiungi le festività nazionali olandesi", + "Save working days": "Salva i giorni lavorativi", + "Choose at least one working weekday.": "Scegli almeno un giorno lavorativo.", + "Working days saved.": "Giorni lavorativi salvati.", + "Could not save the working days.": "Impossibile salvare i giorni lavorativi.", + "New Year's Day": "Capodanno", + "Easter Sunday": "Domenica di Pasqua", + "Easter Monday": "Lunedì dell'Angelo", + "King's Day": "Festa del Re", + "Liberation Day": "Festa della Liberazione", + "Ascension Day": "Ascensione", + "Whit Sunday": "Domenica di Pentecoste", + "Whit Monday": "Lunedì di Pentecoste", + "Christmas Day": "Natale", + "Boxing Day": "Santo Stefano", + "Dates of {title}": "Date di {title}", + "The due date cannot be before the start date.": "La scadenza non può precedere la data di inizio.", + "{title}, from {start} to {end}": "{title}, dal {start} al {end}", + "The dates could not be saved.": "Impossibile salvare le date.", + "{title} now runs from {start} to {end}": "{title} ora va dal {start} al {end}", + "Auto-scheduling": "Pianificazione automatica", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Se attiva, spostare più avanti una scadenza sulla cronologia propone di spostare anche le attività che blocca.", + "Move blocked tasks along when a task slips": "Sposta le attività bloccate quando un'attività slitta", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Sulla cronologia, una scadenza successiva propone di spostare le attività bloccate. Contano solo i collegamenti \"blocca\" e le attività si spostano solo più avanti.", + "Move the tasks that wait for {title}?": "Spostare le attività che aspettano {title}?", + "These tasks wait for it and would start after its new due date:": "Queste attività la aspettano e inizierebbero dopo la nuova scadenza:", + "{count} tasks would move; the first {limit} are listed.": "{count} attività verrebbero spostate; sono elencate le prime {limit}.", + "Now": "Ora", + "After the move": "Dopo lo spostamento", + "Only this task": "Solo questa attività", + "Move all": "Sposta tutte", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Fermato a {title}: le sue date non sono state salvate. Le attività precedenti sono state spostate.", + "Cumulative flow": "Flusso cumulativo", + "Show as chart": "Mostra come grafico", + "Show as table": "Mostra come tabella", + "Tasks per column per day": "Attività per colonna al giorno", + "Tasks without recorded history in this period: {count}": "Attività senza cronologia registrata in questo periodo: {count}", + "Lead and cycle time": "Lead time e tempo di ciclo", + "No tasks were finished in this period.": "Nessuna attività è stata completata in questo periodo.", + "Finished tasks": "Attività completate", + "Cycle time, average": "Tempo di ciclo, media", + "Cycle time, 85th percentile": "Tempo di ciclo, 85° percentile", + "Lead time, average": "Lead time, media", + "Tasks whose finish time was estimated from their history: {count}": "Attività la cui ora di fine è stata stimata dalla cronologia: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Tempo di ciclo di ogni attività completata, con la media e l'85° percentile", + "Slowest tasks": "Attività più lente", + "cycle {cycle}, lead {lead}": "ciclo {cycle}, lead {lead}", + "{days} days": "{days} giorni", + "Could not load the flow of this project.": "Impossibile caricare il flusso di questo progetto.", + "Last {days} days": "Ultimi {days} giorni", + "Portfolio flow": "Flusso del portafoglio", + "An admin adds portfolios under Projects, Portfolios.": "Un amministratore aggiunge i portafogli in Progetti, Portafogli.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Progetti non mostrati, perché se ne mostrano al massimo 50 alla volta: {count}", + "Could not load the flow of this portfolio.": "Impossibile caricare il flusso di questo portafoglio.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flusso cumulativo e tempo di ciclo sui progetti di un portafoglio.", + "Edit report": "Modifica rapporto", + "Only tasks where": "Solo attività in cui", + "Group by": "Raggruppa per", + "Display": "Visualizzazione", + "Share with everyone who can read its projects": "Condividi con chiunque possa leggerne i progetti", + "The report could not be saved.": "Impossibile salvare il rapporto.", + "Number of tasks": "Numero di attività", + "Bar": "Barre", + "Donut": "Ciambella", + "Table": "Tabella", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} dei {total} progetti di questo rapporto non sono visibili per te", + "No tasks match this report.": "Nessuna attività corrisponde a questo rapporto.", + "None": "Nessuno", + "Could not load this report.": "Impossibile caricare questo rapporto.", + "Report": "Rapporto", + "Your reports": "I tuoi rapporti", + "My reports": "I miei rapporti", + "Shared reports": "Rapporti condivisi", + "You have not built a report yet.": "Non hai ancora creato un rapporto.", + "Nobody has shared a report with you yet.": "Nessuno ha ancora condiviso un rapporto con te.", + "Reports you built over tasks, and the ones shared with you.": "I rapporti che hai creato sulle attività, e quelli condivisi con te.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Una query salvata sulle attività: quali progetti, quali filtri, raggruppata per cosa, contata o sommata, e mostrata come tabella o grafico.", + "The name the report is listed under": "Il nome con cui il rapporto è elencato", + "What the report shows and who it is for": "Cosa mostra il rapporto e per chi è", + "Nextcloud user id of the person who saved the report": "ID utente Nextcloud di chi ha salvato il rapporto", + "Who can open the report": "Chi può aprire il rapporto", + "Only me": "Solo io", + "Everyone who can read its projects": "Chiunque possa leggerne i progetti", + "The projects the report covers, at most fifty": "I progetti coperti dal rapporto, al massimo cinquanta", + "Filters": "Filtri", + "Task fields and the value each must equal": "Campi dell'attività e il valore a cui ciascuno deve essere uguale", + "The task field the report groups on": "Il campo dell'attività su cui il rapporto raggruppa", + "Count the tasks, or add up a number on them": "Contare le attività, o sommare un numero su di esse", + "Sum": "Somma", + "Sum of": "Somma di", + "The number added up when the measure is a sum": "Il numero sommato quando la misura è una somma", + "Story points": "Story point", + "Estimated duration": "Durata stimata", + "How the report is shown": "Come viene mostrato il rapporto", + "Issue type": "Tipo di issue", + "Task fields and the value each must equal; empty when the report covers every task": "Campi dell'attività e il valore che ciascuno deve avere; vuoto se il rapporto copre tutte le attività", + "The status a task must have": "Lo stato che un'attività deve avere", + "The priority a task must have": "La priorità che un'attività deve avere", + "The user a task must be assigned to": "L'utente a cui un'attività deve essere assegnata", + "A label a task must carry": "Un'etichetta che un'attività deve avere", + "The board column a task must be in": "La colonna della bacheca in cui deve trovarsi un'attività", + "The issue type a task must have": "Il tipo di issue che un'attività deve avere", + "Manager groups": "Gruppi gestori", + "Member groups": "Gruppi membri", + "Viewer groups": "Gruppi lettori", + "Viewers": "Lettori", + "Owning group": "Gruppo proprietario", + "Nextcloud groups whose members manage the project": "Gruppi Nextcloud i cui membri gestiscono il progetto", + "Nextcloud groups whose members work on the project": "Gruppi Nextcloud i cui membri lavorano al progetto", + "Nextcloud groups whose members may read the project": "Gruppi Nextcloud i cui membri possono leggere il progetto", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utenti Nextcloud che gestiscono il progetto: impostazioni, membri e lavoro", + "Nextcloud user ids who may read the project and its work but not change it": "Utenti Nextcloud che possono leggere il progetto e il suo lavoro senza modificarlo", + "The Nextcloud group that owns the project with its creator, at most one": "Il gruppo Nextcloud che possiede il progetto con chi l'ha creato, al massimo uno", + "Nextcloud user ids who may read this through the project": "Utenti Nextcloud che possono leggere questo tramite il progetto", + "Nextcloud groups whose members may change this through the project": "Gruppi Nextcloud i cui membri possono modificare questo tramite il progetto", + "Nextcloud groups whose members may read this through the project": "Gruppi Nextcloud i cui membri possono leggere questo tramite il progetto", + "Search for a person or a group…": "Cerca una persona o un gruppo…", + "No one found. Your admin's sharing settings decide who you can find.": "Nessuno trovato. Le impostazioni di condivisione del tuo amministratore decidono chi puoi trovare.", + "Type at least two characters": "Digita almeno due caratteri", + "Everyone in this group": "Tutti in questo gruppo", + "Could not search for people. Please try again.": "Impossibile cercare persone. Riprova.", + "Could not remove the group": "Impossibile rimuovere il gruppo", + "Only the owner and managers change who is on this project.": "Solo il proprietario e i gestori cambiano chi fa parte di questo progetto.", + "Role of {name}": "Ruolo di {name}", + "Manager": "Gestore", + "Member": "Membro", + "Viewer": "Lettore", + "Could not change the role": "Impossibile cambiare il ruolo", + "Owned by group: {name}": "Di proprietà del gruppo: {name}", + "No group owns this project.": "Nessun gruppo possiede questo progetto.", + "Owned by group": "Di proprietà del gruppo", + "Search for a group…": "Cerca un gruppo…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nessun gruppo trovato. Le impostazioni di condivisione del tuo amministratore decidono quali gruppi puoi trovare.", + "No owning group": "Nessun gruppo proprietario", + "Could not search for groups. Please try again.": "Impossibile cercare i gruppi. Riprova.", + "Could not change the owning group": "Impossibile cambiare il gruppo proprietario", + "You can read this project. Only its members change it.": "Puoi leggere questo progetto. Solo i suoi membri lo modificano.", + "Course": "Corso", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il corso insegnato in questa lezione, ad esempio un corso opzionale, quando l'app di apprendimento della scuola lo conosce.", + "Online meeting link": "Link della lezione online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Dove gli studenti partecipano online a questa lezione. Il pulsante Partecipa appare solo con un link https." }, "plurals": null } diff --git a/l10n/lb.js b/l10n/lb.js index d332b389..33f7a1aa 100644 --- a/l10n/lb.js +++ b/l10n/lb.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktiv Projeten", + "Archived projects": "Archivéiert Projeten", + "Boards": "Boards", + "My projects": "Meng Projeten", + "Portfolio": "Portfolio", + "Project board": "Projet-Board", + "Projects I am in": "Projeten un deenen ech bedeelegt sinn", + "Timeline": "Zäitleescht", + "Timesheet": "Zäiterfassung", + "Features & roadmap": "Funktiounen a Roadmap", + "Flow": "Oflaf", + "Flows": "Ofleef", + "Reports": "Berichter", + "Pick a report to open it.": "Wielt e Bericht fir en opzemaachen.", + "In progress": "A Gaang", + "Date": "Datum", + "Due": "Fälleg", + "Assignee": "Zougewisen", + "Who": "Wien", + "What": "Wat", + "Minutes": "Minutten", + "Entries": "Andeel", + "Most recent": "Am rezentsten", + "Per person": "Pro Persoun", + "By status": "No Status", + "By priority": "No Prioritéit", + "Task status": "Aufgabestatus", + "Time spent": "Verbruechten Zäit", + "Capacity": "Kapazitéit", + "Due soonest": "Am nächsten fälleg", + "Minutes logged": "Erfaasste Minutten", + "Nothing is due": "Näischt ass fälleg", + "Nothing logged yet": "Nach näischt erfaasst", + "What is open, what is blocked, and what is overdue.": "Wat op ass, wat blockéiert ass a wat iwwerfälleg ass.", + "How allocation is spread across the people working on projects.": "Wéi d'Belaaschtung op d'Leit verdeelt ass, déi u Projete schaffen.", + "Hours logged, and the projects they went to.": "Erfaasste Stonnen an d'Projeten, an déi se gaange sinn.", + "Billable": "Verrechenbar", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Projete gi gelueden", + "No projects for this client yet": "Nach keng Projete fir dëse Client", + "Open in Planninq": "A Planninq opmaachen", + "This project could not be found": "Dëse Projet gouf net fonnt", + "Untitled project": "Onbenannte Projet", + "and {count} more": "an {count} weiderer", + "Store": "Buttek", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installéiert Registeren, Schemaen a Flows déi aner Organisatiounen publizéiert hunn.", + "Work Date": "Aarbechtsdatum", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Kolonnenaktiounen", + "Columns": "Kolonnen", + "Could not remove the column. Please try again.": "D'Kolonn konnt net ewechgeholl ginn. Probéiert w.e.g. nach eng Kéier.", + "Could not save the column. Please try again.": "D'Kolonn konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "Done column": "Fäerdeg-Kolonn", + "Edit column": "Kolonn änneren", + "Keep the card's status": "Status vun der Kaart behalen", + "Move its cards to": "Seng Kaarte réckelen op", + "Move left": "No lénks réckelen", + "Move right": "No riets réckelen", + "Status of cards moved here": "Status vun de Kaarten, déi heihinner geréckelt ginn", + "The last done column cannot be removed.": "Déi lescht Fäerdeg-Kolonn kann net ewechgeholl ginn.", + "WIP limit": "WIP-Limit", + "over limit": "iwwer der Limit", + "The status a card gets when it is moved into this column.": "De Status, deen eng Kaart kritt, wann se an dës Kolonn geréckelt gëtt.", + "All priorities": "All Prioritéiten", + "Could not create the task. Please try again.": "D'Aufgab konnt net erstallt ginn. Probéiert w.e.g. nach eng Kéier.", + "Created": "Erstallt", + "Move to backlog": "An de Backlog", + "Move to board": "Op de Board", + "New task": "Nei Aufgab", + "Nothing in the backlog": "Näischt am Backlog", + "Rank": "Rang", + "Sort by": "Sortéieren no", + "Sort by rank to reorder": "No Rang sortéieren fir nei unzeuerdnen", + "Task actions": "Aufgabenaktiounen", + "All labels": "All Etiketten", + "Filter tasks by label": "Aufgabe no Etikett filteren", + "View timeline": "Zäitlinn weisen", + "Board": "Board", + "List": "Lëscht", + "Column": "Kolonn", + "Board or list": "Board oder Lëscht", + "Log": "Logbuch", + "Add entry": "Entrée derbäisetzen", + "Show": "Weisen", + "No actions yet": "Nach keng Aktiounen", + "Closed": "Zou", + "Entry actions": "Aktioune fir d'Entrée", + "Add action": "Aktioun derbäisetzen", + "by {author}": "vum {author}", + "saved {time}": "gespäichert {time}", + "Attendees: {names}": "Participanten: {names}", + "Add the first entry": "Déi éischt Entrée derbäisetzen", + "Issues": "Problemer", + "Lessons learned": "Erkenntnisser", + "Meetings": "Reuniounen", + "Decisions": "Decisiounen", + "Actions": "Aktiounen", + "Issue": "Problem", + "Lesson learned": "Erkenntnis", + "Meeting": "Reunioun", + "Decision": "Decisioun", + "About this project": "Iwwer dëse Projet", + "No description yet": "Nach keng Beschreiwung", + "Start date": "Startdatum", + "Not set": "Net festgeluecht", + "End date": "Schlussdatum", + "Progress": "Fortschrëtt", + "No tasks yet": "Nach keng Aufgaben", + "Open the board": "De Board opmaachen", + "People": "Leit", + "Owner": "Besëtzer", + "Latest log entries": "Lescht Entréeën", + "Open the log": "D'Logbuch opmaachen", + "{done} of {total} tasks done": "{done} vun {total} Aufgaben erleedegt", + "Edit entry": "Entrée änneren", + "Type": "Aart", + "Attendees": "Participanten", + "Issue is closed": "De Problem ass zou", + "Could not save the entry. Please try again.": "D'Entrée konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "From: {title}": "Aus: {title}", + "What needs to happen": "Wat muss geschéien", + "Could not create the action. Please try again.": "D'Aktioun konnt net erstallt ginn. Probéiert w.e.g. nach eng Kéier.", + "The action was created but could not be linked to the entry.": "D'Aktioun gouf erstallt, konnt awer net mat der Entrée verlinkt ginn.", + "Project pages": "Projetssäiten", + "Overview": "Iwwersiicht", + "Risks": "Risiken", + "Log entry": "Logbuch-Entrée", + "A short name for the entry": "E kuerzen Numm fir d'Entrée", + "Project": "Projet", + "The project this entry belongs to": "De Projet, zu deem dës Entrée gehéiert", + "What kind of entry this is": "Wat fir eng Entrée dat ass", + "When it happened": "Wéini et geschitt ass", + "What happened, in Markdown": "Wat geschitt ass, am Markdown", + "Whether an issue is still open": "Ob e Problem nach op ass", + "The people at a meeting": "D'Leit bei enger Reunioun", + "Tasks that came out of this entry": "Aufgaben, déi aus dëser Entrée entstane sinn", + "Add risk": "Risiko derbäisetzen", + "Risk": "Risiko", + "Score": "Wäert", + "Response": "Reaktioun", + "Review date": "Iwwerpréiwungsdatum", + "no longer on the project": "net méi am Projet", + "Edit {title}": "{title} änneren", + "No risks recorded yet": "Nach keng Risiken erfaasst", + "Add the first risk": "Dat éischt Risiko derbäisetzen", + "Medium": "Mëttel", + "Mitigating": "Gëtt ofgeschwächt", + "Occurred": "Agetrueden", + "Avoid": "Vermeiden", + "Reduce": "Reduzéieren", + "Transfer": "Iwwerdroen", + "Accept": "Akzeptéieren", + "Highest open risks": "Héchst oppe Risiken", + "No open risks": "Keng oppe Risiken", + "Open the risk register": "Risikoregister opmaachen", + "Edit risk": "Risiko änneren", + "What could go wrong": "Wat kéint schifgoen", + "Likelihood": "Wahrscheinlechkeet", + "Impact": "Auswierkung", + "Score {score}": "Wäert {score}", + "Countermeasures": "Géigemoossnamen", + "Could not save the risk. Please try again.": "D'Risiko konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "Risks by likelihood and impact": "Risiken no Wahrscheinlechkeet an Auswierkung", + "Risk scale": "Risikoskala", + "The levels every project scores its risks on, and where low turns into medium and high": "D'Stufen, op deenen all Projet seng Risike bewäert, a wou niddreg an mëttel an héich iwwergeet", + "Number of levels": "Zuel vun de Stufen", + "Likelihood labels": "Etikette fir Wahrscheinlechkeet", + "Impact labels": "Etikette fir Auswierkung", + "Level {level}": "Stuf {level}", + "Medium from score": "Mëttel ab Wäert", + "High from score": "Héich ab Wäert", + "Risk scale saved": "Risikoskala gespäichert", + "1 risk uses level {level}. Change it first.": "1 Risiko benotzt Stuf {level}. Ännert et fir d'éischt.", + "{count} risks use level {level}. Change them first.": "{count} Risike benotze Stuf {level}. Ännert se fir d'éischt.", + "Every level needs a label, and high must start above medium.": "All Stuf brauch eng Etikett, an héich muss iwwer mëttel ufänken.", + "The project this risk belongs to": "De Projet, zu deem dëst Risiko gehéiert", + "The cause and the effect, in Markdown": "Ursaach a Wierkung, am Markdown", + "Category": "Kategorie", + "A free grouping, such as planning, budget or supplier": "Eng fräi Gruppéierung, wéi Planung, Budget oder Liwwerant", + "How likely it is, on the admin's risk scale": "Wéi wahrscheinlech et ass, op der Risikoskala vum Administrator", + "How hard it would hit, on the admin's risk scale": "Wéi haart et géif treffen, op der Risikoskala vum Administrator", + "Likelihood times impact, calculated by the server": "Wahrscheinlechkeet mol Auswierkung, vum Server berechent", + "Where the risk stands": "Wou d'Risiko steet", + "The person who watches this risk": "D'Persoun, déi dëst Risiko am A behält", + "How the project answers the risk": "Wéi de Projet op d'Risiko reagéiert", + "What is done to prevent it or soften it, in Markdown": "Wat gemaach gëtt, fir et ze verhënneren oder ofzeschwächen, am Markdown", + "When to look at this risk again": "Wéini d'Risiko nees gepréift gëtt", + "Very low": "Ganz niddreg", + "Very high": "Ganz héich", + "All projects": "All Projeten", + "Project status report": "Projet-Statusbericht", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "En datéierte Bericht doriwwer, wéi e Projet bei Suen, Organisatioun, Zäit, Informatioun, Qualitéit a Risiko (de GROTIK-Aspekter) steet, all mat enger Notiz.", + "The project this report is about": "De Projet, ëm deen et am Bericht geet", + "Report date": "Berichtsdatum", + "The day the report describes": "Den Dag, deen de Bericht beschreift", + "Money": "Suen", + "How the project stands on this aspect": "Wéi de Projet bei dësem Aspekt steet", + "On track": "Am Plang", + "At risk": "A Gefor", + "Off track": "Aus dem Plang", + "Money note": "Notiz zu Suen", + "A short explanation of this status": "Eng kuerz Erklärung vun dësem Status", + "Organisation": "Organisatioun", + "Organisation note": "Notiz zur Organisatioun", + "Time": "Zäit", + "Time note": "Notiz zur Zäit", + "Information": "Informatioun", + "Information note": "Notiz zur Informatioun", + "Quality": "Qualitéit", + "Quality note": "Notiz zur Qualitéit", + "Risk note": "Notiz zum Risiko", + "Overall": "Insgesamt", + "The worst of the six statuses, calculated by the server": "De schlechtste vun de sechs Statussen, vum Server berechent", + "Health: money": "Zoustand: Suen", + "Copied from the newest status report": "Aus dem neiste Statusbericht iwwerholl", + "Health: organisation": "Zoustand: Organisatioun", + "Health: time": "Zoustand: Zäit", + "Health: information": "Zoustand: Informatioun", + "Health: quality": "Zoustand: Qualitéit", + "Health: risk": "Zoustand: Risiko", + "Health: overall": "Zoustand: insgesamt", + "Health: report date": "Zoustand: Berichtsdatum", + "The date of the newest status report": "Den Datum vum neiste Statusbericht", + "New report": "Neie Bericht", + "Only the project owner writes status reports.": "Nëmmen de Proprietär vum Projet schreift Statusberichter.", + "Latest report, {date}": "Leschte Bericht, {date}", + "Aspect": "Aspekt", + "Note": "Notiz", + "Report history": "Berichtsverlaf", + "Author": "Auteur", + "No status reports yet": "Nach keng Statusberichter", + "Write the first report": "Den éischte Bericht schreiwen", + "Choose a status for every aspect to save the report.": "Wielt fir all Aspekt e Status, fir de Bericht ze späicheren.", + "Suggested: on track.": "Virschlag: am Plang.", + "Suggested: at risk.": "Virschlag: a Gefor.", + "Suggested: off track.": "Virschlag: aus dem Plang.", + "1 task is past its due date.": "1 Aufgab ass iwwerfälleg.", + "{count} tasks are past their due date.": "Iwwerfälleg Aufgaben: {count}.", + "The end date has passed with 1 open task.": "Den Enndatum ass mat 1 oppener Aufgab iwwerschratt.", + "The end date has passed with {count} open tasks.": "Den Enndatum ass iwwerschratt, oppe Aufgaben: {count}.", + "No open task is past its due date.": "Keng oppe Aufgab ass iwwerfälleg.", + "The highest open risk, \"{title}\", scores {score}.": "Dat héchst oppent Risiko, \"{title}\", huet {score} Punkten.", + "There are no open risks.": "Et gi keng oppe Risiken.", + "Costs are at {percent}% of the budget.": "D'Käschte leien op {percent}% vum Budget.", + "No suggestion: the project has no budget.": "Kee Virschlag: de Projet huet kee Budget.", + "No suggestion: no costs are recorded for this project yet.": "Kee Virschlag: fir dëse Projet sinn nach keng Käschten erfaasst.", + "The report was not saved. Only the project owner can write status reports.": "De Bericht gouf net gespäichert. Nëmmen de Proprietär vum Projet kann Statusberichter schreiwen.", + "No report": "Kee Bericht", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Eng Grupp vu Projeten, déi vun deene selwechte Leit gefouert ginn, zum Beispill eng Abteilung oder e Programm. Seng Responsabel liesen all Projet dran.", + "The name of the portfolio": "Den Numm vum Portfolio", + "What the portfolio holds and who runs it": "Wat am Portfolio ass a wien et féiert", + "A colour for the portfolio's section in project lists": "Eng Faarf fir d'Sektioun vum Portfolio a Projetlëschten", + "Managers": "Responsabel", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-Benotzer-IDe vun de Leit, déi de Portfolio féieren", + "Order": "Reiefolleg", + "Where the portfolio comes in project lists, lowest first": "Wou de Portfolio a Projetlëschte steet, déi niddregst als éischt", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Déi eege Risikoskala vun dësem Portfolio als JSON, an der selwechter Form wéi déi fir déi ganz App. Eidel heescht d'Skala vun der App.", + "Portfolio readers": "Portfolio-Lieser", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-Benotzer-IDe vun de Responsabele vum Portfolio vum Projet", + "The portfolio this project belongs to": "De Portfolio, zu deem dëse Projet gehéiert", + "No portfolio": "Kee Portfolio", + "All portfolios": "All Portfolioen", + "You read this project as a manager of its portfolio. Only its members change it.": "Dir liest dëse Projet als Responsabel vu sengem Portfolio. Nëmme seng Memberen änneren en.", + "Portfolios": "Portfolioen", + "Portfolio status": "Portfoliostatus", + "No portfolios yet": "Nach keng Portfolioen", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "En Administrateur füügt Portfolioen ënner Projeten, Portfolioen derbäi. Projete vun engem Portfolio stinn hei mat hirem Status.", + "Roll-up": "Resumé", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} am Plang, {atRisk} a Gefor, {offTrack} net am Plang, {noReport} ouni Bericht", + "No project in this portfolio that you can read.": "Kee Projet an dësem Portfolio, deen s du liese kanns.", + "Start": "Ufank", + "End": "Enn", + "Budget": "Budget", + "Last report": "Leschte Bericht", + "Out of date": "Veralt", + "Portfolio timeline": "Portfolio-Zäitachs", + "Zoom": "Zoom", + "Could not load the timeline": "D'Zäitachs konnt net geluede ginn", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "En Administrateur füügt Portfolioen ënner Projeten, Portfolioen derbäi. Projete vun engem Portfolio stinn hei op enger Zäitachs.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Maach e Projet op fir seng Phasen an Aufgaben ze gesinn. D'Zäitachs ass nëmme fir ze liesen.", + "Phase: {title}": "Phas: {title}", + "Left out because you cannot read them: {count} projects": "Ausgelooss, well s du se net liese kanns: {count} Projeten", + "Week": "Woch", + "Day": "Dag", + "Month": "Mount", + "Please try again later.": "Probéier w.e.g. méi spéit nach eng Kéier.", + "Status reports": "Statusberichter", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "No wéi vill Deeg de leschte Statusbericht vun engem Projet an der Portfolio-Iwwersiicht als veralt markéiert gëtt", + "Reporting period (days)": "Berichtzäitraum (Deeg)", + "The reporting period is a whole number of days from 1 to 365.": "De Berichtzäitraum ass eng ganz Zuel vun Deeg vun 1 bis 365.", + "Reporting period saved": "Berichtzäitraum gespäichert", + "The reporting period was not saved. Please try again.": "De Berichtzäitraum gouf net gespäichert. Probéier nach eng Kéier.", + "Every project of a portfolio with its status per aspect, rolled up.": "All Projet vun engem Portfolio mat sengem Status pro Aspekt, zesummegefaasst.", + "The projects of a portfolio on one timeline.": "D'Projete vun engem Portfolio op enger Zäitachs.", + "Phases": "Phasen", + "Add phase": "Phas derbäisetzen", + "No phases yet": "Nach keng Phasen", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Deel de Projet a Phasen op, wéi Initiatioun, Definitioun an Ëmsetzung. Eng Phas gëtt zougemaach, soubal hiert Ofschlossdokument eropgelueden ass.", + "{hours} hours": "{hours} Stonnen", + "Concluding document: {title}": "Ofschlossdokument: {title}", + "Concluding document missing": "Ofschlossdokument feelt", + "Move {title} up": "{title} no uewen", + "Move {title} down": "{title} no ënnen", + "Close phase": "Phas zoumaachen", + "Phase": "Phas", + "Files": "Fichieren", + "Notes": "Notizen", + "Audit trail": "Audit-Protokoll", + "Edit phase": "Phas beaarbechten", + "Name": "Numm", + "Budget hours": "Budgetstonnen", + "Could not save the phase. Please try again.": "D'Phas konnt net gespäichert ginn. Probéier nach eng Kéier.", + "Close phase {title}": "Phas {title} zoumaachen", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Eng Phas gëtt mat hirem Ofschlossdokument zougemaach: lued et hei erop oder wiel ee vun de Fichiere vun der Phas.", + "Concluding document": "Ofschlossdokument", + "This phase has no files yet.": "Dës Phas huet nach keng Fichieren.", + "Upload a document": "Dokument eroplueden", + "The document was not uploaded. Please try again.": "D'Dokument gouf net eropgelueden. Probéier nach eng Kéier.", + "Upload the concluding document before you close this phase.": "Lued d'Ofschlossdokument erop, ier s du dës Phas zoumëss.", + "This phase cannot be closed from its current status.": "Dës Phas kann net aus hirem aktuelle Status zougemaach ginn.", + "The phase was not closed. Please try again.": "D'Phas gouf net zougemaach. Probéier nach eng Kéier.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "D'ID vum Fichier op dëser Phas, deen se ofschléisst. D'Phas kann eréischt ofgeschloss ginn, wann se gesat ass an de Fichier ugehaang ass.", + "Import from Microsoft Project": "Aus Microsoft Project importéieren", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Wielt e Plang, deen aus Microsoft Project am XML-Format gespäichert gouf. Näischt gëtt importéiert, ier Dir confirméiert.", + "Plan file": "Plangfichier", + "What the import creates": "Wat den Import uleet", + "Tasks": "Aufgaben", + "Sub-tasks": "Ënneraufgaben", + "Milestones": "Meilesteng", + "Links": "Verknäppungen", + "Already imported, updated in place: {count}": "Scho importéiert, op der Plaz aktualiséiert: {count}", + "What does not carry over": "Wat net iwwerholl gëtt", + "Tasks with resources, which are not imported: {count}": "Aufgabe mat Ressourcen, déi net importéiert ginn: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Aufgabe méi déif wéi Niveau 3, ënner hir Aufgab vum Niveau 2 gesat: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Verknäppungen ausser Enn-Ufank, als verwandt Verknäppungen importéiert: {count}", + "Link lags, which are dropped: {count}": "Verzögerunge vu Verknäppungen, déi ewechfalen: {count}", + "Links to a summary task, which are not imported: {count}": "Verknäppungen op eng Resuméaufgab, déi net importéiert ginn: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Verknäppungen op Aufgaben ausserhalb vun dësem Plang, déi net importéiert ginn: {count}", + "No longer in the plan": "Net méi am Plang", + "These stay in the project; remove them yourself if they are no longer needed.": "Dës bleiwen am Projet; läscht se selwer, wann se net méi gebraucht ginn.", + "Import": "Importéieren", + "Close": "Zoumaachen", + "The plan is imported: {created} created, {updated} updated.": "De Plang ass importéiert: {created} ugeluecht, {updated} aktualiséiert.", + "Links that would close a loop were left out: {count}": "Verknäppungen, déi eng Schleef zoumaache géifen, goufen ausgelooss: {count}", + "The import stopped part-way. Run it again to finish it.": "Den Import ass ënnerwee stoe bliwwen. Start en nach eng Kéier, fir en ofzeschléissen.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Späichert de Plang a Microsoft Project mat Fichier, Späicheren ënner, XML-Format, an importéiert dee Fichier.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Dëse Fichier deklaréiert en DOCTYPE oder Entitéiten, déi net akzeptéiert ginn.", + "The file is larger than 10 MB.": "De Fichier ass méi grouss wéi 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "De Plang huet méi wéi 2.000 Aufgaben, méi wéi een Import hëlt.", + "This file is not a Microsoft Project plan in XML format.": "Dëse Fichier ass kee Microsoft-Project-Plang am XML-Format.", + "Choose a file to import.": "Wielt e Fichier fir ze importéieren.", + "Only the project owner can import a plan.": "Nëmmen de Proprietär vum Projet kann e Plang importéieren.", + "The plan could not be read. Please try again.": "De Plang konnt net gelies ginn. Probéiert w.e.g. nach eng Kéier.", + "Linked case: {title}": "Verknäppte Fall: {title}", + "Linked to a case": "Mat engem Fall verknäppt", + "Hand over to case": "Dem Fall iwwerginn", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopéiert all Fichier vum Projet a senge Aufgaben, an e Fichier deen de Projet beschreift, onverännert an de verknäppte Fall.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopéiert Fichieren: {count}", + "Files that failed: {names}": "Fichieren déi feelgeschloen hunn: {names}", + "The handover failed. Please try again.": "D'Iwwergab ass feelgeschloen. Probéiert w.e.g. nach eng Kéier.", + "The linked case could not be found, or you cannot open it.": "De verknäppte Fall gouf net fonnt, oder Dir kënnt en net opmaachen.", + "Case handovers": "Iwwergabe fir de Fall", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "All Iwwergab vun de Fichieren an de Metadate vum Projet u säi Fall: wéini, vu wiem, u wéi ee Fall, all kopéierte Fichier mat sengem SHA-256, an d'Fichieren déi feelgeschloen hunn.", + "Finance": "Finanzen", + "Add cost line": "Käschtelinn derbäisetzen", + "Delivery terms": "Liwwerkonditiounen", + "Billing model": "Ofrechnungsmodell", + "Budget in euro": "Budget an Euro", + "Budget in hours": "Budget an Stonnen", + "Hourly rate in euro": "Stonnesaz an Euro", + "Planned start": "Geplangte Start", + "Planned end": "Geplangt Enn", + "Planned dates": "Geplangten Datumer", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Kee Budget ofgemaach", + "Hours": "Stonnen", + "Only the project owner and the portfolio managers see the amounts.": "Nëmmen de Projetbesëtzer an d'Portfoliomanager gesinn d'Beträg.", + "Budget against cost per category": "Budget géint Käschte pro Kategorie", + "Labour (booked time)": "Aarbecht (gebuchten Zäit)", + "No category": "Keng Kategorie", + "Hours are not available": "D'Stonnen sinn net disponibel", + "Not yet assigned to a category": "Nach keng Kategorie zougewisen", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} ausginn, {remaining} iwwreg", + "Budget against cost per phase": "Budget géint Käschte pro Phas", + "No phase": "Keng Phas", + "Cost lines": "Käschtelinnen", + "From the finance system": "Aus dem Finanzsystem", + "Edit cost line {amount}": "Käschtelinn {amount} beaarbechten", + "No cost lines yet": "Nach keng Käschtelinnen", + "Commitments": "Engagementer", + "Actual cost": "Tatsächlech Käschten", + "Forecast": "Prognos", + "Remaining": "Iwwreg", + "Not planned yet": "Nach net geplangt", + "{start} to {end}": "{start} bis {end}", + "The terms were not saved. Please try again.": "D'Konditioune goufen net gespäichert. Probéier nach eng Kéier.", + "Terms saved": "Konditioune gespäichert", + "Fixed price": "Fixpräis", + "Hourly": "Pro Stonn", + "Not billed": "Net ofgerechent", + "Commitment": "Engagement", + "Edit cost line": "Käschtelinn beaarbechten", + "Kind": "Aart", + "Amount in euro": "Betrag an Euro", + "Remove": "Ewechhuelen", + "Could not save the cost line. Only the project owner changes the money of a project.": "D'Käschtelinn konnt net gespäichert ginn. Nëmmen de Projetbesëtzer ännert d'Suen vun engem Projet.", + "Could not remove the cost line. Please try again.": "D'Käschtelinn konnt net ewechgeholl ginn. Probéier nach eng Kéier.", + "{amount} over budget": "{amount} iwwer dem Budget", + "Cost categories": "Käschtekategorien", + "The categories every project splits its budget and costs into, one per line": "D'Kategorien, an déi all Projet säi Budget a seng Käschten opdeelt, eng pro Linn", + "Categories": "Kategorien", + "Give at least one category, each name once.": "Gëff mindestens eng Kategorie un, all Numm eemol.", + "Cost categories saved": "Käschtekategorie gespäichert", + "The cost categories were not saved. Please try again.": "D'Käschtekategorie goufen net gespäichert. Probéier nach eng Kéier.", + "Finance line": "Finanzlinn", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "E Geldbetrag vun engem Projet: e Budget, en Engagement, tatsächlech Käschten oder eng Prognos, an enger Käschtekategorie an optional an enger Phas. Erfaasst vum Projetbesëtzer oder vum Finanzsystem iwwer d'Integratiouns-App geschéckt.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "De Projet, zu deem de Betrag gehéiert. Eidel fir eng Linn aus dem Finanzsystem, där hir Projetsnummer zu kengem Projet passt.", + "The phase this amount belongs to, if any": "D'Phas, zu där de Betrag gehéiert, wann et eng gëtt", + "The cost category, one of the categories the admin set up": "D'Käschtekategorie, eng vun de Kategorien, déi den Admin ageriicht huet", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Ob de Betrag e Budget, en Engagement, tatsächlech Käschten oder eng Prognos ass", + "Amount": "Betrag", + "The amount in the reporting currency (euro)": "De Betrag an der Rapportwärung (Euro)", + "The date the amount was booked or is expected": "Den Datum, un deem de Betrag gebucht gouf oder erwaart gëtt", + "What the amount is for": "Fir wat de Betrag ass", + "Whether a person entered the line or the finance system sent it": "Ob eng Persoun d'Linn erfaasst huet oder d'Finanzsystem se geschéckt huet", + "Entered by hand": "Vun Hand erfaasst", + "Finance line id": "ID vun der Finanzlinn", + "The finance system's own id of this line. One imported line per id.": "Déi eege ID vun dëser Linn am Finanzsystem. Eng importéiert Linn pro ID.", + "Project number": "Projetsnummer", + "The project number the finance system sent, matched against the project key": "D'Projetsnummer, déi d'Finanzsystem geschéckt huet, mam Projetsschlëssel verglach", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "De Portfolio vum Projet vun der Linn, vum Projet iwwerholl, sou datt d'Portfoliosummen ee Filter brauchen", + "Finance readers": "Finanzlieser", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-Benotzer-UIDen vun de Leit, déi dëse Betrag gesi däerfen: de Projetbesëtzer an d'Manager vu sengem Portfolio", + "Project owner": "Projetbesëtzer", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-Benotzer-UID vum Projetbesëtzer, deen manuell Linnen änneren an ewechhuele kann", + "How the client pays: not billed, a fixed price, or by the hour.": "Wéi de Client bezillt: net ofgerechent, Fixpräis oder pro Stonn.", + "Portfolio finance": "Portfoliofinanzen", + "You cannot see the money of any project in this portfolio": "Du gesäis d'Suen vu kengem Projet an dësem Portfolio", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "De Server huet Käschtelinne vu Projeten ausserhalb vun dësem Portfolio geschéckt, dofir kéinten dës Summe falsch sinn.", + "Projects left out because you cannot see their money: {count}": "Projeten ausgelooss, well s du hir Suen net gesäis: {count}", + "Unmatched finance lines": "Net zougeuerdent Finanzlinnen", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, Engagementer, tatsächlech Käschten a Prognos iwwer e Portfolio zesummegezielt.", + "Subprojects": "Ënnerprojeten", + "{done} of {total}": "{done} vun {total}", + "{done} of {total} tasks done, including subprojects": "{done} vun {total} Aufgaben erleedegt, Ënnerprojeten inbegraff", + "Show the subprojects of {title}": "Ënnerprojete vun {title} weisen", + "Hide the subprojects of {title}": "Ënnerprojete vun {title} verstoppen", + "Part of": "Deel vun", + "No parent project": "Keen iwwergeuerdente Projet", + "A project cannot sit under one of its own subprojects.": "E Projet kann net ënner engem vu sengen eegenen Ënnerprojete leien.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projete ginn héchstens dräi Niveaue déif verschachtelt: Programm, Projet an Ënnerprojet.", + "Parent project": "Iwwergeuerdente Projet", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "De Projet, ënner deem dëse Projet läit, wéi e Programm. Projete ginn héchstens dräi Niveaue déif verschachtelt.", + "Yes": "Jo", + "No": "Nee", + "{label} (required)": "{label} (obligatoresch)", + "{label} is required": "{label} ass obligatoresch", + "Project field": "Projetsfeld", + "A field an admin adds to every project, such as a policy area or a contract value.": "E Feld, dat en Admin zu all Projet bäisetzt, wéi e Politikberäich oder e Kontraktwäert.", + "Key": "Schlëssel", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "De feste Numm, ënner deem de Wäert gespäichert gëtt, a lower camel case. Behal en, soubal Projeten en benotzen.", + "Label": "Bezeechnung", + "The name people see next to the field": "Den Numm, deen d'Leit nieft dem Feld gesinn", + "What the field holds": "Wat d'Feld enthält", + "Text": "Text", + "Number": "Zuel", + "Choice": "Auswiel", + "Person": "Persoun", + "Yes or no": "Jo oder nee", + "Options": "Optiounen", + "The choices of a choice field": "D'Optioune vun engem Auswielfeld", + "Required": "Obligatoresch", + "Whether a project must fill in the field": "Ob e Projet d'Feld ausfëlle muss", + "Where the field appears, lowest first": "Wou d'Feld erschéngt, dat niddregst fir d'éischt", + "Applies to": "Gëllt fir", + "What the field is added to": "Zu wat d'Feld bäigesat gëtt", + "Custom fields": "Eege Felder", + "The values of the project fields an admin defined, keyed by the field's key.": "D'Wäerter vun de Projetsfelder, déi en Admin definéiert huet, no dem Schlëssel vum Feld.", + "Project fields": "Projetsfelder", + "Related": "Verbonnen", + "Remove link": "Link ewechhuelen", + "Link type": "Linktyp", + "Relates to": "Hänkt zesumme mat", + "Duplicates": "Dupliziert", + "Project key": "Projetsschlëssel", + "Every task number starts with it, such as VERG-42.": "All Aufgabennummer fänkt domat un, zum Beispill VERG-42.", + "This key is already used by another project.": "Dëse Schlëssel gëtt schonn vun engem anere Projet benotzt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Benotzt 2 bis 10 Buschtawen an Zifferen, déi mat engem Buschtaf ufänken.", + "The key cannot change once tasks carry it.": "De Schlëssel kann net méi änneren, soubal Aufgaben en droen.", + "Project saved. The existing tasks get their numbers in the background.": "Projet gespäichert. Déi bestoend Aufgaben kréien hir Nummeren am Hannergrond.", + "Next task number": "Nächst Aufgabennummer", + "The number the next task of this project gets in its key. Only the system writes it.": "D’Nummer, déi déi nächst Aufgab vun dësem Projet an hirem Schlëssel kritt. Just de System schreift se.", + "Restore {title}": "{title} restauréieren", + "Restore": "Restauréieren", + "Project restored": "Projet restauréiert", + "Could not restore the project": "De Projet konnt net restauréiert ginn", + "Bring this project back to the active list.": "Dëse Projet zréck an d’Lëscht vun den aktive Projeten huelen.", + "Restore project": "Projet restauréieren", + "Request reason": "Grond vun der Ufro", + "Why the requester needs this project. Filled in when the project is requested.": "Firwat den Ufroesteller dëse Projet brauch. Gëtt bei der Ufro ausgefëllt.", + "Reviewed by": "Gepréift vun", + "The user who approved or rejected the request.": "De Benotzer, deen d’Ufro guttgeheescht oder ofgeleent huet.", + "Reviewed at": "Gepréift den", + "When the request was approved or rejected.": "Wéini d’Ufro guttgeheescht oder ofgeleent gouf.", + "Review note": "Notiz vun der Préifung", + "The reviewer's reason, shown to the requester when a request is not approved.": "De Grond vum Préifer, deen den Ufroesteller gesäit, wann eng Ufro net guttgeheescht gëtt.", + "Members of these groups": "Membere vun dëse Gruppen", + "Groups that may create projects": "Gruppen, déi Projete maache däerfen", + "The group {group} no longer exists. Save to remove it.": "De Grupp {group} gëtt et net méi. Späichert fir en ze läschen.", + "Review project request": "Projetsufro préiwen", + "Requested by": "Gefrot vun", + "Why it is needed": "Firwat en néideg ass", + "Desired start date": "Gewënschten Ufanksdatum", + "Why is it not approved?": "Firwat gëtt en net guttgeheescht?", + "Give a reason. The requester sees it.": "Gitt e Grond un. Den Ufroesteller gesäit en.", + "Approve": "Guttheeschen", + "Reject": "Ofleenen", + "Reject request": "Ufro ofleenen", + "The review was not saved. Try again.": "D’Préifung gouf net gespäichert. Probéiert nach eng Kéier.", + "This project is waiting for review": "Dëse Projet waart op d’Préifung", + "This request was not approved": "Dës Ufro gouf net guttgeheescht", + "Reason: {note}": "Grond: {note}", + "Review request": "Ufro préiwen", + "Request a project": "E Projet ufroen", + "Step {step} of 2": "Schrëtt {step} vun 2", + "Why is this project needed?": "Firwat ass dëse Projet néideg?", + "Give a reason. The reviewer reads it.": "Gitt e Grond un. De Préifer liest en.", + "Back": "Zréck", + "Next": "Weider", + "Send request": "Ufro schécken", + "The request was not sent. Try again.": "D’Ufro gouf net geschéckt. Probéiert nach eng Kéier.", + "Requested": "Gefrot", + "Not approved": "Net guttgeheescht", + "Your request was sent": "Är Ufro gouf geschéckt", + "Let everyone else request a project": "All déi aner däerfen e Projet ufroen", + "Add a task": "Aufgab derbäisetzen", + "Delete task": "Aufgab läschen", + "Edit task": "Aufgab änneren", + "Write": "Schreiwen", + "Preview": "Virschau", + "Markdown works here: headings, lists and links.": "Hei funktionéiert Markdown: Iwwerschrëften, Lëschten a Linken.", + "Could not save the task. Please try again.": "D'Aufgab konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Op \"{title}\" ass Zäit agedroen, dofir kann se net geläscht ginn. Dir kënnt se amplaz annuléieren: d'Zäitagäng bleiwen.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "\"{title}\" läschen? Hir Linken op aner Aufgaben ginn och ewechgeholl. Dat kann net réckgängeg gemaach ginn.", + "Keep task": "Aufgab behalen", + "Cancel task": "Aufgab annuléieren", + "Only the reporter, the project owner or an admin can delete this task.": "Just déi Persoun déi se gemellt huet, de Projetsbesëtzer oder en Admin kann dës Aufgab läschen.", + "Could not delete the task. Please try again.": "D'Aufgab konnt net geläscht ginn. Probéiert w.e.g. nach eng Kéier.", + "Could not cancel the task. Please try again.": "D'Aufgab konnt net annuléiert ginn. Probéiert w.e.g. nach eng Kéier.", + "Responsible": "Verantwortlech", + "Also working on this": "Schaffen och dorun", + "Labels": "Etiketten", + "Could not change the priority. Please try again.": "D'Prioritéit konnt net geännert ginn. Probéiert w.e.g. nach eng Kéier.", + "Other project members who work on this task alongside the person responsible.": "Aner Projetsmemberen, déi mat der verantwortlecher Persoun un dëser Aufgab schaffen.", + "Duplicate": "Duplizéieren", + "Could not copy the task. Please try again.": "D'Aufgab konnt net kopéiert ginn. Probéiert w.e.g. nach eng Kéier.", + "Subtasks": "Ënneraufgaben", + "{done} of {total} done": "{done} vun {total} fäerdeg", + "Add a subtask": "Ënneraufgab derbäisetzen", + "Checklist": "Checklëscht", + "Checklist item actions": "Aktioune fir de Lëschtenelement", + "Add a checklist item": "Element op d'Checklëscht setzen", + "Subtasks: {estimate} estimated, {logged} logged": "Ënneraufgaben: {estimate} geschat, {logged} agedroen", + "Total estimate: {total}": "Gesamtschätzung: {total}", + "Part of {title}": "Deel vun {title}", + "Checklist: {count} done": "Checklëscht: {count} fäerdeg", + "This task has subtasks: {count}.": "Dës Aufgab huet Ënneraufgaben: {count}.", + "Keep subtasks as separate tasks": "Ënneraufgaben als eege Aufgabe behalen", + "Delete subtasks too": "Ënneraufgaben och läschen", + "Copy of {title}": "Kopie vun {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "D'Aufgab gouf kopéiert, awer net all hir Ënneraufgaben. Kontrolléiert d'Kopie.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Kleng Schrëtt an der Aufgab. All Element huet eng ID, en Text an ob et fäerdeg ass.", + "Open work per person and per project.": "Oppen Aarbecht pro Persoun a pro Projet.", + "View": "Usiicht", + "By person": "No Persoun", + "By project": "No Projet", + "Hours left": "Verbleiwend Stonnen", + "Tasks without an estimate": "Aufgabe ouni Schätzung", + "Due in 14 days": "Fälleg an 14 Deeg", + "Shared": "Gedeelt", + "Unassigned": "Net zougewisen", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Et gëtt d'Aarbecht an de Projete gewisen, déi s du gesäis. Stonnen zielen fir déi verantwortlech Persoun; gedeelt Aufgabe ginn ouni Stonnen gezielt.", + "No open work in these projects.": "Keng oppen Aarbecht an dëse Projeten.", + "Open work": "Oppen Aarbecht", + "{count} open tasks": "{count} oppen Aufgaben", + "Create a project to see capacity here.": "Maach e Projet un, fir hei d'Kapazitéit ze gesinn.", + "My tasks": "Meng Aufgaben", + "Show all my tasks": "All meng Aufgabe weisen", + "No tasks assigned to you": "Dir sinn keng Aufgaben zougewisen", + "Browse projects": "Projete duerchsichen", + "Later": "Méi spéit", + "Due {date}": "Fälleg {date}", + "Could not change the status. Please try again.": "De Status konnt net geännert ginn. Probéier nach eng Kéier.", + "Completed today": "Haut ofgeschloss", + "My open tasks": "Meng oppen Aufgaben", + "My overdue tasks": "Meng iwwerfälleg Aufgaben", + "My tasks in progress": "Meng Aufgaben amgaang", + "Pin to the top": "Uewen upinnen", + "Unpin": "Lassmaachen", + "Pinned": "Ugepinnt", + "Actions for {title}": "Aktioune fir {title}", + "Could not save your project order. Please try again.": "D'Reiefolleg vun denge Projete konnt net gespäichert ginn. Probéier nach eng Kéier.", + "No boards yet": "Nach keng Boards", + "Create a project to get a board.": "Maach e Projet un, fir e Board ze kréien.", + "Use the Projects page to create and manage your projects and tasks.": "Benotz d'Säit Projeten, fir deng Projeten an Aufgaben unzeleeën an ze geréieren.", + "Go to projects": "Bei d'Projeten", + "You are not a member of any projects yet.": "Du bass nach a kengem Projet Member.", + "Could not search for users. Please try again.": "D'Benotzer konnte net gesicht ginn. Probéier nach eng Kéier.", + "Project creation is restricted to administrators.": "Just Administrateure kënne Projeten uleeën.", + "Only the project owner or an administrator can delete this project.": "Just de Projetsbesëtzer oder en Administrateur kann dëse Projet läschen.", + "No projects are available to you yet. Ask an administrator to create one.": "Et sinn nach keng Projete fir dech disponibel. Fro en Administrateur, fir een unzeleeën.", + "Due: {date}": "Fälleg: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Aufgaben mat engem Start- oder Fällegkeetsdatum stinn op der Zäitlinn. Setz Datumer derbäi, fir se hei ze gesinn.", + "You do not have access to this project.": "Du hues keen Zougang zu dësem Projet.", + "Zoom level": "Zoomniveau", + "Unscheduled": "Net geplangt", + "Start: {date}": "Start: {date}", + "Today": "Haut", + "No scheduled tasks": "Keng geplangt Aufgaben", + "An unexpected error occurred.": "En onerwaarte Feeler ass opgetrueden.", + "Column {number} name": "Numm vun der Kolonn {number}", + "Failed to save creation policy": "D'Reegel fir d'Uleeën konnt net gespäichert ginn", + "All authenticated users": "All ugemellt Benotzer", + "Control who may create new projects": "Leeë fest, wien nei Projeten uleeë kann", + "Administrators only": "Just Administrateuren", + "Project creation": "Projeten uleeën", + "Allow project creation": "Uleeë vu Projeten erlaben", + "Creation policy saved successfully": "Reegel fir d'Uleeë gespäichert", + "Initializing…": "Gëtt gestart…", + "e.g. 2h 30m, 90m, 1.5h": "z. B. 2h 30m, 90m, 1.5h", + "Log time": "Zäit buchen", + "Save estimate": "Schätzung späicheren", + "Logged: {logged}": "Gebucht: {logged}", + "over by {amount}": "{amount} driwwer", + "Time tracking": "Zäiterfaassung", + "Estimate": "Schätzung", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Gëff eng gëlteg Schätzung an (z. B. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Gëff eng gëlteg Dauer an (z. B. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "D'Zäitbuchung konnt net gespäichert ginn. Probéier nach eng Kéier.", + "Edit time entry": "Zäitbuchung änneren", + "Duration": "Dauer", + "Date range": "Zäitraum", + "Last week": "Lescht Woch", + "No time logged": "Keng Zäit gebucht", + "Log time on a task to see it here.": "Buch Zäit op eng Aufgab, fir se hei ze gesinn.", + "To date": "Bis Datum", + "This week": "Dës Woch", + "Total: {total}": "Total: {total}", + "From date": "Vum Datum", + "Custom range": "Eegenen Zäitraum", + "All time": "Ganz Zäit", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Eng Aufgab konnt net geläscht ginn, dofir kënnen Donnéeë bleiwen. Läsch de Projet nach eng Kéier.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Eng Zäitbuchung konnt net geläscht ginn, dofir kënnen Donnéeë bleiwen. Läsch de Projet nach eng Kéier.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Eng Kolonn konnt net geläscht ginn, dofir kënnen Donnéeë bleiwen. Läsch de Projet nach eng Kéier.", + "Could not delete the project. Please try again.": "De Projet konnt net geläscht ginn. Probéier nach eng Kéier.", + "Notification settings": "Notifikatiounsastellungen", + "Configure when due-date reminders are sent": "Leeë fest, wéini Erënnerunge fir Fällegkeetsdatume geschéckt ginn", + "Due-date reminder lead time (hours)": "Virlafzäit vun der Erënnerung (Stonnen)", + "Lead time must be between 1 and 336 hours": "D'Virlafzäit muss tëscht 1 an 336 Stonne leien", + "Reminder lead time saved successfully": "Virlafzäit vun der Erënnerung gespäichert", + "Failed to save reminder lead time": "D'Virlafzäit vun der Erënnerung konnt net gespäichert ginn", + "Notifications": "Notifikatiounen", + "Notify me 1 day before a task's due date": "Informéier mech 1 Dag virum Fällegkeetsdatum vun enger Aufgab", + "Draft": "Entworf", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Ob d'Stonn en Entworf ass, deen nëmmen hiren Enseignant gesäit, stattfënnt oder ausfält.", + "New release": "Nei Versioun", + "Roadmap chart. The same releases and epics are listed below.": "Roadmap-Diagramm. Déi selwecht Versiounen an Epics stinn ënnen an enger Lëscht.", + "Nothing on the roadmap yet": "Nach näischt op der Roadmap", + "Releases with a target date and epics with dated tasks appear here.": "Hei erschénge Versioune mat engem Zildatum an Epics mat datéierten Aufgaben.", + "Releases": "Versiounen", + "No releases yet": "Nach keng Versiounen", + "Target date: {date}": "Zildatum: {date}", + "No target date": "Keen Zildatum", + "Edit {name}": "{name} beaarbechten", + "Mark {name} as released": "{name} als verëffentlecht markéieren", + "Mark as released": "Als verëffentlecht markéieren", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Nach keng Epics. Maacht eng Aufgab op, fir en Epic draus ze maachen.", + "Not scheduled yet": "Nach net geplangt", + "Planned": "Geplangt", + "Released": "Verëffentlecht", + "Edit release": "Versioun beaarbechten", + "Target date": "Zildatum", + "Could not save the release. Please try again.": "D'Versioun konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "Every task of this release is done or cancelled.": "All Aufgab vun dëser Versioun ass fäerdeg oder ofgebrach.", + "Not finished yet: {count}": "Nach net fäerdeg: {count}", + "What happens to these tasks?": "Wat geschitt mat dësen Aufgaben?", + "Move to {name}": "Op {name} réckelen", + "Remove the release": "D'Versioun ewechhuelen", + "Keep it on {name}": "Op {name} loossen", + "Could not mark the release as released. Please try again.": "D'Versioun konnt net als verëffentlecht markéiert ginn. Probéiert w.e.g. nach eng Kéier.", + "Roadmap": "Roadmap", + "Tasks or roadmap": "Aufgaben oder Roadmap", + "Release": "Versioun", + "Epic": "Epic", + "This task is an epic": "Dës Aufgab ass en Epic", + "A named, dated delivery of a project that its tasks are planned against.": "Eng benannt, datéiert Liwwerung vun engem Projet, op déi seng Aufgabe geplangt ginn.", + "Name of the release": "Numm vun der Versioun", + "The project this release belongs to": "De Projet, zu deem dës Versioun gehéiert", + "What this release delivers": "Wat dës Versioun liwwert", + "When work on the release starts": "Wéini d'Aarbecht un der Versioun ufänkt", + "The date the release is due": "Den Datum, bis wéini d'Versioun fäerdeg muss sinn", + "Whether the release is planned, released or archived": "Ob d'Versioun geplangt, verëffentlecht oder archivéiert ass", + "Released on": "Verëffentlecht den", + "When the release was marked as released": "Wéini d'Versioun als verëffentlecht markéiert gouf", + "The release this task is planned for": "D'Versioun, fir déi dës Aufgab geplangt ass", + "Board view options": "Uweisungsoptiounen vum Board", + "Colour cards": "Kaarte fierwen", + "No colour": "Keng Faarf", + "By label": "No Label", + "Swimlanes": "Swimlanes", + "No swimlanes": "Keng Swimlanes", + "By assignee": "No zougewisener Persoun", + "By epic": "No Epic", + "No assignee": "Net zougewisen", + "No epic": "Keen Epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kaarte bleiwen an der Zeil vun hirem Epic. Ännert den Epic op der Säit vun der Aufgab.", + "Hand over to": "Iwwerginn un", + "Could not save your board view. It applies until you reload.": "Är Board-Usiicht gouf net gespäichert. Se gëllt bis Dir nei lued.", + "Timetable wish": "Stonneplangwonsch", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "E Wonsch, deen de Generator berécksiichtegt. E strenge Wonsch hält en ëmmer an, e flexiblen do wou et geet.", + "Whether the wish is about a teacher, a group, a room or one activity": "Ob de Wonsch en Enseignant, eng Grupp, e Sall oder eng Aktivitéit betrëfft", + "Teacher": "Enseignant", + "Group": "Grupp", + "Reference": "Referenz", + "The user, group, room or activity the wish is about": "De Benotzer, d'Grupp, de Sall oder d'Aktivitéit, ëm déi et geet", + "What the wish asks for": "Wat de Wonsch freet", + "Not on these periods": "Net an dëse Stonnen", + "Preferably not on these periods": "Léiwer net an dëse Stonnen", + "At most a number of lessons a day": "Héchstens eng Zuel u Stonnen den Dag", + "No free periods between lessons": "Keng Fräistonnen tëscht de Stonnen", + "Always the same room": "Ëmmer dee selwechte Sall", + "Periods": "Stonnen", + "The periods of the week the wish is about, such as wed-5": "D'Stonnen vun der Woch, ëm déi et geet, zum Beispill wed-5", + "Limit": "Limit", + "The most lessons a day, for a wish of that kind": "Déi meescht Stonnen den Dag, fir e Wonsch vun där Aart", + "Strength": "Stäerkt", + "Whether the generator must keep the wish or should keep it": "Ob de Generator de Wonsch muss oder sollt anhalen", + "Hard": "Streng", + "Soft": "Flexibel", + "Weight": "Gewiicht", + "How much a soft wish counts, from 1 to 3": "Wéi vill e flexibele Wonsch zielt, vun 1 bis 3", + "Why the wish exists": "Firwat et de Wonsch gëtt", + "Timetable scenario": "Stonneplangszenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "E Wochemuster, vum Generator gemaach oder aus dem aktuelle Stonneplang iwwerholl. Et hält seng Agab a wéi gutt et d'Wënsch anhält.", + "The name timetablers know the scenario by": "Den Numm, ënner deem d'Planer d'Szenario kennen", + "Whether the generator made it or it came from the current timetable": "Ob de Generator et gemaach huet oder et aus dem aktuelle Stonneplang kënnt", + "Generated": "Generéiert", + "From the current timetable": "Aus dem aktuelle Stonneplang", + "Week of": "Woch vum", + "The Monday of the first week of the window": "De Méindeg vun der éischter Woch vun der Period", + "Window start": "Ufank vun der Period", + "The first day the week pattern applies to": "Den éischten Dag, fir deen d'Wochemuster gëllt", + "Window end": "Enn vun der Period", + "The last day the week pattern applies to": "De leschten Dag, fir deen d'Wochemuster gëllt", + "Waiting, generating, done, failed, or published as draft lessons": "Waart, gëtt generéiert, fäerdeg, feelgeschloen oder als Entworfsstonne publizéiert", + "Waiting": "Waart", + "Generating": "Gëtt generéiert", + "Failed": "Feelgeschloen", + "Published": "Publizéiert", + "Seed": "Startwäert", + "The number the generator starts from, so a run can be repeated": "D'Zuel, mat där de Generator ufänkt, sou datt e Laf ka widderholl ginn", + "Input": "Agab", + "The periods, rooms, lessons and wishes the scenario was made from": "D'Stonnen, Säll, Couren a Wënsch, aus deenen d'Szenario entstanen ass", + "Placements": "Placementer", + "Each lesson with the period and room it was given": "All Cours mat der Stonn an dem Sall, déi e krut", + "Unplaced lessons": "Net placéiert Couren", + "Lessons without a place, each with the hard wish that blocked it": "Couren ouni Plaz, all mat dem strenge Wonsch, deen en blockéiert huet", + "Broken wishes": "Verletzt Wënsch", + "The wishes this scenario breaks, with the lessons that break them": "D'Wënsch, déi dëst Szenario verletzt, mat de Couren, déi se verletzen", + "Measures": "Moossen", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Placéiert Couren, verletzt Wënsch, Fräistonnen, Couren den Dag a Sallbenotzung", + "Reason": "Grond", + "Why the run failed": "Firwat de Laf feelgeschloen ass", + "Published at": "Publizéiert den", + "When the scenario was written out as draft lessons": "Wéini d'Szenario als Entworfsstonne geschriwwe gouf", + "Edit wish": "Wonsch änneren", + "New wish": "Neie Wonsch", + "Hard: the generator always keeps it": "Fix: de Generator hält sech ëmmer drun", + "Soft: the generator keeps it where it can": "Flexibel: de Generator hält sech drun, wou e kann", + "Weight (1 to 3)": "Gewiicht (1 bis 3)", + "Most lessons a day": "Héchstens Stonnen den Dag", + "Period": "Stonn", + "{day} period {number}": "{day} Stonn {number}", + "Teacher (user name)": "Enseignant (Benotzernumm)", + "Activity (group:subject)": "Aktivitéit (Grupp:Fach)", + "Say who or what the wish is about.": "Gitt un, wien oder wat de Wonsch betrëfft.", + "Choose at least one period.": "Wielt mindestens eng Stonn.", + "The limit is a whole number of 1 or more.": "D'Limit ass eng ganz Zuel vun 1 oder méi.", + "Timetable": "Stonneplang", + "Wishes": "Wënsch", + "Timetable wishes": "Stonneplangwënsch", + "Generator run": "Generatorlaf", + "Generator progress": "Fortschrëtt vum Generator", + "The run failed: {reason}": "De Laf ass feelgeschloen: {reason}", + "{placed} of {lessons} lessons placed": "{placed} vun {lessons} Stonne placéiert", + "Generate again": "Nach eng Kéier generéieren", + "Generate": "Generéieren", + "Every lesson has a place.": "All Stonn huet eng Plaz.", + "Lesson": "Stonn", + "No free period and room": "Keng fräi Stonn a kee fräie Sall", + "Broken soft wishes": "Verletzt flexibel Wënsch", + "Every soft wish is kept.": "All flexibel Wonsch gëtt agehalen.", + "Wish": "Wonsch", + "Lessons": "Stonnen", + "Generating: {percent}% of the time budget used": "Gëtt generéiert: {percent}% vun der Zäit gebraucht", + "Waiting to start": "Waart op de Start", + "Published as draft lessons": "Als Entworfsstonne publizéiert", + "Could not read the scenario.": "De Szenario konnt net gelies ginn.", + "Could not start the run.": "De Laf konnt net gestart ginn.", + "Scenarios": "Szenarien", + "Timetable scenarios": "Stonneplangszenarien", + "Scenario": "Szenario", + "Take the current timetable": "Aktuelle Stonneplang iwwerhuelen", + "Could not take the current timetable.": "Den aktuelle Stonneplang konnt net iwwerholl ginn.", + "Broken hard wishes": "Verletzt haart Wënsch", + "Not on a period of the week grid": "Net op enger Stonn vum Wochegitter", + "Compare scenarios": "Szenarie vergläichen", + "Scenarios to compare": "Szenarien zum Vergläichen", + "Choose two or three scenarios to compare them.": "Wielt zwee oder dräi Szenarien fir se ze vergläichen.", + "Measure": "Moossgréisst", + "Best": "Beschte Wäert", + "Lessons that differ": "Stonnen, déi sech ënnerscheeden", + "No lesson differs.": "Keng Stonn ënnerscheet sech.", + "Not placed": "Net placéiert", + "{period} in {room}": "{period} am {room}", + "Lessons placed": "Placéiert Stonnen", + "Lessons without a place": "Stonnen ouni Plaz", + "Clashes": "Konflikter", + "Hard wishes broken": "Verletzt fix Wënsch", + "Soft wishes broken": "Verletzt flexibel Wënsch", + "Soft wishes broken, weighted": "Verletzt flexibel Wënsch, gewiicht", + "Free periods between lessons, all teachers": "Fräistonnen, all Enseignanten", + "Most free periods of one teacher": "Meeschte Fräistonne vun engem Enseignant", + "Most lessons of one group on a day": "Meeschte Stonne vun enger Grupp un engem Dag", + "Room use": "Sallbenotzung", + "Publish as draft lessons": "Als Entworfsstonne publizéieren", + "Draft lessons written: {count}": "Entworfsstonne geschriwwen: {count}", + "Could not publish the scenario.": "De Szenario konnt net publizéiert ginn.", + "Rules": "Reegelen", + "Rules for {column}": "Reegele fir {column}", + "When a card enters this column": "Wann eng Kaart an dës Kolonn kënnt", + "Action": "Aktioun", + "Set the priority": "Prioritéit setzen", + "Assign to": "Zouweisen un", + "Assign the person who moved the card": "Der Persoun zouweisen, déi d'Kaart verréckelt huet", + "Remove the assignee": "Zouweisung ewechhuelen", + "Add a label": "Label derbäisetzen", + "No longer a project member": "Net méi Member vum Projet", + "This label no longer exists": "Dëse Label gëtt et net méi", + "Add rule": "Reegel derbäisetzen", + "Remove rule": "Reegel ewechhuelen", + "No rules yet. Add one to change a card when it enters this column.": "Nach keng Reegelen. Setzt eng derbäi, fir eng Kaart ze änneren, wann se an dës Kolonn kënnt.", + "Could not save the rules. Please try again.": "D'Reegele konnten net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "1 rule runs when a card enters this column": "1 Reegel leeft, wann eng Kaart an dës Kolonn kënnt", + "{count} rules run when a card enters this column": "{count} Reegele lafen, wann eng Kaart an dës Kolonn kënnt", + "Rules applied: {changes}": "Reegelen applizéiert: {changes}", + "assigned to {name}": "zougewisen un {name}", + "assignee removed": "Zouweisung ewechgeholl", + "priority {priority}": "Prioritéit {priority}", + "label {label}": "Label {label}", + "What happens to a card when it enters this column, applied in list order.": "Wat mat enger Kaart geschitt, wann se an dës Kolonn kënnt, an der Reiefolleg vun der Lëscht.", + "Value": "Wäert", + "What the rule does to the card.": "Wat d'Reegel mat der Kaart mécht.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "D'Prioritéit, d'Benotzer-ID oder d'Label-ID, déi d'Aktioun benotzt; eidel bei Aktiounen ouni Wäert.", + "is not": "ass net", + "{dimension} is not": "{dimension} ass net", + "Saved filters": "Gespäichert Filteren", + "No saved filters yet": "Nach keng gespäichert Filteren", + "Save filter": "Filter späicheren", + "Rename \"{name}\"": "„{name}“ ëmbenennen", + "Delete \"{name}\"": "„{name}“ läschen", + "Clear filters": "Filteren eidel maachen", + "Showing {shown} of {total} tasks": "{shown} vun {total} Aufgabe gewisen", + "Me": "Ech", + "No date": "Keen Datum", + "Rename saved filter": "Gespäicherte Filter ëmbenennen", + "Share with the project": "Mam Projet deelen", + "Give the filter a name": "Gitt dem Filter en Numm", + "Could not save the filter. Please try again.": "De Filter konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "Some labels in \"{name}\" no longer exist and were left out.": "E puer Labelen an „{name}“ gëtt et net méi a si goufen ewechgelooss.", + "Could not delete the filter. Please try again.": "De Filter konnt net geläscht ginn. Probéiert w.e.g. nach eng Kéier.", + "Saved filter": "Gespäicherte Filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "E benannte Board-Filter vun engem Projet, privat fir déi Persoun, déi e gespäichert huet, ausser e gëtt mam Projet gedeelt.", + "The project whose board the filter applies to": "De Projet, op deem säi Board de Filter wierkt", + "The name the filter is listed under": "Den Numm, ënner deem de Filter an der Lëscht steet", + "Saved by": "Gespäichert vun", + "Nextcloud user id of the person who saved the filter": "Nextcloud-Benotzer-ID vun der Persoun, déi de Filter gespäichert huet", + "Shared with the project": "Mam Projet gedeelt", + "Whether every project member sees and applies the filter": "Ob all Projetmember de Filter gesäit an uwende kann", + "Criteria": "Critèren", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "De Filter: Zouweisung, Label, Prioritéit an Delai, all mat ass oder ass net an hire Wäerter", + "Cross-project view": "Projetiwwergräifend Usiicht", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Eng gespäichert Auswiel vu Projeten, där hir Aufgaben zesummen a Statusspalte gewise ginn, gedeelt mat de Leit, déi se nennt.", + "Shared with": "Gedeelt mat", + "The name the view is listed under": "Den Numm, ënner deem d'Usiicht opgelëscht ass", + "Nextcloud user id of the person who saved the view": "Nextcloud-Benotzer-ID vun der Persoun, déi d'Usiicht gespäichert huet", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-Benotzer-IDen vun de Leit, mat deenen d'Usiicht gedeelt ass", + "The projects whose tasks the view shows, at most twenty": "D'Projeten, där hir Aufgaben d'Usiicht weist, héchstens zwanzeg", + "1 project in this view is hidden from you.": "1 Projet an dëser Usiicht ass fir dech verstoppt.", + "{count} projects in this view are hidden from you.": "{count} Projeten an dëser Usiicht si fir dech verstoppt.", + "{project} has no column for {status}.": "{project} huet keng Spalt fir {status}.", + "This view does not exist or is not shared with you.": "Dës Usiicht gëtt et net oder se ass net mat dir gedeelt.", + "\"{task}\" moved to {status}.": "\"{task}\" op {status} geréckelt.", + "Project: {title}": "Projet: {title}", + "Cross-project views": "Projetiwwergräifend Usiichten", + "New view": "Nei Usiicht", + "Edit view": "Usiicht änneren", + "Delete view": "Usiicht läschen", + "Give the view a name": "Gëff der Usiicht en Numm", + "Pick at least one project": "Wiel mindestens ee Projet", + "A view shows at most {max} projects": "Eng Usiicht weist héchstens {max} Projeten", + "Could not save the view. Please try again.": "D'Usiicht konnt net gespäichert ginn. Prouf nach eng Kéier.", + "Could not delete the view. Please try again.": "D'Usiicht konnt net geläscht ginn. Prouf nach eng Kéier.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "\"{title}\" läschen? D'Projeten an hir Aufgabe bleiwe wéi se sinn.", + "People see the tasks of the projects they are in, never more.": "Jiddereen gesäit just d'Aufgabe vun de Projeten, an deenen hien ass.", + "No views yet. A view shows the tasks of several of your projects together.": "Nach keng Usiichten. Eng Usiicht weist d'Aufgabe vu méi Projete vun dir zesummen.", + "Projects in view: {count}": "Projeten an der Usiicht: {count}", + "Notify me when a task is assigned to me": "Informéier mech, wann mir eng Aufgab zougedeelt gëtt", + "Also send these to me by email": "Schéck mir dës och per E-Mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Setz eng E-Mail-Adress an dengen perséinlechen Nextcloud-Astellungen dobäi, fir E-Maile ze kréien.", + "Code link": "Code-Link", + "A commit, branch, merge request or issue in a code forge that works on a task.": "E Commit, eng Branche, eng Merge-Ufro oder en Issue op enger Code-Plattform, déi un enger Aufgab schafft.", + "The task the link belongs to": "D'Aufgab, zu där de Link gehéiert", + "The project of the task": "De Projet vun der Aufgab", + "Task key": "Aufgabeschlëssel", + "The task key the forge text named, such as VC-12": "Den Aufgabeschlëssel aus dem Text vun der Code-Plattform, z. B. VC-12", + "What the link points at": "Op wat de Link weist", + "Link": "Link", + "The address of the item in the forge": "D'Adress vum Element op der Code-Plattform", + "The commit message, branch name or merge request title": "D'Commit-Noriicht, den Numm vun der Branche oder den Titel vun der Merge-Ufro", + "Repository": "Repository", + "The repository, such as acme/portal": "De Repository, z. B. acme/portal", + "Forge id": "ID op der Plattform", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Déi eege ID vum Element op der Code-Plattform, z. B. github:acme/portal#42 oder e Commit-Hash", + "State": "Status", + "The state of a merge request or issue": "De Status vun enger Merge-Ufro oder engem Issue", + "Who made the commit or opened the merge request": "Wien de Commit gemaach oder d'Merge-Ufro opgemaach huet", + "When the commit was made or the merge request last changed": "Wéini de Commit gemaach gouf oder d'Merge-Ufro sech fir d'lescht geännert huet", + "Added by": "Dobäigesat vun", + "Whether a person added the link or the integration wrote it": "Ob eng Persoun de Link dobäigesat oder d'Integratioun e geschriwwen huet", + "Nextcloud user UIDs of project members": "Nextcloud-Benotzer-IDe vun de Projetsmemberen", + "Add link": "Link dobäisetzen", + "Added by hand": "Mat der Hand dobäigesat", + "Branch": "Branche", + "Code": "Code", + "Commit": "Commit", + "From the integration": "Vun der Integratioun", + "Link to a commit, branch or merge request": "Link op e Commit, eng Branche oder eng Merge-Ufro", + "Merge request": "Merge-Ufro", + "Merged": "Zesummegefouert", + "No code linked yet. Name {key} in a commit message or paste a link.": "Nach kee Code verlinkt. Nenn {key} an enger Commit-Noriicht oder paste e Link.", + "No code linked yet. Paste a link to a commit or merge request.": "Nach kee Code verlinkt. Paste e Link op e Commit oder eng Merge-Ufro.", + "Paste a web address that starts with https://.": "Paste eng Webadress, déi mat https:// ufänkt.", + "Remove link {title}": "Link {title} ewechhuelen", + "The link could not be added.": "De Link konnt net dobäigesat ginn.", + "The link could not be removed.": "De Link konnt net ewechgeholl ginn.", + "This link is already on the task.": "Dëse Link ass schonn un der Aufgab.", + "Code forges": "Code-Plattformen", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Verlinkt GitHub-Commits a Pull Requests mat Aufgaben. Integriq kritt d'Evenementer; planninq rifft GitHub ni op.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Luet d'Konfiguratioun erof an importéiert se an Integriq. Setzt dann e Geheimnis an der Regel \"Check the GitHub signature\" an.", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Setzt am GitHub dem Repository e Webhook mat dëser Adress an deemselwechte Geheimnis bäi. Wielt den Inhaltstyp application/json an d'Evenementer push a pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nennt den Aufgabeschlëssel, z. B. VC-12, an enger Commit-Noriicht, engem Branchennumm oder dem Titel vun engem Pull Request. De Link erschéngt dann bei där Aufgab.", + "Without Integriq, project members can still paste a link on the task page.": "Ouni Integriq kënnen d'Projetsmemberen ëmmer nach e Link op der Aufgabesäit pechen.", + "Download the Integriq configuration": "Integriq-Konfiguratioun eroflueden", + "Calendar": "Kalenner", + "Previous": "Virdrun", + "Calendar view": "Kalennerusiicht", + "Starts:": "Fänkt un:", + "No tasks with a date in this month.": "Keng Aufgabe mat engem Datum dëse Mount.", + "Week of {start} to {end}": "Woch vum {start} bis {end}", + "My calendar": "Mäi Kalenner", + "Show as list": "Als Lëscht weisen", + "Show as calendar": "Am Kalenner weisen", + "Open my calendar": "Mäi Kalenner opmaachen", + "Nextcloud Tasks": "Nextcloud Aufgaben", + "Show my tasks in Nextcloud Tasks": "Meng Aufgaben an Nextcloud Aufgaben weisen", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "D'Aufgaben, déi dir zougewisen oder mat dir gedeelt sinn, erschéngen an enger Lëscht \"Planninq\" an Nextcloud Aufgaben a Kalenner. Ännerungen do ginn duerch déi nächst Ännerung an Planninq ersat.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Dëse Server kann net an Nextcloud Aufgaben schreiwen, dofir ass den Export net disponibel.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Vu Planninq verwalt. Ännerungen hei ginn duerch déi nächst Ännerung an Planninq ersat.", + "Working days and holidays": "Aarbechtsdeeg a Feierdeeg", + "Dates set on the timeline skip the days that are not working days.": "Datumer, déi op der Zäitlinn gesat ginn, spréngen iwwer d'Deeg, déi keng Aarbechtsdeeg sinn.", + "Working weekdays": "Aarbechtsdeeg vun der Woch", + "Non-working days": "Fräi Deeg", + "No non-working days yet.": "Nach keng fräi Deeg.", + "Add day": "Dag derbäisetzen", + "Year": "Joer", + "Add Dutch national holidays": "Hollännesch Feierdeeg derbäisetzen", + "Save working days": "Aarbechtsdeeg späicheren", + "Choose at least one working weekday.": "Wiel mindestens een Aarbechtsdag.", + "Working days saved.": "Aarbechtsdeeg gespäichert.", + "Could not save the working days.": "D'Aarbechtsdeeg konnten net gespäichert ginn.", + "New Year's Day": "Neijoerschdag", + "Easter Sunday": "Ouschtersonndeg", + "Easter Monday": "Ouschterméindeg", + "King's Day": "Kinnekensdag", + "Liberation Day": "Befreiungsdag", + "Ascension Day": "Christi Himmelfahrt", + "Whit Sunday": "Péngschtsonndeg", + "Whit Monday": "Péngschtméindeg", + "Christmas Day": "Chrëschtdag", + "Boxing Day": "Stiefesdag", + "Dates of {title}": "Datume vun {title}", + "The due date cannot be before the start date.": "D'Fällegkeetsdatum däerf net virum Startdatum leien.", + "{title}, from {start} to {end}": "{title}, vum {start} bis {end}", + "The dates could not be saved.": "D'Datume konnten net gespäichert ginn.", + "{title} now runs from {start} to {end}": "{title} leeft elo vum {start} bis {end}", + "Auto-scheduling": "Automatesch Planung", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Wann et un ass, bitt e méi spéit Fällegkeetsdatum op der Zäitlinn un, déi blockéiert Aufgaben matzeréckelen.", + "Move blocked tasks along when a task slips": "Blockéiert Aufgaben matréckelen, wann eng Aufgab sech verspéit", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Op der Zäitlinn bitt e méi spéit Fällegkeetsdatum un, déi blockéiert Aufgaben matzeréckelen. Nëmme \"blockéiert\"-Linke zielen, an Aufgabe réckele just no hannen.", + "Move the tasks that wait for {title}?": "D'Aufgaben, déi op {title} waarden, réckelen?", + "These tasks wait for it and would start after its new due date:": "Dës Aufgabe waarden drop a géifen nom neien Datum ufänken:", + "{count} tasks would move; the first {limit} are listed.": "{count} Aufgabe géife geréckelt; déi éischt {limit} stinn hei.", + "Now": "Elo", + "After the move": "Nom Réckelen", + "Only this task": "Just dës Aufgab", + "Move all": "All réckelen", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Bei {title} gestoppt: d'Datume konnten net gespäichert ginn. D'Aufgabe virdrun goufe geréckelt.", + "Cumulative flow": "Kumulativen Floss", + "Show as chart": "Als Diagramm weisen", + "Show as table": "Als Tabell weisen", + "Tasks per column per day": "Aufgaben pro Kolonn pro Dag", + "Tasks without recorded history in this period: {count}": "Aufgaben ouni opgezeechent Geschicht an dëser Period: {count}", + "Lead and cycle time": "Duerchlaf- a Zykluszäit", + "No tasks were finished in this period.": "An dëser Period gouf keng Aufgab ofgeschloss.", + "Finished tasks": "Ofgeschloss Aufgaben", + "Cycle time, average": "Zykluszäit, Duerchschnëtt", + "Cycle time, 85th percentile": "Zykluszäit, 85. Perzentil", + "Lead time, average": "Duerchlafzäit, Duerchschnëtt", + "Tasks whose finish time was estimated from their history: {count}": "Aufgaben, där hir Schlusszäit aus der Geschicht geschat gouf: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Zykluszäit vun all ofgeschlossener Aufgab, mam Duerchschnëtt an dem 85. Perzentil", + "Slowest tasks": "Lues Aufgaben", + "cycle {cycle}, lead {lead}": "Zyklus {cycle}, Duerchlaf {lead}", + "{days} days": "{days} Deeg", + "Could not load the flow of this project.": "De Floss vun dësem Projet konnt net geluede ginn.", + "Last {days} days": "Lescht {days} Deeg", + "Portfolio flow": "Portfolio-Floss", + "An admin adds portfolios under Projects, Portfolios.": "En Administrateur füügt Portfolioen ënner Projeten, Portfolioen derbäi.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Net gewise Projeten, well héchstens 50 gläichzäiteg gewise ginn: {count}", + "Could not load the flow of this portfolio.": "De Floss vun dësem Portfolio konnt net geluede ginn.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativen Floss an Zykluszäit iwwer d'Projete vun engem Portfolio.", + "Edit report": "Bericht beaarbechten", + "Only tasks where": "Just Aufgaben, bei deenen", + "Group by": "Gruppéieren no", + "Display": "Duerstellung", + "Share with everyone who can read its projects": "Mat jidderengem deelen, deen d'Projete liese kann", + "The report could not be saved.": "De Bericht konnt net gespäichert ginn.", + "Number of tasks": "Zuel vun Aufgaben", + "Bar": "Balken", + "Donut": "Rank", + "Table": "Tabell", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} vun {total} Projeten an dësem Bericht sinn fir dech net siichtbar", + "No tasks match this report.": "Keng Aufgab passt op dëse Bericht.", + "None": "Keng", + "Could not load this report.": "Dëse Bericht konnt net geluede ginn.", + "Report": "Bericht", + "Your reports": "Deng Berichter", + "My reports": "Meng Berichter", + "Shared reports": "Gedeelt Berichter", + "You have not built a report yet.": "Du hues nach kee Bericht gemaach.", + "Nobody has shared a report with you yet.": "Nach keen huet e Bericht mat dir gedeelt.", + "Reports you built over tasks, and the ones shared with you.": "Berichter, déi s du iwwer Aufgaben erstallt hues, an déi, déi mat dir gedeelt goufen.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Eng gespäichert Ufro iwwer Aufgaben: wéi eng Projeten, wéi eng Filteren, no wat gruppéiert, gezielt oder summéiert, an als Tabell oder Diagramm gewisen.", + "The name the report is listed under": "Den Numm, ënner deem de Bericht opgelëscht ass", + "What the report shows and who it is for": "Wat de Bericht weist a fir wien en ass", + "Nextcloud user id of the person who saved the report": "Nextcloud-Benotzer-ID vun der Persoun, déi de Bericht gespäichert huet", + "Who can open the report": "Wien de Bericht opmaache kann", + "Only me": "Just ech", + "Everyone who can read its projects": "Jiddereen, deen d'Projete liese kann", + "The projects the report covers, at most fifty": "D'Projeten, déi de Bericht ëmfaasst, héchstens fofzeg", + "Filters": "Filteren", + "Task fields and the value each must equal": "Aufgabefelder an de Wäert, deem all eenzelt gläiche muss", + "The task field the report groups on": "D'Aufgabefeld, no deem de Bericht gruppéiert", + "Count the tasks, or add up a number on them": "D'Aufgaben zielen oder eng Zuel op hinnen summéieren", + "Sum": "Summ", + "Sum of": "Summ vun", + "The number added up when the measure is a sum": "D'Zuel, déi summéiert gëtt, wann d'Mooss eng Summ ass", + "Story points": "Story Points", + "Estimated duration": "Geschate Dauer", + "How the report is shown": "Wéi de Bericht gewise gëtt", + "Issue type": "Tickettyp", + "Task fields and the value each must equal; empty when the report covers every task": "Felder vun der Aufgab an de Wäert, deen all Feld muss hunn; eidel, wann de Bericht all Aufgabe ëmfaasst", + "The status a task must have": "De Status, deen eng Aufgab muss hunn", + "The priority a task must have": "D'Prioritéit, déi eng Aufgab muss hunn", + "The user a task must be assigned to": "De Benotzer, deem eng Aufgab muss zougewise sinn", + "A label a task must carry": "E Label, deen eng Aufgab muss droen", + "The board column a task must be in": "D'Kolonn vum Board, an där eng Aufgab muss stoen", + "The issue type a task must have": "Den Tickettyp, deen eng Aufgab muss hunn", + "Manager groups": "Verwaltungsgruppen", + "Member groups": "Membergruppen", + "Viewer groups": "Lieser-Gruppen", + "Viewers": "Lieser", + "Owning group": "Besëtzer-Grupp", + "Nextcloud groups whose members manage the project": "Nextcloud-Gruppen, deenen hir Memberen de Projet verwalten", + "Nextcloud groups whose members work on the project": "Nextcloud-Gruppen, deenen hir Memberen um Projet schaffen", + "Nextcloud groups whose members may read the project": "Nextcloud-Gruppen, deenen hir Memberen de Projet liese dierfen", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-Benotzer, déi de Projet verwalten: Astellungen, Memberen an Aarbecht", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-Benotzer, déi de Projet a seng Aarbecht liesen, awer net änneren dierfen", + "The Nextcloud group that owns the project with its creator, at most one": "D'Nextcloud-Grupp, där de Projet mat sengem Ersteller gehéiert, héchstens eng", + "Nextcloud user ids who may read this through the project": "Nextcloud-Benotzer, déi dat iwwer de Projet liese dierfen", + "Nextcloud groups whose members may change this through the project": "Nextcloud-Gruppen, deenen hir Memberen dat iwwer de Projet ännere dierfen", + "Nextcloud groups whose members may read this through the project": "Nextcloud-Gruppen, deenen hir Memberen dat iwwer de Projet liese dierfen", + "Search for a person or a group…": "No enger Persoun oder engem Grupp sichen…", + "No one found. Your admin's sharing settings decide who you can find.": "Keen fonnt. D'Deelastellunge vun denger Administratioun entscheeden, wien s du fanne kanns.", + "Type at least two characters": "Gëff mindestens zwee Zeeche an", + "Everyone in this group": "All an dësem Grupp", + "Could not search for people. Please try again.": "D'Sich no Persoune huet net geklappt. Probéier nach eng Kéier.", + "Could not remove the group": "De Grupp konnt net ewechgeholl ginn", + "Only the owner and managers change who is on this project.": "Nëmmen de Besëtzer an d'Verwalter änneren, wien op dësem Projet ass.", + "Role of {name}": "Roll vu(n) {name}", + "Manager": "Verwalter", + "Member": "Member", + "Viewer": "Lieser", + "Could not change the role": "D'Roll konnt net geännert ginn", + "Owned by group: {name}": "Am Besëtz vum Grupp: {name}", + "No group owns this project.": "Kee Grupp besëtzt dëse Projet.", + "Owned by group": "Am Besëtz vum Grupp", + "Search for a group…": "No engem Grupp sichen…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Kee Grupp fonnt. D'Deelastellunge vun denger Administratioun bestëmmen, wéi eng Gruppen s du fanne kanns.", + "No owning group": "Kee Besëtzergrupp", + "Could not search for groups. Please try again.": "Gruppe konnten net gesicht ginn. Probéier nach eng Kéier.", + "Could not change the owning group": "De Besëtzergrupp konnt net geännert ginn", + "You can read this project. Only its members change it.": "Du kanns dëse Projet liesen. Nëmme seng Memberen änneren en.", + "Course": "Cours", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "De Cours, deen an dëser Stonn ënnerriicht gëtt, zum Beispill eng Optioun, wann d'Léier-App vun der Schoul en kennt.", + "Online meeting link": "Link op déi online Stonn", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Wou d'Schüler online un dëser Stonn deelhuelen. De Knäppchen Deelhuelen erschéngt nëmme bei engem https-Link." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lb.json b/l10n/lb.json index 817c754e..244256dc 100644 --- a/l10n/lb.json +++ b/l10n/lb.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktiv Projeten", + "Archived projects": "Archivéiert Projeten", + "Boards": "Boards", + "My projects": "Meng Projeten", + "Portfolio": "Portfolio", + "Project board": "Projet-Board", + "Projects I am in": "Projeten un deenen ech bedeelegt sinn", + "Timeline": "Zäitleescht", + "Timesheet": "Zäiterfassung", + "Features & roadmap": "Funktiounen a Roadmap", + "Flow": "Oflaf", + "Flows": "Ofleef", + "Reports": "Berichter", + "Pick a report to open it.": "Wielt e Bericht fir en opzemaachen.", + "In progress": "A Gaang", + "Date": "Datum", + "Due": "Fälleg", + "Assignee": "Zougewisen", + "Who": "Wien", + "What": "Wat", + "Minutes": "Minutten", + "Entries": "Andeel", + "Most recent": "Am rezentsten", + "Per person": "Pro Persoun", + "By status": "No Status", + "By priority": "No Prioritéit", + "Task status": "Aufgabestatus", + "Time spent": "Verbruechten Zäit", + "Capacity": "Kapazitéit", + "Due soonest": "Am nächsten fälleg", + "Minutes logged": "Erfaasste Minutten", + "Nothing is due": "Näischt ass fälleg", + "Nothing logged yet": "Nach näischt erfaasst", + "What is open, what is blocked, and what is overdue.": "Wat op ass, wat blockéiert ass a wat iwwerfälleg ass.", + "How allocation is spread across the people working on projects.": "Wéi d'Belaaschtung op d'Leit verdeelt ass, déi u Projete schaffen.", + "Hours logged, and the projects they went to.": "Erfaasste Stonnen an d'Projeten, an déi se gaange sinn.", + "Billable": "Verrechenbar", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Projete gi gelueden", + "No projects for this client yet": "Nach keng Projete fir dëse Client", + "Open in Planninq": "A Planninq opmaachen", + "This project could not be found": "Dëse Projet gouf net fonnt", + "Untitled project": "Onbenannte Projet", + "and {count} more": "an {count} weiderer", + "Store": "Buttek", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installéiert Registeren, Schemaen a Flows déi aner Organisatiounen publizéiert hunn.", + "Work Date": "Aarbechtsdatum", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Kolonnenaktiounen", + "Columns": "Kolonnen", + "Could not remove the column. Please try again.": "D'Kolonn konnt net ewechgeholl ginn. Probéiert w.e.g. nach eng Kéier.", + "Could not save the column. Please try again.": "D'Kolonn konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "Done column": "Fäerdeg-Kolonn", + "Edit column": "Kolonn änneren", + "Keep the card's status": "Status vun der Kaart behalen", + "Move its cards to": "Seng Kaarte réckelen op", + "Move left": "No lénks réckelen", + "Move right": "No riets réckelen", + "Status of cards moved here": "Status vun de Kaarten, déi heihinner geréckelt ginn", + "The last done column cannot be removed.": "Déi lescht Fäerdeg-Kolonn kann net ewechgeholl ginn.", + "WIP limit": "WIP-Limit", + "over limit": "iwwer der Limit", + "The status a card gets when it is moved into this column.": "De Status, deen eng Kaart kritt, wann se an dës Kolonn geréckelt gëtt.", + "All priorities": "All Prioritéiten", + "Could not create the task. Please try again.": "D'Aufgab konnt net erstallt ginn. Probéiert w.e.g. nach eng Kéier.", + "Created": "Erstallt", + "Move to backlog": "An de Backlog", + "Move to board": "Op de Board", + "New task": "Nei Aufgab", + "Nothing in the backlog": "Näischt am Backlog", + "Rank": "Rang", + "Sort by": "Sortéieren no", + "Sort by rank to reorder": "No Rang sortéieren fir nei unzeuerdnen", + "Task actions": "Aufgabenaktiounen", + "All labels": "All Etiketten", + "Filter tasks by label": "Aufgabe no Etikett filteren", + "View timeline": "Zäitlinn weisen", + "Board": "Board", + "List": "Lëscht", + "Column": "Kolonn", + "Board or list": "Board oder Lëscht", + "Log": "Logbuch", + "Add entry": "Entrée derbäisetzen", + "Show": "Weisen", + "No actions yet": "Nach keng Aktiounen", + "Closed": "Zou", + "Entry actions": "Aktioune fir d'Entrée", + "Add action": "Aktioun derbäisetzen", + "by {author}": "vum {author}", + "saved {time}": "gespäichert {time}", + "Attendees: {names}": "Participanten: {names}", + "Add the first entry": "Déi éischt Entrée derbäisetzen", + "Issues": "Problemer", + "Lessons learned": "Erkenntnisser", + "Meetings": "Reuniounen", + "Decisions": "Decisiounen", + "Actions": "Aktiounen", + "Issue": "Problem", + "Lesson learned": "Erkenntnis", + "Meeting": "Reunioun", + "Decision": "Decisioun", + "About this project": "Iwwer dëse Projet", + "No description yet": "Nach keng Beschreiwung", + "Start date": "Startdatum", + "Not set": "Net festgeluecht", + "End date": "Schlussdatum", + "Progress": "Fortschrëtt", + "No tasks yet": "Nach keng Aufgaben", + "Open the board": "De Board opmaachen", + "People": "Leit", + "Owner": "Besëtzer", + "Latest log entries": "Lescht Entréeën", + "Open the log": "D'Logbuch opmaachen", + "{done} of {total} tasks done": "{done} vun {total} Aufgaben erleedegt", + "Edit entry": "Entrée änneren", + "Type": "Aart", + "Attendees": "Participanten", + "Issue is closed": "De Problem ass zou", + "Could not save the entry. Please try again.": "D'Entrée konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "From: {title}": "Aus: {title}", + "What needs to happen": "Wat muss geschéien", + "Could not create the action. Please try again.": "D'Aktioun konnt net erstallt ginn. Probéiert w.e.g. nach eng Kéier.", + "The action was created but could not be linked to the entry.": "D'Aktioun gouf erstallt, konnt awer net mat der Entrée verlinkt ginn.", + "Project pages": "Projetssäiten", + "Overview": "Iwwersiicht", + "Risks": "Risiken", + "Log entry": "Logbuch-Entrée", + "A short name for the entry": "E kuerzen Numm fir d'Entrée", + "Project": "Projet", + "The project this entry belongs to": "De Projet, zu deem dës Entrée gehéiert", + "What kind of entry this is": "Wat fir eng Entrée dat ass", + "When it happened": "Wéini et geschitt ass", + "What happened, in Markdown": "Wat geschitt ass, am Markdown", + "Whether an issue is still open": "Ob e Problem nach op ass", + "The people at a meeting": "D'Leit bei enger Reunioun", + "Tasks that came out of this entry": "Aufgaben, déi aus dëser Entrée entstane sinn", + "Add risk": "Risiko derbäisetzen", + "Risk": "Risiko", + "Score": "Wäert", + "Response": "Reaktioun", + "Review date": "Iwwerpréiwungsdatum", + "no longer on the project": "net méi am Projet", + "Edit {title}": "{title} änneren", + "No risks recorded yet": "Nach keng Risiken erfaasst", + "Add the first risk": "Dat éischt Risiko derbäisetzen", + "Medium": "Mëttel", + "Mitigating": "Gëtt ofgeschwächt", + "Occurred": "Agetrueden", + "Avoid": "Vermeiden", + "Reduce": "Reduzéieren", + "Transfer": "Iwwerdroen", + "Accept": "Akzeptéieren", + "Highest open risks": "Héchst oppe Risiken", + "No open risks": "Keng oppe Risiken", + "Open the risk register": "Risikoregister opmaachen", + "Edit risk": "Risiko änneren", + "What could go wrong": "Wat kéint schifgoen", + "Likelihood": "Wahrscheinlechkeet", + "Impact": "Auswierkung", + "Score {score}": "Wäert {score}", + "Countermeasures": "Géigemoossnamen", + "Could not save the risk. Please try again.": "D'Risiko konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "Risks by likelihood and impact": "Risiken no Wahrscheinlechkeet an Auswierkung", + "Risk scale": "Risikoskala", + "The levels every project scores its risks on, and where low turns into medium and high": "D'Stufen, op deenen all Projet seng Risike bewäert, a wou niddreg an mëttel an héich iwwergeet", + "Number of levels": "Zuel vun de Stufen", + "Likelihood labels": "Etikette fir Wahrscheinlechkeet", + "Impact labels": "Etikette fir Auswierkung", + "Level {level}": "Stuf {level}", + "Medium from score": "Mëttel ab Wäert", + "High from score": "Héich ab Wäert", + "Risk scale saved": "Risikoskala gespäichert", + "1 risk uses level {level}. Change it first.": "1 Risiko benotzt Stuf {level}. Ännert et fir d'éischt.", + "{count} risks use level {level}. Change them first.": "{count} Risike benotze Stuf {level}. Ännert se fir d'éischt.", + "Every level needs a label, and high must start above medium.": "All Stuf brauch eng Etikett, an héich muss iwwer mëttel ufänken.", + "The project this risk belongs to": "De Projet, zu deem dëst Risiko gehéiert", + "The cause and the effect, in Markdown": "Ursaach a Wierkung, am Markdown", + "Category": "Kategorie", + "A free grouping, such as planning, budget or supplier": "Eng fräi Gruppéierung, wéi Planung, Budget oder Liwwerant", + "How likely it is, on the admin's risk scale": "Wéi wahrscheinlech et ass, op der Risikoskala vum Administrator", + "How hard it would hit, on the admin's risk scale": "Wéi haart et géif treffen, op der Risikoskala vum Administrator", + "Likelihood times impact, calculated by the server": "Wahrscheinlechkeet mol Auswierkung, vum Server berechent", + "Where the risk stands": "Wou d'Risiko steet", + "The person who watches this risk": "D'Persoun, déi dëst Risiko am A behält", + "How the project answers the risk": "Wéi de Projet op d'Risiko reagéiert", + "What is done to prevent it or soften it, in Markdown": "Wat gemaach gëtt, fir et ze verhënneren oder ofzeschwächen, am Markdown", + "When to look at this risk again": "Wéini d'Risiko nees gepréift gëtt", + "Very low": "Ganz niddreg", + "Very high": "Ganz héich", + "All projects": "All Projeten", + "Project status report": "Projet-Statusbericht", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "En datéierte Bericht doriwwer, wéi e Projet bei Suen, Organisatioun, Zäit, Informatioun, Qualitéit a Risiko (de GROTIK-Aspekter) steet, all mat enger Notiz.", + "The project this report is about": "De Projet, ëm deen et am Bericht geet", + "Report date": "Berichtsdatum", + "The day the report describes": "Den Dag, deen de Bericht beschreift", + "Money": "Suen", + "How the project stands on this aspect": "Wéi de Projet bei dësem Aspekt steet", + "On track": "Am Plang", + "At risk": "A Gefor", + "Off track": "Aus dem Plang", + "Money note": "Notiz zu Suen", + "A short explanation of this status": "Eng kuerz Erklärung vun dësem Status", + "Organisation": "Organisatioun", + "Organisation note": "Notiz zur Organisatioun", + "Time": "Zäit", + "Time note": "Notiz zur Zäit", + "Information": "Informatioun", + "Information note": "Notiz zur Informatioun", + "Quality": "Qualitéit", + "Quality note": "Notiz zur Qualitéit", + "Risk note": "Notiz zum Risiko", + "Overall": "Insgesamt", + "The worst of the six statuses, calculated by the server": "De schlechtste vun de sechs Statussen, vum Server berechent", + "Health: money": "Zoustand: Suen", + "Copied from the newest status report": "Aus dem neiste Statusbericht iwwerholl", + "Health: organisation": "Zoustand: Organisatioun", + "Health: time": "Zoustand: Zäit", + "Health: information": "Zoustand: Informatioun", + "Health: quality": "Zoustand: Qualitéit", + "Health: risk": "Zoustand: Risiko", + "Health: overall": "Zoustand: insgesamt", + "Health: report date": "Zoustand: Berichtsdatum", + "The date of the newest status report": "Den Datum vum neiste Statusbericht", + "New report": "Neie Bericht", + "Only the project owner writes status reports.": "Nëmmen de Proprietär vum Projet schreift Statusberichter.", + "Latest report, {date}": "Leschte Bericht, {date}", + "Aspect": "Aspekt", + "Note": "Notiz", + "Report history": "Berichtsverlaf", + "Author": "Auteur", + "No status reports yet": "Nach keng Statusberichter", + "Write the first report": "Den éischte Bericht schreiwen", + "Choose a status for every aspect to save the report.": "Wielt fir all Aspekt e Status, fir de Bericht ze späicheren.", + "Suggested: on track.": "Virschlag: am Plang.", + "Suggested: at risk.": "Virschlag: a Gefor.", + "Suggested: off track.": "Virschlag: aus dem Plang.", + "1 task is past its due date.": "1 Aufgab ass iwwerfälleg.", + "{count} tasks are past their due date.": "Iwwerfälleg Aufgaben: {count}.", + "The end date has passed with 1 open task.": "Den Enndatum ass mat 1 oppener Aufgab iwwerschratt.", + "The end date has passed with {count} open tasks.": "Den Enndatum ass iwwerschratt, oppe Aufgaben: {count}.", + "No open task is past its due date.": "Keng oppe Aufgab ass iwwerfälleg.", + "The highest open risk, \"{title}\", scores {score}.": "Dat héchst oppent Risiko, \"{title}\", huet {score} Punkten.", + "There are no open risks.": "Et gi keng oppe Risiken.", + "Costs are at {percent}% of the budget.": "D'Käschte leien op {percent}% vum Budget.", + "No suggestion: the project has no budget.": "Kee Virschlag: de Projet huet kee Budget.", + "No suggestion: no costs are recorded for this project yet.": "Kee Virschlag: fir dëse Projet sinn nach keng Käschten erfaasst.", + "The report was not saved. Only the project owner can write status reports.": "De Bericht gouf net gespäichert. Nëmmen de Proprietär vum Projet kann Statusberichter schreiwen.", + "No report": "Kee Bericht", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Eng Grupp vu Projeten, déi vun deene selwechte Leit gefouert ginn, zum Beispill eng Abteilung oder e Programm. Seng Responsabel liesen all Projet dran.", + "The name of the portfolio": "Den Numm vum Portfolio", + "What the portfolio holds and who runs it": "Wat am Portfolio ass a wien et féiert", + "A colour for the portfolio's section in project lists": "Eng Faarf fir d'Sektioun vum Portfolio a Projetlëschten", + "Managers": "Responsabel", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-Benotzer-IDe vun de Leit, déi de Portfolio féieren", + "Order": "Reiefolleg", + "Where the portfolio comes in project lists, lowest first": "Wou de Portfolio a Projetlëschte steet, déi niddregst als éischt", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Déi eege Risikoskala vun dësem Portfolio als JSON, an der selwechter Form wéi déi fir déi ganz App. Eidel heescht d'Skala vun der App.", + "Portfolio readers": "Portfolio-Lieser", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-Benotzer-IDe vun de Responsabele vum Portfolio vum Projet", + "The portfolio this project belongs to": "De Portfolio, zu deem dëse Projet gehéiert", + "No portfolio": "Kee Portfolio", + "All portfolios": "All Portfolioen", + "You read this project as a manager of its portfolio. Only its members change it.": "Dir liest dëse Projet als Responsabel vu sengem Portfolio. Nëmme seng Memberen änneren en.", + "Portfolios": "Portfolioen", + "Portfolio status": "Portfoliostatus", + "No portfolios yet": "Nach keng Portfolioen", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "En Administrateur füügt Portfolioen ënner Projeten, Portfolioen derbäi. Projete vun engem Portfolio stinn hei mat hirem Status.", + "Roll-up": "Resumé", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} am Plang, {atRisk} a Gefor, {offTrack} net am Plang, {noReport} ouni Bericht", + "No project in this portfolio that you can read.": "Kee Projet an dësem Portfolio, deen s du liese kanns.", + "Start": "Ufank", + "End": "Enn", + "Budget": "Budget", + "Last report": "Leschte Bericht", + "Out of date": "Veralt", + "Portfolio timeline": "Portfolio-Zäitachs", + "Zoom": "Zoom", + "Could not load the timeline": "D'Zäitachs konnt net geluede ginn", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "En Administrateur füügt Portfolioen ënner Projeten, Portfolioen derbäi. Projete vun engem Portfolio stinn hei op enger Zäitachs.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Maach e Projet op fir seng Phasen an Aufgaben ze gesinn. D'Zäitachs ass nëmme fir ze liesen.", + "Phase: {title}": "Phas: {title}", + "Left out because you cannot read them: {count} projects": "Ausgelooss, well s du se net liese kanns: {count} Projeten", + "Week": "Woch", + "Day": "Dag", + "Month": "Mount", + "Please try again later.": "Probéier w.e.g. méi spéit nach eng Kéier.", + "Status reports": "Statusberichter", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "No wéi vill Deeg de leschte Statusbericht vun engem Projet an der Portfolio-Iwwersiicht als veralt markéiert gëtt", + "Reporting period (days)": "Berichtzäitraum (Deeg)", + "The reporting period is a whole number of days from 1 to 365.": "De Berichtzäitraum ass eng ganz Zuel vun Deeg vun 1 bis 365.", + "Reporting period saved": "Berichtzäitraum gespäichert", + "The reporting period was not saved. Please try again.": "De Berichtzäitraum gouf net gespäichert. Probéier nach eng Kéier.", + "Every project of a portfolio with its status per aspect, rolled up.": "All Projet vun engem Portfolio mat sengem Status pro Aspekt, zesummegefaasst.", + "The projects of a portfolio on one timeline.": "D'Projete vun engem Portfolio op enger Zäitachs.", + "Phases": "Phasen", + "Add phase": "Phas derbäisetzen", + "No phases yet": "Nach keng Phasen", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Deel de Projet a Phasen op, wéi Initiatioun, Definitioun an Ëmsetzung. Eng Phas gëtt zougemaach, soubal hiert Ofschlossdokument eropgelueden ass.", + "{hours} hours": "{hours} Stonnen", + "Concluding document: {title}": "Ofschlossdokument: {title}", + "Concluding document missing": "Ofschlossdokument feelt", + "Move {title} up": "{title} no uewen", + "Move {title} down": "{title} no ënnen", + "Close phase": "Phas zoumaachen", + "Phase": "Phas", + "Files": "Fichieren", + "Notes": "Notizen", + "Audit trail": "Audit-Protokoll", + "Edit phase": "Phas beaarbechten", + "Name": "Numm", + "Budget hours": "Budgetstonnen", + "Could not save the phase. Please try again.": "D'Phas konnt net gespäichert ginn. Probéier nach eng Kéier.", + "Close phase {title}": "Phas {title} zoumaachen", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Eng Phas gëtt mat hirem Ofschlossdokument zougemaach: lued et hei erop oder wiel ee vun de Fichiere vun der Phas.", + "Concluding document": "Ofschlossdokument", + "This phase has no files yet.": "Dës Phas huet nach keng Fichieren.", + "Upload a document": "Dokument eroplueden", + "The document was not uploaded. Please try again.": "D'Dokument gouf net eropgelueden. Probéier nach eng Kéier.", + "Upload the concluding document before you close this phase.": "Lued d'Ofschlossdokument erop, ier s du dës Phas zoumëss.", + "This phase cannot be closed from its current status.": "Dës Phas kann net aus hirem aktuelle Status zougemaach ginn.", + "The phase was not closed. Please try again.": "D'Phas gouf net zougemaach. Probéier nach eng Kéier.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "D'ID vum Fichier op dëser Phas, deen se ofschléisst. D'Phas kann eréischt ofgeschloss ginn, wann se gesat ass an de Fichier ugehaang ass.", + "Import from Microsoft Project": "Aus Microsoft Project importéieren", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Wielt e Plang, deen aus Microsoft Project am XML-Format gespäichert gouf. Näischt gëtt importéiert, ier Dir confirméiert.", + "Plan file": "Plangfichier", + "What the import creates": "Wat den Import uleet", + "Tasks": "Aufgaben", + "Sub-tasks": "Ënneraufgaben", + "Milestones": "Meilesteng", + "Links": "Verknäppungen", + "Already imported, updated in place: {count}": "Scho importéiert, op der Plaz aktualiséiert: {count}", + "What does not carry over": "Wat net iwwerholl gëtt", + "Tasks with resources, which are not imported: {count}": "Aufgabe mat Ressourcen, déi net importéiert ginn: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Aufgabe méi déif wéi Niveau 3, ënner hir Aufgab vum Niveau 2 gesat: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Verknäppungen ausser Enn-Ufank, als verwandt Verknäppungen importéiert: {count}", + "Link lags, which are dropped: {count}": "Verzögerunge vu Verknäppungen, déi ewechfalen: {count}", + "Links to a summary task, which are not imported: {count}": "Verknäppungen op eng Resuméaufgab, déi net importéiert ginn: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Verknäppungen op Aufgaben ausserhalb vun dësem Plang, déi net importéiert ginn: {count}", + "No longer in the plan": "Net méi am Plang", + "These stay in the project; remove them yourself if they are no longer needed.": "Dës bleiwen am Projet; läscht se selwer, wann se net méi gebraucht ginn.", + "Import": "Importéieren", + "Close": "Zoumaachen", + "The plan is imported: {created} created, {updated} updated.": "De Plang ass importéiert: {created} ugeluecht, {updated} aktualiséiert.", + "Links that would close a loop were left out: {count}": "Verknäppungen, déi eng Schleef zoumaache géifen, goufen ausgelooss: {count}", + "The import stopped part-way. Run it again to finish it.": "Den Import ass ënnerwee stoe bliwwen. Start en nach eng Kéier, fir en ofzeschléissen.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Späichert de Plang a Microsoft Project mat Fichier, Späicheren ënner, XML-Format, an importéiert dee Fichier.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Dëse Fichier deklaréiert en DOCTYPE oder Entitéiten, déi net akzeptéiert ginn.", + "The file is larger than 10 MB.": "De Fichier ass méi grouss wéi 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "De Plang huet méi wéi 2.000 Aufgaben, méi wéi een Import hëlt.", + "This file is not a Microsoft Project plan in XML format.": "Dëse Fichier ass kee Microsoft-Project-Plang am XML-Format.", + "Choose a file to import.": "Wielt e Fichier fir ze importéieren.", + "Only the project owner can import a plan.": "Nëmmen de Proprietär vum Projet kann e Plang importéieren.", + "The plan could not be read. Please try again.": "De Plang konnt net gelies ginn. Probéiert w.e.g. nach eng Kéier.", + "Linked case: {title}": "Verknäppte Fall: {title}", + "Linked to a case": "Mat engem Fall verknäppt", + "Hand over to case": "Dem Fall iwwerginn", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopéiert all Fichier vum Projet a senge Aufgaben, an e Fichier deen de Projet beschreift, onverännert an de verknäppte Fall.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopéiert Fichieren: {count}", + "Files that failed: {names}": "Fichieren déi feelgeschloen hunn: {names}", + "The handover failed. Please try again.": "D'Iwwergab ass feelgeschloen. Probéiert w.e.g. nach eng Kéier.", + "The linked case could not be found, or you cannot open it.": "De verknäppte Fall gouf net fonnt, oder Dir kënnt en net opmaachen.", + "Case handovers": "Iwwergabe fir de Fall", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "All Iwwergab vun de Fichieren an de Metadate vum Projet u säi Fall: wéini, vu wiem, u wéi ee Fall, all kopéierte Fichier mat sengem SHA-256, an d'Fichieren déi feelgeschloen hunn.", + "Finance": "Finanzen", + "Add cost line": "Käschtelinn derbäisetzen", + "Delivery terms": "Liwwerkonditiounen", + "Billing model": "Ofrechnungsmodell", + "Budget in euro": "Budget an Euro", + "Budget in hours": "Budget an Stonnen", + "Hourly rate in euro": "Stonnesaz an Euro", + "Planned start": "Geplangte Start", + "Planned end": "Geplangt Enn", + "Planned dates": "Geplangten Datumer", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Kee Budget ofgemaach", + "Hours": "Stonnen", + "Only the project owner and the portfolio managers see the amounts.": "Nëmmen de Projetbesëtzer an d'Portfoliomanager gesinn d'Beträg.", + "Budget against cost per category": "Budget géint Käschte pro Kategorie", + "Labour (booked time)": "Aarbecht (gebuchten Zäit)", + "No category": "Keng Kategorie", + "Hours are not available": "D'Stonnen sinn net disponibel", + "Not yet assigned to a category": "Nach keng Kategorie zougewisen", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} ausginn, {remaining} iwwreg", + "Budget against cost per phase": "Budget géint Käschte pro Phas", + "No phase": "Keng Phas", + "Cost lines": "Käschtelinnen", + "From the finance system": "Aus dem Finanzsystem", + "Edit cost line {amount}": "Käschtelinn {amount} beaarbechten", + "No cost lines yet": "Nach keng Käschtelinnen", + "Commitments": "Engagementer", + "Actual cost": "Tatsächlech Käschten", + "Forecast": "Prognos", + "Remaining": "Iwwreg", + "Not planned yet": "Nach net geplangt", + "{start} to {end}": "{start} bis {end}", + "The terms were not saved. Please try again.": "D'Konditioune goufen net gespäichert. Probéier nach eng Kéier.", + "Terms saved": "Konditioune gespäichert", + "Fixed price": "Fixpräis", + "Hourly": "Pro Stonn", + "Not billed": "Net ofgerechent", + "Commitment": "Engagement", + "Edit cost line": "Käschtelinn beaarbechten", + "Kind": "Aart", + "Amount in euro": "Betrag an Euro", + "Remove": "Ewechhuelen", + "Could not save the cost line. Only the project owner changes the money of a project.": "D'Käschtelinn konnt net gespäichert ginn. Nëmmen de Projetbesëtzer ännert d'Suen vun engem Projet.", + "Could not remove the cost line. Please try again.": "D'Käschtelinn konnt net ewechgeholl ginn. Probéier nach eng Kéier.", + "{amount} over budget": "{amount} iwwer dem Budget", + "Cost categories": "Käschtekategorien", + "The categories every project splits its budget and costs into, one per line": "D'Kategorien, an déi all Projet säi Budget a seng Käschten opdeelt, eng pro Linn", + "Categories": "Kategorien", + "Give at least one category, each name once.": "Gëff mindestens eng Kategorie un, all Numm eemol.", + "Cost categories saved": "Käschtekategorie gespäichert", + "The cost categories were not saved. Please try again.": "D'Käschtekategorie goufen net gespäichert. Probéier nach eng Kéier.", + "Finance line": "Finanzlinn", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "E Geldbetrag vun engem Projet: e Budget, en Engagement, tatsächlech Käschten oder eng Prognos, an enger Käschtekategorie an optional an enger Phas. Erfaasst vum Projetbesëtzer oder vum Finanzsystem iwwer d'Integratiouns-App geschéckt.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "De Projet, zu deem de Betrag gehéiert. Eidel fir eng Linn aus dem Finanzsystem, där hir Projetsnummer zu kengem Projet passt.", + "The phase this amount belongs to, if any": "D'Phas, zu där de Betrag gehéiert, wann et eng gëtt", + "The cost category, one of the categories the admin set up": "D'Käschtekategorie, eng vun de Kategorien, déi den Admin ageriicht huet", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Ob de Betrag e Budget, en Engagement, tatsächlech Käschten oder eng Prognos ass", + "Amount": "Betrag", + "The amount in the reporting currency (euro)": "De Betrag an der Rapportwärung (Euro)", + "The date the amount was booked or is expected": "Den Datum, un deem de Betrag gebucht gouf oder erwaart gëtt", + "What the amount is for": "Fir wat de Betrag ass", + "Whether a person entered the line or the finance system sent it": "Ob eng Persoun d'Linn erfaasst huet oder d'Finanzsystem se geschéckt huet", + "Entered by hand": "Vun Hand erfaasst", + "Finance line id": "ID vun der Finanzlinn", + "The finance system's own id of this line. One imported line per id.": "Déi eege ID vun dëser Linn am Finanzsystem. Eng importéiert Linn pro ID.", + "Project number": "Projetsnummer", + "The project number the finance system sent, matched against the project key": "D'Projetsnummer, déi d'Finanzsystem geschéckt huet, mam Projetsschlëssel verglach", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "De Portfolio vum Projet vun der Linn, vum Projet iwwerholl, sou datt d'Portfoliosummen ee Filter brauchen", + "Finance readers": "Finanzlieser", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-Benotzer-UIDen vun de Leit, déi dëse Betrag gesi däerfen: de Projetbesëtzer an d'Manager vu sengem Portfolio", + "Project owner": "Projetbesëtzer", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-Benotzer-UID vum Projetbesëtzer, deen manuell Linnen änneren an ewechhuele kann", + "How the client pays: not billed, a fixed price, or by the hour.": "Wéi de Client bezillt: net ofgerechent, Fixpräis oder pro Stonn.", + "Portfolio finance": "Portfoliofinanzen", + "You cannot see the money of any project in this portfolio": "Du gesäis d'Suen vu kengem Projet an dësem Portfolio", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "De Server huet Käschtelinne vu Projeten ausserhalb vun dësem Portfolio geschéckt, dofir kéinten dës Summe falsch sinn.", + "Projects left out because you cannot see their money: {count}": "Projeten ausgelooss, well s du hir Suen net gesäis: {count}", + "Unmatched finance lines": "Net zougeuerdent Finanzlinnen", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, Engagementer, tatsächlech Käschten a Prognos iwwer e Portfolio zesummegezielt.", + "Subprojects": "Ënnerprojeten", + "{done} of {total}": "{done} vun {total}", + "{done} of {total} tasks done, including subprojects": "{done} vun {total} Aufgaben erleedegt, Ënnerprojeten inbegraff", + "Show the subprojects of {title}": "Ënnerprojete vun {title} weisen", + "Hide the subprojects of {title}": "Ënnerprojete vun {title} verstoppen", + "Part of": "Deel vun", + "No parent project": "Keen iwwergeuerdente Projet", + "A project cannot sit under one of its own subprojects.": "E Projet kann net ënner engem vu sengen eegenen Ënnerprojete leien.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projete ginn héchstens dräi Niveaue déif verschachtelt: Programm, Projet an Ënnerprojet.", + "Parent project": "Iwwergeuerdente Projet", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "De Projet, ënner deem dëse Projet läit, wéi e Programm. Projete ginn héchstens dräi Niveaue déif verschachtelt.", + "Yes": "Jo", + "No": "Nee", + "{label} (required)": "{label} (obligatoresch)", + "{label} is required": "{label} ass obligatoresch", + "Project field": "Projetsfeld", + "A field an admin adds to every project, such as a policy area or a contract value.": "E Feld, dat en Admin zu all Projet bäisetzt, wéi e Politikberäich oder e Kontraktwäert.", + "Key": "Schlëssel", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "De feste Numm, ënner deem de Wäert gespäichert gëtt, a lower camel case. Behal en, soubal Projeten en benotzen.", + "Label": "Bezeechnung", + "The name people see next to the field": "Den Numm, deen d'Leit nieft dem Feld gesinn", + "What the field holds": "Wat d'Feld enthält", + "Text": "Text", + "Number": "Zuel", + "Choice": "Auswiel", + "Person": "Persoun", + "Yes or no": "Jo oder nee", + "Options": "Optiounen", + "The choices of a choice field": "D'Optioune vun engem Auswielfeld", + "Required": "Obligatoresch", + "Whether a project must fill in the field": "Ob e Projet d'Feld ausfëlle muss", + "Where the field appears, lowest first": "Wou d'Feld erschéngt, dat niddregst fir d'éischt", + "Applies to": "Gëllt fir", + "What the field is added to": "Zu wat d'Feld bäigesat gëtt", + "Custom fields": "Eege Felder", + "The values of the project fields an admin defined, keyed by the field's key.": "D'Wäerter vun de Projetsfelder, déi en Admin definéiert huet, no dem Schlëssel vum Feld.", + "Project fields": "Projetsfelder", + "Related": "Verbonnen", + "Remove link": "Link ewechhuelen", + "Link type": "Linktyp", + "Relates to": "Hänkt zesumme mat", + "Duplicates": "Dupliziert", + "Project key": "Projetsschlëssel", + "Every task number starts with it, such as VERG-42.": "All Aufgabennummer fänkt domat un, zum Beispill VERG-42.", + "This key is already used by another project.": "Dëse Schlëssel gëtt schonn vun engem anere Projet benotzt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Benotzt 2 bis 10 Buschtawen an Zifferen, déi mat engem Buschtaf ufänken.", + "The key cannot change once tasks carry it.": "De Schlëssel kann net méi änneren, soubal Aufgaben en droen.", + "Project saved. The existing tasks get their numbers in the background.": "Projet gespäichert. Déi bestoend Aufgaben kréien hir Nummeren am Hannergrond.", + "Next task number": "Nächst Aufgabennummer", + "The number the next task of this project gets in its key. Only the system writes it.": "D’Nummer, déi déi nächst Aufgab vun dësem Projet an hirem Schlëssel kritt. Just de System schreift se.", + "Restore {title}": "{title} restauréieren", + "Restore": "Restauréieren", + "Project restored": "Projet restauréiert", + "Could not restore the project": "De Projet konnt net restauréiert ginn", + "Bring this project back to the active list.": "Dëse Projet zréck an d’Lëscht vun den aktive Projeten huelen.", + "Restore project": "Projet restauréieren", + "Request reason": "Grond vun der Ufro", + "Why the requester needs this project. Filled in when the project is requested.": "Firwat den Ufroesteller dëse Projet brauch. Gëtt bei der Ufro ausgefëllt.", + "Reviewed by": "Gepréift vun", + "The user who approved or rejected the request.": "De Benotzer, deen d’Ufro guttgeheescht oder ofgeleent huet.", + "Reviewed at": "Gepréift den", + "When the request was approved or rejected.": "Wéini d’Ufro guttgeheescht oder ofgeleent gouf.", + "Review note": "Notiz vun der Préifung", + "The reviewer's reason, shown to the requester when a request is not approved.": "De Grond vum Préifer, deen den Ufroesteller gesäit, wann eng Ufro net guttgeheescht gëtt.", + "Members of these groups": "Membere vun dëse Gruppen", + "Groups that may create projects": "Gruppen, déi Projete maache däerfen", + "The group {group} no longer exists. Save to remove it.": "De Grupp {group} gëtt et net méi. Späichert fir en ze läschen.", + "Review project request": "Projetsufro préiwen", + "Requested by": "Gefrot vun", + "Why it is needed": "Firwat en néideg ass", + "Desired start date": "Gewënschten Ufanksdatum", + "Why is it not approved?": "Firwat gëtt en net guttgeheescht?", + "Give a reason. The requester sees it.": "Gitt e Grond un. Den Ufroesteller gesäit en.", + "Approve": "Guttheeschen", + "Reject": "Ofleenen", + "Reject request": "Ufro ofleenen", + "The review was not saved. Try again.": "D’Préifung gouf net gespäichert. Probéiert nach eng Kéier.", + "This project is waiting for review": "Dëse Projet waart op d’Préifung", + "This request was not approved": "Dës Ufro gouf net guttgeheescht", + "Reason: {note}": "Grond: {note}", + "Review request": "Ufro préiwen", + "Request a project": "E Projet ufroen", + "Step {step} of 2": "Schrëtt {step} vun 2", + "Why is this project needed?": "Firwat ass dëse Projet néideg?", + "Give a reason. The reviewer reads it.": "Gitt e Grond un. De Préifer liest en.", + "Back": "Zréck", + "Next": "Weider", + "Send request": "Ufro schécken", + "The request was not sent. Try again.": "D’Ufro gouf net geschéckt. Probéiert nach eng Kéier.", + "Requested": "Gefrot", + "Not approved": "Net guttgeheescht", + "Your request was sent": "Är Ufro gouf geschéckt", + "Let everyone else request a project": "All déi aner däerfen e Projet ufroen", + "Add a task": "Aufgab derbäisetzen", + "Delete task": "Aufgab läschen", + "Edit task": "Aufgab änneren", + "Write": "Schreiwen", + "Preview": "Virschau", + "Markdown works here: headings, lists and links.": "Hei funktionéiert Markdown: Iwwerschrëften, Lëschten a Linken.", + "Could not save the task. Please try again.": "D'Aufgab konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Op \"{title}\" ass Zäit agedroen, dofir kann se net geläscht ginn. Dir kënnt se amplaz annuléieren: d'Zäitagäng bleiwen.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "\"{title}\" läschen? Hir Linken op aner Aufgaben ginn och ewechgeholl. Dat kann net réckgängeg gemaach ginn.", + "Keep task": "Aufgab behalen", + "Cancel task": "Aufgab annuléieren", + "Only the reporter, the project owner or an admin can delete this task.": "Just déi Persoun déi se gemellt huet, de Projetsbesëtzer oder en Admin kann dës Aufgab läschen.", + "Could not delete the task. Please try again.": "D'Aufgab konnt net geläscht ginn. Probéiert w.e.g. nach eng Kéier.", + "Could not cancel the task. Please try again.": "D'Aufgab konnt net annuléiert ginn. Probéiert w.e.g. nach eng Kéier.", + "Responsible": "Verantwortlech", + "Also working on this": "Schaffen och dorun", + "Labels": "Etiketten", + "Could not change the priority. Please try again.": "D'Prioritéit konnt net geännert ginn. Probéiert w.e.g. nach eng Kéier.", + "Other project members who work on this task alongside the person responsible.": "Aner Projetsmemberen, déi mat der verantwortlecher Persoun un dëser Aufgab schaffen.", + "Duplicate": "Duplizéieren", + "Could not copy the task. Please try again.": "D'Aufgab konnt net kopéiert ginn. Probéiert w.e.g. nach eng Kéier.", + "Subtasks": "Ënneraufgaben", + "{done} of {total} done": "{done} vun {total} fäerdeg", + "Add a subtask": "Ënneraufgab derbäisetzen", + "Checklist": "Checklëscht", + "Checklist item actions": "Aktioune fir de Lëschtenelement", + "Add a checklist item": "Element op d'Checklëscht setzen", + "Subtasks: {estimate} estimated, {logged} logged": "Ënneraufgaben: {estimate} geschat, {logged} agedroen", + "Total estimate: {total}": "Gesamtschätzung: {total}", + "Part of {title}": "Deel vun {title}", + "Checklist: {count} done": "Checklëscht: {count} fäerdeg", + "This task has subtasks: {count}.": "Dës Aufgab huet Ënneraufgaben: {count}.", + "Keep subtasks as separate tasks": "Ënneraufgaben als eege Aufgabe behalen", + "Delete subtasks too": "Ënneraufgaben och läschen", + "Copy of {title}": "Kopie vun {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "D'Aufgab gouf kopéiert, awer net all hir Ënneraufgaben. Kontrolléiert d'Kopie.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Kleng Schrëtt an der Aufgab. All Element huet eng ID, en Text an ob et fäerdeg ass.", + "Open work per person and per project.": "Oppen Aarbecht pro Persoun a pro Projet.", + "View": "Usiicht", + "By person": "No Persoun", + "By project": "No Projet", + "Hours left": "Verbleiwend Stonnen", + "Tasks without an estimate": "Aufgabe ouni Schätzung", + "Due in 14 days": "Fälleg an 14 Deeg", + "Shared": "Gedeelt", + "Unassigned": "Net zougewisen", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Et gëtt d'Aarbecht an de Projete gewisen, déi s du gesäis. Stonnen zielen fir déi verantwortlech Persoun; gedeelt Aufgabe ginn ouni Stonnen gezielt.", + "No open work in these projects.": "Keng oppen Aarbecht an dëse Projeten.", + "Open work": "Oppen Aarbecht", + "{count} open tasks": "{count} oppen Aufgaben", + "Create a project to see capacity here.": "Maach e Projet un, fir hei d'Kapazitéit ze gesinn.", + "My tasks": "Meng Aufgaben", + "Show all my tasks": "All meng Aufgabe weisen", + "No tasks assigned to you": "Dir sinn keng Aufgaben zougewisen", + "Browse projects": "Projete duerchsichen", + "Later": "Méi spéit", + "Due {date}": "Fälleg {date}", + "Could not change the status. Please try again.": "De Status konnt net geännert ginn. Probéier nach eng Kéier.", + "Completed today": "Haut ofgeschloss", + "My open tasks": "Meng oppen Aufgaben", + "My overdue tasks": "Meng iwwerfälleg Aufgaben", + "My tasks in progress": "Meng Aufgaben amgaang", + "Pin to the top": "Uewen upinnen", + "Unpin": "Lassmaachen", + "Pinned": "Ugepinnt", + "Actions for {title}": "Aktioune fir {title}", + "Could not save your project order. Please try again.": "D'Reiefolleg vun denge Projete konnt net gespäichert ginn. Probéier nach eng Kéier.", + "No boards yet": "Nach keng Boards", + "Create a project to get a board.": "Maach e Projet un, fir e Board ze kréien.", + "Use the Projects page to create and manage your projects and tasks.": "Benotz d'Säit Projeten, fir deng Projeten an Aufgaben unzeleeën an ze geréieren.", + "Go to projects": "Bei d'Projeten", + "You are not a member of any projects yet.": "Du bass nach a kengem Projet Member.", + "Could not search for users. Please try again.": "D'Benotzer konnte net gesicht ginn. Probéier nach eng Kéier.", + "Project creation is restricted to administrators.": "Just Administrateure kënne Projeten uleeën.", + "Only the project owner or an administrator can delete this project.": "Just de Projetsbesëtzer oder en Administrateur kann dëse Projet läschen.", + "No projects are available to you yet. Ask an administrator to create one.": "Et sinn nach keng Projete fir dech disponibel. Fro en Administrateur, fir een unzeleeën.", + "Due: {date}": "Fälleg: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Aufgaben mat engem Start- oder Fällegkeetsdatum stinn op der Zäitlinn. Setz Datumer derbäi, fir se hei ze gesinn.", + "You do not have access to this project.": "Du hues keen Zougang zu dësem Projet.", + "Zoom level": "Zoomniveau", + "Unscheduled": "Net geplangt", + "Start: {date}": "Start: {date}", + "Today": "Haut", + "No scheduled tasks": "Keng geplangt Aufgaben", + "An unexpected error occurred.": "En onerwaarte Feeler ass opgetrueden.", + "Column {number} name": "Numm vun der Kolonn {number}", + "Failed to save creation policy": "D'Reegel fir d'Uleeën konnt net gespäichert ginn", + "All authenticated users": "All ugemellt Benotzer", + "Control who may create new projects": "Leeë fest, wien nei Projeten uleeë kann", + "Administrators only": "Just Administrateuren", + "Project creation": "Projeten uleeën", + "Allow project creation": "Uleeë vu Projeten erlaben", + "Creation policy saved successfully": "Reegel fir d'Uleeë gespäichert", + "Initializing…": "Gëtt gestart…", + "e.g. 2h 30m, 90m, 1.5h": "z. B. 2h 30m, 90m, 1.5h", + "Log time": "Zäit buchen", + "Save estimate": "Schätzung späicheren", + "Logged: {logged}": "Gebucht: {logged}", + "over by {amount}": "{amount} driwwer", + "Time tracking": "Zäiterfaassung", + "Estimate": "Schätzung", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Gëff eng gëlteg Schätzung an (z. B. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Gëff eng gëlteg Dauer an (z. B. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "D'Zäitbuchung konnt net gespäichert ginn. Probéier nach eng Kéier.", + "Edit time entry": "Zäitbuchung änneren", + "Duration": "Dauer", + "Date range": "Zäitraum", + "Last week": "Lescht Woch", + "No time logged": "Keng Zäit gebucht", + "Log time on a task to see it here.": "Buch Zäit op eng Aufgab, fir se hei ze gesinn.", + "To date": "Bis Datum", + "This week": "Dës Woch", + "Total: {total}": "Total: {total}", + "From date": "Vum Datum", + "Custom range": "Eegenen Zäitraum", + "All time": "Ganz Zäit", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Eng Aufgab konnt net geläscht ginn, dofir kënnen Donnéeë bleiwen. Läsch de Projet nach eng Kéier.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Eng Zäitbuchung konnt net geläscht ginn, dofir kënnen Donnéeë bleiwen. Läsch de Projet nach eng Kéier.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Eng Kolonn konnt net geläscht ginn, dofir kënnen Donnéeë bleiwen. Läsch de Projet nach eng Kéier.", + "Could not delete the project. Please try again.": "De Projet konnt net geläscht ginn. Probéier nach eng Kéier.", + "Notification settings": "Notifikatiounsastellungen", + "Configure when due-date reminders are sent": "Leeë fest, wéini Erënnerunge fir Fällegkeetsdatume geschéckt ginn", + "Due-date reminder lead time (hours)": "Virlafzäit vun der Erënnerung (Stonnen)", + "Lead time must be between 1 and 336 hours": "D'Virlafzäit muss tëscht 1 an 336 Stonne leien", + "Reminder lead time saved successfully": "Virlafzäit vun der Erënnerung gespäichert", + "Failed to save reminder lead time": "D'Virlafzäit vun der Erënnerung konnt net gespäichert ginn", + "Notifications": "Notifikatiounen", + "Notify me 1 day before a task's due date": "Informéier mech 1 Dag virum Fällegkeetsdatum vun enger Aufgab", + "Draft": "Entworf", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Ob d'Stonn en Entworf ass, deen nëmmen hiren Enseignant gesäit, stattfënnt oder ausfält.", + "New release": "Nei Versioun", + "Roadmap chart. The same releases and epics are listed below.": "Roadmap-Diagramm. Déi selwecht Versiounen an Epics stinn ënnen an enger Lëscht.", + "Nothing on the roadmap yet": "Nach näischt op der Roadmap", + "Releases with a target date and epics with dated tasks appear here.": "Hei erschénge Versioune mat engem Zildatum an Epics mat datéierten Aufgaben.", + "Releases": "Versiounen", + "No releases yet": "Nach keng Versiounen", + "Target date: {date}": "Zildatum: {date}", + "No target date": "Keen Zildatum", + "Edit {name}": "{name} beaarbechten", + "Mark {name} as released": "{name} als verëffentlecht markéieren", + "Mark as released": "Als verëffentlecht markéieren", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Nach keng Epics. Maacht eng Aufgab op, fir en Epic draus ze maachen.", + "Not scheduled yet": "Nach net geplangt", + "Planned": "Geplangt", + "Released": "Verëffentlecht", + "Edit release": "Versioun beaarbechten", + "Target date": "Zildatum", + "Could not save the release. Please try again.": "D'Versioun konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "Every task of this release is done or cancelled.": "All Aufgab vun dëser Versioun ass fäerdeg oder ofgebrach.", + "Not finished yet: {count}": "Nach net fäerdeg: {count}", + "What happens to these tasks?": "Wat geschitt mat dësen Aufgaben?", + "Move to {name}": "Op {name} réckelen", + "Remove the release": "D'Versioun ewechhuelen", + "Keep it on {name}": "Op {name} loossen", + "Could not mark the release as released. Please try again.": "D'Versioun konnt net als verëffentlecht markéiert ginn. Probéiert w.e.g. nach eng Kéier.", + "Roadmap": "Roadmap", + "Tasks or roadmap": "Aufgaben oder Roadmap", + "Release": "Versioun", + "Epic": "Epic", + "This task is an epic": "Dës Aufgab ass en Epic", + "A named, dated delivery of a project that its tasks are planned against.": "Eng benannt, datéiert Liwwerung vun engem Projet, op déi seng Aufgabe geplangt ginn.", + "Name of the release": "Numm vun der Versioun", + "The project this release belongs to": "De Projet, zu deem dës Versioun gehéiert", + "What this release delivers": "Wat dës Versioun liwwert", + "When work on the release starts": "Wéini d'Aarbecht un der Versioun ufänkt", + "The date the release is due": "Den Datum, bis wéini d'Versioun fäerdeg muss sinn", + "Whether the release is planned, released or archived": "Ob d'Versioun geplangt, verëffentlecht oder archivéiert ass", + "Released on": "Verëffentlecht den", + "When the release was marked as released": "Wéini d'Versioun als verëffentlecht markéiert gouf", + "The release this task is planned for": "D'Versioun, fir déi dës Aufgab geplangt ass", + "Board view options": "Uweisungsoptiounen vum Board", + "Colour cards": "Kaarte fierwen", + "No colour": "Keng Faarf", + "By label": "No Label", + "Swimlanes": "Swimlanes", + "No swimlanes": "Keng Swimlanes", + "By assignee": "No zougewisener Persoun", + "By epic": "No Epic", + "No assignee": "Net zougewisen", + "No epic": "Keen Epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kaarte bleiwen an der Zeil vun hirem Epic. Ännert den Epic op der Säit vun der Aufgab.", + "Hand over to": "Iwwerginn un", + "Could not save your board view. It applies until you reload.": "Är Board-Usiicht gouf net gespäichert. Se gëllt bis Dir nei lued.", + "Timetable wish": "Stonneplangwonsch", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "E Wonsch, deen de Generator berécksiichtegt. E strenge Wonsch hält en ëmmer an, e flexiblen do wou et geet.", + "Whether the wish is about a teacher, a group, a room or one activity": "Ob de Wonsch en Enseignant, eng Grupp, e Sall oder eng Aktivitéit betrëfft", + "Teacher": "Enseignant", + "Group": "Grupp", + "Reference": "Referenz", + "The user, group, room or activity the wish is about": "De Benotzer, d'Grupp, de Sall oder d'Aktivitéit, ëm déi et geet", + "What the wish asks for": "Wat de Wonsch freet", + "Not on these periods": "Net an dëse Stonnen", + "Preferably not on these periods": "Léiwer net an dëse Stonnen", + "At most a number of lessons a day": "Héchstens eng Zuel u Stonnen den Dag", + "No free periods between lessons": "Keng Fräistonnen tëscht de Stonnen", + "Always the same room": "Ëmmer dee selwechte Sall", + "Periods": "Stonnen", + "The periods of the week the wish is about, such as wed-5": "D'Stonnen vun der Woch, ëm déi et geet, zum Beispill wed-5", + "Limit": "Limit", + "The most lessons a day, for a wish of that kind": "Déi meescht Stonnen den Dag, fir e Wonsch vun där Aart", + "Strength": "Stäerkt", + "Whether the generator must keep the wish or should keep it": "Ob de Generator de Wonsch muss oder sollt anhalen", + "Hard": "Streng", + "Soft": "Flexibel", + "Weight": "Gewiicht", + "How much a soft wish counts, from 1 to 3": "Wéi vill e flexibele Wonsch zielt, vun 1 bis 3", + "Why the wish exists": "Firwat et de Wonsch gëtt", + "Timetable scenario": "Stonneplangszenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "E Wochemuster, vum Generator gemaach oder aus dem aktuelle Stonneplang iwwerholl. Et hält seng Agab a wéi gutt et d'Wënsch anhält.", + "The name timetablers know the scenario by": "Den Numm, ënner deem d'Planer d'Szenario kennen", + "Whether the generator made it or it came from the current timetable": "Ob de Generator et gemaach huet oder et aus dem aktuelle Stonneplang kënnt", + "Generated": "Generéiert", + "From the current timetable": "Aus dem aktuelle Stonneplang", + "Week of": "Woch vum", + "The Monday of the first week of the window": "De Méindeg vun der éischter Woch vun der Period", + "Window start": "Ufank vun der Period", + "The first day the week pattern applies to": "Den éischten Dag, fir deen d'Wochemuster gëllt", + "Window end": "Enn vun der Period", + "The last day the week pattern applies to": "De leschten Dag, fir deen d'Wochemuster gëllt", + "Waiting, generating, done, failed, or published as draft lessons": "Waart, gëtt generéiert, fäerdeg, feelgeschloen oder als Entworfsstonne publizéiert", + "Waiting": "Waart", + "Generating": "Gëtt generéiert", + "Failed": "Feelgeschloen", + "Published": "Publizéiert", + "Seed": "Startwäert", + "The number the generator starts from, so a run can be repeated": "D'Zuel, mat där de Generator ufänkt, sou datt e Laf ka widderholl ginn", + "Input": "Agab", + "The periods, rooms, lessons and wishes the scenario was made from": "D'Stonnen, Säll, Couren a Wënsch, aus deenen d'Szenario entstanen ass", + "Placements": "Placementer", + "Each lesson with the period and room it was given": "All Cours mat der Stonn an dem Sall, déi e krut", + "Unplaced lessons": "Net placéiert Couren", + "Lessons without a place, each with the hard wish that blocked it": "Couren ouni Plaz, all mat dem strenge Wonsch, deen en blockéiert huet", + "Broken wishes": "Verletzt Wënsch", + "The wishes this scenario breaks, with the lessons that break them": "D'Wënsch, déi dëst Szenario verletzt, mat de Couren, déi se verletzen", + "Measures": "Moossen", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Placéiert Couren, verletzt Wënsch, Fräistonnen, Couren den Dag a Sallbenotzung", + "Reason": "Grond", + "Why the run failed": "Firwat de Laf feelgeschloen ass", + "Published at": "Publizéiert den", + "When the scenario was written out as draft lessons": "Wéini d'Szenario als Entworfsstonne geschriwwe gouf", + "Edit wish": "Wonsch änneren", + "New wish": "Neie Wonsch", + "Hard: the generator always keeps it": "Fix: de Generator hält sech ëmmer drun", + "Soft: the generator keeps it where it can": "Flexibel: de Generator hält sech drun, wou e kann", + "Weight (1 to 3)": "Gewiicht (1 bis 3)", + "Most lessons a day": "Héchstens Stonnen den Dag", + "Period": "Stonn", + "{day} period {number}": "{day} Stonn {number}", + "Teacher (user name)": "Enseignant (Benotzernumm)", + "Activity (group:subject)": "Aktivitéit (Grupp:Fach)", + "Say who or what the wish is about.": "Gitt un, wien oder wat de Wonsch betrëfft.", + "Choose at least one period.": "Wielt mindestens eng Stonn.", + "The limit is a whole number of 1 or more.": "D'Limit ass eng ganz Zuel vun 1 oder méi.", + "Timetable": "Stonneplang", + "Wishes": "Wënsch", + "Timetable wishes": "Stonneplangwënsch", + "Generator run": "Generatorlaf", + "Generator progress": "Fortschrëtt vum Generator", + "The run failed: {reason}": "De Laf ass feelgeschloen: {reason}", + "{placed} of {lessons} lessons placed": "{placed} vun {lessons} Stonne placéiert", + "Generate again": "Nach eng Kéier generéieren", + "Generate": "Generéieren", + "Every lesson has a place.": "All Stonn huet eng Plaz.", + "Lesson": "Stonn", + "No free period and room": "Keng fräi Stonn a kee fräie Sall", + "Broken soft wishes": "Verletzt flexibel Wënsch", + "Every soft wish is kept.": "All flexibel Wonsch gëtt agehalen.", + "Wish": "Wonsch", + "Lessons": "Stonnen", + "Generating: {percent}% of the time budget used": "Gëtt generéiert: {percent}% vun der Zäit gebraucht", + "Waiting to start": "Waart op de Start", + "Published as draft lessons": "Als Entworfsstonne publizéiert", + "Could not read the scenario.": "De Szenario konnt net gelies ginn.", + "Could not start the run.": "De Laf konnt net gestart ginn.", + "Scenarios": "Szenarien", + "Timetable scenarios": "Stonneplangszenarien", + "Scenario": "Szenario", + "Take the current timetable": "Aktuelle Stonneplang iwwerhuelen", + "Could not take the current timetable.": "Den aktuelle Stonneplang konnt net iwwerholl ginn.", + "Broken hard wishes": "Verletzt haart Wënsch", + "Not on a period of the week grid": "Net op enger Stonn vum Wochegitter", + "Compare scenarios": "Szenarie vergläichen", + "Scenarios to compare": "Szenarien zum Vergläichen", + "Choose two or three scenarios to compare them.": "Wielt zwee oder dräi Szenarien fir se ze vergläichen.", + "Measure": "Moossgréisst", + "Best": "Beschte Wäert", + "Lessons that differ": "Stonnen, déi sech ënnerscheeden", + "No lesson differs.": "Keng Stonn ënnerscheet sech.", + "Not placed": "Net placéiert", + "{period} in {room}": "{period} am {room}", + "Lessons placed": "Placéiert Stonnen", + "Lessons without a place": "Stonnen ouni Plaz", + "Clashes": "Konflikter", + "Hard wishes broken": "Verletzt fix Wënsch", + "Soft wishes broken": "Verletzt flexibel Wënsch", + "Soft wishes broken, weighted": "Verletzt flexibel Wënsch, gewiicht", + "Free periods between lessons, all teachers": "Fräistonnen, all Enseignanten", + "Most free periods of one teacher": "Meeschte Fräistonne vun engem Enseignant", + "Most lessons of one group on a day": "Meeschte Stonne vun enger Grupp un engem Dag", + "Room use": "Sallbenotzung", + "Publish as draft lessons": "Als Entworfsstonne publizéieren", + "Draft lessons written: {count}": "Entworfsstonne geschriwwen: {count}", + "Could not publish the scenario.": "De Szenario konnt net publizéiert ginn.", + "Rules": "Reegelen", + "Rules for {column}": "Reegele fir {column}", + "When a card enters this column": "Wann eng Kaart an dës Kolonn kënnt", + "Action": "Aktioun", + "Set the priority": "Prioritéit setzen", + "Assign to": "Zouweisen un", + "Assign the person who moved the card": "Der Persoun zouweisen, déi d'Kaart verréckelt huet", + "Remove the assignee": "Zouweisung ewechhuelen", + "Add a label": "Label derbäisetzen", + "No longer a project member": "Net méi Member vum Projet", + "This label no longer exists": "Dëse Label gëtt et net méi", + "Add rule": "Reegel derbäisetzen", + "Remove rule": "Reegel ewechhuelen", + "No rules yet. Add one to change a card when it enters this column.": "Nach keng Reegelen. Setzt eng derbäi, fir eng Kaart ze änneren, wann se an dës Kolonn kënnt.", + "Could not save the rules. Please try again.": "D'Reegele konnten net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "1 rule runs when a card enters this column": "1 Reegel leeft, wann eng Kaart an dës Kolonn kënnt", + "{count} rules run when a card enters this column": "{count} Reegele lafen, wann eng Kaart an dës Kolonn kënnt", + "Rules applied: {changes}": "Reegelen applizéiert: {changes}", + "assigned to {name}": "zougewisen un {name}", + "assignee removed": "Zouweisung ewechgeholl", + "priority {priority}": "Prioritéit {priority}", + "label {label}": "Label {label}", + "What happens to a card when it enters this column, applied in list order.": "Wat mat enger Kaart geschitt, wann se an dës Kolonn kënnt, an der Reiefolleg vun der Lëscht.", + "Value": "Wäert", + "What the rule does to the card.": "Wat d'Reegel mat der Kaart mécht.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "D'Prioritéit, d'Benotzer-ID oder d'Label-ID, déi d'Aktioun benotzt; eidel bei Aktiounen ouni Wäert.", + "is not": "ass net", + "{dimension} is not": "{dimension} ass net", + "Saved filters": "Gespäichert Filteren", + "No saved filters yet": "Nach keng gespäichert Filteren", + "Save filter": "Filter späicheren", + "Rename \"{name}\"": "„{name}“ ëmbenennen", + "Delete \"{name}\"": "„{name}“ läschen", + "Clear filters": "Filteren eidel maachen", + "Showing {shown} of {total} tasks": "{shown} vun {total} Aufgabe gewisen", + "Me": "Ech", + "No date": "Keen Datum", + "Rename saved filter": "Gespäicherte Filter ëmbenennen", + "Share with the project": "Mam Projet deelen", + "Give the filter a name": "Gitt dem Filter en Numm", + "Could not save the filter. Please try again.": "De Filter konnt net gespäichert ginn. Probéiert w.e.g. nach eng Kéier.", + "Some labels in \"{name}\" no longer exist and were left out.": "E puer Labelen an „{name}“ gëtt et net méi a si goufen ewechgelooss.", + "Could not delete the filter. Please try again.": "De Filter konnt net geläscht ginn. Probéiert w.e.g. nach eng Kéier.", + "Saved filter": "Gespäicherte Filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "E benannte Board-Filter vun engem Projet, privat fir déi Persoun, déi e gespäichert huet, ausser e gëtt mam Projet gedeelt.", + "The project whose board the filter applies to": "De Projet, op deem säi Board de Filter wierkt", + "The name the filter is listed under": "Den Numm, ënner deem de Filter an der Lëscht steet", + "Saved by": "Gespäichert vun", + "Nextcloud user id of the person who saved the filter": "Nextcloud-Benotzer-ID vun der Persoun, déi de Filter gespäichert huet", + "Shared with the project": "Mam Projet gedeelt", + "Whether every project member sees and applies the filter": "Ob all Projetmember de Filter gesäit an uwende kann", + "Criteria": "Critèren", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "De Filter: Zouweisung, Label, Prioritéit an Delai, all mat ass oder ass net an hire Wäerter", + "Cross-project view": "Projetiwwergräifend Usiicht", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Eng gespäichert Auswiel vu Projeten, där hir Aufgaben zesummen a Statusspalte gewise ginn, gedeelt mat de Leit, déi se nennt.", + "Shared with": "Gedeelt mat", + "The name the view is listed under": "Den Numm, ënner deem d'Usiicht opgelëscht ass", + "Nextcloud user id of the person who saved the view": "Nextcloud-Benotzer-ID vun der Persoun, déi d'Usiicht gespäichert huet", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-Benotzer-IDen vun de Leit, mat deenen d'Usiicht gedeelt ass", + "The projects whose tasks the view shows, at most twenty": "D'Projeten, där hir Aufgaben d'Usiicht weist, héchstens zwanzeg", + "1 project in this view is hidden from you.": "1 Projet an dëser Usiicht ass fir dech verstoppt.", + "{count} projects in this view are hidden from you.": "{count} Projeten an dëser Usiicht si fir dech verstoppt.", + "{project} has no column for {status}.": "{project} huet keng Spalt fir {status}.", + "This view does not exist or is not shared with you.": "Dës Usiicht gëtt et net oder se ass net mat dir gedeelt.", + "\"{task}\" moved to {status}.": "\"{task}\" op {status} geréckelt.", + "Project: {title}": "Projet: {title}", + "Cross-project views": "Projetiwwergräifend Usiichten", + "New view": "Nei Usiicht", + "Edit view": "Usiicht änneren", + "Delete view": "Usiicht läschen", + "Give the view a name": "Gëff der Usiicht en Numm", + "Pick at least one project": "Wiel mindestens ee Projet", + "A view shows at most {max} projects": "Eng Usiicht weist héchstens {max} Projeten", + "Could not save the view. Please try again.": "D'Usiicht konnt net gespäichert ginn. Prouf nach eng Kéier.", + "Could not delete the view. Please try again.": "D'Usiicht konnt net geläscht ginn. Prouf nach eng Kéier.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "\"{title}\" läschen? D'Projeten an hir Aufgabe bleiwe wéi se sinn.", + "People see the tasks of the projects they are in, never more.": "Jiddereen gesäit just d'Aufgabe vun de Projeten, an deenen hien ass.", + "No views yet. A view shows the tasks of several of your projects together.": "Nach keng Usiichten. Eng Usiicht weist d'Aufgabe vu méi Projete vun dir zesummen.", + "Projects in view: {count}": "Projeten an der Usiicht: {count}", + "Notify me when a task is assigned to me": "Informéier mech, wann mir eng Aufgab zougedeelt gëtt", + "Also send these to me by email": "Schéck mir dës och per E-Mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Setz eng E-Mail-Adress an dengen perséinlechen Nextcloud-Astellungen dobäi, fir E-Maile ze kréien.", + "Code link": "Code-Link", + "A commit, branch, merge request or issue in a code forge that works on a task.": "E Commit, eng Branche, eng Merge-Ufro oder en Issue op enger Code-Plattform, déi un enger Aufgab schafft.", + "The task the link belongs to": "D'Aufgab, zu där de Link gehéiert", + "The project of the task": "De Projet vun der Aufgab", + "Task key": "Aufgabeschlëssel", + "The task key the forge text named, such as VC-12": "Den Aufgabeschlëssel aus dem Text vun der Code-Plattform, z. B. VC-12", + "What the link points at": "Op wat de Link weist", + "Link": "Link", + "The address of the item in the forge": "D'Adress vum Element op der Code-Plattform", + "The commit message, branch name or merge request title": "D'Commit-Noriicht, den Numm vun der Branche oder den Titel vun der Merge-Ufro", + "Repository": "Repository", + "The repository, such as acme/portal": "De Repository, z. B. acme/portal", + "Forge id": "ID op der Plattform", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Déi eege ID vum Element op der Code-Plattform, z. B. github:acme/portal#42 oder e Commit-Hash", + "State": "Status", + "The state of a merge request or issue": "De Status vun enger Merge-Ufro oder engem Issue", + "Who made the commit or opened the merge request": "Wien de Commit gemaach oder d'Merge-Ufro opgemaach huet", + "When the commit was made or the merge request last changed": "Wéini de Commit gemaach gouf oder d'Merge-Ufro sech fir d'lescht geännert huet", + "Added by": "Dobäigesat vun", + "Whether a person added the link or the integration wrote it": "Ob eng Persoun de Link dobäigesat oder d'Integratioun e geschriwwen huet", + "Nextcloud user UIDs of project members": "Nextcloud-Benotzer-IDe vun de Projetsmemberen", + "Add link": "Link dobäisetzen", + "Added by hand": "Mat der Hand dobäigesat", + "Branch": "Branche", + "Code": "Code", + "Commit": "Commit", + "From the integration": "Vun der Integratioun", + "Link to a commit, branch or merge request": "Link op e Commit, eng Branche oder eng Merge-Ufro", + "Merge request": "Merge-Ufro", + "Merged": "Zesummegefouert", + "No code linked yet. Name {key} in a commit message or paste a link.": "Nach kee Code verlinkt. Nenn {key} an enger Commit-Noriicht oder paste e Link.", + "No code linked yet. Paste a link to a commit or merge request.": "Nach kee Code verlinkt. Paste e Link op e Commit oder eng Merge-Ufro.", + "Paste a web address that starts with https://.": "Paste eng Webadress, déi mat https:// ufänkt.", + "Remove link {title}": "Link {title} ewechhuelen", + "The link could not be added.": "De Link konnt net dobäigesat ginn.", + "The link could not be removed.": "De Link konnt net ewechgeholl ginn.", + "This link is already on the task.": "Dëse Link ass schonn un der Aufgab.", + "Code forges": "Code-Plattformen", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Verlinkt GitHub-Commits a Pull Requests mat Aufgaben. Integriq kritt d'Evenementer; planninq rifft GitHub ni op.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Luet d'Konfiguratioun erof an importéiert se an Integriq. Setzt dann e Geheimnis an der Regel \"Check the GitHub signature\" an.", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Setzt am GitHub dem Repository e Webhook mat dëser Adress an deemselwechte Geheimnis bäi. Wielt den Inhaltstyp application/json an d'Evenementer push a pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nennt den Aufgabeschlëssel, z. B. VC-12, an enger Commit-Noriicht, engem Branchennumm oder dem Titel vun engem Pull Request. De Link erschéngt dann bei där Aufgab.", + "Without Integriq, project members can still paste a link on the task page.": "Ouni Integriq kënnen d'Projetsmemberen ëmmer nach e Link op der Aufgabesäit pechen.", + "Download the Integriq configuration": "Integriq-Konfiguratioun eroflueden", + "Calendar": "Kalenner", + "Previous": "Virdrun", + "Calendar view": "Kalennerusiicht", + "Starts:": "Fänkt un:", + "No tasks with a date in this month.": "Keng Aufgabe mat engem Datum dëse Mount.", + "Week of {start} to {end}": "Woch vum {start} bis {end}", + "My calendar": "Mäi Kalenner", + "Show as list": "Als Lëscht weisen", + "Show as calendar": "Am Kalenner weisen", + "Open my calendar": "Mäi Kalenner opmaachen", + "Nextcloud Tasks": "Nextcloud Aufgaben", + "Show my tasks in Nextcloud Tasks": "Meng Aufgaben an Nextcloud Aufgaben weisen", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "D'Aufgaben, déi dir zougewisen oder mat dir gedeelt sinn, erschéngen an enger Lëscht \"Planninq\" an Nextcloud Aufgaben a Kalenner. Ännerungen do ginn duerch déi nächst Ännerung an Planninq ersat.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Dëse Server kann net an Nextcloud Aufgaben schreiwen, dofir ass den Export net disponibel.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Vu Planninq verwalt. Ännerungen hei ginn duerch déi nächst Ännerung an Planninq ersat.", + "Working days and holidays": "Aarbechtsdeeg a Feierdeeg", + "Dates set on the timeline skip the days that are not working days.": "Datumer, déi op der Zäitlinn gesat ginn, spréngen iwwer d'Deeg, déi keng Aarbechtsdeeg sinn.", + "Working weekdays": "Aarbechtsdeeg vun der Woch", + "Non-working days": "Fräi Deeg", + "No non-working days yet.": "Nach keng fräi Deeg.", + "Add day": "Dag derbäisetzen", + "Year": "Joer", + "Add Dutch national holidays": "Hollännesch Feierdeeg derbäisetzen", + "Save working days": "Aarbechtsdeeg späicheren", + "Choose at least one working weekday.": "Wiel mindestens een Aarbechtsdag.", + "Working days saved.": "Aarbechtsdeeg gespäichert.", + "Could not save the working days.": "D'Aarbechtsdeeg konnten net gespäichert ginn.", + "New Year's Day": "Neijoerschdag", + "Easter Sunday": "Ouschtersonndeg", + "Easter Monday": "Ouschterméindeg", + "King's Day": "Kinnekensdag", + "Liberation Day": "Befreiungsdag", + "Ascension Day": "Christi Himmelfahrt", + "Whit Sunday": "Péngschtsonndeg", + "Whit Monday": "Péngschtméindeg", + "Christmas Day": "Chrëschtdag", + "Boxing Day": "Stiefesdag", + "Dates of {title}": "Datume vun {title}", + "The due date cannot be before the start date.": "D'Fällegkeetsdatum däerf net virum Startdatum leien.", + "{title}, from {start} to {end}": "{title}, vum {start} bis {end}", + "The dates could not be saved.": "D'Datume konnten net gespäichert ginn.", + "{title} now runs from {start} to {end}": "{title} leeft elo vum {start} bis {end}", + "Auto-scheduling": "Automatesch Planung", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Wann et un ass, bitt e méi spéit Fällegkeetsdatum op der Zäitlinn un, déi blockéiert Aufgaben matzeréckelen.", + "Move blocked tasks along when a task slips": "Blockéiert Aufgaben matréckelen, wann eng Aufgab sech verspéit", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Op der Zäitlinn bitt e méi spéit Fällegkeetsdatum un, déi blockéiert Aufgaben matzeréckelen. Nëmme \"blockéiert\"-Linke zielen, an Aufgabe réckele just no hannen.", + "Move the tasks that wait for {title}?": "D'Aufgaben, déi op {title} waarden, réckelen?", + "These tasks wait for it and would start after its new due date:": "Dës Aufgabe waarden drop a géifen nom neien Datum ufänken:", + "{count} tasks would move; the first {limit} are listed.": "{count} Aufgabe géife geréckelt; déi éischt {limit} stinn hei.", + "Now": "Elo", + "After the move": "Nom Réckelen", + "Only this task": "Just dës Aufgab", + "Move all": "All réckelen", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Bei {title} gestoppt: d'Datume konnten net gespäichert ginn. D'Aufgabe virdrun goufe geréckelt.", + "Cumulative flow": "Kumulativen Floss", + "Show as chart": "Als Diagramm weisen", + "Show as table": "Als Tabell weisen", + "Tasks per column per day": "Aufgaben pro Kolonn pro Dag", + "Tasks without recorded history in this period: {count}": "Aufgaben ouni opgezeechent Geschicht an dëser Period: {count}", + "Lead and cycle time": "Duerchlaf- a Zykluszäit", + "No tasks were finished in this period.": "An dëser Period gouf keng Aufgab ofgeschloss.", + "Finished tasks": "Ofgeschloss Aufgaben", + "Cycle time, average": "Zykluszäit, Duerchschnëtt", + "Cycle time, 85th percentile": "Zykluszäit, 85. Perzentil", + "Lead time, average": "Duerchlafzäit, Duerchschnëtt", + "Tasks whose finish time was estimated from their history: {count}": "Aufgaben, där hir Schlusszäit aus der Geschicht geschat gouf: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Zykluszäit vun all ofgeschlossener Aufgab, mam Duerchschnëtt an dem 85. Perzentil", + "Slowest tasks": "Lues Aufgaben", + "cycle {cycle}, lead {lead}": "Zyklus {cycle}, Duerchlaf {lead}", + "{days} days": "{days} Deeg", + "Could not load the flow of this project.": "De Floss vun dësem Projet konnt net geluede ginn.", + "Last {days} days": "Lescht {days} Deeg", + "Portfolio flow": "Portfolio-Floss", + "An admin adds portfolios under Projects, Portfolios.": "En Administrateur füügt Portfolioen ënner Projeten, Portfolioen derbäi.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Net gewise Projeten, well héchstens 50 gläichzäiteg gewise ginn: {count}", + "Could not load the flow of this portfolio.": "De Floss vun dësem Portfolio konnt net geluede ginn.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativen Floss an Zykluszäit iwwer d'Projete vun engem Portfolio.", + "Edit report": "Bericht beaarbechten", + "Only tasks where": "Just Aufgaben, bei deenen", + "Group by": "Gruppéieren no", + "Display": "Duerstellung", + "Share with everyone who can read its projects": "Mat jidderengem deelen, deen d'Projete liese kann", + "The report could not be saved.": "De Bericht konnt net gespäichert ginn.", + "Number of tasks": "Zuel vun Aufgaben", + "Bar": "Balken", + "Donut": "Rank", + "Table": "Tabell", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} vun {total} Projeten an dësem Bericht sinn fir dech net siichtbar", + "No tasks match this report.": "Keng Aufgab passt op dëse Bericht.", + "None": "Keng", + "Could not load this report.": "Dëse Bericht konnt net geluede ginn.", + "Report": "Bericht", + "Your reports": "Deng Berichter", + "My reports": "Meng Berichter", + "Shared reports": "Gedeelt Berichter", + "You have not built a report yet.": "Du hues nach kee Bericht gemaach.", + "Nobody has shared a report with you yet.": "Nach keen huet e Bericht mat dir gedeelt.", + "Reports you built over tasks, and the ones shared with you.": "Berichter, déi s du iwwer Aufgaben erstallt hues, an déi, déi mat dir gedeelt goufen.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Eng gespäichert Ufro iwwer Aufgaben: wéi eng Projeten, wéi eng Filteren, no wat gruppéiert, gezielt oder summéiert, an als Tabell oder Diagramm gewisen.", + "The name the report is listed under": "Den Numm, ënner deem de Bericht opgelëscht ass", + "What the report shows and who it is for": "Wat de Bericht weist a fir wien en ass", + "Nextcloud user id of the person who saved the report": "Nextcloud-Benotzer-ID vun der Persoun, déi de Bericht gespäichert huet", + "Who can open the report": "Wien de Bericht opmaache kann", + "Only me": "Just ech", + "Everyone who can read its projects": "Jiddereen, deen d'Projete liese kann", + "The projects the report covers, at most fifty": "D'Projeten, déi de Bericht ëmfaasst, héchstens fofzeg", + "Filters": "Filteren", + "Task fields and the value each must equal": "Aufgabefelder an de Wäert, deem all eenzelt gläiche muss", + "The task field the report groups on": "D'Aufgabefeld, no deem de Bericht gruppéiert", + "Count the tasks, or add up a number on them": "D'Aufgaben zielen oder eng Zuel op hinnen summéieren", + "Sum": "Summ", + "Sum of": "Summ vun", + "The number added up when the measure is a sum": "D'Zuel, déi summéiert gëtt, wann d'Mooss eng Summ ass", + "Story points": "Story Points", + "Estimated duration": "Geschate Dauer", + "How the report is shown": "Wéi de Bericht gewise gëtt", + "Issue type": "Tickettyp", + "Task fields and the value each must equal; empty when the report covers every task": "Felder vun der Aufgab an de Wäert, deen all Feld muss hunn; eidel, wann de Bericht all Aufgabe ëmfaasst", + "The status a task must have": "De Status, deen eng Aufgab muss hunn", + "The priority a task must have": "D'Prioritéit, déi eng Aufgab muss hunn", + "The user a task must be assigned to": "De Benotzer, deem eng Aufgab muss zougewise sinn", + "A label a task must carry": "E Label, deen eng Aufgab muss droen", + "The board column a task must be in": "D'Kolonn vum Board, an där eng Aufgab muss stoen", + "The issue type a task must have": "Den Tickettyp, deen eng Aufgab muss hunn", + "Manager groups": "Verwaltungsgruppen", + "Member groups": "Membergruppen", + "Viewer groups": "Lieser-Gruppen", + "Viewers": "Lieser", + "Owning group": "Besëtzer-Grupp", + "Nextcloud groups whose members manage the project": "Nextcloud-Gruppen, deenen hir Memberen de Projet verwalten", + "Nextcloud groups whose members work on the project": "Nextcloud-Gruppen, deenen hir Memberen um Projet schaffen", + "Nextcloud groups whose members may read the project": "Nextcloud-Gruppen, deenen hir Memberen de Projet liese dierfen", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-Benotzer, déi de Projet verwalten: Astellungen, Memberen an Aarbecht", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-Benotzer, déi de Projet a seng Aarbecht liesen, awer net änneren dierfen", + "The Nextcloud group that owns the project with its creator, at most one": "D'Nextcloud-Grupp, där de Projet mat sengem Ersteller gehéiert, héchstens eng", + "Nextcloud user ids who may read this through the project": "Nextcloud-Benotzer, déi dat iwwer de Projet liese dierfen", + "Nextcloud groups whose members may change this through the project": "Nextcloud-Gruppen, deenen hir Memberen dat iwwer de Projet ännere dierfen", + "Nextcloud groups whose members may read this through the project": "Nextcloud-Gruppen, deenen hir Memberen dat iwwer de Projet liese dierfen", + "Search for a person or a group…": "No enger Persoun oder engem Grupp sichen…", + "No one found. Your admin's sharing settings decide who you can find.": "Keen fonnt. D'Deelastellunge vun denger Administratioun entscheeden, wien s du fanne kanns.", + "Type at least two characters": "Gëff mindestens zwee Zeeche an", + "Everyone in this group": "All an dësem Grupp", + "Could not search for people. Please try again.": "D'Sich no Persoune huet net geklappt. Probéier nach eng Kéier.", + "Could not remove the group": "De Grupp konnt net ewechgeholl ginn", + "Only the owner and managers change who is on this project.": "Nëmmen de Besëtzer an d'Verwalter änneren, wien op dësem Projet ass.", + "Role of {name}": "Roll vu(n) {name}", + "Manager": "Verwalter", + "Member": "Member", + "Viewer": "Lieser", + "Could not change the role": "D'Roll konnt net geännert ginn", + "Owned by group: {name}": "Am Besëtz vum Grupp: {name}", + "No group owns this project.": "Kee Grupp besëtzt dëse Projet.", + "Owned by group": "Am Besëtz vum Grupp", + "Search for a group…": "No engem Grupp sichen…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Kee Grupp fonnt. D'Deelastellunge vun denger Administratioun bestëmmen, wéi eng Gruppen s du fanne kanns.", + "No owning group": "Kee Besëtzergrupp", + "Could not search for groups. Please try again.": "Gruppe konnten net gesicht ginn. Probéier nach eng Kéier.", + "Could not change the owning group": "De Besëtzergrupp konnt net geännert ginn", + "You can read this project. Only its members change it.": "Du kanns dëse Projet liesen. Nëmme seng Memberen änneren en.", + "Course": "Cours", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "De Cours, deen an dëser Stonn ënnerriicht gëtt, zum Beispill eng Optioun, wann d'Léier-App vun der Schoul en kennt.", + "Online meeting link": "Link op déi online Stonn", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Wou d'Schüler online un dëser Stonn deelhuelen. De Knäppchen Deelhuelen erschéngt nëmme bei engem https-Link." }, "plurals": null } diff --git a/l10n/lt.js b/l10n/lt.js index 8fce2bf3..2b6c7118 100644 --- a/l10n/lt.js +++ b/l10n/lt.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktyvūs projektai", + "Archived projects": "Archyvuoti projektai", + "Boards": "Lentos", + "My projects": "Mano projektai", + "Portfolio": "Portfelis", + "Project board": "Projekto lenta", + "Projects I am in": "Projektai, kuriuose dalyvauju", + "Timeline": "Laiko juosta", + "Timesheet": "Darbo laiko apskaita", + "Features & roadmap": "Funkcijos ir planas", + "Flow": "Srautas", + "Flows": "Srautai", + "Reports": "Ataskaitos", + "Pick a report to open it.": "Pasirinkite ataskaitą, kad ją atidarytumėte.", + "In progress": "Vykdoma", + "Date": "Data", + "Due": "Terminas", + "Assignee": "Priskirta", + "Who": "Kas", + "What": "Kas", + "Minutes": "Minutės", + "Entries": "Įrašai", + "Most recent": "Naujausi", + "Per person": "Vienam asmeniui", + "By status": "Pagal būseną", + "By priority": "Pagal prioritetą", + "Task status": "Užduočių būsena", + "Time spent": "Sugaištas laikas", + "Capacity": "Pajėgumas", + "Due soonest": "Artimiausi terminai", + "Minutes logged": "Užregistruotos minutės", + "Nothing is due": "Nėra artėjančių terminų", + "Nothing logged yet": "Dar nieko neužregistruota", + "What is open, what is blocked, and what is overdue.": "Kas atidaryta, kas užblokuota ir kas vėluoja.", + "How allocation is spread across the people working on projects.": "Kaip krūvis pasiskirsto tarp žmonių, dirbančių prie projektų.", + "Hours logged, and the projects they went to.": "Užregistruotos valandos ir projektai, kuriems jos skirtos.", + "Billable": "Apmokestinama", + "Budget: {amount}": "Biudžetas: {amount}", + "Loading projects": "Įkeliami projektai", + "No projects for this client yet": "Šiam klientui projektų dar nėra", + "Open in Planninq": "Atidaryti Planninq", + "This project could not be found": "Šis projektas nerastas", + "Untitled project": "Projektas be pavadinimo", + "and {count} more": "ir dar {count}", + "Store": "Parduotuvė", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Įdiekite registrus, schemas ir srautus, kuriuos paskelbė kitos organizacijos.", + "Work Date": "Darbo data", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Stulpelio veiksmai", + "Columns": "Stulpeliai", + "Could not remove the column. Please try again.": "Nepavyko pašalinti stulpelio. Bandykite dar kartą.", + "Could not save the column. Please try again.": "Nepavyko išsaugoti stulpelio. Bandykite dar kartą.", + "Done column": "Atliktų stulpelis", + "Edit column": "Redaguoti stulpelį", + "Keep the card's status": "Išlaikyti kortelės būseną", + "Move its cards to": "Perkelti jo korteles į", + "Move left": "Perkelti į kairę", + "Move right": "Perkelti į dešinę", + "Status of cards moved here": "Čia perkeltų kortelių būsena", + "The last done column cannot be removed.": "Paskutinio atliktų stulpelio pašalinti negalima.", + "WIP limit": "WIP riba", + "over limit": "virš ribos", + "The status a card gets when it is moved into this column.": "Būsena, kurią kortelė gauna, kai perkeliama į šį stulpelį.", + "All priorities": "Visi prioritetai", + "Could not create the task. Please try again.": "Nepavyko sukurti užduoties. Bandykite dar kartą.", + "Created": "Sukurta", + "Move to backlog": "Į atsargų sąrašą", + "Move to board": "Į lentą", + "New task": "Nauja užduotis", + "Nothing in the backlog": "Atsargų sąrašas tuščias", + "Rank": "Rangas", + "Sort by": "Rikiuoti pagal", + "Sort by rank to reorder": "Norėdami pertvarkyti, rikiuokite pagal rangą", + "Task actions": "Užduoties veiksmai", + "All labels": "Visos žymės", + "Filter tasks by label": "Filtruoti užduotis pagal žymę", + "View timeline": "Rodyti laiko juostą", + "Board": "Lenta", + "List": "Sąrašas", + "Column": "Stulpelis", + "Board or list": "Lenta arba sąrašas", + "Log": "Žurnalas", + "Add entry": "Pridėti įrašą", + "Show": "Rodyti", + "No actions yet": "Veiksmų dar nėra", + "Closed": "Uždaryta", + "Entry actions": "Įrašo veiksmai", + "Add action": "Pridėti veiksmą", + "by {author}": "autorius {author}", + "saved {time}": "išsaugota {time}", + "Attendees: {names}": "Dalyviai: {names}", + "Add the first entry": "Pridėti pirmą įrašą", + "Issues": "Problemos", + "Lessons learned": "Pamokos", + "Meetings": "Susitikimai", + "Decisions": "Sprendimai", + "Actions": "Veiksmai", + "Issue": "Problema", + "Lesson learned": "Pamoka", + "Meeting": "Susitikimas", + "Decision": "Sprendimas", + "About this project": "Apie šį projektą", + "No description yet": "Aprašymo dar nėra", + "Start date": "Pradžios data", + "Not set": "Nenustatyta", + "End date": "Pabaigos data", + "Progress": "Pažanga", + "No tasks yet": "Užduočių dar nėra", + "Open the board": "Atverti lentą", + "People": "Žmonės", + "Owner": "Savininkas", + "Latest log entries": "Naujausi įrašai", + "Open the log": "Atverti žurnalą", + "{done} of {total} tasks done": "Atlikta {done} iš {total} užduočių", + "Edit entry": "Redaguoti įrašą", + "Type": "Rūšis", + "Attendees": "Dalyviai", + "Issue is closed": "Problema uždaryta", + "Could not save the entry. Please try again.": "Nepavyko išsaugoti įrašo. Bandykite dar kartą.", + "From: {title}": "Iš: {title}", + "What needs to happen": "Ką reikia padaryti", + "Could not create the action. Please try again.": "Nepavyko sukurti veiksmo. Bandykite dar kartą.", + "The action was created but could not be linked to the entry.": "Veiksmas sukurtas, bet jo nepavyko susieti su įrašu.", + "Project pages": "Projekto puslapiai", + "Overview": "Apžvalga", + "Risks": "Rizikos", + "Log entry": "Žurnalo įrašas", + "A short name for the entry": "Trumpas įrašo pavadinimas", + "Project": "Projektas", + "The project this entry belongs to": "Projektas, kuriam priklauso šis įrašas", + "What kind of entry this is": "Kokios rūšies tai įrašas", + "When it happened": "Kada tai įvyko", + "What happened, in Markdown": "Kas įvyko, Markdown formatu", + "Whether an issue is still open": "Ar problema vis dar atvira", + "The people at a meeting": "Susitikimo dalyviai", + "Tasks that came out of this entry": "Iš šio įrašo kilusios užduotys", + "Add risk": "Pridėti riziką", + "Risk": "Rizika", + "Score": "Balas", + "Response": "Atsakas", + "Review date": "Peržiūros data", + "no longer on the project": "nebėra projekte", + "Edit {title}": "Redaguoti {title}", + "No risks recorded yet": "Rizikų dar neužregistruota", + "Add the first risk": "Pridėti pirmą riziką", + "Medium": "Vidutinė", + "Mitigating": "Mažinama", + "Occurred": "Įvyko", + "Avoid": "Vengti", + "Reduce": "Mažinti", + "Transfer": "Perduoti", + "Accept": "Priimti", + "Highest open risks": "Didžiausios atviros rizikos", + "No open risks": "Atvirų rizikų nėra", + "Open the risk register": "Atverti rizikų registrą", + "Edit risk": "Redaguoti riziką", + "What could go wrong": "Kas gali nepavykti", + "Likelihood": "Tikimybė", + "Impact": "Poveikis", + "Score {score}": "Balas {score}", + "Countermeasures": "Atsakomosios priemonės", + "Could not save the risk. Please try again.": "Nepavyko išsaugoti rizikos. Bandykite dar kartą.", + "Risks by likelihood and impact": "Rizikos pagal tikimybę ir poveikį", + "Risk scale": "Rizikos skalė", + "The levels every project scores its risks on, and where low turns into medium and high": "Lygiai, kuriais kiekvienas projektas vertina rizikas, ir kur žema pereina į vidutinę ir aukštą", + "Number of levels": "Lygių skaičius", + "Likelihood labels": "Tikimybės pavadinimai", + "Impact labels": "Poveikio pavadinimai", + "Level {level}": "{level} lygis", + "Medium from score": "Vidutinė nuo balo", + "High from score": "Aukšta nuo balo", + "Risk scale saved": "Rizikos skalė išsaugota", + "1 risk uses level {level}. Change it first.": "1 rizika naudoja {level} lygį. Pirmiausia ją pakeiskite.", + "{count} risks use level {level}. Change them first.": "{count} rizikos naudoja {level} lygį. Pirmiausia jas pakeiskite.", + "Every level needs a label, and high must start above medium.": "Kiekvienam lygiui reikia pavadinimo, o aukšta turi prasidėti virš vidutinės.", + "The project this risk belongs to": "Projektas, kuriam priklauso ši rizika", + "The cause and the effect, in Markdown": "Priežastis ir pasekmė, Markdown formatu", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Laisvas grupavimas, pvz., planavimas, biudžetas ar tiekėjas", + "How likely it is, on the admin's risk scale": "Kiek tai tikėtina, pagal administratoriaus rizikos skalę", + "How hard it would hit, on the admin's risk scale": "Kaip smarkiai tai paveiktų, pagal administratoriaus rizikos skalę", + "Likelihood times impact, calculated by the server": "Tikimybė padauginta iš poveikio, apskaičiuoja serveris", + "Where the risk stands": "Kokia rizikos padėtis", + "The person who watches this risk": "Asmuo, kuris stebi šią riziką", + "How the project answers the risk": "Kaip projektas reaguoja į riziką", + "What is done to prevent it or soften it, in Markdown": "Kas daroma jai išvengti ar sušvelninti, Markdown formatu", + "When to look at this risk again": "Kada vėl peržiūrėti šią riziką", + "Very low": "Labai žema", + "Very high": "Labai aukšta", + "All projects": "Visi projektai", + "Project status report": "Projekto būklės ataskaita", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datuota ataskaita apie tai, kaip projektui sekasi pinigų, organizavimo, laiko, informacijos, kokybės ir rizikos srityse (GROTIK aspektai), kiekvienas su pastaba.", + "The project this report is about": "Projektas, kuriam skirta ataskaita", + "Report date": "Ataskaitos data", + "The day the report describes": "Diena, kurią aprašo ataskaita", + "Money": "Pinigai", + "How the project stands on this aspect": "Kaip projektui sekasi šiuo aspektu", + "On track": "Pagal planą", + "At risk": "Pavojuje", + "Off track": "Nukrypęs nuo plano", + "Money note": "Pastaba apie pinigus", + "A short explanation of this status": "Trumpas šios būklės paaiškinimas", + "Organisation": "Organizavimas", + "Organisation note": "Pastaba apie organizavimą", + "Time": "Laikas", + "Time note": "Pastaba apie laiką", + "Information": "Informacija", + "Information note": "Pastaba apie informaciją", + "Quality": "Kokybė", + "Quality note": "Pastaba apie kokybę", + "Risk note": "Pastaba apie riziką", + "Overall": "Bendrai", + "The worst of the six statuses, calculated by the server": "Blogiausia iš šešių būklių, apskaičiuoja serveris", + "Health: money": "Sveikata: pinigai", + "Copied from the newest status report": "Nukopijuota iš naujausios būklės ataskaitos", + "Health: organisation": "Sveikata: organizavimas", + "Health: time": "Sveikata: laikas", + "Health: information": "Sveikata: informacija", + "Health: quality": "Sveikata: kokybė", + "Health: risk": "Sveikata: rizika", + "Health: overall": "Sveikata: bendrai", + "Health: report date": "Sveikata: ataskaitos data", + "The date of the newest status report": "Naujausios būklės ataskaitos data", + "New report": "Nauja ataskaita", + "Only the project owner writes status reports.": "Būklės ataskaitas rašo tik projekto savininkas.", + "Latest report, {date}": "Paskutinė ataskaita, {date}", + "Aspect": "Aspektas", + "Note": "Pastaba", + "Report history": "Ataskaitų istorija", + "Author": "Autorius", + "No status reports yet": "Būklės ataskaitų dar nėra", + "Write the first report": "Parašyti pirmą ataskaitą", + "Choose a status for every aspect to save the report.": "Norėdami išsaugoti ataskaitą, kiekvienam aspektui pasirinkite būklę.", + "Suggested: on track.": "Pasiūlymas: pagal planą.", + "Suggested: at risk.": "Pasiūlymas: pavojuje.", + "Suggested: off track.": "Pasiūlymas: nukrypęs nuo plano.", + "1 task is past its due date.": "1 užduoties terminas praėjo.", + "{count} tasks are past their due date.": "Užduočių, kurių terminas praėjo: {count}.", + "The end date has passed with 1 open task.": "Pabaigos data praėjo, atvira 1 užduotis.", + "The end date has passed with {count} open tasks.": "Pabaigos data praėjo, atvirų užduočių: {count}.", + "No open task is past its due date.": "Nė vienos atviros užduoties terminas nepraėjo.", + "The highest open risk, \"{title}\", scores {score}.": "Didžiausia atvira rizika, „{title}“, įvertinta {score}.", + "There are no open risks.": "Atvirų rizikų nėra.", + "Costs are at {percent}% of the budget.": "Išlaidos sudaro {percent}% biudžeto.", + "No suggestion: the project has no budget.": "Pasiūlymo nėra: projektas neturi biudžeto.", + "No suggestion: no costs are recorded for this project yet.": "Pasiūlymo nėra: šiam projektui dar neužregistruota išlaidų.", + "The report was not saved. Only the project owner can write status reports.": "Ataskaita neišsaugota. Būklės ataskaitas gali rašyti tik projekto savininkas.", + "No report": "Ataskaitos nėra", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Projektų grupė, kuriai vadovauja tie patys žmonės, pavyzdžiui, skyrius ar programa. Jos vadovai skaito kiekvieną joje esantį projektą.", + "The name of the portfolio": "Portfelio pavadinimas", + "What the portfolio holds and who runs it": "Ką apima portfelis ir kas jam vadovauja", + "A colour for the portfolio's section in project lists": "Portfelio skilties spalva projektų sąrašuose", + "Managers": "Vadovai", + "Nextcloud user UIDs of the people who run the portfolio": "Portfeliui vadovaujančių žmonių Nextcloud naudotojų ID", + "Order": "Tvarka", + "Where the portfolio comes in project lists, lowest first": "Portfelio vieta projektų sąrašuose, mažiausias pirmas", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Šio portfelio nuosava rizikos skalė JSON formatu, tokios pat formos kaip visos programos skalė. Tuščia reiškia programos skalę.", + "Portfolio readers": "Portfelio skaitytojai", + "Nextcloud user UIDs of the managers of the project's portfolio": "Projekto portfelio vadovų Nextcloud naudotojų ID", + "The portfolio this project belongs to": "Portfelis, kuriam priklauso šis projektas", + "No portfolio": "Be portfelio", + "All portfolios": "Visi portfeliai", + "You read this project as a manager of its portfolio. Only its members change it.": "Šį projektą skaitote kaip jo portfelio vadovas. Jį keičia tik jo nariai.", + "Portfolios": "Portfeliai", + "Portfolio status": "Portfelio būsena", + "No portfolios yet": "Portfelių dar nėra", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administratorius prideda portfelius skiltyje Projektai, Portfeliai. Portfelio projektai išvardyti čia su jų būsena.", + "Roll-up": "Suvestinė", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} pagal planą, {atRisk} rizikoje, {offTrack} nukrypę, {noReport} be ataskaitos", + "No project in this portfolio that you can read.": "Šiame portfelyje nėra projekto, kurį galite skaityti.", + "Start": "Pradžia", + "End": "Pabaiga", + "Budget": "Biudžetas", + "Last report": "Paskutinė ataskaita", + "Out of date": "Pasenusi", + "Portfolio timeline": "Portfelio laiko juosta", + "Zoom": "Mastelis", + "Could not load the timeline": "Nepavyko įkelti laiko juostos", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administratorius prideda portfelius skiltyje Projektai, Portfeliai. Portfelio projektai čia rodomi vienoje laiko juostoje.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Atidarykite projektą, kad pamatytumėte jo etapus ir užduotis. Laiko juosta skirta tik skaityti.", + "Phase: {title}": "Etapas: {title}", + "Left out because you cannot read them: {count} projects": "Praleisti, nes negalite jų skaityti: {count} projektai", + "Week": "Savaitė", + "Day": "Diena", + "Month": "Mėnuo", + "Please try again later.": "Bandykite vėliau.", + "Status reports": "Būsenos ataskaitos", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Po kiek dienų paskutinė projekto būsenos ataskaita portfelio apžvalgoje pažymima kaip pasenusi", + "Reporting period (days)": "Ataskaitų laikotarpis (dienomis)", + "The reporting period is a whole number of days from 1 to 365.": "Ataskaitų laikotarpis yra sveikas dienų skaičius nuo 1 iki 365.", + "Reporting period saved": "Ataskaitų laikotarpis išsaugotas", + "The reporting period was not saved. Please try again.": "Ataskaitų laikotarpis neišsaugotas. Bandykite dar kartą.", + "Every project of a portfolio with its status per aspect, rolled up.": "Kiekvienas portfelio projektas su būsena pagal aspektus, apibendrintai.", + "The projects of a portfolio on one timeline.": "Portfelio projektai vienoje laiko juostoje.", + "Phases": "Etapai", + "Add phase": "Pridėti etapą", + "No phases yet": "Etapų dar nėra", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Padalykite projektą į etapus, pvz., inicijavimą, apibrėžimą ir įgyvendinimą. Etapas uždaromas, kai įkeliamas jo baigiamasis dokumentas.", + "{hours} hours": "{hours} val.", + "Concluding document: {title}": "Baigiamasis dokumentas: {title}", + "Concluding document missing": "Trūksta baigiamojo dokumento", + "Move {title} up": "Perkelti {title} aukštyn", + "Move {title} down": "Perkelti {title} žemyn", + "Close phase": "Uždaryti etapą", + "Phase": "Etapas", + "Files": "Failai", + "Notes": "Pastabos", + "Audit trail": "Audito žurnalas", + "Edit phase": "Redaguoti etapą", + "Name": "Pavadinimas", + "Budget hours": "Biudžeto valandos", + "Could not save the phase. Please try again.": "Nepavyko išsaugoti etapo. Bandykite dar kartą.", + "Close phase {title}": "Uždaryti etapą {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Etapas uždaromas su baigiamuoju dokumentu: įkelkite jį čia arba pasirinkite vieną iš etapo failų.", + "Concluding document": "Baigiamasis dokumentas", + "This phase has no files yet.": "Šis etapas dar neturi failų.", + "Upload a document": "Įkelti dokumentą", + "The document was not uploaded. Please try again.": "Dokumentas neįkeltas. Bandykite dar kartą.", + "Upload the concluding document before you close this phase.": "Prieš uždarydami šį etapą įkelkite baigiamąjį dokumentą.", + "This phase cannot be closed from its current status.": "Šio etapo negalima uždaryti iš dabartinės būsenos.", + "The phase was not closed. Please try again.": "Etapas neuždarytas. Bandykite dar kartą.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Šio etapo failo, kuris jį užbaigia, ID. Etapą galima užbaigti tik tada, kai jis nurodytas ir failas pridėtas.", + "Import from Microsoft Project": "Importuoti iš Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Pasirinkite planą, išsaugotą iš Microsoft Project XML formatu. Niekas neimportuojama, kol nepatvirtinsite.", + "Plan file": "Plano failas", + "What the import creates": "Ką sukuria importas", + "Tasks": "Užduotys", + "Sub-tasks": "Paužduotys", + "Milestones": "Gairės", + "Links": "Ryšiai", + "Already imported, updated in place: {count}": "Jau importuota, atnaujinta vietoje: {count}", + "What does not carry over": "Kas neperkeliama", + "Tasks with resources, which are not imported: {count}": "Užduotys su ištekliais, kurie neimportuojami: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Užduotys giliau nei 3 lygis, perkeltos po savo 2 lygio užduotimi: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Ryšiai, kurie nėra pabaiga-pradžia, importuoti kaip susiję ryšiai: {count}", + "Link lags, which are dropped: {count}": "Ryšių vėlavimai, kurie atmetami: {count}", + "Links to a summary task, which are not imported: {count}": "Ryšiai su suvestine užduotimi, kurie neimportuojami: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Ryšiai su užduotimis už šio plano ribų, kurie neimportuojami: {count}", + "No longer in the plan": "Nebėra plane", + "These stay in the project; remove them yourself if they are no longer needed.": "Jos lieka projekte; pašalinkite jas patys, jei jų nebereikia.", + "Import": "Importuoti", + "Close": "Uždaryti", + "The plan is imported: {created} created, {updated} updated.": "Planas importuotas: sukurta {created}, atnaujinta {updated}.", + "Links that would close a loop were left out: {count}": "Ryšiai, kurie uždarytų ciklą, praleisti: {count}", + "The import stopped part-way. Run it again to finish it.": "Importas sustojo pusiaukelėje. Paleiskite jį dar kartą, kad užbaigtumėte.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Išsaugokite planą Microsoft Project pasirinkę Failas, Įrašyti kaip, XML formatas, ir importuokite tą failą.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Šis failas deklaruoja DOCTYPE arba esybes, kurios nepriimamos.", + "The file is larger than 10 MB.": "Failas didesnis nei 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plane yra daugiau nei 2000 užduočių, daugiau nei priima vienas importas.", + "This file is not a Microsoft Project plan in XML format.": "Šis failas nėra Microsoft Project planas XML formatu.", + "Choose a file to import.": "Pasirinkite failą importuoti.", + "Only the project owner can import a plan.": "Tik projekto savininkas gali importuoti planą.", + "The plan could not be read. Please try again.": "Plano nepavyko nuskaityti. Bandykite dar kartą.", + "Linked case: {title}": "Susieta byla: {title}", + "Linked to a case": "Susieta su byla", + "Hand over to case": "Perduoti bylai", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Nepakeistus nukopijuoja kiekvieną projekto ir jo užduočių failą bei projektą aprašantį failą į susietą bylą.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Nukopijuota failų: {count}", + "Files that failed: {names}": "Nepavykę failai: {names}", + "The handover failed. Please try again.": "Perduoti nepavyko. Bandykite dar kartą.", + "The linked case could not be found, or you cannot open it.": "Susieta byla nerasta arba jūs negalite jos atidaryti.", + "Case handovers": "Perdavimai bylai", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Kiekvienas kartas, kai projekto failai ir metaduomenys buvo perduoti bylai: kada, kas, kuriai bylai, kiekvienas nukopijuotas failas su jo SHA-256 ir nepavykę failai.", + "Finance": "Finansai", + "Add cost line": "Pridėti išlaidų eilutę", + "Delivery terms": "Pristatymo sąlygos", + "Billing model": "Atsiskaitymo modelis", + "Budget in euro": "Biudžetas eurais", + "Budget in hours": "Biudžetas valandomis", + "Hourly rate in euro": "Valandinis tarifas eurais", + "Planned start": "Planuojama pradžia", + "Planned end": "Planuojama pabaiga", + "Planned dates": "Planuojamos datos", + "Budget {amount}": "Biudžetas {amount}", + "No budget agreed": "Biudžetas nesutartas", + "Hours": "Valandos", + "Only the project owner and the portfolio managers see the amounts.": "Sumas mato tik projekto savininkas ir portfelio vadovai.", + "Budget against cost per category": "Biudžetas ir išlaidos pagal kategoriją", + "Labour (booked time)": "Darbas (užregistruotas laikas)", + "No category": "Be kategorijos", + "Hours are not available": "Valandos nepasiekiamos", + "Not yet assigned to a category": "Dar nepriskirta kategorijai", + "Total": "Iš viso", + "{spent} spent, {remaining} remaining": "{spent} išleista, {remaining} liko", + "Budget against cost per phase": "Biudžetas ir išlaidos pagal etapą", + "No phase": "Be etapo", + "Cost lines": "Išlaidų eilutės", + "From the finance system": "Iš finansų sistemos", + "Edit cost line {amount}": "Redaguoti išlaidų eilutę {amount}", + "No cost lines yet": "Išlaidų eilučių dar nėra", + "Commitments": "Įsipareigojimai", + "Actual cost": "Faktinės išlaidos", + "Forecast": "Prognozė", + "Remaining": "Liko", + "Not planned yet": "Dar nesuplanuota", + "{start} to {end}": "Nuo {start} iki {end}", + "The terms were not saved. Please try again.": "Sąlygos neišsaugotos. Bandykite dar kartą.", + "Terms saved": "Sąlygos išsaugotos", + "Fixed price": "Fiksuota kaina", + "Hourly": "Valandinis", + "Not billed": "Nesąskaitinama", + "Commitment": "Įsipareigojimas", + "Edit cost line": "Redaguoti išlaidų eilutę", + "Kind": "Rūšis", + "Amount in euro": "Suma eurais", + "Remove": "Pašalinti", + "Could not save the cost line. Only the project owner changes the money of a project.": "Nepavyko išsaugoti išlaidų eilutės. Projekto pinigus keičia tik projekto savininkas.", + "Could not remove the cost line. Please try again.": "Nepavyko pašalinti išlaidų eilutės. Bandykite dar kartą.", + "{amount} over budget": "{amount} virš biudžeto", + "Cost categories": "Išlaidų kategorijos", + "The categories every project splits its budget and costs into, one per line": "Kategorijos, į kurias kiekvienas projektas skirsto savo biudžetą ir išlaidas, po vieną eilutėje", + "Categories": "Kategorijos", + "Give at least one category, each name once.": "Nurodykite bent vieną kategoriją, kiekvieną pavadinimą vieną kartą.", + "Cost categories saved": "Išlaidų kategorijos išsaugotos", + "The cost categories were not saved. Please try again.": "Išlaidų kategorijos neišsaugotos. Bandykite dar kartą.", + "Finance line": "Finansų eilutė", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Viena projekto pinigų suma: biudžetas, įsipareigojimas, faktinės išlaidos ar prognozė, išlaidų kategorijoje ir pasirinktinai etape. Įveda projekto savininkas arba siunčia finansų sistema per integracijos programą.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projektas, kuriam priklauso ši suma. Tuščia finansų sistemos eilutei, kurios projekto numeris neatitinka jokio projekto.", + "The phase this amount belongs to, if any": "Etapas, kuriam priklauso suma, jei yra", + "The cost category, one of the categories the admin set up": "Išlaidų kategorija, viena iš administratoriaus nustatytų kategorijų", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Ar suma yra biudžetas, įsipareigojimas, faktinės išlaidos ar prognozė", + "Amount": "Suma", + "The amount in the reporting currency (euro)": "Suma ataskaitų valiuta (eurais)", + "The date the amount was booked or is expected": "Data, kai suma užregistruota arba laukiama", + "What the amount is for": "Kam skirta suma", + "Whether a person entered the line or the finance system sent it": "Ar eilutę įvedė žmogus, ar ją atsiuntė finansų sistema", + "Entered by hand": "Įvesta ranka", + "Finance line id": "Finansų eilutės ID", + "The finance system's own id of this line. One imported line per id.": "Šios eilutės ID finansų sistemoje. Viena importuota eilutė vienam ID.", + "Project number": "Projekto numeris", + "The project number the finance system sent, matched against the project key": "Finansų sistemos atsiųstas projekto numeris, lyginamas su projekto raktu", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Eilutės projekto portfelis, nukopijuotas iš projekto, kad portfelio sumoms užtektų vieno filtro", + "Finance readers": "Finansų skaitytojai", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud naudotojų UID, kurie gali matyti šią sumą: projekto savininkas ir jo portfelio vadovai", + "Project owner": "Projekto savininkas", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Projekto savininko Nextcloud naudotojo UID; jis gali keisti ir šalinti rankines eilutes", + "How the client pays: not billed, a fixed price, or by the hour.": "Kaip moka klientas: nesąskaitinama, fiksuota kaina arba valandinis.", + "Portfolio finance": "Portfelio finansai", + "You cannot see the money of any project in this portfolio": "Jūs nematote nė vieno šio portfelio projekto pinigų", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serveris grąžino išlaidų eilučių iš projektų už šio portfelio ribų, todėl šios sumos gali būti klaidingos.", + "Projects left out because you cannot see their money: {count}": "Praleisti projektai, nes nematote jų pinigų: {count}", + "Unmatched finance lines": "Nesusietos finansų eilutės", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Biudžetas, įsipareigojimai, faktinės išlaidos ir prognozė, susumuoti portfeliui.", + "Subprojects": "Subprojektai", + "{done} of {total}": "{done} iš {total}", + "{done} of {total} tasks done, including subprojects": "Atlikta {done} iš {total} užduočių, įskaitant subprojektus", + "Show the subprojects of {title}": "Rodyti {title} subprojektus", + "Hide the subprojects of {title}": "Slėpti {title} subprojektus", + "Part of": "Dalis", + "No parent project": "Nėra aukštesnio projekto", + "A project cannot sit under one of its own subprojects.": "Projektas negali būti po vienu iš savo subprojektų.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projektai įdedami ne giliau nei trys lygiai: programa, projektas ir subprojektas.", + "Parent project": "Aukštesnis projektas", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projektas, po kuriuo yra šis projektas, pvz., programa. Projektai įdedami ne giliau nei trys lygiai.", + "Yes": "Taip", + "No": "Ne", + "{label} (required)": "{label} (privaloma)", + "{label} is required": "{label} yra privalomas", + "Project field": "Projekto laukas", + "A field an admin adds to every project, such as a policy area or a contract value.": "Laukas, kurį administratorius prideda prie kiekvieno projekto, pvz., politikos sritis ar sutarties vertė.", + "Key": "Raktas", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Pastovus pavadinimas, kuriuo saugoma reikšmė, lower camel case forma. Palikite jį, kai projektai jį naudoja.", + "Label": "Etiketė", + "The name people see next to the field": "Pavadinimas, kurį žmonės mato prie lauko", + "What the field holds": "Ką laukas saugo", + "Text": "Tekstas", + "Number": "Skaičius", + "Choice": "Pasirinkimas", + "Person": "Asmuo", + "Yes or no": "Taip arba ne", + "Options": "Parinktys", + "The choices of a choice field": "Pasirinkimo lauko parinktys", + "Required": "Privalomas", + "Whether a project must fill in the field": "Ar projektas turi užpildyti lauką", + "Where the field appears, lowest first": "Kur laukas rodomas, mažiausias pirmas", + "Applies to": "Taikoma", + "What the field is added to": "Prie ko pridedamas laukas", + "Custom fields": "Savi laukai", + "The values of the project fields an admin defined, keyed by the field's key.": "Administratoriaus apibrėžtų projekto laukų reikšmės pagal lauko raktą.", + "Project fields": "Projekto laukai", + "Related": "Susijusios", + "Remove link": "Pašalinti ryšį", + "Link type": "Ryšio tipas", + "Relates to": "Susijusi su", + "Duplicates": "Dubliuoja", + "Project key": "Projekto raktas", + "Every task number starts with it, such as VERG-42.": "Juo prasideda kiekvienas užduoties numeris, pvz., VERG-42.", + "This key is already used by another project.": "Šį raktą jau naudoja kitas projektas.", + "Use 2 to 10 letters and digits, starting with a letter.": "Naudokite nuo 2 iki 10 raidžių ir skaitmenų, pradedant raide.", + "The key cannot change once tasks carry it.": "Rakto negalima keisti, kai užduotys jį jau turi.", + "Project saved. The existing tasks get their numbers in the background.": "Projektas išsaugotas. Esamos užduotys numerius gauna fone.", + "Next task number": "Kitos užduoties numeris", + "The number the next task of this project gets in its key. Only the system writes it.": "Numeris, kurį kita šio projekto užduotis gauna savo rakte. Jį rašo tik sistema.", + "Restore {title}": "Atkurti {title}", + "Restore": "Atkurti", + "Project restored": "Projektas atkurtas", + "Could not restore the project": "Nepavyko atkurti projekto", + "Bring this project back to the active list.": "Grąžinkite šį projektą į aktyvių projektų sąrašą.", + "Restore project": "Atkurti projektą", + "Request reason": "Prašymo priežastis", + "Why the requester needs this project. Filled in when the project is requested.": "Kodėl prašytojui reikia šio projekto. Pildoma teikiant prašymą.", + "Reviewed by": "Peržiūrėjo", + "The user who approved or rejected the request.": "Naudotojas, kuris patvirtino arba atmetė prašymą.", + "Reviewed at": "Peržiūrėta", + "When the request was approved or rejected.": "Kada prašymas buvo patvirtintas arba atmestas.", + "Review note": "Peržiūrėtojo pastaba", + "The reviewer's reason, shown to the requester when a request is not approved.": "Peržiūrėtojo priežastis, kurią prašytojas mato, kai prašymas nepatvirtinamas.", + "Members of these groups": "Šių grupių nariai", + "Groups that may create projects": "Grupės, kurios gali kurti projektus", + "The group {group} no longer exists. Save to remove it.": "Grupės {group} nebėra. Išsaugokite, kad ją pašalintumėte.", + "Review project request": "Peržiūrėti projekto prašymą", + "Requested by": "Paprašė", + "Why it is needed": "Kodėl jo reikia", + "Desired start date": "Pageidaujama pradžios data", + "Why is it not approved?": "Kodėl nepatvirtinama?", + "Give a reason. The requester sees it.": "Nurodykite priežastį. Prašytojas ją matys.", + "Approve": "Patvirtinti", + "Reject": "Atmesti", + "Reject request": "Atmesti prašymą", + "The review was not saved. Try again.": "Peržiūra neišsaugota. Bandykite dar kartą.", + "This project is waiting for review": "Šis projektas laukia peržiūros", + "This request was not approved": "Šis prašymas nepatvirtintas", + "Reason: {note}": "Priežastis: {note}", + "Review request": "Peržiūrėti prašymą", + "Request a project": "Paprašyti projekto", + "Step {step} of 2": "{step} žingsnis iš 2", + "Why is this project needed?": "Kodėl reikia šio projekto?", + "Give a reason. The reviewer reads it.": "Nurodykite priežastį. Peržiūrėtojas ją perskaitys.", + "Back": "Atgal", + "Next": "Toliau", + "Send request": "Siųsti prašymą", + "The request was not sent. Try again.": "Prašymas neišsiųstas. Bandykite dar kartą.", + "Requested": "Paprašyta", + "Not approved": "Nepatvirtinta", + "Your request was sent": "Jūsų prašymas išsiųstas", + "Let everyone else request a project": "Leisti visiems kitiems prašyti projekto", + "Add a task": "Pridėti užduotį", + "Delete task": "Ištrinti užduotį", + "Edit task": "Redaguoti užduotį", + "Write": "Rašyti", + "Preview": "Peržiūra", + "Markdown works here: headings, lists and links.": "Čia veikia Markdown: antraštės, sąrašai ir nuorodos.", + "Could not save the task. Please try again.": "Nepavyko išsaugoti užduoties. Bandykite dar kartą.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Užduočiai \"{title}\" užregistruotas laikas, todėl jos negalima ištrinti. Vietoj to ją galite atšaukti: laiko įrašai lieka.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Ištrinti \"{title}\"? Taip pat bus pašalintos jos sąsajos su kitomis užduotimis. To negalima atšaukti.", + "Keep task": "Palikti užduotį", + "Cancel task": "Atšaukti užduotį", + "Only the reporter, the project owner or an admin can delete this task.": "Šią užduotį gali ištrinti tik pranešėjas, projekto savininkas arba administratorius.", + "Could not delete the task. Please try again.": "Nepavyko ištrinti užduoties. Bandykite dar kartą.", + "Could not cancel the task. Please try again.": "Nepavyko atšaukti užduoties. Bandykite dar kartą.", + "Responsible": "Atsakingas asmuo", + "Also working on this": "Prie to taip pat dirba", + "Labels": "Žymos", + "Could not change the priority. Please try again.": "Nepavyko pakeisti prioriteto. Bandykite dar kartą.", + "Other project members who work on this task alongside the person responsible.": "Kiti projekto nariai, kurie dirba prie šios užduoties kartu su atsakingu asmeniu.", + "Duplicate": "Dubliuoti", + "Could not copy the task. Please try again.": "Nepavyko nukopijuoti užduoties. Bandykite dar kartą.", + "Subtasks": "Použduotys", + "{done} of {total} done": "Atlikta {done} iš {total}", + "Add a subtask": "Pridėti použduotį", + "Checklist": "Kontrolinis sąrašas", + "Checklist item actions": "Sąrašo punkto veiksmai", + "Add a checklist item": "Pridėti sąrašo punktą", + "Subtasks: {estimate} estimated, {logged} logged": "Použduotys: įvertinta {estimate}, užregistruota {logged}", + "Total estimate: {total}": "Bendras įvertinimas: {total}", + "Part of {title}": "Užduoties {title} dalis", + "Checklist: {count} done": "Kontrolinis sąrašas: atlikta {count}", + "This task has subtasks: {count}.": "Ši užduotis turi použduočių: {count}.", + "Keep subtasks as separate tasks": "Palikti použduotis kaip atskiras užduotis", + "Delete subtasks too": "Ištrinti ir použduotis", + "Copy of {title}": "Kopija: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Užduotis nukopijuota, bet ne visos jos použduotys. Patikrinkite kopiją.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Maži žingsniai užduoties viduje. Kiekvienas punktas turi id, tekstą ir žymą, ar jis atliktas.", + "Open work per person and per project.": "Atviras darbas pagal asmenis ir projektus.", + "View": "Rodinys", + "By person": "Pagal asmenį", + "By project": "Pagal projektą", + "Hours left": "Liko valandų", + "Tasks without an estimate": "Užduotys be įverčio", + "Due in 14 days": "Terminas per 14 dienų", + "Shared": "Bendrinamos", + "Unassigned": "Nepriskirtos", + "{hours} h": "{hours} val.", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Rodomas darbas projektuose, kuriuos galite matyti. Valandos skaičiuojamos atsakingam asmeniui; bendrinamos užduotys skaičiuojamos be valandų.", + "No open work in these projects.": "Šiuose projektuose nėra atviro darbo.", + "Open work": "Atviras darbas", + "{count} open tasks": "Atvirų užduočių: {count}", + "Create a project to see capacity here.": "Sukurkite projektą, kad čia matytumėte apkrovą.", + "My tasks": "Mano užduotys", + "Show all my tasks": "Rodyti visas mano užduotis", + "No tasks assigned to you": "Jums nepriskirta jokių užduočių", + "Browse projects": "Naršyti projektus", + "Later": "Vėliau", + "Due {date}": "Terminas {date}", + "Could not change the status. Please try again.": "Nepavyko pakeisti būsenos. Bandykite dar kartą.", + "Completed today": "Užbaigta šiandien", + "My open tasks": "Mano atviros užduotys", + "My overdue tasks": "Mano vėluojančios užduotys", + "My tasks in progress": "Mano vykdomos užduotys", + "Pin to the top": "Prisegti viršuje", + "Unpin": "Atsegti", + "Pinned": "Prisegta", + "Actions for {title}": "Veiksmai: {title}", + "Could not save your project order. Please try again.": "Nepavyko išsaugoti projektų tvarkos. Bandykite dar kartą.", + "No boards yet": "Lentų dar nėra", + "Create a project to get a board.": "Sukurkite projektą, kad gautumėte lentą.", + "Use the Projects page to create and manage your projects and tasks.": "Puslapyje Projektai kurkite ir tvarkykite savo projektus ir užduotis.", + "Go to projects": "Eiti į projektus", + "You are not a member of any projects yet.": "Dar nesate jokio projekto narys.", + "Could not search for users. Please try again.": "Nepavyko ieškoti naudotojų. Bandykite dar kartą.", + "Project creation is restricted to administrators.": "Projektus gali kurti tik administratoriai.", + "Only the project owner or an administrator can delete this project.": "Šį projektą gali ištrinti tik projekto savininkas arba administratorius.", + "No projects are available to you yet. Ask an administrator to create one.": "Jums dar nėra prieinamų projektų. Paprašykite administratoriaus sukurti projektą.", + "Due: {date}": "Terminas: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Užduotys su pradžios data ar terminu rodomos laiko juostoje. Pridėkite datas, kad jas matytumėte čia.", + "You do not have access to this project.": "Neturite prieigos prie šio projekto.", + "Zoom level": "Mastelio lygis", + "Unscheduled": "Nesuplanuotos", + "Start: {date}": "Pradžia: {date}", + "Today": "Šiandien", + "No scheduled tasks": "Nėra suplanuotų užduočių", + "An unexpected error occurred.": "Įvyko netikėta klaida.", + "Column {number} name": "Stulpelio {number} pavadinimas", + "Failed to save creation policy": "Nepavyko išsaugoti kūrimo taisyklės", + "All authenticated users": "Visi prisijungę naudotojai", + "Control who may create new projects": "Nustatykite, kas gali kurti naujus projektus", + "Administrators only": "Tik administratoriai", + "Project creation": "Projektų kūrimas", + "Allow project creation": "Leisti kurti projektus", + "Creation policy saved successfully": "Kūrimo taisyklė išsaugota", + "Initializing…": "Paleidžiama…", + "e.g. 2h 30m, 90m, 1.5h": "pvz. 2h 30m, 90m, 1.5h", + "Log time": "Registruoti laiką", + "Save estimate": "Išsaugoti įvertį", + "Logged: {logged}": "Užregistruota: {logged}", + "over by {amount}": "viršyta {amount}", + "Time tracking": "Laiko apskaita", + "Estimate": "Įvertis", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Įveskite tinkamą įvertį (pvz. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Įveskite tinkamą trukmę (pvz. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Nepavyko išsaugoti laiko įrašo. Bandykite dar kartą.", + "Edit time entry": "Redaguoti laiko įrašą", + "Duration": "Trukmė", + "Date range": "Laikotarpis", + "Last week": "Praėjusi savaitė", + "No time logged": "Laikas neužregistruotas", + "Log time on a task to see it here.": "Užregistruokite laiką užduočiai, kad jį matytumėte čia.", + "To date": "Iki datos", + "This week": "Ši savaitė", + "Total: {total}": "Iš viso: {total}", + "From date": "Nuo datos", + "Custom range": "Pasirinktinis laikotarpis", + "All time": "Visas laikas", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Nepavyko ištrinti užduoties, todėl gali likti duomenų. Ištrinkite projektą dar kartą.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Nepavyko ištrinti laiko įrašo, todėl gali likti duomenų. Ištrinkite projektą dar kartą.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Nepavyko ištrinti stulpelio, todėl gali likti duomenų. Ištrinkite projektą dar kartą.", + "Could not delete the project. Please try again.": "Nepavyko ištrinti projekto. Bandykite dar kartą.", + "Notification settings": "Pranešimų nustatymai", + "Configure when due-date reminders are sent": "Nustatykite, kada siunčiami priminimai apie terminus", + "Due-date reminder lead time (hours)": "Priminimo laikas iki termino (valandos)", + "Lead time must be between 1 and 336 hours": "Laikas turi būti nuo 1 iki 336 valandų", + "Reminder lead time saved successfully": "Priminimo laikas išsaugotas", + "Failed to save reminder lead time": "Nepavyko išsaugoti priminimo laiko", + "Notifications": "Pranešimai", + "Notify me 1 day before a task's due date": "Pranešti man 1 dieną iki užduoties termino", + "Draft": "Juodraštis", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Ar pamoka yra juodraštis, kurį mato tik jos mokytojas, vyksta ar atšaukta.", + "New release": "Nauja laida", + "Roadmap chart. The same releases and epics are listed below.": "Veiksmų plano diagrama. Tos pačios laidos ir epai išvardyti žemiau.", + "Nothing on the roadmap yet": "Veiksmų plane dar nieko nėra", + "Releases with a target date and epics with dated tasks appear here.": "Čia rodomos laidos su tiksline data ir epai su datuotomis užduotimis.", + "Releases": "Laidos", + "No releases yet": "Laidų dar nėra", + "Target date: {date}": "Tikslinė data: {date}", + "No target date": "Nėra tikslinės datos", + "Edit {name}": "Redaguoti {name}", + "Mark {name} as released": "Pažymėti {name} kaip išleistą", + "Mark as released": "Pažymėti kaip išleistą", + "Epics": "Epai", + "No epics yet. Open a task to make it an epic.": "Epų dar nėra. Atverkite užduotį, kad paverstumėte ją epu.", + "Not scheduled yet": "Dar nesuplanuota", + "Planned": "Suplanuota", + "Released": "Išleista", + "Edit release": "Redaguoti laidą", + "Target date": "Tikslinė data", + "Could not save the release. Please try again.": "Nepavyko išsaugoti laidos. Bandykite dar kartą.", + "Every task of this release is done or cancelled.": "Visos šios laidos užduotys atliktos arba atšauktos.", + "Not finished yet: {count}": "Dar nebaigta: {count}", + "What happens to these tasks?": "Kas nutiks šioms užduotims?", + "Move to {name}": "Perkelti į {name}", + "Remove the release": "Pašalinti laidą", + "Keep it on {name}": "Palikti jas laidoje {name}", + "Could not mark the release as released. Please try again.": "Nepavyko pažymėti laidos kaip išleistos. Bandykite dar kartą.", + "Roadmap": "Veiksmų planas", + "Tasks or roadmap": "Užduotys arba veiksmų planas", + "Release": "Laida", + "Epic": "Epas", + "This task is an epic": "Ši užduotis yra epas", + "A named, dated delivery of a project that its tasks are planned against.": "Pavadintas ir datuotas projekto pristatymas, pagal kurį planuojamos jo užduotys.", + "Name of the release": "Laidos pavadinimas", + "The project this release belongs to": "Projektas, kuriam priklauso ši laida", + "What this release delivers": "Ką pristato ši laida", + "When work on the release starts": "Kada prasideda darbas prie laidos", + "The date the release is due": "Data, iki kurios laida turi būti parengta", + "Whether the release is planned, released or archived": "Ar laida suplanuota, išleista ar archyvuota", + "Released on": "Išleista", + "When the release was marked as released": "Kada laida pažymėta kaip išleista", + "The release this task is planned for": "Laida, kuriai suplanuota ši užduotis", + "Board view options": "Lentos rodinio parinktys", + "Colour cards": "Spalvinti korteles", + "No colour": "Be spalvos", + "By label": "Pagal žymą", + "Swimlanes": "Takeliai", + "No swimlanes": "Be takelių", + "By assignee": "Pagal atsakingą asmenį", + "By epic": "Pagal epą", + "No assignee": "Nepriskirta", + "No epic": "Be epo", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kortelės lieka savo epo eilutėje. Epą pakeiskite užduoties puslapyje.", + "Hand over to": "Perduoti", + "Could not save your board view. It applies until you reload.": "Lentos rodinio išsaugoti nepavyko. Jis galioja, kol iš naujo įkelsite puslapį.", + "Timetable wish": "Tvarkaraščio pageidavimas", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Pageidavimas, kurį generatorius įvertina. Griežtą pageidavimą jis visada išlaiko, lankstų, kur gali.", + "Whether the wish is about a teacher, a group, a room or one activity": "Ar pageidavimas susijęs su mokytoju, grupe, patalpa ar viena veikla", + "Teacher": "Mokytojas", + "Group": "Grupė", + "Reference": "Nuoroda", + "The user, group, room or activity the wish is about": "Naudotojas, grupė, patalpa ar veikla, su kuria susijęs pageidavimas", + "What the wish asks for": "Ko prašo pageidavimas", + "Not on these periods": "Ne šiomis pamokomis", + "Preferably not on these periods": "Geriau ne šiomis pamokomis", + "At most a number of lessons a day": "Ne daugiau kaip tam tikras pamokų skaičius per dieną", + "No free periods between lessons": "Jokių langų tarp pamokų", + "Always the same room": "Visada ta pati patalpa", + "Periods": "Pamokos", + "The periods of the week the wish is about, such as wed-5": "Savaitės pamokos, su kuriomis susijęs pageidavimas, pvz., wed-5", + "Limit": "Riba", + "The most lessons a day, for a wish of that kind": "Daugiausia pamokų per dieną tokios rūšies pageidavimui", + "Strength": "Stiprumas", + "Whether the generator must keep the wish or should keep it": "Ar generatorius privalo ar turėtų išlaikyti pageidavimą", + "Hard": "Griežtas", + "Soft": "Lankstus", + "Weight": "Svoris", + "How much a soft wish counts, from 1 to 3": "Kiek sveria lankstus pageidavimas, nuo 1 iki 3", + "Why the wish exists": "Kodėl pageidavimas yra", + "Timetable scenario": "Tvarkaraščio scenarijus", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Vienas savaitės modelis, sukurtas generatoriaus arba paimtas iš dabartinio tvarkaraščio. Jis saugo savo įvestį ir kaip gerai išlaiko pageidavimus.", + "The name timetablers know the scenario by": "Pavadinimas, kuriuo sudarytojai žino scenarijų", + "Whether the generator made it or it came from the current timetable": "Ar jį sukūrė generatorius, ar jis kilęs iš dabartinio tvarkaraščio", + "Generated": "Sugeneruotas", + "From the current timetable": "Iš dabartinio tvarkaraščio", + "Week of": "Savaitė nuo", + "The Monday of the first week of the window": "Laikotarpio pirmosios savaitės pirmadienis", + "Window start": "Laikotarpio pradžia", + "The first day the week pattern applies to": "Pirmoji diena, kuriai galioja savaitės modelis", + "Window end": "Laikotarpio pabaiga", + "The last day the week pattern applies to": "Paskutinė diena, kuriai galioja savaitės modelis", + "Waiting, generating, done, failed, or published as draft lessons": "Laukia, generuojamas, baigtas, nepavyko arba paskelbtas kaip juodraštinės pamokos", + "Waiting": "Laukia", + "Generating": "Generuojamas", + "Failed": "Nepavyko", + "Published": "Paskelbtas", + "Seed": "Sėkla", + "The number the generator starts from, so a run can be repeated": "Skaičius, nuo kurio pradeda generatorius, kad paleidimą būtų galima pakartoti", + "Input": "Įvestis", + "The periods, rooms, lessons and wishes the scenario was made from": "Pamokos, patalpos, užsiėmimai ir pageidavimai, iš kurių sukurtas scenarijus", + "Placements": "Išdėstymai", + "Each lesson with the period and room it was given": "Kiekviena pamoka su gautu laiku ir patalpa", + "Unplaced lessons": "Neišdėstytos pamokos", + "Lessons without a place, each with the hard wish that blocked it": "Pamokos be vietos, kiekviena su griežtu pageidavimu, kuris ją sustabdė", + "Broken wishes": "Pažeisti pageidavimai", + "The wishes this scenario breaks, with the lessons that break them": "Pageidavimai, kuriuos šis scenarijus pažeidžia, su juos pažeidžiančiomis pamokomis", + "Measures": "Rodikliai", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Išdėstytos pamokos, pažeisti pageidavimai, mokytojų langai, pamokos per dieną ir patalpų naudojimas", + "Reason": "Priežastis", + "Why the run failed": "Kodėl paleidimas nepavyko", + "Published at": "Paskelbta", + "When the scenario was written out as draft lessons": "Kada scenarijus buvo įrašytas kaip juodraštinės pamokos", + "Edit wish": "Redaguoti pageidavimą", + "New wish": "Naujas pageidavimas", + "Hard: the generator always keeps it": "Privalomas: generatorius jo visada laikosi", + "Soft: the generator keeps it where it can": "Lankstus: generatorius jo laikosi, kai gali", + "Weight (1 to 3)": "Svoris (nuo 1 iki 3)", + "Most lessons a day": "Daugiausia pamokų per dieną", + "Period": "Pamoka", + "{day} period {number}": "{day} {number} pamoka", + "Teacher (user name)": "Mokytojas (naudotojo vardas)", + "Activity (group:subject)": "Veikla (grupė:dalykas)", + "Say who or what the wish is about.": "Nurodykite, ko pageidavimas liečia.", + "Choose at least one period.": "Pasirinkite bent vieną pamoką.", + "The limit is a whole number of 1 or more.": "Riba yra sveikasis skaičius, 1 ar daugiau.", + "Timetable": "Tvarkaraštis", + "Wishes": "Pageidavimai", + "Timetable wishes": "Tvarkaraščio pageidavimai", + "Generator run": "Generatoriaus vykdymas", + "Generator progress": "Generatoriaus eiga", + "The run failed: {reason}": "Vykdymas nepavyko: {reason}", + "{placed} of {lessons} lessons placed": "Išdėstyta {placed} iš {lessons} pamokų", + "Generate again": "Generuoti iš naujo", + "Generate": "Generuoti", + "Every lesson has a place.": "Kiekviena pamoka turi vietą.", + "Lesson": "Pamoka", + "No free period and room": "Nėra laisvos pamokos ir patalpos", + "Broken soft wishes": "Pažeisti lankstūs pageidavimai", + "Every soft wish is kept.": "Kiekvieno lankstaus pageidavimo laikomasi.", + "Wish": "Pageidavimas", + "Lessons": "Pamokos", + "Generating: {percent}% of the time budget used": "Generuojama: išnaudota {percent}% laiko", + "Waiting to start": "Laukiama pradžios", + "Published as draft lessons": "Paskelbta kaip pamokų juodraščiai", + "Could not read the scenario.": "Scenarijaus perskaityti nepavyko.", + "Could not start the run.": "Vykdymo pradėti nepavyko.", + "Scenarios": "Scenarijai", + "Timetable scenarios": "Tvarkaraščio scenarijai", + "Scenario": "Scenarijus", + "Take the current timetable": "Perimti dabartinį tvarkaraštį", + "Could not take the current timetable.": "Nepavyko perimti dabartinio tvarkaraščio.", + "Broken hard wishes": "Pažeisti privalomi pageidavimai", + "Not on a period of the week grid": "Ne savaitės tinklelio pamokoje", + "Compare scenarios": "Palyginti scenarijus", + "Scenarios to compare": "Lyginami scenarijai", + "Choose two or three scenarios to compare them.": "Pasirinkite du ar tris scenarijus palyginti.", + "Measure": "Rodiklis", + "Best": "Geriausias", + "Lessons that differ": "Besiskiriančios pamokos", + "No lesson differs.": "Jokia pamoka nesiskiria.", + "Not placed": "Neišdėstyta", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Išdėstytos pamokos", + "Lessons without a place": "Pamokos be vietos", + "Clashes": "Konfliktai", + "Hard wishes broken": "Pažeisti privalomi pageidavimai", + "Soft wishes broken": "Pažeisti lankstūs pageidavimai", + "Soft wishes broken, weighted": "Pažeisti lankstūs pageidavimai, pasverti", + "Free periods between lessons, all teachers": "Langai, visi mokytojai", + "Most free periods of one teacher": "Daugiausia vieno mokytojo langų", + "Most lessons of one group on a day": "Daugiausia vienos grupės pamokų per dieną", + "Room use": "Patalpų naudojimas", + "Publish as draft lessons": "Paskelbti kaip juodraštines pamokas", + "Draft lessons written: {count}": "Įrašyta juodraštinių pamokų: {count}", + "Could not publish the scenario.": "Nepavyko paskelbti scenarijaus.", + "Rules": "Taisyklės", + "Rules for {column}": "Stulpelio {column} taisyklės", + "When a card enters this column": "Kai kortelė patenka į šį stulpelį", + "Action": "Veiksmas", + "Set the priority": "Nustatyti prioritetą", + "Assign to": "Priskirti", + "Assign the person who moved the card": "Priskirti asmeniui, kuris perkėlė kortelę", + "Remove the assignee": "Pašalinti atsakingą asmenį", + "Add a label": "Pridėti žymą", + "No longer a project member": "Nebe projekto narys", + "This label no longer exists": "Šios žymos nebėra", + "Add rule": "Pridėti taisyklę", + "Remove rule": "Pašalinti taisyklę", + "No rules yet. Add one to change a card when it enters this column.": "Taisyklių dar nėra. Pridėkite taisyklę, kuri pakeičia kortelę, kai ji patenka į šį stulpelį.", + "Could not save the rules. Please try again.": "Taisyklių išsaugoti nepavyko. Bandykite dar kartą.", + "1 rule runs when a card enters this column": "1 taisyklė vykdoma, kai kortelė patenka į šį stulpelį", + "{count} rules run when a card enters this column": "Taisyklių, vykdomų kai kortelė patenka į šį stulpelį: {count}", + "Rules applied: {changes}": "Pritaikytos taisyklės: {changes}", + "assigned to {name}": "priskirta: {name}", + "assignee removed": "atsakingas asmuo pašalintas", + "priority {priority}": "prioritetas {priority}", + "label {label}": "žyma {label}", + "What happens to a card when it enters this column, applied in list order.": "Kas nutinka kortelei, kai ji patenka į šį stulpelį, sąrašo tvarka.", + "Value": "Reikšmė", + "What the rule does to the card.": "Ką taisyklė daro su kortele.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioritetas, naudotojo ID arba žymos ID, kurį naudoja veiksmas; tuščia veiksmams be reikšmės.", + "is not": "nėra", + "{dimension} is not": "{dimension} nėra", + "Saved filters": "Išsaugoti filtrai", + "No saved filters yet": "Išsaugotų filtrų dar nėra", + "Save filter": "Išsaugoti filtrą", + "Rename \"{name}\"": "Pervadinti „{name}“", + "Delete \"{name}\"": "Ištrinti „{name}“", + "Clear filters": "Išvalyti filtrus", + "Showing {shown} of {total} tasks": "Rodoma {shown} iš {total} užduočių", + "Me": "Aš", + "No date": "Be datos", + "Rename saved filter": "Pervadinti išsaugotą filtrą", + "Share with the project": "Bendrinti su projektu", + "Give the filter a name": "Suteikite filtrui pavadinimą", + "Could not save the filter. Please try again.": "Filtro išsaugoti nepavyko. Bandykite dar kartą.", + "Some labels in \"{name}\" no longer exist and were left out.": "Kai kurių „{name}“ žymų nebėra, todėl jos praleistos.", + "Could not delete the filter. Please try again.": "Filtro ištrinti nepavyko. Bandykite dar kartą.", + "Saved filter": "Išsaugotas filtras", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Pavadintas vieno projekto lentos filtras, privatus jį išsaugojusiam asmeniui, nebent bendrinamas su projektu.", + "The project whose board the filter applies to": "Projektas, kurio lentai taikomas filtras", + "The name the filter is listed under": "Pavadinimas, kuriuo filtras rodomas sąraše", + "Saved by": "Išsaugojo", + "Nextcloud user id of the person who saved the filter": "Filtrą išsaugojusio asmens Nextcloud naudotojo ID", + "Shared with the project": "Bendrinamas su projektu", + "Whether every project member sees and applies the filter": "Ar kiekvienas projekto narys mato filtrą ir gali jį taikyti", + "Criteria": "Kriterijai", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtras: atsakingas asmuo, žyma, prioritetas ir terminas, kiekvienas su yra arba nėra ir reikšmėmis", + "Cross-project view": "Kelių projektų rodinys", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Išsaugotas projektų rinkinys, kurio užduotys rodomos kartu būsenų juostose, bendrinamas su jame nurodytais žmonėmis.", + "Shared with": "Bendrinama su", + "The name the view is listed under": "Pavadinimas, kuriuo rodinys pateikiamas sąraše", + "Nextcloud user id of the person who saved the view": "Rodinį išsaugojusio asmens Nextcloud naudotojo ID", + "Nextcloud user ids of the people the view is shared with": "Žmonių, su kuriais bendrinamas rodinys, Nextcloud naudotojų ID", + "The projects whose tasks the view shows, at most twenty": "Projektai, kurių užduotis rodo rodinys, ne daugiau kaip dvidešimt", + "1 project in this view is hidden from you.": "1 šio rodinio projektas nuo jūsų paslėptas.", + "{count} projects in this view are hidden from you.": "Šio rodinio projektų, paslėptų nuo jūsų: {count}.", + "{project} has no column for {status}.": "Projektas {project} neturi stulpelio būsenai {status}.", + "This view does not exist or is not shared with you.": "Šio rodinio nėra arba jis su jumis nebendrinamas.", + "\"{task}\" moved to {status}.": "\"{task}\" perkelta į {status}.", + "Project: {title}": "Projektas: {title}", + "Cross-project views": "Kelių projektų rodiniai", + "New view": "Naujas rodinys", + "Edit view": "Redaguoti rodinį", + "Delete view": "Ištrinti rodinį", + "Give the view a name": "Suteikite rodiniui pavadinimą", + "Pick at least one project": "Pasirinkite bent vieną projektą", + "A view shows at most {max} projects": "Rodinys rodo ne daugiau kaip {max} projektų", + "Could not save the view. Please try again.": "Nepavyko išsaugoti rodinio. Bandykite dar kartą.", + "Could not delete the view. Please try again.": "Nepavyko ištrinti rodinio. Bandykite dar kartą.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Ištrinti „{title}“? Projektai ir jų užduotys lieka tokie, kokie yra.", + "People see the tasks of the projects they are in, never more.": "Kiekvienas mato tik tų projektų, kuriuose dalyvauja, užduotis.", + "No views yet. A view shows the tasks of several of your projects together.": "Rodinių dar nėra. Rodinys rodo kelių jūsų projektų užduotis kartu.", + "Projects in view: {count}": "Projektų rodinyje: {count}", + "Notify me when a task is assigned to me": "Pranešti man, kai man priskiriama užduotis", + "Also send these to me by email": "Siųsti juos man ir el. paštu", + "Add an email address in your Nextcloud personal settings to get mail.": "Kad gautumėte el. laiškus, pridėkite el. pašto adresą savo asmeniniuose Nextcloud nustatymuose.", + "Code link": "Kodo nuoroda", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Įsipareigojimas, šaka, sujungimo užklausa ar problema kodo platformoje, susijusi su užduotimi.", + "The task the link belongs to": "Užduotis, kuriai priklauso nuoroda", + "The project of the task": "Užduoties projektas", + "Task key": "Užduoties raktas", + "The task key the forge text named, such as VC-12": "Užduoties raktas, kurį nurodė kodo platformos tekstas, pvz., VC-12", + "What the link points at": "Į ką rodo nuoroda", + "Link": "Nuoroda", + "The address of the item in the forge": "Elemento adresas kodo platformoje", + "The commit message, branch name or merge request title": "Įsipareigojimo pranešimas, šakos pavadinimas ar sujungimo užklausos pavadinimas", + "Repository": "Saugykla", + "The repository, such as acme/portal": "Saugykla, pvz., acme/portal", + "Forge id": "Id platformoje", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Paties elemento id kodo platformoje, pvz., github:acme/portal#42 ar įsipareigojimo maiša", + "State": "Būsena", + "The state of a merge request or issue": "Sujungimo užklausos ar problemos būsena", + "Who made the commit or opened the merge request": "Kas atliko įsipareigojimą ar atidarė sujungimo užklausą", + "When the commit was made or the merge request last changed": "Kada atliktas įsipareigojimas ar paskutinį kartą pasikeitė sujungimo užklausa", + "Added by": "Pridėjo", + "Whether a person added the link or the integration wrote it": "Ar nuorodą pridėjo žmogus, ar ją įrašė integracija", + "Nextcloud user UIDs of project members": "Projekto narių Nextcloud naudotojų ID", + "Add link": "Pridėti nuorodą", + "Added by hand": "Pridėta rankiniu būdu", + "Branch": "Šaka", + "Code": "Kodas", + "Commit": "Įsipareigojimas", + "From the integration": "Iš integracijos", + "Link to a commit, branch or merge request": "Nuoroda į įsipareigojimą, šaką ar sujungimo užklausą", + "Merge request": "Sujungimo užklausa", + "Merged": "Sujungta", + "No code linked yet. Name {key} in a commit message or paste a link.": "Kodas dar nesusietas. Nurodykite {key} įsipareigojimo pranešime arba įklijuokite nuorodą.", + "No code linked yet. Paste a link to a commit or merge request.": "Kodas dar nesusietas. Įklijuokite nuorodą į įsipareigojimą ar sujungimo užklausą.", + "Paste a web address that starts with https://.": "Įklijuokite žiniatinklio adresą, prasidedantį https://.", + "Remove link {title}": "Pašalinti nuorodą {title}", + "The link could not be added.": "Nuorodos nepavyko pridėti.", + "The link could not be removed.": "Nuorodos nepavyko pašalinti.", + "This link is already on the task.": "Ši nuoroda jau yra prie užduoties.", + "Code forges": "Kodo platformos", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Susiekite GitHub įsipareigojimus ir pull request su užduotimis. Integriq gauna įvykius; planninq niekada nesikreipia į GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Atsisiųskite konfigūraciją ir importuokite ją į Integriq. Tada įrašykite paslaptį taisyklėje \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "GitHub saugyklai pridėkite webhook su šiuo adresu ir ta pačia paslaptimi. Pasirinkite turinio tipą application/json ir įvykius push bei pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nurodykite užduoties raktą, pvz., VC-12, įsipareigojimo pranešime, šakos pavadinime ar pull request pavadinime. Tada nuoroda atsiras prie tos užduoties.", + "Without Integriq, project members can still paste a link on the task page.": "Be Integriq projekto nariai vis tiek gali įklijuoti nuorodą užduoties puslapyje.", + "Download the Integriq configuration": "Atsisiųsti Integriq konfigūraciją", + "Calendar": "Kalendorius", + "Previous": "Ankstesnis", + "Calendar view": "Kalendoriaus rodinys", + "Starts:": "Prasideda:", + "No tasks with a date in this month.": "Šį mėnesį nėra užduočių su data.", + "Week of {start} to {end}": "Savaitė nuo {start} iki {end}", + "My calendar": "Mano kalendorius", + "Show as list": "Rodyti sąrašu", + "Show as calendar": "Rodyti kalendoriuje", + "Open my calendar": "Atverti mano kalendorių", + "Nextcloud Tasks": "Nextcloud užduotys", + "Show my tasks in Nextcloud Tasks": "Rodyti mano užduotis Nextcloud užduotyse", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Jums priskirtos arba su jumis bendrinamos užduotys rodomos sąraše \"Planninq\" Nextcloud užduotyse ir kalendoriuje. Ten atlikti pakeitimai pakeičiami kitu Planninq pakeitimu.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Šis serveris negali rašyti į Nextcloud užduotis, todėl eksportas negalimas.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Tvarko Planninq. Čia atlikti pakeitimai pakeičiami kitu Planninq pakeitimu.", + "Working days and holidays": "Darbo dienos ir šventės", + "Dates set on the timeline skip the days that are not working days.": "Laiko juostoje nustatytos datos praleidžia ne darbo dienas.", + "Working weekdays": "Savaitės darbo dienos", + "Non-working days": "Ne darbo dienos", + "No non-working days yet.": "Ne darbo dienų dar nėra.", + "Add day": "Pridėti dieną", + "Year": "Metai", + "Add Dutch national holidays": "Pridėti Nyderlandų valstybines šventes", + "Save working days": "Išsaugoti darbo dienas", + "Choose at least one working weekday.": "Pasirinkite bent vieną darbo dieną.", + "Working days saved.": "Darbo dienos išsaugotos.", + "Could not save the working days.": "Nepavyko išsaugoti darbo dienų.", + "New Year's Day": "Naujieji metai", + "Easter Sunday": "Velykos", + "Easter Monday": "Antroji Velykų diena", + "King's Day": "Karaliaus diena", + "Liberation Day": "Išlaisvinimo diena", + "Ascension Day": "Žengimas į dangų", + "Whit Sunday": "Sekminės", + "Whit Monday": "Antroji Sekminių diena", + "Christmas Day": "Kalėdos", + "Boxing Day": "Antroji Kalėdų diena", + "Dates of {title}": "{title} datos", + "The due date cannot be before the start date.": "Terminas negali būti anksčiau už pradžios datą.", + "{title}, from {start} to {end}": "{title}, nuo {start} iki {end}", + "The dates could not be saved.": "Nepavyko išsaugoti datų.", + "{title} now runs from {start} to {end}": "{title} dabar vyksta nuo {start} iki {end}", + "Auto-scheduling": "Automatinis planavimas", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kai įjungta, termino nukėlimas vėliau laiko juostoje pasiūlo nukelti ir jo blokuojamas užduotis.", + "Move blocked tasks along when a task slips": "Nukelti blokuojamas užduotis, kai užduotis vėluoja", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Laiko juostoje vėlesnis terminas pasiūlo nukelti blokuojamas užduotis. Skaičiuojamos tik \"blokuoja\" sąsajos, o užduotys nukeliamos tik vėliau.", + "Move the tasks that wait for {title}?": "Nukelti užduotis, kurios laukia {title}?", + "These tasks wait for it and would start after its new due date:": "Šios užduotys jos laukia ir prasidėtų po naujo termino:", + "{count} tasks would move; the first {limit} are listed.": "Būtų nukelta užduočių: {count}; rodomos pirmosios {limit}.", + "Now": "Dabar", + "After the move": "Po nukėlimo", + "Only this task": "Tik ši užduotis", + "Move all": "Nukelti visas", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Sustota ties {title}: nepavyko išsaugoti datų. Ankstesnės užduotys nukeltos.", + "Cumulative flow": "Kaupiamasis srautas", + "Show as chart": "Rodyti kaip diagramą", + "Show as table": "Rodyti kaip lentelę", + "Tasks per column per day": "Užduotys stulpelyje per dieną", + "Tasks without recorded history in this period: {count}": "Užduotys be įrašytos istorijos šiuo laikotarpiu: {count}", + "Lead and cycle time": "Įvykdymo laikas ir ciklo laikas", + "No tasks were finished in this period.": "Šiuo laikotarpiu neužbaigta nė viena užduotis.", + "Finished tasks": "Užbaigtos užduotys", + "Cycle time, average": "Ciklo laikas, vidurkis", + "Cycle time, 85th percentile": "Ciklo laikas, 85-asis procentilis", + "Lead time, average": "Įvykdymo laikas, vidurkis", + "Tasks whose finish time was estimated from their history: {count}": "Užduotys, kurių pabaigos laikas įvertintas iš istorijos: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Kiekvienos užbaigtos užduoties ciklo laikas su vidurkiu ir 85-uoju procentiliu", + "Slowest tasks": "Lėčiausios užduotys", + "cycle {cycle}, lead {lead}": "ciklas {cycle}, įvykdymas {lead}", + "{days} days": "{days} d.", + "Could not load the flow of this project.": "Nepavyko įkelti šio projekto srauto.", + "Last {days} days": "Paskutinės {days} d.", + "Portfolio flow": "Portfelio srautas", + "An admin adds portfolios under Projects, Portfolios.": "Administratorius prideda portfelius skiltyje Projektai, Portfeliai.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Nerodomi projektai, nes vienu metu rodoma ne daugiau kaip 50: {count}", + "Could not load the flow of this portfolio.": "Nepavyko įkelti šio portfelio srauto.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kaupiamasis srautas ir ciklo laikas portfelio projektuose.", + "Edit report": "Redaguoti ataskaitą", + "Only tasks where": "Tik užduotys, kuriose", + "Group by": "Grupuoti pagal", + "Display": "Rodinys", + "Share with everyone who can read its projects": "Bendrinti su visais, kurie gali skaityti jos projektus", + "The report could not be saved.": "Nepavyko įrašyti ataskaitos.", + "Number of tasks": "Užduočių skaičius", + "Bar": "Stulpeliai", + "Donut": "Žiedas", + "Table": "Lentelė", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} iš {total} šios ataskaitos projektų jums nematomi", + "No tasks match this report.": "Šiai ataskaitai neatitinka nė viena užduotis.", + "None": "Nėra", + "Could not load this report.": "Nepavyko įkelti šios ataskaitos.", + "Report": "Ataskaita", + "Your reports": "Jūsų ataskaitos", + "My reports": "Mano ataskaitos", + "Shared reports": "Bendrinamos ataskaitos", + "You have not built a report yet.": "Dar nesukūrėte jokios ataskaitos.", + "Nobody has shared a report with you yet.": "Su jumis dar niekas nebendrino ataskaitos.", + "Reports you built over tasks, and the ones shared with you.": "Ataskaitos, kurias sukūrėte pagal užduotis, ir tos, kurias su jumis bendrino.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Įrašyta užklausa apie užduotis: kurie projektai, kurie filtrai, grupuota pagal ką, suskaičiuota ar susumuota, ir rodoma kaip lentelė ar diagrama.", + "The name the report is listed under": "Pavadinimas, kuriuo ataskaita rodoma sąraše", + "What the report shows and who it is for": "Ką ataskaita rodo ir kam ji skirta", + "Nextcloud user id of the person who saved the report": "Ataskaitą įrašiusio asmens Nextcloud naudotojo ID", + "Who can open the report": "Kas gali atidaryti ataskaitą", + "Only me": "Tik aš", + "Everyone who can read its projects": "Visi, kurie gali skaityti jos projektus", + "The projects the report covers, at most fifty": "Projektai, kuriuos apima ataskaita, ne daugiau kaip penkiasdešimt", + "Filters": "Filtrai", + "Task fields and the value each must equal": "Užduoties laukai ir reikšmė, kuriai kiekvienas turi būti lygus", + "The task field the report groups on": "Užduoties laukas, pagal kurį ataskaita grupuoja", + "Count the tasks, or add up a number on them": "Suskaičiuoti užduotis arba susumuoti jų skaičių", + "Sum": "Suma", + "Sum of": "Suma pagal", + "The number added up when the measure is a sum": "Skaičius, sumuojamas, kai matas yra suma", + "Story points": "Istorijos taškai", + "Estimated duration": "Numatoma trukmė", + "How the report is shown": "Kaip ataskaita rodoma", + "Issue type": "Užklausos tipas", + "Task fields and the value each must equal; empty when the report covers every task": "Užduoties laukai ir reikšmė, kurią kiekvienas turi turėti; tuščia, kai ataskaita apima visas užduotis", + "The status a task must have": "Būsena, kurią turi turėti užduotis", + "The priority a task must have": "Prioritetas, kurį turi turėti užduotis", + "The user a task must be assigned to": "Naudotojas, kuriam turi būti priskirta užduotis", + "A label a task must carry": "Žyma, kurią turi turėti užduotis", + "The board column a task must be in": "Lentos stulpelis, kuriame turi būti užduotis", + "The issue type a task must have": "Užklausos tipas, kurį turi turėti užduotis", + "Manager groups": "Vadovų grupės", + "Member groups": "Narių grupės", + "Viewer groups": "Skaitytojų grupės", + "Viewers": "Skaitytojai", + "Owning group": "Savininkų grupė", + "Nextcloud groups whose members manage the project": "Nextcloud grupės, kurių nariai valdo projektą", + "Nextcloud groups whose members work on the project": "Nextcloud grupės, kurių nariai dirba projekte", + "Nextcloud groups whose members may read the project": "Nextcloud grupės, kurių nariai gali skaityti projektą", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud naudotojai, valdantys projektą: nustatymus, narius ir darbą", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud naudotojai, galintys skaityti projektą ir jo darbą, bet ne keisti", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud grupė, kuriai projektas priklauso kartu su jo kūrėju, ne daugiau kaip viena", + "Nextcloud user ids who may read this through the project": "Nextcloud naudotojai, galintys tai skaityti per projektą", + "Nextcloud groups whose members may change this through the project": "Nextcloud grupės, kurių nariai gali tai keisti per projektą", + "Nextcloud groups whose members may read this through the project": "Nextcloud grupės, kurių nariai gali tai skaityti per projektą", + "Search for a person or a group…": "Ieškoti asmens ar grupės…", + "No one found. Your admin's sharing settings decide who you can find.": "Nieko nerasta. Jūsų administratoriaus bendrinimo nustatymai lemia, ką galite rasti.", + "Type at least two characters": "Įveskite bent du simbolius", + "Everyone in this group": "Visi šioje grupėje", + "Could not search for people. Please try again.": "Nepavyko ieškoti žmonių. Bandykite dar kartą.", + "Could not remove the group": "Nepavyko pašalinti grupės", + "Only the owner and managers change who is on this project.": "Tik savininkas ir valdytojai keičia, kas yra šiame projekte.", + "Role of {name}": "{name} vaidmuo", + "Manager": "Valdytojas", + "Member": "Narys", + "Viewer": "Skaitytojas", + "Could not change the role": "Nepavyko pakeisti vaidmens", + "Owned by group: {name}": "Priklauso grupei: {name}", + "No group owns this project.": "Šis projektas nepriklauso jokiai grupei.", + "Owned by group": "Priklauso grupei", + "Search for a group…": "Ieškoti grupės…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Grupė nerasta. Jūsų administratoriaus bendrinimo nustatymai lemia, kokias grupes galite rasti.", + "No owning group": "Nėra savininkės grupės", + "Could not search for groups. Please try again.": "Nepavyko ieškoti grupių. Bandykite dar kartą.", + "Could not change the owning group": "Nepavyko pakeisti savininkės grupės", + "You can read this project. Only its members change it.": "Galite skaityti šį projektą. Jį keičia tik jo nariai.", + "Course": "Kursas", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursas, kurio mokoma per šią pamoką, pavyzdžiui, pasirenkamasis dalykas, kai mokyklos mokymosi programėlė jį žino.", + "Online meeting link": "Nuotolinės pamokos nuoroda", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kur mokiniai prisijungia prie šios pamokos nuotoliu. Mygtukas Prisijungti rodomas tik su https nuoroda." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lt.json b/l10n/lt.json index ab179968..10add341 100644 --- a/l10n/lt.json +++ b/l10n/lt.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktyvūs projektai", + "Archived projects": "Archyvuoti projektai", + "Boards": "Lentos", + "My projects": "Mano projektai", + "Portfolio": "Portfelis", + "Project board": "Projekto lenta", + "Projects I am in": "Projektai, kuriuose dalyvauju", + "Timeline": "Laiko juosta", + "Timesheet": "Darbo laiko apskaita", + "Features & roadmap": "Funkcijos ir planas", + "Flow": "Srautas", + "Flows": "Srautai", + "Reports": "Ataskaitos", + "Pick a report to open it.": "Pasirinkite ataskaitą, kad ją atidarytumėte.", + "In progress": "Vykdoma", + "Date": "Data", + "Due": "Terminas", + "Assignee": "Priskirta", + "Who": "Kas", + "What": "Kas", + "Minutes": "Minutės", + "Entries": "Įrašai", + "Most recent": "Naujausi", + "Per person": "Vienam asmeniui", + "By status": "Pagal būseną", + "By priority": "Pagal prioritetą", + "Task status": "Užduočių būsena", + "Time spent": "Sugaištas laikas", + "Capacity": "Pajėgumas", + "Due soonest": "Artimiausi terminai", + "Minutes logged": "Užregistruotos minutės", + "Nothing is due": "Nėra artėjančių terminų", + "Nothing logged yet": "Dar nieko neužregistruota", + "What is open, what is blocked, and what is overdue.": "Kas atidaryta, kas užblokuota ir kas vėluoja.", + "How allocation is spread across the people working on projects.": "Kaip krūvis pasiskirsto tarp žmonių, dirbančių prie projektų.", + "Hours logged, and the projects they went to.": "Užregistruotos valandos ir projektai, kuriems jos skirtos.", + "Billable": "Apmokestinama", + "Budget: {amount}": "Biudžetas: {amount}", + "Loading projects": "Įkeliami projektai", + "No projects for this client yet": "Šiam klientui projektų dar nėra", + "Open in Planninq": "Atidaryti Planninq", + "This project could not be found": "Šis projektas nerastas", + "Untitled project": "Projektas be pavadinimo", + "and {count} more": "ir dar {count}", + "Store": "Parduotuvė", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Įdiekite registrus, schemas ir srautus, kuriuos paskelbė kitos organizacijos.", + "Work Date": "Darbo data", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Stulpelio veiksmai", + "Columns": "Stulpeliai", + "Could not remove the column. Please try again.": "Nepavyko pašalinti stulpelio. Bandykite dar kartą.", + "Could not save the column. Please try again.": "Nepavyko išsaugoti stulpelio. Bandykite dar kartą.", + "Done column": "Atliktų stulpelis", + "Edit column": "Redaguoti stulpelį", + "Keep the card's status": "Išlaikyti kortelės būseną", + "Move its cards to": "Perkelti jo korteles į", + "Move left": "Perkelti į kairę", + "Move right": "Perkelti į dešinę", + "Status of cards moved here": "Čia perkeltų kortelių būsena", + "The last done column cannot be removed.": "Paskutinio atliktų stulpelio pašalinti negalima.", + "WIP limit": "WIP riba", + "over limit": "virš ribos", + "The status a card gets when it is moved into this column.": "Būsena, kurią kortelė gauna, kai perkeliama į šį stulpelį.", + "All priorities": "Visi prioritetai", + "Could not create the task. Please try again.": "Nepavyko sukurti užduoties. Bandykite dar kartą.", + "Created": "Sukurta", + "Move to backlog": "Į atsargų sąrašą", + "Move to board": "Į lentą", + "New task": "Nauja užduotis", + "Nothing in the backlog": "Atsargų sąrašas tuščias", + "Rank": "Rangas", + "Sort by": "Rikiuoti pagal", + "Sort by rank to reorder": "Norėdami pertvarkyti, rikiuokite pagal rangą", + "Task actions": "Užduoties veiksmai", + "All labels": "Visos žymės", + "Filter tasks by label": "Filtruoti užduotis pagal žymę", + "View timeline": "Rodyti laiko juostą", + "Board": "Lenta", + "List": "Sąrašas", + "Column": "Stulpelis", + "Board or list": "Lenta arba sąrašas", + "Log": "Žurnalas", + "Add entry": "Pridėti įrašą", + "Show": "Rodyti", + "No actions yet": "Veiksmų dar nėra", + "Closed": "Uždaryta", + "Entry actions": "Įrašo veiksmai", + "Add action": "Pridėti veiksmą", + "by {author}": "autorius {author}", + "saved {time}": "išsaugota {time}", + "Attendees: {names}": "Dalyviai: {names}", + "Add the first entry": "Pridėti pirmą įrašą", + "Issues": "Problemos", + "Lessons learned": "Pamokos", + "Meetings": "Susitikimai", + "Decisions": "Sprendimai", + "Actions": "Veiksmai", + "Issue": "Problema", + "Lesson learned": "Pamoka", + "Meeting": "Susitikimas", + "Decision": "Sprendimas", + "About this project": "Apie šį projektą", + "No description yet": "Aprašymo dar nėra", + "Start date": "Pradžios data", + "Not set": "Nenustatyta", + "End date": "Pabaigos data", + "Progress": "Pažanga", + "No tasks yet": "Užduočių dar nėra", + "Open the board": "Atverti lentą", + "People": "Žmonės", + "Owner": "Savininkas", + "Latest log entries": "Naujausi įrašai", + "Open the log": "Atverti žurnalą", + "{done} of {total} tasks done": "Atlikta {done} iš {total} užduočių", + "Edit entry": "Redaguoti įrašą", + "Type": "Rūšis", + "Attendees": "Dalyviai", + "Issue is closed": "Problema uždaryta", + "Could not save the entry. Please try again.": "Nepavyko išsaugoti įrašo. Bandykite dar kartą.", + "From: {title}": "Iš: {title}", + "What needs to happen": "Ką reikia padaryti", + "Could not create the action. Please try again.": "Nepavyko sukurti veiksmo. Bandykite dar kartą.", + "The action was created but could not be linked to the entry.": "Veiksmas sukurtas, bet jo nepavyko susieti su įrašu.", + "Project pages": "Projekto puslapiai", + "Overview": "Apžvalga", + "Risks": "Rizikos", + "Log entry": "Žurnalo įrašas", + "A short name for the entry": "Trumpas įrašo pavadinimas", + "Project": "Projektas", + "The project this entry belongs to": "Projektas, kuriam priklauso šis įrašas", + "What kind of entry this is": "Kokios rūšies tai įrašas", + "When it happened": "Kada tai įvyko", + "What happened, in Markdown": "Kas įvyko, Markdown formatu", + "Whether an issue is still open": "Ar problema vis dar atvira", + "The people at a meeting": "Susitikimo dalyviai", + "Tasks that came out of this entry": "Iš šio įrašo kilusios užduotys", + "Add risk": "Pridėti riziką", + "Risk": "Rizika", + "Score": "Balas", + "Response": "Atsakas", + "Review date": "Peržiūros data", + "no longer on the project": "nebėra projekte", + "Edit {title}": "Redaguoti {title}", + "No risks recorded yet": "Rizikų dar neužregistruota", + "Add the first risk": "Pridėti pirmą riziką", + "Medium": "Vidutinė", + "Mitigating": "Mažinama", + "Occurred": "Įvyko", + "Avoid": "Vengti", + "Reduce": "Mažinti", + "Transfer": "Perduoti", + "Accept": "Priimti", + "Highest open risks": "Didžiausios atviros rizikos", + "No open risks": "Atvirų rizikų nėra", + "Open the risk register": "Atverti rizikų registrą", + "Edit risk": "Redaguoti riziką", + "What could go wrong": "Kas gali nepavykti", + "Likelihood": "Tikimybė", + "Impact": "Poveikis", + "Score {score}": "Balas {score}", + "Countermeasures": "Atsakomosios priemonės", + "Could not save the risk. Please try again.": "Nepavyko išsaugoti rizikos. Bandykite dar kartą.", + "Risks by likelihood and impact": "Rizikos pagal tikimybę ir poveikį", + "Risk scale": "Rizikos skalė", + "The levels every project scores its risks on, and where low turns into medium and high": "Lygiai, kuriais kiekvienas projektas vertina rizikas, ir kur žema pereina į vidutinę ir aukštą", + "Number of levels": "Lygių skaičius", + "Likelihood labels": "Tikimybės pavadinimai", + "Impact labels": "Poveikio pavadinimai", + "Level {level}": "{level} lygis", + "Medium from score": "Vidutinė nuo balo", + "High from score": "Aukšta nuo balo", + "Risk scale saved": "Rizikos skalė išsaugota", + "1 risk uses level {level}. Change it first.": "1 rizika naudoja {level} lygį. Pirmiausia ją pakeiskite.", + "{count} risks use level {level}. Change them first.": "{count} rizikos naudoja {level} lygį. Pirmiausia jas pakeiskite.", + "Every level needs a label, and high must start above medium.": "Kiekvienam lygiui reikia pavadinimo, o aukšta turi prasidėti virš vidutinės.", + "The project this risk belongs to": "Projektas, kuriam priklauso ši rizika", + "The cause and the effect, in Markdown": "Priežastis ir pasekmė, Markdown formatu", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Laisvas grupavimas, pvz., planavimas, biudžetas ar tiekėjas", + "How likely it is, on the admin's risk scale": "Kiek tai tikėtina, pagal administratoriaus rizikos skalę", + "How hard it would hit, on the admin's risk scale": "Kaip smarkiai tai paveiktų, pagal administratoriaus rizikos skalę", + "Likelihood times impact, calculated by the server": "Tikimybė padauginta iš poveikio, apskaičiuoja serveris", + "Where the risk stands": "Kokia rizikos padėtis", + "The person who watches this risk": "Asmuo, kuris stebi šią riziką", + "How the project answers the risk": "Kaip projektas reaguoja į riziką", + "What is done to prevent it or soften it, in Markdown": "Kas daroma jai išvengti ar sušvelninti, Markdown formatu", + "When to look at this risk again": "Kada vėl peržiūrėti šią riziką", + "Very low": "Labai žema", + "Very high": "Labai aukšta", + "All projects": "Visi projektai", + "Project status report": "Projekto būklės ataskaita", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datuota ataskaita apie tai, kaip projektui sekasi pinigų, organizavimo, laiko, informacijos, kokybės ir rizikos srityse (GROTIK aspektai), kiekvienas su pastaba.", + "The project this report is about": "Projektas, kuriam skirta ataskaita", + "Report date": "Ataskaitos data", + "The day the report describes": "Diena, kurią aprašo ataskaita", + "Money": "Pinigai", + "How the project stands on this aspect": "Kaip projektui sekasi šiuo aspektu", + "On track": "Pagal planą", + "At risk": "Pavojuje", + "Off track": "Nukrypęs nuo plano", + "Money note": "Pastaba apie pinigus", + "A short explanation of this status": "Trumpas šios būklės paaiškinimas", + "Organisation": "Organizavimas", + "Organisation note": "Pastaba apie organizavimą", + "Time": "Laikas", + "Time note": "Pastaba apie laiką", + "Information": "Informacija", + "Information note": "Pastaba apie informaciją", + "Quality": "Kokybė", + "Quality note": "Pastaba apie kokybę", + "Risk note": "Pastaba apie riziką", + "Overall": "Bendrai", + "The worst of the six statuses, calculated by the server": "Blogiausia iš šešių būklių, apskaičiuoja serveris", + "Health: money": "Sveikata: pinigai", + "Copied from the newest status report": "Nukopijuota iš naujausios būklės ataskaitos", + "Health: organisation": "Sveikata: organizavimas", + "Health: time": "Sveikata: laikas", + "Health: information": "Sveikata: informacija", + "Health: quality": "Sveikata: kokybė", + "Health: risk": "Sveikata: rizika", + "Health: overall": "Sveikata: bendrai", + "Health: report date": "Sveikata: ataskaitos data", + "The date of the newest status report": "Naujausios būklės ataskaitos data", + "New report": "Nauja ataskaita", + "Only the project owner writes status reports.": "Būklės ataskaitas rašo tik projekto savininkas.", + "Latest report, {date}": "Paskutinė ataskaita, {date}", + "Aspect": "Aspektas", + "Note": "Pastaba", + "Report history": "Ataskaitų istorija", + "Author": "Autorius", + "No status reports yet": "Būklės ataskaitų dar nėra", + "Write the first report": "Parašyti pirmą ataskaitą", + "Choose a status for every aspect to save the report.": "Norėdami išsaugoti ataskaitą, kiekvienam aspektui pasirinkite būklę.", + "Suggested: on track.": "Pasiūlymas: pagal planą.", + "Suggested: at risk.": "Pasiūlymas: pavojuje.", + "Suggested: off track.": "Pasiūlymas: nukrypęs nuo plano.", + "1 task is past its due date.": "1 užduoties terminas praėjo.", + "{count} tasks are past their due date.": "Užduočių, kurių terminas praėjo: {count}.", + "The end date has passed with 1 open task.": "Pabaigos data praėjo, atvira 1 užduotis.", + "The end date has passed with {count} open tasks.": "Pabaigos data praėjo, atvirų užduočių: {count}.", + "No open task is past its due date.": "Nė vienos atviros užduoties terminas nepraėjo.", + "The highest open risk, \"{title}\", scores {score}.": "Didžiausia atvira rizika, „{title}“, įvertinta {score}.", + "There are no open risks.": "Atvirų rizikų nėra.", + "Costs are at {percent}% of the budget.": "Išlaidos sudaro {percent}% biudžeto.", + "No suggestion: the project has no budget.": "Pasiūlymo nėra: projektas neturi biudžeto.", + "No suggestion: no costs are recorded for this project yet.": "Pasiūlymo nėra: šiam projektui dar neužregistruota išlaidų.", + "The report was not saved. Only the project owner can write status reports.": "Ataskaita neišsaugota. Būklės ataskaitas gali rašyti tik projekto savininkas.", + "No report": "Ataskaitos nėra", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Projektų grupė, kuriai vadovauja tie patys žmonės, pavyzdžiui, skyrius ar programa. Jos vadovai skaito kiekvieną joje esantį projektą.", + "The name of the portfolio": "Portfelio pavadinimas", + "What the portfolio holds and who runs it": "Ką apima portfelis ir kas jam vadovauja", + "A colour for the portfolio's section in project lists": "Portfelio skilties spalva projektų sąrašuose", + "Managers": "Vadovai", + "Nextcloud user UIDs of the people who run the portfolio": "Portfeliui vadovaujančių žmonių Nextcloud naudotojų ID", + "Order": "Tvarka", + "Where the portfolio comes in project lists, lowest first": "Portfelio vieta projektų sąrašuose, mažiausias pirmas", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Šio portfelio nuosava rizikos skalė JSON formatu, tokios pat formos kaip visos programos skalė. Tuščia reiškia programos skalę.", + "Portfolio readers": "Portfelio skaitytojai", + "Nextcloud user UIDs of the managers of the project's portfolio": "Projekto portfelio vadovų Nextcloud naudotojų ID", + "The portfolio this project belongs to": "Portfelis, kuriam priklauso šis projektas", + "No portfolio": "Be portfelio", + "All portfolios": "Visi portfeliai", + "You read this project as a manager of its portfolio. Only its members change it.": "Šį projektą skaitote kaip jo portfelio vadovas. Jį keičia tik jo nariai.", + "Portfolios": "Portfeliai", + "Portfolio status": "Portfelio būsena", + "No portfolios yet": "Portfelių dar nėra", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administratorius prideda portfelius skiltyje Projektai, Portfeliai. Portfelio projektai išvardyti čia su jų būsena.", + "Roll-up": "Suvestinė", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} pagal planą, {atRisk} rizikoje, {offTrack} nukrypę, {noReport} be ataskaitos", + "No project in this portfolio that you can read.": "Šiame portfelyje nėra projekto, kurį galite skaityti.", + "Start": "Pradžia", + "End": "Pabaiga", + "Budget": "Biudžetas", + "Last report": "Paskutinė ataskaita", + "Out of date": "Pasenusi", + "Portfolio timeline": "Portfelio laiko juosta", + "Zoom": "Mastelis", + "Could not load the timeline": "Nepavyko įkelti laiko juostos", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administratorius prideda portfelius skiltyje Projektai, Portfeliai. Portfelio projektai čia rodomi vienoje laiko juostoje.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Atidarykite projektą, kad pamatytumėte jo etapus ir užduotis. Laiko juosta skirta tik skaityti.", + "Phase: {title}": "Etapas: {title}", + "Left out because you cannot read them: {count} projects": "Praleisti, nes negalite jų skaityti: {count} projektai", + "Week": "Savaitė", + "Day": "Diena", + "Month": "Mėnuo", + "Please try again later.": "Bandykite vėliau.", + "Status reports": "Būsenos ataskaitos", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Po kiek dienų paskutinė projekto būsenos ataskaita portfelio apžvalgoje pažymima kaip pasenusi", + "Reporting period (days)": "Ataskaitų laikotarpis (dienomis)", + "The reporting period is a whole number of days from 1 to 365.": "Ataskaitų laikotarpis yra sveikas dienų skaičius nuo 1 iki 365.", + "Reporting period saved": "Ataskaitų laikotarpis išsaugotas", + "The reporting period was not saved. Please try again.": "Ataskaitų laikotarpis neišsaugotas. Bandykite dar kartą.", + "Every project of a portfolio with its status per aspect, rolled up.": "Kiekvienas portfelio projektas su būsena pagal aspektus, apibendrintai.", + "The projects of a portfolio on one timeline.": "Portfelio projektai vienoje laiko juostoje.", + "Phases": "Etapai", + "Add phase": "Pridėti etapą", + "No phases yet": "Etapų dar nėra", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Padalykite projektą į etapus, pvz., inicijavimą, apibrėžimą ir įgyvendinimą. Etapas uždaromas, kai įkeliamas jo baigiamasis dokumentas.", + "{hours} hours": "{hours} val.", + "Concluding document: {title}": "Baigiamasis dokumentas: {title}", + "Concluding document missing": "Trūksta baigiamojo dokumento", + "Move {title} up": "Perkelti {title} aukštyn", + "Move {title} down": "Perkelti {title} žemyn", + "Close phase": "Uždaryti etapą", + "Phase": "Etapas", + "Files": "Failai", + "Notes": "Pastabos", + "Audit trail": "Audito žurnalas", + "Edit phase": "Redaguoti etapą", + "Name": "Pavadinimas", + "Budget hours": "Biudžeto valandos", + "Could not save the phase. Please try again.": "Nepavyko išsaugoti etapo. Bandykite dar kartą.", + "Close phase {title}": "Uždaryti etapą {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Etapas uždaromas su baigiamuoju dokumentu: įkelkite jį čia arba pasirinkite vieną iš etapo failų.", + "Concluding document": "Baigiamasis dokumentas", + "This phase has no files yet.": "Šis etapas dar neturi failų.", + "Upload a document": "Įkelti dokumentą", + "The document was not uploaded. Please try again.": "Dokumentas neįkeltas. Bandykite dar kartą.", + "Upload the concluding document before you close this phase.": "Prieš uždarydami šį etapą įkelkite baigiamąjį dokumentą.", + "This phase cannot be closed from its current status.": "Šio etapo negalima uždaryti iš dabartinės būsenos.", + "The phase was not closed. Please try again.": "Etapas neuždarytas. Bandykite dar kartą.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Šio etapo failo, kuris jį užbaigia, ID. Etapą galima užbaigti tik tada, kai jis nurodytas ir failas pridėtas.", + "Import from Microsoft Project": "Importuoti iš Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Pasirinkite planą, išsaugotą iš Microsoft Project XML formatu. Niekas neimportuojama, kol nepatvirtinsite.", + "Plan file": "Plano failas", + "What the import creates": "Ką sukuria importas", + "Tasks": "Užduotys", + "Sub-tasks": "Paužduotys", + "Milestones": "Gairės", + "Links": "Ryšiai", + "Already imported, updated in place: {count}": "Jau importuota, atnaujinta vietoje: {count}", + "What does not carry over": "Kas neperkeliama", + "Tasks with resources, which are not imported: {count}": "Užduotys su ištekliais, kurie neimportuojami: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Užduotys giliau nei 3 lygis, perkeltos po savo 2 lygio užduotimi: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Ryšiai, kurie nėra pabaiga-pradžia, importuoti kaip susiję ryšiai: {count}", + "Link lags, which are dropped: {count}": "Ryšių vėlavimai, kurie atmetami: {count}", + "Links to a summary task, which are not imported: {count}": "Ryšiai su suvestine užduotimi, kurie neimportuojami: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Ryšiai su užduotimis už šio plano ribų, kurie neimportuojami: {count}", + "No longer in the plan": "Nebėra plane", + "These stay in the project; remove them yourself if they are no longer needed.": "Jos lieka projekte; pašalinkite jas patys, jei jų nebereikia.", + "Import": "Importuoti", + "Close": "Uždaryti", + "The plan is imported: {created} created, {updated} updated.": "Planas importuotas: sukurta {created}, atnaujinta {updated}.", + "Links that would close a loop were left out: {count}": "Ryšiai, kurie uždarytų ciklą, praleisti: {count}", + "The import stopped part-way. Run it again to finish it.": "Importas sustojo pusiaukelėje. Paleiskite jį dar kartą, kad užbaigtumėte.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Išsaugokite planą Microsoft Project pasirinkę Failas, Įrašyti kaip, XML formatas, ir importuokite tą failą.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Šis failas deklaruoja DOCTYPE arba esybes, kurios nepriimamos.", + "The file is larger than 10 MB.": "Failas didesnis nei 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plane yra daugiau nei 2000 užduočių, daugiau nei priima vienas importas.", + "This file is not a Microsoft Project plan in XML format.": "Šis failas nėra Microsoft Project planas XML formatu.", + "Choose a file to import.": "Pasirinkite failą importuoti.", + "Only the project owner can import a plan.": "Tik projekto savininkas gali importuoti planą.", + "The plan could not be read. Please try again.": "Plano nepavyko nuskaityti. Bandykite dar kartą.", + "Linked case: {title}": "Susieta byla: {title}", + "Linked to a case": "Susieta su byla", + "Hand over to case": "Perduoti bylai", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Nepakeistus nukopijuoja kiekvieną projekto ir jo užduočių failą bei projektą aprašantį failą į susietą bylą.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Nukopijuota failų: {count}", + "Files that failed: {names}": "Nepavykę failai: {names}", + "The handover failed. Please try again.": "Perduoti nepavyko. Bandykite dar kartą.", + "The linked case could not be found, or you cannot open it.": "Susieta byla nerasta arba jūs negalite jos atidaryti.", + "Case handovers": "Perdavimai bylai", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Kiekvienas kartas, kai projekto failai ir metaduomenys buvo perduoti bylai: kada, kas, kuriai bylai, kiekvienas nukopijuotas failas su jo SHA-256 ir nepavykę failai.", + "Finance": "Finansai", + "Add cost line": "Pridėti išlaidų eilutę", + "Delivery terms": "Pristatymo sąlygos", + "Billing model": "Atsiskaitymo modelis", + "Budget in euro": "Biudžetas eurais", + "Budget in hours": "Biudžetas valandomis", + "Hourly rate in euro": "Valandinis tarifas eurais", + "Planned start": "Planuojama pradžia", + "Planned end": "Planuojama pabaiga", + "Planned dates": "Planuojamos datos", + "Budget {amount}": "Biudžetas {amount}", + "No budget agreed": "Biudžetas nesutartas", + "Hours": "Valandos", + "Only the project owner and the portfolio managers see the amounts.": "Sumas mato tik projekto savininkas ir portfelio vadovai.", + "Budget against cost per category": "Biudžetas ir išlaidos pagal kategoriją", + "Labour (booked time)": "Darbas (užregistruotas laikas)", + "No category": "Be kategorijos", + "Hours are not available": "Valandos nepasiekiamos", + "Not yet assigned to a category": "Dar nepriskirta kategorijai", + "Total": "Iš viso", + "{spent} spent, {remaining} remaining": "{spent} išleista, {remaining} liko", + "Budget against cost per phase": "Biudžetas ir išlaidos pagal etapą", + "No phase": "Be etapo", + "Cost lines": "Išlaidų eilutės", + "From the finance system": "Iš finansų sistemos", + "Edit cost line {amount}": "Redaguoti išlaidų eilutę {amount}", + "No cost lines yet": "Išlaidų eilučių dar nėra", + "Commitments": "Įsipareigojimai", + "Actual cost": "Faktinės išlaidos", + "Forecast": "Prognozė", + "Remaining": "Liko", + "Not planned yet": "Dar nesuplanuota", + "{start} to {end}": "Nuo {start} iki {end}", + "The terms were not saved. Please try again.": "Sąlygos neišsaugotos. Bandykite dar kartą.", + "Terms saved": "Sąlygos išsaugotos", + "Fixed price": "Fiksuota kaina", + "Hourly": "Valandinis", + "Not billed": "Nesąskaitinama", + "Commitment": "Įsipareigojimas", + "Edit cost line": "Redaguoti išlaidų eilutę", + "Kind": "Rūšis", + "Amount in euro": "Suma eurais", + "Remove": "Pašalinti", + "Could not save the cost line. Only the project owner changes the money of a project.": "Nepavyko išsaugoti išlaidų eilutės. Projekto pinigus keičia tik projekto savininkas.", + "Could not remove the cost line. Please try again.": "Nepavyko pašalinti išlaidų eilutės. Bandykite dar kartą.", + "{amount} over budget": "{amount} virš biudžeto", + "Cost categories": "Išlaidų kategorijos", + "The categories every project splits its budget and costs into, one per line": "Kategorijos, į kurias kiekvienas projektas skirsto savo biudžetą ir išlaidas, po vieną eilutėje", + "Categories": "Kategorijos", + "Give at least one category, each name once.": "Nurodykite bent vieną kategoriją, kiekvieną pavadinimą vieną kartą.", + "Cost categories saved": "Išlaidų kategorijos išsaugotos", + "The cost categories were not saved. Please try again.": "Išlaidų kategorijos neišsaugotos. Bandykite dar kartą.", + "Finance line": "Finansų eilutė", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Viena projekto pinigų suma: biudžetas, įsipareigojimas, faktinės išlaidos ar prognozė, išlaidų kategorijoje ir pasirinktinai etape. Įveda projekto savininkas arba siunčia finansų sistema per integracijos programą.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projektas, kuriam priklauso ši suma. Tuščia finansų sistemos eilutei, kurios projekto numeris neatitinka jokio projekto.", + "The phase this amount belongs to, if any": "Etapas, kuriam priklauso suma, jei yra", + "The cost category, one of the categories the admin set up": "Išlaidų kategorija, viena iš administratoriaus nustatytų kategorijų", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Ar suma yra biudžetas, įsipareigojimas, faktinės išlaidos ar prognozė", + "Amount": "Suma", + "The amount in the reporting currency (euro)": "Suma ataskaitų valiuta (eurais)", + "The date the amount was booked or is expected": "Data, kai suma užregistruota arba laukiama", + "What the amount is for": "Kam skirta suma", + "Whether a person entered the line or the finance system sent it": "Ar eilutę įvedė žmogus, ar ją atsiuntė finansų sistema", + "Entered by hand": "Įvesta ranka", + "Finance line id": "Finansų eilutės ID", + "The finance system's own id of this line. One imported line per id.": "Šios eilutės ID finansų sistemoje. Viena importuota eilutė vienam ID.", + "Project number": "Projekto numeris", + "The project number the finance system sent, matched against the project key": "Finansų sistemos atsiųstas projekto numeris, lyginamas su projekto raktu", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Eilutės projekto portfelis, nukopijuotas iš projekto, kad portfelio sumoms užtektų vieno filtro", + "Finance readers": "Finansų skaitytojai", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud naudotojų UID, kurie gali matyti šią sumą: projekto savininkas ir jo portfelio vadovai", + "Project owner": "Projekto savininkas", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Projekto savininko Nextcloud naudotojo UID; jis gali keisti ir šalinti rankines eilutes", + "How the client pays: not billed, a fixed price, or by the hour.": "Kaip moka klientas: nesąskaitinama, fiksuota kaina arba valandinis.", + "Portfolio finance": "Portfelio finansai", + "You cannot see the money of any project in this portfolio": "Jūs nematote nė vieno šio portfelio projekto pinigų", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serveris grąžino išlaidų eilučių iš projektų už šio portfelio ribų, todėl šios sumos gali būti klaidingos.", + "Projects left out because you cannot see their money: {count}": "Praleisti projektai, nes nematote jų pinigų: {count}", + "Unmatched finance lines": "Nesusietos finansų eilutės", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Biudžetas, įsipareigojimai, faktinės išlaidos ir prognozė, susumuoti portfeliui.", + "Subprojects": "Subprojektai", + "{done} of {total}": "{done} iš {total}", + "{done} of {total} tasks done, including subprojects": "Atlikta {done} iš {total} užduočių, įskaitant subprojektus", + "Show the subprojects of {title}": "Rodyti {title} subprojektus", + "Hide the subprojects of {title}": "Slėpti {title} subprojektus", + "Part of": "Dalis", + "No parent project": "Nėra aukštesnio projekto", + "A project cannot sit under one of its own subprojects.": "Projektas negali būti po vienu iš savo subprojektų.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projektai įdedami ne giliau nei trys lygiai: programa, projektas ir subprojektas.", + "Parent project": "Aukštesnis projektas", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projektas, po kuriuo yra šis projektas, pvz., programa. Projektai įdedami ne giliau nei trys lygiai.", + "Yes": "Taip", + "No": "Ne", + "{label} (required)": "{label} (privaloma)", + "{label} is required": "{label} yra privalomas", + "Project field": "Projekto laukas", + "A field an admin adds to every project, such as a policy area or a contract value.": "Laukas, kurį administratorius prideda prie kiekvieno projekto, pvz., politikos sritis ar sutarties vertė.", + "Key": "Raktas", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Pastovus pavadinimas, kuriuo saugoma reikšmė, lower camel case forma. Palikite jį, kai projektai jį naudoja.", + "Label": "Etiketė", + "The name people see next to the field": "Pavadinimas, kurį žmonės mato prie lauko", + "What the field holds": "Ką laukas saugo", + "Text": "Tekstas", + "Number": "Skaičius", + "Choice": "Pasirinkimas", + "Person": "Asmuo", + "Yes or no": "Taip arba ne", + "Options": "Parinktys", + "The choices of a choice field": "Pasirinkimo lauko parinktys", + "Required": "Privalomas", + "Whether a project must fill in the field": "Ar projektas turi užpildyti lauką", + "Where the field appears, lowest first": "Kur laukas rodomas, mažiausias pirmas", + "Applies to": "Taikoma", + "What the field is added to": "Prie ko pridedamas laukas", + "Custom fields": "Savi laukai", + "The values of the project fields an admin defined, keyed by the field's key.": "Administratoriaus apibrėžtų projekto laukų reikšmės pagal lauko raktą.", + "Project fields": "Projekto laukai", + "Related": "Susijusios", + "Remove link": "Pašalinti ryšį", + "Link type": "Ryšio tipas", + "Relates to": "Susijusi su", + "Duplicates": "Dubliuoja", + "Project key": "Projekto raktas", + "Every task number starts with it, such as VERG-42.": "Juo prasideda kiekvienas užduoties numeris, pvz., VERG-42.", + "This key is already used by another project.": "Šį raktą jau naudoja kitas projektas.", + "Use 2 to 10 letters and digits, starting with a letter.": "Naudokite nuo 2 iki 10 raidžių ir skaitmenų, pradedant raide.", + "The key cannot change once tasks carry it.": "Rakto negalima keisti, kai užduotys jį jau turi.", + "Project saved. The existing tasks get their numbers in the background.": "Projektas išsaugotas. Esamos užduotys numerius gauna fone.", + "Next task number": "Kitos užduoties numeris", + "The number the next task of this project gets in its key. Only the system writes it.": "Numeris, kurį kita šio projekto užduotis gauna savo rakte. Jį rašo tik sistema.", + "Restore {title}": "Atkurti {title}", + "Restore": "Atkurti", + "Project restored": "Projektas atkurtas", + "Could not restore the project": "Nepavyko atkurti projekto", + "Bring this project back to the active list.": "Grąžinkite šį projektą į aktyvių projektų sąrašą.", + "Restore project": "Atkurti projektą", + "Request reason": "Prašymo priežastis", + "Why the requester needs this project. Filled in when the project is requested.": "Kodėl prašytojui reikia šio projekto. Pildoma teikiant prašymą.", + "Reviewed by": "Peržiūrėjo", + "The user who approved or rejected the request.": "Naudotojas, kuris patvirtino arba atmetė prašymą.", + "Reviewed at": "Peržiūrėta", + "When the request was approved or rejected.": "Kada prašymas buvo patvirtintas arba atmestas.", + "Review note": "Peržiūrėtojo pastaba", + "The reviewer's reason, shown to the requester when a request is not approved.": "Peržiūrėtojo priežastis, kurią prašytojas mato, kai prašymas nepatvirtinamas.", + "Members of these groups": "Šių grupių nariai", + "Groups that may create projects": "Grupės, kurios gali kurti projektus", + "The group {group} no longer exists. Save to remove it.": "Grupės {group} nebėra. Išsaugokite, kad ją pašalintumėte.", + "Review project request": "Peržiūrėti projekto prašymą", + "Requested by": "Paprašė", + "Why it is needed": "Kodėl jo reikia", + "Desired start date": "Pageidaujama pradžios data", + "Why is it not approved?": "Kodėl nepatvirtinama?", + "Give a reason. The requester sees it.": "Nurodykite priežastį. Prašytojas ją matys.", + "Approve": "Patvirtinti", + "Reject": "Atmesti", + "Reject request": "Atmesti prašymą", + "The review was not saved. Try again.": "Peržiūra neišsaugota. Bandykite dar kartą.", + "This project is waiting for review": "Šis projektas laukia peržiūros", + "This request was not approved": "Šis prašymas nepatvirtintas", + "Reason: {note}": "Priežastis: {note}", + "Review request": "Peržiūrėti prašymą", + "Request a project": "Paprašyti projekto", + "Step {step} of 2": "{step} žingsnis iš 2", + "Why is this project needed?": "Kodėl reikia šio projekto?", + "Give a reason. The reviewer reads it.": "Nurodykite priežastį. Peržiūrėtojas ją perskaitys.", + "Back": "Atgal", + "Next": "Toliau", + "Send request": "Siųsti prašymą", + "The request was not sent. Try again.": "Prašymas neišsiųstas. Bandykite dar kartą.", + "Requested": "Paprašyta", + "Not approved": "Nepatvirtinta", + "Your request was sent": "Jūsų prašymas išsiųstas", + "Let everyone else request a project": "Leisti visiems kitiems prašyti projekto", + "Add a task": "Pridėti užduotį", + "Delete task": "Ištrinti užduotį", + "Edit task": "Redaguoti užduotį", + "Write": "Rašyti", + "Preview": "Peržiūra", + "Markdown works here: headings, lists and links.": "Čia veikia Markdown: antraštės, sąrašai ir nuorodos.", + "Could not save the task. Please try again.": "Nepavyko išsaugoti užduoties. Bandykite dar kartą.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Užduočiai \"{title}\" užregistruotas laikas, todėl jos negalima ištrinti. Vietoj to ją galite atšaukti: laiko įrašai lieka.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Ištrinti \"{title}\"? Taip pat bus pašalintos jos sąsajos su kitomis užduotimis. To negalima atšaukti.", + "Keep task": "Palikti užduotį", + "Cancel task": "Atšaukti užduotį", + "Only the reporter, the project owner or an admin can delete this task.": "Šią užduotį gali ištrinti tik pranešėjas, projekto savininkas arba administratorius.", + "Could not delete the task. Please try again.": "Nepavyko ištrinti užduoties. Bandykite dar kartą.", + "Could not cancel the task. Please try again.": "Nepavyko atšaukti užduoties. Bandykite dar kartą.", + "Responsible": "Atsakingas asmuo", + "Also working on this": "Prie to taip pat dirba", + "Labels": "Žymos", + "Could not change the priority. Please try again.": "Nepavyko pakeisti prioriteto. Bandykite dar kartą.", + "Other project members who work on this task alongside the person responsible.": "Kiti projekto nariai, kurie dirba prie šios užduoties kartu su atsakingu asmeniu.", + "Duplicate": "Dubliuoti", + "Could not copy the task. Please try again.": "Nepavyko nukopijuoti užduoties. Bandykite dar kartą.", + "Subtasks": "Použduotys", + "{done} of {total} done": "Atlikta {done} iš {total}", + "Add a subtask": "Pridėti použduotį", + "Checklist": "Kontrolinis sąrašas", + "Checklist item actions": "Sąrašo punkto veiksmai", + "Add a checklist item": "Pridėti sąrašo punktą", + "Subtasks: {estimate} estimated, {logged} logged": "Použduotys: įvertinta {estimate}, užregistruota {logged}", + "Total estimate: {total}": "Bendras įvertinimas: {total}", + "Part of {title}": "Užduoties {title} dalis", + "Checklist: {count} done": "Kontrolinis sąrašas: atlikta {count}", + "This task has subtasks: {count}.": "Ši užduotis turi použduočių: {count}.", + "Keep subtasks as separate tasks": "Palikti použduotis kaip atskiras užduotis", + "Delete subtasks too": "Ištrinti ir použduotis", + "Copy of {title}": "Kopija: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Užduotis nukopijuota, bet ne visos jos použduotys. Patikrinkite kopiją.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Maži žingsniai užduoties viduje. Kiekvienas punktas turi id, tekstą ir žymą, ar jis atliktas.", + "Open work per person and per project.": "Atviras darbas pagal asmenis ir projektus.", + "View": "Rodinys", + "By person": "Pagal asmenį", + "By project": "Pagal projektą", + "Hours left": "Liko valandų", + "Tasks without an estimate": "Užduotys be įverčio", + "Due in 14 days": "Terminas per 14 dienų", + "Shared": "Bendrinamos", + "Unassigned": "Nepriskirtos", + "{hours} h": "{hours} val.", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Rodomas darbas projektuose, kuriuos galite matyti. Valandos skaičiuojamos atsakingam asmeniui; bendrinamos užduotys skaičiuojamos be valandų.", + "No open work in these projects.": "Šiuose projektuose nėra atviro darbo.", + "Open work": "Atviras darbas", + "{count} open tasks": "Atvirų užduočių: {count}", + "Create a project to see capacity here.": "Sukurkite projektą, kad čia matytumėte apkrovą.", + "My tasks": "Mano užduotys", + "Show all my tasks": "Rodyti visas mano užduotis", + "No tasks assigned to you": "Jums nepriskirta jokių užduočių", + "Browse projects": "Naršyti projektus", + "Later": "Vėliau", + "Due {date}": "Terminas {date}", + "Could not change the status. Please try again.": "Nepavyko pakeisti būsenos. Bandykite dar kartą.", + "Completed today": "Užbaigta šiandien", + "My open tasks": "Mano atviros užduotys", + "My overdue tasks": "Mano vėluojančios užduotys", + "My tasks in progress": "Mano vykdomos užduotys", + "Pin to the top": "Prisegti viršuje", + "Unpin": "Atsegti", + "Pinned": "Prisegta", + "Actions for {title}": "Veiksmai: {title}", + "Could not save your project order. Please try again.": "Nepavyko išsaugoti projektų tvarkos. Bandykite dar kartą.", + "No boards yet": "Lentų dar nėra", + "Create a project to get a board.": "Sukurkite projektą, kad gautumėte lentą.", + "Use the Projects page to create and manage your projects and tasks.": "Puslapyje Projektai kurkite ir tvarkykite savo projektus ir užduotis.", + "Go to projects": "Eiti į projektus", + "You are not a member of any projects yet.": "Dar nesate jokio projekto narys.", + "Could not search for users. Please try again.": "Nepavyko ieškoti naudotojų. Bandykite dar kartą.", + "Project creation is restricted to administrators.": "Projektus gali kurti tik administratoriai.", + "Only the project owner or an administrator can delete this project.": "Šį projektą gali ištrinti tik projekto savininkas arba administratorius.", + "No projects are available to you yet. Ask an administrator to create one.": "Jums dar nėra prieinamų projektų. Paprašykite administratoriaus sukurti projektą.", + "Due: {date}": "Terminas: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Užduotys su pradžios data ar terminu rodomos laiko juostoje. Pridėkite datas, kad jas matytumėte čia.", + "You do not have access to this project.": "Neturite prieigos prie šio projekto.", + "Zoom level": "Mastelio lygis", + "Unscheduled": "Nesuplanuotos", + "Start: {date}": "Pradžia: {date}", + "Today": "Šiandien", + "No scheduled tasks": "Nėra suplanuotų užduočių", + "An unexpected error occurred.": "Įvyko netikėta klaida.", + "Column {number} name": "Stulpelio {number} pavadinimas", + "Failed to save creation policy": "Nepavyko išsaugoti kūrimo taisyklės", + "All authenticated users": "Visi prisijungę naudotojai", + "Control who may create new projects": "Nustatykite, kas gali kurti naujus projektus", + "Administrators only": "Tik administratoriai", + "Project creation": "Projektų kūrimas", + "Allow project creation": "Leisti kurti projektus", + "Creation policy saved successfully": "Kūrimo taisyklė išsaugota", + "Initializing…": "Paleidžiama…", + "e.g. 2h 30m, 90m, 1.5h": "pvz. 2h 30m, 90m, 1.5h", + "Log time": "Registruoti laiką", + "Save estimate": "Išsaugoti įvertį", + "Logged: {logged}": "Užregistruota: {logged}", + "over by {amount}": "viršyta {amount}", + "Time tracking": "Laiko apskaita", + "Estimate": "Įvertis", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Įveskite tinkamą įvertį (pvz. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Įveskite tinkamą trukmę (pvz. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Nepavyko išsaugoti laiko įrašo. Bandykite dar kartą.", + "Edit time entry": "Redaguoti laiko įrašą", + "Duration": "Trukmė", + "Date range": "Laikotarpis", + "Last week": "Praėjusi savaitė", + "No time logged": "Laikas neužregistruotas", + "Log time on a task to see it here.": "Užregistruokite laiką užduočiai, kad jį matytumėte čia.", + "To date": "Iki datos", + "This week": "Ši savaitė", + "Total: {total}": "Iš viso: {total}", + "From date": "Nuo datos", + "Custom range": "Pasirinktinis laikotarpis", + "All time": "Visas laikas", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Nepavyko ištrinti užduoties, todėl gali likti duomenų. Ištrinkite projektą dar kartą.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Nepavyko ištrinti laiko įrašo, todėl gali likti duomenų. Ištrinkite projektą dar kartą.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Nepavyko ištrinti stulpelio, todėl gali likti duomenų. Ištrinkite projektą dar kartą.", + "Could not delete the project. Please try again.": "Nepavyko ištrinti projekto. Bandykite dar kartą.", + "Notification settings": "Pranešimų nustatymai", + "Configure when due-date reminders are sent": "Nustatykite, kada siunčiami priminimai apie terminus", + "Due-date reminder lead time (hours)": "Priminimo laikas iki termino (valandos)", + "Lead time must be between 1 and 336 hours": "Laikas turi būti nuo 1 iki 336 valandų", + "Reminder lead time saved successfully": "Priminimo laikas išsaugotas", + "Failed to save reminder lead time": "Nepavyko išsaugoti priminimo laiko", + "Notifications": "Pranešimai", + "Notify me 1 day before a task's due date": "Pranešti man 1 dieną iki užduoties termino", + "Draft": "Juodraštis", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Ar pamoka yra juodraštis, kurį mato tik jos mokytojas, vyksta ar atšaukta.", + "New release": "Nauja laida", + "Roadmap chart. The same releases and epics are listed below.": "Veiksmų plano diagrama. Tos pačios laidos ir epai išvardyti žemiau.", + "Nothing on the roadmap yet": "Veiksmų plane dar nieko nėra", + "Releases with a target date and epics with dated tasks appear here.": "Čia rodomos laidos su tiksline data ir epai su datuotomis užduotimis.", + "Releases": "Laidos", + "No releases yet": "Laidų dar nėra", + "Target date: {date}": "Tikslinė data: {date}", + "No target date": "Nėra tikslinės datos", + "Edit {name}": "Redaguoti {name}", + "Mark {name} as released": "Pažymėti {name} kaip išleistą", + "Mark as released": "Pažymėti kaip išleistą", + "Epics": "Epai", + "No epics yet. Open a task to make it an epic.": "Epų dar nėra. Atverkite užduotį, kad paverstumėte ją epu.", + "Not scheduled yet": "Dar nesuplanuota", + "Planned": "Suplanuota", + "Released": "Išleista", + "Edit release": "Redaguoti laidą", + "Target date": "Tikslinė data", + "Could not save the release. Please try again.": "Nepavyko išsaugoti laidos. Bandykite dar kartą.", + "Every task of this release is done or cancelled.": "Visos šios laidos užduotys atliktos arba atšauktos.", + "Not finished yet: {count}": "Dar nebaigta: {count}", + "What happens to these tasks?": "Kas nutiks šioms užduotims?", + "Move to {name}": "Perkelti į {name}", + "Remove the release": "Pašalinti laidą", + "Keep it on {name}": "Palikti jas laidoje {name}", + "Could not mark the release as released. Please try again.": "Nepavyko pažymėti laidos kaip išleistos. Bandykite dar kartą.", + "Roadmap": "Veiksmų planas", + "Tasks or roadmap": "Užduotys arba veiksmų planas", + "Release": "Laida", + "Epic": "Epas", + "This task is an epic": "Ši užduotis yra epas", + "A named, dated delivery of a project that its tasks are planned against.": "Pavadintas ir datuotas projekto pristatymas, pagal kurį planuojamos jo užduotys.", + "Name of the release": "Laidos pavadinimas", + "The project this release belongs to": "Projektas, kuriam priklauso ši laida", + "What this release delivers": "Ką pristato ši laida", + "When work on the release starts": "Kada prasideda darbas prie laidos", + "The date the release is due": "Data, iki kurios laida turi būti parengta", + "Whether the release is planned, released or archived": "Ar laida suplanuota, išleista ar archyvuota", + "Released on": "Išleista", + "When the release was marked as released": "Kada laida pažymėta kaip išleista", + "The release this task is planned for": "Laida, kuriai suplanuota ši užduotis", + "Board view options": "Lentos rodinio parinktys", + "Colour cards": "Spalvinti korteles", + "No colour": "Be spalvos", + "By label": "Pagal žymą", + "Swimlanes": "Takeliai", + "No swimlanes": "Be takelių", + "By assignee": "Pagal atsakingą asmenį", + "By epic": "Pagal epą", + "No assignee": "Nepriskirta", + "No epic": "Be epo", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kortelės lieka savo epo eilutėje. Epą pakeiskite užduoties puslapyje.", + "Hand over to": "Perduoti", + "Could not save your board view. It applies until you reload.": "Lentos rodinio išsaugoti nepavyko. Jis galioja, kol iš naujo įkelsite puslapį.", + "Timetable wish": "Tvarkaraščio pageidavimas", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Pageidavimas, kurį generatorius įvertina. Griežtą pageidavimą jis visada išlaiko, lankstų, kur gali.", + "Whether the wish is about a teacher, a group, a room or one activity": "Ar pageidavimas susijęs su mokytoju, grupe, patalpa ar viena veikla", + "Teacher": "Mokytojas", + "Group": "Grupė", + "Reference": "Nuoroda", + "The user, group, room or activity the wish is about": "Naudotojas, grupė, patalpa ar veikla, su kuria susijęs pageidavimas", + "What the wish asks for": "Ko prašo pageidavimas", + "Not on these periods": "Ne šiomis pamokomis", + "Preferably not on these periods": "Geriau ne šiomis pamokomis", + "At most a number of lessons a day": "Ne daugiau kaip tam tikras pamokų skaičius per dieną", + "No free periods between lessons": "Jokių langų tarp pamokų", + "Always the same room": "Visada ta pati patalpa", + "Periods": "Pamokos", + "The periods of the week the wish is about, such as wed-5": "Savaitės pamokos, su kuriomis susijęs pageidavimas, pvz., wed-5", + "Limit": "Riba", + "The most lessons a day, for a wish of that kind": "Daugiausia pamokų per dieną tokios rūšies pageidavimui", + "Strength": "Stiprumas", + "Whether the generator must keep the wish or should keep it": "Ar generatorius privalo ar turėtų išlaikyti pageidavimą", + "Hard": "Griežtas", + "Soft": "Lankstus", + "Weight": "Svoris", + "How much a soft wish counts, from 1 to 3": "Kiek sveria lankstus pageidavimas, nuo 1 iki 3", + "Why the wish exists": "Kodėl pageidavimas yra", + "Timetable scenario": "Tvarkaraščio scenarijus", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Vienas savaitės modelis, sukurtas generatoriaus arba paimtas iš dabartinio tvarkaraščio. Jis saugo savo įvestį ir kaip gerai išlaiko pageidavimus.", + "The name timetablers know the scenario by": "Pavadinimas, kuriuo sudarytojai žino scenarijų", + "Whether the generator made it or it came from the current timetable": "Ar jį sukūrė generatorius, ar jis kilęs iš dabartinio tvarkaraščio", + "Generated": "Sugeneruotas", + "From the current timetable": "Iš dabartinio tvarkaraščio", + "Week of": "Savaitė nuo", + "The Monday of the first week of the window": "Laikotarpio pirmosios savaitės pirmadienis", + "Window start": "Laikotarpio pradžia", + "The first day the week pattern applies to": "Pirmoji diena, kuriai galioja savaitės modelis", + "Window end": "Laikotarpio pabaiga", + "The last day the week pattern applies to": "Paskutinė diena, kuriai galioja savaitės modelis", + "Waiting, generating, done, failed, or published as draft lessons": "Laukia, generuojamas, baigtas, nepavyko arba paskelbtas kaip juodraštinės pamokos", + "Waiting": "Laukia", + "Generating": "Generuojamas", + "Failed": "Nepavyko", + "Published": "Paskelbtas", + "Seed": "Sėkla", + "The number the generator starts from, so a run can be repeated": "Skaičius, nuo kurio pradeda generatorius, kad paleidimą būtų galima pakartoti", + "Input": "Įvestis", + "The periods, rooms, lessons and wishes the scenario was made from": "Pamokos, patalpos, užsiėmimai ir pageidavimai, iš kurių sukurtas scenarijus", + "Placements": "Išdėstymai", + "Each lesson with the period and room it was given": "Kiekviena pamoka su gautu laiku ir patalpa", + "Unplaced lessons": "Neišdėstytos pamokos", + "Lessons without a place, each with the hard wish that blocked it": "Pamokos be vietos, kiekviena su griežtu pageidavimu, kuris ją sustabdė", + "Broken wishes": "Pažeisti pageidavimai", + "The wishes this scenario breaks, with the lessons that break them": "Pageidavimai, kuriuos šis scenarijus pažeidžia, su juos pažeidžiančiomis pamokomis", + "Measures": "Rodikliai", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Išdėstytos pamokos, pažeisti pageidavimai, mokytojų langai, pamokos per dieną ir patalpų naudojimas", + "Reason": "Priežastis", + "Why the run failed": "Kodėl paleidimas nepavyko", + "Published at": "Paskelbta", + "When the scenario was written out as draft lessons": "Kada scenarijus buvo įrašytas kaip juodraštinės pamokos", + "Edit wish": "Redaguoti pageidavimą", + "New wish": "Naujas pageidavimas", + "Hard: the generator always keeps it": "Privalomas: generatorius jo visada laikosi", + "Soft: the generator keeps it where it can": "Lankstus: generatorius jo laikosi, kai gali", + "Weight (1 to 3)": "Svoris (nuo 1 iki 3)", + "Most lessons a day": "Daugiausia pamokų per dieną", + "Period": "Pamoka", + "{day} period {number}": "{day} {number} pamoka", + "Teacher (user name)": "Mokytojas (naudotojo vardas)", + "Activity (group:subject)": "Veikla (grupė:dalykas)", + "Say who or what the wish is about.": "Nurodykite, ko pageidavimas liečia.", + "Choose at least one period.": "Pasirinkite bent vieną pamoką.", + "The limit is a whole number of 1 or more.": "Riba yra sveikasis skaičius, 1 ar daugiau.", + "Timetable": "Tvarkaraštis", + "Wishes": "Pageidavimai", + "Timetable wishes": "Tvarkaraščio pageidavimai", + "Generator run": "Generatoriaus vykdymas", + "Generator progress": "Generatoriaus eiga", + "The run failed: {reason}": "Vykdymas nepavyko: {reason}", + "{placed} of {lessons} lessons placed": "Išdėstyta {placed} iš {lessons} pamokų", + "Generate again": "Generuoti iš naujo", + "Generate": "Generuoti", + "Every lesson has a place.": "Kiekviena pamoka turi vietą.", + "Lesson": "Pamoka", + "No free period and room": "Nėra laisvos pamokos ir patalpos", + "Broken soft wishes": "Pažeisti lankstūs pageidavimai", + "Every soft wish is kept.": "Kiekvieno lankstaus pageidavimo laikomasi.", + "Wish": "Pageidavimas", + "Lessons": "Pamokos", + "Generating: {percent}% of the time budget used": "Generuojama: išnaudota {percent}% laiko", + "Waiting to start": "Laukiama pradžios", + "Published as draft lessons": "Paskelbta kaip pamokų juodraščiai", + "Could not read the scenario.": "Scenarijaus perskaityti nepavyko.", + "Could not start the run.": "Vykdymo pradėti nepavyko.", + "Scenarios": "Scenarijai", + "Timetable scenarios": "Tvarkaraščio scenarijai", + "Scenario": "Scenarijus", + "Take the current timetable": "Perimti dabartinį tvarkaraštį", + "Could not take the current timetable.": "Nepavyko perimti dabartinio tvarkaraščio.", + "Broken hard wishes": "Pažeisti privalomi pageidavimai", + "Not on a period of the week grid": "Ne savaitės tinklelio pamokoje", + "Compare scenarios": "Palyginti scenarijus", + "Scenarios to compare": "Lyginami scenarijai", + "Choose two or three scenarios to compare them.": "Pasirinkite du ar tris scenarijus palyginti.", + "Measure": "Rodiklis", + "Best": "Geriausias", + "Lessons that differ": "Besiskiriančios pamokos", + "No lesson differs.": "Jokia pamoka nesiskiria.", + "Not placed": "Neišdėstyta", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Išdėstytos pamokos", + "Lessons without a place": "Pamokos be vietos", + "Clashes": "Konfliktai", + "Hard wishes broken": "Pažeisti privalomi pageidavimai", + "Soft wishes broken": "Pažeisti lankstūs pageidavimai", + "Soft wishes broken, weighted": "Pažeisti lankstūs pageidavimai, pasverti", + "Free periods between lessons, all teachers": "Langai, visi mokytojai", + "Most free periods of one teacher": "Daugiausia vieno mokytojo langų", + "Most lessons of one group on a day": "Daugiausia vienos grupės pamokų per dieną", + "Room use": "Patalpų naudojimas", + "Publish as draft lessons": "Paskelbti kaip juodraštines pamokas", + "Draft lessons written: {count}": "Įrašyta juodraštinių pamokų: {count}", + "Could not publish the scenario.": "Nepavyko paskelbti scenarijaus.", + "Rules": "Taisyklės", + "Rules for {column}": "Stulpelio {column} taisyklės", + "When a card enters this column": "Kai kortelė patenka į šį stulpelį", + "Action": "Veiksmas", + "Set the priority": "Nustatyti prioritetą", + "Assign to": "Priskirti", + "Assign the person who moved the card": "Priskirti asmeniui, kuris perkėlė kortelę", + "Remove the assignee": "Pašalinti atsakingą asmenį", + "Add a label": "Pridėti žymą", + "No longer a project member": "Nebe projekto narys", + "This label no longer exists": "Šios žymos nebėra", + "Add rule": "Pridėti taisyklę", + "Remove rule": "Pašalinti taisyklę", + "No rules yet. Add one to change a card when it enters this column.": "Taisyklių dar nėra. Pridėkite taisyklę, kuri pakeičia kortelę, kai ji patenka į šį stulpelį.", + "Could not save the rules. Please try again.": "Taisyklių išsaugoti nepavyko. Bandykite dar kartą.", + "1 rule runs when a card enters this column": "1 taisyklė vykdoma, kai kortelė patenka į šį stulpelį", + "{count} rules run when a card enters this column": "Taisyklių, vykdomų kai kortelė patenka į šį stulpelį: {count}", + "Rules applied: {changes}": "Pritaikytos taisyklės: {changes}", + "assigned to {name}": "priskirta: {name}", + "assignee removed": "atsakingas asmuo pašalintas", + "priority {priority}": "prioritetas {priority}", + "label {label}": "žyma {label}", + "What happens to a card when it enters this column, applied in list order.": "Kas nutinka kortelei, kai ji patenka į šį stulpelį, sąrašo tvarka.", + "Value": "Reikšmė", + "What the rule does to the card.": "Ką taisyklė daro su kortele.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioritetas, naudotojo ID arba žymos ID, kurį naudoja veiksmas; tuščia veiksmams be reikšmės.", + "is not": "nėra", + "{dimension} is not": "{dimension} nėra", + "Saved filters": "Išsaugoti filtrai", + "No saved filters yet": "Išsaugotų filtrų dar nėra", + "Save filter": "Išsaugoti filtrą", + "Rename \"{name}\"": "Pervadinti „{name}“", + "Delete \"{name}\"": "Ištrinti „{name}“", + "Clear filters": "Išvalyti filtrus", + "Showing {shown} of {total} tasks": "Rodoma {shown} iš {total} užduočių", + "Me": "Aš", + "No date": "Be datos", + "Rename saved filter": "Pervadinti išsaugotą filtrą", + "Share with the project": "Bendrinti su projektu", + "Give the filter a name": "Suteikite filtrui pavadinimą", + "Could not save the filter. Please try again.": "Filtro išsaugoti nepavyko. Bandykite dar kartą.", + "Some labels in \"{name}\" no longer exist and were left out.": "Kai kurių „{name}“ žymų nebėra, todėl jos praleistos.", + "Could not delete the filter. Please try again.": "Filtro ištrinti nepavyko. Bandykite dar kartą.", + "Saved filter": "Išsaugotas filtras", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Pavadintas vieno projekto lentos filtras, privatus jį išsaugojusiam asmeniui, nebent bendrinamas su projektu.", + "The project whose board the filter applies to": "Projektas, kurio lentai taikomas filtras", + "The name the filter is listed under": "Pavadinimas, kuriuo filtras rodomas sąraše", + "Saved by": "Išsaugojo", + "Nextcloud user id of the person who saved the filter": "Filtrą išsaugojusio asmens Nextcloud naudotojo ID", + "Shared with the project": "Bendrinamas su projektu", + "Whether every project member sees and applies the filter": "Ar kiekvienas projekto narys mato filtrą ir gali jį taikyti", + "Criteria": "Kriterijai", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtras: atsakingas asmuo, žyma, prioritetas ir terminas, kiekvienas su yra arba nėra ir reikšmėmis", + "Cross-project view": "Kelių projektų rodinys", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Išsaugotas projektų rinkinys, kurio užduotys rodomos kartu būsenų juostose, bendrinamas su jame nurodytais žmonėmis.", + "Shared with": "Bendrinama su", + "The name the view is listed under": "Pavadinimas, kuriuo rodinys pateikiamas sąraše", + "Nextcloud user id of the person who saved the view": "Rodinį išsaugojusio asmens Nextcloud naudotojo ID", + "Nextcloud user ids of the people the view is shared with": "Žmonių, su kuriais bendrinamas rodinys, Nextcloud naudotojų ID", + "The projects whose tasks the view shows, at most twenty": "Projektai, kurių užduotis rodo rodinys, ne daugiau kaip dvidešimt", + "1 project in this view is hidden from you.": "1 šio rodinio projektas nuo jūsų paslėptas.", + "{count} projects in this view are hidden from you.": "Šio rodinio projektų, paslėptų nuo jūsų: {count}.", + "{project} has no column for {status}.": "Projektas {project} neturi stulpelio būsenai {status}.", + "This view does not exist or is not shared with you.": "Šio rodinio nėra arba jis su jumis nebendrinamas.", + "\"{task}\" moved to {status}.": "\"{task}\" perkelta į {status}.", + "Project: {title}": "Projektas: {title}", + "Cross-project views": "Kelių projektų rodiniai", + "New view": "Naujas rodinys", + "Edit view": "Redaguoti rodinį", + "Delete view": "Ištrinti rodinį", + "Give the view a name": "Suteikite rodiniui pavadinimą", + "Pick at least one project": "Pasirinkite bent vieną projektą", + "A view shows at most {max} projects": "Rodinys rodo ne daugiau kaip {max} projektų", + "Could not save the view. Please try again.": "Nepavyko išsaugoti rodinio. Bandykite dar kartą.", + "Could not delete the view. Please try again.": "Nepavyko ištrinti rodinio. Bandykite dar kartą.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Ištrinti „{title}“? Projektai ir jų užduotys lieka tokie, kokie yra.", + "People see the tasks of the projects they are in, never more.": "Kiekvienas mato tik tų projektų, kuriuose dalyvauja, užduotis.", + "No views yet. A view shows the tasks of several of your projects together.": "Rodinių dar nėra. Rodinys rodo kelių jūsų projektų užduotis kartu.", + "Projects in view: {count}": "Projektų rodinyje: {count}", + "Notify me when a task is assigned to me": "Pranešti man, kai man priskiriama užduotis", + "Also send these to me by email": "Siųsti juos man ir el. paštu", + "Add an email address in your Nextcloud personal settings to get mail.": "Kad gautumėte el. laiškus, pridėkite el. pašto adresą savo asmeniniuose Nextcloud nustatymuose.", + "Code link": "Kodo nuoroda", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Įsipareigojimas, šaka, sujungimo užklausa ar problema kodo platformoje, susijusi su užduotimi.", + "The task the link belongs to": "Užduotis, kuriai priklauso nuoroda", + "The project of the task": "Užduoties projektas", + "Task key": "Užduoties raktas", + "The task key the forge text named, such as VC-12": "Užduoties raktas, kurį nurodė kodo platformos tekstas, pvz., VC-12", + "What the link points at": "Į ką rodo nuoroda", + "Link": "Nuoroda", + "The address of the item in the forge": "Elemento adresas kodo platformoje", + "The commit message, branch name or merge request title": "Įsipareigojimo pranešimas, šakos pavadinimas ar sujungimo užklausos pavadinimas", + "Repository": "Saugykla", + "The repository, such as acme/portal": "Saugykla, pvz., acme/portal", + "Forge id": "Id platformoje", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Paties elemento id kodo platformoje, pvz., github:acme/portal#42 ar įsipareigojimo maiša", + "State": "Būsena", + "The state of a merge request or issue": "Sujungimo užklausos ar problemos būsena", + "Who made the commit or opened the merge request": "Kas atliko įsipareigojimą ar atidarė sujungimo užklausą", + "When the commit was made or the merge request last changed": "Kada atliktas įsipareigojimas ar paskutinį kartą pasikeitė sujungimo užklausa", + "Added by": "Pridėjo", + "Whether a person added the link or the integration wrote it": "Ar nuorodą pridėjo žmogus, ar ją įrašė integracija", + "Nextcloud user UIDs of project members": "Projekto narių Nextcloud naudotojų ID", + "Add link": "Pridėti nuorodą", + "Added by hand": "Pridėta rankiniu būdu", + "Branch": "Šaka", + "Code": "Kodas", + "Commit": "Įsipareigojimas", + "From the integration": "Iš integracijos", + "Link to a commit, branch or merge request": "Nuoroda į įsipareigojimą, šaką ar sujungimo užklausą", + "Merge request": "Sujungimo užklausa", + "Merged": "Sujungta", + "No code linked yet. Name {key} in a commit message or paste a link.": "Kodas dar nesusietas. Nurodykite {key} įsipareigojimo pranešime arba įklijuokite nuorodą.", + "No code linked yet. Paste a link to a commit or merge request.": "Kodas dar nesusietas. Įklijuokite nuorodą į įsipareigojimą ar sujungimo užklausą.", + "Paste a web address that starts with https://.": "Įklijuokite žiniatinklio adresą, prasidedantį https://.", + "Remove link {title}": "Pašalinti nuorodą {title}", + "The link could not be added.": "Nuorodos nepavyko pridėti.", + "The link could not be removed.": "Nuorodos nepavyko pašalinti.", + "This link is already on the task.": "Ši nuoroda jau yra prie užduoties.", + "Code forges": "Kodo platformos", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Susiekite GitHub įsipareigojimus ir pull request su užduotimis. Integriq gauna įvykius; planninq niekada nesikreipia į GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Atsisiųskite konfigūraciją ir importuokite ją į Integriq. Tada įrašykite paslaptį taisyklėje \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "GitHub saugyklai pridėkite webhook su šiuo adresu ir ta pačia paslaptimi. Pasirinkite turinio tipą application/json ir įvykius push bei pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nurodykite užduoties raktą, pvz., VC-12, įsipareigojimo pranešime, šakos pavadinime ar pull request pavadinime. Tada nuoroda atsiras prie tos užduoties.", + "Without Integriq, project members can still paste a link on the task page.": "Be Integriq projekto nariai vis tiek gali įklijuoti nuorodą užduoties puslapyje.", + "Download the Integriq configuration": "Atsisiųsti Integriq konfigūraciją", + "Calendar": "Kalendorius", + "Previous": "Ankstesnis", + "Calendar view": "Kalendoriaus rodinys", + "Starts:": "Prasideda:", + "No tasks with a date in this month.": "Šį mėnesį nėra užduočių su data.", + "Week of {start} to {end}": "Savaitė nuo {start} iki {end}", + "My calendar": "Mano kalendorius", + "Show as list": "Rodyti sąrašu", + "Show as calendar": "Rodyti kalendoriuje", + "Open my calendar": "Atverti mano kalendorių", + "Nextcloud Tasks": "Nextcloud užduotys", + "Show my tasks in Nextcloud Tasks": "Rodyti mano užduotis Nextcloud užduotyse", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Jums priskirtos arba su jumis bendrinamos užduotys rodomos sąraše \"Planninq\" Nextcloud užduotyse ir kalendoriuje. Ten atlikti pakeitimai pakeičiami kitu Planninq pakeitimu.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Šis serveris negali rašyti į Nextcloud užduotis, todėl eksportas negalimas.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Tvarko Planninq. Čia atlikti pakeitimai pakeičiami kitu Planninq pakeitimu.", + "Working days and holidays": "Darbo dienos ir šventės", + "Dates set on the timeline skip the days that are not working days.": "Laiko juostoje nustatytos datos praleidžia ne darbo dienas.", + "Working weekdays": "Savaitės darbo dienos", + "Non-working days": "Ne darbo dienos", + "No non-working days yet.": "Ne darbo dienų dar nėra.", + "Add day": "Pridėti dieną", + "Year": "Metai", + "Add Dutch national holidays": "Pridėti Nyderlandų valstybines šventes", + "Save working days": "Išsaugoti darbo dienas", + "Choose at least one working weekday.": "Pasirinkite bent vieną darbo dieną.", + "Working days saved.": "Darbo dienos išsaugotos.", + "Could not save the working days.": "Nepavyko išsaugoti darbo dienų.", + "New Year's Day": "Naujieji metai", + "Easter Sunday": "Velykos", + "Easter Monday": "Antroji Velykų diena", + "King's Day": "Karaliaus diena", + "Liberation Day": "Išlaisvinimo diena", + "Ascension Day": "Žengimas į dangų", + "Whit Sunday": "Sekminės", + "Whit Monday": "Antroji Sekminių diena", + "Christmas Day": "Kalėdos", + "Boxing Day": "Antroji Kalėdų diena", + "Dates of {title}": "{title} datos", + "The due date cannot be before the start date.": "Terminas negali būti anksčiau už pradžios datą.", + "{title}, from {start} to {end}": "{title}, nuo {start} iki {end}", + "The dates could not be saved.": "Nepavyko išsaugoti datų.", + "{title} now runs from {start} to {end}": "{title} dabar vyksta nuo {start} iki {end}", + "Auto-scheduling": "Automatinis planavimas", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kai įjungta, termino nukėlimas vėliau laiko juostoje pasiūlo nukelti ir jo blokuojamas užduotis.", + "Move blocked tasks along when a task slips": "Nukelti blokuojamas užduotis, kai užduotis vėluoja", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Laiko juostoje vėlesnis terminas pasiūlo nukelti blokuojamas užduotis. Skaičiuojamos tik \"blokuoja\" sąsajos, o užduotys nukeliamos tik vėliau.", + "Move the tasks that wait for {title}?": "Nukelti užduotis, kurios laukia {title}?", + "These tasks wait for it and would start after its new due date:": "Šios užduotys jos laukia ir prasidėtų po naujo termino:", + "{count} tasks would move; the first {limit} are listed.": "Būtų nukelta užduočių: {count}; rodomos pirmosios {limit}.", + "Now": "Dabar", + "After the move": "Po nukėlimo", + "Only this task": "Tik ši užduotis", + "Move all": "Nukelti visas", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Sustota ties {title}: nepavyko išsaugoti datų. Ankstesnės užduotys nukeltos.", + "Cumulative flow": "Kaupiamasis srautas", + "Show as chart": "Rodyti kaip diagramą", + "Show as table": "Rodyti kaip lentelę", + "Tasks per column per day": "Užduotys stulpelyje per dieną", + "Tasks without recorded history in this period: {count}": "Užduotys be įrašytos istorijos šiuo laikotarpiu: {count}", + "Lead and cycle time": "Įvykdymo laikas ir ciklo laikas", + "No tasks were finished in this period.": "Šiuo laikotarpiu neužbaigta nė viena užduotis.", + "Finished tasks": "Užbaigtos užduotys", + "Cycle time, average": "Ciklo laikas, vidurkis", + "Cycle time, 85th percentile": "Ciklo laikas, 85-asis procentilis", + "Lead time, average": "Įvykdymo laikas, vidurkis", + "Tasks whose finish time was estimated from their history: {count}": "Užduotys, kurių pabaigos laikas įvertintas iš istorijos: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Kiekvienos užbaigtos užduoties ciklo laikas su vidurkiu ir 85-uoju procentiliu", + "Slowest tasks": "Lėčiausios užduotys", + "cycle {cycle}, lead {lead}": "ciklas {cycle}, įvykdymas {lead}", + "{days} days": "{days} d.", + "Could not load the flow of this project.": "Nepavyko įkelti šio projekto srauto.", + "Last {days} days": "Paskutinės {days} d.", + "Portfolio flow": "Portfelio srautas", + "An admin adds portfolios under Projects, Portfolios.": "Administratorius prideda portfelius skiltyje Projektai, Portfeliai.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Nerodomi projektai, nes vienu metu rodoma ne daugiau kaip 50: {count}", + "Could not load the flow of this portfolio.": "Nepavyko įkelti šio portfelio srauto.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kaupiamasis srautas ir ciklo laikas portfelio projektuose.", + "Edit report": "Redaguoti ataskaitą", + "Only tasks where": "Tik užduotys, kuriose", + "Group by": "Grupuoti pagal", + "Display": "Rodinys", + "Share with everyone who can read its projects": "Bendrinti su visais, kurie gali skaityti jos projektus", + "The report could not be saved.": "Nepavyko įrašyti ataskaitos.", + "Number of tasks": "Užduočių skaičius", + "Bar": "Stulpeliai", + "Donut": "Žiedas", + "Table": "Lentelė", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} iš {total} šios ataskaitos projektų jums nematomi", + "No tasks match this report.": "Šiai ataskaitai neatitinka nė viena užduotis.", + "None": "Nėra", + "Could not load this report.": "Nepavyko įkelti šios ataskaitos.", + "Report": "Ataskaita", + "Your reports": "Jūsų ataskaitos", + "My reports": "Mano ataskaitos", + "Shared reports": "Bendrinamos ataskaitos", + "You have not built a report yet.": "Dar nesukūrėte jokios ataskaitos.", + "Nobody has shared a report with you yet.": "Su jumis dar niekas nebendrino ataskaitos.", + "Reports you built over tasks, and the ones shared with you.": "Ataskaitos, kurias sukūrėte pagal užduotis, ir tos, kurias su jumis bendrino.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Įrašyta užklausa apie užduotis: kurie projektai, kurie filtrai, grupuota pagal ką, suskaičiuota ar susumuota, ir rodoma kaip lentelė ar diagrama.", + "The name the report is listed under": "Pavadinimas, kuriuo ataskaita rodoma sąraše", + "What the report shows and who it is for": "Ką ataskaita rodo ir kam ji skirta", + "Nextcloud user id of the person who saved the report": "Ataskaitą įrašiusio asmens Nextcloud naudotojo ID", + "Who can open the report": "Kas gali atidaryti ataskaitą", + "Only me": "Tik aš", + "Everyone who can read its projects": "Visi, kurie gali skaityti jos projektus", + "The projects the report covers, at most fifty": "Projektai, kuriuos apima ataskaita, ne daugiau kaip penkiasdešimt", + "Filters": "Filtrai", + "Task fields and the value each must equal": "Užduoties laukai ir reikšmė, kuriai kiekvienas turi būti lygus", + "The task field the report groups on": "Užduoties laukas, pagal kurį ataskaita grupuoja", + "Count the tasks, or add up a number on them": "Suskaičiuoti užduotis arba susumuoti jų skaičių", + "Sum": "Suma", + "Sum of": "Suma pagal", + "The number added up when the measure is a sum": "Skaičius, sumuojamas, kai matas yra suma", + "Story points": "Istorijos taškai", + "Estimated duration": "Numatoma trukmė", + "How the report is shown": "Kaip ataskaita rodoma", + "Issue type": "Užklausos tipas", + "Task fields and the value each must equal; empty when the report covers every task": "Užduoties laukai ir reikšmė, kurią kiekvienas turi turėti; tuščia, kai ataskaita apima visas užduotis", + "The status a task must have": "Būsena, kurią turi turėti užduotis", + "The priority a task must have": "Prioritetas, kurį turi turėti užduotis", + "The user a task must be assigned to": "Naudotojas, kuriam turi būti priskirta užduotis", + "A label a task must carry": "Žyma, kurią turi turėti užduotis", + "The board column a task must be in": "Lentos stulpelis, kuriame turi būti užduotis", + "The issue type a task must have": "Užklausos tipas, kurį turi turėti užduotis", + "Manager groups": "Vadovų grupės", + "Member groups": "Narių grupės", + "Viewer groups": "Skaitytojų grupės", + "Viewers": "Skaitytojai", + "Owning group": "Savininkų grupė", + "Nextcloud groups whose members manage the project": "Nextcloud grupės, kurių nariai valdo projektą", + "Nextcloud groups whose members work on the project": "Nextcloud grupės, kurių nariai dirba projekte", + "Nextcloud groups whose members may read the project": "Nextcloud grupės, kurių nariai gali skaityti projektą", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud naudotojai, valdantys projektą: nustatymus, narius ir darbą", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud naudotojai, galintys skaityti projektą ir jo darbą, bet ne keisti", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud grupė, kuriai projektas priklauso kartu su jo kūrėju, ne daugiau kaip viena", + "Nextcloud user ids who may read this through the project": "Nextcloud naudotojai, galintys tai skaityti per projektą", + "Nextcloud groups whose members may change this through the project": "Nextcloud grupės, kurių nariai gali tai keisti per projektą", + "Nextcloud groups whose members may read this through the project": "Nextcloud grupės, kurių nariai gali tai skaityti per projektą", + "Search for a person or a group…": "Ieškoti asmens ar grupės…", + "No one found. Your admin's sharing settings decide who you can find.": "Nieko nerasta. Jūsų administratoriaus bendrinimo nustatymai lemia, ką galite rasti.", + "Type at least two characters": "Įveskite bent du simbolius", + "Everyone in this group": "Visi šioje grupėje", + "Could not search for people. Please try again.": "Nepavyko ieškoti žmonių. Bandykite dar kartą.", + "Could not remove the group": "Nepavyko pašalinti grupės", + "Only the owner and managers change who is on this project.": "Tik savininkas ir valdytojai keičia, kas yra šiame projekte.", + "Role of {name}": "{name} vaidmuo", + "Manager": "Valdytojas", + "Member": "Narys", + "Viewer": "Skaitytojas", + "Could not change the role": "Nepavyko pakeisti vaidmens", + "Owned by group: {name}": "Priklauso grupei: {name}", + "No group owns this project.": "Šis projektas nepriklauso jokiai grupei.", + "Owned by group": "Priklauso grupei", + "Search for a group…": "Ieškoti grupės…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Grupė nerasta. Jūsų administratoriaus bendrinimo nustatymai lemia, kokias grupes galite rasti.", + "No owning group": "Nėra savininkės grupės", + "Could not search for groups. Please try again.": "Nepavyko ieškoti grupių. Bandykite dar kartą.", + "Could not change the owning group": "Nepavyko pakeisti savininkės grupės", + "You can read this project. Only its members change it.": "Galite skaityti šį projektą. Jį keičia tik jo nariai.", + "Course": "Kursas", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursas, kurio mokoma per šią pamoką, pavyzdžiui, pasirenkamasis dalykas, kai mokyklos mokymosi programėlė jį žino.", + "Online meeting link": "Nuotolinės pamokos nuoroda", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kur mokiniai prisijungia prie šios pamokos nuotoliu. Mygtukas Prisijungti rodomas tik su https nuoroda." }, "plurals": null } diff --git a/l10n/lv.js b/l10n/lv.js index e8f39cf0..2da307bd 100644 --- a/l10n/lv.js +++ b/l10n/lv.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktīvie projekti", + "Archived projects": "Arhivētie projekti", + "Boards": "Tāfeles", + "My projects": "Mani projekti", + "Portfolio": "Portfelis", + "Project board": "Projekta tāfele", + "Projects I am in": "Projekti, kuros piedalos", + "Timeline": "Laika josla", + "Timesheet": "Darba laika uzskaite", + "Features & roadmap": "Funkcijas un ceļvedis", + "Flow": "Plūsma", + "Flows": "Plūsmas", + "Reports": "Pārskati", + "Pick a report to open it.": "Izvēlieties pārskatu, lai to atvērtu.", + "In progress": "Notiek", + "Date": "Datums", + "Due": "Termiņš", + "Assignee": "Piešķirts", + "Who": "Kurš", + "What": "Kas", + "Minutes": "Minūtes", + "Entries": "Ieraksti", + "Most recent": "Jaunākie", + "Per person": "Uz personu", + "By status": "Pēc statusa", + "By priority": "Pēc prioritātes", + "Task status": "Uzdevumu statuss", + "Time spent": "Patērētais laiks", + "Capacity": "Kapacitāte", + "Due soonest": "Tuvākais termiņš", + "Minutes logged": "Reģistrētās minūtes", + "Nothing is due": "Nekas nav jāpabeidz", + "Nothing logged yet": "Vēl nekas nav reģistrēts", + "What is open, what is blocked, and what is overdue.": "Kas ir atvērts, kas bloķēts un kas nokavēts.", + "How allocation is spread across the people working on projects.": "Kā slodze sadalās starp cilvēkiem, kas strādā pie projektiem.", + "Hours logged, and the projects they went to.": "Reģistrētās stundas un projekti, kuriem tās veltītas.", + "Billable": "Apmaksājams", + "Budget: {amount}": "Budžets: {amount}", + "Loading projects": "Ielādē projektus", + "No projects for this client yet": "Šim klientam vēl nav projektu", + "Open in Planninq": "Atvērt Planninq", + "This project could not be found": "Šis projekts netika atrasts", + "Untitled project": "Projekts bez nosaukuma", + "and {count} more": "un vēl {count}", + "Store": "Veikals", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instalējiet reģistrus, shēmas un plūsmas, ko publicējušas citas organizācijas.", + "Work Date": "Darba datums", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Kolonnas darbības", + "Columns": "Kolonnas", + "Could not remove the column. Please try again.": "Kolonnu neizdevās noņemt. Mēģiniet vēlreiz.", + "Could not save the column. Please try again.": "Kolonnu neizdevās saglabāt. Mēģiniet vēlreiz.", + "Done column": "Pabeigto kolonna", + "Edit column": "Rediģēt kolonnu", + "Keep the card's status": "Saglabāt kartītes statusu", + "Move its cards to": "Pārvietot tās kartītes uz", + "Move left": "Pārvietot pa kreisi", + "Move right": "Pārvietot pa labi", + "Status of cards moved here": "Šeit pārvietoto kartīšu statuss", + "The last done column cannot be removed.": "Pēdējo pabeigto kolonnu nevar noņemt.", + "WIP limit": "WIP ierobežojums", + "over limit": "virs ierobežojuma", + "The status a card gets when it is moved into this column.": "Statuss, ko kartīte saņem, kad tā tiek pārvietota uz šo kolonnu.", + "All priorities": "Visas prioritātes", + "Could not create the task. Please try again.": "Uzdevumu neizdevās izveidot. Mēģiniet vēlreiz.", + "Created": "Izveidots", + "Move to backlog": "Uz uzkrājumu", + "Move to board": "Uz dēli", + "New task": "Jauns uzdevums", + "Nothing in the backlog": "Uzkrājumā nekā nav", + "Rank": "Rangs", + "Sort by": "Kārtot pēc", + "Sort by rank to reorder": "Kārtojiet pēc ranga, lai mainītu secību", + "Task actions": "Uzdevuma darbības", + "All labels": "Visas birkas", + "Filter tasks by label": "Filtrēt uzdevumus pēc birkas", + "View timeline": "Skatīt laika skalu", + "Board": "Dēlis", + "List": "Saraksts", + "Column": "Kolonna", + "Board or list": "Dēlis vai saraksts", + "Log": "Žurnāls", + "Add entry": "Pievienot ierakstu", + "Show": "Rādīt", + "No actions yet": "Vēl nav darbību", + "Closed": "Slēgts", + "Entry actions": "Ieraksta darbības", + "Add action": "Pievienot darbību", + "by {author}": "autors {author}", + "saved {time}": "saglabāts {time}", + "Attendees: {names}": "Dalībnieki: {names}", + "Add the first entry": "Pievienot pirmo ierakstu", + "Issues": "Problēmas", + "Lessons learned": "Gūtās atziņas", + "Meetings": "Sanāksmes", + "Decisions": "Lēmumi", + "Actions": "Darbības", + "Issue": "Problēma", + "Lesson learned": "Gūtā atziņa", + "Meeting": "Sanāksme", + "Decision": "Lēmums", + "About this project": "Par šo projektu", + "No description yet": "Vēl nav apraksta", + "Start date": "Sākuma datums", + "Not set": "Nav iestatīts", + "End date": "Beigu datums", + "Progress": "Progress", + "No tasks yet": "Vēl nav uzdevumu", + "Open the board": "Atvērt dēli", + "People": "Cilvēki", + "Owner": "Īpašnieks", + "Latest log entries": "Jaunākie ieraksti", + "Open the log": "Atvērt žurnālu", + "{done} of {total} tasks done": "Izpildīti {done} no {total} uzdevumiem", + "Edit entry": "Rediģēt ierakstu", + "Type": "Veids", + "Attendees": "Dalībnieki", + "Issue is closed": "Problēma ir slēgta", + "Could not save the entry. Please try again.": "Ierakstu neizdevās saglabāt. Mēģiniet vēlreiz.", + "From: {title}": "No: {title}", + "What needs to happen": "Kas jāizdara", + "Could not create the action. Please try again.": "Darbību neizdevās izveidot. Mēģiniet vēlreiz.", + "The action was created but could not be linked to the entry.": "Darbība tika izveidota, bet to neizdevās sasaistīt ar ierakstu.", + "Project pages": "Projekta lapas", + "Overview": "Pārskats", + "Risks": "Riski", + "Log entry": "Žurnāla ieraksts", + "A short name for the entry": "Īss ieraksta nosaukums", + "Project": "Projekts", + "The project this entry belongs to": "Projekts, kuram pieder šis ieraksts", + "What kind of entry this is": "Kāda veida ieraksts tas ir", + "When it happened": "Kad tas notika", + "What happened, in Markdown": "Kas notika, Markdown formātā", + "Whether an issue is still open": "Vai problēma joprojām ir atvērta", + "The people at a meeting": "Cilvēki sanāksmē", + "Tasks that came out of this entry": "Uzdevumi, kas radušies no šī ieraksta", + "Add risk": "Pievienot risku", + "Risk": "Risks", + "Score": "Punkti", + "Response": "Rīcība", + "Review date": "Pārskatīšanas datums", + "no longer on the project": "vairs nav projektā", + "Edit {title}": "Rediģēt {title}", + "No risks recorded yet": "Vēl nav reģistrētu risku", + "Add the first risk": "Pievienot pirmo risku", + "Medium": "Vidējs", + "Mitigating": "Tiek mazināts", + "Occurred": "Iestājies", + "Avoid": "Izvairīties", + "Reduce": "Samazināt", + "Transfer": "Nodot", + "Accept": "Pieņemt", + "Highest open risks": "Augstākie atvērtie riski", + "No open risks": "Nav atvērtu risku", + "Open the risk register": "Atvērt risku reģistru", + "Edit risk": "Rediģēt risku", + "What could go wrong": "Kas var noiet greizi", + "Likelihood": "Varbūtība", + "Impact": "Ietekme", + "Score {score}": "Punkti {score}", + "Countermeasures": "Pretpasākumi", + "Could not save the risk. Please try again.": "Risku neizdevās saglabāt. Mēģiniet vēlreiz.", + "Risks by likelihood and impact": "Riski pēc varbūtības un ietekmes", + "Risk scale": "Risku skala", + "The levels every project scores its risks on, and where low turns into medium and high": "Līmeņi, kuros katrs projekts vērtē savus riskus, un kur zems pāriet vidējā un augstā", + "Number of levels": "Līmeņu skaits", + "Likelihood labels": "Varbūtības nosaukumi", + "Impact labels": "Ietekmes nosaukumi", + "Level {level}": "Līmenis {level}", + "Medium from score": "Vidējs no punktiem", + "High from score": "Augsts no punktiem", + "Risk scale saved": "Risku skala saglabāta", + "1 risk uses level {level}. Change it first.": "1 risks izmanto līmeni {level}. Vispirms to mainiet.", + "{count} risks use level {level}. Change them first.": "{count} riski izmanto līmeni {level}. Vispirms tos mainiet.", + "Every level needs a label, and high must start above medium.": "Katram līmenim vajag nosaukumu, un augstam jāsākas virs vidējā.", + "The project this risk belongs to": "Projekts, kuram pieder šis risks", + "The cause and the effect, in Markdown": "Cēlonis un sekas, Markdown formātā", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Brīvs grupējums, piemēram, plānošana, budžets vai piegādātājs", + "How likely it is, on the admin's risk scale": "Cik tas ir varbūtīgs, administratora risku skalā", + "How hard it would hit, on the admin's risk scale": "Cik smagi tas skartu, administratora risku skalā", + "Likelihood times impact, calculated by the server": "Varbūtība reiz ietekme, aprēķina serveris", + "Where the risk stands": "Kur risks atrodas", + "The person who watches this risk": "Persona, kas uzrauga šo risku", + "How the project answers the risk": "Kā projekts reaģē uz risku", + "What is done to prevent it or soften it, in Markdown": "Kas tiek darīts, lai to novērstu vai mazinātu, Markdown formātā", + "When to look at this risk again": "Kad risku pārskatīt atkal", + "Very low": "Ļoti zems", + "Very high": "Ļoti augsts", + "All projects": "Visi projekti", + "Project status report": "Projekta statusa ziņojums", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datēts ziņojums par to, kā projektam veicas ar naudu, organizāciju, laiku, informāciju, kvalitāti un risku (GROTIK aspekti), katrs ar piezīmi.", + "The project this report is about": "Projekts, par kuru ir ziņojums", + "Report date": "Ziņojuma datums", + "The day the report describes": "Diena, ko ziņojums apraksta", + "Money": "Nauda", + "How the project stands on this aspect": "Kā projektam veicas šajā aspektā", + "On track": "Pēc plāna", + "At risk": "Apdraudēts", + "Off track": "Ārpus plāna", + "Money note": "Piezīme par naudu", + "A short explanation of this status": "Īss šī statusa skaidrojums", + "Organisation": "Organizācija", + "Organisation note": "Piezīme par organizāciju", + "Time": "Laiks", + "Time note": "Piezīme par laiku", + "Information": "Informācija", + "Information note": "Piezīme par informāciju", + "Quality": "Kvalitāte", + "Quality note": "Piezīme par kvalitāti", + "Risk note": "Piezīme par risku", + "Overall": "Kopā", + "The worst of the six statuses, calculated by the server": "Sliktākais no sešiem statusiem, aprēķina serveris", + "Health: money": "Stāvoklis: nauda", + "Copied from the newest status report": "Pārņemts no jaunākā statusa ziņojuma", + "Health: organisation": "Stāvoklis: organizācija", + "Health: time": "Stāvoklis: laiks", + "Health: information": "Stāvoklis: informācija", + "Health: quality": "Stāvoklis: kvalitāte", + "Health: risk": "Stāvoklis: risks", + "Health: overall": "Stāvoklis: kopā", + "Health: report date": "Stāvoklis: ziņojuma datums", + "The date of the newest status report": "Jaunākā statusa ziņojuma datums", + "New report": "Jauns ziņojums", + "Only the project owner writes status reports.": "Statusa ziņojumus raksta tikai projekta īpašnieks.", + "Latest report, {date}": "Pēdējais ziņojums, {date}", + "Aspect": "Aspekts", + "Note": "Piezīme", + "Report history": "Ziņojumu vēsture", + "Author": "Autors", + "No status reports yet": "Vēl nav statusa ziņojumu", + "Write the first report": "Uzrakstīt pirmo ziņojumu", + "Choose a status for every aspect to save the report.": "Lai saglabātu ziņojumu, izvēlieties statusu katram aspektam.", + "Suggested: on track.": "Ieteikums: pēc plāna.", + "Suggested: at risk.": "Ieteikums: apdraudēts.", + "Suggested: off track.": "Ieteikums: ārpus plāna.", + "1 task is past its due date.": "1 uzdevumam ir nokavēts termiņš.", + "{count} tasks are past their due date.": "Uzdevumi ar nokavētu termiņu: {count}.", + "The end date has passed with 1 open task.": "Beigu datums ir pagājis, un 1 uzdevums ir atvērts.", + "The end date has passed with {count} open tasks.": "Beigu datums ir pagājis, atvērti uzdevumi: {count}.", + "No open task is past its due date.": "Nevienam atvērtam uzdevumam nav nokavēts termiņš.", + "The highest open risk, \"{title}\", scores {score}.": "Lielākais atvērtais risks, \"{title}\", ir novērtēts ar {score}.", + "There are no open risks.": "Nav atvērtu risku.", + "Costs are at {percent}% of the budget.": "Izmaksas ir {percent}% no budžeta.", + "No suggestion: the project has no budget.": "Nav ieteikuma: projektam nav budžeta.", + "No suggestion: no costs are recorded for this project yet.": "Nav ieteikuma: šim projektam vēl nav reģistrētu izmaksu.", + "The report was not saved. Only the project owner can write status reports.": "Ziņojums netika saglabāts. Statusa ziņojumus var rakstīt tikai projekta īpašnieks.", + "No report": "Nav ziņojuma", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Projektu grupa, ko vada tie paši cilvēki, piemēram, nodaļa vai programma. Tās vadītāji lasa katru tajā esošo projektu.", + "The name of the portfolio": "Portfeļa nosaukums", + "What the portfolio holds and who runs it": "Ko portfelis ietver un kas to vada", + "A colour for the portfolio's section in project lists": "Krāsa portfeļa sadaļai projektu sarakstos", + "Managers": "Vadītāji", + "Nextcloud user UIDs of the people who run the portfolio": "To cilvēku Nextcloud lietotāju ID, kuri vada portfeli", + "Order": "Secība", + "Where the portfolio comes in project lists, lowest first": "Portfeļa vieta projektu sarakstos, mazākais vispirms", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Šī portfeļa paša riska skala JSON formātā, tādā pašā formā kā visas lietotnes skala. Tukšs nozīmē lietotnes skalu.", + "Portfolio readers": "Portfeļa lasītāji", + "Nextcloud user UIDs of the managers of the project's portfolio": "Projekta portfeļa vadītāju Nextcloud lietotāju ID", + "The portfolio this project belongs to": "Portfelis, kuram pieder šis projekts", + "No portfolio": "Nav portfeļa", + "All portfolios": "Visi portfeļi", + "You read this project as a manager of its portfolio. Only its members change it.": "Jūs lasāt šo projektu kā tā portfeļa vadītājs. To maina tikai tā dalībnieki.", + "Portfolios": "Portfeļi", + "Portfolio status": "Portfeļa stāvoklis", + "No portfolios yet": "Vēl nav portfeļu", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administrators pievieno portfeļus sadaļā Projekti, Portfeļi. Portfeļa projekti ir uzskaitīti šeit ar to stāvokli.", + "Roll-up": "Kopsavilkums", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} pēc plāna, {atRisk} riskā, {offTrack} ārpus plāna, {noReport} bez atskaites", + "No project in this portfolio that you can read.": "Šajā portfelī nav projekta, ko varat lasīt.", + "Start": "Sākums", + "End": "Beigas", + "Budget": "Budžets", + "Last report": "Pēdējā atskaite", + "Out of date": "Novecojusi", + "Portfolio timeline": "Portfeļa laika josla", + "Zoom": "Tālummaiņa", + "Could not load the timeline": "Laika joslu neizdevās ielādēt", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administrators pievieno portfeļus sadaļā Projekti, Portfeļi. Portfeļa projekti šeit ir vienā laika joslā.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Atveriet projektu, lai redzētu tā posmus un uzdevumus. Laika josla ir tikai lasāma.", + "Phase: {title}": "Posms: {title}", + "Left out because you cannot read them: {count} projects": "Izlaisti, jo jūs tos nevarat lasīt: {count} projekti", + "Week": "Nedēļa", + "Day": "Diena", + "Month": "Mēnesis", + "Please try again later.": "Lūdzu, mēģiniet vēlāk vēlreiz.", + "Status reports": "Stāvokļa atskaites", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Pēc cik dienām projekta pēdējā stāvokļa atskaite portfeļa pārskatā tiek atzīmēta kā novecojusi", + "Reporting period (days)": "Atskaišu periods (dienas)", + "The reporting period is a whole number of days from 1 to 365.": "Atskaišu periods ir vesels dienu skaits no 1 līdz 365.", + "Reporting period saved": "Atskaišu periods saglabāts", + "The reporting period was not saved. Please try again.": "Atskaišu periods netika saglabāts. Mēģiniet vēlreiz.", + "Every project of a portfolio with its status per aspect, rolled up.": "Katrs portfeļa projekts ar stāvokli pa aspektiem, kopsavilkumā.", + "The projects of a portfolio on one timeline.": "Portfeļa projekti vienā laika joslā.", + "Phases": "Posmi", + "Add phase": "Pievienot posmu", + "No phases yet": "Vēl nav posmu", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Sadaliet projektu posmos, piemēram, uzsākšana, definēšana un īstenošana. Posms tiek slēgts, kad ir augšupielādēts tā noslēguma dokuments.", + "{hours} hours": "{hours} stundas", + "Concluding document: {title}": "Noslēguma dokuments: {title}", + "Concluding document missing": "Trūkst noslēguma dokumenta", + "Move {title} up": "Pārvietot {title} uz augšu", + "Move {title} down": "Pārvietot {title} uz leju", + "Close phase": "Slēgt posmu", + "Phase": "Posms", + "Files": "Faili", + "Notes": "Piezīmes", + "Audit trail": "Audita pieraksts", + "Edit phase": "Rediģēt posmu", + "Name": "Nosaukums", + "Budget hours": "Budžeta stundas", + "Could not save the phase. Please try again.": "Posmu neizdevās saglabāt. Mēģiniet vēlreiz.", + "Close phase {title}": "Slēgt posmu {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Posms tiek slēgts ar noslēguma dokumentu: augšupielādējiet to šeit vai izvēlieties kādu no posma failiem.", + "Concluding document": "Noslēguma dokuments", + "This phase has no files yet.": "Šim posmam vēl nav failu.", + "Upload a document": "Augšupielādēt dokumentu", + "The document was not uploaded. Please try again.": "Dokuments netika augšupielādēts. Mēģiniet vēlreiz.", + "Upload the concluding document before you close this phase.": "Augšupielādējiet noslēguma dokumentu pirms šī posma slēgšanas.", + "This phase cannot be closed from its current status.": "Šo posmu nevar slēgt no tā pašreizējā statusa.", + "The phase was not closed. Please try again.": "Posms netika slēgts. Mēģiniet vēlreiz.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Šī posma faila ID, kas to noslēdz. Posmu var pabeigt tikai tad, kad tas ir norādīts un fails pievienots.", + "Import from Microsoft Project": "Importēt no Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Izvēlieties plānu, kas saglabāts no Microsoft Project XML formātā. Nekas netiek importēts, kamēr neapstiprināt.", + "Plan file": "Plāna fails", + "What the import creates": "Ko imports izveido", + "Tasks": "Uzdevumi", + "Sub-tasks": "Apakšuzdevumi", + "Milestones": "Atskaites punkti", + "Links": "Saites", + "Already imported, updated in place: {count}": "Jau importēti, atjaunināti vietā: {count}", + "What does not carry over": "Kas netiek pārnests", + "Tasks with resources, which are not imported: {count}": "Uzdevumi ar resursiem, kas netiek importēti: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Uzdevumi dziļāk par 3. līmeni, novietoti zem sava 2. līmeņa uzdevuma: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Saites, kas nav beigas-sākums, importētas kā saistītas saites: {count}", + "Link lags, which are dropped: {count}": "Saišu nobīdes, kas tiek atmestas: {count}", + "Links to a summary task, which are not imported: {count}": "Saites uz kopsavilkuma uzdevumu, kas netiek importētas: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Saites uz uzdevumiem ārpus šī plāna, kas netiek importētas: {count}", + "No longer in the plan": "Vairs nav plānā", + "These stay in the project; remove them yourself if they are no longer needed.": "Tie paliek projektā; noņemiet tos paši, ja tie vairs nav vajadzīgi.", + "Import": "Importēt", + "Close": "Aizvērt", + "The plan is imported: {created} created, {updated} updated.": "Plāns ir importēts: {created} izveidoti, {updated} atjaunināti.", + "Links that would close a loop were left out: {count}": "Saites, kas noslēgtu ciklu, tika izlaistas: {count}", + "The import stopped part-way. Run it again to finish it.": "Imports apstājās pusceļā. Palaidiet to vēlreiz, lai to pabeigtu.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Saglabājiet plānu Microsoft Project, izvēloties Fails, Saglabāt kā, XML formāts, un importējiet šo failu.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Šis fails deklarē DOCTYPE vai entītijas, kas netiek pieņemtas.", + "The file is larger than 10 MB.": "Fails ir lielāks par 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plānā ir vairāk nekā 2000 uzdevumu, vairāk nekā viens imports pieņem.", + "This file is not a Microsoft Project plan in XML format.": "Šis fails nav Microsoft Project plāns XML formātā.", + "Choose a file to import.": "Izvēlieties failu importēšanai.", + "Only the project owner can import a plan.": "Tikai projekta īpašnieks var importēt plānu.", + "The plan could not be read. Please try again.": "Plānu neizdevās nolasīt. Lūdzu, mēģiniet vēlreiz.", + "Linked case: {title}": "Saistītā lieta: {title}", + "Linked to a case": "Saistīts ar lietu", + "Hand over to case": "Nodot lietai", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Nemainītu kopē katru projekta un tā uzdevumu failu, kā arī failu, kas apraksta projektu, uz saistīto lietu.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Nokopēti faili: {count}", + "Files that failed: {names}": "Neizdevušies faili: {names}", + "The handover failed. Please try again.": "Nodošana neizdevās. Lūdzu, mēģiniet vēlreiz.", + "The linked case could not be found, or you cannot open it.": "Saistītā lieta netika atrasta, vai jūs to nevarat atvērt.", + "Case handovers": "Nodošanas lietai", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Katra reize, kad projekta faili un metadati tika nodoti lietai: kad, kas, kurai lietai, katrs nokopētais fails ar tā SHA-256 un neizdevušies faili.", + "Finance": "Finanses", + "Add cost line": "Pievienot izmaksu rindu", + "Delivery terms": "Piegādes nosacījumi", + "Billing model": "Norēķinu modelis", + "Budget in euro": "Budžets eiro", + "Budget in hours": "Budžets stundās", + "Hourly rate in euro": "Stundas likme eiro", + "Planned start": "Plānotais sākums", + "Planned end": "Plānotās beigas", + "Planned dates": "Plānotie datumi", + "Budget {amount}": "Budžets {amount}", + "No budget agreed": "Budžets nav saskaņots", + "Hours": "Stundas", + "Only the project owner and the portfolio managers see the amounts.": "Summas redz tikai projekta īpašnieks un portfeļa vadītāji.", + "Budget against cost per category": "Budžets pret izmaksām pa kategorijām", + "Labour (booked time)": "Darbs (reģistrētais laiks)", + "No category": "Bez kategorijas", + "Hours are not available": "Stundas nav pieejamas", + "Not yet assigned to a category": "Vēl nav piešķirts kategorijai", + "Total": "Kopā", + "{spent} spent, {remaining} remaining": "{spent} iztērēti, {remaining} atlikuši", + "Budget against cost per phase": "Budžets pret izmaksām pa posmiem", + "No phase": "Bez posma", + "Cost lines": "Izmaksu rindas", + "From the finance system": "No finanšu sistēmas", + "Edit cost line {amount}": "Rediģēt izmaksu rindu {amount}", + "No cost lines yet": "Vēl nav izmaksu rindu", + "Commitments": "Saistības", + "Actual cost": "Faktiskās izmaksas", + "Forecast": "Prognoze", + "Remaining": "Atlikums", + "Not planned yet": "Vēl nav plānots", + "{start} to {end}": "No {start} līdz {end}", + "The terms were not saved. Please try again.": "Nosacījumi netika saglabāti. Mēģiniet vēlreiz.", + "Terms saved": "Nosacījumi saglabāti", + "Fixed price": "Fiksēta cena", + "Hourly": "Pa stundām", + "Not billed": "Netiek rēķināts", + "Commitment": "Saistība", + "Edit cost line": "Rediģēt izmaksu rindu", + "Kind": "Veids", + "Amount in euro": "Summa eiro", + "Remove": "Noņemt", + "Could not save the cost line. Only the project owner changes the money of a project.": "Izmaksu rindu nevarēja saglabāt. Projekta naudu maina tikai projekta īpašnieks.", + "Could not remove the cost line. Please try again.": "Izmaksu rindu nevarēja noņemt. Mēģiniet vēlreiz.", + "{amount} over budget": "{amount} virs budžeta", + "Cost categories": "Izmaksu kategorijas", + "The categories every project splits its budget and costs into, one per line": "Kategorijas, kurās katrs projekts sadala savu budžetu un izmaksas, viena katrā rindā", + "Categories": "Kategorijas", + "Give at least one category, each name once.": "Norādiet vismaz vienu kategoriju, katru nosaukumu vienreiz.", + "Cost categories saved": "Izmaksu kategorijas saglabātas", + "The cost categories were not saved. Please try again.": "Izmaksu kategorijas netika saglabātas. Mēģiniet vēlreiz.", + "Finance line": "Finanšu rinda", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Viena projekta naudas summa: budžets, saistības, faktiskās izmaksas vai prognoze, izmaksu kategorijā un pēc izvēles posmā. To ievada projekta īpašnieks vai nosūta finanšu sistēma, izmantojot integrācijas lietotni.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekts, kuram pieder summa. Tukšs finanšu sistēmas rindai, kuras projekta numurs neatbilst nevienam projektam.", + "The phase this amount belongs to, if any": "Posms, kuram pieder summa, ja tāds ir", + "The cost category, one of the categories the admin set up": "Izmaksu kategorija, viena no administratora iestatītajām kategorijām", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Vai summa ir budžets, saistības, faktiskās izmaksas vai prognoze", + "Amount": "Summa", + "The amount in the reporting currency (euro)": "Summa pārskatu valūtā (eiro)", + "The date the amount was booked or is expected": "Datums, kad summa iegrāmatota vai tiek gaidīta", + "What the amount is for": "Kam paredzēta summa", + "Whether a person entered the line or the finance system sent it": "Vai rindu ievadīja cilvēks vai to nosūtīja finanšu sistēma", + "Entered by hand": "Ievadīts ar roku", + "Finance line id": "Finanšu rindas ID", + "The finance system's own id of this line. One imported line per id.": "Šīs rindas ID finanšu sistēmā. Viena importēta rinda uz ID.", + "Project number": "Projekta numurs", + "The project number the finance system sent, matched against the project key": "Finanšu sistēmas nosūtītais projekta numurs, salīdzināts ar projekta atslēgu", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Rindas projekta portfelis, pārņemts no projekta, lai portfeļa kopsummām pietiktu ar vienu filtru", + "Finance readers": "Finanšu lasītāji", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud lietotāju UID tiem, kas drīkst redzēt summu: projekta īpašnieks un tā portfeļa vadītāji", + "Project owner": "Projekta īpašnieks", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Projekta īpašnieka Nextcloud lietotāja UID; viņš drīkst mainīt un noņemt manuālās rindas", + "How the client pays: not billed, a fixed price, or by the hour.": "Kā klients maksā: netiek rēķināts, fiksēta cena vai pa stundām.", + "Portfolio finance": "Portfeļa finanses", + "You cannot see the money of any project in this portfolio": "Jūs neredzat neviena šī portfeļa projekta naudu", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serveris atgrieza izmaksu rindas no projektiem ārpus šī portfeļa, tāpēc šīs kopsummas var būt nepareizas.", + "Projects left out because you cannot see their money: {count}": "Izlaisti projekti, jo jūs neredzat to naudu: {count}", + "Unmatched finance lines": "Nesasaistītas finanšu rindas", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budžets, saistības, faktiskās izmaksas un prognoze, saskaitītas portfelim.", + "Subprojects": "Apakšprojekti", + "{done} of {total}": "{done} no {total}", + "{done} of {total} tasks done, including subprojects": "Izpildīti {done} no {total} uzdevumiem, ieskaitot apakšprojektus", + "Show the subprojects of {title}": "Rādīt {title} apakšprojektus", + "Hide the subprojects of {title}": "Slēpt {title} apakšprojektus", + "Part of": "Daļa no", + "No parent project": "Nav augstāka projekta", + "A project cannot sit under one of its own subprojects.": "Projekts nevar atrasties zem kāda no saviem apakšprojektiem.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekti ligzdojas ne dziļāk par trim līmeņiem: programma, projekts un apakšprojekts.", + "Parent project": "Augstākais projekts", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekts, zem kura atrodas šis projekts, piemēram, programma. Projekti ligzdojas ne dziļāk par trim līmeņiem.", + "Yes": "Jā", + "No": "Nē", + "{label} (required)": "{label} (obligāts)", + "{label} is required": "{label} ir obligāts", + "Project field": "Projekta lauks", + "A field an admin adds to every project, such as a policy area or a contract value.": "Lauks, ko administrators pievieno katram projektam, piemēram, politikas joma vai līguma vērtība.", + "Key": "Atslēga", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Pastāvīgais nosaukums, ar kuru vērtība tiek saglabāta, lower camel case formā. Saglabājiet to, kad projekti to izmanto.", + "Label": "Etiķete", + "The name people see next to the field": "Nosaukums, ko cilvēki redz blakus laukam", + "What the field holds": "Ko lauks satur", + "Text": "Teksts", + "Number": "Skaitlis", + "Choice": "Izvēle", + "Person": "Persona", + "Yes or no": "Jā vai nē", + "Options": "Opcijas", + "The choices of a choice field": "Izvēles lauka opcijas", + "Required": "Obligāts", + "Whether a project must fill in the field": "Vai projektam jāaizpilda lauks", + "Where the field appears, lowest first": "Kur lauks parādās, mazākais pirmais", + "Applies to": "Attiecas uz", + "What the field is added to": "Kam lauks tiek pievienots", + "Custom fields": "Savi lauki", + "The values of the project fields an admin defined, keyed by the field's key.": "Administratora definēto projekta lauku vērtības pēc lauka atslēgas.", + "Project fields": "Projekta lauki", + "Related": "Saistītie", + "Remove link": "Noņemt saiti", + "Link type": "Saites veids", + "Relates to": "Saistīts ar", + "Duplicates": "Dublē", + "Project key": "Projekta atslēga", + "Every task number starts with it, such as VERG-42.": "Ar to sākas katrs uzdevuma numurs, piemēram, VERG-42.", + "This key is already used by another project.": "Šo atslēgu jau izmanto cits projekts.", + "Use 2 to 10 letters and digits, starting with a letter.": "Izmantojiet 2 līdz 10 burtus un ciparus, sākot ar burtu.", + "The key cannot change once tasks carry it.": "Atslēgu nevar mainīt, kad uzdevumi to jau nes.", + "Project saved. The existing tasks get their numbers in the background.": "Projekts saglabāts. Esošie uzdevumi saņem numurus fonā.", + "Next task number": "Nākamā uzdevuma numurs", + "The number the next task of this project gets in its key. Only the system writes it.": "Numurs, ko nākamais šī projekta uzdevums saņem savā atslēgā. To raksta tikai sistēma.", + "Restore {title}": "Atjaunot {title}", + "Restore": "Atjaunot", + "Project restored": "Projekts atjaunots", + "Could not restore the project": "Projektu neizdevās atjaunot", + "Bring this project back to the active list.": "Atgriezt šo projektu aktīvo projektu sarakstā.", + "Restore project": "Atjaunot projektu", + "Request reason": "Pieprasījuma iemesls", + "Why the requester needs this project. Filled in when the project is requested.": "Kāpēc pieprasītājam šis projekts ir vajadzīgs. Aizpilda pieprasījumā.", + "Reviewed by": "Izskatīja", + "The user who approved or rejected the request.": "Lietotājs, kas pieprasījumu apstiprināja vai noraidīja.", + "Reviewed at": "Izskatīts", + "When the request was approved or rejected.": "Kad pieprasījums tika apstiprināts vai noraidīts.", + "Review note": "Izskatītāja piezīme", + "The reviewer's reason, shown to the requester when a request is not approved.": "Izskatītāja iemesls, ko pieprasītājs redz, ja pieprasījums nav apstiprināts.", + "Members of these groups": "Šo grupu dalībnieki", + "Groups that may create projects": "Grupas, kas drīkst veidot projektus", + "The group {group} no longer exists. Save to remove it.": "Grupa {group} vairs nepastāv. Saglabājiet, lai to noņemtu.", + "Review project request": "Izskatīt projekta pieprasījumu", + "Requested by": "Pieprasīja", + "Why it is needed": "Kāpēc tas vajadzīgs", + "Desired start date": "Vēlamais sākuma datums", + "Why is it not approved?": "Kāpēc tas netiek apstiprināts?", + "Give a reason. The requester sees it.": "Norādiet iemeslu. Pieprasītājs to redzēs.", + "Approve": "Apstiprināt", + "Reject": "Noraidīt", + "Reject request": "Noraidīt pieprasījumu", + "The review was not saved. Try again.": "Izskatīšana netika saglabāta. Mēģiniet vēlreiz.", + "This project is waiting for review": "Šis projekts gaida izskatīšanu", + "This request was not approved": "Šis pieprasījums netika apstiprināts", + "Reason: {note}": "Iemesls: {note}", + "Review request": "Izskatīt pieprasījumu", + "Request a project": "Pieprasīt projektu", + "Step {step} of 2": "{step}. solis no 2", + "Why is this project needed?": "Kāpēc šis projekts ir vajadzīgs?", + "Give a reason. The reviewer reads it.": "Norādiet iemeslu. Izskatītājs to izlasīs.", + "Back": "Atpakaļ", + "Next": "Tālāk", + "Send request": "Nosūtīt pieprasījumu", + "The request was not sent. Try again.": "Pieprasījums netika nosūtīts. Mēģiniet vēlreiz.", + "Requested": "Pieprasīts", + "Not approved": "Nav apstiprināts", + "Your request was sent": "Jūsu pieprasījums ir nosūtīts", + "Let everyone else request a project": "Ļaut visiem pārējiem pieprasīt projektu", + "Add a task": "Pievienot uzdevumu", + "Delete task": "Dzēst uzdevumu", + "Edit task": "Rediģēt uzdevumu", + "Write": "Rakstīt", + "Preview": "Priekšskatījums", + "Markdown works here: headings, lists and links.": "Šeit darbojas Markdown: virsraksti, saraksti un saites.", + "Could not save the task. Please try again.": "Uzdevumu neizdevās saglabāt. Mēģiniet vēlreiz.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Uzdevumam \"{title}\" ir reģistrēts laiks, tāpēc to nevar dzēst. Tā vietā to var atcelt: laika ieraksti paliek.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Dzēst \"{title}\"? Tiek noņemtas arī tā saites ar citiem uzdevumiem. To nevar atsaukt.", + "Keep task": "Paturēt uzdevumu", + "Cancel task": "Atcelt uzdevumu", + "Only the reporter, the project owner or an admin can delete this task.": "Šo uzdevumu var dzēst tikai ziņotājs, projekta īpašnieks vai administrators.", + "Could not delete the task. Please try again.": "Uzdevumu neizdevās dzēst. Mēģiniet vēlreiz.", + "Could not cancel the task. Please try again.": "Uzdevumu neizdevās atcelt. Mēģiniet vēlreiz.", + "Responsible": "Atbildīgais", + "Also working on this": "Pie šī strādā arī", + "Labels": "Etiķetes", + "Could not change the priority. Please try again.": "Prioritāti neizdevās mainīt. Mēģiniet vēlreiz.", + "Other project members who work on this task alongside the person responsible.": "Citi projekta dalībnieki, kas strādā pie šī uzdevuma kopā ar atbildīgo.", + "Duplicate": "Dublēt", + "Could not copy the task. Please try again.": "Uzdevumu neizdevās kopēt. Mēģiniet vēlreiz.", + "Subtasks": "Apakšuzdevumi", + "{done} of {total} done": "Pabeigti {done} no {total}", + "Add a subtask": "Pievienot apakšuzdevumu", + "Checklist": "Kontrolsaraksts", + "Checklist item actions": "Saraksta vienuma darbības", + "Add a checklist item": "Pievienot saraksta vienumu", + "Subtasks: {estimate} estimated, {logged} logged": "Apakšuzdevumi: novērtēts {estimate}, reģistrēts {logged}", + "Total estimate: {total}": "Kopējais novērtējums: {total}", + "Part of {title}": "Daļa no {title}", + "Checklist: {count} done": "Kontrolsaraksts: pabeigti {count}", + "This task has subtasks: {count}.": "Šim uzdevumam ir apakšuzdevumi: {count}.", + "Keep subtasks as separate tasks": "Paturēt apakšuzdevumus kā atsevišķus uzdevumus", + "Delete subtasks too": "Dzēst arī apakšuzdevumus", + "Copy of {title}": "Kopija: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Uzdevums tika nokopēts, bet ne visi tā apakšuzdevumi. Pārbaudiet kopiju.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Nelieli soļi uzdevuma ietvaros. Katram vienumam ir id, teksts un vai tas ir pabeigts.", + "Open work per person and per project.": "Atvērtais darbs pa personām un projektiem.", + "View": "Skats", + "By person": "Pa personām", + "By project": "Pa projektiem", + "Hours left": "Atlikušās stundas", + "Tasks without an estimate": "Uzdevumi bez novērtējuma", + "Due in 14 days": "Termiņš 14 dienu laikā", + "Shared": "Koplietoti", + "Unassigned": "Nepiešķirti", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Rādīts darbs projektos, kurus varat redzēt. Stundas tiek skaitītas atbildīgajai personai; koplietotie uzdevumi tiek skaitīti bez stundām.", + "No open work in these projects.": "Šajos projektos nav atvērta darba.", + "Open work": "Atvērtais darbs", + "{count} open tasks": "Atvērti uzdevumi: {count}", + "Create a project to see capacity here.": "Izveidojiet projektu, lai šeit redzētu noslodzi.", + "My tasks": "Mani uzdevumi", + "Show all my tasks": "Rādīt visus manus uzdevumus", + "No tasks assigned to you": "Jums nav piešķirtu uzdevumu", + "Browse projects": "Pārlūkot projektus", + "Later": "Vēlāk", + "Due {date}": "Termiņš {date}", + "Could not change the status. Please try again.": "Statusu neizdevās mainīt. Mēģiniet vēlreiz.", + "Completed today": "Pabeigti šodien", + "My open tasks": "Mani atvērtie uzdevumi", + "My overdue tasks": "Mani nokavētie uzdevumi", + "My tasks in progress": "Mani uzdevumi procesā", + "Pin to the top": "Piespraust augšā", + "Unpin": "Atspraust", + "Pinned": "Piesprausts", + "Actions for {title}": "Darbības: {title}", + "Could not save your project order. Please try again.": "Projektu secību neizdevās saglabāt. Mēģiniet vēlreiz.", + "No boards yet": "Vēl nav dēļu", + "Create a project to get a board.": "Izveidojiet projektu, lai iegūtu dēli.", + "Use the Projects page to create and manage your projects and tasks.": "Lapā Projekti veidojiet un pārvaldiet savus projektus un uzdevumus.", + "Go to projects": "Uz projektiem", + "You are not a member of any projects yet.": "Jūs vēl neesat neviena projekta dalībnieks.", + "Could not search for users. Please try again.": "Lietotājus neizdevās meklēt. Mēģiniet vēlreiz.", + "Project creation is restricted to administrators.": "Projektus var veidot tikai administratori.", + "Only the project owner or an administrator can delete this project.": "Šo projektu var dzēst tikai projekta īpašnieks vai administrators.", + "No projects are available to you yet. Ask an administrator to create one.": "Jums vēl nav pieejamu projektu. Palūdziet administratoram tādu izveidot.", + "Due: {date}": "Termiņš: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Uzdevumi ar sākuma datumu vai termiņu redzami laika joslā. Pievienojiet datumus, lai tos redzētu šeit.", + "You do not have access to this project.": "Jums nav piekļuves šim projektam.", + "Zoom level": "Tālummaiņas līmenis", + "Unscheduled": "Neplānoti", + "Start: {date}": "Sākums: {date}", + "Today": "Šodien", + "No scheduled tasks": "Nav plānotu uzdevumu", + "An unexpected error occurred.": "Radās neparedzēta kļūda.", + "Column {number} name": "Kolonnas {number} nosaukums", + "Failed to save creation policy": "Izveides noteikumu neizdevās saglabāt", + "All authenticated users": "Visi pieteikušies lietotāji", + "Control who may create new projects": "Nosakiet, kas drīkst veidot jaunus projektus", + "Administrators only": "Tikai administratori", + "Project creation": "Projektu izveide", + "Allow project creation": "Atļaut projektu izveidi", + "Creation policy saved successfully": "Izveides noteikums saglabāts", + "Initializing…": "Notiek palaišana…", + "e.g. 2h 30m, 90m, 1.5h": "piem. 2h 30m, 90m, 1.5h", + "Log time": "Reģistrēt laiku", + "Save estimate": "Saglabāt novērtējumu", + "Logged: {logged}": "Reģistrēts: {logged}", + "over by {amount}": "pārsniegts par {amount}", + "Time tracking": "Laika uzskaite", + "Estimate": "Novērtējums", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Ievadiet derīgu novērtējumu (piem. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Ievadiet derīgu ilgumu (piem. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Laika ierakstu neizdevās saglabāt. Mēģiniet vēlreiz.", + "Edit time entry": "Rediģēt laika ierakstu", + "Duration": "Ilgums", + "Date range": "Periods", + "Last week": "Iepriekšējā nedēļa", + "No time logged": "Nav reģistrēta laika", + "Log time on a task to see it here.": "Reģistrējiet laiku uzdevumam, lai to redzētu šeit.", + "To date": "Līdz datumam", + "This week": "Šī nedēļa", + "Total: {total}": "Kopā: {total}", + "From date": "No datuma", + "Custom range": "Pielāgots periods", + "All time": "Viss laiks", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Uzdevumu neizdevās dzēst, tāpēc dati var palikt. Dzēsiet projektu vēlreiz.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Laika ierakstu neizdevās dzēst, tāpēc dati var palikt. Dzēsiet projektu vēlreiz.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Kolonnu neizdevās dzēst, tāpēc dati var palikt. Dzēsiet projektu vēlreiz.", + "Could not delete the project. Please try again.": "Projektu neizdevās dzēst. Mēģiniet vēlreiz.", + "Notification settings": "Paziņojumu iestatījumi", + "Configure when due-date reminders are sent": "Nosakiet, kad tiek sūtīti termiņu atgādinājumi", + "Due-date reminder lead time (hours)": "Atgādinājuma laiks pirms termiņa (stundas)", + "Lead time must be between 1 and 336 hours": "Laikam jābūt no 1 līdz 336 stundām", + "Reminder lead time saved successfully": "Atgādinājuma laiks saglabāts", + "Failed to save reminder lead time": "Atgādinājuma laiku neizdevās saglabāt", + "Notifications": "Paziņojumi", + "Notify me 1 day before a task's due date": "Paziņot man 1 dienu pirms uzdevuma termiņa", + "Draft": "Melnraksts", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Vai stunda ir melnraksts, ko redz tikai tās skolotājs, notiek vai ir atcelta.", + "New release": "Jauns laidiens", + "Roadmap chart. The same releases and epics are listed below.": "Ceļveža diagramma. Tie paši laidieni un eposi ir uzskaitīti zemāk.", + "Nothing on the roadmap yet": "Ceļvedī vēl nekā nav", + "Releases with a target date and epics with dated tasks appear here.": "Šeit parādās laidieni ar mērķa datumu un eposi ar datētiem uzdevumiem.", + "Releases": "Laidieni", + "No releases yet": "Vēl nav laidienu", + "Target date: {date}": "Mērķa datums: {date}", + "No target date": "Nav mērķa datuma", + "Edit {name}": "Rediģēt {name}", + "Mark {name} as released": "Atzīmēt {name} kā izlaistu", + "Mark as released": "Atzīmēt kā izlaistu", + "Epics": "Eposi", + "No epics yet. Open a task to make it an epic.": "Vēl nav eposu. Atveriet uzdevumu, lai padarītu to par eposu.", + "Not scheduled yet": "Vēl nav ieplānots", + "Planned": "Plānots", + "Released": "Izlaists", + "Edit release": "Rediģēt laidienu", + "Target date": "Mērķa datums", + "Could not save the release. Please try again.": "Laidienu neizdevās saglabāt. Mēģiniet vēlreiz.", + "Every task of this release is done or cancelled.": "Katrs šī laidiena uzdevums ir paveikts vai atcelts.", + "Not finished yet: {count}": "Vēl nav pabeigti: {count}", + "What happens to these tasks?": "Kas notiek ar šiem uzdevumiem?", + "Move to {name}": "Pārvietot uz {name}", + "Remove the release": "Noņemt laidienu", + "Keep it on {name}": "Atstāt tos laidienā {name}", + "Could not mark the release as released. Please try again.": "Laidienu neizdevās atzīmēt kā izlaistu. Mēģiniet vēlreiz.", + "Roadmap": "Ceļvedis", + "Tasks or roadmap": "Uzdevumi vai ceļvedis", + "Release": "Laidiens", + "Epic": "Epos", + "This task is an epic": "Šis uzdevums ir epos", + "A named, dated delivery of a project that its tasks are planned against.": "Projekta nosaukta un datēta piegāde, pret kuru plāno tā uzdevumus.", + "Name of the release": "Laidiena nosaukums", + "The project this release belongs to": "Projekts, kuram pieder šis laidiens", + "What this release delivers": "Ko šis laidiens piegādā", + "When work on the release starts": "Kad sākas darbs pie laidiena", + "The date the release is due": "Datums, līdz kuram laidienam jābūt gatavam", + "Whether the release is planned, released or archived": "Vai laidiens ir plānots, izlaists vai arhivēts", + "Released on": "Izlaists", + "When the release was marked as released": "Kad laidiens tika atzīmēts kā izlaists", + "The release this task is planned for": "Laidiens, kuram šis uzdevums ir plānots", + "Board view options": "Dēļa skata opcijas", + "Colour cards": "Krāsot kartītes", + "No colour": "Bez krāsas", + "By label": "Pēc etiķetes", + "Swimlanes": "Celiņi", + "No swimlanes": "Bez celiņiem", + "By assignee": "Pēc atbildīgā", + "By epic": "Pēc eposa", + "No assignee": "Nav piešķirts", + "No epic": "Bez eposa", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartītes paliek sava eposa rindā. Mainiet eposu uzdevuma lapā.", + "Hand over to": "Nodot", + "Could not save your board view. It applies until you reload.": "Dēļa skatu neizdevās saglabāt. Tas darbojas līdz lapas pārlādei.", + "Timetable wish": "Stundu saraksta vēlme", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Vēlme, ko ģenerators ņem vērā. Stingru vēlmi tas ievēro vienmēr, elastīgu, kur var.", + "Whether the wish is about a teacher, a group, a room or one activity": "Vai vēlme attiecas uz skolotāju, grupu, telpu vai vienu nodarbību", + "Teacher": "Skolotājs", + "Group": "Grupa", + "Reference": "Atsauce", + "The user, group, room or activity the wish is about": "Lietotājs, grupa, telpa vai nodarbība, uz ko vēlme attiecas", + "What the wish asks for": "Ko vēlme prasa", + "Not on these periods": "Ne šajās stundās", + "Preferably not on these periods": "Labāk ne šajās stundās", + "At most a number of lessons a day": "Ne vairāk kā noteikts stundu skaits dienā", + "No free periods between lessons": "Bez brīvstundām starp stundām", + "Always the same room": "Vienmēr tā pati telpa", + "Periods": "Stundas", + "The periods of the week the wish is about, such as wed-5": "Nedēļas stundas, uz kurām vēlme attiecas, piemēram, wed-5", + "Limit": "Robeža", + "The most lessons a day, for a wish of that kind": "Lielākais stundu skaits dienā šāda veida vēlmei", + "Strength": "Stiprums", + "Whether the generator must keep the wish or should keep it": "Vai ģeneratoram vēlme jāievēro vai vajadzētu ievērot", + "Hard": "Stingra", + "Soft": "Elastīga", + "Weight": "Svars", + "How much a soft wish counts, from 1 to 3": "Cik daudz elastīga vēlme sver, no 1 līdz 3", + "Why the wish exists": "Kāpēc vēlme pastāv", + "Timetable scenario": "Stundu saraksta scenārijs", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Viens nedēļas modelis, ko izveidojis ģenerators vai kas ņemts no pašreizējā saraksta. Tas glabā savus ievaddatus un to, cik labi tas ievēro vēlmes.", + "The name timetablers know the scenario by": "Nosaukums, ar kādu sastādītāji zina scenāriju", + "Whether the generator made it or it came from the current timetable": "Vai to izveidoja ģenerators, vai tas nāk no pašreizējā saraksta", + "Generated": "Ģenerēts", + "From the current timetable": "No pašreizējā saraksta", + "Week of": "Nedēļa no", + "The Monday of the first week of the window": "Perioda pirmās nedēļas pirmdiena", + "Window start": "Perioda sākums", + "The first day the week pattern applies to": "Pirmā diena, uz kuru attiecas nedēļas modelis", + "Window end": "Perioda beigas", + "The last day the week pattern applies to": "Pēdējā diena, uz kuru attiecas nedēļas modelis", + "Waiting, generating, done, failed, or published as draft lessons": "Gaida, tiek ģenerēts, gatavs, neizdevās vai publicēts kā melnraksta stundas", + "Waiting": "Gaida", + "Generating": "Tiek ģenerēts", + "Failed": "Neizdevās", + "Published": "Publicēts", + "Seed": "Sēkla", + "The number the generator starts from, so a run can be repeated": "Skaitlis, no kura sāk ģenerators, lai palaišanu varētu atkārtot", + "Input": "Ievaddati", + "The periods, rooms, lessons and wishes the scenario was made from": "Stundas, telpas, nodarbības un vēlmes, no kurām scenārijs izveidots", + "Placements": "Izvietojumi", + "Each lesson with the period and room it was given": "Katra nodarbība ar tai piešķirto stundu un telpu", + "Unplaced lessons": "Neizvietotas nodarbības", + "Lessons without a place, each with the hard wish that blocked it": "Nodarbības bez vietas, katra ar stingro vēlmi, kas to aizkavēja", + "Broken wishes": "Pārkāptās vēlmes", + "The wishes this scenario breaks, with the lessons that break them": "Vēlmes, ko šis scenārijs pārkāpj, ar nodarbībām, kas tās pārkāpj", + "Measures": "Rādītāji", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Izvietotās nodarbības, pārkāptās vēlmes, skolotāju brīvstundas, stundas dienā un telpu izmantojums", + "Reason": "Iemesls", + "Why the run failed": "Kāpēc palaišana neizdevās", + "Published at": "Publicēts", + "When the scenario was written out as draft lessons": "Kad scenārijs tika ierakstīts kā melnraksta stundas", + "Edit wish": "Rediģēt vēlmi", + "New wish": "Jauna vēlme", + "Hard: the generator always keeps it": "Obligāta: ģenerators to vienmēr ievēro", + "Soft: the generator keeps it where it can": "Elastīga: ģenerators to ievēro, kur var", + "Weight (1 to 3)": "Svars (no 1 līdz 3)", + "Most lessons a day": "Ne vairāk stundu dienā", + "Period": "Stunda", + "{day} period {number}": "{day} {number}. stunda", + "Teacher (user name)": "Skolotājs (lietotājvārds)", + "Activity (group:subject)": "Aktivitāte (grupa:priekšmets)", + "Say who or what the wish is about.": "Norādiet, uz ko vēlme attiecas.", + "Choose at least one period.": "Izvēlieties vismaz vienu stundu.", + "The limit is a whole number of 1 or more.": "Ierobežojums ir vesels skaitlis, 1 vai vairāk.", + "Timetable": "Stundu saraksts", + "Wishes": "Vēlmes", + "Timetable wishes": "Stundu saraksta vēlmes", + "Generator run": "Ģeneratora palaišana", + "Generator progress": "Ģeneratora progress", + "The run failed: {reason}": "Palaišana neizdevās: {reason}", + "{placed} of {lessons} lessons placed": "Izvietotas {placed} no {lessons} stundām", + "Generate again": "Ģenerēt vēlreiz", + "Generate": "Ģenerēt", + "Every lesson has a place.": "Katrai stundai ir vieta.", + "Lesson": "Stunda", + "No free period and room": "Nav brīvas stundas un telpas", + "Broken soft wishes": "Pārkāptās elastīgās vēlmes", + "Every soft wish is kept.": "Katra elastīgā vēlme ir ievērota.", + "Wish": "Vēlme", + "Lessons": "Stundas", + "Generating: {percent}% of the time budget used": "Ģenerē: izmantoti {percent}% laika", + "Waiting to start": "Gaida sākumu", + "Published as draft lessons": "Publicēts kā stundu melnraksti", + "Could not read the scenario.": "Scenāriju neizdevās nolasīt.", + "Could not start the run.": "Palaišanu neizdevās sākt.", + "Scenarios": "Scenāriji", + "Timetable scenarios": "Stundu saraksta scenāriji", + "Scenario": "Scenārijs", + "Take the current timetable": "Pārņemt pašreizējo stundu sarakstu", + "Could not take the current timetable.": "Neizdevās pārņemt pašreizējo stundu sarakstu.", + "Broken hard wishes": "Pārkāptās obligātās vēlmes", + "Not on a period of the week grid": "Nav nedēļas režģa stundā", + "Compare scenarios": "Salīdzināt scenārijus", + "Scenarios to compare": "Salīdzināmie scenāriji", + "Choose two or three scenarios to compare them.": "Izvēlieties divus vai trīs scenārijus salīdzināšanai.", + "Measure": "Rādītājs", + "Best": "Labākais", + "Lessons that differ": "Atšķirīgās stundas", + "No lesson differs.": "Neviena stunda neatšķiras.", + "Not placed": "Nav izvietota", + "{period} in {room}": "{period} telpā {room}", + "Lessons placed": "Izvietotās stundas", + "Lessons without a place": "Stundas bez vietas", + "Clashes": "Konflikti", + "Hard wishes broken": "Pārkāptās obligātās vēlmes", + "Soft wishes broken": "Pārkāptās elastīgās vēlmes", + "Soft wishes broken, weighted": "Pārkāptās elastīgās vēlmes, svērtas", + "Free periods between lessons, all teachers": "Brīvstundas, visi skolotāji", + "Most free periods of one teacher": "Viena skolotāja visvairāk brīvstundu", + "Most lessons of one group on a day": "Vienas grupas visvairāk stundu dienā", + "Room use": "Telpu izmantojums", + "Publish as draft lessons": "Publicēt kā melnraksta stundas", + "Draft lessons written: {count}": "Uzrakstītas melnraksta stundas: {count}", + "Could not publish the scenario.": "Neizdevās publicēt scenāriju.", + "Rules": "Noteikumi", + "Rules for {column}": "Kolonnas {column} noteikumi", + "When a card enters this column": "Kad kartīte nonāk šajā kolonnā", + "Action": "Darbība", + "Set the priority": "Iestatīt prioritāti", + "Assign to": "Piešķirt", + "Assign the person who moved the card": "Piešķirt personai, kas pārvietoja kartīti", + "Remove the assignee": "Noņemt atbildīgo", + "Add a label": "Pievienot etiķeti", + "No longer a project member": "Vairs nav projekta dalībnieks", + "This label no longer exists": "Šī etiķete vairs nepastāv", + "Add rule": "Pievienot noteikumu", + "Remove rule": "Noņemt noteikumu", + "No rules yet. Add one to change a card when it enters this column.": "Noteikumu vēl nav. Pievienojiet noteikumu, kas maina kartīti, kad tā nonāk šajā kolonnā.", + "Could not save the rules. Please try again.": "Noteikumus neizdevās saglabāt. Mēģiniet vēlreiz.", + "1 rule runs when a card enters this column": "1 noteikums darbojas, kad kartīte nonāk šajā kolonnā", + "{count} rules run when a card enters this column": "Noteikumi, kas darbojas, kad kartīte nonāk šajā kolonnā: {count}", + "Rules applied: {changes}": "Piemēroti noteikumi: {changes}", + "assigned to {name}": "piešķirts: {name}", + "assignee removed": "atbildīgais noņemts", + "priority {priority}": "prioritāte {priority}", + "label {label}": "etiķete {label}", + "What happens to a card when it enters this column, applied in list order.": "Kas notiek ar kartīti, kad tā nonāk šajā kolonnā, saraksta secībā.", + "Value": "Vērtība", + "What the rule does to the card.": "Ko noteikums dara ar kartīti.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioritāte, lietotāja ID vai etiķetes ID, ko izmanto darbība; tukšs darbībām bez vērtības.", + "is not": "nav", + "{dimension} is not": "{dimension} nav", + "Saved filters": "Saglabātie filtri", + "No saved filters yet": "Saglabātu filtru vēl nav", + "Save filter": "Saglabāt filtru", + "Rename \"{name}\"": "Pārdēvēt “{name}”", + "Delete \"{name}\"": "Dzēst “{name}”", + "Clear filters": "Notīrīt filtrus", + "Showing {shown} of {total} tasks": "Rāda {shown} no {total} uzdevumiem", + "Me": "Es", + "No date": "Bez datuma", + "Rename saved filter": "Pārdēvēt saglabāto filtru", + "Share with the project": "Kopīgot ar projektu", + "Give the filter a name": "Piešķiriet filtram nosaukumu", + "Could not save the filter. Please try again.": "Filtru neizdevās saglabāt. Mēģiniet vēlreiz.", + "Some labels in \"{name}\" no longer exist and were left out.": "Dažas etiķetes filtrā “{name}” vairs nepastāv un tika izlaistas.", + "Could not delete the filter. Please try again.": "Filtru neizdevās izdzēst. Mēģiniet vēlreiz.", + "Saved filter": "Saglabāts filtrs", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Viena projekta nosaukts dēļa filtrs, privāts tā saglabātājam, ja vien tas nav kopīgots ar projektu.", + "The project whose board the filter applies to": "Projekts, kura dēlim filtrs paredzēts", + "The name the filter is listed under": "Nosaukums, ar kuru filtrs ir sarakstā", + "Saved by": "Saglabāja", + "Nextcloud user id of the person who saved the filter": "Filtra saglabātāja Nextcloud lietotāja ID", + "Shared with the project": "Kopīgots ar projektu", + "Whether every project member sees and applies the filter": "Vai katrs projekta dalībnieks redz un var lietot filtru", + "Criteria": "Kritēriji", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtrs: atbildīgais, etiķete, prioritāte un termiņš, katrs ar ir vai nav un vērtībām", + "Cross-project view": "Starpprojektu skats", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Saglabāta projektu izlase, kuras uzdevumi tiek rādīti kopā statusa joslās, kopīgota ar tajā nosauktajām personām.", + "Shared with": "Kopīgots ar", + "The name the view is listed under": "Nosaukums, ar kādu skats ir uzskaitīts", + "Nextcloud user id of the person who saved the view": "Tās personas Nextcloud lietotāja ID, kura saglabāja skatu", + "Nextcloud user ids of the people the view is shared with": "To personu Nextcloud lietotāju ID, ar kurām skats ir kopīgots", + "The projects whose tasks the view shows, at most twenty": "Projekti, kuru uzdevumus skats rāda, ne vairāk kā divdesmit", + "1 project in this view is hidden from you.": "1 šī skata projekts tev ir paslēpts.", + "{count} projects in this view are hidden from you.": "{count} šī skata projekti tev ir paslēpti.", + "{project} has no column for {status}.": "Projektam {project} nav kolonnas statusam {status}.", + "This view does not exist or is not shared with you.": "Šis skats nepastāv vai nav kopīgots ar tevi.", + "\"{task}\" moved to {status}.": "\"{task}\" pārvietots uz {status}.", + "Project: {title}": "Projekts: {title}", + "Cross-project views": "Starpprojektu skati", + "New view": "Jauns skats", + "Edit view": "Rediģēt skatu", + "Delete view": "Dzēst skatu", + "Give the view a name": "Piešķir skatam nosaukumu", + "Pick at least one project": "Izvēlies vismaz vienu projektu", + "A view shows at most {max} projects": "Skats rāda ne vairāk kā {max} projektus", + "Could not save the view. Please try again.": "Neizdevās saglabāt skatu. Mēģini vēlreiz.", + "Could not delete the view. Please try again.": "Neizdevās dzēst skatu. Mēģini vēlreiz.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Dzēst \"{title}\"? Projekti un to uzdevumi paliek nemainīti.", + "People see the tasks of the projects they are in, never more.": "Katrs redz tikai to projektu uzdevumus, kuros piedalās.", + "No views yet. A view shows the tasks of several of your projects together.": "Skatu vēl nav. Skats rāda vairāku tavu projektu uzdevumus kopā.", + "Projects in view: {count}": "Projekti skatā: {count}", + "Notify me when a task is assigned to me": "Paziņot man, kad man tiek piešķirts uzdevums", + "Also send these to me by email": "Sūtīt tos man arī e-pastā", + "Add an email address in your Nextcloud personal settings to get mail.": "Pievieno e-pasta adresi savos Nextcloud personiskajos iestatījumos, lai saņemtu e-pastu.", + "Code link": "Koda saite", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Komits, zars, sapludināšanas pieprasījums vai problēma koda platformā, kas attiecas uz uzdevumu.", + "The task the link belongs to": "Uzdevums, kuram pieder saite", + "The project of the task": "Uzdevuma projekts", + "Task key": "Uzdevuma atslēga", + "The task key the forge text named, such as VC-12": "Uzdevuma atslēga, ko minēja koda platformas teksts, piemēram, VC-12", + "What the link points at": "Uz ko norāda saite", + "Link": "Saite", + "The address of the item in the forge": "Vienuma adrese koda platformā", + "The commit message, branch name or merge request title": "Komita ziņojums, zara nosaukums vai sapludināšanas pieprasījuma virsraksts", + "Repository": "Repozitorijs", + "The repository, such as acme/portal": "Repozitorijs, piemēram, acme/portal", + "Forge id": "Id platformā", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Vienuma paša id koda platformā, piemēram, github:acme/portal#42 vai komita jaucējkods", + "State": "Stāvoklis", + "The state of a merge request or issue": "Sapludināšanas pieprasījuma vai problēmas stāvoklis", + "Who made the commit or opened the merge request": "Kas veica komitu vai atvēra sapludināšanas pieprasījumu", + "When the commit was made or the merge request last changed": "Kad tika veikts komits vai pēdējoreiz mainījās sapludināšanas pieprasījums", + "Added by": "Pievienoja", + "Whether a person added the link or the integration wrote it": "Vai saiti pievienoja cilvēks vai to ierakstīja integrācija", + "Nextcloud user UIDs of project members": "Projekta dalībnieku Nextcloud lietotāju ID", + "Add link": "Pievienot saiti", + "Added by hand": "Pievienots manuāli", + "Branch": "Zars", + "Code": "Kods", + "Commit": "Komits", + "From the integration": "No integrācijas", + "Link to a commit, branch or merge request": "Saite uz komitu, zaru vai sapludināšanas pieprasījumu", + "Merge request": "Sapludināšanas pieprasījums", + "Merged": "Sapludināts", + "No code linked yet. Name {key} in a commit message or paste a link.": "Kods vēl nav piesaistīts. Nosauciet {key} komita ziņojumā vai ielīmējiet saiti.", + "No code linked yet. Paste a link to a commit or merge request.": "Kods vēl nav piesaistīts. Ielīmējiet saiti uz komitu vai sapludināšanas pieprasījumu.", + "Paste a web address that starts with https://.": "Ielīmējiet tīmekļa adresi, kas sākas ar https://.", + "Remove link {title}": "Noņemt saiti {title}", + "The link could not be added.": "Saiti neizdevās pievienot.", + "The link could not be removed.": "Saiti neizdevās noņemt.", + "This link is already on the task.": "Šī saite jau ir pie uzdevuma.", + "Code forges": "Koda platformas", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Piesaistiet GitHub komitus un pull request uzdevumiem. Integriq saņem notikumus; planninq nekad neizsauc GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Lejupielādējiet konfigurāciju un importējiet to Integriq. Pēc tam ierakstiet noslēpumu noteikumā \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "GitHub pievienojiet repozitorijam webhook ar šo adresi un to pašu noslēpumu. Izvēlieties satura tipu application/json un notikumus push un pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nosauciet uzdevuma atslēgu, piemēram, VC-12, komita ziņojumā, zara nosaukumā vai pull request virsrakstā. Saite tad parādās pie šī uzdevuma.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriq projekta dalībnieki joprojām var ielīmēt saiti uzdevuma lapā.", + "Download the Integriq configuration": "Lejupielādēt Integriq konfigurāciju", + "Calendar": "Kalendārs", + "Previous": "Iepriekšējais", + "Calendar view": "Kalendāra skats", + "Starts:": "Sākas:", + "No tasks with a date in this month.": "Šajā mēnesī nav uzdevumu ar datumu.", + "Week of {start} to {end}": "Nedēļa no {start} līdz {end}", + "My calendar": "Mans kalendārs", + "Show as list": "Rādīt kā sarakstu", + "Show as calendar": "Rādīt kā kalendāru", + "Open my calendar": "Atvērt manu kalendāru", + "Nextcloud Tasks": "Nextcloud uzdevumi", + "Show my tasks in Nextcloud Tasks": "Rādīt manus uzdevumus Nextcloud uzdevumos", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Jums piešķirtie vai ar jums kopīgotie uzdevumi parādās sarakstā \"Planninq\" Nextcloud uzdevumos un kalendārā. Tur veiktās izmaiņas tiek aizstātas ar nākamo izmaiņu Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Šis serveris nevar rakstīt Nextcloud uzdevumos, tāpēc eksports nav pieejams.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Pārvalda Planninq. Šeit veiktās izmaiņas tiek aizstātas ar nākamo izmaiņu Planninq.", + "Working days and holidays": "Darba dienas un svētku dienas", + "Dates set on the timeline skip the days that are not working days.": "Laika joslā iestatītie datumi izlaiž dienas, kas nav darba dienas.", + "Working weekdays": "Nedēļas darba dienas", + "Non-working days": "Brīvdienas", + "No non-working days yet.": "Brīvdienu vēl nav.", + "Add day": "Pievienot dienu", + "Year": "Gads", + "Add Dutch national holidays": "Pievienot Nīderlandes valsts svētkus", + "Save working days": "Saglabāt darba dienas", + "Choose at least one working weekday.": "Izvēlieties vismaz vienu darba dienu.", + "Working days saved.": "Darba dienas saglabātas.", + "Could not save the working days.": "Darba dienas neizdevās saglabāt.", + "New Year's Day": "Jaungada diena", + "Easter Sunday": "Lieldienas", + "Easter Monday": "Otrās Lieldienas", + "King's Day": "Karaļa diena", + "Liberation Day": "Atbrīvošanas diena", + "Ascension Day": "Debesbraukšanas diena", + "Whit Sunday": "Vasarsvētki", + "Whit Monday": "Otrie Vasarsvētki", + "Christmas Day": "Ziemassvētki", + "Boxing Day": "Otrie Ziemassvētki", + "Dates of {title}": "{title} datumi", + "The due date cannot be before the start date.": "Termiņš nevar būt pirms sākuma datuma.", + "{title}, from {start} to {end}": "{title}, no {start} līdz {end}", + "The dates could not be saved.": "Datumus neizdevās saglabāt.", + "{title} now runs from {start} to {end}": "{title} tagad ilgst no {start} līdz {end}", + "Auto-scheduling": "Automātiska plānošana", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Ja ieslēgts, termiņa pārcelšana vēlāk laika joslā piedāvā pārcelt arī tā bloķētos uzdevumus.", + "Move blocked tasks along when a task slips": "Pārcelt bloķētos uzdevumus, kad uzdevums kavējas", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Laika joslā vēlāks termiņš piedāvā pārcelt bloķētos uzdevumus. Skaitās tikai saites \"bloķē\", un uzdevumi tiek pārcelti tikai uz vēlāku laiku.", + "Move the tasks that wait for {title}?": "Vai pārcelt uzdevumus, kas gaida {title}?", + "These tasks wait for it and would start after its new due date:": "Šie uzdevumi to gaida un sāktos pēc jaunā termiņa:", + "{count} tasks would move; the first {limit} are listed.": "Tiktu pārcelti {count} uzdevumi; parādīti pirmie {limit}.", + "Now": "Tagad", + "After the move": "Pēc pārcelšanas", + "Only this task": "Tikai šis uzdevums", + "Move all": "Pārcelt visus", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Apturēts pie {title}: datumus neizdevās saglabāt. Uzdevumi pirms tā tika pārcelti.", + "Cumulative flow": "Kumulatīvā plūsma", + "Show as chart": "Rādīt kā diagrammu", + "Show as table": "Rādīt kā tabulu", + "Tasks per column per day": "Uzdevumi kolonnā dienā", + "Tasks without recorded history in this period: {count}": "Uzdevumi bez reģistrētas vēstures šajā periodā: {count}", + "Lead and cycle time": "Izpildes laiks un cikla laiks", + "No tasks were finished in this period.": "Šajā periodā netika pabeigts neviens uzdevums.", + "Finished tasks": "Pabeigtie uzdevumi", + "Cycle time, average": "Cikla laiks, vidēji", + "Cycle time, 85th percentile": "Cikla laiks, 85. procentile", + "Lead time, average": "Izpildes laiks, vidēji", + "Tasks whose finish time was estimated from their history: {count}": "Uzdevumi, kuru beigu laiks novērtēts no vēstures: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Katra pabeigtā uzdevuma cikla laiks ar vidējo un 85. procentili", + "Slowest tasks": "Lēnākie uzdevumi", + "cycle {cycle}, lead {lead}": "cikls {cycle}, izpilde {lead}", + "{days} days": "{days} dienas", + "Could not load the flow of this project.": "Neizdevās ielādēt šī projekta plūsmu.", + "Last {days} days": "Pēdējās {days} dienas", + "Portfolio flow": "Portfeļa plūsma", + "An admin adds portfolios under Projects, Portfolios.": "Administrators pievieno portfeļus sadaļā Projekti, Portfeļi.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Neparādītie projekti, jo vienlaikus tiek rādīti ne vairāk kā 50: {count}", + "Could not load the flow of this portfolio.": "Neizdevās ielādēt šī portfeļa plūsmu.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulatīvā plūsma un cikla laiks portfeļa projektos.", + "Edit report": "Rediģēt atskaiti", + "Only tasks where": "Tikai uzdevumi, kur", + "Group by": "Grupēt pēc", + "Display": "Skats", + "Share with everyone who can read its projects": "Kopīgot ar visiem, kas var lasīt tās projektus", + "The report could not be saved.": "Atskaiti neizdevās saglabāt.", + "Number of tasks": "Uzdevumu skaits", + "Bar": "Stabiņi", + "Donut": "Gredzens", + "Table": "Tabula", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} no {total} projektiem šajā atskaitē jums nav redzami", + "No tasks match this report.": "Neviens uzdevums neatbilst šai atskaitei.", + "None": "Nav", + "Could not load this report.": "Šo atskaiti neizdevās ielādēt.", + "Report": "Atskaite", + "Your reports": "Jūsu atskaites", + "My reports": "Manas atskaites", + "Shared reports": "Kopīgotās atskaites", + "You have not built a report yet.": "Jūs vēl neesat izveidojis atskaiti.", + "Nobody has shared a report with you yet.": "Neviens vēl nav kopīgojis ar jums atskaiti.", + "Reports you built over tasks, and the ones shared with you.": "Atskaites, ko izveidojāt par uzdevumiem, un tās, kas kopīgotas ar jums.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Saglabāts vaicājums par uzdevumiem: kuri projekti, kuri filtri, grupēts pēc kā, saskaitīts vai summēts, un rādīts kā tabula vai diagramma.", + "The name the report is listed under": "Nosaukums, ar kuru atskaite ir sarakstā", + "What the report shows and who it is for": "Ko atskaite rāda un kam tā paredzēta", + "Nextcloud user id of the person who saved the report": "Atskaiti saglabājušās personas Nextcloud lietotāja ID", + "Who can open the report": "Kas var atvērt atskaiti", + "Only me": "Tikai es", + "Everyone who can read its projects": "Visi, kas var lasīt tās projektus", + "The projects the report covers, at most fifty": "Projekti, ko atskaite aptver, ne vairāk kā piecdesmit", + "Filters": "Filtri", + "Task fields and the value each must equal": "Uzdevuma lauki un vērtība, kurai katram jābūt vienādam", + "The task field the report groups on": "Uzdevuma lauks, pēc kura atskaite grupē", + "Count the tasks, or add up a number on them": "Saskaitīt uzdevumus vai summēt skaitli tajos", + "Sum": "Summa", + "Sum of": "Summa no", + "The number added up when the measure is a sum": "Skaitlis, ko summē, ja mērs ir summa", + "Story points": "Stāsta punkti", + "Estimated duration": "Paredzamais ilgums", + "How the report is shown": "Kā atskaite tiek rādīta", + "Issue type": "Pieteikuma veids", + "Task fields and the value each must equal; empty when the report covers every task": "Uzdevuma lauki un vērtība, kāda katram jābūt; tukšs, ja atskaite aptver visus uzdevumus", + "The status a task must have": "Statuss, kāds uzdevumam jābūt", + "The priority a task must have": "Prioritāte, kāda uzdevumam jābūt", + "The user a task must be assigned to": "Lietotājs, kuram uzdevumam jābūt piešķirtam", + "A label a task must carry": "Etiķete, kāda uzdevumam jābūt", + "The board column a task must be in": "Dēļa kolonna, kurā uzdevumam jābūt", + "The issue type a task must have": "Pieteikuma veids, kāds uzdevumam jābūt", + "Manager groups": "Vadītāju grupas", + "Member groups": "Dalībnieku grupas", + "Viewer groups": "Lasītāju grupas", + "Viewers": "Lasītāji", + "Owning group": "Īpašnieku grupa", + "Nextcloud groups whose members manage the project": "Nextcloud grupas, kuru dalībnieki vada projektu", + "Nextcloud groups whose members work on the project": "Nextcloud grupas, kuru dalībnieki strādā projektā", + "Nextcloud groups whose members may read the project": "Nextcloud grupas, kuru dalībnieki drīkst lasīt projektu", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud lietotāji, kas vada projektu: iestatījumus, dalībniekus un darbu", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud lietotāji, kas drīkst lasīt projektu un tā darbu, bet ne mainīt", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud grupa, kurai projekts pieder kopā ar tā izveidotāju, ne vairāk kā viena", + "Nextcloud user ids who may read this through the project": "Nextcloud lietotāji, kas drīkst lasīt šo caur projektu", + "Nextcloud groups whose members may change this through the project": "Nextcloud grupas, kuru dalībnieki drīkst mainīt šo caur projektu", + "Nextcloud groups whose members may read this through the project": "Nextcloud grupas, kuru dalībnieki drīkst lasīt šo caur projektu", + "Search for a person or a group…": "Meklēt personu vai grupu…", + "No one found. Your admin's sharing settings decide who you can find.": "Neviens netika atrasts. Tava administratora koplietošanas iestatījumi nosaka, ko vari atrast.", + "Type at least two characters": "Ievadi vismaz divas rakstzīmes", + "Everyone in this group": "Visi šajā grupā", + "Could not search for people. Please try again.": "Neizdevās meklēt personas. Mēģini vēlreiz.", + "Could not remove the group": "Neizdevās noņemt grupu", + "Only the owner and managers change who is on this project.": "Tikai īpašnieks un pārvaldnieki maina, kas ir šajā projektā.", + "Role of {name}": "{name} loma", + "Manager": "Pārvaldnieks", + "Member": "Dalībnieks", + "Viewer": "Lasītājs", + "Could not change the role": "Neizdevās mainīt lomu", + "Owned by group: {name}": "Pieder grupai: {name}", + "No group owns this project.": "Neviena grupa nav šī projekta īpašniece.", + "Owned by group": "Pieder grupai", + "Search for a group…": "Meklēt grupu…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Grupa netika atrasta. Jūsu administratora koplietošanas iestatījumi nosaka, kuras grupas varat atrast.", + "No owning group": "Nav īpašnieku grupas", + "Could not search for groups. Please try again.": "Neizdevās meklēt grupas. Mēģiniet vēlreiz.", + "Could not change the owning group": "Neizdevās mainīt īpašnieku grupu", + "You can read this project. Only its members change it.": "Jūs varat lasīt šo projektu. To maina tikai tā dalībnieki.", + "Course": "Kurss", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurss, kas tiek mācīts šajā stundā, piemēram, izvēles priekšmets, ja skolas mācību lietotne to zina.", + "Online meeting link": "Tiešsaistes stundas saite", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kur skolēni pievienojas šai stundai tiešsaistē. Poga Pievienoties tiek rādīta tikai https saitei." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/lv.json b/l10n/lv.json index 561d20eb..3de26a15 100644 --- a/l10n/lv.json +++ b/l10n/lv.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktīvie projekti", + "Archived projects": "Arhivētie projekti", + "Boards": "Tāfeles", + "My projects": "Mani projekti", + "Portfolio": "Portfelis", + "Project board": "Projekta tāfele", + "Projects I am in": "Projekti, kuros piedalos", + "Timeline": "Laika josla", + "Timesheet": "Darba laika uzskaite", + "Features & roadmap": "Funkcijas un ceļvedis", + "Flow": "Plūsma", + "Flows": "Plūsmas", + "Reports": "Pārskati", + "Pick a report to open it.": "Izvēlieties pārskatu, lai to atvērtu.", + "In progress": "Notiek", + "Date": "Datums", + "Due": "Termiņš", + "Assignee": "Piešķirts", + "Who": "Kurš", + "What": "Kas", + "Minutes": "Minūtes", + "Entries": "Ieraksti", + "Most recent": "Jaunākie", + "Per person": "Uz personu", + "By status": "Pēc statusa", + "By priority": "Pēc prioritātes", + "Task status": "Uzdevumu statuss", + "Time spent": "Patērētais laiks", + "Capacity": "Kapacitāte", + "Due soonest": "Tuvākais termiņš", + "Minutes logged": "Reģistrētās minūtes", + "Nothing is due": "Nekas nav jāpabeidz", + "Nothing logged yet": "Vēl nekas nav reģistrēts", + "What is open, what is blocked, and what is overdue.": "Kas ir atvērts, kas bloķēts un kas nokavēts.", + "How allocation is spread across the people working on projects.": "Kā slodze sadalās starp cilvēkiem, kas strādā pie projektiem.", + "Hours logged, and the projects they went to.": "Reģistrētās stundas un projekti, kuriem tās veltītas.", + "Billable": "Apmaksājams", + "Budget: {amount}": "Budžets: {amount}", + "Loading projects": "Ielādē projektus", + "No projects for this client yet": "Šim klientam vēl nav projektu", + "Open in Planninq": "Atvērt Planninq", + "This project could not be found": "Šis projekts netika atrasts", + "Untitled project": "Projekts bez nosaukuma", + "and {count} more": "un vēl {count}", + "Store": "Veikals", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instalējiet reģistrus, shēmas un plūsmas, ko publicējušas citas organizācijas.", + "Work Date": "Darba datums", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Kolonnas darbības", + "Columns": "Kolonnas", + "Could not remove the column. Please try again.": "Kolonnu neizdevās noņemt. Mēģiniet vēlreiz.", + "Could not save the column. Please try again.": "Kolonnu neizdevās saglabāt. Mēģiniet vēlreiz.", + "Done column": "Pabeigto kolonna", + "Edit column": "Rediģēt kolonnu", + "Keep the card's status": "Saglabāt kartītes statusu", + "Move its cards to": "Pārvietot tās kartītes uz", + "Move left": "Pārvietot pa kreisi", + "Move right": "Pārvietot pa labi", + "Status of cards moved here": "Šeit pārvietoto kartīšu statuss", + "The last done column cannot be removed.": "Pēdējo pabeigto kolonnu nevar noņemt.", + "WIP limit": "WIP ierobežojums", + "over limit": "virs ierobežojuma", + "The status a card gets when it is moved into this column.": "Statuss, ko kartīte saņem, kad tā tiek pārvietota uz šo kolonnu.", + "All priorities": "Visas prioritātes", + "Could not create the task. Please try again.": "Uzdevumu neizdevās izveidot. Mēģiniet vēlreiz.", + "Created": "Izveidots", + "Move to backlog": "Uz uzkrājumu", + "Move to board": "Uz dēli", + "New task": "Jauns uzdevums", + "Nothing in the backlog": "Uzkrājumā nekā nav", + "Rank": "Rangs", + "Sort by": "Kārtot pēc", + "Sort by rank to reorder": "Kārtojiet pēc ranga, lai mainītu secību", + "Task actions": "Uzdevuma darbības", + "All labels": "Visas birkas", + "Filter tasks by label": "Filtrēt uzdevumus pēc birkas", + "View timeline": "Skatīt laika skalu", + "Board": "Dēlis", + "List": "Saraksts", + "Column": "Kolonna", + "Board or list": "Dēlis vai saraksts", + "Log": "Žurnāls", + "Add entry": "Pievienot ierakstu", + "Show": "Rādīt", + "No actions yet": "Vēl nav darbību", + "Closed": "Slēgts", + "Entry actions": "Ieraksta darbības", + "Add action": "Pievienot darbību", + "by {author}": "autors {author}", + "saved {time}": "saglabāts {time}", + "Attendees: {names}": "Dalībnieki: {names}", + "Add the first entry": "Pievienot pirmo ierakstu", + "Issues": "Problēmas", + "Lessons learned": "Gūtās atziņas", + "Meetings": "Sanāksmes", + "Decisions": "Lēmumi", + "Actions": "Darbības", + "Issue": "Problēma", + "Lesson learned": "Gūtā atziņa", + "Meeting": "Sanāksme", + "Decision": "Lēmums", + "About this project": "Par šo projektu", + "No description yet": "Vēl nav apraksta", + "Start date": "Sākuma datums", + "Not set": "Nav iestatīts", + "End date": "Beigu datums", + "Progress": "Progress", + "No tasks yet": "Vēl nav uzdevumu", + "Open the board": "Atvērt dēli", + "People": "Cilvēki", + "Owner": "Īpašnieks", + "Latest log entries": "Jaunākie ieraksti", + "Open the log": "Atvērt žurnālu", + "{done} of {total} tasks done": "Izpildīti {done} no {total} uzdevumiem", + "Edit entry": "Rediģēt ierakstu", + "Type": "Veids", + "Attendees": "Dalībnieki", + "Issue is closed": "Problēma ir slēgta", + "Could not save the entry. Please try again.": "Ierakstu neizdevās saglabāt. Mēģiniet vēlreiz.", + "From: {title}": "No: {title}", + "What needs to happen": "Kas jāizdara", + "Could not create the action. Please try again.": "Darbību neizdevās izveidot. Mēģiniet vēlreiz.", + "The action was created but could not be linked to the entry.": "Darbība tika izveidota, bet to neizdevās sasaistīt ar ierakstu.", + "Project pages": "Projekta lapas", + "Overview": "Pārskats", + "Risks": "Riski", + "Log entry": "Žurnāla ieraksts", + "A short name for the entry": "Īss ieraksta nosaukums", + "Project": "Projekts", + "The project this entry belongs to": "Projekts, kuram pieder šis ieraksts", + "What kind of entry this is": "Kāda veida ieraksts tas ir", + "When it happened": "Kad tas notika", + "What happened, in Markdown": "Kas notika, Markdown formātā", + "Whether an issue is still open": "Vai problēma joprojām ir atvērta", + "The people at a meeting": "Cilvēki sanāksmē", + "Tasks that came out of this entry": "Uzdevumi, kas radušies no šī ieraksta", + "Add risk": "Pievienot risku", + "Risk": "Risks", + "Score": "Punkti", + "Response": "Rīcība", + "Review date": "Pārskatīšanas datums", + "no longer on the project": "vairs nav projektā", + "Edit {title}": "Rediģēt {title}", + "No risks recorded yet": "Vēl nav reģistrētu risku", + "Add the first risk": "Pievienot pirmo risku", + "Medium": "Vidējs", + "Mitigating": "Tiek mazināts", + "Occurred": "Iestājies", + "Avoid": "Izvairīties", + "Reduce": "Samazināt", + "Transfer": "Nodot", + "Accept": "Pieņemt", + "Highest open risks": "Augstākie atvērtie riski", + "No open risks": "Nav atvērtu risku", + "Open the risk register": "Atvērt risku reģistru", + "Edit risk": "Rediģēt risku", + "What could go wrong": "Kas var noiet greizi", + "Likelihood": "Varbūtība", + "Impact": "Ietekme", + "Score {score}": "Punkti {score}", + "Countermeasures": "Pretpasākumi", + "Could not save the risk. Please try again.": "Risku neizdevās saglabāt. Mēģiniet vēlreiz.", + "Risks by likelihood and impact": "Riski pēc varbūtības un ietekmes", + "Risk scale": "Risku skala", + "The levels every project scores its risks on, and where low turns into medium and high": "Līmeņi, kuros katrs projekts vērtē savus riskus, un kur zems pāriet vidējā un augstā", + "Number of levels": "Līmeņu skaits", + "Likelihood labels": "Varbūtības nosaukumi", + "Impact labels": "Ietekmes nosaukumi", + "Level {level}": "Līmenis {level}", + "Medium from score": "Vidējs no punktiem", + "High from score": "Augsts no punktiem", + "Risk scale saved": "Risku skala saglabāta", + "1 risk uses level {level}. Change it first.": "1 risks izmanto līmeni {level}. Vispirms to mainiet.", + "{count} risks use level {level}. Change them first.": "{count} riski izmanto līmeni {level}. Vispirms tos mainiet.", + "Every level needs a label, and high must start above medium.": "Katram līmenim vajag nosaukumu, un augstam jāsākas virs vidējā.", + "The project this risk belongs to": "Projekts, kuram pieder šis risks", + "The cause and the effect, in Markdown": "Cēlonis un sekas, Markdown formātā", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Brīvs grupējums, piemēram, plānošana, budžets vai piegādātājs", + "How likely it is, on the admin's risk scale": "Cik tas ir varbūtīgs, administratora risku skalā", + "How hard it would hit, on the admin's risk scale": "Cik smagi tas skartu, administratora risku skalā", + "Likelihood times impact, calculated by the server": "Varbūtība reiz ietekme, aprēķina serveris", + "Where the risk stands": "Kur risks atrodas", + "The person who watches this risk": "Persona, kas uzrauga šo risku", + "How the project answers the risk": "Kā projekts reaģē uz risku", + "What is done to prevent it or soften it, in Markdown": "Kas tiek darīts, lai to novērstu vai mazinātu, Markdown formātā", + "When to look at this risk again": "Kad risku pārskatīt atkal", + "Very low": "Ļoti zems", + "Very high": "Ļoti augsts", + "All projects": "Visi projekti", + "Project status report": "Projekta statusa ziņojums", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datēts ziņojums par to, kā projektam veicas ar naudu, organizāciju, laiku, informāciju, kvalitāti un risku (GROTIK aspekti), katrs ar piezīmi.", + "The project this report is about": "Projekts, par kuru ir ziņojums", + "Report date": "Ziņojuma datums", + "The day the report describes": "Diena, ko ziņojums apraksta", + "Money": "Nauda", + "How the project stands on this aspect": "Kā projektam veicas šajā aspektā", + "On track": "Pēc plāna", + "At risk": "Apdraudēts", + "Off track": "Ārpus plāna", + "Money note": "Piezīme par naudu", + "A short explanation of this status": "Īss šī statusa skaidrojums", + "Organisation": "Organizācija", + "Organisation note": "Piezīme par organizāciju", + "Time": "Laiks", + "Time note": "Piezīme par laiku", + "Information": "Informācija", + "Information note": "Piezīme par informāciju", + "Quality": "Kvalitāte", + "Quality note": "Piezīme par kvalitāti", + "Risk note": "Piezīme par risku", + "Overall": "Kopā", + "The worst of the six statuses, calculated by the server": "Sliktākais no sešiem statusiem, aprēķina serveris", + "Health: money": "Stāvoklis: nauda", + "Copied from the newest status report": "Pārņemts no jaunākā statusa ziņojuma", + "Health: organisation": "Stāvoklis: organizācija", + "Health: time": "Stāvoklis: laiks", + "Health: information": "Stāvoklis: informācija", + "Health: quality": "Stāvoklis: kvalitāte", + "Health: risk": "Stāvoklis: risks", + "Health: overall": "Stāvoklis: kopā", + "Health: report date": "Stāvoklis: ziņojuma datums", + "The date of the newest status report": "Jaunākā statusa ziņojuma datums", + "New report": "Jauns ziņojums", + "Only the project owner writes status reports.": "Statusa ziņojumus raksta tikai projekta īpašnieks.", + "Latest report, {date}": "Pēdējais ziņojums, {date}", + "Aspect": "Aspekts", + "Note": "Piezīme", + "Report history": "Ziņojumu vēsture", + "Author": "Autors", + "No status reports yet": "Vēl nav statusa ziņojumu", + "Write the first report": "Uzrakstīt pirmo ziņojumu", + "Choose a status for every aspect to save the report.": "Lai saglabātu ziņojumu, izvēlieties statusu katram aspektam.", + "Suggested: on track.": "Ieteikums: pēc plāna.", + "Suggested: at risk.": "Ieteikums: apdraudēts.", + "Suggested: off track.": "Ieteikums: ārpus plāna.", + "1 task is past its due date.": "1 uzdevumam ir nokavēts termiņš.", + "{count} tasks are past their due date.": "Uzdevumi ar nokavētu termiņu: {count}.", + "The end date has passed with 1 open task.": "Beigu datums ir pagājis, un 1 uzdevums ir atvērts.", + "The end date has passed with {count} open tasks.": "Beigu datums ir pagājis, atvērti uzdevumi: {count}.", + "No open task is past its due date.": "Nevienam atvērtam uzdevumam nav nokavēts termiņš.", + "The highest open risk, \"{title}\", scores {score}.": "Lielākais atvērtais risks, \"{title}\", ir novērtēts ar {score}.", + "There are no open risks.": "Nav atvērtu risku.", + "Costs are at {percent}% of the budget.": "Izmaksas ir {percent}% no budžeta.", + "No suggestion: the project has no budget.": "Nav ieteikuma: projektam nav budžeta.", + "No suggestion: no costs are recorded for this project yet.": "Nav ieteikuma: šim projektam vēl nav reģistrētu izmaksu.", + "The report was not saved. Only the project owner can write status reports.": "Ziņojums netika saglabāts. Statusa ziņojumus var rakstīt tikai projekta īpašnieks.", + "No report": "Nav ziņojuma", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Projektu grupa, ko vada tie paši cilvēki, piemēram, nodaļa vai programma. Tās vadītāji lasa katru tajā esošo projektu.", + "The name of the portfolio": "Portfeļa nosaukums", + "What the portfolio holds and who runs it": "Ko portfelis ietver un kas to vada", + "A colour for the portfolio's section in project lists": "Krāsa portfeļa sadaļai projektu sarakstos", + "Managers": "Vadītāji", + "Nextcloud user UIDs of the people who run the portfolio": "To cilvēku Nextcloud lietotāju ID, kuri vada portfeli", + "Order": "Secība", + "Where the portfolio comes in project lists, lowest first": "Portfeļa vieta projektu sarakstos, mazākais vispirms", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Šī portfeļa paša riska skala JSON formātā, tādā pašā formā kā visas lietotnes skala. Tukšs nozīmē lietotnes skalu.", + "Portfolio readers": "Portfeļa lasītāji", + "Nextcloud user UIDs of the managers of the project's portfolio": "Projekta portfeļa vadītāju Nextcloud lietotāju ID", + "The portfolio this project belongs to": "Portfelis, kuram pieder šis projekts", + "No portfolio": "Nav portfeļa", + "All portfolios": "Visi portfeļi", + "You read this project as a manager of its portfolio. Only its members change it.": "Jūs lasāt šo projektu kā tā portfeļa vadītājs. To maina tikai tā dalībnieki.", + "Portfolios": "Portfeļi", + "Portfolio status": "Portfeļa stāvoklis", + "No portfolios yet": "Vēl nav portfeļu", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administrators pievieno portfeļus sadaļā Projekti, Portfeļi. Portfeļa projekti ir uzskaitīti šeit ar to stāvokli.", + "Roll-up": "Kopsavilkums", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} pēc plāna, {atRisk} riskā, {offTrack} ārpus plāna, {noReport} bez atskaites", + "No project in this portfolio that you can read.": "Šajā portfelī nav projekta, ko varat lasīt.", + "Start": "Sākums", + "End": "Beigas", + "Budget": "Budžets", + "Last report": "Pēdējā atskaite", + "Out of date": "Novecojusi", + "Portfolio timeline": "Portfeļa laika josla", + "Zoom": "Tālummaiņa", + "Could not load the timeline": "Laika joslu neizdevās ielādēt", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administrators pievieno portfeļus sadaļā Projekti, Portfeļi. Portfeļa projekti šeit ir vienā laika joslā.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Atveriet projektu, lai redzētu tā posmus un uzdevumus. Laika josla ir tikai lasāma.", + "Phase: {title}": "Posms: {title}", + "Left out because you cannot read them: {count} projects": "Izlaisti, jo jūs tos nevarat lasīt: {count} projekti", + "Week": "Nedēļa", + "Day": "Diena", + "Month": "Mēnesis", + "Please try again later.": "Lūdzu, mēģiniet vēlāk vēlreiz.", + "Status reports": "Stāvokļa atskaites", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Pēc cik dienām projekta pēdējā stāvokļa atskaite portfeļa pārskatā tiek atzīmēta kā novecojusi", + "Reporting period (days)": "Atskaišu periods (dienas)", + "The reporting period is a whole number of days from 1 to 365.": "Atskaišu periods ir vesels dienu skaits no 1 līdz 365.", + "Reporting period saved": "Atskaišu periods saglabāts", + "The reporting period was not saved. Please try again.": "Atskaišu periods netika saglabāts. Mēģiniet vēlreiz.", + "Every project of a portfolio with its status per aspect, rolled up.": "Katrs portfeļa projekts ar stāvokli pa aspektiem, kopsavilkumā.", + "The projects of a portfolio on one timeline.": "Portfeļa projekti vienā laika joslā.", + "Phases": "Posmi", + "Add phase": "Pievienot posmu", + "No phases yet": "Vēl nav posmu", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Sadaliet projektu posmos, piemēram, uzsākšana, definēšana un īstenošana. Posms tiek slēgts, kad ir augšupielādēts tā noslēguma dokuments.", + "{hours} hours": "{hours} stundas", + "Concluding document: {title}": "Noslēguma dokuments: {title}", + "Concluding document missing": "Trūkst noslēguma dokumenta", + "Move {title} up": "Pārvietot {title} uz augšu", + "Move {title} down": "Pārvietot {title} uz leju", + "Close phase": "Slēgt posmu", + "Phase": "Posms", + "Files": "Faili", + "Notes": "Piezīmes", + "Audit trail": "Audita pieraksts", + "Edit phase": "Rediģēt posmu", + "Name": "Nosaukums", + "Budget hours": "Budžeta stundas", + "Could not save the phase. Please try again.": "Posmu neizdevās saglabāt. Mēģiniet vēlreiz.", + "Close phase {title}": "Slēgt posmu {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Posms tiek slēgts ar noslēguma dokumentu: augšupielādējiet to šeit vai izvēlieties kādu no posma failiem.", + "Concluding document": "Noslēguma dokuments", + "This phase has no files yet.": "Šim posmam vēl nav failu.", + "Upload a document": "Augšupielādēt dokumentu", + "The document was not uploaded. Please try again.": "Dokuments netika augšupielādēts. Mēģiniet vēlreiz.", + "Upload the concluding document before you close this phase.": "Augšupielādējiet noslēguma dokumentu pirms šī posma slēgšanas.", + "This phase cannot be closed from its current status.": "Šo posmu nevar slēgt no tā pašreizējā statusa.", + "The phase was not closed. Please try again.": "Posms netika slēgts. Mēģiniet vēlreiz.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Šī posma faila ID, kas to noslēdz. Posmu var pabeigt tikai tad, kad tas ir norādīts un fails pievienots.", + "Import from Microsoft Project": "Importēt no Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Izvēlieties plānu, kas saglabāts no Microsoft Project XML formātā. Nekas netiek importēts, kamēr neapstiprināt.", + "Plan file": "Plāna fails", + "What the import creates": "Ko imports izveido", + "Tasks": "Uzdevumi", + "Sub-tasks": "Apakšuzdevumi", + "Milestones": "Atskaites punkti", + "Links": "Saites", + "Already imported, updated in place: {count}": "Jau importēti, atjaunināti vietā: {count}", + "What does not carry over": "Kas netiek pārnests", + "Tasks with resources, which are not imported: {count}": "Uzdevumi ar resursiem, kas netiek importēti: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Uzdevumi dziļāk par 3. līmeni, novietoti zem sava 2. līmeņa uzdevuma: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Saites, kas nav beigas-sākums, importētas kā saistītas saites: {count}", + "Link lags, which are dropped: {count}": "Saišu nobīdes, kas tiek atmestas: {count}", + "Links to a summary task, which are not imported: {count}": "Saites uz kopsavilkuma uzdevumu, kas netiek importētas: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Saites uz uzdevumiem ārpus šī plāna, kas netiek importētas: {count}", + "No longer in the plan": "Vairs nav plānā", + "These stay in the project; remove them yourself if they are no longer needed.": "Tie paliek projektā; noņemiet tos paši, ja tie vairs nav vajadzīgi.", + "Import": "Importēt", + "Close": "Aizvērt", + "The plan is imported: {created} created, {updated} updated.": "Plāns ir importēts: {created} izveidoti, {updated} atjaunināti.", + "Links that would close a loop were left out: {count}": "Saites, kas noslēgtu ciklu, tika izlaistas: {count}", + "The import stopped part-way. Run it again to finish it.": "Imports apstājās pusceļā. Palaidiet to vēlreiz, lai to pabeigtu.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Saglabājiet plānu Microsoft Project, izvēloties Fails, Saglabāt kā, XML formāts, un importējiet šo failu.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Šis fails deklarē DOCTYPE vai entītijas, kas netiek pieņemtas.", + "The file is larger than 10 MB.": "Fails ir lielāks par 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plānā ir vairāk nekā 2000 uzdevumu, vairāk nekā viens imports pieņem.", + "This file is not a Microsoft Project plan in XML format.": "Šis fails nav Microsoft Project plāns XML formātā.", + "Choose a file to import.": "Izvēlieties failu importēšanai.", + "Only the project owner can import a plan.": "Tikai projekta īpašnieks var importēt plānu.", + "The plan could not be read. Please try again.": "Plānu neizdevās nolasīt. Lūdzu, mēģiniet vēlreiz.", + "Linked case: {title}": "Saistītā lieta: {title}", + "Linked to a case": "Saistīts ar lietu", + "Hand over to case": "Nodot lietai", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Nemainītu kopē katru projekta un tā uzdevumu failu, kā arī failu, kas apraksta projektu, uz saistīto lietu.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Nokopēti faili: {count}", + "Files that failed: {names}": "Neizdevušies faili: {names}", + "The handover failed. Please try again.": "Nodošana neizdevās. Lūdzu, mēģiniet vēlreiz.", + "The linked case could not be found, or you cannot open it.": "Saistītā lieta netika atrasta, vai jūs to nevarat atvērt.", + "Case handovers": "Nodošanas lietai", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Katra reize, kad projekta faili un metadati tika nodoti lietai: kad, kas, kurai lietai, katrs nokopētais fails ar tā SHA-256 un neizdevušies faili.", + "Finance": "Finanses", + "Add cost line": "Pievienot izmaksu rindu", + "Delivery terms": "Piegādes nosacījumi", + "Billing model": "Norēķinu modelis", + "Budget in euro": "Budžets eiro", + "Budget in hours": "Budžets stundās", + "Hourly rate in euro": "Stundas likme eiro", + "Planned start": "Plānotais sākums", + "Planned end": "Plānotās beigas", + "Planned dates": "Plānotie datumi", + "Budget {amount}": "Budžets {amount}", + "No budget agreed": "Budžets nav saskaņots", + "Hours": "Stundas", + "Only the project owner and the portfolio managers see the amounts.": "Summas redz tikai projekta īpašnieks un portfeļa vadītāji.", + "Budget against cost per category": "Budžets pret izmaksām pa kategorijām", + "Labour (booked time)": "Darbs (reģistrētais laiks)", + "No category": "Bez kategorijas", + "Hours are not available": "Stundas nav pieejamas", + "Not yet assigned to a category": "Vēl nav piešķirts kategorijai", + "Total": "Kopā", + "{spent} spent, {remaining} remaining": "{spent} iztērēti, {remaining} atlikuši", + "Budget against cost per phase": "Budžets pret izmaksām pa posmiem", + "No phase": "Bez posma", + "Cost lines": "Izmaksu rindas", + "From the finance system": "No finanšu sistēmas", + "Edit cost line {amount}": "Rediģēt izmaksu rindu {amount}", + "No cost lines yet": "Vēl nav izmaksu rindu", + "Commitments": "Saistības", + "Actual cost": "Faktiskās izmaksas", + "Forecast": "Prognoze", + "Remaining": "Atlikums", + "Not planned yet": "Vēl nav plānots", + "{start} to {end}": "No {start} līdz {end}", + "The terms were not saved. Please try again.": "Nosacījumi netika saglabāti. Mēģiniet vēlreiz.", + "Terms saved": "Nosacījumi saglabāti", + "Fixed price": "Fiksēta cena", + "Hourly": "Pa stundām", + "Not billed": "Netiek rēķināts", + "Commitment": "Saistība", + "Edit cost line": "Rediģēt izmaksu rindu", + "Kind": "Veids", + "Amount in euro": "Summa eiro", + "Remove": "Noņemt", + "Could not save the cost line. Only the project owner changes the money of a project.": "Izmaksu rindu nevarēja saglabāt. Projekta naudu maina tikai projekta īpašnieks.", + "Could not remove the cost line. Please try again.": "Izmaksu rindu nevarēja noņemt. Mēģiniet vēlreiz.", + "{amount} over budget": "{amount} virs budžeta", + "Cost categories": "Izmaksu kategorijas", + "The categories every project splits its budget and costs into, one per line": "Kategorijas, kurās katrs projekts sadala savu budžetu un izmaksas, viena katrā rindā", + "Categories": "Kategorijas", + "Give at least one category, each name once.": "Norādiet vismaz vienu kategoriju, katru nosaukumu vienreiz.", + "Cost categories saved": "Izmaksu kategorijas saglabātas", + "The cost categories were not saved. Please try again.": "Izmaksu kategorijas netika saglabātas. Mēģiniet vēlreiz.", + "Finance line": "Finanšu rinda", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Viena projekta naudas summa: budžets, saistības, faktiskās izmaksas vai prognoze, izmaksu kategorijā un pēc izvēles posmā. To ievada projekta īpašnieks vai nosūta finanšu sistēma, izmantojot integrācijas lietotni.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekts, kuram pieder summa. Tukšs finanšu sistēmas rindai, kuras projekta numurs neatbilst nevienam projektam.", + "The phase this amount belongs to, if any": "Posms, kuram pieder summa, ja tāds ir", + "The cost category, one of the categories the admin set up": "Izmaksu kategorija, viena no administratora iestatītajām kategorijām", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Vai summa ir budžets, saistības, faktiskās izmaksas vai prognoze", + "Amount": "Summa", + "The amount in the reporting currency (euro)": "Summa pārskatu valūtā (eiro)", + "The date the amount was booked or is expected": "Datums, kad summa iegrāmatota vai tiek gaidīta", + "What the amount is for": "Kam paredzēta summa", + "Whether a person entered the line or the finance system sent it": "Vai rindu ievadīja cilvēks vai to nosūtīja finanšu sistēma", + "Entered by hand": "Ievadīts ar roku", + "Finance line id": "Finanšu rindas ID", + "The finance system's own id of this line. One imported line per id.": "Šīs rindas ID finanšu sistēmā. Viena importēta rinda uz ID.", + "Project number": "Projekta numurs", + "The project number the finance system sent, matched against the project key": "Finanšu sistēmas nosūtītais projekta numurs, salīdzināts ar projekta atslēgu", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Rindas projekta portfelis, pārņemts no projekta, lai portfeļa kopsummām pietiktu ar vienu filtru", + "Finance readers": "Finanšu lasītāji", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud lietotāju UID tiem, kas drīkst redzēt summu: projekta īpašnieks un tā portfeļa vadītāji", + "Project owner": "Projekta īpašnieks", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Projekta īpašnieka Nextcloud lietotāja UID; viņš drīkst mainīt un noņemt manuālās rindas", + "How the client pays: not billed, a fixed price, or by the hour.": "Kā klients maksā: netiek rēķināts, fiksēta cena vai pa stundām.", + "Portfolio finance": "Portfeļa finanses", + "You cannot see the money of any project in this portfolio": "Jūs neredzat neviena šī portfeļa projekta naudu", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serveris atgrieza izmaksu rindas no projektiem ārpus šī portfeļa, tāpēc šīs kopsummas var būt nepareizas.", + "Projects left out because you cannot see their money: {count}": "Izlaisti projekti, jo jūs neredzat to naudu: {count}", + "Unmatched finance lines": "Nesasaistītas finanšu rindas", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budžets, saistības, faktiskās izmaksas un prognoze, saskaitītas portfelim.", + "Subprojects": "Apakšprojekti", + "{done} of {total}": "{done} no {total}", + "{done} of {total} tasks done, including subprojects": "Izpildīti {done} no {total} uzdevumiem, ieskaitot apakšprojektus", + "Show the subprojects of {title}": "Rādīt {title} apakšprojektus", + "Hide the subprojects of {title}": "Slēpt {title} apakšprojektus", + "Part of": "Daļa no", + "No parent project": "Nav augstāka projekta", + "A project cannot sit under one of its own subprojects.": "Projekts nevar atrasties zem kāda no saviem apakšprojektiem.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekti ligzdojas ne dziļāk par trim līmeņiem: programma, projekts un apakšprojekts.", + "Parent project": "Augstākais projekts", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekts, zem kura atrodas šis projekts, piemēram, programma. Projekti ligzdojas ne dziļāk par trim līmeņiem.", + "Yes": "Jā", + "No": "Nē", + "{label} (required)": "{label} (obligāts)", + "{label} is required": "{label} ir obligāts", + "Project field": "Projekta lauks", + "A field an admin adds to every project, such as a policy area or a contract value.": "Lauks, ko administrators pievieno katram projektam, piemēram, politikas joma vai līguma vērtība.", + "Key": "Atslēga", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Pastāvīgais nosaukums, ar kuru vērtība tiek saglabāta, lower camel case formā. Saglabājiet to, kad projekti to izmanto.", + "Label": "Etiķete", + "The name people see next to the field": "Nosaukums, ko cilvēki redz blakus laukam", + "What the field holds": "Ko lauks satur", + "Text": "Teksts", + "Number": "Skaitlis", + "Choice": "Izvēle", + "Person": "Persona", + "Yes or no": "Jā vai nē", + "Options": "Opcijas", + "The choices of a choice field": "Izvēles lauka opcijas", + "Required": "Obligāts", + "Whether a project must fill in the field": "Vai projektam jāaizpilda lauks", + "Where the field appears, lowest first": "Kur lauks parādās, mazākais pirmais", + "Applies to": "Attiecas uz", + "What the field is added to": "Kam lauks tiek pievienots", + "Custom fields": "Savi lauki", + "The values of the project fields an admin defined, keyed by the field's key.": "Administratora definēto projekta lauku vērtības pēc lauka atslēgas.", + "Project fields": "Projekta lauki", + "Related": "Saistītie", + "Remove link": "Noņemt saiti", + "Link type": "Saites veids", + "Relates to": "Saistīts ar", + "Duplicates": "Dublē", + "Project key": "Projekta atslēga", + "Every task number starts with it, such as VERG-42.": "Ar to sākas katrs uzdevuma numurs, piemēram, VERG-42.", + "This key is already used by another project.": "Šo atslēgu jau izmanto cits projekts.", + "Use 2 to 10 letters and digits, starting with a letter.": "Izmantojiet 2 līdz 10 burtus un ciparus, sākot ar burtu.", + "The key cannot change once tasks carry it.": "Atslēgu nevar mainīt, kad uzdevumi to jau nes.", + "Project saved. The existing tasks get their numbers in the background.": "Projekts saglabāts. Esošie uzdevumi saņem numurus fonā.", + "Next task number": "Nākamā uzdevuma numurs", + "The number the next task of this project gets in its key. Only the system writes it.": "Numurs, ko nākamais šī projekta uzdevums saņem savā atslēgā. To raksta tikai sistēma.", + "Restore {title}": "Atjaunot {title}", + "Restore": "Atjaunot", + "Project restored": "Projekts atjaunots", + "Could not restore the project": "Projektu neizdevās atjaunot", + "Bring this project back to the active list.": "Atgriezt šo projektu aktīvo projektu sarakstā.", + "Restore project": "Atjaunot projektu", + "Request reason": "Pieprasījuma iemesls", + "Why the requester needs this project. Filled in when the project is requested.": "Kāpēc pieprasītājam šis projekts ir vajadzīgs. Aizpilda pieprasījumā.", + "Reviewed by": "Izskatīja", + "The user who approved or rejected the request.": "Lietotājs, kas pieprasījumu apstiprināja vai noraidīja.", + "Reviewed at": "Izskatīts", + "When the request was approved or rejected.": "Kad pieprasījums tika apstiprināts vai noraidīts.", + "Review note": "Izskatītāja piezīme", + "The reviewer's reason, shown to the requester when a request is not approved.": "Izskatītāja iemesls, ko pieprasītājs redz, ja pieprasījums nav apstiprināts.", + "Members of these groups": "Šo grupu dalībnieki", + "Groups that may create projects": "Grupas, kas drīkst veidot projektus", + "The group {group} no longer exists. Save to remove it.": "Grupa {group} vairs nepastāv. Saglabājiet, lai to noņemtu.", + "Review project request": "Izskatīt projekta pieprasījumu", + "Requested by": "Pieprasīja", + "Why it is needed": "Kāpēc tas vajadzīgs", + "Desired start date": "Vēlamais sākuma datums", + "Why is it not approved?": "Kāpēc tas netiek apstiprināts?", + "Give a reason. The requester sees it.": "Norādiet iemeslu. Pieprasītājs to redzēs.", + "Approve": "Apstiprināt", + "Reject": "Noraidīt", + "Reject request": "Noraidīt pieprasījumu", + "The review was not saved. Try again.": "Izskatīšana netika saglabāta. Mēģiniet vēlreiz.", + "This project is waiting for review": "Šis projekts gaida izskatīšanu", + "This request was not approved": "Šis pieprasījums netika apstiprināts", + "Reason: {note}": "Iemesls: {note}", + "Review request": "Izskatīt pieprasījumu", + "Request a project": "Pieprasīt projektu", + "Step {step} of 2": "{step}. solis no 2", + "Why is this project needed?": "Kāpēc šis projekts ir vajadzīgs?", + "Give a reason. The reviewer reads it.": "Norādiet iemeslu. Izskatītājs to izlasīs.", + "Back": "Atpakaļ", + "Next": "Tālāk", + "Send request": "Nosūtīt pieprasījumu", + "The request was not sent. Try again.": "Pieprasījums netika nosūtīts. Mēģiniet vēlreiz.", + "Requested": "Pieprasīts", + "Not approved": "Nav apstiprināts", + "Your request was sent": "Jūsu pieprasījums ir nosūtīts", + "Let everyone else request a project": "Ļaut visiem pārējiem pieprasīt projektu", + "Add a task": "Pievienot uzdevumu", + "Delete task": "Dzēst uzdevumu", + "Edit task": "Rediģēt uzdevumu", + "Write": "Rakstīt", + "Preview": "Priekšskatījums", + "Markdown works here: headings, lists and links.": "Šeit darbojas Markdown: virsraksti, saraksti un saites.", + "Could not save the task. Please try again.": "Uzdevumu neizdevās saglabāt. Mēģiniet vēlreiz.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Uzdevumam \"{title}\" ir reģistrēts laiks, tāpēc to nevar dzēst. Tā vietā to var atcelt: laika ieraksti paliek.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Dzēst \"{title}\"? Tiek noņemtas arī tā saites ar citiem uzdevumiem. To nevar atsaukt.", + "Keep task": "Paturēt uzdevumu", + "Cancel task": "Atcelt uzdevumu", + "Only the reporter, the project owner or an admin can delete this task.": "Šo uzdevumu var dzēst tikai ziņotājs, projekta īpašnieks vai administrators.", + "Could not delete the task. Please try again.": "Uzdevumu neizdevās dzēst. Mēģiniet vēlreiz.", + "Could not cancel the task. Please try again.": "Uzdevumu neizdevās atcelt. Mēģiniet vēlreiz.", + "Responsible": "Atbildīgais", + "Also working on this": "Pie šī strādā arī", + "Labels": "Etiķetes", + "Could not change the priority. Please try again.": "Prioritāti neizdevās mainīt. Mēģiniet vēlreiz.", + "Other project members who work on this task alongside the person responsible.": "Citi projekta dalībnieki, kas strādā pie šī uzdevuma kopā ar atbildīgo.", + "Duplicate": "Dublēt", + "Could not copy the task. Please try again.": "Uzdevumu neizdevās kopēt. Mēģiniet vēlreiz.", + "Subtasks": "Apakšuzdevumi", + "{done} of {total} done": "Pabeigti {done} no {total}", + "Add a subtask": "Pievienot apakšuzdevumu", + "Checklist": "Kontrolsaraksts", + "Checklist item actions": "Saraksta vienuma darbības", + "Add a checklist item": "Pievienot saraksta vienumu", + "Subtasks: {estimate} estimated, {logged} logged": "Apakšuzdevumi: novērtēts {estimate}, reģistrēts {logged}", + "Total estimate: {total}": "Kopējais novērtējums: {total}", + "Part of {title}": "Daļa no {title}", + "Checklist: {count} done": "Kontrolsaraksts: pabeigti {count}", + "This task has subtasks: {count}.": "Šim uzdevumam ir apakšuzdevumi: {count}.", + "Keep subtasks as separate tasks": "Paturēt apakšuzdevumus kā atsevišķus uzdevumus", + "Delete subtasks too": "Dzēst arī apakšuzdevumus", + "Copy of {title}": "Kopija: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Uzdevums tika nokopēts, bet ne visi tā apakšuzdevumi. Pārbaudiet kopiju.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Nelieli soļi uzdevuma ietvaros. Katram vienumam ir id, teksts un vai tas ir pabeigts.", + "Open work per person and per project.": "Atvērtais darbs pa personām un projektiem.", + "View": "Skats", + "By person": "Pa personām", + "By project": "Pa projektiem", + "Hours left": "Atlikušās stundas", + "Tasks without an estimate": "Uzdevumi bez novērtējuma", + "Due in 14 days": "Termiņš 14 dienu laikā", + "Shared": "Koplietoti", + "Unassigned": "Nepiešķirti", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Rādīts darbs projektos, kurus varat redzēt. Stundas tiek skaitītas atbildīgajai personai; koplietotie uzdevumi tiek skaitīti bez stundām.", + "No open work in these projects.": "Šajos projektos nav atvērta darba.", + "Open work": "Atvērtais darbs", + "{count} open tasks": "Atvērti uzdevumi: {count}", + "Create a project to see capacity here.": "Izveidojiet projektu, lai šeit redzētu noslodzi.", + "My tasks": "Mani uzdevumi", + "Show all my tasks": "Rādīt visus manus uzdevumus", + "No tasks assigned to you": "Jums nav piešķirtu uzdevumu", + "Browse projects": "Pārlūkot projektus", + "Later": "Vēlāk", + "Due {date}": "Termiņš {date}", + "Could not change the status. Please try again.": "Statusu neizdevās mainīt. Mēģiniet vēlreiz.", + "Completed today": "Pabeigti šodien", + "My open tasks": "Mani atvērtie uzdevumi", + "My overdue tasks": "Mani nokavētie uzdevumi", + "My tasks in progress": "Mani uzdevumi procesā", + "Pin to the top": "Piespraust augšā", + "Unpin": "Atspraust", + "Pinned": "Piesprausts", + "Actions for {title}": "Darbības: {title}", + "Could not save your project order. Please try again.": "Projektu secību neizdevās saglabāt. Mēģiniet vēlreiz.", + "No boards yet": "Vēl nav dēļu", + "Create a project to get a board.": "Izveidojiet projektu, lai iegūtu dēli.", + "Use the Projects page to create and manage your projects and tasks.": "Lapā Projekti veidojiet un pārvaldiet savus projektus un uzdevumus.", + "Go to projects": "Uz projektiem", + "You are not a member of any projects yet.": "Jūs vēl neesat neviena projekta dalībnieks.", + "Could not search for users. Please try again.": "Lietotājus neizdevās meklēt. Mēģiniet vēlreiz.", + "Project creation is restricted to administrators.": "Projektus var veidot tikai administratori.", + "Only the project owner or an administrator can delete this project.": "Šo projektu var dzēst tikai projekta īpašnieks vai administrators.", + "No projects are available to you yet. Ask an administrator to create one.": "Jums vēl nav pieejamu projektu. Palūdziet administratoram tādu izveidot.", + "Due: {date}": "Termiņš: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Uzdevumi ar sākuma datumu vai termiņu redzami laika joslā. Pievienojiet datumus, lai tos redzētu šeit.", + "You do not have access to this project.": "Jums nav piekļuves šim projektam.", + "Zoom level": "Tālummaiņas līmenis", + "Unscheduled": "Neplānoti", + "Start: {date}": "Sākums: {date}", + "Today": "Šodien", + "No scheduled tasks": "Nav plānotu uzdevumu", + "An unexpected error occurred.": "Radās neparedzēta kļūda.", + "Column {number} name": "Kolonnas {number} nosaukums", + "Failed to save creation policy": "Izveides noteikumu neizdevās saglabāt", + "All authenticated users": "Visi pieteikušies lietotāji", + "Control who may create new projects": "Nosakiet, kas drīkst veidot jaunus projektus", + "Administrators only": "Tikai administratori", + "Project creation": "Projektu izveide", + "Allow project creation": "Atļaut projektu izveidi", + "Creation policy saved successfully": "Izveides noteikums saglabāts", + "Initializing…": "Notiek palaišana…", + "e.g. 2h 30m, 90m, 1.5h": "piem. 2h 30m, 90m, 1.5h", + "Log time": "Reģistrēt laiku", + "Save estimate": "Saglabāt novērtējumu", + "Logged: {logged}": "Reģistrēts: {logged}", + "over by {amount}": "pārsniegts par {amount}", + "Time tracking": "Laika uzskaite", + "Estimate": "Novērtējums", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Ievadiet derīgu novērtējumu (piem. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Ievadiet derīgu ilgumu (piem. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Laika ierakstu neizdevās saglabāt. Mēģiniet vēlreiz.", + "Edit time entry": "Rediģēt laika ierakstu", + "Duration": "Ilgums", + "Date range": "Periods", + "Last week": "Iepriekšējā nedēļa", + "No time logged": "Nav reģistrēta laika", + "Log time on a task to see it here.": "Reģistrējiet laiku uzdevumam, lai to redzētu šeit.", + "To date": "Līdz datumam", + "This week": "Šī nedēļa", + "Total: {total}": "Kopā: {total}", + "From date": "No datuma", + "Custom range": "Pielāgots periods", + "All time": "Viss laiks", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Uzdevumu neizdevās dzēst, tāpēc dati var palikt. Dzēsiet projektu vēlreiz.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Laika ierakstu neizdevās dzēst, tāpēc dati var palikt. Dzēsiet projektu vēlreiz.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Kolonnu neizdevās dzēst, tāpēc dati var palikt. Dzēsiet projektu vēlreiz.", + "Could not delete the project. Please try again.": "Projektu neizdevās dzēst. Mēģiniet vēlreiz.", + "Notification settings": "Paziņojumu iestatījumi", + "Configure when due-date reminders are sent": "Nosakiet, kad tiek sūtīti termiņu atgādinājumi", + "Due-date reminder lead time (hours)": "Atgādinājuma laiks pirms termiņa (stundas)", + "Lead time must be between 1 and 336 hours": "Laikam jābūt no 1 līdz 336 stundām", + "Reminder lead time saved successfully": "Atgādinājuma laiks saglabāts", + "Failed to save reminder lead time": "Atgādinājuma laiku neizdevās saglabāt", + "Notifications": "Paziņojumi", + "Notify me 1 day before a task's due date": "Paziņot man 1 dienu pirms uzdevuma termiņa", + "Draft": "Melnraksts", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Vai stunda ir melnraksts, ko redz tikai tās skolotājs, notiek vai ir atcelta.", + "New release": "Jauns laidiens", + "Roadmap chart. The same releases and epics are listed below.": "Ceļveža diagramma. Tie paši laidieni un eposi ir uzskaitīti zemāk.", + "Nothing on the roadmap yet": "Ceļvedī vēl nekā nav", + "Releases with a target date and epics with dated tasks appear here.": "Šeit parādās laidieni ar mērķa datumu un eposi ar datētiem uzdevumiem.", + "Releases": "Laidieni", + "No releases yet": "Vēl nav laidienu", + "Target date: {date}": "Mērķa datums: {date}", + "No target date": "Nav mērķa datuma", + "Edit {name}": "Rediģēt {name}", + "Mark {name} as released": "Atzīmēt {name} kā izlaistu", + "Mark as released": "Atzīmēt kā izlaistu", + "Epics": "Eposi", + "No epics yet. Open a task to make it an epic.": "Vēl nav eposu. Atveriet uzdevumu, lai padarītu to par eposu.", + "Not scheduled yet": "Vēl nav ieplānots", + "Planned": "Plānots", + "Released": "Izlaists", + "Edit release": "Rediģēt laidienu", + "Target date": "Mērķa datums", + "Could not save the release. Please try again.": "Laidienu neizdevās saglabāt. Mēģiniet vēlreiz.", + "Every task of this release is done or cancelled.": "Katrs šī laidiena uzdevums ir paveikts vai atcelts.", + "Not finished yet: {count}": "Vēl nav pabeigti: {count}", + "What happens to these tasks?": "Kas notiek ar šiem uzdevumiem?", + "Move to {name}": "Pārvietot uz {name}", + "Remove the release": "Noņemt laidienu", + "Keep it on {name}": "Atstāt tos laidienā {name}", + "Could not mark the release as released. Please try again.": "Laidienu neizdevās atzīmēt kā izlaistu. Mēģiniet vēlreiz.", + "Roadmap": "Ceļvedis", + "Tasks or roadmap": "Uzdevumi vai ceļvedis", + "Release": "Laidiens", + "Epic": "Epos", + "This task is an epic": "Šis uzdevums ir epos", + "A named, dated delivery of a project that its tasks are planned against.": "Projekta nosaukta un datēta piegāde, pret kuru plāno tā uzdevumus.", + "Name of the release": "Laidiena nosaukums", + "The project this release belongs to": "Projekts, kuram pieder šis laidiens", + "What this release delivers": "Ko šis laidiens piegādā", + "When work on the release starts": "Kad sākas darbs pie laidiena", + "The date the release is due": "Datums, līdz kuram laidienam jābūt gatavam", + "Whether the release is planned, released or archived": "Vai laidiens ir plānots, izlaists vai arhivēts", + "Released on": "Izlaists", + "When the release was marked as released": "Kad laidiens tika atzīmēts kā izlaists", + "The release this task is planned for": "Laidiens, kuram šis uzdevums ir plānots", + "Board view options": "Dēļa skata opcijas", + "Colour cards": "Krāsot kartītes", + "No colour": "Bez krāsas", + "By label": "Pēc etiķetes", + "Swimlanes": "Celiņi", + "No swimlanes": "Bez celiņiem", + "By assignee": "Pēc atbildīgā", + "By epic": "Pēc eposa", + "No assignee": "Nav piešķirts", + "No epic": "Bez eposa", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartītes paliek sava eposa rindā. Mainiet eposu uzdevuma lapā.", + "Hand over to": "Nodot", + "Could not save your board view. It applies until you reload.": "Dēļa skatu neizdevās saglabāt. Tas darbojas līdz lapas pārlādei.", + "Timetable wish": "Stundu saraksta vēlme", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Vēlme, ko ģenerators ņem vērā. Stingru vēlmi tas ievēro vienmēr, elastīgu, kur var.", + "Whether the wish is about a teacher, a group, a room or one activity": "Vai vēlme attiecas uz skolotāju, grupu, telpu vai vienu nodarbību", + "Teacher": "Skolotājs", + "Group": "Grupa", + "Reference": "Atsauce", + "The user, group, room or activity the wish is about": "Lietotājs, grupa, telpa vai nodarbība, uz ko vēlme attiecas", + "What the wish asks for": "Ko vēlme prasa", + "Not on these periods": "Ne šajās stundās", + "Preferably not on these periods": "Labāk ne šajās stundās", + "At most a number of lessons a day": "Ne vairāk kā noteikts stundu skaits dienā", + "No free periods between lessons": "Bez brīvstundām starp stundām", + "Always the same room": "Vienmēr tā pati telpa", + "Periods": "Stundas", + "The periods of the week the wish is about, such as wed-5": "Nedēļas stundas, uz kurām vēlme attiecas, piemēram, wed-5", + "Limit": "Robeža", + "The most lessons a day, for a wish of that kind": "Lielākais stundu skaits dienā šāda veida vēlmei", + "Strength": "Stiprums", + "Whether the generator must keep the wish or should keep it": "Vai ģeneratoram vēlme jāievēro vai vajadzētu ievērot", + "Hard": "Stingra", + "Soft": "Elastīga", + "Weight": "Svars", + "How much a soft wish counts, from 1 to 3": "Cik daudz elastīga vēlme sver, no 1 līdz 3", + "Why the wish exists": "Kāpēc vēlme pastāv", + "Timetable scenario": "Stundu saraksta scenārijs", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Viens nedēļas modelis, ko izveidojis ģenerators vai kas ņemts no pašreizējā saraksta. Tas glabā savus ievaddatus un to, cik labi tas ievēro vēlmes.", + "The name timetablers know the scenario by": "Nosaukums, ar kādu sastādītāji zina scenāriju", + "Whether the generator made it or it came from the current timetable": "Vai to izveidoja ģenerators, vai tas nāk no pašreizējā saraksta", + "Generated": "Ģenerēts", + "From the current timetable": "No pašreizējā saraksta", + "Week of": "Nedēļa no", + "The Monday of the first week of the window": "Perioda pirmās nedēļas pirmdiena", + "Window start": "Perioda sākums", + "The first day the week pattern applies to": "Pirmā diena, uz kuru attiecas nedēļas modelis", + "Window end": "Perioda beigas", + "The last day the week pattern applies to": "Pēdējā diena, uz kuru attiecas nedēļas modelis", + "Waiting, generating, done, failed, or published as draft lessons": "Gaida, tiek ģenerēts, gatavs, neizdevās vai publicēts kā melnraksta stundas", + "Waiting": "Gaida", + "Generating": "Tiek ģenerēts", + "Failed": "Neizdevās", + "Published": "Publicēts", + "Seed": "Sēkla", + "The number the generator starts from, so a run can be repeated": "Skaitlis, no kura sāk ģenerators, lai palaišanu varētu atkārtot", + "Input": "Ievaddati", + "The periods, rooms, lessons and wishes the scenario was made from": "Stundas, telpas, nodarbības un vēlmes, no kurām scenārijs izveidots", + "Placements": "Izvietojumi", + "Each lesson with the period and room it was given": "Katra nodarbība ar tai piešķirto stundu un telpu", + "Unplaced lessons": "Neizvietotas nodarbības", + "Lessons without a place, each with the hard wish that blocked it": "Nodarbības bez vietas, katra ar stingro vēlmi, kas to aizkavēja", + "Broken wishes": "Pārkāptās vēlmes", + "The wishes this scenario breaks, with the lessons that break them": "Vēlmes, ko šis scenārijs pārkāpj, ar nodarbībām, kas tās pārkāpj", + "Measures": "Rādītāji", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Izvietotās nodarbības, pārkāptās vēlmes, skolotāju brīvstundas, stundas dienā un telpu izmantojums", + "Reason": "Iemesls", + "Why the run failed": "Kāpēc palaišana neizdevās", + "Published at": "Publicēts", + "When the scenario was written out as draft lessons": "Kad scenārijs tika ierakstīts kā melnraksta stundas", + "Edit wish": "Rediģēt vēlmi", + "New wish": "Jauna vēlme", + "Hard: the generator always keeps it": "Obligāta: ģenerators to vienmēr ievēro", + "Soft: the generator keeps it where it can": "Elastīga: ģenerators to ievēro, kur var", + "Weight (1 to 3)": "Svars (no 1 līdz 3)", + "Most lessons a day": "Ne vairāk stundu dienā", + "Period": "Stunda", + "{day} period {number}": "{day} {number}. stunda", + "Teacher (user name)": "Skolotājs (lietotājvārds)", + "Activity (group:subject)": "Aktivitāte (grupa:priekšmets)", + "Say who or what the wish is about.": "Norādiet, uz ko vēlme attiecas.", + "Choose at least one period.": "Izvēlieties vismaz vienu stundu.", + "The limit is a whole number of 1 or more.": "Ierobežojums ir vesels skaitlis, 1 vai vairāk.", + "Timetable": "Stundu saraksts", + "Wishes": "Vēlmes", + "Timetable wishes": "Stundu saraksta vēlmes", + "Generator run": "Ģeneratora palaišana", + "Generator progress": "Ģeneratora progress", + "The run failed: {reason}": "Palaišana neizdevās: {reason}", + "{placed} of {lessons} lessons placed": "Izvietotas {placed} no {lessons} stundām", + "Generate again": "Ģenerēt vēlreiz", + "Generate": "Ģenerēt", + "Every lesson has a place.": "Katrai stundai ir vieta.", + "Lesson": "Stunda", + "No free period and room": "Nav brīvas stundas un telpas", + "Broken soft wishes": "Pārkāptās elastīgās vēlmes", + "Every soft wish is kept.": "Katra elastīgā vēlme ir ievērota.", + "Wish": "Vēlme", + "Lessons": "Stundas", + "Generating: {percent}% of the time budget used": "Ģenerē: izmantoti {percent}% laika", + "Waiting to start": "Gaida sākumu", + "Published as draft lessons": "Publicēts kā stundu melnraksti", + "Could not read the scenario.": "Scenāriju neizdevās nolasīt.", + "Could not start the run.": "Palaišanu neizdevās sākt.", + "Scenarios": "Scenāriji", + "Timetable scenarios": "Stundu saraksta scenāriji", + "Scenario": "Scenārijs", + "Take the current timetable": "Pārņemt pašreizējo stundu sarakstu", + "Could not take the current timetable.": "Neizdevās pārņemt pašreizējo stundu sarakstu.", + "Broken hard wishes": "Pārkāptās obligātās vēlmes", + "Not on a period of the week grid": "Nav nedēļas režģa stundā", + "Compare scenarios": "Salīdzināt scenārijus", + "Scenarios to compare": "Salīdzināmie scenāriji", + "Choose two or three scenarios to compare them.": "Izvēlieties divus vai trīs scenārijus salīdzināšanai.", + "Measure": "Rādītājs", + "Best": "Labākais", + "Lessons that differ": "Atšķirīgās stundas", + "No lesson differs.": "Neviena stunda neatšķiras.", + "Not placed": "Nav izvietota", + "{period} in {room}": "{period} telpā {room}", + "Lessons placed": "Izvietotās stundas", + "Lessons without a place": "Stundas bez vietas", + "Clashes": "Konflikti", + "Hard wishes broken": "Pārkāptās obligātās vēlmes", + "Soft wishes broken": "Pārkāptās elastīgās vēlmes", + "Soft wishes broken, weighted": "Pārkāptās elastīgās vēlmes, svērtas", + "Free periods between lessons, all teachers": "Brīvstundas, visi skolotāji", + "Most free periods of one teacher": "Viena skolotāja visvairāk brīvstundu", + "Most lessons of one group on a day": "Vienas grupas visvairāk stundu dienā", + "Room use": "Telpu izmantojums", + "Publish as draft lessons": "Publicēt kā melnraksta stundas", + "Draft lessons written: {count}": "Uzrakstītas melnraksta stundas: {count}", + "Could not publish the scenario.": "Neizdevās publicēt scenāriju.", + "Rules": "Noteikumi", + "Rules for {column}": "Kolonnas {column} noteikumi", + "When a card enters this column": "Kad kartīte nonāk šajā kolonnā", + "Action": "Darbība", + "Set the priority": "Iestatīt prioritāti", + "Assign to": "Piešķirt", + "Assign the person who moved the card": "Piešķirt personai, kas pārvietoja kartīti", + "Remove the assignee": "Noņemt atbildīgo", + "Add a label": "Pievienot etiķeti", + "No longer a project member": "Vairs nav projekta dalībnieks", + "This label no longer exists": "Šī etiķete vairs nepastāv", + "Add rule": "Pievienot noteikumu", + "Remove rule": "Noņemt noteikumu", + "No rules yet. Add one to change a card when it enters this column.": "Noteikumu vēl nav. Pievienojiet noteikumu, kas maina kartīti, kad tā nonāk šajā kolonnā.", + "Could not save the rules. Please try again.": "Noteikumus neizdevās saglabāt. Mēģiniet vēlreiz.", + "1 rule runs when a card enters this column": "1 noteikums darbojas, kad kartīte nonāk šajā kolonnā", + "{count} rules run when a card enters this column": "Noteikumi, kas darbojas, kad kartīte nonāk šajā kolonnā: {count}", + "Rules applied: {changes}": "Piemēroti noteikumi: {changes}", + "assigned to {name}": "piešķirts: {name}", + "assignee removed": "atbildīgais noņemts", + "priority {priority}": "prioritāte {priority}", + "label {label}": "etiķete {label}", + "What happens to a card when it enters this column, applied in list order.": "Kas notiek ar kartīti, kad tā nonāk šajā kolonnā, saraksta secībā.", + "Value": "Vērtība", + "What the rule does to the card.": "Ko noteikums dara ar kartīti.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioritāte, lietotāja ID vai etiķetes ID, ko izmanto darbība; tukšs darbībām bez vērtības.", + "is not": "nav", + "{dimension} is not": "{dimension} nav", + "Saved filters": "Saglabātie filtri", + "No saved filters yet": "Saglabātu filtru vēl nav", + "Save filter": "Saglabāt filtru", + "Rename \"{name}\"": "Pārdēvēt “{name}”", + "Delete \"{name}\"": "Dzēst “{name}”", + "Clear filters": "Notīrīt filtrus", + "Showing {shown} of {total} tasks": "Rāda {shown} no {total} uzdevumiem", + "Me": "Es", + "No date": "Bez datuma", + "Rename saved filter": "Pārdēvēt saglabāto filtru", + "Share with the project": "Kopīgot ar projektu", + "Give the filter a name": "Piešķiriet filtram nosaukumu", + "Could not save the filter. Please try again.": "Filtru neizdevās saglabāt. Mēģiniet vēlreiz.", + "Some labels in \"{name}\" no longer exist and were left out.": "Dažas etiķetes filtrā “{name}” vairs nepastāv un tika izlaistas.", + "Could not delete the filter. Please try again.": "Filtru neizdevās izdzēst. Mēģiniet vēlreiz.", + "Saved filter": "Saglabāts filtrs", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Viena projekta nosaukts dēļa filtrs, privāts tā saglabātājam, ja vien tas nav kopīgots ar projektu.", + "The project whose board the filter applies to": "Projekts, kura dēlim filtrs paredzēts", + "The name the filter is listed under": "Nosaukums, ar kuru filtrs ir sarakstā", + "Saved by": "Saglabāja", + "Nextcloud user id of the person who saved the filter": "Filtra saglabātāja Nextcloud lietotāja ID", + "Shared with the project": "Kopīgots ar projektu", + "Whether every project member sees and applies the filter": "Vai katrs projekta dalībnieks redz un var lietot filtru", + "Criteria": "Kritēriji", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtrs: atbildīgais, etiķete, prioritāte un termiņš, katrs ar ir vai nav un vērtībām", + "Cross-project view": "Starpprojektu skats", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Saglabāta projektu izlase, kuras uzdevumi tiek rādīti kopā statusa joslās, kopīgota ar tajā nosauktajām personām.", + "Shared with": "Kopīgots ar", + "The name the view is listed under": "Nosaukums, ar kādu skats ir uzskaitīts", + "Nextcloud user id of the person who saved the view": "Tās personas Nextcloud lietotāja ID, kura saglabāja skatu", + "Nextcloud user ids of the people the view is shared with": "To personu Nextcloud lietotāju ID, ar kurām skats ir kopīgots", + "The projects whose tasks the view shows, at most twenty": "Projekti, kuru uzdevumus skats rāda, ne vairāk kā divdesmit", + "1 project in this view is hidden from you.": "1 šī skata projekts tev ir paslēpts.", + "{count} projects in this view are hidden from you.": "{count} šī skata projekti tev ir paslēpti.", + "{project} has no column for {status}.": "Projektam {project} nav kolonnas statusam {status}.", + "This view does not exist or is not shared with you.": "Šis skats nepastāv vai nav kopīgots ar tevi.", + "\"{task}\" moved to {status}.": "\"{task}\" pārvietots uz {status}.", + "Project: {title}": "Projekts: {title}", + "Cross-project views": "Starpprojektu skati", + "New view": "Jauns skats", + "Edit view": "Rediģēt skatu", + "Delete view": "Dzēst skatu", + "Give the view a name": "Piešķir skatam nosaukumu", + "Pick at least one project": "Izvēlies vismaz vienu projektu", + "A view shows at most {max} projects": "Skats rāda ne vairāk kā {max} projektus", + "Could not save the view. Please try again.": "Neizdevās saglabāt skatu. Mēģini vēlreiz.", + "Could not delete the view. Please try again.": "Neizdevās dzēst skatu. Mēģini vēlreiz.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Dzēst \"{title}\"? Projekti un to uzdevumi paliek nemainīti.", + "People see the tasks of the projects they are in, never more.": "Katrs redz tikai to projektu uzdevumus, kuros piedalās.", + "No views yet. A view shows the tasks of several of your projects together.": "Skatu vēl nav. Skats rāda vairāku tavu projektu uzdevumus kopā.", + "Projects in view: {count}": "Projekti skatā: {count}", + "Notify me when a task is assigned to me": "Paziņot man, kad man tiek piešķirts uzdevums", + "Also send these to me by email": "Sūtīt tos man arī e-pastā", + "Add an email address in your Nextcloud personal settings to get mail.": "Pievieno e-pasta adresi savos Nextcloud personiskajos iestatījumos, lai saņemtu e-pastu.", + "Code link": "Koda saite", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Komits, zars, sapludināšanas pieprasījums vai problēma koda platformā, kas attiecas uz uzdevumu.", + "The task the link belongs to": "Uzdevums, kuram pieder saite", + "The project of the task": "Uzdevuma projekts", + "Task key": "Uzdevuma atslēga", + "The task key the forge text named, such as VC-12": "Uzdevuma atslēga, ko minēja koda platformas teksts, piemēram, VC-12", + "What the link points at": "Uz ko norāda saite", + "Link": "Saite", + "The address of the item in the forge": "Vienuma adrese koda platformā", + "The commit message, branch name or merge request title": "Komita ziņojums, zara nosaukums vai sapludināšanas pieprasījuma virsraksts", + "Repository": "Repozitorijs", + "The repository, such as acme/portal": "Repozitorijs, piemēram, acme/portal", + "Forge id": "Id platformā", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Vienuma paša id koda platformā, piemēram, github:acme/portal#42 vai komita jaucējkods", + "State": "Stāvoklis", + "The state of a merge request or issue": "Sapludināšanas pieprasījuma vai problēmas stāvoklis", + "Who made the commit or opened the merge request": "Kas veica komitu vai atvēra sapludināšanas pieprasījumu", + "When the commit was made or the merge request last changed": "Kad tika veikts komits vai pēdējoreiz mainījās sapludināšanas pieprasījums", + "Added by": "Pievienoja", + "Whether a person added the link or the integration wrote it": "Vai saiti pievienoja cilvēks vai to ierakstīja integrācija", + "Nextcloud user UIDs of project members": "Projekta dalībnieku Nextcloud lietotāju ID", + "Add link": "Pievienot saiti", + "Added by hand": "Pievienots manuāli", + "Branch": "Zars", + "Code": "Kods", + "Commit": "Komits", + "From the integration": "No integrācijas", + "Link to a commit, branch or merge request": "Saite uz komitu, zaru vai sapludināšanas pieprasījumu", + "Merge request": "Sapludināšanas pieprasījums", + "Merged": "Sapludināts", + "No code linked yet. Name {key} in a commit message or paste a link.": "Kods vēl nav piesaistīts. Nosauciet {key} komita ziņojumā vai ielīmējiet saiti.", + "No code linked yet. Paste a link to a commit or merge request.": "Kods vēl nav piesaistīts. Ielīmējiet saiti uz komitu vai sapludināšanas pieprasījumu.", + "Paste a web address that starts with https://.": "Ielīmējiet tīmekļa adresi, kas sākas ar https://.", + "Remove link {title}": "Noņemt saiti {title}", + "The link could not be added.": "Saiti neizdevās pievienot.", + "The link could not be removed.": "Saiti neizdevās noņemt.", + "This link is already on the task.": "Šī saite jau ir pie uzdevuma.", + "Code forges": "Koda platformas", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Piesaistiet GitHub komitus un pull request uzdevumiem. Integriq saņem notikumus; planninq nekad neizsauc GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Lejupielādējiet konfigurāciju un importējiet to Integriq. Pēc tam ierakstiet noslēpumu noteikumā \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "GitHub pievienojiet repozitorijam webhook ar šo adresi un to pašu noslēpumu. Izvēlieties satura tipu application/json un notikumus push un pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nosauciet uzdevuma atslēgu, piemēram, VC-12, komita ziņojumā, zara nosaukumā vai pull request virsrakstā. Saite tad parādās pie šī uzdevuma.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriq projekta dalībnieki joprojām var ielīmēt saiti uzdevuma lapā.", + "Download the Integriq configuration": "Lejupielādēt Integriq konfigurāciju", + "Calendar": "Kalendārs", + "Previous": "Iepriekšējais", + "Calendar view": "Kalendāra skats", + "Starts:": "Sākas:", + "No tasks with a date in this month.": "Šajā mēnesī nav uzdevumu ar datumu.", + "Week of {start} to {end}": "Nedēļa no {start} līdz {end}", + "My calendar": "Mans kalendārs", + "Show as list": "Rādīt kā sarakstu", + "Show as calendar": "Rādīt kā kalendāru", + "Open my calendar": "Atvērt manu kalendāru", + "Nextcloud Tasks": "Nextcloud uzdevumi", + "Show my tasks in Nextcloud Tasks": "Rādīt manus uzdevumus Nextcloud uzdevumos", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Jums piešķirtie vai ar jums kopīgotie uzdevumi parādās sarakstā \"Planninq\" Nextcloud uzdevumos un kalendārā. Tur veiktās izmaiņas tiek aizstātas ar nākamo izmaiņu Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Šis serveris nevar rakstīt Nextcloud uzdevumos, tāpēc eksports nav pieejams.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Pārvalda Planninq. Šeit veiktās izmaiņas tiek aizstātas ar nākamo izmaiņu Planninq.", + "Working days and holidays": "Darba dienas un svētku dienas", + "Dates set on the timeline skip the days that are not working days.": "Laika joslā iestatītie datumi izlaiž dienas, kas nav darba dienas.", + "Working weekdays": "Nedēļas darba dienas", + "Non-working days": "Brīvdienas", + "No non-working days yet.": "Brīvdienu vēl nav.", + "Add day": "Pievienot dienu", + "Year": "Gads", + "Add Dutch national holidays": "Pievienot Nīderlandes valsts svētkus", + "Save working days": "Saglabāt darba dienas", + "Choose at least one working weekday.": "Izvēlieties vismaz vienu darba dienu.", + "Working days saved.": "Darba dienas saglabātas.", + "Could not save the working days.": "Darba dienas neizdevās saglabāt.", + "New Year's Day": "Jaungada diena", + "Easter Sunday": "Lieldienas", + "Easter Monday": "Otrās Lieldienas", + "King's Day": "Karaļa diena", + "Liberation Day": "Atbrīvošanas diena", + "Ascension Day": "Debesbraukšanas diena", + "Whit Sunday": "Vasarsvētki", + "Whit Monday": "Otrie Vasarsvētki", + "Christmas Day": "Ziemassvētki", + "Boxing Day": "Otrie Ziemassvētki", + "Dates of {title}": "{title} datumi", + "The due date cannot be before the start date.": "Termiņš nevar būt pirms sākuma datuma.", + "{title}, from {start} to {end}": "{title}, no {start} līdz {end}", + "The dates could not be saved.": "Datumus neizdevās saglabāt.", + "{title} now runs from {start} to {end}": "{title} tagad ilgst no {start} līdz {end}", + "Auto-scheduling": "Automātiska plānošana", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Ja ieslēgts, termiņa pārcelšana vēlāk laika joslā piedāvā pārcelt arī tā bloķētos uzdevumus.", + "Move blocked tasks along when a task slips": "Pārcelt bloķētos uzdevumus, kad uzdevums kavējas", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Laika joslā vēlāks termiņš piedāvā pārcelt bloķētos uzdevumus. Skaitās tikai saites \"bloķē\", un uzdevumi tiek pārcelti tikai uz vēlāku laiku.", + "Move the tasks that wait for {title}?": "Vai pārcelt uzdevumus, kas gaida {title}?", + "These tasks wait for it and would start after its new due date:": "Šie uzdevumi to gaida un sāktos pēc jaunā termiņa:", + "{count} tasks would move; the first {limit} are listed.": "Tiktu pārcelti {count} uzdevumi; parādīti pirmie {limit}.", + "Now": "Tagad", + "After the move": "Pēc pārcelšanas", + "Only this task": "Tikai šis uzdevums", + "Move all": "Pārcelt visus", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Apturēts pie {title}: datumus neizdevās saglabāt. Uzdevumi pirms tā tika pārcelti.", + "Cumulative flow": "Kumulatīvā plūsma", + "Show as chart": "Rādīt kā diagrammu", + "Show as table": "Rādīt kā tabulu", + "Tasks per column per day": "Uzdevumi kolonnā dienā", + "Tasks without recorded history in this period: {count}": "Uzdevumi bez reģistrētas vēstures šajā periodā: {count}", + "Lead and cycle time": "Izpildes laiks un cikla laiks", + "No tasks were finished in this period.": "Šajā periodā netika pabeigts neviens uzdevums.", + "Finished tasks": "Pabeigtie uzdevumi", + "Cycle time, average": "Cikla laiks, vidēji", + "Cycle time, 85th percentile": "Cikla laiks, 85. procentile", + "Lead time, average": "Izpildes laiks, vidēji", + "Tasks whose finish time was estimated from their history: {count}": "Uzdevumi, kuru beigu laiks novērtēts no vēstures: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Katra pabeigtā uzdevuma cikla laiks ar vidējo un 85. procentili", + "Slowest tasks": "Lēnākie uzdevumi", + "cycle {cycle}, lead {lead}": "cikls {cycle}, izpilde {lead}", + "{days} days": "{days} dienas", + "Could not load the flow of this project.": "Neizdevās ielādēt šī projekta plūsmu.", + "Last {days} days": "Pēdējās {days} dienas", + "Portfolio flow": "Portfeļa plūsma", + "An admin adds portfolios under Projects, Portfolios.": "Administrators pievieno portfeļus sadaļā Projekti, Portfeļi.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Neparādītie projekti, jo vienlaikus tiek rādīti ne vairāk kā 50: {count}", + "Could not load the flow of this portfolio.": "Neizdevās ielādēt šī portfeļa plūsmu.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulatīvā plūsma un cikla laiks portfeļa projektos.", + "Edit report": "Rediģēt atskaiti", + "Only tasks where": "Tikai uzdevumi, kur", + "Group by": "Grupēt pēc", + "Display": "Skats", + "Share with everyone who can read its projects": "Kopīgot ar visiem, kas var lasīt tās projektus", + "The report could not be saved.": "Atskaiti neizdevās saglabāt.", + "Number of tasks": "Uzdevumu skaits", + "Bar": "Stabiņi", + "Donut": "Gredzens", + "Table": "Tabula", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} no {total} projektiem šajā atskaitē jums nav redzami", + "No tasks match this report.": "Neviens uzdevums neatbilst šai atskaitei.", + "None": "Nav", + "Could not load this report.": "Šo atskaiti neizdevās ielādēt.", + "Report": "Atskaite", + "Your reports": "Jūsu atskaites", + "My reports": "Manas atskaites", + "Shared reports": "Kopīgotās atskaites", + "You have not built a report yet.": "Jūs vēl neesat izveidojis atskaiti.", + "Nobody has shared a report with you yet.": "Neviens vēl nav kopīgojis ar jums atskaiti.", + "Reports you built over tasks, and the ones shared with you.": "Atskaites, ko izveidojāt par uzdevumiem, un tās, kas kopīgotas ar jums.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Saglabāts vaicājums par uzdevumiem: kuri projekti, kuri filtri, grupēts pēc kā, saskaitīts vai summēts, un rādīts kā tabula vai diagramma.", + "The name the report is listed under": "Nosaukums, ar kuru atskaite ir sarakstā", + "What the report shows and who it is for": "Ko atskaite rāda un kam tā paredzēta", + "Nextcloud user id of the person who saved the report": "Atskaiti saglabājušās personas Nextcloud lietotāja ID", + "Who can open the report": "Kas var atvērt atskaiti", + "Only me": "Tikai es", + "Everyone who can read its projects": "Visi, kas var lasīt tās projektus", + "The projects the report covers, at most fifty": "Projekti, ko atskaite aptver, ne vairāk kā piecdesmit", + "Filters": "Filtri", + "Task fields and the value each must equal": "Uzdevuma lauki un vērtība, kurai katram jābūt vienādam", + "The task field the report groups on": "Uzdevuma lauks, pēc kura atskaite grupē", + "Count the tasks, or add up a number on them": "Saskaitīt uzdevumus vai summēt skaitli tajos", + "Sum": "Summa", + "Sum of": "Summa no", + "The number added up when the measure is a sum": "Skaitlis, ko summē, ja mērs ir summa", + "Story points": "Stāsta punkti", + "Estimated duration": "Paredzamais ilgums", + "How the report is shown": "Kā atskaite tiek rādīta", + "Issue type": "Pieteikuma veids", + "Task fields and the value each must equal; empty when the report covers every task": "Uzdevuma lauki un vērtība, kāda katram jābūt; tukšs, ja atskaite aptver visus uzdevumus", + "The status a task must have": "Statuss, kāds uzdevumam jābūt", + "The priority a task must have": "Prioritāte, kāda uzdevumam jābūt", + "The user a task must be assigned to": "Lietotājs, kuram uzdevumam jābūt piešķirtam", + "A label a task must carry": "Etiķete, kāda uzdevumam jābūt", + "The board column a task must be in": "Dēļa kolonna, kurā uzdevumam jābūt", + "The issue type a task must have": "Pieteikuma veids, kāds uzdevumam jābūt", + "Manager groups": "Vadītāju grupas", + "Member groups": "Dalībnieku grupas", + "Viewer groups": "Lasītāju grupas", + "Viewers": "Lasītāji", + "Owning group": "Īpašnieku grupa", + "Nextcloud groups whose members manage the project": "Nextcloud grupas, kuru dalībnieki vada projektu", + "Nextcloud groups whose members work on the project": "Nextcloud grupas, kuru dalībnieki strādā projektā", + "Nextcloud groups whose members may read the project": "Nextcloud grupas, kuru dalībnieki drīkst lasīt projektu", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud lietotāji, kas vada projektu: iestatījumus, dalībniekus un darbu", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud lietotāji, kas drīkst lasīt projektu un tā darbu, bet ne mainīt", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud grupa, kurai projekts pieder kopā ar tā izveidotāju, ne vairāk kā viena", + "Nextcloud user ids who may read this through the project": "Nextcloud lietotāji, kas drīkst lasīt šo caur projektu", + "Nextcloud groups whose members may change this through the project": "Nextcloud grupas, kuru dalībnieki drīkst mainīt šo caur projektu", + "Nextcloud groups whose members may read this through the project": "Nextcloud grupas, kuru dalībnieki drīkst lasīt šo caur projektu", + "Search for a person or a group…": "Meklēt personu vai grupu…", + "No one found. Your admin's sharing settings decide who you can find.": "Neviens netika atrasts. Tava administratora koplietošanas iestatījumi nosaka, ko vari atrast.", + "Type at least two characters": "Ievadi vismaz divas rakstzīmes", + "Everyone in this group": "Visi šajā grupā", + "Could not search for people. Please try again.": "Neizdevās meklēt personas. Mēģini vēlreiz.", + "Could not remove the group": "Neizdevās noņemt grupu", + "Only the owner and managers change who is on this project.": "Tikai īpašnieks un pārvaldnieki maina, kas ir šajā projektā.", + "Role of {name}": "{name} loma", + "Manager": "Pārvaldnieks", + "Member": "Dalībnieks", + "Viewer": "Lasītājs", + "Could not change the role": "Neizdevās mainīt lomu", + "Owned by group: {name}": "Pieder grupai: {name}", + "No group owns this project.": "Neviena grupa nav šī projekta īpašniece.", + "Owned by group": "Pieder grupai", + "Search for a group…": "Meklēt grupu…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Grupa netika atrasta. Jūsu administratora koplietošanas iestatījumi nosaka, kuras grupas varat atrast.", + "No owning group": "Nav īpašnieku grupas", + "Could not search for groups. Please try again.": "Neizdevās meklēt grupas. Mēģiniet vēlreiz.", + "Could not change the owning group": "Neizdevās mainīt īpašnieku grupu", + "You can read this project. Only its members change it.": "Jūs varat lasīt šo projektu. To maina tikai tā dalībnieki.", + "Course": "Kurss", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurss, kas tiek mācīts šajā stundā, piemēram, izvēles priekšmets, ja skolas mācību lietotne to zina.", + "Online meeting link": "Tiešsaistes stundas saite", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kur skolēni pievienojas šai stundai tiešsaistē. Poga Pievienoties tiek rādīta tikai https saitei." }, "plurals": null } diff --git a/l10n/mk.js b/l10n/mk.js index 8331fbc9..31c9588a 100644 --- a/l10n/mk.js +++ b/l10n/mk.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Активни проекти", + "Archived projects": "Архивирани проекти", + "Boards": "Табли", + "My projects": "Мои проекти", + "Portfolio": "Портфолио", + "Project board": "Табла на проектот", + "Projects I am in": "Проекти во кои учествувам", + "Timeline": "Временска линија", + "Timesheet": "Евиденција на време", + "Features & roadmap": "Функции и патоказ", + "Flow": "Тек", + "Flows": "Текови", + "Reports": "Извештаи", + "Pick a report to open it.": "Изберете извештај за да го отворите.", + "In progress": "Во тек", + "Date": "Датум", + "Due": "Рок", + "Assignee": "Доделено", + "Who": "Кој", + "What": "Што", + "Minutes": "Минути", + "Entries": "Записи", + "Most recent": "Најнови", + "Per person": "По лице", + "By status": "По статус", + "By priority": "По приоритет", + "Task status": "Статус на задачи", + "Time spent": "Потрошено време", + "Capacity": "Капацитет", + "Due soonest": "Најблизок рок", + "Minutes logged": "Запишани минути", + "Nothing is due": "Ништа не доспева", + "Nothing logged yet": "Сè уште ништо не е запишано", + "What is open, what is blocked, and what is overdue.": "Што е отворено, што е блокирано и што доцни.", + "How allocation is spread across the people working on projects.": "Како е распоредено оптоварувањето меѓу луѓето на проекти.", + "Hours logged, and the projects they went to.": "Запишаните часови и проектите на кои отишле.", + "Billable": "Наплатливо", + "Budget: {amount}": "Буџет: {amount}", + "Loading projects": "Се вчитуваат проекти", + "No projects for this client yet": "Сè уште нема проекти за овој клиент", + "Open in Planninq": "Отвори во Planninq", + "This project could not be found": "Овој проект не е пронајден", + "Untitled project": "Проект без наслов", + "and {count} more": "и уште {count}", + "Store": "Продавница", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Инсталирајте регистри, шеми и текови објавени од други организации.", + "Work Date": "Датум на работа", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Дејства на колоната", + "Columns": "Колони", + "Could not remove the column. Please try again.": "Колоната не може да се отстрани. Обидете се повторно.", + "Could not save the column. Please try again.": "Колоната не може да се зачува. Обидете се повторно.", + "Done column": "Колона за завршени", + "Edit column": "Уреди колона", + "Keep the card's status": "Задржи го статусот на картичката", + "Move its cards to": "Премести ги нејзините картички во", + "Move left": "Помести лево", + "Move right": "Помести десно", + "Status of cards moved here": "Статус на картичките преместени овде", + "The last done column cannot be removed.": "Последната колона за завршени не може да се отстрани.", + "WIP limit": "WIP ограничување", + "over limit": "над ограничувањето", + "The status a card gets when it is moved into this column.": "Статусот што го добива картичката кога ќе се премести во оваа колона.", + "All priorities": "Сите приоритети", + "Could not create the task. Please try again.": "Задачата не може да се создаде. Обидете се повторно.", + "Created": "Создадено", + "Move to backlog": "Во заостатокот", + "Move to board": "На таблата", + "New task": "Нова задача", + "Nothing in the backlog": "Нема ништо во заостатокот", + "Rank": "Ранг", + "Sort by": "Подреди по", + "Sort by rank to reorder": "Подредете по ранг за да го промените редоследот", + "Task actions": "Дејства на задачата", + "All labels": "Сите ознаки", + "Filter tasks by label": "Филтрирај задачи по ознака", + "View timeline": "Прикажи временска линија", + "Board": "Табла", + "List": "Листа", + "Column": "Колона", + "Board or list": "Табла или листа", + "Log": "Дневник", + "Add entry": "Додај запис", + "Show": "Прикажи", + "No actions yet": "Сѐ уште нема дејства", + "Closed": "Затворено", + "Entry actions": "Дејства на записот", + "Add action": "Додај дејство", + "by {author}": "од {author}", + "saved {time}": "зачувано {time}", + "Attendees: {names}": "Присутни: {names}", + "Add the first entry": "Додај го првиот запис", + "Issues": "Проблеми", + "Lessons learned": "Научени лекции", + "Meetings": "Состаноци", + "Decisions": "Одлуки", + "Actions": "Дејства", + "Issue": "Проблем", + "Lesson learned": "Научена лекција", + "Meeting": "Состанок", + "Decision": "Одлука", + "About this project": "За овој проект", + "No description yet": "Сѐ уште нема опис", + "Start date": "Датум на почеток", + "Not set": "Не е поставено", + "End date": "Датум на крај", + "Progress": "Напредок", + "No tasks yet": "Сѐ уште нема задачи", + "Open the board": "Отвори ја таблата", + "People": "Луѓе", + "Owner": "Сопственик", + "Latest log entries": "Најнови записи", + "Open the log": "Отвори го дневникот", + "{done} of {total} tasks done": "Завршени {done} од {total} задачи", + "Edit entry": "Уреди запис", + "Type": "Вид", + "Attendees": "Присутни", + "Issue is closed": "Проблемот е затворен", + "Could not save the entry. Please try again.": "Записот не може да се зачува. Обидете се повторно.", + "From: {title}": "Од: {title}", + "What needs to happen": "Што треба да се направи", + "Could not create the action. Please try again.": "Дејството не може да се создаде. Обидете се повторно.", + "The action was created but could not be linked to the entry.": "Дејството е создадено, но не може да се поврзе со записот.", + "Project pages": "Страници на проектот", + "Overview": "Преглед", + "Risks": "Ризици", + "Log entry": "Запис во дневник", + "A short name for the entry": "Краток назив за записот", + "Project": "Проект", + "The project this entry belongs to": "Проектот на кој му припаѓа записот", + "What kind of entry this is": "Каков вид запис е ова", + "When it happened": "Кога се случило", + "What happened, in Markdown": "Што се случило, во Markdown", + "Whether an issue is still open": "Дали проблемот е сѐ уште отворен", + "The people at a meeting": "Луѓето на состанок", + "Tasks that came out of this entry": "Задачи што произлегоа од овој запис", + "Add risk": "Додај ризик", + "Risk": "Ризик", + "Score": "Оценка", + "Response": "Одговор", + "Review date": "Датум на преглед", + "no longer on the project": "повеќе не е во проектот", + "Edit {title}": "Уреди {title}", + "No risks recorded yet": "Сѐ уште нема запишани ризици", + "Add the first risk": "Додај го првиот ризик", + "Medium": "Средно", + "Mitigating": "Се ублажува", + "Occurred": "Настапи", + "Avoid": "Избегни", + "Reduce": "Намали", + "Transfer": "Префрли", + "Accept": "Прифати", + "Highest open risks": "Највисоки отворени ризици", + "No open risks": "Нема отворени ризици", + "Open the risk register": "Отвори го регистарот на ризици", + "Edit risk": "Уреди ризик", + "What could go wrong": "Што може да тргне наопаку", + "Likelihood": "Веројатност", + "Impact": "Влијание", + "Score {score}": "Оценка {score}", + "Countermeasures": "Противмерки", + "Could not save the risk. Please try again.": "Ризикот не може да се зачува. Обидете се повторно.", + "Risks by likelihood and impact": "Ризици според веројатност и влијание", + "Risk scale": "Скала на ризик", + "The levels every project scores its risks on, and where low turns into medium and high": "Нивоата на кои секој проект ги оценува своите ризици, и каде ниско преминува во средно и високо", + "Number of levels": "Број на нивоа", + "Likelihood labels": "Ознаки за веројатност", + "Impact labels": "Ознаки за влијание", + "Level {level}": "Ниво {level}", + "Medium from score": "Средно од оценка", + "High from score": "Високо од оценка", + "Risk scale saved": "Скалата на ризик е зачувана", + "1 risk uses level {level}. Change it first.": "1 ризик го користи нивото {level}. Прво сменете го.", + "{count} risks use level {level}. Change them first.": "Ризици што го користат нивото {level}: {count}. Прво сменете ги.", + "Every level needs a label, and high must start above medium.": "Секое ниво треба ознака, а високо мора да почне над средно.", + "The project this risk belongs to": "Проектот на кој му припаѓа ризикот", + "The cause and the effect, in Markdown": "Причината и последицата, во Markdown", + "Category": "Категорија", + "A free grouping, such as planning, budget or supplier": "Слободно групирање, на пр. планирање, буџет или добавувач", + "How likely it is, on the admin's risk scale": "Колку е веројатно, на скалата на ризик на администраторот", + "How hard it would hit, on the admin's risk scale": "Колку силно би удрило, на скалата на ризик на администраторот", + "Likelihood times impact, calculated by the server": "Веројатност по влијание, пресметано од серверот", + "Where the risk stands": "Каде е ризикот", + "The person who watches this risk": "Лицето што го следи ризикот", + "How the project answers the risk": "Како проектот одговара на ризикот", + "What is done to prevent it or soften it, in Markdown": "Што се прави за да се спречи или ублажи, во Markdown", + "When to look at this risk again": "Кога повторно да се прегледа ризикот", + "Very low": "Многу ниско", + "Very high": "Многу високо", + "All projects": "Сите проекти", + "Project status report": "Извештај за состојбата на проектот", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датиран извештај за тоа како стои проектот со пари, организација, време, информации, квалитет и ризик (GROTIK аспектите), секој со белешка.", + "The project this report is about": "Проектот на кој се однесува извештајот", + "Report date": "Датум на извештајот", + "The day the report describes": "Денот што го опишува извештајот", + "Money": "Пари", + "How the project stands on this aspect": "Како стои проектот во овој аспект", + "On track": "Според планот", + "At risk": "Загрозено", + "Off track": "Надвор од планот", + "Money note": "Белешка за пари", + "A short explanation of this status": "Кратко објаснување на оваа состојба", + "Organisation": "Организација", + "Organisation note": "Белешка за организацијата", + "Time": "Време", + "Time note": "Белешка за времето", + "Information": "Информации", + "Information note": "Белешка за информациите", + "Quality": "Квалитет", + "Quality note": "Белешка за квалитетот", + "Risk note": "Белешка за ризикот", + "Overall": "Вкупно", + "The worst of the six statuses, calculated by the server": "Најлошата од шесте состојби, пресметана од серверот", + "Health: money": "Здравје: пари", + "Copied from the newest status report": "Преземено од најновиот извештај за состојбата", + "Health: organisation": "Здравје: организација", + "Health: time": "Здравје: време", + "Health: information": "Здравје: информации", + "Health: quality": "Здравје: квалитет", + "Health: risk": "Здравје: ризик", + "Health: overall": "Здравје: вкупно", + "Health: report date": "Здравје: датум на извештајот", + "The date of the newest status report": "Датумот на најновиот извештај за состојбата", + "New report": "Нов извештај", + "Only the project owner writes status reports.": "Само сопственикот на проектот пишува извештаи за состојбата.", + "Latest report, {date}": "Последен извештај, {date}", + "Aspect": "Аспект", + "Note": "Белешка", + "Report history": "Историја на извештаи", + "Author": "Автор", + "No status reports yet": "Сè уште нема извештаи за состојбата", + "Write the first report": "Напиши го првиот извештај", + "Choose a status for every aspect to save the report.": "Изберете состојба за секој аспект за да го зачувате извештајот.", + "Suggested: on track.": "Предлог: според планот.", + "Suggested: at risk.": "Предлог: загрозено.", + "Suggested: off track.": "Предлог: надвор од планот.", + "1 task is past its due date.": "1 задача го помина рокот.", + "{count} tasks are past their due date.": "Задачи што го поминаа рокот: {count}.", + "The end date has passed with 1 open task.": "Крајниот датум помина со 1 отворена задача.", + "The end date has passed with {count} open tasks.": "Крајниот датум помина, отворени задачи: {count}.", + "No open task is past its due date.": "Ниту една отворена задача не го помина рокот.", + "The highest open risk, \"{title}\", scores {score}.": "Најголемиот отворен ризик, \"{title}\", има оценка {score}.", + "There are no open risks.": "Нема отворени ризици.", + "Costs are at {percent}% of the budget.": "Трошоците се на {percent}% од буџетот.", + "No suggestion: the project has no budget.": "Нема предлог: проектот нема буџет.", + "No suggestion: no costs are recorded for this project yet.": "Нема предлог: за овој проект сè уште нема евидентирани трошоци.", + "The report was not saved. Only the project owner can write status reports.": "Извештајот не е зачуван. Само сопственикот на проектот може да пишува извештаи за состојбата.", + "No report": "Нема извештај", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Група проекти што ги водат истите луѓе, на пример оддел или програма. Нејзините раководители го читаат секој проект во неа.", + "The name of the portfolio": "Име на портфолиото", + "What the portfolio holds and who runs it": "Што содржи портфолиото и кој го води", + "A colour for the portfolio's section in project lists": "Боја за делот на портфолиото во листите на проекти", + "Managers": "Раководители", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud кориснички ID на луѓето што го водат портфолиото", + "Order": "Редослед", + "Where the portfolio comes in project lists, lowest first": "Каде е портфолиото во листите на проекти, најнискиот прв", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Сопствената скала на ризик на ова портфолио како JSON, во истата форма како скалата на целата апликација. Празно значи скалата на апликацијата.", + "Portfolio readers": "Читатели на портфолиото", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud кориснички ID на раководителите на портфолиото на проектот", + "The portfolio this project belongs to": "Портфолиото на кое му припаѓа проектот", + "No portfolio": "Без портфолио", + "All portfolios": "Сите портфолија", + "You read this project as a manager of its portfolio. Only its members change it.": "Го читате овој проект како раководител на неговото портфолио. Го менуваат само неговите членови.", + "Portfolios": "Портфолија", + "Portfolio status": "Состојба на портфолиото", + "No portfolios yet": "Сè уште нема портфолија", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Администратор додава портфолија во Проекти, Портфолија. Проектите во портфолиото се наведени тука со нивната состојба.", + "Roll-up": "Резиме", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} според план, {atRisk} во ризик, {offTrack} надвор од план, {noReport} без извештај", + "No project in this portfolio that you can read.": "Нема проект во ова портфолио што можете да го читате.", + "Start": "Почеток", + "End": "Крај", + "Budget": "Буџет", + "Last report": "Последен извештај", + "Out of date": "Застарено", + "Portfolio timeline": "Временска линија на портфолиото", + "Zoom": "Зумирање", + "Could not load the timeline": "Временската линија не може да се вчита", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Администратор додава портфолија во Проекти, Портфолија. Проектите во портфолиото се прикажани тука на една временска линија.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Отворете проект за да ги видите неговите фази и задачи. Временската линија е само за читање.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Изоставени бидејќи не можете да ги читате: {count} проекти", + "Week": "Недела", + "Day": "Ден", + "Month": "Месец", + "Please try again later.": "Обидете се повторно подоцна.", + "Status reports": "Извештаи за состојба", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "По колку дена последниот извештај за состојба на проектот се означува како застарен во прегледот на портфолиото", + "Reporting period (days)": "Период на известување (денови)", + "The reporting period is a whole number of days from 1 to 365.": "Периодот на известување е цел број денови од 1 до 365.", + "Reporting period saved": "Периодот на известување е зачуван", + "The reporting period was not saved. Please try again.": "Периодот на известување не е зачуван. Обидете се повторно.", + "Every project of a portfolio with its status per aspect, rolled up.": "Секој проект од портфолиото со состојба по аспект, сумирано.", + "The projects of a portfolio on one timeline.": "Проектите од портфолиото на една временска линија.", + "Phases": "Фази", + "Add phase": "Додај фаза", + "No phases yet": "Сè уште нема фази", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Поделете го проектот на фази, како започнување, дефиниција и реализација. Фазата се затвора кога ќе се прикачи нејзиниот завршен документ.", + "{hours} hours": "{hours} часа", + "Concluding document: {title}": "Завршен документ: {title}", + "Concluding document missing": "Недостасува завршен документ", + "Move {title} up": "Помести {title} нагоре", + "Move {title} down": "Помести {title} надолу", + "Close phase": "Затвори фаза", + "Phase": "Фаза", + "Files": "Датотеки", + "Notes": "Белешки", + "Audit trail": "Ревизорска трага", + "Edit phase": "Уреди фаза", + "Name": "Име", + "Budget hours": "Планирани часови", + "Could not save the phase. Please try again.": "Фазата не може да се зачува. Обидете се повторно.", + "Close phase {title}": "Затвори ја фазата {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фазата се затвора со завршниот документ: прикачете го тука или изберете една од датотеките на фазата.", + "Concluding document": "Завршен документ", + "This phase has no files yet.": "Оваа фаза сè уште нема датотеки.", + "Upload a document": "Прикачи документ", + "The document was not uploaded. Please try again.": "Документот не е прикачен. Обидете се повторно.", + "Upload the concluding document before you close this phase.": "Прикачете го завршниот документ пред да ја затворите оваа фаза.", + "This phase cannot be closed from its current status.": "Оваа фаза не може да се затвори од нејзината моментална состојба.", + "The phase was not closed. Please try again.": "Фазата не е затворена. Обидете се повторно.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ИД на датотеката на оваа фаза што ја затвора. Фазата може да се заврши дури кога е поставен и датотеката е прикачена.", + "Import from Microsoft Project": "Увези од Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Изберете план зачуван од Microsoft Project во XML формат. Ништо не се увезува додека не потврдите.", + "Plan file": "Датотека на планот", + "What the import creates": "Што создава увозот", + "Tasks": "Задачи", + "Sub-tasks": "Подзадачи", + "Milestones": "Пресвртници", + "Links": "Врски", + "Already imported, updated in place: {count}": "Веќе увезено, ажурирано на место: {count}", + "What does not carry over": "Што не се пренесува", + "Tasks with resources, which are not imported: {count}": "Задачи со ресурси, кои не се увезуваат: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Задачи подлабоко од ниво 3, сместени под својата задача од ниво 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Врски освен крај-почеток, увезени како поврзани врски: {count}", + "Link lags, which are dropped: {count}": "Доцнења на врски, кои се отфрлаат: {count}", + "Links to a summary task, which are not imported: {count}": "Врски кон збирна задача, кои не се увезуваат: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Врски кон задачи надвор од овој план, кои не се увезуваат: {count}", + "No longer in the plan": "Веќе не е во планот", + "These stay in the project; remove them yourself if they are no longer needed.": "Остануваат во проектот; отстранете ги сами ако повеќе не се потребни.", + "Import": "Увези", + "Close": "Затвори", + "The plan is imported: {created} created, {updated} updated.": "Планот е увезен: создадени {created}, ажурирани {updated}.", + "Links that would close a loop were left out: {count}": "Врските што би затвориле јамка се изоставени: {count}", + "The import stopped part-way. Run it again to finish it.": "Увозот застана на половина пат. Пуштете го повторно за да го завршите.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Зачувајте го планот во Microsoft Project преку Датотека, Зачувај како, XML формат, и увезете ја таа датотека.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Оваа датотека декларира DOCTYPE или ентитети, кои не се прифаќаат.", + "The file is larger than 10 MB.": "Датотеката е поголема од 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Планот има повеќе од 2.000 задачи, повеќе отколку што прима еден увоз.", + "This file is not a Microsoft Project plan in XML format.": "Оваа датотека не е план на Microsoft Project во XML формат.", + "Choose a file to import.": "Изберете датотека за увоз.", + "Only the project owner can import a plan.": "Само сопственикот на проектот може да увезе план.", + "The plan could not be read. Please try again.": "Планот не можеше да се прочита. Обидете се повторно.", + "Linked case: {title}": "Поврзан предмет: {title}", + "Linked to a case": "Поврзано со предмет", + "Hand over to case": "Предај на предметот", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Непроменето ја копира секоја датотека на проектот и неговите задачи и датотека што го опишува проектот во поврзаниот предмет.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Копирани датотеки: {count}", + "Files that failed: {names}": "Неуспешни датотеки: {names}", + "The handover failed. Please try again.": "Предавањето не успеа. Обидете се повторно.", + "The linked case could not be found, or you cannot open it.": "Поврзаниот предмет не е пронајден или не можете да го отворите.", + "Case handovers": "Предавања на предметот", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Секое предавање на датотеките и метаподатоците на проектот на неговиот предмет: кога, кој, на кој предмет, секоја копирана датотека со нејзиниот SHA-256 и неуспешните датотеки.", + "Finance": "Финансии", + "Add cost line": "Додај ставка за трошок", + "Delivery terms": "Услови за испорака", + "Billing model": "Модел на наплата", + "Budget in euro": "Буџет во евра", + "Budget in hours": "Буџет во часови", + "Hourly rate in euro": "Цена по час во евра", + "Planned start": "Планиран почеток", + "Planned end": "Планиран крај", + "Planned dates": "Планирани датуми", + "Budget {amount}": "Буџет {amount}", + "No budget agreed": "Нема договорен буџет", + "Hours": "Часови", + "Only the project owner and the portfolio managers see the amounts.": "Износите ги гледаат само сопственикот на проектот и менаџерите на портфолиото.", + "Budget against cost per category": "Буџет наспроти трошоци по категорија", + "Labour (booked time)": "Труд (евидентирани часови)", + "No category": "Без категорија", + "Hours are not available": "Часовите не се достапни", + "Not yet assigned to a category": "Сè уште не е доделено на категорија", + "Total": "Вкупно", + "{spent} spent, {remaining} remaining": "{spent} потрошено, {remaining} преостанато", + "Budget against cost per phase": "Буџет наспроти трошоци по фаза", + "No phase": "Без фаза", + "Cost lines": "Ставки за трошок", + "From the finance system": "Од финансискиот систем", + "Edit cost line {amount}": "Уреди ја ставката за трошок {amount}", + "No cost lines yet": "Сè уште нема ставки за трошок", + "Commitments": "Обврски", + "Actual cost": "Реален трошок", + "Forecast": "Прогноза", + "Remaining": "Преостанато", + "Not planned yet": "Сè уште не е планирано", + "{start} to {end}": "{start} до {end}", + "The terms were not saved. Please try again.": "Условите не се зачувани. Обидете се повторно.", + "Terms saved": "Условите се зачувани", + "Fixed price": "Фиксна цена", + "Hourly": "По час", + "Not billed": "Не се наплаќа", + "Commitment": "Обврска", + "Edit cost line": "Уреди ставка за трошок", + "Kind": "Вид", + "Amount in euro": "Износ во евра", + "Remove": "Отстрани", + "Could not save the cost line. Only the project owner changes the money of a project.": "Ставката за трошок не може да се зачува. Парите на проектот ги менува само сопственикот на проектот.", + "Could not remove the cost line. Please try again.": "Ставката за трошок не може да се отстрани. Обидете се повторно.", + "{amount} over budget": "{amount} над буџетот", + "Cost categories": "Категории на трошоци", + "The categories every project splits its budget and costs into, one per line": "Категориите на кои секој проект ги дели својот буџет и трошоци, по една во ред", + "Categories": "Категории", + "Give at least one category, each name once.": "Внесете барем една категорија, секое име еднаш.", + "Cost categories saved": "Категориите на трошоци се зачувани", + "The cost categories were not saved. Please try again.": "Категориите на трошоци не се зачувани. Обидете се повторно.", + "Finance line": "Финансиска ставка", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Еден паричен износ на проект: буџет, обврска, реален трошок или прогноза, во категорија на трошоци и по желба во фаза. Ја внесува сопственикот на проектот или ја праќа финансискиот систем преку апликацијата за интеграција.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Проектот на кој му припаѓа износот. Празно за ставка од финансискиот систем чиј број на проект не одговара на ниеден проект.", + "The phase this amount belongs to, if any": "Фазата на која ѝ припаѓа износот, ако постои", + "The cost category, one of the categories the admin set up": "Категоријата на трошоци, една од категориите што ги постави администраторот", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Дали износот е буџет, обврска, реален трошок или прогноза", + "Amount": "Износ", + "The amount in the reporting currency (euro)": "Износот во валутата за известување (евро)", + "The date the amount was booked or is expected": "Датумот кога износот е книжен или се очекува", + "What the amount is for": "За што е износот", + "Whether a person entered the line or the finance system sent it": "Дали ставката ја внело лице или ја испратил финансискиот систем", + "Entered by hand": "Внесено рачно", + "Finance line id": "Ид на финансиската ставка", + "The finance system's own id of this line. One imported line per id.": "Сопствениот ид на оваа ставка во финансискиот систем. Една увезена ставка по ид.", + "Project number": "Број на проект", + "The project number the finance system sent, matched against the project key": "Бројот на проект што го испрати финансискиот систем, спореден со клучот на проектот", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Портфолиото на проектот на ставката, преземено од проектот за збировите на портфолиото да бараат еден филтер", + "Finance readers": "Читатели на финансии", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID на корисниците на Nextcloud што смеат да го гледаат износот: сопственикот на проектот и менаџерите на неговото портфолио", + "Project owner": "Сопственик на проектот", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID на корисникот на Nextcloud сопственик на проектот, кој смее да менува и отстранува рачни ставки", + "How the client pays: not billed, a fixed price, or by the hour.": "Како плаќа клиентот: не се наплаќа, фиксна цена или по час.", + "Portfolio finance": "Финансии на портфолиото", + "You cannot see the money of any project in this portfolio": "Не можете да ги видите парите на ниеден проект во ова портфолио", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Серверот врати ставки за трошок од проекти надвор од ова портфолио, па овие збирови можат да бидат погрешни.", + "Projects left out because you cannot see their money: {count}": "Изоставени проекти бидејќи не можете да ги видите нивните пари: {count}", + "Unmatched finance lines": "Неповрзани финансиски ставки", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Буџет, обврски, реален трошок и прогноза собрани за портфолио.", + "Subprojects": "Потпроекти", + "{done} of {total}": "{done} од {total}", + "{done} of {total} tasks done, including subprojects": "{done} од {total} задачи завршени, вклучувајќи потпроекти", + "Show the subprojects of {title}": "Прикажи ги потпроектите на {title}", + "Hide the subprojects of {title}": "Скриј ги потпроектите на {title}", + "Part of": "Дел од", + "No parent project": "Нема надреден проект", + "A project cannot sit under one of its own subprojects.": "Проектот не може да биде под еден од своите потпроекти.", + "Projects nest three levels deep at most: programme, project and subproject.": "Проектите се вгнездуваат најмногу три нивоа длабоко: програма, проект и потпроект.", + "Parent project": "Надреден проект", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Проектот под кој е овој проект, на пример програма. Проектите се вгнездуваат најмногу три нивоа длабоко.", + "Yes": "Да", + "No": "Не", + "{label} (required)": "{label} (задолжително)", + "{label} is required": "{label} е задолжително", + "Project field": "Поле на проект", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поле што администраторот го додава на секој проект, на пример област на политика или вредност на договор.", + "Key": "Клуч", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Постојаното име под кое се зачувува вредноста, во lower camel case. Задржете го кога проектите го користат.", + "Label": "Ознака", + "The name people see next to the field": "Името што луѓето го гледаат до полето", + "What the field holds": "Што содржи полето", + "Text": "Текст", + "Number": "Број", + "Choice": "Избор", + "Person": "Лице", + "Yes or no": "Да или не", + "Options": "Опции", + "The choices of a choice field": "Опциите на поле за избор", + "Required": "Задолжително", + "Whether a project must fill in the field": "Дали проектот мора да го пополни полето", + "Where the field appears, lowest first": "Каде се појавува полето, најниското прво", + "Applies to": "Важи за", + "What the field is added to": "На што се додава полето", + "Custom fields": "Сопствени полиња", + "The values of the project fields an admin defined, keyed by the field's key.": "Вредностите на полињата на проектот што ги дефинирал администраторот, според клучот на полето.", + "Project fields": "Полиња на проект", + "Related": "Поврзани", + "Remove link": "Отстрани врска", + "Link type": "Вид врска", + "Relates to": "Поврзано со", + "Duplicates": "Дуплира", + "Project key": "Клуч на проектот", + "Every task number starts with it, such as VERG-42.": "Секој број на задача започнува со него, на пример VERG-42.", + "This key is already used by another project.": "Овој клуч веќе го користи друг проект.", + "Use 2 to 10 letters and digits, starting with a letter.": "Користете од 2 до 10 букви и цифри, почнувајќи со буква.", + "The key cannot change once tasks carry it.": "Клучот не може да се смени откако задачите го носат.", + "Project saved. The existing tasks get their numbers in the background.": "Проектот е зачуван. Постојните задачи ги добиваат своите броеви во позадина.", + "Next task number": "Број на следната задача", + "The number the next task of this project gets in its key. Only the system writes it.": "Бројот што следната задача од овој проект го добива во својот клуч. Го запишува само системот.", + "Restore {title}": "Врати {title}", + "Restore": "Врати", + "Project restored": "Проектот е вратен", + "Could not restore the project": "Проектот не може да се врати", + "Bring this project back to the active list.": "Врати го овој проект во списокот на активни проекти.", + "Restore project": "Врати го проектот", + "Request reason": "Причина за барањето", + "Why the requester needs this project. Filled in when the project is requested.": "Зошто на барателот му треба овој проект. Се пополнува при барањето.", + "Reviewed by": "Прегледано од", + "The user who approved or rejected the request.": "Корисникот што го одобри или одби барањето.", + "Reviewed at": "Прегледано на", + "When the request was approved or rejected.": "Кога барањето беше одобрено или одбиено.", + "Review note": "Белешка од прегледот", + "The reviewer's reason, shown to the requester when a request is not approved.": "Причината на прегледувачот, што барателот ја гледа кога барањето не е одобрено.", + "Members of these groups": "Членови на овие групи", + "Groups that may create projects": "Групи што смеат да создаваат проекти", + "The group {group} no longer exists. Save to remove it.": "Групата {group} веќе не постои. Зачувајте за да ја отстраните.", + "Review project request": "Прегледај барање за проект", + "Requested by": "Побарано од", + "Why it is needed": "Зошто е потребен", + "Desired start date": "Посакуван датум на почеток", + "Why is it not approved?": "Зошто не е одобрен?", + "Give a reason. The requester sees it.": "Наведете причина. Барателот ќе ја види.", + "Approve": "Одобри", + "Reject": "Одбиј", + "Reject request": "Одбиј го барањето", + "The review was not saved. Try again.": "Прегледот не е зачуван. Обидете се повторно.", + "This project is waiting for review": "Овој проект чека преглед", + "This request was not approved": "Ова барање не е одобрено", + "Reason: {note}": "Причина: {note}", + "Review request": "Прегледај го барањето", + "Request a project": "Побарај проект", + "Step {step} of 2": "Чекор {step} од 2", + "Why is this project needed?": "Зошто е потребен овој проект?", + "Give a reason. The reviewer reads it.": "Наведете причина. Прегледувачот ќе ја прочита.", + "Back": "Назад", + "Next": "Следно", + "Send request": "Испрати барање", + "The request was not sent. Try again.": "Барањето не е испратено. Обидете се повторно.", + "Requested": "Побарано", + "Not approved": "Не е одобрено", + "Your request was sent": "Вашето барање е испратено", + "Let everyone else request a project": "Дозволи им на сите други да побараат проект", + "Add a task": "Додај задача", + "Delete task": "Избриши задача", + "Edit task": "Уреди задача", + "Write": "Пишувај", + "Preview": "Преглед", + "Markdown works here: headings, lists and links.": "Тука работи Markdown: наслови, листи и врски.", + "Could not save the task. Please try again.": "Задачата не може да се зачува. Обидете се повторно.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "На \"{title}\" е евидентирано време, па не може да се избрише. Наместо тоа можете да ја откажете: записите за време остануваат.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Да се избрише \"{title}\"? Се отстрануваат и нејзините врски со други задачи. Ова не може да се врати.", + "Keep task": "Задржи ја задачата", + "Cancel task": "Откажи ја задачата", + "Only the reporter, the project owner or an admin can delete this task.": "Оваа задача може да ја избрише само пријавувачот, сопственикот на проектот или администратор.", + "Could not delete the task. Please try again.": "Задачата не може да се избрише. Обидете се повторно.", + "Could not cancel the task. Please try again.": "Задачата не може да се откаже. Обидете се повторно.", + "Responsible": "Одговорно лице", + "Also working on this": "На ова работат и", + "Labels": "Ознаки", + "Could not change the priority. Please try again.": "Приоритетот не може да се промени. Обидете се повторно.", + "Other project members who work on this task alongside the person responsible.": "Други членови на проектот кои работат на задачата заедно со одговорното лице.", + "Duplicate": "Дуплирај", + "Could not copy the task. Please try again.": "Задачата не може да се копира. Обидете се повторно.", + "Subtasks": "Подзадачи", + "{done} of {total} done": "Завршени {done} од {total}", + "Add a subtask": "Додај подзадача", + "Checklist": "Список за проверка", + "Checklist item actions": "Дејства за ставка од списокот", + "Add a checklist item": "Додај ставка во списокот", + "Subtasks: {estimate} estimated, {logged} logged": "Подзадачи: проценето {estimate}, евидентирано {logged}", + "Total estimate: {total}": "Вкупна проценка: {total}", + "Part of {title}": "Дел од {title}", + "Checklist: {count} done": "Список за проверка: завршени {count}", + "This task has subtasks: {count}.": "Оваа задача има подзадачи: {count}.", + "Keep subtasks as separate tasks": "Задржи ги подзадачите како посебни задачи", + "Delete subtasks too": "Избриши ги и подзадачите", + "Copy of {title}": "Копија од {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Задачата е копирана, но не и сите нејзини подзадачи. Проверете ја копијата.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Мали чекори во задачата. Секоја ставка има id, текст и дали е завршена.", + "Open work per person and per project.": "Отворена работа по лице и по проект.", + "View": "Приказ", + "By person": "По лице", + "By project": "По проект", + "Hours left": "Преостанати часови", + "Tasks without an estimate": "Задачи без проценка", + "Due in 14 days": "Рок во 14 дена", + "Shared": "Споделено", + "Unassigned": "Недоделено", + "{hours} h": "{hours} ч", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Се прикажува работата во проектите што можете да ги видите. Часовите се сметаат на одговорното лице; споделените задачи се сметаат без часови.", + "No open work in these projects.": "Нема отворена работа во овие проекти.", + "Open work": "Отворена работа", + "{count} open tasks": "{count} отворени задачи", + "Create a project to see capacity here.": "Создадете проект за да го видите капацитетот тука.", + "My tasks": "Мои задачи", + "Show all my tasks": "Прикажи ги сите мои задачи", + "No tasks assigned to you": "Немате доделени задачи", + "Browse projects": "Прелистај проекти", + "Later": "Подоцна", + "Due {date}": "Рок {date}", + "Could not change the status. Please try again.": "Статусот не може да се промени. Обидете се повторно.", + "Completed today": "Завршени денес", + "My open tasks": "Мои отворени задачи", + "My overdue tasks": "Мои задоцнети задачи", + "My tasks in progress": "Мои задачи во тек", + "Pin to the top": "Закачи најгоре", + "Unpin": "Откачи", + "Pinned": "Закачено", + "Actions for {title}": "Дејства за {title}", + "Could not save your project order. Please try again.": "Редоследот на проектите не може да се зачува. Обидете се повторно.", + "No boards yet": "Сè уште нема табли", + "Create a project to get a board.": "Создадете проект за да добиете табла.", + "Use the Projects page to create and manage your projects and tasks.": "На страницата Проекти создавајте и управувајте со вашите проекти и задачи.", + "Go to projects": "Оди на проекти", + "You are not a member of any projects yet.": "Сè уште не сте член на ниту еден проект.", + "Could not search for users. Please try again.": "Пребарувањето корисници не успеа. Обидете се повторно.", + "Project creation is restricted to administrators.": "Само администраторите можат да создаваат проекти.", + "Only the project owner or an administrator can delete this project.": "Само сопственикот на проектот или администратор може да го избрише овој проект.", + "No projects are available to you yet. Ask an administrator to create one.": "Сè уште немате достапни проекти. Замолете администратор да создаде еден.", + "Due: {date}": "Рок: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Задачите со датум на почеток или рок се прикажуваат на временската линија. Додадете датуми за да ги видите тука.", + "You do not have access to this project.": "Немате пристап до овој проект.", + "Zoom level": "Ниво на зумирање", + "Unscheduled": "Непланирано", + "Start: {date}": "Почеток: {date}", + "Today": "Денес", + "No scheduled tasks": "Нема планирани задачи", + "An unexpected error occurred.": "Настана неочекувана грешка.", + "Column {number} name": "Име на колоната {number}", + "Failed to save creation policy": "Правилото за создавање не може да се зачува", + "All authenticated users": "Сите најавени корисници", + "Control who may create new projects": "Одредете кој смее да создава нови проекти", + "Administrators only": "Само администратори", + "Project creation": "Создавање проекти", + "Allow project creation": "Дозволи создавање проекти", + "Creation policy saved successfully": "Правилото за создавање е зачувано", + "Initializing…": "Се стартува…", + "e.g. 2h 30m, 90m, 1.5h": "на пр. 2h 30m, 90m, 1.5h", + "Log time": "Запиши време", + "Save estimate": "Зачувај проценка", + "Logged: {logged}": "Запишано: {logged}", + "over by {amount}": "пречекорено за {amount}", + "Time tracking": "Евиденција на време", + "Estimate": "Проценка", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Внесете валидна проценка (на пр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Внесете валидно траење (на пр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Записот за време не може да се зачува. Обидете се повторно.", + "Edit time entry": "Уреди запис за време", + "Duration": "Траење", + "Date range": "Период", + "Last week": "Минатата недела", + "No time logged": "Нема запишано време", + "Log time on a task to see it here.": "Запишете време на задача за да го видите тука.", + "To date": "До датум", + "This week": "Оваа недела", + "Total: {total}": "Вкупно: {total}", + "From date": "Од датум", + "Custom range": "Сопствен период", + "All time": "Цело време", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Задачата не може да се избрише, па може да останат податоци. Избришете го проектот повторно.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Записот за време не може да се избрише, па може да останат податоци. Избришете го проектот повторно.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Колоната не може да се избрише, па може да останат податоци. Избришете го проектот повторно.", + "Could not delete the project. Please try again.": "Проектот не може да се избрише. Обидете се повторно.", + "Notification settings": "Поставки за известувања", + "Configure when due-date reminders are sent": "Одредете кога се испраќаат потсетници за рокови", + "Due-date reminder lead time (hours)": "Време на потсетникот пред рокот (часови)", + "Lead time must be between 1 and 336 hours": "Времето мора да биде меѓу 1 и 336 часа", + "Reminder lead time saved successfully": "Времето на потсетникот е зачувано", + "Failed to save reminder lead time": "Времето на потсетникот не може да се зачува", + "Notifications": "Известувања", + "Notify me 1 day before a task's due date": "Извести ме 1 ден пред рокот на задачата", + "Draft": "Нацрт", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Дали часот е нацрт што го гледа само неговиот наставник, се одржува или е откажан.", + "New release": "Ново издание", + "Roadmap chart. The same releases and epics are listed below.": "Графикон на патоказот. Истите изданија и епови се наведени подолу.", + "Nothing on the roadmap yet": "Сè уште ништо на патоказот", + "Releases with a target date and epics with dated tasks appear here.": "Тука се прикажуваат изданијата со целен датум и еповите со задачи што имаат датум.", + "Releases": "Изданија", + "No releases yet": "Сè уште нема изданија", + "Target date: {date}": "Целен датум: {date}", + "No target date": "Нема целен датум", + "Edit {name}": "Уреди {name}", + "Mark {name} as released": "Означи {name} како објавено", + "Mark as released": "Означи како објавено", + "Epics": "Епови", + "No epics yet. Open a task to make it an epic.": "Сè уште нема епови. Отворете задача за да ја направите еп.", + "Not scheduled yet": "Сè уште не е закажано", + "Planned": "Планирано", + "Released": "Објавено", + "Edit release": "Уреди издание", + "Target date": "Целен датум", + "Could not save the release. Please try again.": "Изданието не може да се зачува. Обидете се повторно.", + "Every task of this release is done or cancelled.": "Секоја задача од ова издание е завршена или откажана.", + "Not finished yet: {count}": "Сè уште незавршени: {count}", + "What happens to these tasks?": "Што се случува со овие задачи?", + "Move to {name}": "Премести во {name}", + "Remove the release": "Отстрани го изданието", + "Keep it on {name}": "Остави ги во {name}", + "Could not mark the release as released. Please try again.": "Изданието не може да се означи како објавено. Обидете се повторно.", + "Roadmap": "Патоказ", + "Tasks or roadmap": "Задачи или патоказ", + "Release": "Издание", + "Epic": "Еп", + "This task is an epic": "Оваа задача е еп", + "A named, dated delivery of a project that its tasks are planned against.": "Именувана испорака на проект со датум, според која се планираат неговите задачи.", + "Name of the release": "Име на изданието", + "The project this release belongs to": "Проектот на кој му припаѓа ова издание", + "What this release delivers": "Што испорачува ова издание", + "When work on the release starts": "Кога започнува работата на изданието", + "The date the release is due": "Датумот до кој изданието треба да е готово", + "Whether the release is planned, released or archived": "Дали изданието е планирано, објавено или архивирано", + "Released on": "Објавено на", + "When the release was marked as released": "Кога изданието е означено како објавено", + "The release this task is planned for": "Изданието за кое е планирана оваа задача", + "Board view options": "Опции за приказ на таблата", + "Colour cards": "Обој ги картичките", + "No colour": "Без боја", + "By label": "По ознака", + "Swimlanes": "Патеки", + "No swimlanes": "Без патеки", + "By assignee": "По задолжено лице", + "By epic": "По епик", + "No assignee": "Недоделено", + "No epic": "Без епик", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Картичките остануваат во редот на својот епик. Сменете го епикот на страницата на задачата.", + "Hand over to": "Предај на", + "Could not save your board view. It applies until you reload.": "Приказот на таблата не е зачуван. Важи до повторно вчитување.", + "Timetable wish": "Желба за распоред", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Желба што генераторот ја зема предвид. Цврста желба секогаш ја почитува, мека каде што може.", + "Whether the wish is about a teacher, a group, a room or one activity": "Дали желбата се однесува на наставник, група, простор или една активност", + "Teacher": "Наставник", + "Group": "Група", + "Reference": "Упатување", + "The user, group, room or activity the wish is about": "Корисникот, групата, просторот или активноста на која се однесува желбата", + "What the wish asks for": "Што бара желбата", + "Not on these periods": "Не во овие часови", + "Preferably not on these periods": "Подобро не во овие часови", + "At most a number of lessons a day": "Најмногу одреден број часови дневно", + "No free periods between lessons": "Без дупки меѓу часовите", + "Always the same room": "Секогаш истиот простор", + "Periods": "Часови", + "The periods of the week the wish is about, such as wed-5": "Часовите во неделата на кои се однесува желбата, на пр. wed-5", + "Limit": "Граница", + "The most lessons a day, for a wish of that kind": "Најмногу часови дневно, за желба од тој вид", + "Strength": "Јачина", + "Whether the generator must keep the wish or should keep it": "Дали генераторот мора или треба да ја почитува желбата", + "Hard": "Цврста", + "Soft": "Мека", + "Weight": "Тежина", + "How much a soft wish counts, from 1 to 3": "Колку вреди мека желба, од 1 до 3", + "Why the wish exists": "Зошто постои желбата", + "Timetable scenario": "Сценарио за распоред", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Еден неделен образец, направен од генераторот или преземен од тековниот распоред. Го чува својот влез и колку добро ги почитува желбите.", + "The name timetablers know the scenario by": "Името под кое составувачите на распоред го знаат сценариото", + "Whether the generator made it or it came from the current timetable": "Дали го направил генераторот или доаѓа од тековниот распоред", + "Generated": "Генерирано", + "From the current timetable": "Од тековниот распоред", + "Week of": "Недела од", + "The Monday of the first week of the window": "Понеделникот на првата недела од периодот", + "Window start": "Почеток на периодот", + "The first day the week pattern applies to": "Првиот ден за кој важи неделниот образец", + "Window end": "Крај на периодот", + "The last day the week pattern applies to": "Последниот ден за кој важи неделниот образец", + "Waiting, generating, done, failed, or published as draft lessons": "Чека, се генерира, готово, неуспешно или објавено како нацрт-часови", + "Waiting": "Чека", + "Generating": "Се генерира", + "Failed": "Неуспешно", + "Published": "Објавено", + "Seed": "Семе", + "The number the generator starts from, so a run can be repeated": "Бројот од кој почнува генераторот, за извршувањето да може да се повтори", + "Input": "Влез", + "The periods, rooms, lessons and wishes the scenario was made from": "Часовите, просториите, предавањата и желбите од кои е направено сценариото", + "Placements": "Сместувања", + "Each lesson with the period and room it was given": "Секој час со терминот и просторот што ги добил", + "Unplaced lessons": "Несместени часови", + "Lessons without a place, each with the hard wish that blocked it": "Часови без место, секој со цврстата желба што го запрела", + "Broken wishes": "Прекршени желби", + "The wishes this scenario breaks, with the lessons that break them": "Желбите што ова сценарио ги крши, со часовите што ги кршат", + "Measures": "Мерки", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Сместени часови, прекршени желби, дупки на наставниците, часови дневно и користење на простории", + "Reason": "Причина", + "Why the run failed": "Зошто извршувањето не успеа", + "Published at": "Објавено на", + "When the scenario was written out as draft lessons": "Кога сценариото е запишано како нацрт-часови", + "Edit wish": "Уреди желба", + "New wish": "Нова желба", + "Hard: the generator always keeps it": "Задолжителна: генераторот секогаш ја почитува", + "Soft: the generator keeps it where it can": "Флексибилна: генераторот ја почитува каде што може", + "Weight (1 to 3)": "Тежина (од 1 до 3)", + "Most lessons a day": "Најмногу часови дневно", + "Period": "Час", + "{day} period {number}": "{day} час {number}", + "Teacher (user name)": "Наставник (корисничко име)", + "Activity (group:subject)": "Активност (група:предмет)", + "Say who or what the wish is about.": "Наведете на кого или на што се однесува желбата.", + "Choose at least one period.": "Изберете барем еден час.", + "The limit is a whole number of 1 or more.": "Ограничувањето е цел број 1 или повеќе.", + "Timetable": "Распоред", + "Wishes": "Желби", + "Timetable wishes": "Желби за распоредот", + "Generator run": "Извршување на генераторот", + "Generator progress": "Напредок на генераторот", + "The run failed: {reason}": "Извршувањето не успеа: {reason}", + "{placed} of {lessons} lessons placed": "Сместени {placed} од {lessons} часови", + "Generate again": "Генерирај повторно", + "Generate": "Генерирај", + "Every lesson has a place.": "Секој час има место.", + "Lesson": "Час", + "No free period and room": "Нема слободен час и просторија", + "Broken soft wishes": "Прекршени флексибилни желби", + "Every soft wish is kept.": "Секоја флексибилна желба е почитувана.", + "Wish": "Желба", + "Lessons": "Часови", + "Generating: {percent}% of the time budget used": "Се генерира: искористено {percent}% од времето", + "Waiting to start": "Чека почеток", + "Published as draft lessons": "Објавено како нацрт-часови", + "Could not read the scenario.": "Сценариото не може да се прочита.", + "Could not start the run.": "Извршувањето не може да започне.", + "Scenarios": "Сценарија", + "Timetable scenarios": "Сценарија за распоредот", + "Scenario": "Сценарио", + "Take the current timetable": "Преземи го тековниот распоред", + "Could not take the current timetable.": "Тековниот распоред не можеше да се преземе.", + "Broken hard wishes": "Прекршени задолжителни желби", + "Not on a period of the week grid": "Не е на час од неделната мрежа", + "Compare scenarios": "Спореди сценарија", + "Scenarios to compare": "Сценарија за споредба", + "Choose two or three scenarios to compare them.": "Изберете две или три сценарија за споредба.", + "Measure": "Мерка", + "Best": "Најдобро", + "Lessons that differ": "Часови што се разликуваат", + "No lesson differs.": "Ниту еден час не се разликува.", + "Not placed": "Не е сместен", + "{period} in {room}": "{period} во {room}", + "Lessons placed": "Сместени часови", + "Lessons without a place": "Часови без место", + "Clashes": "Судири", + "Hard wishes broken": "Прекршени задолжителни желби", + "Soft wishes broken": "Прекршени флексибилни желби", + "Soft wishes broken, weighted": "Прекршени флексибилни желби, пондерирани", + "Free periods between lessons, all teachers": "Слободни часови, сите наставници", + "Most free periods of one teacher": "Најмногу слободни часови на еден наставник", + "Most lessons of one group on a day": "Најмногу часови на една група во ден", + "Room use": "Користење на простории", + "Publish as draft lessons": "Објави како нацрт-часови", + "Draft lessons written: {count}": "Запишани нацрт-часови: {count}", + "Could not publish the scenario.": "Сценариото не можеше да се објави.", + "Rules": "Правила", + "Rules for {column}": "Правила за {column}", + "When a card enters this column": "Кога картичка ќе влезе во оваа колона", + "Action": "Дејство", + "Set the priority": "Постави приоритет", + "Assign to": "Додели на", + "Assign the person who moved the card": "Додели на лицето што ја премести картичката", + "Remove the assignee": "Отстрани го задолженото лице", + "Add a label": "Додај ознака", + "No longer a project member": "Веќе не е член на проектот", + "This label no longer exists": "Оваа ознака веќе не постои", + "Add rule": "Додај правило", + "Remove rule": "Отстрани правило", + "No rules yet. Add one to change a card when it enters this column.": "Сè уште нема правила. Додајте едно за да се менува картичката кога ќе влезе во оваа колона.", + "Could not save the rules. Please try again.": "Правилата не можеа да се зачуваат. Обидете се повторно.", + "1 rule runs when a card enters this column": "1 правило се извршува кога картичка ќе влезе во оваа колона", + "{count} rules run when a card enters this column": "Број на правила што се извршуваат кога картичка ќе влезе во оваа колона: {count}", + "Rules applied: {changes}": "Применети правила: {changes}", + "assigned to {name}": "доделено на {name}", + "assignee removed": "задолженото лице е отстрането", + "priority {priority}": "приоритет {priority}", + "label {label}": "ознака {label}", + "What happens to a card when it enters this column, applied in list order.": "Што се случува со картичка кога ќе влезе во оваа колона, по редоследот на списокот.", + "Value": "Вредност", + "What the rule does to the card.": "Што прави правилото со картичката.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Приоритетот, ID на корисникот или ID на ознаката што ги користи дејството; празно за дејства без вредност.", + "is not": "не е", + "{dimension} is not": "{dimension} не е", + "Saved filters": "Зачувани филтри", + "No saved filters yet": "Сè уште нема зачувани филтри", + "Save filter": "Зачувај филтер", + "Rename \"{name}\"": "Преименувај „{name}“", + "Delete \"{name}\"": "Избриши „{name}“", + "Clear filters": "Исчисти филтри", + "Showing {shown} of {total} tasks": "Прикажани {shown} од {total} задачи", + "Me": "Јас", + "No date": "Без датум", + "Rename saved filter": "Преименувај зачуван филтер", + "Share with the project": "Сподели со проектот", + "Give the filter a name": "Дајте му име на филтерот", + "Could not save the filter. Please try again.": "Филтерот не можеше да се зачува. Обидете се повторно.", + "Some labels in \"{name}\" no longer exist and were left out.": "Некои ознаки во „{name}“ веќе не постојат и се изоставени.", + "Could not delete the filter. Please try again.": "Филтерот не можеше да се избрише. Обидете се повторно.", + "Saved filter": "Зачуван филтер", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Именуван филтер на таблата на еден проект, приватен за лицето што го зачувало, освен ако е споделен со проектот.", + "The project whose board the filter applies to": "Проектот на чија табла се однесува филтерот", + "The name the filter is listed under": "Името под кое филтерот е во списокот", + "Saved by": "Зачувал(а)", + "Nextcloud user id of the person who saved the filter": "Nextcloud ID на корисникот што го зачувал филтерот", + "Shared with the project": "Споделен со проектот", + "Whether every project member sees and applies the filter": "Дали секој член на проектот го гледа филтерот и може да го примени", + "Criteria": "Критериуми", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Филтерот: задолжено лице, ознака, приоритет и рок, секое со е или не е и своите вредности", + "Cross-project view": "Меѓупроектен приказ", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Зачуван избор на проекти чии задачи се прикажуваат заедно во колони по статус, споделен со наведените луѓе.", + "Shared with": "Споделено со", + "The name the view is listed under": "Името под кое е наведен приказот", + "Nextcloud user id of the person who saved the view": "Nextcloud кориснички ID на личноста што го зачувала приказот", + "Nextcloud user ids of the people the view is shared with": "Nextcloud кориснички ID на луѓето со кои е споделен приказот", + "The projects whose tasks the view shows, at most twenty": "Проектите чии задачи ги прикажува приказот, најмногу дваесет", + "1 project in this view is hidden from you.": "1 проект во овој приказ е скриен од вас.", + "{count} projects in this view are hidden from you.": "Проекти во овој приказ скриени од вас: {count}.", + "{project} has no column for {status}.": "Проектот {project} нема колона за статусот {status}.", + "This view does not exist or is not shared with you.": "Овој приказ не постои или не е споделен со вас.", + "\"{task}\" moved to {status}.": "\"{task}\" е преместено во {status}.", + "Project: {title}": "Проект: {title}", + "Cross-project views": "Меѓупроектни прикази", + "New view": "Нов приказ", + "Edit view": "Уреди приказ", + "Delete view": "Избриши приказ", + "Give the view a name": "Дајте му име на приказот", + "Pick at least one project": "Изберете барем еден проект", + "A view shows at most {max} projects": "Приказот прикажува најмногу {max} проекти", + "Could not save the view. Please try again.": "Приказот не може да се зачува. Обидете се повторно.", + "Could not delete the view. Please try again.": "Приказот не може да се избрише. Обидете се повторно.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Да се избрише „{title}“? Проектите и нивните задачи остануваат какви што се.", + "People see the tasks of the projects they are in, never more.": "Секој ги гледа само задачите од проектите во кои е.", + "No views yet. A view shows the tasks of several of your projects together.": "Сè уште нема прикази. Приказот ги прикажува задачите од повеќе ваши проекти заедно.", + "Projects in view: {count}": "Проекти во приказот: {count}", + "Notify me when a task is assigned to me": "Извести ме кога ќе ми биде доделена задача", + "Also send these to me by email": "Испраќај ми ги и по е-пошта", + "Add an email address in your Nextcloud personal settings to get mail.": "Додајте е-адреса во личните поставки на Nextcloud за да добивате е-пошта.", + "Code link": "Врска до код", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, гранка, барање за спојување или проблем на платформа за код што се однесува на задача.", + "The task the link belongs to": "Задачата на која ѝ припаѓа врската", + "The project of the task": "Проектот на задачата", + "Task key": "Клуч на задачата", + "The task key the forge text named, such as VC-12": "Клучот на задачата наведен во текстот на платформата, на пр. VC-12", + "What the link points at": "Кон што покажува врската", + "Link": "Врска", + "The address of the item in the forge": "Адресата на ставката на платформата за код", + "The commit message, branch name or merge request title": "Пораката на commit-от, името на гранката или насловот на барањето за спојување", + "Repository": "Складиште", + "The repository, such as acme/portal": "Складиштето, на пр. acme/portal", + "Forge id": "Id на платформата", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Сопствениот id на ставката на платформата за код, на пр. github:acme/portal#42 или hash на commit", + "State": "Состојба", + "The state of a merge request or issue": "Состојбата на барање за спојување или проблем", + "Who made the commit or opened the merge request": "Кој го направи commit-от или го отвори барањето за спојување", + "When the commit was made or the merge request last changed": "Кога е направен commit-от или последен пат се сменило барањето за спојување", + "Added by": "Додадено од", + "Whether a person added the link or the integration wrote it": "Дали врската ја додал човек или ја запишала интеграцијата", + "Nextcloud user UIDs of project members": "Nextcloud кориснички ID на членовите на проектот", + "Add link": "Додај врска", + "Added by hand": "Додадено рачно", + "Branch": "Гранка", + "Code": "Код", + "Commit": "Commit", + "From the integration": "Од интеграцијата", + "Link to a commit, branch or merge request": "Врска до commit, гранка или барање за спојување", + "Merge request": "Барање за спојување", + "Merged": "Споено", + "No code linked yet. Name {key} in a commit message or paste a link.": "Сè уште нема поврзан код. Наведете {key} во порака на commit или залепете врска.", + "No code linked yet. Paste a link to a commit or merge request.": "Сè уште нема поврзан код. Залепете врска до commit или барање за спојување.", + "Paste a web address that starts with https://.": "Залепете веб-адреса што почнува со https://.", + "Remove link {title}": "Отстрани ја врската {title}", + "The link could not be added.": "Врската не можеше да се додаде.", + "The link could not be removed.": "Врската не можеше да се отстрани.", + "This link is already on the task.": "Оваа врска веќе е на задачата.", + "Code forges": "Платформи за код", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Поврзете ги commit-ите и pull request-ите од GitHub со задачи. Integriq ги прима настаните; planninq никогаш не го повикува GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Преземете ја конфигурацијата и увезете ја во Integriq. Потоа внесете тајна во правилото \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Во GitHub додајте webhook на складиштето со оваа адреса и истата тајна. Изберете тип на содржина application/json и настаните push и pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Наведете го клучот на задачата, на пр. VC-12, во порака на commit, име на гранка или наслов на pull request. Врската тогаш се појавува на таа задача.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq, членовите на проектот сè уште можат да залепат врска на страницата на задачата.", + "Download the Integriq configuration": "Преземи ја конфигурацијата за Integriq", + "Calendar": "Календар", + "Previous": "Претходно", + "Calendar view": "Приказ на календар", + "Starts:": "Почнува:", + "No tasks with a date in this month.": "Овој месец нема задачи со датум.", + "Week of {start} to {end}": "Недела од {start} до {end}", + "My calendar": "Мој календар", + "Show as list": "Прикажи како листа", + "Show as calendar": "Прикажи како календар", + "Open my calendar": "Отвори го мојот календар", + "Nextcloud Tasks": "Nextcloud задачи", + "Show my tasks in Nextcloud Tasks": "Прикажи ги моите задачи во Nextcloud задачи", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Задачите доделени на вас или споделени со вас се појавуваат во листата \"Planninq\" во Nextcloud задачи и календар. Промените направени таму се заменуваат со следната промена во Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Овој сервер не може да запишува во Nextcloud задачи, па извозот не е достапен.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Управувано од Planninq. Промените направени тука се заменуваат со следната промена во Planninq.", + "Working days and holidays": "Работни денови и празници", + "Dates set on the timeline skip the days that are not working days.": "Датумите поставени на временската линија ги прескокнуваат деновите што не се работни.", + "Working weekdays": "Работни денови во неделата", + "Non-working days": "Неработни денови", + "No non-working days yet.": "Сè уште нема неработни денови.", + "Add day": "Додај ден", + "Year": "Година", + "Add Dutch national holidays": "Додај холандски државни празници", + "Save working days": "Зачувај работни денови", + "Choose at least one working weekday.": "Изберете барем еден работен ден.", + "Working days saved.": "Работните денови се зачувани.", + "Could not save the working days.": "Работните денови не можеа да се зачуваат.", + "New Year's Day": "Нова година", + "Easter Sunday": "Велигден", + "Easter Monday": "Велигденски понеделник", + "King's Day": "Ден на кралот", + "Liberation Day": "Ден на ослободувањето", + "Ascension Day": "Спасовден", + "Whit Sunday": "Духовден", + "Whit Monday": "Духовски понеделник", + "Christmas Day": "Божиќ", + "Boxing Day": "Втор ден Божиќ", + "Dates of {title}": "Датуми за {title}", + "The due date cannot be before the start date.": "Рокот не може да биде пред датумот на почеток.", + "{title}, from {start} to {end}": "{title}, од {start} до {end}", + "The dates could not be saved.": "Датумите не можеа да се зачуваат.", + "{title} now runs from {start} to {end}": "{title} сега трае од {start} до {end}", + "Auto-scheduling": "Автоматско планирање", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Кога е вклучено, подоцнежен рок на временската линија нуди поместување на задачите што ги блокира.", + "Move blocked tasks along when a task slips": "Помести ги блокираните задачи кога задача доцни", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На временската линија подоцнежен рок нуди поместување на блокираните задачи. Се бројат само врските \"блокира\", а задачите се поместуваат само подоцна.", + "Move the tasks that wait for {title}?": "Да се поместат задачите што чекаат {title}?", + "These tasks wait for it and would start after its new due date:": "Овие задачи ја чекаат и би започнале по новиот рок:", + "{count} tasks would move; the first {limit} are listed.": "Би се поместиле {count} задачи; прикажани се првите {limit}.", + "Now": "Сега", + "After the move": "По поместувањето", + "Only this task": "Само оваа задача", + "Move all": "Помести ги сите", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Запрено кај {title}: датумите не можеа да се зачуваат. Задачите пред неа се поместени.", + "Cumulative flow": "Кумулативен тек", + "Show as chart": "Прикажи како графикон", + "Show as table": "Прикажи како табела", + "Tasks per column per day": "Задачи по колона по ден", + "Tasks without recorded history in this period: {count}": "Задачи без запишана историја во овој период: {count}", + "Lead and cycle time": "Време на испорака и време на циклус", + "No tasks were finished in this period.": "Во овој период не е завршена ниту една задача.", + "Finished tasks": "Завршени задачи", + "Cycle time, average": "Време на циклус, просек", + "Cycle time, 85th percentile": "Време на циклус, 85. перцентил", + "Lead time, average": "Време на испорака, просек", + "Tasks whose finish time was estimated from their history: {count}": "Задачи чие време на завршување е проценето од историјата: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Време на циклус на секоја завршена задача, со просекот и 85. перцентил", + "Slowest tasks": "Најбавни задачи", + "cycle {cycle}, lead {lead}": "циклус {cycle}, испорака {lead}", + "{days} days": "{days} дена", + "Could not load the flow of this project.": "Текот на овој проект не може да се вчита.", + "Last {days} days": "Последните {days} дена", + "Portfolio flow": "Тек на портфолио", + "An admin adds portfolios under Projects, Portfolios.": "Администратор додава портфолија под Проекти, Портфолија.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Проекти што не се прикажани бидејќи истовремено се прикажуваат најмногу 50: {count}", + "Could not load the flow of this portfolio.": "Текот на ова портфолио не може да се вчита.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Кумулативен тек и време на циклус низ проектите на портфолио.", + "Edit report": "Уреди извештај", + "Only tasks where": "Само задачи каде", + "Group by": "Групирај по", + "Display": "Приказ", + "Share with everyone who can read its projects": "Сподели со сите што можат да ги читаат неговите проекти", + "The report could not be saved.": "Извештајот не може да се зачува.", + "Number of tasks": "Број на задачи", + "Bar": "Столбови", + "Donut": "Прстен", + "Table": "Табела", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} од {total} проекти во овој извештај не се видливи за вас", + "No tasks match this report.": "Ниту една задача не одговара на овој извештај.", + "None": "Ништо", + "Could not load this report.": "Овој извештај не може да се вчита.", + "Report": "Извештај", + "Your reports": "Ваши извештаи", + "My reports": "Мои извештаи", + "Shared reports": "Споделени извештаи", + "You have not built a report yet.": "Сè уште немате направено извештај.", + "Nobody has shared a report with you yet.": "Никој сè уште не споделил извештај со вас.", + "Reports you built over tasks, and the ones shared with you.": "Извештаи што ги направивте над задачите, и оние споделени со вас.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Зачувано барање над задачите: кои проекти, кои филтри, групирано по што, избројано или собрано, и прикажано како табела или графикон.", + "The name the report is listed under": "Името под кое извештајот е наведен", + "What the report shows and who it is for": "Што покажува извештајот и за кого е", + "Nextcloud user id of the person who saved the report": "Nextcloud ID на корисникот што го зачувал извештајот", + "Who can open the report": "Кој може да го отвори извештајот", + "Only me": "Само јас", + "Everyone who can read its projects": "Сите што можат да ги читаат неговите проекти", + "The projects the report covers, at most fifty": "Проектите што ги опфаќа извештајот, најмногу педесет", + "Filters": "Филтри", + "Task fields and the value each must equal": "Полиња на задачата и вредноста на која секое мора да биде еднакво", + "The task field the report groups on": "Полето на задачата по кое извештајот групира", + "Count the tasks, or add up a number on them": "Изброј ги задачите или собери број на нив", + "Sum": "Збир", + "Sum of": "Збир на", + "The number added up when the measure is a sum": "Бројот што се собира кога мерката е збир", + "Story points": "Поени на приказна", + "Estimated duration": "Проценето траење", + "How the report is shown": "Како се прикажува извештајот", + "Issue type": "Вид на барање", + "Task fields and the value each must equal; empty when the report covers every task": "Полиња на задачата и вредноста што секое мора да ја има; празно кога извештајот ги опфаќа сите задачи", + "The status a task must have": "Статусот што задачата мора да го има", + "The priority a task must have": "Приоритетот што задачата мора да го има", + "The user a task must be assigned to": "Корисникот на кого задачата мора да биде доделена", + "A label a task must carry": "Ознака што задачата мора да ја има", + "The board column a task must be in": "Колоната на таблата во која задачата мора да биде", + "The issue type a task must have": "Видот на барање што задачата мора да го има", + "Manager groups": "Групи на раководители", + "Member groups": "Групи на членови", + "Viewer groups": "Групи на читатели", + "Viewers": "Читатели", + "Owning group": "Сопственичка група", + "Nextcloud groups whose members manage the project": "Nextcloud групи чии членови го водат проектот", + "Nextcloud groups whose members work on the project": "Nextcloud групи чии членови работат на проектот", + "Nextcloud groups whose members may read the project": "Nextcloud групи чии членови смеат да го читаат проектот", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud корисници што го водат проектот: поставки, членови и работа", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud корисници што смеат да го читаат проектот и неговата работа, но не да ги менуваат", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud групата што го поседува проектот заедно со неговиот автор, најмногу една", + "Nextcloud user ids who may read this through the project": "Nextcloud корисници што смеат да го читаат ова преку проектот", + "Nextcloud groups whose members may change this through the project": "Nextcloud групи чии членови смеат да го менуваат ова преку проектот", + "Nextcloud groups whose members may read this through the project": "Nextcloud групи чии членови смеат да го читаат ова преку проектот", + "Search for a person or a group…": "Барај личност или група…", + "No one found. Your admin's sharing settings decide who you can find.": "Никој не е пронајден. Поставките за споделување на вашиот администратор одлучуваат кого можете да најдете.", + "Type at least two characters": "Внесете најмалку два знака", + "Everyone in this group": "Сите во оваа група", + "Could not search for people. Please try again.": "Пребарувањето луѓе не успеа. Обидете се повторно.", + "Could not remove the group": "Групата не можеше да се отстрани", + "Only the owner and managers change who is on this project.": "Само сопственикот и управителите менуваат кој е на овој проект.", + "Role of {name}": "Улога: {name}", + "Manager": "Управител", + "Member": "Член", + "Viewer": "Читател", + "Could not change the role": "Улогата не можеше да се промени", + "Owned by group: {name}": "Во сопственост на групата: {name}", + "No group owns this project.": "Ниедна група не е сопственик на овој проект.", + "Owned by group": "Во сопственост на група", + "Search for a group…": "Пребарај група…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Не е пронајдена група. Поставките за споделување на вашиот администратор одредуваат кои групи можете да ги најдете.", + "No owning group": "Без група сопственик", + "Could not search for groups. Please try again.": "Пребарувањето групи не успеа. Обидете се повторно.", + "Could not change the owning group": "Групата сопственик не може да се промени", + "You can read this project. Only its members change it.": "Може да го читате овој проект. Го менуваат само неговите членови.", + "Course": "Предмет", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Предметот што се предава на овој час, на пример изборен предмет, кога училишната апликација за учење го знае.", + "Online meeting link": "Врска до онлајн часот", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Каде учениците се приклучуваат на овој час онлајн. Копчето Приклучи се се прикажува само за https врска." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mk.json b/l10n/mk.json index 6a9b07c8..809f16b7 100644 --- a/l10n/mk.json +++ b/l10n/mk.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Активни проекти", + "Archived projects": "Архивирани проекти", + "Boards": "Табли", + "My projects": "Мои проекти", + "Portfolio": "Портфолио", + "Project board": "Табла на проектот", + "Projects I am in": "Проекти во кои учествувам", + "Timeline": "Временска линија", + "Timesheet": "Евиденција на време", + "Features & roadmap": "Функции и патоказ", + "Flow": "Тек", + "Flows": "Текови", + "Reports": "Извештаи", + "Pick a report to open it.": "Изберете извештај за да го отворите.", + "In progress": "Во тек", + "Date": "Датум", + "Due": "Рок", + "Assignee": "Доделено", + "Who": "Кој", + "What": "Што", + "Minutes": "Минути", + "Entries": "Записи", + "Most recent": "Најнови", + "Per person": "По лице", + "By status": "По статус", + "By priority": "По приоритет", + "Task status": "Статус на задачи", + "Time spent": "Потрошено време", + "Capacity": "Капацитет", + "Due soonest": "Најблизок рок", + "Minutes logged": "Запишани минути", + "Nothing is due": "Ништа не доспева", + "Nothing logged yet": "Сè уште ништо не е запишано", + "What is open, what is blocked, and what is overdue.": "Што е отворено, што е блокирано и што доцни.", + "How allocation is spread across the people working on projects.": "Како е распоредено оптоварувањето меѓу луѓето на проекти.", + "Hours logged, and the projects they went to.": "Запишаните часови и проектите на кои отишле.", + "Billable": "Наплатливо", + "Budget: {amount}": "Буџет: {amount}", + "Loading projects": "Се вчитуваат проекти", + "No projects for this client yet": "Сè уште нема проекти за овој клиент", + "Open in Planninq": "Отвори во Planninq", + "This project could not be found": "Овој проект не е пронајден", + "Untitled project": "Проект без наслов", + "and {count} more": "и уште {count}", + "Store": "Продавница", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Инсталирајте регистри, шеми и текови објавени од други организации.", + "Work Date": "Датум на работа", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Дејства на колоната", + "Columns": "Колони", + "Could not remove the column. Please try again.": "Колоната не може да се отстрани. Обидете се повторно.", + "Could not save the column. Please try again.": "Колоната не може да се зачува. Обидете се повторно.", + "Done column": "Колона за завршени", + "Edit column": "Уреди колона", + "Keep the card's status": "Задржи го статусот на картичката", + "Move its cards to": "Премести ги нејзините картички во", + "Move left": "Помести лево", + "Move right": "Помести десно", + "Status of cards moved here": "Статус на картичките преместени овде", + "The last done column cannot be removed.": "Последната колона за завршени не може да се отстрани.", + "WIP limit": "WIP ограничување", + "over limit": "над ограничувањето", + "The status a card gets when it is moved into this column.": "Статусот што го добива картичката кога ќе се премести во оваа колона.", + "All priorities": "Сите приоритети", + "Could not create the task. Please try again.": "Задачата не може да се создаде. Обидете се повторно.", + "Created": "Создадено", + "Move to backlog": "Во заостатокот", + "Move to board": "На таблата", + "New task": "Нова задача", + "Nothing in the backlog": "Нема ништо во заостатокот", + "Rank": "Ранг", + "Sort by": "Подреди по", + "Sort by rank to reorder": "Подредете по ранг за да го промените редоследот", + "Task actions": "Дејства на задачата", + "All labels": "Сите ознаки", + "Filter tasks by label": "Филтрирај задачи по ознака", + "View timeline": "Прикажи временска линија", + "Board": "Табла", + "List": "Листа", + "Column": "Колона", + "Board or list": "Табла или листа", + "Log": "Дневник", + "Add entry": "Додај запис", + "Show": "Прикажи", + "No actions yet": "Сѐ уште нема дејства", + "Closed": "Затворено", + "Entry actions": "Дејства на записот", + "Add action": "Додај дејство", + "by {author}": "од {author}", + "saved {time}": "зачувано {time}", + "Attendees: {names}": "Присутни: {names}", + "Add the first entry": "Додај го првиот запис", + "Issues": "Проблеми", + "Lessons learned": "Научени лекции", + "Meetings": "Состаноци", + "Decisions": "Одлуки", + "Actions": "Дејства", + "Issue": "Проблем", + "Lesson learned": "Научена лекција", + "Meeting": "Состанок", + "Decision": "Одлука", + "About this project": "За овој проект", + "No description yet": "Сѐ уште нема опис", + "Start date": "Датум на почеток", + "Not set": "Не е поставено", + "End date": "Датум на крај", + "Progress": "Напредок", + "No tasks yet": "Сѐ уште нема задачи", + "Open the board": "Отвори ја таблата", + "People": "Луѓе", + "Owner": "Сопственик", + "Latest log entries": "Најнови записи", + "Open the log": "Отвори го дневникот", + "{done} of {total} tasks done": "Завршени {done} од {total} задачи", + "Edit entry": "Уреди запис", + "Type": "Вид", + "Attendees": "Присутни", + "Issue is closed": "Проблемот е затворен", + "Could not save the entry. Please try again.": "Записот не може да се зачува. Обидете се повторно.", + "From: {title}": "Од: {title}", + "What needs to happen": "Што треба да се направи", + "Could not create the action. Please try again.": "Дејството не може да се создаде. Обидете се повторно.", + "The action was created but could not be linked to the entry.": "Дејството е создадено, но не може да се поврзе со записот.", + "Project pages": "Страници на проектот", + "Overview": "Преглед", + "Risks": "Ризици", + "Log entry": "Запис во дневник", + "A short name for the entry": "Краток назив за записот", + "Project": "Проект", + "The project this entry belongs to": "Проектот на кој му припаѓа записот", + "What kind of entry this is": "Каков вид запис е ова", + "When it happened": "Кога се случило", + "What happened, in Markdown": "Што се случило, во Markdown", + "Whether an issue is still open": "Дали проблемот е сѐ уште отворен", + "The people at a meeting": "Луѓето на состанок", + "Tasks that came out of this entry": "Задачи што произлегоа од овој запис", + "Add risk": "Додај ризик", + "Risk": "Ризик", + "Score": "Оценка", + "Response": "Одговор", + "Review date": "Датум на преглед", + "no longer on the project": "повеќе не е во проектот", + "Edit {title}": "Уреди {title}", + "No risks recorded yet": "Сѐ уште нема запишани ризици", + "Add the first risk": "Додај го првиот ризик", + "Medium": "Средно", + "Mitigating": "Се ублажува", + "Occurred": "Настапи", + "Avoid": "Избегни", + "Reduce": "Намали", + "Transfer": "Префрли", + "Accept": "Прифати", + "Highest open risks": "Највисоки отворени ризици", + "No open risks": "Нема отворени ризици", + "Open the risk register": "Отвори го регистарот на ризици", + "Edit risk": "Уреди ризик", + "What could go wrong": "Што може да тргне наопаку", + "Likelihood": "Веројатност", + "Impact": "Влијание", + "Score {score}": "Оценка {score}", + "Countermeasures": "Противмерки", + "Could not save the risk. Please try again.": "Ризикот не може да се зачува. Обидете се повторно.", + "Risks by likelihood and impact": "Ризици според веројатност и влијание", + "Risk scale": "Скала на ризик", + "The levels every project scores its risks on, and where low turns into medium and high": "Нивоата на кои секој проект ги оценува своите ризици, и каде ниско преминува во средно и високо", + "Number of levels": "Број на нивоа", + "Likelihood labels": "Ознаки за веројатност", + "Impact labels": "Ознаки за влијание", + "Level {level}": "Ниво {level}", + "Medium from score": "Средно од оценка", + "High from score": "Високо од оценка", + "Risk scale saved": "Скалата на ризик е зачувана", + "1 risk uses level {level}. Change it first.": "1 ризик го користи нивото {level}. Прво сменете го.", + "{count} risks use level {level}. Change them first.": "Ризици што го користат нивото {level}: {count}. Прво сменете ги.", + "Every level needs a label, and high must start above medium.": "Секое ниво треба ознака, а високо мора да почне над средно.", + "The project this risk belongs to": "Проектот на кој му припаѓа ризикот", + "The cause and the effect, in Markdown": "Причината и последицата, во Markdown", + "Category": "Категорија", + "A free grouping, such as planning, budget or supplier": "Слободно групирање, на пр. планирање, буџет или добавувач", + "How likely it is, on the admin's risk scale": "Колку е веројатно, на скалата на ризик на администраторот", + "How hard it would hit, on the admin's risk scale": "Колку силно би удрило, на скалата на ризик на администраторот", + "Likelihood times impact, calculated by the server": "Веројатност по влијание, пресметано од серверот", + "Where the risk stands": "Каде е ризикот", + "The person who watches this risk": "Лицето што го следи ризикот", + "How the project answers the risk": "Како проектот одговара на ризикот", + "What is done to prevent it or soften it, in Markdown": "Што се прави за да се спречи или ублажи, во Markdown", + "When to look at this risk again": "Кога повторно да се прегледа ризикот", + "Very low": "Многу ниско", + "Very high": "Многу високо", + "All projects": "Сите проекти", + "Project status report": "Извештај за состојбата на проектот", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датиран извештај за тоа како стои проектот со пари, организација, време, информации, квалитет и ризик (GROTIK аспектите), секој со белешка.", + "The project this report is about": "Проектот на кој се однесува извештајот", + "Report date": "Датум на извештајот", + "The day the report describes": "Денот што го опишува извештајот", + "Money": "Пари", + "How the project stands on this aspect": "Како стои проектот во овој аспект", + "On track": "Според планот", + "At risk": "Загрозено", + "Off track": "Надвор од планот", + "Money note": "Белешка за пари", + "A short explanation of this status": "Кратко објаснување на оваа состојба", + "Organisation": "Организација", + "Organisation note": "Белешка за организацијата", + "Time": "Време", + "Time note": "Белешка за времето", + "Information": "Информации", + "Information note": "Белешка за информациите", + "Quality": "Квалитет", + "Quality note": "Белешка за квалитетот", + "Risk note": "Белешка за ризикот", + "Overall": "Вкупно", + "The worst of the six statuses, calculated by the server": "Најлошата од шесте состојби, пресметана од серверот", + "Health: money": "Здравје: пари", + "Copied from the newest status report": "Преземено од најновиот извештај за состојбата", + "Health: organisation": "Здравје: организација", + "Health: time": "Здравје: време", + "Health: information": "Здравје: информации", + "Health: quality": "Здравје: квалитет", + "Health: risk": "Здравје: ризик", + "Health: overall": "Здравје: вкупно", + "Health: report date": "Здравје: датум на извештајот", + "The date of the newest status report": "Датумот на најновиот извештај за состојбата", + "New report": "Нов извештај", + "Only the project owner writes status reports.": "Само сопственикот на проектот пишува извештаи за состојбата.", + "Latest report, {date}": "Последен извештај, {date}", + "Aspect": "Аспект", + "Note": "Белешка", + "Report history": "Историја на извештаи", + "Author": "Автор", + "No status reports yet": "Сè уште нема извештаи за состојбата", + "Write the first report": "Напиши го првиот извештај", + "Choose a status for every aspect to save the report.": "Изберете состојба за секој аспект за да го зачувате извештајот.", + "Suggested: on track.": "Предлог: според планот.", + "Suggested: at risk.": "Предлог: загрозено.", + "Suggested: off track.": "Предлог: надвор од планот.", + "1 task is past its due date.": "1 задача го помина рокот.", + "{count} tasks are past their due date.": "Задачи што го поминаа рокот: {count}.", + "The end date has passed with 1 open task.": "Крајниот датум помина со 1 отворена задача.", + "The end date has passed with {count} open tasks.": "Крајниот датум помина, отворени задачи: {count}.", + "No open task is past its due date.": "Ниту една отворена задача не го помина рокот.", + "The highest open risk, \"{title}\", scores {score}.": "Најголемиот отворен ризик, \"{title}\", има оценка {score}.", + "There are no open risks.": "Нема отворени ризици.", + "Costs are at {percent}% of the budget.": "Трошоците се на {percent}% од буџетот.", + "No suggestion: the project has no budget.": "Нема предлог: проектот нема буџет.", + "No suggestion: no costs are recorded for this project yet.": "Нема предлог: за овој проект сè уште нема евидентирани трошоци.", + "The report was not saved. Only the project owner can write status reports.": "Извештајот не е зачуван. Само сопственикот на проектот може да пишува извештаи за состојбата.", + "No report": "Нема извештај", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Група проекти што ги водат истите луѓе, на пример оддел или програма. Нејзините раководители го читаат секој проект во неа.", + "The name of the portfolio": "Име на портфолиото", + "What the portfolio holds and who runs it": "Што содржи портфолиото и кој го води", + "A colour for the portfolio's section in project lists": "Боја за делот на портфолиото во листите на проекти", + "Managers": "Раководители", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud кориснички ID на луѓето што го водат портфолиото", + "Order": "Редослед", + "Where the portfolio comes in project lists, lowest first": "Каде е портфолиото во листите на проекти, најнискиот прв", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Сопствената скала на ризик на ова портфолио како JSON, во истата форма како скалата на целата апликација. Празно значи скалата на апликацијата.", + "Portfolio readers": "Читатели на портфолиото", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud кориснички ID на раководителите на портфолиото на проектот", + "The portfolio this project belongs to": "Портфолиото на кое му припаѓа проектот", + "No portfolio": "Без портфолио", + "All portfolios": "Сите портфолија", + "You read this project as a manager of its portfolio. Only its members change it.": "Го читате овој проект како раководител на неговото портфолио. Го менуваат само неговите членови.", + "Portfolios": "Портфолија", + "Portfolio status": "Состојба на портфолиото", + "No portfolios yet": "Сè уште нема портфолија", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Администратор додава портфолија во Проекти, Портфолија. Проектите во портфолиото се наведени тука со нивната состојба.", + "Roll-up": "Резиме", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} според план, {atRisk} во ризик, {offTrack} надвор од план, {noReport} без извештај", + "No project in this portfolio that you can read.": "Нема проект во ова портфолио што можете да го читате.", + "Start": "Почеток", + "End": "Крај", + "Budget": "Буџет", + "Last report": "Последен извештај", + "Out of date": "Застарено", + "Portfolio timeline": "Временска линија на портфолиото", + "Zoom": "Зумирање", + "Could not load the timeline": "Временската линија не може да се вчита", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Администратор додава портфолија во Проекти, Портфолија. Проектите во портфолиото се прикажани тука на една временска линија.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Отворете проект за да ги видите неговите фази и задачи. Временската линија е само за читање.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Изоставени бидејќи не можете да ги читате: {count} проекти", + "Week": "Недела", + "Day": "Ден", + "Month": "Месец", + "Please try again later.": "Обидете се повторно подоцна.", + "Status reports": "Извештаи за состојба", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "По колку дена последниот извештај за состојба на проектот се означува како застарен во прегледот на портфолиото", + "Reporting period (days)": "Период на известување (денови)", + "The reporting period is a whole number of days from 1 to 365.": "Периодот на известување е цел број денови од 1 до 365.", + "Reporting period saved": "Периодот на известување е зачуван", + "The reporting period was not saved. Please try again.": "Периодот на известување не е зачуван. Обидете се повторно.", + "Every project of a portfolio with its status per aspect, rolled up.": "Секој проект од портфолиото со состојба по аспект, сумирано.", + "The projects of a portfolio on one timeline.": "Проектите од портфолиото на една временска линија.", + "Phases": "Фази", + "Add phase": "Додај фаза", + "No phases yet": "Сè уште нема фази", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Поделете го проектот на фази, како започнување, дефиниција и реализација. Фазата се затвора кога ќе се прикачи нејзиниот завршен документ.", + "{hours} hours": "{hours} часа", + "Concluding document: {title}": "Завршен документ: {title}", + "Concluding document missing": "Недостасува завршен документ", + "Move {title} up": "Помести {title} нагоре", + "Move {title} down": "Помести {title} надолу", + "Close phase": "Затвори фаза", + "Phase": "Фаза", + "Files": "Датотеки", + "Notes": "Белешки", + "Audit trail": "Ревизорска трага", + "Edit phase": "Уреди фаза", + "Name": "Име", + "Budget hours": "Планирани часови", + "Could not save the phase. Please try again.": "Фазата не може да се зачува. Обидете се повторно.", + "Close phase {title}": "Затвори ја фазата {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фазата се затвора со завршниот документ: прикачете го тука или изберете една од датотеките на фазата.", + "Concluding document": "Завршен документ", + "This phase has no files yet.": "Оваа фаза сè уште нема датотеки.", + "Upload a document": "Прикачи документ", + "The document was not uploaded. Please try again.": "Документот не е прикачен. Обидете се повторно.", + "Upload the concluding document before you close this phase.": "Прикачете го завршниот документ пред да ја затворите оваа фаза.", + "This phase cannot be closed from its current status.": "Оваа фаза не може да се затвори од нејзината моментална состојба.", + "The phase was not closed. Please try again.": "Фазата не е затворена. Обидете се повторно.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ИД на датотеката на оваа фаза што ја затвора. Фазата може да се заврши дури кога е поставен и датотеката е прикачена.", + "Import from Microsoft Project": "Увези од Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Изберете план зачуван од Microsoft Project во XML формат. Ништо не се увезува додека не потврдите.", + "Plan file": "Датотека на планот", + "What the import creates": "Што создава увозот", + "Tasks": "Задачи", + "Sub-tasks": "Подзадачи", + "Milestones": "Пресвртници", + "Links": "Врски", + "Already imported, updated in place: {count}": "Веќе увезено, ажурирано на место: {count}", + "What does not carry over": "Што не се пренесува", + "Tasks with resources, which are not imported: {count}": "Задачи со ресурси, кои не се увезуваат: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Задачи подлабоко од ниво 3, сместени под својата задача од ниво 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Врски освен крај-почеток, увезени како поврзани врски: {count}", + "Link lags, which are dropped: {count}": "Доцнења на врски, кои се отфрлаат: {count}", + "Links to a summary task, which are not imported: {count}": "Врски кон збирна задача, кои не се увезуваат: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Врски кон задачи надвор од овој план, кои не се увезуваат: {count}", + "No longer in the plan": "Веќе не е во планот", + "These stay in the project; remove them yourself if they are no longer needed.": "Остануваат во проектот; отстранете ги сами ако повеќе не се потребни.", + "Import": "Увези", + "Close": "Затвори", + "The plan is imported: {created} created, {updated} updated.": "Планот е увезен: создадени {created}, ажурирани {updated}.", + "Links that would close a loop were left out: {count}": "Врските што би затвориле јамка се изоставени: {count}", + "The import stopped part-way. Run it again to finish it.": "Увозот застана на половина пат. Пуштете го повторно за да го завршите.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Зачувајте го планот во Microsoft Project преку Датотека, Зачувај како, XML формат, и увезете ја таа датотека.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Оваа датотека декларира DOCTYPE или ентитети, кои не се прифаќаат.", + "The file is larger than 10 MB.": "Датотеката е поголема од 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Планот има повеќе од 2.000 задачи, повеќе отколку што прима еден увоз.", + "This file is not a Microsoft Project plan in XML format.": "Оваа датотека не е план на Microsoft Project во XML формат.", + "Choose a file to import.": "Изберете датотека за увоз.", + "Only the project owner can import a plan.": "Само сопственикот на проектот може да увезе план.", + "The plan could not be read. Please try again.": "Планот не можеше да се прочита. Обидете се повторно.", + "Linked case: {title}": "Поврзан предмет: {title}", + "Linked to a case": "Поврзано со предмет", + "Hand over to case": "Предај на предметот", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Непроменето ја копира секоја датотека на проектот и неговите задачи и датотека што го опишува проектот во поврзаниот предмет.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Копирани датотеки: {count}", + "Files that failed: {names}": "Неуспешни датотеки: {names}", + "The handover failed. Please try again.": "Предавањето не успеа. Обидете се повторно.", + "The linked case could not be found, or you cannot open it.": "Поврзаниот предмет не е пронајден или не можете да го отворите.", + "Case handovers": "Предавања на предметот", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Секое предавање на датотеките и метаподатоците на проектот на неговиот предмет: кога, кој, на кој предмет, секоја копирана датотека со нејзиниот SHA-256 и неуспешните датотеки.", + "Finance": "Финансии", + "Add cost line": "Додај ставка за трошок", + "Delivery terms": "Услови за испорака", + "Billing model": "Модел на наплата", + "Budget in euro": "Буџет во евра", + "Budget in hours": "Буџет во часови", + "Hourly rate in euro": "Цена по час во евра", + "Planned start": "Планиран почеток", + "Planned end": "Планиран крај", + "Planned dates": "Планирани датуми", + "Budget {amount}": "Буџет {amount}", + "No budget agreed": "Нема договорен буџет", + "Hours": "Часови", + "Only the project owner and the portfolio managers see the amounts.": "Износите ги гледаат само сопственикот на проектот и менаџерите на портфолиото.", + "Budget against cost per category": "Буџет наспроти трошоци по категорија", + "Labour (booked time)": "Труд (евидентирани часови)", + "No category": "Без категорија", + "Hours are not available": "Часовите не се достапни", + "Not yet assigned to a category": "Сè уште не е доделено на категорија", + "Total": "Вкупно", + "{spent} spent, {remaining} remaining": "{spent} потрошено, {remaining} преостанато", + "Budget against cost per phase": "Буџет наспроти трошоци по фаза", + "No phase": "Без фаза", + "Cost lines": "Ставки за трошок", + "From the finance system": "Од финансискиот систем", + "Edit cost line {amount}": "Уреди ја ставката за трошок {amount}", + "No cost lines yet": "Сè уште нема ставки за трошок", + "Commitments": "Обврски", + "Actual cost": "Реален трошок", + "Forecast": "Прогноза", + "Remaining": "Преостанато", + "Not planned yet": "Сè уште не е планирано", + "{start} to {end}": "{start} до {end}", + "The terms were not saved. Please try again.": "Условите не се зачувани. Обидете се повторно.", + "Terms saved": "Условите се зачувани", + "Fixed price": "Фиксна цена", + "Hourly": "По час", + "Not billed": "Не се наплаќа", + "Commitment": "Обврска", + "Edit cost line": "Уреди ставка за трошок", + "Kind": "Вид", + "Amount in euro": "Износ во евра", + "Remove": "Отстрани", + "Could not save the cost line. Only the project owner changes the money of a project.": "Ставката за трошок не може да се зачува. Парите на проектот ги менува само сопственикот на проектот.", + "Could not remove the cost line. Please try again.": "Ставката за трошок не може да се отстрани. Обидете се повторно.", + "{amount} over budget": "{amount} над буџетот", + "Cost categories": "Категории на трошоци", + "The categories every project splits its budget and costs into, one per line": "Категориите на кои секој проект ги дели својот буџет и трошоци, по една во ред", + "Categories": "Категории", + "Give at least one category, each name once.": "Внесете барем една категорија, секое име еднаш.", + "Cost categories saved": "Категориите на трошоци се зачувани", + "The cost categories were not saved. Please try again.": "Категориите на трошоци не се зачувани. Обидете се повторно.", + "Finance line": "Финансиска ставка", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Еден паричен износ на проект: буџет, обврска, реален трошок или прогноза, во категорија на трошоци и по желба во фаза. Ја внесува сопственикот на проектот или ја праќа финансискиот систем преку апликацијата за интеграција.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Проектот на кој му припаѓа износот. Празно за ставка од финансискиот систем чиј број на проект не одговара на ниеден проект.", + "The phase this amount belongs to, if any": "Фазата на која ѝ припаѓа износот, ако постои", + "The cost category, one of the categories the admin set up": "Категоријата на трошоци, една од категориите што ги постави администраторот", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Дали износот е буџет, обврска, реален трошок или прогноза", + "Amount": "Износ", + "The amount in the reporting currency (euro)": "Износот во валутата за известување (евро)", + "The date the amount was booked or is expected": "Датумот кога износот е книжен или се очекува", + "What the amount is for": "За што е износот", + "Whether a person entered the line or the finance system sent it": "Дали ставката ја внело лице или ја испратил финансискиот систем", + "Entered by hand": "Внесено рачно", + "Finance line id": "Ид на финансиската ставка", + "The finance system's own id of this line. One imported line per id.": "Сопствениот ид на оваа ставка во финансискиот систем. Една увезена ставка по ид.", + "Project number": "Број на проект", + "The project number the finance system sent, matched against the project key": "Бројот на проект што го испрати финансискиот систем, спореден со клучот на проектот", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Портфолиото на проектот на ставката, преземено од проектот за збировите на портфолиото да бараат еден филтер", + "Finance readers": "Читатели на финансии", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID на корисниците на Nextcloud што смеат да го гледаат износот: сопственикот на проектот и менаџерите на неговото портфолио", + "Project owner": "Сопственик на проектот", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID на корисникот на Nextcloud сопственик на проектот, кој смее да менува и отстранува рачни ставки", + "How the client pays: not billed, a fixed price, or by the hour.": "Како плаќа клиентот: не се наплаќа, фиксна цена или по час.", + "Portfolio finance": "Финансии на портфолиото", + "You cannot see the money of any project in this portfolio": "Не можете да ги видите парите на ниеден проект во ова портфолио", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Серверот врати ставки за трошок од проекти надвор од ова портфолио, па овие збирови можат да бидат погрешни.", + "Projects left out because you cannot see their money: {count}": "Изоставени проекти бидејќи не можете да ги видите нивните пари: {count}", + "Unmatched finance lines": "Неповрзани финансиски ставки", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Буџет, обврски, реален трошок и прогноза собрани за портфолио.", + "Subprojects": "Потпроекти", + "{done} of {total}": "{done} од {total}", + "{done} of {total} tasks done, including subprojects": "{done} од {total} задачи завршени, вклучувајќи потпроекти", + "Show the subprojects of {title}": "Прикажи ги потпроектите на {title}", + "Hide the subprojects of {title}": "Скриј ги потпроектите на {title}", + "Part of": "Дел од", + "No parent project": "Нема надреден проект", + "A project cannot sit under one of its own subprojects.": "Проектот не може да биде под еден од своите потпроекти.", + "Projects nest three levels deep at most: programme, project and subproject.": "Проектите се вгнездуваат најмногу три нивоа длабоко: програма, проект и потпроект.", + "Parent project": "Надреден проект", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Проектот под кој е овој проект, на пример програма. Проектите се вгнездуваат најмногу три нивоа длабоко.", + "Yes": "Да", + "No": "Не", + "{label} (required)": "{label} (задолжително)", + "{label} is required": "{label} е задолжително", + "Project field": "Поле на проект", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поле што администраторот го додава на секој проект, на пример област на политика или вредност на договор.", + "Key": "Клуч", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Постојаното име под кое се зачувува вредноста, во lower camel case. Задржете го кога проектите го користат.", + "Label": "Ознака", + "The name people see next to the field": "Името што луѓето го гледаат до полето", + "What the field holds": "Што содржи полето", + "Text": "Текст", + "Number": "Број", + "Choice": "Избор", + "Person": "Лице", + "Yes or no": "Да или не", + "Options": "Опции", + "The choices of a choice field": "Опциите на поле за избор", + "Required": "Задолжително", + "Whether a project must fill in the field": "Дали проектот мора да го пополни полето", + "Where the field appears, lowest first": "Каде се појавува полето, најниското прво", + "Applies to": "Важи за", + "What the field is added to": "На што се додава полето", + "Custom fields": "Сопствени полиња", + "The values of the project fields an admin defined, keyed by the field's key.": "Вредностите на полињата на проектот што ги дефинирал администраторот, според клучот на полето.", + "Project fields": "Полиња на проект", + "Related": "Поврзани", + "Remove link": "Отстрани врска", + "Link type": "Вид врска", + "Relates to": "Поврзано со", + "Duplicates": "Дуплира", + "Project key": "Клуч на проектот", + "Every task number starts with it, such as VERG-42.": "Секој број на задача започнува со него, на пример VERG-42.", + "This key is already used by another project.": "Овој клуч веќе го користи друг проект.", + "Use 2 to 10 letters and digits, starting with a letter.": "Користете од 2 до 10 букви и цифри, почнувајќи со буква.", + "The key cannot change once tasks carry it.": "Клучот не може да се смени откако задачите го носат.", + "Project saved. The existing tasks get their numbers in the background.": "Проектот е зачуван. Постојните задачи ги добиваат своите броеви во позадина.", + "Next task number": "Број на следната задача", + "The number the next task of this project gets in its key. Only the system writes it.": "Бројот што следната задача од овој проект го добива во својот клуч. Го запишува само системот.", + "Restore {title}": "Врати {title}", + "Restore": "Врати", + "Project restored": "Проектот е вратен", + "Could not restore the project": "Проектот не може да се врати", + "Bring this project back to the active list.": "Врати го овој проект во списокот на активни проекти.", + "Restore project": "Врати го проектот", + "Request reason": "Причина за барањето", + "Why the requester needs this project. Filled in when the project is requested.": "Зошто на барателот му треба овој проект. Се пополнува при барањето.", + "Reviewed by": "Прегледано од", + "The user who approved or rejected the request.": "Корисникот што го одобри или одби барањето.", + "Reviewed at": "Прегледано на", + "When the request was approved or rejected.": "Кога барањето беше одобрено или одбиено.", + "Review note": "Белешка од прегледот", + "The reviewer's reason, shown to the requester when a request is not approved.": "Причината на прегледувачот, што барателот ја гледа кога барањето не е одобрено.", + "Members of these groups": "Членови на овие групи", + "Groups that may create projects": "Групи што смеат да создаваат проекти", + "The group {group} no longer exists. Save to remove it.": "Групата {group} веќе не постои. Зачувајте за да ја отстраните.", + "Review project request": "Прегледај барање за проект", + "Requested by": "Побарано од", + "Why it is needed": "Зошто е потребен", + "Desired start date": "Посакуван датум на почеток", + "Why is it not approved?": "Зошто не е одобрен?", + "Give a reason. The requester sees it.": "Наведете причина. Барателот ќе ја види.", + "Approve": "Одобри", + "Reject": "Одбиј", + "Reject request": "Одбиј го барањето", + "The review was not saved. Try again.": "Прегледот не е зачуван. Обидете се повторно.", + "This project is waiting for review": "Овој проект чека преглед", + "This request was not approved": "Ова барање не е одобрено", + "Reason: {note}": "Причина: {note}", + "Review request": "Прегледај го барањето", + "Request a project": "Побарај проект", + "Step {step} of 2": "Чекор {step} од 2", + "Why is this project needed?": "Зошто е потребен овој проект?", + "Give a reason. The reviewer reads it.": "Наведете причина. Прегледувачот ќе ја прочита.", + "Back": "Назад", + "Next": "Следно", + "Send request": "Испрати барање", + "The request was not sent. Try again.": "Барањето не е испратено. Обидете се повторно.", + "Requested": "Побарано", + "Not approved": "Не е одобрено", + "Your request was sent": "Вашето барање е испратено", + "Let everyone else request a project": "Дозволи им на сите други да побараат проект", + "Add a task": "Додај задача", + "Delete task": "Избриши задача", + "Edit task": "Уреди задача", + "Write": "Пишувај", + "Preview": "Преглед", + "Markdown works here: headings, lists and links.": "Тука работи Markdown: наслови, листи и врски.", + "Could not save the task. Please try again.": "Задачата не може да се зачува. Обидете се повторно.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "На \"{title}\" е евидентирано време, па не може да се избрише. Наместо тоа можете да ја откажете: записите за време остануваат.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Да се избрише \"{title}\"? Се отстрануваат и нејзините врски со други задачи. Ова не може да се врати.", + "Keep task": "Задржи ја задачата", + "Cancel task": "Откажи ја задачата", + "Only the reporter, the project owner or an admin can delete this task.": "Оваа задача може да ја избрише само пријавувачот, сопственикот на проектот или администратор.", + "Could not delete the task. Please try again.": "Задачата не може да се избрише. Обидете се повторно.", + "Could not cancel the task. Please try again.": "Задачата не може да се откаже. Обидете се повторно.", + "Responsible": "Одговорно лице", + "Also working on this": "На ова работат и", + "Labels": "Ознаки", + "Could not change the priority. Please try again.": "Приоритетот не може да се промени. Обидете се повторно.", + "Other project members who work on this task alongside the person responsible.": "Други членови на проектот кои работат на задачата заедно со одговорното лице.", + "Duplicate": "Дуплирај", + "Could not copy the task. Please try again.": "Задачата не може да се копира. Обидете се повторно.", + "Subtasks": "Подзадачи", + "{done} of {total} done": "Завршени {done} од {total}", + "Add a subtask": "Додај подзадача", + "Checklist": "Список за проверка", + "Checklist item actions": "Дејства за ставка од списокот", + "Add a checklist item": "Додај ставка во списокот", + "Subtasks: {estimate} estimated, {logged} logged": "Подзадачи: проценето {estimate}, евидентирано {logged}", + "Total estimate: {total}": "Вкупна проценка: {total}", + "Part of {title}": "Дел од {title}", + "Checklist: {count} done": "Список за проверка: завршени {count}", + "This task has subtasks: {count}.": "Оваа задача има подзадачи: {count}.", + "Keep subtasks as separate tasks": "Задржи ги подзадачите како посебни задачи", + "Delete subtasks too": "Избриши ги и подзадачите", + "Copy of {title}": "Копија од {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Задачата е копирана, но не и сите нејзини подзадачи. Проверете ја копијата.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Мали чекори во задачата. Секоја ставка има id, текст и дали е завршена.", + "Open work per person and per project.": "Отворена работа по лице и по проект.", + "View": "Приказ", + "By person": "По лице", + "By project": "По проект", + "Hours left": "Преостанати часови", + "Tasks without an estimate": "Задачи без проценка", + "Due in 14 days": "Рок во 14 дена", + "Shared": "Споделено", + "Unassigned": "Недоделено", + "{hours} h": "{hours} ч", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Се прикажува работата во проектите што можете да ги видите. Часовите се сметаат на одговорното лице; споделените задачи се сметаат без часови.", + "No open work in these projects.": "Нема отворена работа во овие проекти.", + "Open work": "Отворена работа", + "{count} open tasks": "{count} отворени задачи", + "Create a project to see capacity here.": "Создадете проект за да го видите капацитетот тука.", + "My tasks": "Мои задачи", + "Show all my tasks": "Прикажи ги сите мои задачи", + "No tasks assigned to you": "Немате доделени задачи", + "Browse projects": "Прелистај проекти", + "Later": "Подоцна", + "Due {date}": "Рок {date}", + "Could not change the status. Please try again.": "Статусот не може да се промени. Обидете се повторно.", + "Completed today": "Завршени денес", + "My open tasks": "Мои отворени задачи", + "My overdue tasks": "Мои задоцнети задачи", + "My tasks in progress": "Мои задачи во тек", + "Pin to the top": "Закачи најгоре", + "Unpin": "Откачи", + "Pinned": "Закачено", + "Actions for {title}": "Дејства за {title}", + "Could not save your project order. Please try again.": "Редоследот на проектите не може да се зачува. Обидете се повторно.", + "No boards yet": "Сè уште нема табли", + "Create a project to get a board.": "Создадете проект за да добиете табла.", + "Use the Projects page to create and manage your projects and tasks.": "На страницата Проекти создавајте и управувајте со вашите проекти и задачи.", + "Go to projects": "Оди на проекти", + "You are not a member of any projects yet.": "Сè уште не сте член на ниту еден проект.", + "Could not search for users. Please try again.": "Пребарувањето корисници не успеа. Обидете се повторно.", + "Project creation is restricted to administrators.": "Само администраторите можат да создаваат проекти.", + "Only the project owner or an administrator can delete this project.": "Само сопственикот на проектот или администратор може да го избрише овој проект.", + "No projects are available to you yet. Ask an administrator to create one.": "Сè уште немате достапни проекти. Замолете администратор да создаде еден.", + "Due: {date}": "Рок: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Задачите со датум на почеток или рок се прикажуваат на временската линија. Додадете датуми за да ги видите тука.", + "You do not have access to this project.": "Немате пристап до овој проект.", + "Zoom level": "Ниво на зумирање", + "Unscheduled": "Непланирано", + "Start: {date}": "Почеток: {date}", + "Today": "Денес", + "No scheduled tasks": "Нема планирани задачи", + "An unexpected error occurred.": "Настана неочекувана грешка.", + "Column {number} name": "Име на колоната {number}", + "Failed to save creation policy": "Правилото за создавање не може да се зачува", + "All authenticated users": "Сите најавени корисници", + "Control who may create new projects": "Одредете кој смее да создава нови проекти", + "Administrators only": "Само администратори", + "Project creation": "Создавање проекти", + "Allow project creation": "Дозволи создавање проекти", + "Creation policy saved successfully": "Правилото за создавање е зачувано", + "Initializing…": "Се стартува…", + "e.g. 2h 30m, 90m, 1.5h": "на пр. 2h 30m, 90m, 1.5h", + "Log time": "Запиши време", + "Save estimate": "Зачувај проценка", + "Logged: {logged}": "Запишано: {logged}", + "over by {amount}": "пречекорено за {amount}", + "Time tracking": "Евиденција на време", + "Estimate": "Проценка", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Внесете валидна проценка (на пр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Внесете валидно траење (на пр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Записот за време не може да се зачува. Обидете се повторно.", + "Edit time entry": "Уреди запис за време", + "Duration": "Траење", + "Date range": "Период", + "Last week": "Минатата недела", + "No time logged": "Нема запишано време", + "Log time on a task to see it here.": "Запишете време на задача за да го видите тука.", + "To date": "До датум", + "This week": "Оваа недела", + "Total: {total}": "Вкупно: {total}", + "From date": "Од датум", + "Custom range": "Сопствен период", + "All time": "Цело време", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Задачата не може да се избрише, па може да останат податоци. Избришете го проектот повторно.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Записот за време не може да се избрише, па може да останат податоци. Избришете го проектот повторно.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Колоната не може да се избрише, па може да останат податоци. Избришете го проектот повторно.", + "Could not delete the project. Please try again.": "Проектот не може да се избрише. Обидете се повторно.", + "Notification settings": "Поставки за известувања", + "Configure when due-date reminders are sent": "Одредете кога се испраќаат потсетници за рокови", + "Due-date reminder lead time (hours)": "Време на потсетникот пред рокот (часови)", + "Lead time must be between 1 and 336 hours": "Времето мора да биде меѓу 1 и 336 часа", + "Reminder lead time saved successfully": "Времето на потсетникот е зачувано", + "Failed to save reminder lead time": "Времето на потсетникот не може да се зачува", + "Notifications": "Известувања", + "Notify me 1 day before a task's due date": "Извести ме 1 ден пред рокот на задачата", + "Draft": "Нацрт", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Дали часот е нацрт што го гледа само неговиот наставник, се одржува или е откажан.", + "New release": "Ново издание", + "Roadmap chart. The same releases and epics are listed below.": "Графикон на патоказот. Истите изданија и епови се наведени подолу.", + "Nothing on the roadmap yet": "Сè уште ништо на патоказот", + "Releases with a target date and epics with dated tasks appear here.": "Тука се прикажуваат изданијата со целен датум и еповите со задачи што имаат датум.", + "Releases": "Изданија", + "No releases yet": "Сè уште нема изданија", + "Target date: {date}": "Целен датум: {date}", + "No target date": "Нема целен датум", + "Edit {name}": "Уреди {name}", + "Mark {name} as released": "Означи {name} како објавено", + "Mark as released": "Означи како објавено", + "Epics": "Епови", + "No epics yet. Open a task to make it an epic.": "Сè уште нема епови. Отворете задача за да ја направите еп.", + "Not scheduled yet": "Сè уште не е закажано", + "Planned": "Планирано", + "Released": "Објавено", + "Edit release": "Уреди издание", + "Target date": "Целен датум", + "Could not save the release. Please try again.": "Изданието не може да се зачува. Обидете се повторно.", + "Every task of this release is done or cancelled.": "Секоја задача од ова издание е завршена или откажана.", + "Not finished yet: {count}": "Сè уште незавршени: {count}", + "What happens to these tasks?": "Што се случува со овие задачи?", + "Move to {name}": "Премести во {name}", + "Remove the release": "Отстрани го изданието", + "Keep it on {name}": "Остави ги во {name}", + "Could not mark the release as released. Please try again.": "Изданието не може да се означи како објавено. Обидете се повторно.", + "Roadmap": "Патоказ", + "Tasks or roadmap": "Задачи или патоказ", + "Release": "Издание", + "Epic": "Еп", + "This task is an epic": "Оваа задача е еп", + "A named, dated delivery of a project that its tasks are planned against.": "Именувана испорака на проект со датум, според која се планираат неговите задачи.", + "Name of the release": "Име на изданието", + "The project this release belongs to": "Проектот на кој му припаѓа ова издание", + "What this release delivers": "Што испорачува ова издание", + "When work on the release starts": "Кога започнува работата на изданието", + "The date the release is due": "Датумот до кој изданието треба да е готово", + "Whether the release is planned, released or archived": "Дали изданието е планирано, објавено или архивирано", + "Released on": "Објавено на", + "When the release was marked as released": "Кога изданието е означено како објавено", + "The release this task is planned for": "Изданието за кое е планирана оваа задача", + "Board view options": "Опции за приказ на таблата", + "Colour cards": "Обој ги картичките", + "No colour": "Без боја", + "By label": "По ознака", + "Swimlanes": "Патеки", + "No swimlanes": "Без патеки", + "By assignee": "По задолжено лице", + "By epic": "По епик", + "No assignee": "Недоделено", + "No epic": "Без епик", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Картичките остануваат во редот на својот епик. Сменете го епикот на страницата на задачата.", + "Hand over to": "Предај на", + "Could not save your board view. It applies until you reload.": "Приказот на таблата не е зачуван. Важи до повторно вчитување.", + "Timetable wish": "Желба за распоред", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Желба што генераторот ја зема предвид. Цврста желба секогаш ја почитува, мека каде што може.", + "Whether the wish is about a teacher, a group, a room or one activity": "Дали желбата се однесува на наставник, група, простор или една активност", + "Teacher": "Наставник", + "Group": "Група", + "Reference": "Упатување", + "The user, group, room or activity the wish is about": "Корисникот, групата, просторот или активноста на која се однесува желбата", + "What the wish asks for": "Што бара желбата", + "Not on these periods": "Не во овие часови", + "Preferably not on these periods": "Подобро не во овие часови", + "At most a number of lessons a day": "Најмногу одреден број часови дневно", + "No free periods between lessons": "Без дупки меѓу часовите", + "Always the same room": "Секогаш истиот простор", + "Periods": "Часови", + "The periods of the week the wish is about, such as wed-5": "Часовите во неделата на кои се однесува желбата, на пр. wed-5", + "Limit": "Граница", + "The most lessons a day, for a wish of that kind": "Најмногу часови дневно, за желба од тој вид", + "Strength": "Јачина", + "Whether the generator must keep the wish or should keep it": "Дали генераторот мора или треба да ја почитува желбата", + "Hard": "Цврста", + "Soft": "Мека", + "Weight": "Тежина", + "How much a soft wish counts, from 1 to 3": "Колку вреди мека желба, од 1 до 3", + "Why the wish exists": "Зошто постои желбата", + "Timetable scenario": "Сценарио за распоред", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Еден неделен образец, направен од генераторот или преземен од тековниот распоред. Го чува својот влез и колку добро ги почитува желбите.", + "The name timetablers know the scenario by": "Името под кое составувачите на распоред го знаат сценариото", + "Whether the generator made it or it came from the current timetable": "Дали го направил генераторот или доаѓа од тековниот распоред", + "Generated": "Генерирано", + "From the current timetable": "Од тековниот распоред", + "Week of": "Недела од", + "The Monday of the first week of the window": "Понеделникот на првата недела од периодот", + "Window start": "Почеток на периодот", + "The first day the week pattern applies to": "Првиот ден за кој важи неделниот образец", + "Window end": "Крај на периодот", + "The last day the week pattern applies to": "Последниот ден за кој важи неделниот образец", + "Waiting, generating, done, failed, or published as draft lessons": "Чека, се генерира, готово, неуспешно или објавено како нацрт-часови", + "Waiting": "Чека", + "Generating": "Се генерира", + "Failed": "Неуспешно", + "Published": "Објавено", + "Seed": "Семе", + "The number the generator starts from, so a run can be repeated": "Бројот од кој почнува генераторот, за извршувањето да може да се повтори", + "Input": "Влез", + "The periods, rooms, lessons and wishes the scenario was made from": "Часовите, просториите, предавањата и желбите од кои е направено сценариото", + "Placements": "Сместувања", + "Each lesson with the period and room it was given": "Секој час со терминот и просторот што ги добил", + "Unplaced lessons": "Несместени часови", + "Lessons without a place, each with the hard wish that blocked it": "Часови без место, секој со цврстата желба што го запрела", + "Broken wishes": "Прекршени желби", + "The wishes this scenario breaks, with the lessons that break them": "Желбите што ова сценарио ги крши, со часовите што ги кршат", + "Measures": "Мерки", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Сместени часови, прекршени желби, дупки на наставниците, часови дневно и користење на простории", + "Reason": "Причина", + "Why the run failed": "Зошто извршувањето не успеа", + "Published at": "Објавено на", + "When the scenario was written out as draft lessons": "Кога сценариото е запишано како нацрт-часови", + "Edit wish": "Уреди желба", + "New wish": "Нова желба", + "Hard: the generator always keeps it": "Задолжителна: генераторот секогаш ја почитува", + "Soft: the generator keeps it where it can": "Флексибилна: генераторот ја почитува каде што може", + "Weight (1 to 3)": "Тежина (од 1 до 3)", + "Most lessons a day": "Најмногу часови дневно", + "Period": "Час", + "{day} period {number}": "{day} час {number}", + "Teacher (user name)": "Наставник (корисничко име)", + "Activity (group:subject)": "Активност (група:предмет)", + "Say who or what the wish is about.": "Наведете на кого или на што се однесува желбата.", + "Choose at least one period.": "Изберете барем еден час.", + "The limit is a whole number of 1 or more.": "Ограничувањето е цел број 1 или повеќе.", + "Timetable": "Распоред", + "Wishes": "Желби", + "Timetable wishes": "Желби за распоредот", + "Generator run": "Извршување на генераторот", + "Generator progress": "Напредок на генераторот", + "The run failed: {reason}": "Извршувањето не успеа: {reason}", + "{placed} of {lessons} lessons placed": "Сместени {placed} од {lessons} часови", + "Generate again": "Генерирај повторно", + "Generate": "Генерирај", + "Every lesson has a place.": "Секој час има место.", + "Lesson": "Час", + "No free period and room": "Нема слободен час и просторија", + "Broken soft wishes": "Прекршени флексибилни желби", + "Every soft wish is kept.": "Секоја флексибилна желба е почитувана.", + "Wish": "Желба", + "Lessons": "Часови", + "Generating: {percent}% of the time budget used": "Се генерира: искористено {percent}% од времето", + "Waiting to start": "Чека почеток", + "Published as draft lessons": "Објавено како нацрт-часови", + "Could not read the scenario.": "Сценариото не може да се прочита.", + "Could not start the run.": "Извршувањето не може да започне.", + "Scenarios": "Сценарија", + "Timetable scenarios": "Сценарија за распоредот", + "Scenario": "Сценарио", + "Take the current timetable": "Преземи го тековниот распоред", + "Could not take the current timetable.": "Тековниот распоред не можеше да се преземе.", + "Broken hard wishes": "Прекршени задолжителни желби", + "Not on a period of the week grid": "Не е на час од неделната мрежа", + "Compare scenarios": "Спореди сценарија", + "Scenarios to compare": "Сценарија за споредба", + "Choose two or three scenarios to compare them.": "Изберете две или три сценарија за споредба.", + "Measure": "Мерка", + "Best": "Најдобро", + "Lessons that differ": "Часови што се разликуваат", + "No lesson differs.": "Ниту еден час не се разликува.", + "Not placed": "Не е сместен", + "{period} in {room}": "{period} во {room}", + "Lessons placed": "Сместени часови", + "Lessons without a place": "Часови без место", + "Clashes": "Судири", + "Hard wishes broken": "Прекршени задолжителни желби", + "Soft wishes broken": "Прекршени флексибилни желби", + "Soft wishes broken, weighted": "Прекршени флексибилни желби, пондерирани", + "Free periods between lessons, all teachers": "Слободни часови, сите наставници", + "Most free periods of one teacher": "Најмногу слободни часови на еден наставник", + "Most lessons of one group on a day": "Најмногу часови на една група во ден", + "Room use": "Користење на простории", + "Publish as draft lessons": "Објави како нацрт-часови", + "Draft lessons written: {count}": "Запишани нацрт-часови: {count}", + "Could not publish the scenario.": "Сценариото не можеше да се објави.", + "Rules": "Правила", + "Rules for {column}": "Правила за {column}", + "When a card enters this column": "Кога картичка ќе влезе во оваа колона", + "Action": "Дејство", + "Set the priority": "Постави приоритет", + "Assign to": "Додели на", + "Assign the person who moved the card": "Додели на лицето што ја премести картичката", + "Remove the assignee": "Отстрани го задолженото лице", + "Add a label": "Додај ознака", + "No longer a project member": "Веќе не е член на проектот", + "This label no longer exists": "Оваа ознака веќе не постои", + "Add rule": "Додај правило", + "Remove rule": "Отстрани правило", + "No rules yet. Add one to change a card when it enters this column.": "Сè уште нема правила. Додајте едно за да се менува картичката кога ќе влезе во оваа колона.", + "Could not save the rules. Please try again.": "Правилата не можеа да се зачуваат. Обидете се повторно.", + "1 rule runs when a card enters this column": "1 правило се извршува кога картичка ќе влезе во оваа колона", + "{count} rules run when a card enters this column": "Број на правила што се извршуваат кога картичка ќе влезе во оваа колона: {count}", + "Rules applied: {changes}": "Применети правила: {changes}", + "assigned to {name}": "доделено на {name}", + "assignee removed": "задолженото лице е отстрането", + "priority {priority}": "приоритет {priority}", + "label {label}": "ознака {label}", + "What happens to a card when it enters this column, applied in list order.": "Што се случува со картичка кога ќе влезе во оваа колона, по редоследот на списокот.", + "Value": "Вредност", + "What the rule does to the card.": "Што прави правилото со картичката.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Приоритетот, ID на корисникот или ID на ознаката што ги користи дејството; празно за дејства без вредност.", + "is not": "не е", + "{dimension} is not": "{dimension} не е", + "Saved filters": "Зачувани филтри", + "No saved filters yet": "Сè уште нема зачувани филтри", + "Save filter": "Зачувај филтер", + "Rename \"{name}\"": "Преименувај „{name}“", + "Delete \"{name}\"": "Избриши „{name}“", + "Clear filters": "Исчисти филтри", + "Showing {shown} of {total} tasks": "Прикажани {shown} од {total} задачи", + "Me": "Јас", + "No date": "Без датум", + "Rename saved filter": "Преименувај зачуван филтер", + "Share with the project": "Сподели со проектот", + "Give the filter a name": "Дајте му име на филтерот", + "Could not save the filter. Please try again.": "Филтерот не можеше да се зачува. Обидете се повторно.", + "Some labels in \"{name}\" no longer exist and were left out.": "Некои ознаки во „{name}“ веќе не постојат и се изоставени.", + "Could not delete the filter. Please try again.": "Филтерот не можеше да се избрише. Обидете се повторно.", + "Saved filter": "Зачуван филтер", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Именуван филтер на таблата на еден проект, приватен за лицето што го зачувало, освен ако е споделен со проектот.", + "The project whose board the filter applies to": "Проектот на чија табла се однесува филтерот", + "The name the filter is listed under": "Името под кое филтерот е во списокот", + "Saved by": "Зачувал(а)", + "Nextcloud user id of the person who saved the filter": "Nextcloud ID на корисникот што го зачувал филтерот", + "Shared with the project": "Споделен со проектот", + "Whether every project member sees and applies the filter": "Дали секој член на проектот го гледа филтерот и може да го примени", + "Criteria": "Критериуми", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Филтерот: задолжено лице, ознака, приоритет и рок, секое со е или не е и своите вредности", + "Cross-project view": "Меѓупроектен приказ", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Зачуван избор на проекти чии задачи се прикажуваат заедно во колони по статус, споделен со наведените луѓе.", + "Shared with": "Споделено со", + "The name the view is listed under": "Името под кое е наведен приказот", + "Nextcloud user id of the person who saved the view": "Nextcloud кориснички ID на личноста што го зачувала приказот", + "Nextcloud user ids of the people the view is shared with": "Nextcloud кориснички ID на луѓето со кои е споделен приказот", + "The projects whose tasks the view shows, at most twenty": "Проектите чии задачи ги прикажува приказот, најмногу дваесет", + "1 project in this view is hidden from you.": "1 проект во овој приказ е скриен од вас.", + "{count} projects in this view are hidden from you.": "Проекти во овој приказ скриени од вас: {count}.", + "{project} has no column for {status}.": "Проектот {project} нема колона за статусот {status}.", + "This view does not exist or is not shared with you.": "Овој приказ не постои или не е споделен со вас.", + "\"{task}\" moved to {status}.": "\"{task}\" е преместено во {status}.", + "Project: {title}": "Проект: {title}", + "Cross-project views": "Меѓупроектни прикази", + "New view": "Нов приказ", + "Edit view": "Уреди приказ", + "Delete view": "Избриши приказ", + "Give the view a name": "Дајте му име на приказот", + "Pick at least one project": "Изберете барем еден проект", + "A view shows at most {max} projects": "Приказот прикажува најмногу {max} проекти", + "Could not save the view. Please try again.": "Приказот не може да се зачува. Обидете се повторно.", + "Could not delete the view. Please try again.": "Приказот не може да се избрише. Обидете се повторно.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Да се избрише „{title}“? Проектите и нивните задачи остануваат какви што се.", + "People see the tasks of the projects they are in, never more.": "Секој ги гледа само задачите од проектите во кои е.", + "No views yet. A view shows the tasks of several of your projects together.": "Сè уште нема прикази. Приказот ги прикажува задачите од повеќе ваши проекти заедно.", + "Projects in view: {count}": "Проекти во приказот: {count}", + "Notify me when a task is assigned to me": "Извести ме кога ќе ми биде доделена задача", + "Also send these to me by email": "Испраќај ми ги и по е-пошта", + "Add an email address in your Nextcloud personal settings to get mail.": "Додајте е-адреса во личните поставки на Nextcloud за да добивате е-пошта.", + "Code link": "Врска до код", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, гранка, барање за спојување или проблем на платформа за код што се однесува на задача.", + "The task the link belongs to": "Задачата на која ѝ припаѓа врската", + "The project of the task": "Проектот на задачата", + "Task key": "Клуч на задачата", + "The task key the forge text named, such as VC-12": "Клучот на задачата наведен во текстот на платформата, на пр. VC-12", + "What the link points at": "Кон што покажува врската", + "Link": "Врска", + "The address of the item in the forge": "Адресата на ставката на платформата за код", + "The commit message, branch name or merge request title": "Пораката на commit-от, името на гранката или насловот на барањето за спојување", + "Repository": "Складиште", + "The repository, such as acme/portal": "Складиштето, на пр. acme/portal", + "Forge id": "Id на платформата", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Сопствениот id на ставката на платформата за код, на пр. github:acme/portal#42 или hash на commit", + "State": "Состојба", + "The state of a merge request or issue": "Состојбата на барање за спојување или проблем", + "Who made the commit or opened the merge request": "Кој го направи commit-от или го отвори барањето за спојување", + "When the commit was made or the merge request last changed": "Кога е направен commit-от или последен пат се сменило барањето за спојување", + "Added by": "Додадено од", + "Whether a person added the link or the integration wrote it": "Дали врската ја додал човек или ја запишала интеграцијата", + "Nextcloud user UIDs of project members": "Nextcloud кориснички ID на членовите на проектот", + "Add link": "Додај врска", + "Added by hand": "Додадено рачно", + "Branch": "Гранка", + "Code": "Код", + "Commit": "Commit", + "From the integration": "Од интеграцијата", + "Link to a commit, branch or merge request": "Врска до commit, гранка или барање за спојување", + "Merge request": "Барање за спојување", + "Merged": "Споено", + "No code linked yet. Name {key} in a commit message or paste a link.": "Сè уште нема поврзан код. Наведете {key} во порака на commit или залепете врска.", + "No code linked yet. Paste a link to a commit or merge request.": "Сè уште нема поврзан код. Залепете врска до commit или барање за спојување.", + "Paste a web address that starts with https://.": "Залепете веб-адреса што почнува со https://.", + "Remove link {title}": "Отстрани ја врската {title}", + "The link could not be added.": "Врската не можеше да се додаде.", + "The link could not be removed.": "Врската не можеше да се отстрани.", + "This link is already on the task.": "Оваа врска веќе е на задачата.", + "Code forges": "Платформи за код", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Поврзете ги commit-ите и pull request-ите од GitHub со задачи. Integriq ги прима настаните; planninq никогаш не го повикува GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Преземете ја конфигурацијата и увезете ја во Integriq. Потоа внесете тајна во правилото \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Во GitHub додајте webhook на складиштето со оваа адреса и истата тајна. Изберете тип на содржина application/json и настаните push и pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Наведете го клучот на задачата, на пр. VC-12, во порака на commit, име на гранка или наслов на pull request. Врската тогаш се појавува на таа задача.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq, членовите на проектот сè уште можат да залепат врска на страницата на задачата.", + "Download the Integriq configuration": "Преземи ја конфигурацијата за Integriq", + "Calendar": "Календар", + "Previous": "Претходно", + "Calendar view": "Приказ на календар", + "Starts:": "Почнува:", + "No tasks with a date in this month.": "Овој месец нема задачи со датум.", + "Week of {start} to {end}": "Недела од {start} до {end}", + "My calendar": "Мој календар", + "Show as list": "Прикажи како листа", + "Show as calendar": "Прикажи како календар", + "Open my calendar": "Отвори го мојот календар", + "Nextcloud Tasks": "Nextcloud задачи", + "Show my tasks in Nextcloud Tasks": "Прикажи ги моите задачи во Nextcloud задачи", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Задачите доделени на вас или споделени со вас се појавуваат во листата \"Planninq\" во Nextcloud задачи и календар. Промените направени таму се заменуваат со следната промена во Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Овој сервер не може да запишува во Nextcloud задачи, па извозот не е достапен.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Управувано од Planninq. Промените направени тука се заменуваат со следната промена во Planninq.", + "Working days and holidays": "Работни денови и празници", + "Dates set on the timeline skip the days that are not working days.": "Датумите поставени на временската линија ги прескокнуваат деновите што не се работни.", + "Working weekdays": "Работни денови во неделата", + "Non-working days": "Неработни денови", + "No non-working days yet.": "Сè уште нема неработни денови.", + "Add day": "Додај ден", + "Year": "Година", + "Add Dutch national holidays": "Додај холандски државни празници", + "Save working days": "Зачувај работни денови", + "Choose at least one working weekday.": "Изберете барем еден работен ден.", + "Working days saved.": "Работните денови се зачувани.", + "Could not save the working days.": "Работните денови не можеа да се зачуваат.", + "New Year's Day": "Нова година", + "Easter Sunday": "Велигден", + "Easter Monday": "Велигденски понеделник", + "King's Day": "Ден на кралот", + "Liberation Day": "Ден на ослободувањето", + "Ascension Day": "Спасовден", + "Whit Sunday": "Духовден", + "Whit Monday": "Духовски понеделник", + "Christmas Day": "Божиќ", + "Boxing Day": "Втор ден Божиќ", + "Dates of {title}": "Датуми за {title}", + "The due date cannot be before the start date.": "Рокот не може да биде пред датумот на почеток.", + "{title}, from {start} to {end}": "{title}, од {start} до {end}", + "The dates could not be saved.": "Датумите не можеа да се зачуваат.", + "{title} now runs from {start} to {end}": "{title} сега трае од {start} до {end}", + "Auto-scheduling": "Автоматско планирање", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Кога е вклучено, подоцнежен рок на временската линија нуди поместување на задачите што ги блокира.", + "Move blocked tasks along when a task slips": "Помести ги блокираните задачи кога задача доцни", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На временската линија подоцнежен рок нуди поместување на блокираните задачи. Се бројат само врските \"блокира\", а задачите се поместуваат само подоцна.", + "Move the tasks that wait for {title}?": "Да се поместат задачите што чекаат {title}?", + "These tasks wait for it and would start after its new due date:": "Овие задачи ја чекаат и би започнале по новиот рок:", + "{count} tasks would move; the first {limit} are listed.": "Би се поместиле {count} задачи; прикажани се првите {limit}.", + "Now": "Сега", + "After the move": "По поместувањето", + "Only this task": "Само оваа задача", + "Move all": "Помести ги сите", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Запрено кај {title}: датумите не можеа да се зачуваат. Задачите пред неа се поместени.", + "Cumulative flow": "Кумулативен тек", + "Show as chart": "Прикажи како графикон", + "Show as table": "Прикажи како табела", + "Tasks per column per day": "Задачи по колона по ден", + "Tasks without recorded history in this period: {count}": "Задачи без запишана историја во овој период: {count}", + "Lead and cycle time": "Време на испорака и време на циклус", + "No tasks were finished in this period.": "Во овој период не е завршена ниту една задача.", + "Finished tasks": "Завршени задачи", + "Cycle time, average": "Време на циклус, просек", + "Cycle time, 85th percentile": "Време на циклус, 85. перцентил", + "Lead time, average": "Време на испорака, просек", + "Tasks whose finish time was estimated from their history: {count}": "Задачи чие време на завршување е проценето од историјата: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Време на циклус на секоја завршена задача, со просекот и 85. перцентил", + "Slowest tasks": "Најбавни задачи", + "cycle {cycle}, lead {lead}": "циклус {cycle}, испорака {lead}", + "{days} days": "{days} дена", + "Could not load the flow of this project.": "Текот на овој проект не може да се вчита.", + "Last {days} days": "Последните {days} дена", + "Portfolio flow": "Тек на портфолио", + "An admin adds portfolios under Projects, Portfolios.": "Администратор додава портфолија под Проекти, Портфолија.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Проекти што не се прикажани бидејќи истовремено се прикажуваат најмногу 50: {count}", + "Could not load the flow of this portfolio.": "Текот на ова портфолио не може да се вчита.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Кумулативен тек и време на циклус низ проектите на портфолио.", + "Edit report": "Уреди извештај", + "Only tasks where": "Само задачи каде", + "Group by": "Групирај по", + "Display": "Приказ", + "Share with everyone who can read its projects": "Сподели со сите што можат да ги читаат неговите проекти", + "The report could not be saved.": "Извештајот не може да се зачува.", + "Number of tasks": "Број на задачи", + "Bar": "Столбови", + "Donut": "Прстен", + "Table": "Табела", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} од {total} проекти во овој извештај не се видливи за вас", + "No tasks match this report.": "Ниту една задача не одговара на овој извештај.", + "None": "Ништо", + "Could not load this report.": "Овој извештај не може да се вчита.", + "Report": "Извештај", + "Your reports": "Ваши извештаи", + "My reports": "Мои извештаи", + "Shared reports": "Споделени извештаи", + "You have not built a report yet.": "Сè уште немате направено извештај.", + "Nobody has shared a report with you yet.": "Никој сè уште не споделил извештај со вас.", + "Reports you built over tasks, and the ones shared with you.": "Извештаи што ги направивте над задачите, и оние споделени со вас.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Зачувано барање над задачите: кои проекти, кои филтри, групирано по што, избројано или собрано, и прикажано како табела или графикон.", + "The name the report is listed under": "Името под кое извештајот е наведен", + "What the report shows and who it is for": "Што покажува извештајот и за кого е", + "Nextcloud user id of the person who saved the report": "Nextcloud ID на корисникот што го зачувал извештајот", + "Who can open the report": "Кој може да го отвори извештајот", + "Only me": "Само јас", + "Everyone who can read its projects": "Сите што можат да ги читаат неговите проекти", + "The projects the report covers, at most fifty": "Проектите што ги опфаќа извештајот, најмногу педесет", + "Filters": "Филтри", + "Task fields and the value each must equal": "Полиња на задачата и вредноста на која секое мора да биде еднакво", + "The task field the report groups on": "Полето на задачата по кое извештајот групира", + "Count the tasks, or add up a number on them": "Изброј ги задачите или собери број на нив", + "Sum": "Збир", + "Sum of": "Збир на", + "The number added up when the measure is a sum": "Бројот што се собира кога мерката е збир", + "Story points": "Поени на приказна", + "Estimated duration": "Проценето траење", + "How the report is shown": "Како се прикажува извештајот", + "Issue type": "Вид на барање", + "Task fields and the value each must equal; empty when the report covers every task": "Полиња на задачата и вредноста што секое мора да ја има; празно кога извештајот ги опфаќа сите задачи", + "The status a task must have": "Статусот што задачата мора да го има", + "The priority a task must have": "Приоритетот што задачата мора да го има", + "The user a task must be assigned to": "Корисникот на кого задачата мора да биде доделена", + "A label a task must carry": "Ознака што задачата мора да ја има", + "The board column a task must be in": "Колоната на таблата во која задачата мора да биде", + "The issue type a task must have": "Видот на барање што задачата мора да го има", + "Manager groups": "Групи на раководители", + "Member groups": "Групи на членови", + "Viewer groups": "Групи на читатели", + "Viewers": "Читатели", + "Owning group": "Сопственичка група", + "Nextcloud groups whose members manage the project": "Nextcloud групи чии членови го водат проектот", + "Nextcloud groups whose members work on the project": "Nextcloud групи чии членови работат на проектот", + "Nextcloud groups whose members may read the project": "Nextcloud групи чии членови смеат да го читаат проектот", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud корисници што го водат проектот: поставки, членови и работа", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud корисници што смеат да го читаат проектот и неговата работа, но не да ги менуваат", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud групата што го поседува проектот заедно со неговиот автор, најмногу една", + "Nextcloud user ids who may read this through the project": "Nextcloud корисници што смеат да го читаат ова преку проектот", + "Nextcloud groups whose members may change this through the project": "Nextcloud групи чии членови смеат да го менуваат ова преку проектот", + "Nextcloud groups whose members may read this through the project": "Nextcloud групи чии членови смеат да го читаат ова преку проектот", + "Search for a person or a group…": "Барај личност или група…", + "No one found. Your admin's sharing settings decide who you can find.": "Никој не е пронајден. Поставките за споделување на вашиот администратор одлучуваат кого можете да најдете.", + "Type at least two characters": "Внесете најмалку два знака", + "Everyone in this group": "Сите во оваа група", + "Could not search for people. Please try again.": "Пребарувањето луѓе не успеа. Обидете се повторно.", + "Could not remove the group": "Групата не можеше да се отстрани", + "Only the owner and managers change who is on this project.": "Само сопственикот и управителите менуваат кој е на овој проект.", + "Role of {name}": "Улога: {name}", + "Manager": "Управител", + "Member": "Член", + "Viewer": "Читател", + "Could not change the role": "Улогата не можеше да се промени", + "Owned by group: {name}": "Во сопственост на групата: {name}", + "No group owns this project.": "Ниедна група не е сопственик на овој проект.", + "Owned by group": "Во сопственост на група", + "Search for a group…": "Пребарај група…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Не е пронајдена група. Поставките за споделување на вашиот администратор одредуваат кои групи можете да ги најдете.", + "No owning group": "Без група сопственик", + "Could not search for groups. Please try again.": "Пребарувањето групи не успеа. Обидете се повторно.", + "Could not change the owning group": "Групата сопственик не може да се промени", + "You can read this project. Only its members change it.": "Може да го читате овој проект. Го менуваат само неговите членови.", + "Course": "Предмет", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Предметот што се предава на овој час, на пример изборен предмет, кога училишната апликација за учење го знае.", + "Online meeting link": "Врска до онлајн часот", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Каде учениците се приклучуваат на овој час онлајн. Копчето Приклучи се се прикажува само за https врска." }, "plurals": null } diff --git a/l10n/mt.js b/l10n/mt.js index d5a8bf0d..0966cd3d 100644 --- a/l10n/mt.js +++ b/l10n/mt.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Proġetti attivi", + "Archived projects": "Proġetti arkivjati", + "Boards": "Bordijiet", + "My projects": "Il-proġetti tiegħi", + "Portfolio": "Portafoll", + "Project board": "Bord tal-proġett", + "Projects I am in": "Proġetti li nieħu sehem fihom", + "Timeline": "Linja taż-żmien", + "Timesheet": "Reġistru tal-ħin", + "Features & roadmap": "Funzjonijiet u pjan direzzjonali", + "Flow": "Fluss", + "Flows": "Flussi", + "Reports": "Rapporti", + "Pick a report to open it.": "Agħżel rapport biex tiftħu.", + "In progress": "Għaddej", + "Date": "Data", + "Due": "Skadenza", + "Assignee": "Assenjat lil", + "Who": "Min", + "What": "Xiex", + "Minutes": "Minuti", + "Entries": "Entrati", + "Most recent": "L-aktar reċenti", + "Per person": "Għal kull persuna", + "By status": "Skont l-istatus", + "By priority": "Skont il-prijorità", + "Task status": "Status tal-kompiti", + "Time spent": "Ħin li ntefaq", + "Capacity": "Kapaċità", + "Due soonest": "L-eqreb skadenza", + "Minutes logged": "Minuti rreġistrati", + "Nothing is due": "Xejn m'hu skadut", + "Nothing logged yet": "Xejn ma ġie rreġistrat s'issa", + "What is open, what is blocked, and what is overdue.": "X'inhu miftuħ, x'inhu mblukkat, u x'inhu tard.", + "How allocation is spread across the people working on projects.": "Kif it-tqassim huwa mifrux fost in-nies li jaħdmu fuq proġetti.", + "Hours logged, and the projects they went to.": "Is-sigħat irreġistrati u l-proġetti li marru fihom.", + "Billable": "Fatturabbli", + "Budget: {amount}": "Baġit: {amount}", + "Loading projects": "Qed jitgħabbew il-proġetti", + "No projects for this client yet": "Għad m'hemmx proġetti għal dan il-klijent", + "Open in Planninq": "Iftaħ fi Planninq", + "This project could not be found": "Dan il-proġett ma nstabx", + "Untitled project": "Proġett bla titlu", + "and {count} more": "u {count} oħra", + "Store": "Ħanut", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installa reġistri, skemi u flussi ppubblikati minn organizzazzjonijiet oħra.", + "Work Date": "Data tax-xogħol", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Azzjonijiet tal-kolonna", + "Columns": "Kolonni", + "Could not remove the column. Please try again.": "Il-kolonna ma setgħetx titneħħa. Erġa' pprova.", + "Could not save the column. Please try again.": "Il-kolonna ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "Done column": "Kolonna ta' lest", + "Edit column": "Editja l-kolonna", + "Keep the card's status": "Żomm l-istatus tal-karta", + "Move its cards to": "Mexxi l-karti tagħha għal", + "Move left": "Mexxi lejn ix-xellug", + "Move right": "Mexxi lejn il-lemin", + "Status of cards moved here": "L-istatus tal-karti mċaqalqa hawn", + "The last done column cannot be removed.": "L-aħħar kolonna ta' lest ma tistax titneħħa.", + "WIP limit": "Limitu WIP", + "over limit": "'il fuq mil-limitu", + "The status a card gets when it is moved into this column.": "L-istatus li tieħu karta meta titmexxa f'din il-kolonna.", + "All priorities": "Il-prijoritajiet kollha", + "Could not create the task. Please try again.": "Il-kompitu ma setax jinħoloq. Erġa' pprova.", + "Created": "Maħluq", + "Move to backlog": "Għall-backlog", + "Move to board": "Għall-bord", + "New task": "Kompitu ġdid", + "Nothing in the backlog": "Xejn fil-backlog", + "Rank": "Rank", + "Sort by": "Issortja skont", + "Sort by rank to reorder": "Issortja skont ir-rank biex terġa' tordna", + "Task actions": "Azzjonijiet tal-kompitu", + "All labels": "It-tikketti kollha", + "Filter tasks by label": "Iffiltra l-kompiti skont it-tikketta", + "View timeline": "Ara l-kronoloġija", + "Board": "Bord", + "List": "Lista", + "Column": "Kolonna", + "Board or list": "Bord jew lista", + "Log": "Log", + "Add entry": "Żid daħla", + "Show": "Uri", + "No actions yet": "Għad m'hemm l-ebda azzjoni", + "Closed": "Magħluq", + "Entry actions": "Azzjonijiet tad-daħla", + "Add action": "Żid azzjoni", + "by {author}": "minn {author}", + "saved {time}": "issejvjat {time}", + "Attendees: {names}": "Preżenti: {names}", + "Add the first entry": "Żid l-ewwel daħla", + "Issues": "Kwistjonijiet", + "Lessons learned": "Lezzjonijiet mitgħallma", + "Meetings": "Laqgħat", + "Decisions": "Deċiżjonijiet", + "Actions": "Azzjonijiet", + "Issue": "Kwistjoni", + "Lesson learned": "Lezzjoni mitgħallma", + "Meeting": "Laqgħa", + "Decision": "Deċiżjoni", + "About this project": "Dwar dan il-proġett", + "No description yet": "Għad m'hemmx deskrizzjoni", + "Start date": "Data tal-bidu", + "Not set": "Mhux issettjat", + "End date": "Data tat-tmiem", + "Progress": "Progress", + "No tasks yet": "Għad m'hemmx kompiti", + "Open the board": "Iftaħ il-bord", + "People": "Nies", + "Owner": "Sid", + "Latest log entries": "L-aħħar daħliet", + "Open the log": "Iftaħ il-log", + "{done} of {total} tasks done": "{done} minn {total} kompiti lesti", + "Edit entry": "Editja d-daħla", + "Type": "Tip", + "Attendees": "Preżenti", + "Issue is closed": "Il-kwistjoni hija magħluqa", + "Could not save the entry. Please try again.": "Id-daħla ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "From: {title}": "Minn: {title}", + "What needs to happen": "X'għandu jsir", + "Could not create the action. Please try again.": "L-azzjoni ma setgħetx tinħoloq. Erġa' pprova.", + "The action was created but could not be linked to the entry.": "L-azzjoni nħolqot iżda ma setgħetx tiġi marbuta mad-daħla.", + "Project pages": "Paġni tal-proġett", + "Overview": "Ħarsa ġenerali", + "Risks": "Riskji", + "Log entry": "Daħla tal-log", + "A short name for the entry": "Isem qasir għad-daħla", + "Project": "Proġett", + "The project this entry belongs to": "Il-proġett li għalih tappartjeni din id-daħla", + "What kind of entry this is": "X'tip ta' daħla hija", + "When it happened": "Meta ġara", + "What happened, in Markdown": "X'ġara, f'Markdown", + "Whether an issue is still open": "Jekk kwistjoni għadhiex miftuħa", + "The people at a meeting": "In-nies f'laqgħa", + "Tasks that came out of this entry": "Kompiti li ħarġu minn din id-daħla", + "Add risk": "Żid riskju", + "Risk": "Riskju", + "Score": "Punteġġ", + "Response": "Rispons", + "Review date": "Data tar-reviżjoni", + "no longer on the project": "m'għadux fil-proġett", + "Edit {title}": "Editja {title}", + "No risks recorded yet": "Għad ma ġie rreġistrat l-ebda riskju", + "Add the first risk": "Żid l-ewwel riskju", + "Medium": "Medju", + "Mitigating": "Qed jittaffa", + "Occurred": "Seħħ", + "Avoid": "Evita", + "Reduce": "Naqqas", + "Transfer": "Ittrasferixxi", + "Accept": "Aċċetta", + "Highest open risks": "L-ogħla riskji miftuħa", + "No open risks": "L-ebda riskju miftuħ", + "Open the risk register": "Iftaħ ir-reġistru tar-riskji", + "Edit risk": "Editja r-riskju", + "What could go wrong": "X'jista' jmur ħażin", + "Likelihood": "Probabbiltà", + "Impact": "Impatt", + "Score {score}": "Punteġġ {score}", + "Countermeasures": "Kontromiżuri", + "Could not save the risk. Please try again.": "Ir-riskju ma setax jiġi ssejvjat. Erġa' pprova.", + "Risks by likelihood and impact": "Riskji skont il-probabbiltà u l-impatt", + "Risk scale": "Skala tar-riskju", + "The levels every project scores its risks on, and where low turns into medium and high": "Il-livelli li fuqhom kull proġett jagħti punteġġ lir-riskji tiegħu, u fejn baxx isir medju u għoli", + "Number of levels": "Numru ta' livelli", + "Likelihood labels": "Tikketti tal-probabbiltà", + "Impact labels": "Tikketti tal-impatt", + "Level {level}": "Livell {level}", + "Medium from score": "Medju mill-punteġġ", + "High from score": "Għoli mill-punteġġ", + "Risk scale saved": "L-iskala tar-riskju ġiet issejvjata", + "1 risk uses level {level}. Change it first.": "Riskju 1 juża l-livell {level}. Ibdlu l-ewwel.", + "{count} risks use level {level}. Change them first.": "{count} riskji jużaw il-livell {level}. Ibdilhom l-ewwel.", + "Every level needs a label, and high must start above medium.": "Kull livell jeħtieġ tikketta, u għoli għandu jibda 'l fuq minn medju.", + "The project this risk belongs to": "Il-proġett li għalih jappartjeni dan ir-riskju", + "The cause and the effect, in Markdown": "Il-kawża u l-effett, f'Markdown", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Raggruppament liberu, bħal ippjanar, baġit jew fornitur", + "How likely it is, on the admin's risk scale": "Kemm hu probabbli, fuq l-iskala tar-riskju tal-amministratur", + "How hard it would hit, on the admin's risk scale": "Kemm jolqot ħażin, fuq l-iskala tar-riskju tal-amministratur", + "Likelihood times impact, calculated by the server": "Il-probabbiltà multiplikata bl-impatt, ikkalkulata mis-server", + "Where the risk stands": "Fejn jinsab ir-riskju", + "The person who watches this risk": "Il-persuna li ssegwi dan ir-riskju", + "How the project answers the risk": "Kif il-proġett jirrispondi għar-riskju", + "What is done to prevent it or soften it, in Markdown": "X'qed isir biex jiġi evitat jew imtaffi, f'Markdown", + "When to look at this risk again": "Meta għandu jerġa' jiġi rivedut dan ir-riskju", + "Very low": "Baxx ħafna", + "Very high": "Għoli ħafna", + "All projects": "Il-proġetti kollha", + "Project status report": "Rapport tal-istat tal-proġett", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Rapport iddatat dwar kif inhu proġett fil-flus, l-organizzazzjoni, il-ħin, l-informazzjoni, il-kwalità u r-riskju (l-aspetti GROTIK), kull wieħed b'nota.", + "The project this report is about": "Il-proġett li dwaru hu r-rapport", + "Report date": "Data tar-rapport", + "The day the report describes": "Il-jum li jiddeskrivi r-rapport", + "Money": "Flus", + "How the project stands on this aspect": "Kif inhu l-proġett f'dan l-aspett", + "On track": "Fit-triq it-tajba", + "At risk": "F'riskju", + "Off track": "Barra mit-triq", + "Money note": "Nota dwar il-flus", + "A short explanation of this status": "Spjegazzjoni qasira ta' dan l-istat", + "Organisation": "Organizzazzjoni", + "Organisation note": "Nota dwar l-organizzazzjoni", + "Time": "Ħin", + "Time note": "Nota dwar il-ħin", + "Information": "Informazzjoni", + "Information note": "Nota dwar l-informazzjoni", + "Quality": "Kwalità", + "Quality note": "Nota dwar il-kwalità", + "Risk note": "Nota dwar ir-riskju", + "Overall": "Ġenerali", + "The worst of the six statuses, calculated by the server": "L-agħar mis-sitt stati, ikkalkulat mis-server", + "Health: money": "Saħħa: flus", + "Copied from the newest status report": "Ikkupjat mill-aħħar rapport tal-istat", + "Health: organisation": "Saħħa: organizzazzjoni", + "Health: time": "Saħħa: ħin", + "Health: information": "Saħħa: informazzjoni", + "Health: quality": "Saħħa: kwalità", + "Health: risk": "Saħħa: riskju", + "Health: overall": "Saħħa: ġenerali", + "Health: report date": "Saħħa: data tar-rapport", + "The date of the newest status report": "Id-data tal-aħħar rapport tal-istat", + "New report": "Rapport ġdid", + "Only the project owner writes status reports.": "Is-sid tal-proġett biss jikteb rapporti tal-istat.", + "Latest report, {date}": "L-aħħar rapport, {date}", + "Aspect": "Aspett", + "Note": "Nota", + "Report history": "Storja tar-rapporti", + "Author": "Awtur", + "No status reports yet": "Għad m'hemm l-ebda rapport tal-istat", + "Write the first report": "Ikteb l-ewwel rapport", + "Choose a status for every aspect to save the report.": "Agħżel stat għal kull aspett biex tissejvja r-rapport.", + "Suggested: on track.": "Suġġeriment: fit-triq it-tajba.", + "Suggested: at risk.": "Suġġeriment: f'riskju.", + "Suggested: off track.": "Suġġeriment: barra mit-triq.", + "1 task is past its due date.": "1 kompitu għadda d-data tal-iskadenza.", + "{count} tasks are past their due date.": "Kompiti li għaddew id-data tal-iskadenza: {count}.", + "The end date has passed with 1 open task.": "Id-data tat-tmiem għaddiet b'1 kompitu miftuħ.", + "The end date has passed with {count} open tasks.": "Id-data tat-tmiem għaddiet, kompiti miftuħa: {count}.", + "No open task is past its due date.": "L-ebda kompitu miftuħ ma għadda d-data tal-iskadenza.", + "The highest open risk, \"{title}\", scores {score}.": "L-ogħla riskju miftuħ, \"{title}\", għandu punteġġ {score}.", + "There are no open risks.": "M'hemm l-ebda riskju miftuħ.", + "Costs are at {percent}% of the budget.": "L-ispejjeż huma {percent}% tal-baġit.", + "No suggestion: the project has no budget.": "L-ebda suġġeriment: il-proġett m'għandux baġit.", + "No suggestion: no costs are recorded for this project yet.": "L-ebda suġġeriment: għad m'hemm l-ebda spiża rreġistrata għal dan il-proġett.", + "The report was not saved. Only the project owner can write status reports.": "Ir-rapport ma ġiex issejvjat. Is-sid tal-proġett biss jista' jikteb rapporti tal-istat.", + "No report": "L-ebda rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Grupp ta' proġetti mmexxija mill-istess nies, bħal dipartiment jew programm. Il-maniġers tiegħu jaqraw kull proġett fih.", + "The name of the portfolio": "L-isem tal-portafoll", + "What the portfolio holds and who runs it": "X'fih il-portafoll u min imexxih", + "A colour for the portfolio's section in project lists": "Kulur għas-sezzjoni tal-portafoll fil-listi tal-proġetti", + "Managers": "Maniġers", + "Nextcloud user UIDs of the people who run the portfolio": "L-IDs tal-utenti ta' Nextcloud tan-nies li jmexxu l-portafoll", + "Order": "Ordni", + "Where the portfolio comes in project lists, lowest first": "Fejn jidher il-portafoll fil-listi tal-proġetti, l-iżgħar l-ewwel", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "L-iskala tar-riskju proprja ta' dan il-portafoll bħala JSON, fl-istess forma bħal dik tal-app kollha. Vojt ifisser l-iskala tal-app.", + "Portfolio readers": "Qarrejja tal-portafoll", + "Nextcloud user UIDs of the managers of the project's portfolio": "L-IDs tal-utenti ta' Nextcloud tal-maniġers tal-portafoll tal-proġett", + "The portfolio this project belongs to": "Il-portafoll li jappartjeni għalih dan il-proġett", + "No portfolio": "L-ebda portafoll", + "All portfolios": "Il-portafolli kollha", + "You read this project as a manager of its portfolio. Only its members change it.": "Qed taqra dan il-proġett bħala maniġer tal-portafoll tiegħu. Il-membri tiegħu biss ibiddluh.", + "Portfolios": "Portafolli", + "Portfolio status": "Status tal-portafoll", + "No portfolios yet": "Għad m'hemmx portafolli", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Amministratur iżid portafolli taħt Proġetti, Portafolli. Il-proġetti ta' portafoll huma elenkati hawn bl-istatus tagħhom.", + "Roll-up": "Sommarju", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} fil-binarju, {atRisk} f'riskju, {offTrack} barra mill-binarju, {noReport} mingħajr rapport", + "No project in this portfolio that you can read.": "L-ebda proġett f'dan il-portafoll li tista' taqra.", + "Start": "Bidu", + "End": "Tmiem", + "Budget": "Baġit", + "Last report": "L-aħħar rapport", + "Out of date": "Skadut", + "Portfolio timeline": "Kronoloġija tal-portafoll", + "Zoom": "Żum", + "Could not load the timeline": "Il-kronoloġija ma setgħetx titgħabba", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Amministratur iżid portafolli taħt Proġetti, Portafolli. Il-proġetti ta' portafoll jidhru hawn fuq kronoloġija waħda.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Iftaħ proġett biex tara l-fażijiet u l-kompiti tiegħu. Il-kronoloġija hija għall-qari biss.", + "Phase: {title}": "Fażi: {title}", + "Left out because you cannot read them: {count} projects": "Imħollija barra għax ma tistax taqrahom: {count} proġetti", + "Week": "Ġimgħa", + "Day": "Jum", + "Month": "Xahar", + "Please try again later.": "Erġa' pprova aktar tard.", + "Status reports": "Rapporti tal-istatus", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Wara kemm-il jum l-aħħar rapport tal-istatus ta' proġett jiġi mmarkat bħala skadut fil-ħarsa ġenerali tal-portafoll", + "Reporting period (days)": "Perjodu tar-rappurtar (jiem)", + "The reporting period is a whole number of days from 1 to 365.": "Il-perjodu tar-rappurtar huwa numru sħiħ ta' jiem minn 1 sa 365.", + "Reporting period saved": "Il-perjodu tar-rappurtar ġie ssejvjat", + "The reporting period was not saved. Please try again.": "Il-perjodu tar-rappurtar ma ġiex issejvjat. Erġa' pprova.", + "Every project of a portfolio with its status per aspect, rolled up.": "Kull proġett ta' portafoll bl-istatus tiegħu għal kull aspett, fil-qosor.", + "The projects of a portfolio on one timeline.": "Il-proġetti ta' portafoll fuq kronoloġija waħda.", + "Phases": "Fażijiet", + "Add phase": "Żid fażi", + "No phases yet": "Għad m'hemmx fażijiet", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Aqsam il-proġett f'fażijiet, bħal bidu, definizzjoni u twettiq. Fażi tingħalaq meta d-dokument tal-għeluq tagħha jittella'.", + "{hours} hours": "{hours} siegħa", + "Concluding document: {title}": "Dokument tal-għeluq: {title}", + "Concluding document missing": "Id-dokument tal-għeluq nieqes", + "Move {title} up": "Ċaqlaq {title} 'il fuq", + "Move {title} down": "Ċaqlaq {title} 'l isfel", + "Close phase": "Agħlaq il-fażi", + "Phase": "Fażi", + "Files": "Fajls", + "Notes": "Noti", + "Audit trail": "Traċċa tal-verifika", + "Edit phase": "Editja l-fażi", + "Name": "Isem", + "Budget hours": "Sigħat ibbaġitjati", + "Could not save the phase. Please try again.": "Il-fażi ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "Close phase {title}": "Agħlaq il-fażi {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Fażi tingħalaq bid-dokument tal-għeluq tagħha: tellgħu hawn jew agħżel wieħed mill-fajls tal-fażi.", + "Concluding document": "Dokument tal-għeluq", + "This phase has no files yet.": "Din il-fażi għad m'għandhiex fajls.", + "Upload a document": "Tella' dokument", + "The document was not uploaded. Please try again.": "Id-dokument ma tellax. Erġa' pprova.", + "Upload the concluding document before you close this phase.": "Tella' d-dokument tal-għeluq qabel tagħlaq din il-fażi.", + "This phase cannot be closed from its current status.": "Din il-fażi ma tistax tingħalaq mill-istatus attwali tagħha.", + "The phase was not closed. Please try again.": "Il-fażi ma ngħalqitx. Erġa' pprova.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "L-id tal-fajl f'din il-fażi li jagħlaqha. Il-fażi tista' titlesta biss meta jkun issettjat u l-fajl ikun mehmuż.", + "Import from Microsoft Project": "Importa minn Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Agħżel pjan issejvjat minn Microsoft Project f'format XML. Xejn ma jiġi importat qabel ma tikkonferma.", + "Plan file": "Fajl tal-pjan", + "What the import creates": "X'toħloq l-importazzjoni", + "Tasks": "Kompiti", + "Sub-tasks": "Sottokompiti", + "Milestones": "Stadji importanti", + "Links": "Links", + "Already imported, updated in place: {count}": "Diġà importati, aġġornati f'posthom: {count}", + "What does not carry over": "X'ma jgħaddix", + "Tasks with resources, which are not imported: {count}": "Kompiti b'riżorsi, li ma jiġux importati: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Kompiti aktar fil-fond mil-livell 3, imqiegħda taħt il-kompitu tagħhom tal-livell 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Links minbarra tmiem-għal-bidu, importati bħala links relatati: {count}", + "Link lags, which are dropped: {count}": "Dewmien fil-links, li jitwarrab: {count}", + "Links to a summary task, which are not imported: {count}": "Links ma' kompitu sommarju, li ma jiġux importati: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Links ma' kompiti barra dan il-pjan, li ma jiġux importati: {count}", + "No longer in the plan": "M'għadux fil-pjan", + "These stay in the project; remove them yourself if they are no longer needed.": "Dawn jibqgħu fil-proġett; neħħihom int jekk m'għadhomx meħtieġa.", + "Import": "Importa", + "Close": "Agħlaq", + "The plan is imported: {created} created, {updated} updated.": "Il-pjan ġie importat: {created} maħluqa, {updated} aġġornati.", + "Links that would close a loop were left out: {count}": "Il-links li jagħlqu ċirku tħallew barra: {count}", + "The import stopped part-way. Run it again to finish it.": "L-importazzjoni waqfet f'nofs triq. Erġa' ħaddimha biex tlestiha.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Issejvja l-pjan f'Microsoft Project b'File, Save as, format XML, u importa dak il-fajl.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Dan il-fajl jiddikjara DOCTYPE jew entitajiet, li mhumiex aċċettati.", + "The file is larger than 10 MB.": "Il-fajl huwa akbar minn 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Il-pjan għandu aktar minn 2,000 kompitu, aktar milli tieħu importazzjoni waħda.", + "This file is not a Microsoft Project plan in XML format.": "Dan il-fajl mhuwiex pjan ta' Microsoft Project f'format XML.", + "Choose a file to import.": "Agħżel fajl biex timporta.", + "Only the project owner can import a plan.": "Is-sid tal-proġett biss jista' jimporta pjan.", + "The plan could not be read. Please try again.": "Il-pjan ma setax jinqara. Erġa' pprova.", + "Linked case: {title}": "Każ marbut: {title}", + "Linked to a case": "Marbut ma' każ", + "Hand over to case": "Għaddi lill-każ", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Tikkopja mingħajr bidla kull fajl tal-proġett u tal-kompiti tiegħu, u fajl li jiddeskrivi l-proġett, lill-każ marbut.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Fajls ikkupjati: {count}", + "Files that failed: {names}": "Fajls li fallew: {names}", + "The handover failed. Please try again.": "L-għoti falla. Erġa' pprova.", + "The linked case could not be found, or you cannot open it.": "Il-każ marbut ma nstabx, jew ma tistax tiftħu.", + "Case handovers": "Għotjiet lill-każ", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Kull darba li l-fajls u l-metadata tal-proġett ingħataw lill-każ tiegħu: meta, minn min, lil liema każ, kull fajl ikkupjat bis-SHA-256 tiegħu, u l-fajls li fallew.", + "Finance": "Finanzi", + "Add cost line": "Żid linja tal-ispiża", + "Delivery terms": "Termini tal-kunsinna", + "Billing model": "Mudell tal-kontijiet", + "Budget in euro": "Baġit f'ewro", + "Budget in hours": "Baġit f'sigħat", + "Hourly rate in euro": "Rata fis-siegħa f'ewro", + "Planned start": "Bidu ppjanat", + "Planned end": "Tmiem ippjanat", + "Planned dates": "Dati ppjanati", + "Budget {amount}": "Baġit {amount}", + "No budget agreed": "L-ebda baġit miftiehem", + "Hours": "Sigħat", + "Only the project owner and the portfolio managers see the amounts.": "Is-sid tal-proġett u l-maniġers tal-portafoll biss jaraw l-ammonti.", + "Budget against cost per category": "Baġit kontra spejjeż skont il-kategorija", + "Labour (booked time)": "Xogħol (ħin irreġistrat)", + "No category": "L-ebda kategorija", + "Hours are not available": "Is-sigħat mhumiex disponibbli", + "Not yet assigned to a category": "Għadu mhux assenjat lil kategorija", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} minfuqa, {remaining} fadal", + "Budget against cost per phase": "Baġit kontra spejjeż skont il-fażi", + "No phase": "L-ebda fażi", + "Cost lines": "Linji tal-ispiża", + "From the finance system": "Mis-sistema finanzjarja", + "Edit cost line {amount}": "Editja l-linja tal-ispiża {amount}", + "No cost lines yet": "Għad m'hemm l-ebda linja tal-ispiża", + "Commitments": "Impenji", + "Actual cost": "Spiża attwali", + "Forecast": "Tbassir", + "Remaining": "Fadal", + "Not planned yet": "Għadu mhux ippjanat", + "{start} to {end}": "{start} sa {end}", + "The terms were not saved. Please try again.": "It-termini ma ġewx salvati. Erġa' pprova.", + "Terms saved": "Termini salvati", + "Fixed price": "Prezz fiss", + "Hourly": "Bis-siegħa", + "Not billed": "Mhux iffatturat", + "Commitment": "Impenn", + "Edit cost line": "Editja linja tal-ispiża", + "Kind": "Tip", + "Amount in euro": "Ammont f'ewro", + "Remove": "Neħħi", + "Could not save the cost line. Only the project owner changes the money of a project.": "Il-linja tal-ispiża ma setgħetx tiġi salvata. Is-sid tal-proġett biss ibiddel il-flus ta' proġett.", + "Could not remove the cost line. Please try again.": "Il-linja tal-ispiża ma setgħetx titneħħa. Erġa' pprova.", + "{amount} over budget": "{amount} 'il fuq mill-baġit", + "Cost categories": "Kategoriji tal-ispejjeż", + "The categories every project splits its budget and costs into, one per line": "Il-kategoriji li fihom kull proġett jaqsam il-baġit u l-ispejjeż tiegħu, waħda f'kull linja", + "Categories": "Kategoriji", + "Give at least one category, each name once.": "Agħti mill-inqas kategorija waħda, kull isem darba.", + "Cost categories saved": "Kategoriji tal-ispejjeż salvati", + "The cost categories were not saved. Please try again.": "Il-kategoriji tal-ispejjeż ma ġewx salvati. Erġa' pprova.", + "Finance line": "Linja finanzjarja", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Ammont wieħed ta' flus fuq proġett: baġit, impenn, spiża attwali jew tbassir, f'kategorija tal-ispejjeż u jekk trid f'fażi. Imdaħħal mis-sid tal-proġett, jew mibgħut mis-sistema finanzjarja permezz tal-app tal-integrazzjoni.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Il-proġett li jappartjeni għalih dan l-ammont. Vojt għal linja mis-sistema finanzjarja li n-numru tal-proġett tagħha ma jaqbel ma' l-ebda proġett.", + "The phase this amount belongs to, if any": "Il-fażi li jappartjeni għaliha dan l-ammont, jekk hemm", + "The cost category, one of the categories the admin set up": "Il-kategorija tal-ispejjeż, waħda mill-kategoriji li waqqaf l-amministratur", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Jekk l-ammont huwiex baġit, impenn, spiża attwali jew tbassir", + "Amount": "Ammont", + "The amount in the reporting currency (euro)": "L-ammont fil-munita tar-rappurtar (ewro)", + "The date the amount was booked or is expected": "Id-data li fiha l-ammont ġie rreġistrat jew hu mistenni", + "What the amount is for": "Għal xiex hu l-ammont", + "Whether a person entered the line or the finance system sent it": "Jekk persuna daħħlet il-linja jew is-sistema finanzjarja bagħtitha", + "Entered by hand": "Imdaħħal bl-idejn", + "Finance line id": "Id tal-linja finanzjarja", + "The finance system's own id of this line. One imported line per id.": "L-id proprju ta' din il-linja fis-sistema finanzjarja. Linja importata waħda għal kull id.", + "Project number": "Numru tal-proġett", + "The project number the finance system sent, matched against the project key": "In-numru tal-proġett li bagħtet is-sistema finanzjarja, imqabbel maċ-ċavetta tal-proġett", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Il-portafoll tal-proġett tal-linja, ikkupjat mill-proġett biex it-totali tal-portafoll ikollhom bżonn filtru wieħed", + "Finance readers": "Qarrejja tal-finanzi", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UIDs tal-utenti ta' Nextcloud tal-persuni li jistgħu jaraw dan l-ammont: is-sid tal-proġett u l-maniġers tal-portafoll tiegħu", + "Project owner": "Sid tal-proġett", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID tal-utent ta' Nextcloud tas-sid tal-proġett, li jista' jibdel u jneħħi linji manwali", + "How the client pays: not billed, a fixed price, or by the hour.": "Kif iħallas il-klijent: mhux iffatturat, prezz fiss jew bis-siegħa.", + "Portfolio finance": "Finanzi tal-portafoll", + "You cannot see the money of any project in this portfolio": "Ma tistax tara l-flus ta' l-ebda proġett f'dan il-portafoll", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Is-server bagħat linji tal-ispiża ta' proġetti barra dan il-portafoll, għalhekk dawn it-totali jistgħu jkunu żbaljati.", + "Projects left out because you cannot see their money: {count}": "Proġetti mħollija barra għax ma tistax tara flushom: {count}", + "Unmatched finance lines": "Linji finanzjarji mhux imqabbla", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Baġit, impenji, spiża attwali u tbassir miġbura għal portafoll.", + "Subprojects": "Sottoproġetti", + "{done} of {total}": "{done} minn {total}", + "{done} of {total} tasks done, including subprojects": "{done} minn {total} kompitu lesti, inklużi s-sottoproġetti", + "Show the subprojects of {title}": "Uri s-sottoproġetti ta' {title}", + "Hide the subprojects of {title}": "Aħbi s-sottoproġetti ta' {title}", + "Part of": "Parti minn", + "No parent project": "L-ebda proġett ġenitur", + "A project cannot sit under one of its own subprojects.": "Proġett ma jistax ikun taħt wieħed mis-sottoproġetti tiegħu stess.", + "Projects nest three levels deep at most: programme, project and subproject.": "Il-proġetti jitqiegħdu mhux aktar minn tliet livelli fil-fond: programm, proġett u sottoproġett.", + "Parent project": "Proġett ġenitur", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Il-proġett li taħtu jinsab dan il-proġett, bħal programm. Il-proġetti jitqiegħdu mhux aktar minn tliet livelli fil-fond.", + "Yes": "Iva", + "No": "Le", + "{label} (required)": "{label} (meħtieġ)", + "{label} is required": "{label} huwa meħtieġ", + "Project field": "Qasam tal-proġett", + "A field an admin adds to every project, such as a policy area or a contract value.": "Qasam li amministratur iżid ma' kull proġett, bħal qasam ta' politika jew valur ta' kuntratt.", + "Key": "Ċavetta", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "L-isem fiss li bih jinħażen il-valur, f'lower camel case. Żommu ladarba l-proġetti jużawh.", + "Label": "Tikketta", + "The name people see next to the field": "L-isem li n-nies jaraw ħdejn il-qasam", + "What the field holds": "X'fih il-qasam", + "Text": "Test", + "Number": "Numru", + "Choice": "Għażla", + "Person": "Persuna", + "Yes or no": "Iva jew le", + "Options": "Għażliet", + "The choices of a choice field": "L-għażliet ta' qasam tal-għażla", + "Required": "Meħtieġ", + "Whether a project must fill in the field": "Jekk proġett għandux jimla l-qasam", + "Where the field appears, lowest first": "Fejn jidher il-qasam, l-iżgħar l-ewwel", + "Applies to": "Japplika għal", + "What the field is added to": "Ma' xiex jiżdied il-qasam", + "Custom fields": "Oqsma proprji", + "The values of the project fields an admin defined, keyed by the field's key.": "Il-valuri tal-oqsma tal-proġett li ddefinixxa amministratur, skont iċ-ċavetta tal-qasam.", + "Project fields": "Oqsma tal-proġett", + "Related": "Relatati", + "Remove link": "Neħħi l-link", + "Link type": "Tip ta' link", + "Relates to": "Relatat ma'", + "Duplicates": "Jidduplika", + "Project key": "Iċ-ċavetta tal-proġett", + "Every task number starts with it, such as VERG-42.": "Kull numru tal-kompitu jibda biha, pereżempju VERG-42.", + "This key is already used by another project.": "Din iċ-ċavetta diġà qed jużaha proġett ieħor.", + "Use 2 to 10 letters and digits, starting with a letter.": "Uża minn 2 sa 10 ittri u ċifri, li jibdew b’ittra.", + "The key cannot change once tasks carry it.": "Iċ-ċavetta ma tistax tinbidel ladarba kompiti jġorruha.", + "Project saved. The existing tasks get their numbers in the background.": "Il-proġett ġie ssejvjat. Il-kompiti eżistenti jiksbu n-numri tagħhom fl-isfond.", + "Next task number": "In-numru tal-kompitu li jmiss", + "The number the next task of this project gets in its key. Only the system writes it.": "In-numru li l-kompitu li jmiss ta’ dan il-proġett jieħu fiċ-ċavetta tiegħu. Is-sistema biss tiktbu.", + "Restore {title}": "Irrestawra {title}", + "Restore": "Irrestawra", + "Project restored": "Il-proġett ġie rrestawrat", + "Could not restore the project": "Il-proġett ma setax jiġi rrestawrat", + "Bring this project back to the active list.": "Ġib dan il-proġett lura fil-lista tal-proġetti attivi.", + "Restore project": "Irrestawra l-proġett", + "Request reason": "Ir-raġuni tat-talba", + "Why the requester needs this project. Filled in when the project is requested.": "Għaliex min jagħmel it-talba għandu bżonn dan il-proġett. Jimtela mat-talba.", + "Reviewed by": "Rieżaminat minn", + "The user who approved or rejected the request.": "L-utent li approva jew ċaħad it-talba.", + "Reviewed at": "Rieżaminat fi", + "When the request was approved or rejected.": "Meta t-talba ġiet approvata jew miċħuda.", + "Review note": "Nota tar-rieżami", + "The reviewer's reason, shown to the requester when a request is not approved.": "Ir-raġuni ta’ min irrieżamina, li jara min għamel it-talba meta talba ma tiġix approvata.", + "Members of these groups": "Membri ta’ dawn il-gruppi", + "Groups that may create projects": "Gruppi li jistgħu joħolqu proġetti", + "The group {group} no longer exists. Save to remove it.": "Il-grupp {group} m’għadux jeżisti. Issejvja biex tneħħih.", + "Review project request": "Irrieżamina t-talba għal proġett", + "Requested by": "Mitlub minn", + "Why it is needed": "Għaliex hu meħtieġ", + "Desired start date": "Data tal-bidu mixtieqa", + "Why is it not approved?": "Għaliex mhux approvat?", + "Give a reason. The requester sees it.": "Agħti raġuni. Min għamel it-talba jaraha.", + "Approve": "Approva", + "Reject": "Iċħad", + "Reject request": "Iċħad it-talba", + "The review was not saved. Try again.": "Ir-rieżami ma ġiex issejvjat. Erġa’ pprova.", + "This project is waiting for review": "Dan il-proġett qed jistenna r-rieżami", + "This request was not approved": "Din it-talba ma ġietx approvata", + "Reason: {note}": "Raġuni: {note}", + "Review request": "Irrieżamina t-talba", + "Request a project": "Itlob proġett", + "Step {step} of 2": "Pass {step} minn 2", + "Why is this project needed?": "Għaliex hemm bżonn dan il-proġett?", + "Give a reason. The reviewer reads it.": "Agħti raġuni. Ir-rieżaminatur jaqraha.", + "Back": "Lura", + "Next": "Li jmiss", + "Send request": "Ibgħat it-talba", + "The request was not sent. Try again.": "It-talba ma ntbagħtitx. Erġa’ pprova.", + "Requested": "Mitlub", + "Not approved": "Mhux approvat", + "Your request was sent": "It-talba tiegħek intbagħtet", + "Let everyone else request a project": "Ħalli lil kulħadd ieħor jitlob proġett", + "Add a task": "Żid kompitu", + "Delete task": "Ħassar il-kompitu", + "Edit task": "Editja l-kompitu", + "Write": "Ikteb", + "Preview": "Dehra minn qabel", + "Markdown works here: headings, lists and links.": "Il-Markdown jaħdem hawn: intestaturi, listi u links.", + "Could not save the task. Please try again.": "Il-kompitu ma setax jiġi ssejvjat. Erġa' pprova.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Fuq \"{title}\" hemm ħin irreġistrat, għalhekk ma jistax jitħassar. Minflok tista' tikkanċellah: ir-reġistrazzjonijiet tal-ħin jibqgħu.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Tħassar \"{title}\"? Il-links tiegħu ma' kompiti oħra jitneħħew ukoll. Dan ma jistax jitreġġa' lura.", + "Keep task": "Żomm il-kompitu", + "Cancel task": "Ikkanċella l-kompitu", + "Only the reporter, the project owner or an admin can delete this task.": "Dan il-kompitu jista' jħassru biss min irrappurtah, is-sid tal-proġett jew amministratur.", + "Could not delete the task. Please try again.": "Il-kompitu ma setax jitħassar. Erġa' pprova.", + "Could not cancel the task. Please try again.": "Il-kompitu ma setax jiġi kkanċellat. Erġa' pprova.", + "Responsible": "Responsabbli", + "Also working on this": "Qed jaħdmu fuqu wkoll", + "Labels": "Tikketti", + "Could not change the priority. Please try again.": "Il-prijorità ma setgħetx tinbidel. Erġa' pprova.", + "Other project members who work on this task alongside the person responsible.": "Membri oħra tal-proġett li qed jaħdmu fuq dan il-kompitu flimkien mar-responsabbli.", + "Duplicate": "Iddoppja", + "Could not copy the task. Please try again.": "Il-kompitu ma setax jiġi kkupjat. Erġa' pprova.", + "Subtasks": "Sottokompiti", + "{done} of {total} done": "{done} minn {total} lesti", + "Add a subtask": "Żid sottokompitu", + "Checklist": "Lista ta' kontroll", + "Checklist item actions": "Azzjonijiet tal-oġġett tal-lista", + "Add a checklist item": "Żid oġġett fil-lista", + "Subtasks: {estimate} estimated, {logged} logged": "Sottokompiti: {estimate} stmati, {logged} irreġistrati", + "Total estimate: {total}": "Stima totali: {total}", + "Part of {title}": "Parti minn {title}", + "Checklist: {count} done": "Lista ta' kontroll: {count} lesti", + "This task has subtasks: {count}.": "Dan il-kompitu għandu sottokompiti: {count}.", + "Keep subtasks as separate tasks": "Żomm is-sottokompiti bħala kompiti separati", + "Delete subtasks too": "Ħassar is-sottokompiti wkoll", + "Copy of {title}": "Kopja ta' {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Il-kompitu ġie kkupjat, iżda mhux is-sottokompiti kollha tiegħu. Iċċekkja l-kopja.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Passi żgħar fi ħdan il-kompitu. Kull oġġett għandu id, test u jekk huwiex lest.", + "Open work per person and per project.": "Xogħol miftuħ skont il-persuna u l-proġett.", + "View": "Veduta", + "By person": "Skont il-persuna", + "By project": "Skont il-proġett", + "Hours left": "Sigħat li fadal", + "Tasks without an estimate": "Kompiti mingħajr stima", + "Due in 14 days": "Dovuti fi żmien 14-il jum", + "Shared": "Maqsuma", + "Unassigned": "Mhux assenjati", + "{hours} h": "{hours} s", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Jintwera x-xogħol fil-proġetti li tista' tara. Is-sigħat jgħoddu għall-persuna responsabbli; il-kompiti maqsuma jingħaddu mingħajr sigħat.", + "No open work in these projects.": "M'hemm l-ebda xogħol miftuħ f'dawn il-proġetti.", + "Open work": "Xogħol miftuħ", + "{count} open tasks": "{count} kompiti miftuħa", + "Create a project to see capacity here.": "Oħloq proġett biex tara l-kapaċità hawn.", + "My tasks": "Il-kompiti tiegħi", + "Show all my tasks": "Uri l-kompiti kollha tiegħi", + "No tasks assigned to you": "M'għandek l-ebda kompitu assenjat", + "Browse projects": "Esplora l-proġetti", + "Later": "Aktar tard", + "Due {date}": "Dovut {date}", + "Could not change the status. Please try again.": "L-istatus ma setax jinbidel. Erġa' pprova.", + "Completed today": "Lesti llum", + "My open tasks": "Il-kompiti miftuħa tiegħi", + "My overdue tasks": "Il-kompiti tardivi tiegħi", + "My tasks in progress": "Il-kompiti tiegħi għaddejjin", + "Pin to the top": "Waħħal fuq nett", + "Unpin": "Neħħi l-waħħil", + "Pinned": "Imwaħħal", + "Actions for {title}": "Azzjonijiet għal {title}", + "Could not save your project order. Please try again.": "L-ordni tal-proġetti tiegħek ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "No boards yet": "Għad m'hemmx bordijiet", + "Create a project to get a board.": "Oħloq proġett biex ikollok bord.", + "Use the Projects page to create and manage your projects and tasks.": "Uża l-paġna Proġetti biex toħloq u timmaniġġja l-proġetti u l-kompiti tiegħek.", + "Go to projects": "Mur għall-proġetti", + "You are not a member of any projects yet.": "Għadek m'intix membru ta' ebda proġett.", + "Could not search for users. Please try again.": "Ma setgħux jiġu mfittxija utenti. Erġa' pprova.", + "Project creation is restricted to administrators.": "Il-ħolqien tal-proġetti huwa riżervat għall-amministraturi.", + "Only the project owner or an administrator can delete this project.": "Is-sid tal-proġett jew amministratur biss jista' jħassar dan il-proġett.", + "No projects are available to you yet. Ask an administrator to create one.": "Għad m'hemmx proġetti disponibbli għalik. Staqsi lil amministratur biex joħloq wieħed.", + "Due: {date}": "Dovut: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Il-kompiti b'data tal-bidu jew data dovuta jidhru fuq il-kronoloġija. Żid id-dati biex tarahom hawn.", + "You do not have access to this project.": "M'għandekx aċċess għal dan il-proġett.", + "Zoom level": "Livell ta' zoom", + "Unscheduled": "Mhux skedati", + "Start: {date}": "Bidu: {date}", + "Today": "Illum", + "No scheduled tasks": "L-ebda kompitu skedat", + "An unexpected error occurred.": "Seħħ żball mhux mistenni.", + "Column {number} name": "Isem il-kolonna {number}", + "Failed to save creation policy": "Ir-regola tal-ħolqien ma setgħetx tiġi ssejvjata", + "All authenticated users": "L-utenti awtentikati kollha", + "Control who may create new projects": "Ikkontrolla min jista' joħloq proġetti ġodda", + "Administrators only": "Amministraturi biss", + "Project creation": "Ħolqien tal-proġetti", + "Allow project creation": "Ippermetti l-ħolqien tal-proġetti", + "Creation policy saved successfully": "Ir-regola tal-ħolqien ġiet issejvjata", + "Initializing…": "Qed jibda…", + "e.g. 2h 30m, 90m, 1.5h": "eż. 2h 30m, 90m, 1.5h", + "Log time": "Irreġistra l-ħin", + "Save estimate": "Issejvja l-istima", + "Logged: {logged}": "Irreġistrat: {logged}", + "over by {amount}": "qabeż b'{amount}", + "Time tracking": "Traċċar tal-ħin", + "Estimate": "Stima", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Daħħal stima valida (eż. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Daħħal tul validu (eż. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Ir-reġistrazzjoni tal-ħin ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "Edit time entry": "Editja r-reġistrazzjoni tal-ħin", + "Duration": "Tul", + "Date range": "Firxa ta' dati", + "Last week": "Il-ġimgħa li għaddiet", + "No time logged": "L-ebda ħin irreġistrat", + "Log time on a task to see it here.": "Irreġistra ħin fuq kompitu biex tarah hawn.", + "To date": "Sad-data", + "This week": "Din il-ġimgħa", + "Total: {total}": "Total: {total}", + "From date": "Mid-data", + "Custom range": "Firxa personalizzata", + "All time": "Il-ħin kollu", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Kompitu ma setax jitħassar, għalhekk jista' jkun għad fadal data. Erġa' ħassar il-proġett.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Reġistrazzjoni tal-ħin ma setgħetx titħassar, għalhekk jista' jkun għad fadal data. Erġa' ħassar il-proġett.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Kolonna ma setgħetx titħassar, għalhekk jista' jkun għad fadal data. Erġa' ħassar il-proġett.", + "Could not delete the project. Please try again.": "Il-proġett ma setax jitħassar. Erġa' pprova.", + "Notification settings": "Settings tan-notifiki", + "Configure when due-date reminders are sent": "Issettja meta jintbagħtu t-tfakkiriet tad-data dovuta", + "Due-date reminder lead time (hours)": "Ħin qabel it-tfakkira (sigħat)", + "Lead time must be between 1 and 336 hours": "Il-ħin irid ikun bejn 1 u 336 siegħa", + "Reminder lead time saved successfully": "Il-ħin tat-tfakkira ġie ssejvjat", + "Failed to save reminder lead time": "Il-ħin tat-tfakkira ma setax jiġi ssejvjat", + "Notifications": "Notifiki", + "Notify me 1 day before a task's due date": "Innotifikani jum qabel id-data dovuta ta' kompitu", + "Draft": "Abbozz", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Jekk il-lezzjoni hijiex abbozz li jarah l-għalliem tagħha biss, issirx jew hijiex ikkanċellata.", + "New release": "Rilaxx ġdid", + "Roadmap chart. The same releases and epics are listed below.": "Grafika tal-pjan direzzjonali. L-istess rilaxxi u epiki huma elenkati hawn taħt.", + "Nothing on the roadmap yet": "Għad m'hemm xejn fuq il-pjan direzzjonali", + "Releases with a target date and epics with dated tasks appear here.": "Hawn jidhru r-rilaxxi b'data mmirata u l-epiki b'kompiti datati.", + "Releases": "Rilaxxi", + "No releases yet": "Għad m'hemm l-ebda rilaxx", + "Target date: {date}": "Data mmirata: {date}", + "No target date": "L-ebda data mmirata", + "Edit {name}": "Editja {name}", + "Mark {name} as released": "Immarka {name} bħala rilaxxat", + "Mark as released": "Immarka bħala rilaxxat", + "Epics": "Epiki", + "No epics yet. Open a task to make it an epic.": "Għad m'hemm l-ebda epiku. Iftaħ kompitu biex tagħmlu epiku.", + "Not scheduled yet": "Għadu mhux skedat", + "Planned": "Ippjanat", + "Released": "Rilaxxat", + "Edit release": "Editja r-rilaxx", + "Target date": "Data mmirata", + "Could not save the release. Please try again.": "Ir-rilaxx ma setax jiġi ssejvjat. Erġa' pprova.", + "Every task of this release is done or cancelled.": "Kull kompitu ta' dan ir-rilaxx lest jew ikkanċellat.", + "Not finished yet: {count}": "Għadhom mhux lesti: {count}", + "What happens to these tasks?": "X'jiġri minn dawn il-kompiti?", + "Move to {name}": "Mexxi għal {name}", + "Remove the release": "Neħħi r-rilaxx", + "Keep it on {name}": "Ħallihom fuq {name}", + "Could not mark the release as released. Please try again.": "Ir-rilaxx ma setax jiġi mmarkat bħala rilaxxat. Erġa' pprova.", + "Roadmap": "Pjan direzzjonali", + "Tasks or roadmap": "Kompiti jew pjan direzzjonali", + "Release": "Rilaxx", + "Epic": "Epiku", + "This task is an epic": "Dan il-kompitu huwa epiku", + "A named, dated delivery of a project that its tasks are planned against.": "Kunsinna ta' proġett b'isem u data, li kontriha jiġu ppjanati l-kompiti tiegħu.", + "Name of the release": "Isem ir-rilaxx", + "The project this release belongs to": "Il-proġett li jappartjeni għalih dan ir-rilaxx", + "What this release delivers": "X'jikkunsinna dan ir-rilaxx", + "When work on the release starts": "Meta jibda x-xogħol fuq ir-rilaxx", + "The date the release is due": "Id-data li fiha r-rilaxx huwa dovut", + "Whether the release is planned, released or archived": "Jekk ir-rilaxx huwiex ippjanat, rilaxxat jew arkivjat", + "Released on": "Rilaxxat fi", + "When the release was marked as released": "Meta r-rilaxx ġie mmarkat bħala rilaxxat", + "The release this task is planned for": "Ir-rilaxx li għalih huwa ppjanat dan il-kompitu", + "Board view options": "Għażliet tal-wiri tal-bord", + "Colour cards": "Ikkulura l-kards", + "No colour": "L-ebda kulur", + "By label": "Skont it-tikketta", + "Swimlanes": "Korsiji", + "No swimlanes": "L-ebda korsija", + "By assignee": "Skont l-assenjat", + "By epic": "Skont l-epic", + "No assignee": "Mhux assenjat", + "No epic": "L-ebda epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Il-kards jibqgħu fir-ringiela tal-epic tagħhom. Ibdel l-epic fil-paġna tal-kompitu.", + "Hand over to": "Għaddi lil", + "Could not save your board view. It applies until you reload.": "Il-wiri tal-bord ma ġiex issejvjat. Japplika sakemm terġa' ttella' l-paġna.", + "Timetable wish": "Xewqa tal-orarju", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Xewqa li l-ġeneratur iqis. Xewqa iebsa dejjem iżommha, u xewqa flessibbli fejn jista'.", + "Whether the wish is about a teacher, a group, a room or one activity": "Jekk ix-xewqa hijiex dwar għalliem, grupp, kamra jew attività", + "Teacher": "Għalliem", + "Group": "Grupp", + "Reference": "Referenza", + "The user, group, room or activity the wish is about": "L-utent, il-grupp, il-kamra jew l-attività li tikkonċerna x-xewqa", + "What the wish asks for": "X'titlob ix-xewqa", + "Not on these periods": "Mhux f'dawn il-perjodi", + "Preferably not on these periods": "Preferibbilment mhux f'dawn il-perjodi", + "At most a number of lessons a day": "L-aktar numru ta' lezzjonijiet kuljum", + "No free periods between lessons": "Ebda perjodu vojt bejn il-lezzjonijiet", + "Always the same room": "Dejjem l-istess kamra", + "Periods": "Perjodi", + "The periods of the week the wish is about, such as wed-5": "Il-perjodi tal-ġimgħa li tikkonċerna x-xewqa, bħal wed-5", + "Limit": "Limitu", + "The most lessons a day, for a wish of that kind": "L-aktar lezzjonijiet kuljum, għal xewqa ta' dak it-tip", + "Strength": "Saħħa", + "Whether the generator must keep the wish or should keep it": "Jekk il-ġeneratur għandux bilfors jew għandux iżomm ix-xewqa", + "Hard": "Iebsa", + "Soft": "Flessibbli", + "Weight": "Piż", + "How much a soft wish counts, from 1 to 3": "Kemm tgħodd xewqa flessibbli, minn 1 sa 3", + "Why the wish exists": "Għaliex teżisti x-xewqa", + "Timetable scenario": "Xenarju tal-orarju", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Mudell ta' ġimgħa waħda, magħmul mill-ġeneratur jew meħud mill-orarju attwali. Iżomm l-input tiegħu u kemm iżomm tajjeb ix-xewqat.", + "The name timetablers know the scenario by": "L-isem li bih dawk li jagħmlu l-orarju jafu x-xenarju", + "Whether the generator made it or it came from the current timetable": "Jekk għamlux il-ġeneratur jew ġiex mill-orarju attwali", + "Generated": "Iġġenerat", + "From the current timetable": "Mill-orarju attwali", + "Week of": "Ġimgħa tal-", + "The Monday of the first week of the window": "It-Tnejn tal-ewwel ġimgħa tal-perjodu", + "Window start": "Bidu tal-perjodu", + "The first day the week pattern applies to": "L-ewwel jum li fih japplika l-mudell tal-ġimgħa", + "Window end": "Tmiem tal-perjodu", + "The last day the week pattern applies to": "L-aħħar jum li fih japplika l-mudell tal-ġimgħa", + "Waiting, generating, done, failed, or published as draft lessons": "Qed jistenna, qed jiġi ġġenerat, lest, falla jew ippubblikat bħala lezzjonijiet abbozz", + "Waiting": "Qed jistenna", + "Generating": "Qed jiġi ġġenerat", + "Failed": "Falla", + "Published": "Ippubblikat", + "Seed": "Żerriegħa", + "The number the generator starts from, so a run can be repeated": "In-numru li bih jibda l-ġeneratur, biex ġirja tkun tista' tiġi ripetuta", + "Input": "Input", + "The periods, rooms, lessons and wishes the scenario was made from": "Il-perjodi, il-kmamar, il-lezzjonijiet u x-xewqat li minnhom sar ix-xenarju", + "Placements": "Postijiet", + "Each lesson with the period and room it was given": "Kull lezzjoni bil-perjodu u l-kamra li ngħatat", + "Unplaced lessons": "Lezzjonijiet mingħajr post", + "Lessons without a place, each with the hard wish that blocked it": "Lezzjonijiet mingħajr post, kull waħda bix-xewqa iebsa li waqqfitha", + "Broken wishes": "Xewqat miksura", + "The wishes this scenario breaks, with the lessons that break them": "Ix-xewqat li dan ix-xenarju jikser, bil-lezzjonijiet li jiksruhom", + "Measures": "Kejl", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Lezzjonijiet imqiegħda, xewqat miksura, perjodi vojta tal-għalliema, lezzjonijiet kuljum u użu tal-kmamar", + "Reason": "Raġuni", + "Why the run failed": "Għaliex falliet il-ġirja", + "Published at": "Ippubblikat fi", + "When the scenario was written out as draft lessons": "Meta x-xenarju nkiteb bħala lezzjonijiet abbozz", + "Edit wish": "Editja x-xewqa", + "New wish": "Xewqa ġdida", + "Hard: the generator always keeps it": "Iebsa: il-ġeneratur dejjem iżommha", + "Soft: the generator keeps it where it can": "Ratba: il-ġeneratur iżommha fejn jista'", + "Weight (1 to 3)": "Piż (minn 1 sa 3)", + "Most lessons a day": "L-akbar numru ta' lezzjonijiet kuljum", + "Period": "Perjodu", + "{day} period {number}": "{day} perjodu {number}", + "Teacher (user name)": "Għalliem (isem tal-utent)", + "Activity (group:subject)": "Attività (grupp:suġġett)", + "Say who or what the wish is about.": "Għid dwar min jew dwar xiex hi x-xewqa.", + "Choose at least one period.": "Agħżel mill-inqas perjodu wieħed.", + "The limit is a whole number of 1 or more.": "Il-limitu huwa numru sħiħ ta' 1 jew aktar.", + "Timetable": "Orarju", + "Wishes": "Xewqat", + "Timetable wishes": "Xewqat għall-orarju", + "Generator run": "Tħaddim tal-ġeneratur", + "Generator progress": "Progress tal-ġeneratur", + "The run failed: {reason}": "It-tħaddim falla: {reason}", + "{placed} of {lessons} lessons placed": "{placed} minn {lessons} lezzjonijiet imqiegħda", + "Generate again": "Iġġenera mill-ġdid", + "Generate": "Iġġenera", + "Every lesson has a place.": "Kull lezzjoni għandha post.", + "Lesson": "Lezzjoni", + "No free period and room": "L-ebda perjodu u kamra ħielsa", + "Broken soft wishes": "Xewqat ratba miksura", + "Every soft wish is kept.": "Kull xewqa ratba hi miżmuma.", + "Wish": "Xewqa", + "Lessons": "Lezzjonijiet", + "Generating: {percent}% of the time budget used": "Qed jiġġenera: intuża {percent}% tal-ħin", + "Waiting to start": "Qed jistenna biex jibda", + "Published as draft lessons": "Ippubblikat bħala lezzjonijiet abbozz", + "Could not read the scenario.": "Ma setax jinqara x-xenarju.", + "Could not start the run.": "Ma setax jibda t-tħaddim.", + "Scenarios": "Xenarji", + "Timetable scenarios": "Xenarji tal-orarju", + "Scenario": "Xenarju", + "Take the current timetable": "Ħu l-orarju attwali", + "Could not take the current timetable.": "Ma setax jittieħed l-orarju attwali.", + "Broken hard wishes": "Xewqat obbligatorji miksura", + "Not on a period of the week grid": "Mhux f'lezzjoni tal-grilja tal-ġimgħa", + "Compare scenarios": "Qabbel ix-xenarji", + "Scenarios to compare": "Xenarji biex jitqabblu", + "Choose two or three scenarios to compare them.": "Agħżel żewġ jew tliet xenarji biex tqabbilhom.", + "Measure": "Kejl", + "Best": "L-aħjar", + "Lessons that differ": "Lezzjonijiet li jvarjaw", + "No lesson differs.": "L-ebda lezzjoni ma tvarja.", + "Not placed": "Mhux imqiegħda", + "{period} in {room}": "{period} f'{room}", + "Lessons placed": "Lezzjonijiet imqiegħda", + "Lessons without a place": "Lezzjonijiet mingħajr post", + "Clashes": "Kunflitti", + "Hard wishes broken": "Xewqat iebsa miksura", + "Soft wishes broken": "Xewqat ratba miksura", + "Soft wishes broken, weighted": "Xewqat ratba miksura, peżati", + "Free periods between lessons, all teachers": "Perjodi ħielsa, l-għalliema kollha", + "Most free periods of one teacher": "L-aktar perjodi ħielsa ta' għalliem wieħed", + "Most lessons of one group on a day": "L-aktar lezzjonijiet ta' grupp wieħed f'ġurnata", + "Room use": "Użu tal-kmamar", + "Publish as draft lessons": "Ippubblika bħala lezzjonijiet abbozz", + "Draft lessons written: {count}": "Lezzjonijiet abbozz miktuba: {count}", + "Could not publish the scenario.": "Ix-xenarju ma setax jiġi ppubblikat.", + "Rules": "Regoli", + "Rules for {column}": "Regoli għal {column}", + "When a card enters this column": "Meta karta tidħol f'din il-kolonna", + "Action": "Azzjoni", + "Set the priority": "Issettja l-prijorità", + "Assign to": "Assenja lil", + "Assign the person who moved the card": "Assenja lill-persuna li ċċaqilqet il-karta", + "Remove the assignee": "Neħħi l-assenjat", + "Add a label": "Żid tikketta", + "No longer a project member": "M'għadux membru tal-proġett", + "This label no longer exists": "Din it-tikketta m'għadhiex teżisti", + "Add rule": "Żid regola", + "Remove rule": "Neħħi regola", + "No rules yet. Add one to change a card when it enters this column.": "Għad m'hemmx regoli. Żid waħda biex tbiddel karta meta tidħol f'din il-kolonna.", + "Could not save the rules. Please try again.": "Ir-regoli ma setgħux jiġu ssejvjati. Erġa' pprova.", + "1 rule runs when a card enters this column": "Regola 1 taħdem meta karta tidħol f'din il-kolonna", + "{count} rules run when a card enters this column": "{count} regoli jaħdmu meta karta tidħol f'din il-kolonna", + "Rules applied: {changes}": "Regoli applikati: {changes}", + "assigned to {name}": "assenjata lil {name}", + "assignee removed": "assenjat imneħħi", + "priority {priority}": "prijorità {priority}", + "label {label}": "tikketta {label}", + "What happens to a card when it enters this column, applied in list order.": "X'jiġri minn karta meta tidħol f'din il-kolonna, fl-ordni tal-lista.", + "Value": "Valur", + "What the rule does to the card.": "X'tagħmel ir-regola lill-karta.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Il-prijorità, l-id tal-utent jew l-id tat-tikketta li tuża l-azzjoni; vojt għal azzjonijiet mingħajr valur.", + "is not": "mhux", + "{dimension} is not": "{dimension} mhux", + "Saved filters": "Filtri ssejvjati", + "No saved filters yet": "Għad m'hemmx filtri ssejvjati", + "Save filter": "Issejvja l-filtru", + "Rename \"{name}\"": "Ibdel l-isem ta' \"{name}\"", + "Delete \"{name}\"": "Ħassar \"{name}\"", + "Clear filters": "Neħħi l-filtri", + "Showing {shown} of {total} tasks": "Qed jintwerew {shown} minn {total} kompitu", + "Me": "Jien", + "No date": "L-ebda data", + "Rename saved filter": "Ibdel l-isem tal-filtru ssejvjat", + "Share with the project": "Aqsam mal-proġett", + "Give the filter a name": "Agħti isem lill-filtru", + "Could not save the filter. Please try again.": "Il-filtru ma setax jiġi ssejvjat. Erġa' pprova.", + "Some labels in \"{name}\" no longer exist and were left out.": "Xi tikketti f'\"{name}\" m'għadhomx jeżistu u tħallew barra.", + "Could not delete the filter. Please try again.": "Il-filtru ma setax jitħassar. Erġa' pprova.", + "Saved filter": "Filtru ssejvjat", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Filtru tal-bord b'isem ta' proġett wieħed, privat għal min issejvjah sakemm ma jinqasamx mal-proġett.", + "The project whose board the filter applies to": "Il-proġett li l-filtru japplika għall-bord tiegħu", + "The name the filter is listed under": "L-isem li bih jidher il-filtru fil-lista", + "Saved by": "Issejvjat minn", + "Nextcloud user id of the person who saved the filter": "L-id tal-utent Nextcloud ta' min issejvja l-filtru", + "Shared with the project": "Maqsum mal-proġett", + "Whether every project member sees and applies the filter": "Jekk kull membru tal-proġett jarax u jistax japplika l-filtru", + "Criteria": "Kriterji", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Il-filtru: assenjat, tikketta, prijorità u data tal-iskadenza, kull wieħed b'huwa jew mhux u l-valuri tiegħu", + "Cross-project view": "Veduta bejn proġetti", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Għażla ssejvjata ta' proġetti li l-kompiti tagħhom jintwerew flimkien f'korsiji tal-istatus, maqsuma man-nies li ssemmi.", + "Shared with": "Maqsuma ma'", + "The name the view is listed under": "L-isem li taħtu titniżżel il-veduta", + "Nextcloud user id of the person who saved the view": "L-id tal-utent ta' Nextcloud tal-persuna li ssejvjat il-veduta", + "Nextcloud user ids of the people the view is shared with": "L-ids tal-utenti ta' Nextcloud tan-nies li magħhom hi maqsuma l-veduta", + "The projects whose tasks the view shows, at most twenty": "Il-proġetti li l-kompiti tagħhom turi l-veduta, mhux aktar minn għoxrin", + "1 project in this view is hidden from you.": "Proġett 1 f'din il-veduta huwa moħbi minnek.", + "{count} projects in this view are hidden from you.": "Proġetti f'din il-veduta moħbija minnek: {count}.", + "{project} has no column for {status}.": "{project} m'għandux kolonna għal {status}.", + "This view does not exist or is not shared with you.": "Din il-veduta ma teżistix jew mhijiex maqsuma miegħek.", + "\"{task}\" moved to {status}.": "\"{task}\" ġie mċaqlaq għal {status}.", + "Project: {title}": "Proġett: {title}", + "Cross-project views": "Vedute bejn proġetti", + "New view": "Veduta ġdida", + "Edit view": "Editja l-veduta", + "Delete view": "Ħassar il-veduta", + "Give the view a name": "Agħti isem lill-veduta", + "Pick at least one project": "Agħżel mill-inqas proġett wieħed", + "A view shows at most {max} projects": "Veduta turi mhux aktar minn {max} proġetti", + "Could not save the view. Please try again.": "Il-veduta ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "Could not delete the view. Please try again.": "Il-veduta ma setgħetx titħassar. Erġa' pprova.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Tħassar \"{title}\"? Il-proġetti u l-kompiti tagħhom jibqgħu kif inhuma.", + "People see the tasks of the projects they are in, never more.": "Kulħadd jara biss il-kompiti tal-proġetti li jkun fihom.", + "No views yet. A view shows the tasks of several of your projects together.": "Għad m'hemmx vedute. Veduta turi flimkien il-kompiti ta' diversi proġetti tiegħek.", + "Projects in view: {count}": "Proġetti fil-veduta: {count}", + "Notify me when a task is assigned to me": "Innotifikani meta jiġi assenjat lili kompitu", + "Also send these to me by email": "Ibgħatomli wkoll bl-email", + "Add an email address in your Nextcloud personal settings to get mail.": "Żid indirizz tal-email fis-settings personali ta' Nextcloud biex tirċievi l-email.", + "Code link": "Link tal-kodiċi", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, fergħa, talba għal għaqda jew kwistjoni fuq pjattaforma tal-kodiċi li taħdem fuq kompitu.", + "The task the link belongs to": "Il-kompitu li jappartjeni għalih il-link", + "The project of the task": "Il-proġett tal-kompitu", + "Task key": "Ċavetta tal-kompitu", + "The task key the forge text named, such as VC-12": "Iċ-ċavetta tal-kompitu li semma t-test tal-pjattaforma, bħal VC-12", + "What the link points at": "Fejn jipponta l-link", + "Link": "Link", + "The address of the item in the forge": "L-indirizz tal-oġġett fuq il-pjattaforma tal-kodiċi", + "The commit message, branch name or merge request title": "Il-messaġġ tal-commit, l-isem tal-fergħa jew it-titlu tat-talba għal għaqda", + "Repository": "Repożitorju", + "The repository, such as acme/portal": "Ir-repożitorju, bħal acme/portal", + "Forge id": "Id fuq il-pjattaforma", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "L-id proprju tal-oġġett fuq il-pjattaforma tal-kodiċi, bħal github:acme/portal#42 jew hash ta' commit", + "State": "Stat", + "The state of a merge request or issue": "L-istat ta' talba għal għaqda jew kwistjoni", + "Who made the commit or opened the merge request": "Min għamel il-commit jew fetaħ it-talba għal għaqda", + "When the commit was made or the merge request last changed": "Meta sar il-commit jew inbidlet l-aħħar darba t-talba għal għaqda", + "Added by": "Miżjud minn", + "Whether a person added the link or the integration wrote it": "Jekk persuna żiedet il-link jew l-integrazzjoni kitbitu", + "Nextcloud user UIDs of project members": "ID tal-utenti Nextcloud tal-membri tal-proġett", + "Add link": "Żid link", + "Added by hand": "Miżjud bl-idejn", + "Branch": "Fergħa", + "Code": "Kodiċi", + "Commit": "Commit", + "From the integration": "Mill-integrazzjoni", + "Link to a commit, branch or merge request": "Link għal commit, fergħa jew talba għal għaqda", + "Merge request": "Talba għal għaqda", + "Merged": "Magħquda", + "No code linked yet. Name {key} in a commit message or paste a link.": "Għad m'hemm l-ebda kodiċi marbut. Semmi {key} f'messaġġ ta' commit jew waħħal link.", + "No code linked yet. Paste a link to a commit or merge request.": "Għad m'hemm l-ebda kodiċi marbut. Waħħal link għal commit jew talba għal għaqda.", + "Paste a web address that starts with https://.": "Waħħal indirizz tal-web li jibda b'https://.", + "Remove link {title}": "Neħħi l-link {title}", + "The link could not be added.": "Il-link ma setax jiżdied.", + "The link could not be removed.": "Il-link ma setax jitneħħa.", + "This link is already on the task.": "Dan il-link diġà jinsab fuq il-kompitu.", + "Code forges": "Pjattaformi tal-kodiċi", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Orbot il-commits u l-pull requests ta' GitHub mal-kompiti. Integriq jirċievi l-avvenimenti; planninq qatt ma jċempel lil GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Niżżel il-konfigurazzjoni u importaha f'Integriq. Imbagħad imla sigriet fir-regola \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "F'GitHub, żid webhook mar-repożitorju b'dan l-indirizz u l-istess sigriet. Agħżel it-tip ta' kontenut application/json u l-avvenimenti push u pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Semmi ċ-ċavetta tal-kompitu, bħal VC-12, f'messaġġ ta' commit, f'isem ta' fergħa jew fit-titlu ta' pull request. Il-link imbagħad jidher fuq dak il-kompitu.", + "Without Integriq, project members can still paste a link on the task page.": "Mingħajr Integriq, il-membri tal-proġett xorta jistgħu jwaħħlu link fil-paġna tal-kompitu.", + "Download the Integriq configuration": "Niżżel il-konfigurazzjoni ta' Integriq", + "Calendar": "Kalendarju", + "Previous": "Ta' qabel", + "Calendar view": "Veduta tal-kalendarju", + "Starts:": "Jibda:", + "No tasks with a date in this month.": "L-ebda kompitu b'data dan ix-xahar.", + "Week of {start} to {end}": "Ġimgħa minn {start} sa {end}", + "My calendar": "Il-kalendarju tiegħi", + "Show as list": "Uri bħala lista", + "Show as calendar": "Uri bħala kalendarju", + "Open my calendar": "Iftaħ il-kalendarju tiegħi", + "Nextcloud Tasks": "Kompiti ta' Nextcloud", + "Show my tasks in Nextcloud Tasks": "Uri l-kompiti tiegħi fil-Kompiti ta' Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Il-kompiti assenjati lilek jew maqsuma miegħek jidhru f'lista \"Planninq\" fil-Kompiti u l-Kalendarju ta' Nextcloud. Il-bidliet li ssir hemm jiġu sostitwiti bil-bidla li jmiss fi Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Dan is-server ma jistax jikteb fil-Kompiti ta' Nextcloud, għalhekk l-esportazzjoni mhix disponibbli.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Immexxi minn Planninq. Il-bidliet li ssir hawn jiġu sostitwiti bil-bidla li jmiss fi Planninq.", + "Working days and holidays": "Ġranet tax-xogħol u btajjel", + "Dates set on the timeline skip the days that are not working days.": "Id-dati stabbiliti fuq il-kronoloġija jaqbżu l-ġranet li mhumiex ġranet tax-xogħol.", + "Working weekdays": "Il-ġranet tax-xogħol tal-ġimgħa", + "Non-working days": "Ġranet mhux tax-xogħol", + "No non-working days yet.": "Għad m'hemm l-ebda jum mhux tax-xogħol.", + "Add day": "Żid jum", + "Year": "Sena", + "Add Dutch national holidays": "Żid il-btajjel nazzjonali Olandiżi", + "Save working days": "Issejvja l-ġranet tax-xogħol", + "Choose at least one working weekday.": "Agħżel mill-inqas jum wieħed tax-xogħol.", + "Working days saved.": "Il-ġranet tax-xogħol ġew issejvjati.", + "Could not save the working days.": "Il-ġranet tax-xogħol ma setgħux jiġu ssejvjati.", + "New Year's Day": "L-Ewwel tas-Sena", + "Easter Sunday": "Ħadd il-Għid", + "Easter Monday": "It-Tnejn ta' wara l-Għid", + "King's Day": "Jum is-Sultan", + "Liberation Day": "Jum il-Ħelsien", + "Ascension Day": "It-Tlugħ fis-Sema", + "Whit Sunday": "Għid il-Ħamsin", + "Whit Monday": "It-Tnejn ta' wara Għid il-Ħamsin", + "Christmas Day": "Il-Milied", + "Boxing Day": "It-tieni jum tal-Milied", + "Dates of {title}": "Id-dati ta' {title}", + "The due date cannot be before the start date.": "Id-data tal-għeluq ma tistax tkun qabel id-data tal-bidu.", + "{title}, from {start} to {end}": "{title}, minn {start} sa {end}", + "The dates could not be saved.": "Id-dati ma setgħux jiġu ssejvjati.", + "{title} now runs from {start} to {end}": "{title} issa jdum minn {start} sa {end}", + "Auto-scheduling": "Skedar awtomatiku", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Meta jkun mixgħul, iċċaqlaq data tal-għeluq aktar tard fuq il-kronoloġija joffri li jiċċaqilqu wkoll il-kompiti li timblokka.", + "Move blocked tasks along when a task slips": "Ċaqlaq il-kompiti mblukkati meta kompitu jdum", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Fuq il-kronoloġija, data tal-għeluq aktar tard toffri li jiċċaqilqu l-kompiti mblukkati. Jgħoddu biss ir-rabtiet \"jimblokka\", u l-kompiti jiċċaqilqu biss aktar tard.", + "Move the tasks that wait for {title}?": "Tiċċaqlaq il-kompiti li qed jistennew lil {title}?", + "These tasks wait for it and would start after its new due date:": "Dawn il-kompiti qed jistennewh u jibdew wara d-data l-ġdida:", + "{count} tasks would move; the first {limit} are listed.": "Jiċċaqilqu {count} kompiti; l-ewwel {limit} huma elenkati.", + "Now": "Issa", + "After the move": "Wara ċ-ċaqliq", + "Only this task": "Dan il-kompitu biss", + "Move all": "Ċaqlaq kollox", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Waqaf f'{title}: id-dati ma setgħux jiġu ssejvjati. Il-kompiti ta' qablu ġew iċċaqilqa.", + "Cumulative flow": "Fluss kumulattiv", + "Show as chart": "Uri bħala graff", + "Show as table": "Uri bħala tabella", + "Tasks per column per day": "Kompiti għal kull kolonna kuljum", + "Tasks without recorded history in this period: {count}": "Kompiti mingħajr storja rreġistrata f'dan il-perjodu: {count}", + "Lead and cycle time": "Ħin tal-kunsinna u ħin taċ-ċiklu", + "No tasks were finished in this period.": "Ebda kompitu ma tlesta f'dan il-perjodu.", + "Finished tasks": "Kompiti mlestija", + "Cycle time, average": "Ħin taċ-ċiklu, medja", + "Cycle time, 85th percentile": "Ħin taċ-ċiklu, il-85 perċentil", + "Lead time, average": "Ħin tal-kunsinna, medja", + "Tasks whose finish time was estimated from their history: {count}": "Kompiti li l-ħin tat-tmiem tagħhom ġie stmat mill-istorja: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Ħin taċ-ċiklu ta' kull kompitu mlesti, bil-medja u l-85 perċentil", + "Slowest tasks": "L-aktar kompiti bil-mod", + "cycle {cycle}, lead {lead}": "ċiklu {cycle}, kunsinna {lead}", + "{days} days": "{days} jiem", + "Could not load the flow of this project.": "Il-fluss ta' dan il-proġett ma setax jitgħabba.", + "Last {days} days": "L-aħħar {days} jiem", + "Portfolio flow": "Fluss tal-portafoll", + "An admin adds portfolios under Projects, Portfolios.": "Amministratur iżid portafolli taħt Proġetti, Portafolli.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Proġetti mhux murija, għax jintwerew l-aktar 50 kull darba: {count}", + "Could not load the flow of this portfolio.": "Il-fluss ta' dan il-portafoll ma setax jitgħabba.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Fluss kumulattiv u ħin taċ-ċiklu fuq il-proġetti ta' portafoll.", + "Edit report": "Editja r-rapport", + "Only tasks where": "Kompiti biss fejn", + "Group by": "Iġbor skont", + "Display": "Wiri", + "Share with everyone who can read its projects": "Aqsam ma' kull min jista' jaqra l-proġetti tiegħu", + "The report could not be saved.": "Ir-rapport ma setax jiġi salvat.", + "Number of tasks": "Numru ta' kompiti", + "Bar": "Vireg", + "Donut": "Ċirku", + "Table": "Tabella", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} minn {total} proġetti f'dan ir-rapport mhumiex viżibbli għalik", + "No tasks match this report.": "L-ebda kompitu ma jaqbel ma' dan ir-rapport.", + "None": "Xejn", + "Could not load this report.": "Dan ir-rapport ma setax jitgħabba.", + "Report": "Rapport", + "Your reports": "Ir-rapporti tiegħek", + "My reports": "Ir-rapporti tiegħi", + "Shared reports": "Rapporti kondiviżi", + "You have not built a report yet.": "Għadek ma għamilt l-ebda rapport.", + "Nobody has shared a report with you yet.": "Ħadd għadu ma qasam rapport miegħek.", + "Reports you built over tasks, and the ones shared with you.": "Rapporti li għamilt fuq il-kompiti, u dawk maqsuma miegħek.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Mistoqsija salvata fuq il-kompiti: liema proġetti, liema filtri, miġbura skont xiex, magħduda jew miġmugħa, u murija bħala tabella jew graff.", + "The name the report is listed under": "L-isem li bih ir-rapport jidher fil-lista", + "What the report shows and who it is for": "X'juri r-rapport u għal min hu", + "Nextcloud user id of the person who saved the report": "L-id tal-utent Nextcloud ta' min issejvja r-rapport", + "Who can open the report": "Min jista' jiftaħ ir-rapport", + "Only me": "Jien biss", + "Everyone who can read its projects": "Kull min jista' jaqra l-proġetti tiegħu", + "The projects the report covers, at most fifty": "Il-proġetti li jkopri r-rapport, l-aktar ħamsin", + "Filters": "Filtri", + "Task fields and the value each must equal": "Oqsma tal-kompitu u l-valur li kull wieħed irid ikun ugwali għalih", + "The task field the report groups on": "Il-qasam tal-kompitu li bih jiġbor ir-rapport", + "Count the tasks, or add up a number on them": "Għodd il-kompiti, jew iġma' numru fuqhom", + "Sum": "Somma", + "Sum of": "Somma ta'", + "The number added up when the measure is a sum": "In-numru li jinġabar meta l-kejl ikun somma", + "Story points": "Punti tal-istorja", + "Estimated duration": "Tul stmat", + "How the report is shown": "Kif jintwera r-rapport", + "Issue type": "Tip ta' talba", + "Task fields and the value each must equal; empty when the report covers every task": "Il-qasam tal-kompitu u l-valur li għandu jkollu kull wieħed; vojt meta r-rapport ikopri l-kompiti kollha", + "The status a task must have": "L-istatus li għandu jkollu kompitu", + "The priority a task must have": "Il-prijorità li għandu jkollu kompitu", + "The user a task must be assigned to": "L-utent li lilu għandu jkun assenjat kompitu", + "A label a task must carry": "Tikketta li għandu jkollu kompitu", + "The board column a task must be in": "Il-kolonna tal-bord li fiha għandu jkun kompitu", + "The issue type a task must have": "It-tip ta' talba li għandu jkollu kompitu", + "Manager groups": "Gruppi tal-maniġers", + "Member groups": "Gruppi tal-membri", + "Viewer groups": "Gruppi tal-qarrejja", + "Viewers": "Qarrejja", + "Owning group": "Grupp sid", + "Nextcloud groups whose members manage the project": "Gruppi Nextcloud li l-membri tagħhom jimmaniġġjaw il-proġett", + "Nextcloud groups whose members work on the project": "Gruppi Nextcloud li l-membri tagħhom jaħdmu fuq il-proġett", + "Nextcloud groups whose members may read the project": "Gruppi Nextcloud li l-membri tagħhom jistgħu jaqraw il-proġett", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utenti Nextcloud li jimmaniġġjaw il-proġett: settings, membri u xogħol", + "Nextcloud user ids who may read the project and its work but not change it": "Utenti Nextcloud li jistgħu jaqraw il-proġett u x-xogħol tiegħu iżda mhux ibiddluhom", + "The Nextcloud group that owns the project with its creator, at most one": "Il-grupp Nextcloud li għandu l-proġett flimkien ma' min ħolqu, l-aktar wieħed", + "Nextcloud user ids who may read this through the project": "Utenti Nextcloud li jistgħu jaqraw dan permezz tal-proġett", + "Nextcloud groups whose members may change this through the project": "Gruppi Nextcloud li l-membri tagħhom jistgħu jbiddlu dan permezz tal-proġett", + "Nextcloud groups whose members may read this through the project": "Gruppi Nextcloud li l-membri tagħhom jistgħu jaqraw dan permezz tal-proġett", + "Search for a person or a group…": "Fittex persuna jew grupp…", + "No one found. Your admin's sharing settings decide who you can find.": "Ħadd ma nstab. L-issettjar tal-qsim tal-amministratur tiegħek jiddeċiedi lil min tista' ssib.", + "Type at least two characters": "Ikteb mill-inqas żewġ karattri", + "Everyone in this group": "Kulħadd f'dan il-grupp", + "Could not search for people. Please try again.": "It-tfittxija għal persuni ma rnexxietx. Erġa' pprova.", + "Could not remove the group": "Il-grupp ma setax jitneħħa", + "Only the owner and managers change who is on this project.": "Is-sid u l-maniġers biss ibiddlu min hu f'dan il-proġett.", + "Role of {name}": "Ir-rwol ta' {name}", + "Manager": "Maniġer", + "Member": "Membru", + "Viewer": "Qarrej", + "Could not change the role": "Ir-rwol ma setax jinbidel", + "Owned by group: {name}": "Proprjetà tal-grupp: {name}", + "No group owns this project.": "L-ebda grupp ma huwa sid ta' dan il-proġett.", + "Owned by group": "Proprjetà tal-grupp", + "Search for a group…": "Fittex grupp…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ma nstab l-ebda grupp. Is-settings tal-qsim tal-amministratur tiegħek jiddeċiedu liema gruppi tista' ssib.", + "No owning group": "L-ebda grupp sid", + "Could not search for groups. Please try again.": "Ma setgħux jiġu mfittxija gruppi. Erġa' pprova.", + "Could not change the owning group": "Il-grupp sid ma setax jinbidel", + "You can read this project. Only its members change it.": "Tista' taqra dan il-proġett. Il-membri tiegħu biss ibiddluh.", + "Course": "Kors", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il-kors mgħallem f'din il-lezzjoni, bħal suġġett fakultattiv, meta l-app tat-tagħlim tal-iskola tkun tafu.", + "Online meeting link": "Link tal-lezzjoni online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Fejn l-istudenti jingħaqdu ma' din il-lezzjoni online. Il-buttuna Ingħaqad tidher biss għal link https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/mt.json b/l10n/mt.json index d62ec86f..b0035468 100644 --- a/l10n/mt.json +++ b/l10n/mt.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Proġetti attivi", + "Archived projects": "Proġetti arkivjati", + "Boards": "Bordijiet", + "My projects": "Il-proġetti tiegħi", + "Portfolio": "Portafoll", + "Project board": "Bord tal-proġett", + "Projects I am in": "Proġetti li nieħu sehem fihom", + "Timeline": "Linja taż-żmien", + "Timesheet": "Reġistru tal-ħin", + "Features & roadmap": "Funzjonijiet u pjan direzzjonali", + "Flow": "Fluss", + "Flows": "Flussi", + "Reports": "Rapporti", + "Pick a report to open it.": "Agħżel rapport biex tiftħu.", + "In progress": "Għaddej", + "Date": "Data", + "Due": "Skadenza", + "Assignee": "Assenjat lil", + "Who": "Min", + "What": "Xiex", + "Minutes": "Minuti", + "Entries": "Entrati", + "Most recent": "L-aktar reċenti", + "Per person": "Għal kull persuna", + "By status": "Skont l-istatus", + "By priority": "Skont il-prijorità", + "Task status": "Status tal-kompiti", + "Time spent": "Ħin li ntefaq", + "Capacity": "Kapaċità", + "Due soonest": "L-eqreb skadenza", + "Minutes logged": "Minuti rreġistrati", + "Nothing is due": "Xejn m'hu skadut", + "Nothing logged yet": "Xejn ma ġie rreġistrat s'issa", + "What is open, what is blocked, and what is overdue.": "X'inhu miftuħ, x'inhu mblukkat, u x'inhu tard.", + "How allocation is spread across the people working on projects.": "Kif it-tqassim huwa mifrux fost in-nies li jaħdmu fuq proġetti.", + "Hours logged, and the projects they went to.": "Is-sigħat irreġistrati u l-proġetti li marru fihom.", + "Billable": "Fatturabbli", + "Budget: {amount}": "Baġit: {amount}", + "Loading projects": "Qed jitgħabbew il-proġetti", + "No projects for this client yet": "Għad m'hemmx proġetti għal dan il-klijent", + "Open in Planninq": "Iftaħ fi Planninq", + "This project could not be found": "Dan il-proġett ma nstabx", + "Untitled project": "Proġett bla titlu", + "and {count} more": "u {count} oħra", + "Store": "Ħanut", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installa reġistri, skemi u flussi ppubblikati minn organizzazzjonijiet oħra.", + "Work Date": "Data tax-xogħol", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Azzjonijiet tal-kolonna", + "Columns": "Kolonni", + "Could not remove the column. Please try again.": "Il-kolonna ma setgħetx titneħħa. Erġa' pprova.", + "Could not save the column. Please try again.": "Il-kolonna ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "Done column": "Kolonna ta' lest", + "Edit column": "Editja l-kolonna", + "Keep the card's status": "Żomm l-istatus tal-karta", + "Move its cards to": "Mexxi l-karti tagħha għal", + "Move left": "Mexxi lejn ix-xellug", + "Move right": "Mexxi lejn il-lemin", + "Status of cards moved here": "L-istatus tal-karti mċaqalqa hawn", + "The last done column cannot be removed.": "L-aħħar kolonna ta' lest ma tistax titneħħa.", + "WIP limit": "Limitu WIP", + "over limit": "'il fuq mil-limitu", + "The status a card gets when it is moved into this column.": "L-istatus li tieħu karta meta titmexxa f'din il-kolonna.", + "All priorities": "Il-prijoritajiet kollha", + "Could not create the task. Please try again.": "Il-kompitu ma setax jinħoloq. Erġa' pprova.", + "Created": "Maħluq", + "Move to backlog": "Għall-backlog", + "Move to board": "Għall-bord", + "New task": "Kompitu ġdid", + "Nothing in the backlog": "Xejn fil-backlog", + "Rank": "Rank", + "Sort by": "Issortja skont", + "Sort by rank to reorder": "Issortja skont ir-rank biex terġa' tordna", + "Task actions": "Azzjonijiet tal-kompitu", + "All labels": "It-tikketti kollha", + "Filter tasks by label": "Iffiltra l-kompiti skont it-tikketta", + "View timeline": "Ara l-kronoloġija", + "Board": "Bord", + "List": "Lista", + "Column": "Kolonna", + "Board or list": "Bord jew lista", + "Log": "Log", + "Add entry": "Żid daħla", + "Show": "Uri", + "No actions yet": "Għad m'hemm l-ebda azzjoni", + "Closed": "Magħluq", + "Entry actions": "Azzjonijiet tad-daħla", + "Add action": "Żid azzjoni", + "by {author}": "minn {author}", + "saved {time}": "issejvjat {time}", + "Attendees: {names}": "Preżenti: {names}", + "Add the first entry": "Żid l-ewwel daħla", + "Issues": "Kwistjonijiet", + "Lessons learned": "Lezzjonijiet mitgħallma", + "Meetings": "Laqgħat", + "Decisions": "Deċiżjonijiet", + "Actions": "Azzjonijiet", + "Issue": "Kwistjoni", + "Lesson learned": "Lezzjoni mitgħallma", + "Meeting": "Laqgħa", + "Decision": "Deċiżjoni", + "About this project": "Dwar dan il-proġett", + "No description yet": "Għad m'hemmx deskrizzjoni", + "Start date": "Data tal-bidu", + "Not set": "Mhux issettjat", + "End date": "Data tat-tmiem", + "Progress": "Progress", + "No tasks yet": "Għad m'hemmx kompiti", + "Open the board": "Iftaħ il-bord", + "People": "Nies", + "Owner": "Sid", + "Latest log entries": "L-aħħar daħliet", + "Open the log": "Iftaħ il-log", + "{done} of {total} tasks done": "{done} minn {total} kompiti lesti", + "Edit entry": "Editja d-daħla", + "Type": "Tip", + "Attendees": "Preżenti", + "Issue is closed": "Il-kwistjoni hija magħluqa", + "Could not save the entry. Please try again.": "Id-daħla ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "From: {title}": "Minn: {title}", + "What needs to happen": "X'għandu jsir", + "Could not create the action. Please try again.": "L-azzjoni ma setgħetx tinħoloq. Erġa' pprova.", + "The action was created but could not be linked to the entry.": "L-azzjoni nħolqot iżda ma setgħetx tiġi marbuta mad-daħla.", + "Project pages": "Paġni tal-proġett", + "Overview": "Ħarsa ġenerali", + "Risks": "Riskji", + "Log entry": "Daħla tal-log", + "A short name for the entry": "Isem qasir għad-daħla", + "Project": "Proġett", + "The project this entry belongs to": "Il-proġett li għalih tappartjeni din id-daħla", + "What kind of entry this is": "X'tip ta' daħla hija", + "When it happened": "Meta ġara", + "What happened, in Markdown": "X'ġara, f'Markdown", + "Whether an issue is still open": "Jekk kwistjoni għadhiex miftuħa", + "The people at a meeting": "In-nies f'laqgħa", + "Tasks that came out of this entry": "Kompiti li ħarġu minn din id-daħla", + "Add risk": "Żid riskju", + "Risk": "Riskju", + "Score": "Punteġġ", + "Response": "Rispons", + "Review date": "Data tar-reviżjoni", + "no longer on the project": "m'għadux fil-proġett", + "Edit {title}": "Editja {title}", + "No risks recorded yet": "Għad ma ġie rreġistrat l-ebda riskju", + "Add the first risk": "Żid l-ewwel riskju", + "Medium": "Medju", + "Mitigating": "Qed jittaffa", + "Occurred": "Seħħ", + "Avoid": "Evita", + "Reduce": "Naqqas", + "Transfer": "Ittrasferixxi", + "Accept": "Aċċetta", + "Highest open risks": "L-ogħla riskji miftuħa", + "No open risks": "L-ebda riskju miftuħ", + "Open the risk register": "Iftaħ ir-reġistru tar-riskji", + "Edit risk": "Editja r-riskju", + "What could go wrong": "X'jista' jmur ħażin", + "Likelihood": "Probabbiltà", + "Impact": "Impatt", + "Score {score}": "Punteġġ {score}", + "Countermeasures": "Kontromiżuri", + "Could not save the risk. Please try again.": "Ir-riskju ma setax jiġi ssejvjat. Erġa' pprova.", + "Risks by likelihood and impact": "Riskji skont il-probabbiltà u l-impatt", + "Risk scale": "Skala tar-riskju", + "The levels every project scores its risks on, and where low turns into medium and high": "Il-livelli li fuqhom kull proġett jagħti punteġġ lir-riskji tiegħu, u fejn baxx isir medju u għoli", + "Number of levels": "Numru ta' livelli", + "Likelihood labels": "Tikketti tal-probabbiltà", + "Impact labels": "Tikketti tal-impatt", + "Level {level}": "Livell {level}", + "Medium from score": "Medju mill-punteġġ", + "High from score": "Għoli mill-punteġġ", + "Risk scale saved": "L-iskala tar-riskju ġiet issejvjata", + "1 risk uses level {level}. Change it first.": "Riskju 1 juża l-livell {level}. Ibdlu l-ewwel.", + "{count} risks use level {level}. Change them first.": "{count} riskji jużaw il-livell {level}. Ibdilhom l-ewwel.", + "Every level needs a label, and high must start above medium.": "Kull livell jeħtieġ tikketta, u għoli għandu jibda 'l fuq minn medju.", + "The project this risk belongs to": "Il-proġett li għalih jappartjeni dan ir-riskju", + "The cause and the effect, in Markdown": "Il-kawża u l-effett, f'Markdown", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Raggruppament liberu, bħal ippjanar, baġit jew fornitur", + "How likely it is, on the admin's risk scale": "Kemm hu probabbli, fuq l-iskala tar-riskju tal-amministratur", + "How hard it would hit, on the admin's risk scale": "Kemm jolqot ħażin, fuq l-iskala tar-riskju tal-amministratur", + "Likelihood times impact, calculated by the server": "Il-probabbiltà multiplikata bl-impatt, ikkalkulata mis-server", + "Where the risk stands": "Fejn jinsab ir-riskju", + "The person who watches this risk": "Il-persuna li ssegwi dan ir-riskju", + "How the project answers the risk": "Kif il-proġett jirrispondi għar-riskju", + "What is done to prevent it or soften it, in Markdown": "X'qed isir biex jiġi evitat jew imtaffi, f'Markdown", + "When to look at this risk again": "Meta għandu jerġa' jiġi rivedut dan ir-riskju", + "Very low": "Baxx ħafna", + "Very high": "Għoli ħafna", + "All projects": "Il-proġetti kollha", + "Project status report": "Rapport tal-istat tal-proġett", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Rapport iddatat dwar kif inhu proġett fil-flus, l-organizzazzjoni, il-ħin, l-informazzjoni, il-kwalità u r-riskju (l-aspetti GROTIK), kull wieħed b'nota.", + "The project this report is about": "Il-proġett li dwaru hu r-rapport", + "Report date": "Data tar-rapport", + "The day the report describes": "Il-jum li jiddeskrivi r-rapport", + "Money": "Flus", + "How the project stands on this aspect": "Kif inhu l-proġett f'dan l-aspett", + "On track": "Fit-triq it-tajba", + "At risk": "F'riskju", + "Off track": "Barra mit-triq", + "Money note": "Nota dwar il-flus", + "A short explanation of this status": "Spjegazzjoni qasira ta' dan l-istat", + "Organisation": "Organizzazzjoni", + "Organisation note": "Nota dwar l-organizzazzjoni", + "Time": "Ħin", + "Time note": "Nota dwar il-ħin", + "Information": "Informazzjoni", + "Information note": "Nota dwar l-informazzjoni", + "Quality": "Kwalità", + "Quality note": "Nota dwar il-kwalità", + "Risk note": "Nota dwar ir-riskju", + "Overall": "Ġenerali", + "The worst of the six statuses, calculated by the server": "L-agħar mis-sitt stati, ikkalkulat mis-server", + "Health: money": "Saħħa: flus", + "Copied from the newest status report": "Ikkupjat mill-aħħar rapport tal-istat", + "Health: organisation": "Saħħa: organizzazzjoni", + "Health: time": "Saħħa: ħin", + "Health: information": "Saħħa: informazzjoni", + "Health: quality": "Saħħa: kwalità", + "Health: risk": "Saħħa: riskju", + "Health: overall": "Saħħa: ġenerali", + "Health: report date": "Saħħa: data tar-rapport", + "The date of the newest status report": "Id-data tal-aħħar rapport tal-istat", + "New report": "Rapport ġdid", + "Only the project owner writes status reports.": "Is-sid tal-proġett biss jikteb rapporti tal-istat.", + "Latest report, {date}": "L-aħħar rapport, {date}", + "Aspect": "Aspett", + "Note": "Nota", + "Report history": "Storja tar-rapporti", + "Author": "Awtur", + "No status reports yet": "Għad m'hemm l-ebda rapport tal-istat", + "Write the first report": "Ikteb l-ewwel rapport", + "Choose a status for every aspect to save the report.": "Agħżel stat għal kull aspett biex tissejvja r-rapport.", + "Suggested: on track.": "Suġġeriment: fit-triq it-tajba.", + "Suggested: at risk.": "Suġġeriment: f'riskju.", + "Suggested: off track.": "Suġġeriment: barra mit-triq.", + "1 task is past its due date.": "1 kompitu għadda d-data tal-iskadenza.", + "{count} tasks are past their due date.": "Kompiti li għaddew id-data tal-iskadenza: {count}.", + "The end date has passed with 1 open task.": "Id-data tat-tmiem għaddiet b'1 kompitu miftuħ.", + "The end date has passed with {count} open tasks.": "Id-data tat-tmiem għaddiet, kompiti miftuħa: {count}.", + "No open task is past its due date.": "L-ebda kompitu miftuħ ma għadda d-data tal-iskadenza.", + "The highest open risk, \"{title}\", scores {score}.": "L-ogħla riskju miftuħ, \"{title}\", għandu punteġġ {score}.", + "There are no open risks.": "M'hemm l-ebda riskju miftuħ.", + "Costs are at {percent}% of the budget.": "L-ispejjeż huma {percent}% tal-baġit.", + "No suggestion: the project has no budget.": "L-ebda suġġeriment: il-proġett m'għandux baġit.", + "No suggestion: no costs are recorded for this project yet.": "L-ebda suġġeriment: għad m'hemm l-ebda spiża rreġistrata għal dan il-proġett.", + "The report was not saved. Only the project owner can write status reports.": "Ir-rapport ma ġiex issejvjat. Is-sid tal-proġett biss jista' jikteb rapporti tal-istat.", + "No report": "L-ebda rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Grupp ta' proġetti mmexxija mill-istess nies, bħal dipartiment jew programm. Il-maniġers tiegħu jaqraw kull proġett fih.", + "The name of the portfolio": "L-isem tal-portafoll", + "What the portfolio holds and who runs it": "X'fih il-portafoll u min imexxih", + "A colour for the portfolio's section in project lists": "Kulur għas-sezzjoni tal-portafoll fil-listi tal-proġetti", + "Managers": "Maniġers", + "Nextcloud user UIDs of the people who run the portfolio": "L-IDs tal-utenti ta' Nextcloud tan-nies li jmexxu l-portafoll", + "Order": "Ordni", + "Where the portfolio comes in project lists, lowest first": "Fejn jidher il-portafoll fil-listi tal-proġetti, l-iżgħar l-ewwel", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "L-iskala tar-riskju proprja ta' dan il-portafoll bħala JSON, fl-istess forma bħal dik tal-app kollha. Vojt ifisser l-iskala tal-app.", + "Portfolio readers": "Qarrejja tal-portafoll", + "Nextcloud user UIDs of the managers of the project's portfolio": "L-IDs tal-utenti ta' Nextcloud tal-maniġers tal-portafoll tal-proġett", + "The portfolio this project belongs to": "Il-portafoll li jappartjeni għalih dan il-proġett", + "No portfolio": "L-ebda portafoll", + "All portfolios": "Il-portafolli kollha", + "You read this project as a manager of its portfolio. Only its members change it.": "Qed taqra dan il-proġett bħala maniġer tal-portafoll tiegħu. Il-membri tiegħu biss ibiddluh.", + "Portfolios": "Portafolli", + "Portfolio status": "Status tal-portafoll", + "No portfolios yet": "Għad m'hemmx portafolli", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Amministratur iżid portafolli taħt Proġetti, Portafolli. Il-proġetti ta' portafoll huma elenkati hawn bl-istatus tagħhom.", + "Roll-up": "Sommarju", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} fil-binarju, {atRisk} f'riskju, {offTrack} barra mill-binarju, {noReport} mingħajr rapport", + "No project in this portfolio that you can read.": "L-ebda proġett f'dan il-portafoll li tista' taqra.", + "Start": "Bidu", + "End": "Tmiem", + "Budget": "Baġit", + "Last report": "L-aħħar rapport", + "Out of date": "Skadut", + "Portfolio timeline": "Kronoloġija tal-portafoll", + "Zoom": "Żum", + "Could not load the timeline": "Il-kronoloġija ma setgħetx titgħabba", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Amministratur iżid portafolli taħt Proġetti, Portafolli. Il-proġetti ta' portafoll jidhru hawn fuq kronoloġija waħda.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Iftaħ proġett biex tara l-fażijiet u l-kompiti tiegħu. Il-kronoloġija hija għall-qari biss.", + "Phase: {title}": "Fażi: {title}", + "Left out because you cannot read them: {count} projects": "Imħollija barra għax ma tistax taqrahom: {count} proġetti", + "Week": "Ġimgħa", + "Day": "Jum", + "Month": "Xahar", + "Please try again later.": "Erġa' pprova aktar tard.", + "Status reports": "Rapporti tal-istatus", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Wara kemm-il jum l-aħħar rapport tal-istatus ta' proġett jiġi mmarkat bħala skadut fil-ħarsa ġenerali tal-portafoll", + "Reporting period (days)": "Perjodu tar-rappurtar (jiem)", + "The reporting period is a whole number of days from 1 to 365.": "Il-perjodu tar-rappurtar huwa numru sħiħ ta' jiem minn 1 sa 365.", + "Reporting period saved": "Il-perjodu tar-rappurtar ġie ssejvjat", + "The reporting period was not saved. Please try again.": "Il-perjodu tar-rappurtar ma ġiex issejvjat. Erġa' pprova.", + "Every project of a portfolio with its status per aspect, rolled up.": "Kull proġett ta' portafoll bl-istatus tiegħu għal kull aspett, fil-qosor.", + "The projects of a portfolio on one timeline.": "Il-proġetti ta' portafoll fuq kronoloġija waħda.", + "Phases": "Fażijiet", + "Add phase": "Żid fażi", + "No phases yet": "Għad m'hemmx fażijiet", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Aqsam il-proġett f'fażijiet, bħal bidu, definizzjoni u twettiq. Fażi tingħalaq meta d-dokument tal-għeluq tagħha jittella'.", + "{hours} hours": "{hours} siegħa", + "Concluding document: {title}": "Dokument tal-għeluq: {title}", + "Concluding document missing": "Id-dokument tal-għeluq nieqes", + "Move {title} up": "Ċaqlaq {title} 'il fuq", + "Move {title} down": "Ċaqlaq {title} 'l isfel", + "Close phase": "Agħlaq il-fażi", + "Phase": "Fażi", + "Files": "Fajls", + "Notes": "Noti", + "Audit trail": "Traċċa tal-verifika", + "Edit phase": "Editja l-fażi", + "Name": "Isem", + "Budget hours": "Sigħat ibbaġitjati", + "Could not save the phase. Please try again.": "Il-fażi ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "Close phase {title}": "Agħlaq il-fażi {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Fażi tingħalaq bid-dokument tal-għeluq tagħha: tellgħu hawn jew agħżel wieħed mill-fajls tal-fażi.", + "Concluding document": "Dokument tal-għeluq", + "This phase has no files yet.": "Din il-fażi għad m'għandhiex fajls.", + "Upload a document": "Tella' dokument", + "The document was not uploaded. Please try again.": "Id-dokument ma tellax. Erġa' pprova.", + "Upload the concluding document before you close this phase.": "Tella' d-dokument tal-għeluq qabel tagħlaq din il-fażi.", + "This phase cannot be closed from its current status.": "Din il-fażi ma tistax tingħalaq mill-istatus attwali tagħha.", + "The phase was not closed. Please try again.": "Il-fażi ma ngħalqitx. Erġa' pprova.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "L-id tal-fajl f'din il-fażi li jagħlaqha. Il-fażi tista' titlesta biss meta jkun issettjat u l-fajl ikun mehmuż.", + "Import from Microsoft Project": "Importa minn Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Agħżel pjan issejvjat minn Microsoft Project f'format XML. Xejn ma jiġi importat qabel ma tikkonferma.", + "Plan file": "Fajl tal-pjan", + "What the import creates": "X'toħloq l-importazzjoni", + "Tasks": "Kompiti", + "Sub-tasks": "Sottokompiti", + "Milestones": "Stadji importanti", + "Links": "Links", + "Already imported, updated in place: {count}": "Diġà importati, aġġornati f'posthom: {count}", + "What does not carry over": "X'ma jgħaddix", + "Tasks with resources, which are not imported: {count}": "Kompiti b'riżorsi, li ma jiġux importati: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Kompiti aktar fil-fond mil-livell 3, imqiegħda taħt il-kompitu tagħhom tal-livell 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Links minbarra tmiem-għal-bidu, importati bħala links relatati: {count}", + "Link lags, which are dropped: {count}": "Dewmien fil-links, li jitwarrab: {count}", + "Links to a summary task, which are not imported: {count}": "Links ma' kompitu sommarju, li ma jiġux importati: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Links ma' kompiti barra dan il-pjan, li ma jiġux importati: {count}", + "No longer in the plan": "M'għadux fil-pjan", + "These stay in the project; remove them yourself if they are no longer needed.": "Dawn jibqgħu fil-proġett; neħħihom int jekk m'għadhomx meħtieġa.", + "Import": "Importa", + "Close": "Agħlaq", + "The plan is imported: {created} created, {updated} updated.": "Il-pjan ġie importat: {created} maħluqa, {updated} aġġornati.", + "Links that would close a loop were left out: {count}": "Il-links li jagħlqu ċirku tħallew barra: {count}", + "The import stopped part-way. Run it again to finish it.": "L-importazzjoni waqfet f'nofs triq. Erġa' ħaddimha biex tlestiha.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Issejvja l-pjan f'Microsoft Project b'File, Save as, format XML, u importa dak il-fajl.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Dan il-fajl jiddikjara DOCTYPE jew entitajiet, li mhumiex aċċettati.", + "The file is larger than 10 MB.": "Il-fajl huwa akbar minn 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Il-pjan għandu aktar minn 2,000 kompitu, aktar milli tieħu importazzjoni waħda.", + "This file is not a Microsoft Project plan in XML format.": "Dan il-fajl mhuwiex pjan ta' Microsoft Project f'format XML.", + "Choose a file to import.": "Agħżel fajl biex timporta.", + "Only the project owner can import a plan.": "Is-sid tal-proġett biss jista' jimporta pjan.", + "The plan could not be read. Please try again.": "Il-pjan ma setax jinqara. Erġa' pprova.", + "Linked case: {title}": "Każ marbut: {title}", + "Linked to a case": "Marbut ma' każ", + "Hand over to case": "Għaddi lill-każ", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Tikkopja mingħajr bidla kull fajl tal-proġett u tal-kompiti tiegħu, u fajl li jiddeskrivi l-proġett, lill-każ marbut.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Fajls ikkupjati: {count}", + "Files that failed: {names}": "Fajls li fallew: {names}", + "The handover failed. Please try again.": "L-għoti falla. Erġa' pprova.", + "The linked case could not be found, or you cannot open it.": "Il-każ marbut ma nstabx, jew ma tistax tiftħu.", + "Case handovers": "Għotjiet lill-każ", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Kull darba li l-fajls u l-metadata tal-proġett ingħataw lill-każ tiegħu: meta, minn min, lil liema każ, kull fajl ikkupjat bis-SHA-256 tiegħu, u l-fajls li fallew.", + "Finance": "Finanzi", + "Add cost line": "Żid linja tal-ispiża", + "Delivery terms": "Termini tal-kunsinna", + "Billing model": "Mudell tal-kontijiet", + "Budget in euro": "Baġit f'ewro", + "Budget in hours": "Baġit f'sigħat", + "Hourly rate in euro": "Rata fis-siegħa f'ewro", + "Planned start": "Bidu ppjanat", + "Planned end": "Tmiem ippjanat", + "Planned dates": "Dati ppjanati", + "Budget {amount}": "Baġit {amount}", + "No budget agreed": "L-ebda baġit miftiehem", + "Hours": "Sigħat", + "Only the project owner and the portfolio managers see the amounts.": "Is-sid tal-proġett u l-maniġers tal-portafoll biss jaraw l-ammonti.", + "Budget against cost per category": "Baġit kontra spejjeż skont il-kategorija", + "Labour (booked time)": "Xogħol (ħin irreġistrat)", + "No category": "L-ebda kategorija", + "Hours are not available": "Is-sigħat mhumiex disponibbli", + "Not yet assigned to a category": "Għadu mhux assenjat lil kategorija", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} minfuqa, {remaining} fadal", + "Budget against cost per phase": "Baġit kontra spejjeż skont il-fażi", + "No phase": "L-ebda fażi", + "Cost lines": "Linji tal-ispiża", + "From the finance system": "Mis-sistema finanzjarja", + "Edit cost line {amount}": "Editja l-linja tal-ispiża {amount}", + "No cost lines yet": "Għad m'hemm l-ebda linja tal-ispiża", + "Commitments": "Impenji", + "Actual cost": "Spiża attwali", + "Forecast": "Tbassir", + "Remaining": "Fadal", + "Not planned yet": "Għadu mhux ippjanat", + "{start} to {end}": "{start} sa {end}", + "The terms were not saved. Please try again.": "It-termini ma ġewx salvati. Erġa' pprova.", + "Terms saved": "Termini salvati", + "Fixed price": "Prezz fiss", + "Hourly": "Bis-siegħa", + "Not billed": "Mhux iffatturat", + "Commitment": "Impenn", + "Edit cost line": "Editja linja tal-ispiża", + "Kind": "Tip", + "Amount in euro": "Ammont f'ewro", + "Remove": "Neħħi", + "Could not save the cost line. Only the project owner changes the money of a project.": "Il-linja tal-ispiża ma setgħetx tiġi salvata. Is-sid tal-proġett biss ibiddel il-flus ta' proġett.", + "Could not remove the cost line. Please try again.": "Il-linja tal-ispiża ma setgħetx titneħħa. Erġa' pprova.", + "{amount} over budget": "{amount} 'il fuq mill-baġit", + "Cost categories": "Kategoriji tal-ispejjeż", + "The categories every project splits its budget and costs into, one per line": "Il-kategoriji li fihom kull proġett jaqsam il-baġit u l-ispejjeż tiegħu, waħda f'kull linja", + "Categories": "Kategoriji", + "Give at least one category, each name once.": "Agħti mill-inqas kategorija waħda, kull isem darba.", + "Cost categories saved": "Kategoriji tal-ispejjeż salvati", + "The cost categories were not saved. Please try again.": "Il-kategoriji tal-ispejjeż ma ġewx salvati. Erġa' pprova.", + "Finance line": "Linja finanzjarja", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Ammont wieħed ta' flus fuq proġett: baġit, impenn, spiża attwali jew tbassir, f'kategorija tal-ispejjeż u jekk trid f'fażi. Imdaħħal mis-sid tal-proġett, jew mibgħut mis-sistema finanzjarja permezz tal-app tal-integrazzjoni.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Il-proġett li jappartjeni għalih dan l-ammont. Vojt għal linja mis-sistema finanzjarja li n-numru tal-proġett tagħha ma jaqbel ma' l-ebda proġett.", + "The phase this amount belongs to, if any": "Il-fażi li jappartjeni għaliha dan l-ammont, jekk hemm", + "The cost category, one of the categories the admin set up": "Il-kategorija tal-ispejjeż, waħda mill-kategoriji li waqqaf l-amministratur", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Jekk l-ammont huwiex baġit, impenn, spiża attwali jew tbassir", + "Amount": "Ammont", + "The amount in the reporting currency (euro)": "L-ammont fil-munita tar-rappurtar (ewro)", + "The date the amount was booked or is expected": "Id-data li fiha l-ammont ġie rreġistrat jew hu mistenni", + "What the amount is for": "Għal xiex hu l-ammont", + "Whether a person entered the line or the finance system sent it": "Jekk persuna daħħlet il-linja jew is-sistema finanzjarja bagħtitha", + "Entered by hand": "Imdaħħal bl-idejn", + "Finance line id": "Id tal-linja finanzjarja", + "The finance system's own id of this line. One imported line per id.": "L-id proprju ta' din il-linja fis-sistema finanzjarja. Linja importata waħda għal kull id.", + "Project number": "Numru tal-proġett", + "The project number the finance system sent, matched against the project key": "In-numru tal-proġett li bagħtet is-sistema finanzjarja, imqabbel maċ-ċavetta tal-proġett", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Il-portafoll tal-proġett tal-linja, ikkupjat mill-proġett biex it-totali tal-portafoll ikollhom bżonn filtru wieħed", + "Finance readers": "Qarrejja tal-finanzi", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UIDs tal-utenti ta' Nextcloud tal-persuni li jistgħu jaraw dan l-ammont: is-sid tal-proġett u l-maniġers tal-portafoll tiegħu", + "Project owner": "Sid tal-proġett", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID tal-utent ta' Nextcloud tas-sid tal-proġett, li jista' jibdel u jneħħi linji manwali", + "How the client pays: not billed, a fixed price, or by the hour.": "Kif iħallas il-klijent: mhux iffatturat, prezz fiss jew bis-siegħa.", + "Portfolio finance": "Finanzi tal-portafoll", + "You cannot see the money of any project in this portfolio": "Ma tistax tara l-flus ta' l-ebda proġett f'dan il-portafoll", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Is-server bagħat linji tal-ispiża ta' proġetti barra dan il-portafoll, għalhekk dawn it-totali jistgħu jkunu żbaljati.", + "Projects left out because you cannot see their money: {count}": "Proġetti mħollija barra għax ma tistax tara flushom: {count}", + "Unmatched finance lines": "Linji finanzjarji mhux imqabbla", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Baġit, impenji, spiża attwali u tbassir miġbura għal portafoll.", + "Subprojects": "Sottoproġetti", + "{done} of {total}": "{done} minn {total}", + "{done} of {total} tasks done, including subprojects": "{done} minn {total} kompitu lesti, inklużi s-sottoproġetti", + "Show the subprojects of {title}": "Uri s-sottoproġetti ta' {title}", + "Hide the subprojects of {title}": "Aħbi s-sottoproġetti ta' {title}", + "Part of": "Parti minn", + "No parent project": "L-ebda proġett ġenitur", + "A project cannot sit under one of its own subprojects.": "Proġett ma jistax ikun taħt wieħed mis-sottoproġetti tiegħu stess.", + "Projects nest three levels deep at most: programme, project and subproject.": "Il-proġetti jitqiegħdu mhux aktar minn tliet livelli fil-fond: programm, proġett u sottoproġett.", + "Parent project": "Proġett ġenitur", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Il-proġett li taħtu jinsab dan il-proġett, bħal programm. Il-proġetti jitqiegħdu mhux aktar minn tliet livelli fil-fond.", + "Yes": "Iva", + "No": "Le", + "{label} (required)": "{label} (meħtieġ)", + "{label} is required": "{label} huwa meħtieġ", + "Project field": "Qasam tal-proġett", + "A field an admin adds to every project, such as a policy area or a contract value.": "Qasam li amministratur iżid ma' kull proġett, bħal qasam ta' politika jew valur ta' kuntratt.", + "Key": "Ċavetta", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "L-isem fiss li bih jinħażen il-valur, f'lower camel case. Żommu ladarba l-proġetti jużawh.", + "Label": "Tikketta", + "The name people see next to the field": "L-isem li n-nies jaraw ħdejn il-qasam", + "What the field holds": "X'fih il-qasam", + "Text": "Test", + "Number": "Numru", + "Choice": "Għażla", + "Person": "Persuna", + "Yes or no": "Iva jew le", + "Options": "Għażliet", + "The choices of a choice field": "L-għażliet ta' qasam tal-għażla", + "Required": "Meħtieġ", + "Whether a project must fill in the field": "Jekk proġett għandux jimla l-qasam", + "Where the field appears, lowest first": "Fejn jidher il-qasam, l-iżgħar l-ewwel", + "Applies to": "Japplika għal", + "What the field is added to": "Ma' xiex jiżdied il-qasam", + "Custom fields": "Oqsma proprji", + "The values of the project fields an admin defined, keyed by the field's key.": "Il-valuri tal-oqsma tal-proġett li ddefinixxa amministratur, skont iċ-ċavetta tal-qasam.", + "Project fields": "Oqsma tal-proġett", + "Related": "Relatati", + "Remove link": "Neħħi l-link", + "Link type": "Tip ta' link", + "Relates to": "Relatat ma'", + "Duplicates": "Jidduplika", + "Project key": "Iċ-ċavetta tal-proġett", + "Every task number starts with it, such as VERG-42.": "Kull numru tal-kompitu jibda biha, pereżempju VERG-42.", + "This key is already used by another project.": "Din iċ-ċavetta diġà qed jużaha proġett ieħor.", + "Use 2 to 10 letters and digits, starting with a letter.": "Uża minn 2 sa 10 ittri u ċifri, li jibdew b’ittra.", + "The key cannot change once tasks carry it.": "Iċ-ċavetta ma tistax tinbidel ladarba kompiti jġorruha.", + "Project saved. The existing tasks get their numbers in the background.": "Il-proġett ġie ssejvjat. Il-kompiti eżistenti jiksbu n-numri tagħhom fl-isfond.", + "Next task number": "In-numru tal-kompitu li jmiss", + "The number the next task of this project gets in its key. Only the system writes it.": "In-numru li l-kompitu li jmiss ta’ dan il-proġett jieħu fiċ-ċavetta tiegħu. Is-sistema biss tiktbu.", + "Restore {title}": "Irrestawra {title}", + "Restore": "Irrestawra", + "Project restored": "Il-proġett ġie rrestawrat", + "Could not restore the project": "Il-proġett ma setax jiġi rrestawrat", + "Bring this project back to the active list.": "Ġib dan il-proġett lura fil-lista tal-proġetti attivi.", + "Restore project": "Irrestawra l-proġett", + "Request reason": "Ir-raġuni tat-talba", + "Why the requester needs this project. Filled in when the project is requested.": "Għaliex min jagħmel it-talba għandu bżonn dan il-proġett. Jimtela mat-talba.", + "Reviewed by": "Rieżaminat minn", + "The user who approved or rejected the request.": "L-utent li approva jew ċaħad it-talba.", + "Reviewed at": "Rieżaminat fi", + "When the request was approved or rejected.": "Meta t-talba ġiet approvata jew miċħuda.", + "Review note": "Nota tar-rieżami", + "The reviewer's reason, shown to the requester when a request is not approved.": "Ir-raġuni ta’ min irrieżamina, li jara min għamel it-talba meta talba ma tiġix approvata.", + "Members of these groups": "Membri ta’ dawn il-gruppi", + "Groups that may create projects": "Gruppi li jistgħu joħolqu proġetti", + "The group {group} no longer exists. Save to remove it.": "Il-grupp {group} m’għadux jeżisti. Issejvja biex tneħħih.", + "Review project request": "Irrieżamina t-talba għal proġett", + "Requested by": "Mitlub minn", + "Why it is needed": "Għaliex hu meħtieġ", + "Desired start date": "Data tal-bidu mixtieqa", + "Why is it not approved?": "Għaliex mhux approvat?", + "Give a reason. The requester sees it.": "Agħti raġuni. Min għamel it-talba jaraha.", + "Approve": "Approva", + "Reject": "Iċħad", + "Reject request": "Iċħad it-talba", + "The review was not saved. Try again.": "Ir-rieżami ma ġiex issejvjat. Erġa’ pprova.", + "This project is waiting for review": "Dan il-proġett qed jistenna r-rieżami", + "This request was not approved": "Din it-talba ma ġietx approvata", + "Reason: {note}": "Raġuni: {note}", + "Review request": "Irrieżamina t-talba", + "Request a project": "Itlob proġett", + "Step {step} of 2": "Pass {step} minn 2", + "Why is this project needed?": "Għaliex hemm bżonn dan il-proġett?", + "Give a reason. The reviewer reads it.": "Agħti raġuni. Ir-rieżaminatur jaqraha.", + "Back": "Lura", + "Next": "Li jmiss", + "Send request": "Ibgħat it-talba", + "The request was not sent. Try again.": "It-talba ma ntbagħtitx. Erġa’ pprova.", + "Requested": "Mitlub", + "Not approved": "Mhux approvat", + "Your request was sent": "It-talba tiegħek intbagħtet", + "Let everyone else request a project": "Ħalli lil kulħadd ieħor jitlob proġett", + "Add a task": "Żid kompitu", + "Delete task": "Ħassar il-kompitu", + "Edit task": "Editja l-kompitu", + "Write": "Ikteb", + "Preview": "Dehra minn qabel", + "Markdown works here: headings, lists and links.": "Il-Markdown jaħdem hawn: intestaturi, listi u links.", + "Could not save the task. Please try again.": "Il-kompitu ma setax jiġi ssejvjat. Erġa' pprova.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Fuq \"{title}\" hemm ħin irreġistrat, għalhekk ma jistax jitħassar. Minflok tista' tikkanċellah: ir-reġistrazzjonijiet tal-ħin jibqgħu.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Tħassar \"{title}\"? Il-links tiegħu ma' kompiti oħra jitneħħew ukoll. Dan ma jistax jitreġġa' lura.", + "Keep task": "Żomm il-kompitu", + "Cancel task": "Ikkanċella l-kompitu", + "Only the reporter, the project owner or an admin can delete this task.": "Dan il-kompitu jista' jħassru biss min irrappurtah, is-sid tal-proġett jew amministratur.", + "Could not delete the task. Please try again.": "Il-kompitu ma setax jitħassar. Erġa' pprova.", + "Could not cancel the task. Please try again.": "Il-kompitu ma setax jiġi kkanċellat. Erġa' pprova.", + "Responsible": "Responsabbli", + "Also working on this": "Qed jaħdmu fuqu wkoll", + "Labels": "Tikketti", + "Could not change the priority. Please try again.": "Il-prijorità ma setgħetx tinbidel. Erġa' pprova.", + "Other project members who work on this task alongside the person responsible.": "Membri oħra tal-proġett li qed jaħdmu fuq dan il-kompitu flimkien mar-responsabbli.", + "Duplicate": "Iddoppja", + "Could not copy the task. Please try again.": "Il-kompitu ma setax jiġi kkupjat. Erġa' pprova.", + "Subtasks": "Sottokompiti", + "{done} of {total} done": "{done} minn {total} lesti", + "Add a subtask": "Żid sottokompitu", + "Checklist": "Lista ta' kontroll", + "Checklist item actions": "Azzjonijiet tal-oġġett tal-lista", + "Add a checklist item": "Żid oġġett fil-lista", + "Subtasks: {estimate} estimated, {logged} logged": "Sottokompiti: {estimate} stmati, {logged} irreġistrati", + "Total estimate: {total}": "Stima totali: {total}", + "Part of {title}": "Parti minn {title}", + "Checklist: {count} done": "Lista ta' kontroll: {count} lesti", + "This task has subtasks: {count}.": "Dan il-kompitu għandu sottokompiti: {count}.", + "Keep subtasks as separate tasks": "Żomm is-sottokompiti bħala kompiti separati", + "Delete subtasks too": "Ħassar is-sottokompiti wkoll", + "Copy of {title}": "Kopja ta' {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Il-kompitu ġie kkupjat, iżda mhux is-sottokompiti kollha tiegħu. Iċċekkja l-kopja.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Passi żgħar fi ħdan il-kompitu. Kull oġġett għandu id, test u jekk huwiex lest.", + "Open work per person and per project.": "Xogħol miftuħ skont il-persuna u l-proġett.", + "View": "Veduta", + "By person": "Skont il-persuna", + "By project": "Skont il-proġett", + "Hours left": "Sigħat li fadal", + "Tasks without an estimate": "Kompiti mingħajr stima", + "Due in 14 days": "Dovuti fi żmien 14-il jum", + "Shared": "Maqsuma", + "Unassigned": "Mhux assenjati", + "{hours} h": "{hours} s", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Jintwera x-xogħol fil-proġetti li tista' tara. Is-sigħat jgħoddu għall-persuna responsabbli; il-kompiti maqsuma jingħaddu mingħajr sigħat.", + "No open work in these projects.": "M'hemm l-ebda xogħol miftuħ f'dawn il-proġetti.", + "Open work": "Xogħol miftuħ", + "{count} open tasks": "{count} kompiti miftuħa", + "Create a project to see capacity here.": "Oħloq proġett biex tara l-kapaċità hawn.", + "My tasks": "Il-kompiti tiegħi", + "Show all my tasks": "Uri l-kompiti kollha tiegħi", + "No tasks assigned to you": "M'għandek l-ebda kompitu assenjat", + "Browse projects": "Esplora l-proġetti", + "Later": "Aktar tard", + "Due {date}": "Dovut {date}", + "Could not change the status. Please try again.": "L-istatus ma setax jinbidel. Erġa' pprova.", + "Completed today": "Lesti llum", + "My open tasks": "Il-kompiti miftuħa tiegħi", + "My overdue tasks": "Il-kompiti tardivi tiegħi", + "My tasks in progress": "Il-kompiti tiegħi għaddejjin", + "Pin to the top": "Waħħal fuq nett", + "Unpin": "Neħħi l-waħħil", + "Pinned": "Imwaħħal", + "Actions for {title}": "Azzjonijiet għal {title}", + "Could not save your project order. Please try again.": "L-ordni tal-proġetti tiegħek ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "No boards yet": "Għad m'hemmx bordijiet", + "Create a project to get a board.": "Oħloq proġett biex ikollok bord.", + "Use the Projects page to create and manage your projects and tasks.": "Uża l-paġna Proġetti biex toħloq u timmaniġġja l-proġetti u l-kompiti tiegħek.", + "Go to projects": "Mur għall-proġetti", + "You are not a member of any projects yet.": "Għadek m'intix membru ta' ebda proġett.", + "Could not search for users. Please try again.": "Ma setgħux jiġu mfittxija utenti. Erġa' pprova.", + "Project creation is restricted to administrators.": "Il-ħolqien tal-proġetti huwa riżervat għall-amministraturi.", + "Only the project owner or an administrator can delete this project.": "Is-sid tal-proġett jew amministratur biss jista' jħassar dan il-proġett.", + "No projects are available to you yet. Ask an administrator to create one.": "Għad m'hemmx proġetti disponibbli għalik. Staqsi lil amministratur biex joħloq wieħed.", + "Due: {date}": "Dovut: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Il-kompiti b'data tal-bidu jew data dovuta jidhru fuq il-kronoloġija. Żid id-dati biex tarahom hawn.", + "You do not have access to this project.": "M'għandekx aċċess għal dan il-proġett.", + "Zoom level": "Livell ta' zoom", + "Unscheduled": "Mhux skedati", + "Start: {date}": "Bidu: {date}", + "Today": "Illum", + "No scheduled tasks": "L-ebda kompitu skedat", + "An unexpected error occurred.": "Seħħ żball mhux mistenni.", + "Column {number} name": "Isem il-kolonna {number}", + "Failed to save creation policy": "Ir-regola tal-ħolqien ma setgħetx tiġi ssejvjata", + "All authenticated users": "L-utenti awtentikati kollha", + "Control who may create new projects": "Ikkontrolla min jista' joħloq proġetti ġodda", + "Administrators only": "Amministraturi biss", + "Project creation": "Ħolqien tal-proġetti", + "Allow project creation": "Ippermetti l-ħolqien tal-proġetti", + "Creation policy saved successfully": "Ir-regola tal-ħolqien ġiet issejvjata", + "Initializing…": "Qed jibda…", + "e.g. 2h 30m, 90m, 1.5h": "eż. 2h 30m, 90m, 1.5h", + "Log time": "Irreġistra l-ħin", + "Save estimate": "Issejvja l-istima", + "Logged: {logged}": "Irreġistrat: {logged}", + "over by {amount}": "qabeż b'{amount}", + "Time tracking": "Traċċar tal-ħin", + "Estimate": "Stima", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Daħħal stima valida (eż. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Daħħal tul validu (eż. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Ir-reġistrazzjoni tal-ħin ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "Edit time entry": "Editja r-reġistrazzjoni tal-ħin", + "Duration": "Tul", + "Date range": "Firxa ta' dati", + "Last week": "Il-ġimgħa li għaddiet", + "No time logged": "L-ebda ħin irreġistrat", + "Log time on a task to see it here.": "Irreġistra ħin fuq kompitu biex tarah hawn.", + "To date": "Sad-data", + "This week": "Din il-ġimgħa", + "Total: {total}": "Total: {total}", + "From date": "Mid-data", + "Custom range": "Firxa personalizzata", + "All time": "Il-ħin kollu", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Kompitu ma setax jitħassar, għalhekk jista' jkun għad fadal data. Erġa' ħassar il-proġett.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Reġistrazzjoni tal-ħin ma setgħetx titħassar, għalhekk jista' jkun għad fadal data. Erġa' ħassar il-proġett.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Kolonna ma setgħetx titħassar, għalhekk jista' jkun għad fadal data. Erġa' ħassar il-proġett.", + "Could not delete the project. Please try again.": "Il-proġett ma setax jitħassar. Erġa' pprova.", + "Notification settings": "Settings tan-notifiki", + "Configure when due-date reminders are sent": "Issettja meta jintbagħtu t-tfakkiriet tad-data dovuta", + "Due-date reminder lead time (hours)": "Ħin qabel it-tfakkira (sigħat)", + "Lead time must be between 1 and 336 hours": "Il-ħin irid ikun bejn 1 u 336 siegħa", + "Reminder lead time saved successfully": "Il-ħin tat-tfakkira ġie ssejvjat", + "Failed to save reminder lead time": "Il-ħin tat-tfakkira ma setax jiġi ssejvjat", + "Notifications": "Notifiki", + "Notify me 1 day before a task's due date": "Innotifikani jum qabel id-data dovuta ta' kompitu", + "Draft": "Abbozz", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Jekk il-lezzjoni hijiex abbozz li jarah l-għalliem tagħha biss, issirx jew hijiex ikkanċellata.", + "New release": "Rilaxx ġdid", + "Roadmap chart. The same releases and epics are listed below.": "Grafika tal-pjan direzzjonali. L-istess rilaxxi u epiki huma elenkati hawn taħt.", + "Nothing on the roadmap yet": "Għad m'hemm xejn fuq il-pjan direzzjonali", + "Releases with a target date and epics with dated tasks appear here.": "Hawn jidhru r-rilaxxi b'data mmirata u l-epiki b'kompiti datati.", + "Releases": "Rilaxxi", + "No releases yet": "Għad m'hemm l-ebda rilaxx", + "Target date: {date}": "Data mmirata: {date}", + "No target date": "L-ebda data mmirata", + "Edit {name}": "Editja {name}", + "Mark {name} as released": "Immarka {name} bħala rilaxxat", + "Mark as released": "Immarka bħala rilaxxat", + "Epics": "Epiki", + "No epics yet. Open a task to make it an epic.": "Għad m'hemm l-ebda epiku. Iftaħ kompitu biex tagħmlu epiku.", + "Not scheduled yet": "Għadu mhux skedat", + "Planned": "Ippjanat", + "Released": "Rilaxxat", + "Edit release": "Editja r-rilaxx", + "Target date": "Data mmirata", + "Could not save the release. Please try again.": "Ir-rilaxx ma setax jiġi ssejvjat. Erġa' pprova.", + "Every task of this release is done or cancelled.": "Kull kompitu ta' dan ir-rilaxx lest jew ikkanċellat.", + "Not finished yet: {count}": "Għadhom mhux lesti: {count}", + "What happens to these tasks?": "X'jiġri minn dawn il-kompiti?", + "Move to {name}": "Mexxi għal {name}", + "Remove the release": "Neħħi r-rilaxx", + "Keep it on {name}": "Ħallihom fuq {name}", + "Could not mark the release as released. Please try again.": "Ir-rilaxx ma setax jiġi mmarkat bħala rilaxxat. Erġa' pprova.", + "Roadmap": "Pjan direzzjonali", + "Tasks or roadmap": "Kompiti jew pjan direzzjonali", + "Release": "Rilaxx", + "Epic": "Epiku", + "This task is an epic": "Dan il-kompitu huwa epiku", + "A named, dated delivery of a project that its tasks are planned against.": "Kunsinna ta' proġett b'isem u data, li kontriha jiġu ppjanati l-kompiti tiegħu.", + "Name of the release": "Isem ir-rilaxx", + "The project this release belongs to": "Il-proġett li jappartjeni għalih dan ir-rilaxx", + "What this release delivers": "X'jikkunsinna dan ir-rilaxx", + "When work on the release starts": "Meta jibda x-xogħol fuq ir-rilaxx", + "The date the release is due": "Id-data li fiha r-rilaxx huwa dovut", + "Whether the release is planned, released or archived": "Jekk ir-rilaxx huwiex ippjanat, rilaxxat jew arkivjat", + "Released on": "Rilaxxat fi", + "When the release was marked as released": "Meta r-rilaxx ġie mmarkat bħala rilaxxat", + "The release this task is planned for": "Ir-rilaxx li għalih huwa ppjanat dan il-kompitu", + "Board view options": "Għażliet tal-wiri tal-bord", + "Colour cards": "Ikkulura l-kards", + "No colour": "L-ebda kulur", + "By label": "Skont it-tikketta", + "Swimlanes": "Korsiji", + "No swimlanes": "L-ebda korsija", + "By assignee": "Skont l-assenjat", + "By epic": "Skont l-epic", + "No assignee": "Mhux assenjat", + "No epic": "L-ebda epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Il-kards jibqgħu fir-ringiela tal-epic tagħhom. Ibdel l-epic fil-paġna tal-kompitu.", + "Hand over to": "Għaddi lil", + "Could not save your board view. It applies until you reload.": "Il-wiri tal-bord ma ġiex issejvjat. Japplika sakemm terġa' ttella' l-paġna.", + "Timetable wish": "Xewqa tal-orarju", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Xewqa li l-ġeneratur iqis. Xewqa iebsa dejjem iżommha, u xewqa flessibbli fejn jista'.", + "Whether the wish is about a teacher, a group, a room or one activity": "Jekk ix-xewqa hijiex dwar għalliem, grupp, kamra jew attività", + "Teacher": "Għalliem", + "Group": "Grupp", + "Reference": "Referenza", + "The user, group, room or activity the wish is about": "L-utent, il-grupp, il-kamra jew l-attività li tikkonċerna x-xewqa", + "What the wish asks for": "X'titlob ix-xewqa", + "Not on these periods": "Mhux f'dawn il-perjodi", + "Preferably not on these periods": "Preferibbilment mhux f'dawn il-perjodi", + "At most a number of lessons a day": "L-aktar numru ta' lezzjonijiet kuljum", + "No free periods between lessons": "Ebda perjodu vojt bejn il-lezzjonijiet", + "Always the same room": "Dejjem l-istess kamra", + "Periods": "Perjodi", + "The periods of the week the wish is about, such as wed-5": "Il-perjodi tal-ġimgħa li tikkonċerna x-xewqa, bħal wed-5", + "Limit": "Limitu", + "The most lessons a day, for a wish of that kind": "L-aktar lezzjonijiet kuljum, għal xewqa ta' dak it-tip", + "Strength": "Saħħa", + "Whether the generator must keep the wish or should keep it": "Jekk il-ġeneratur għandux bilfors jew għandux iżomm ix-xewqa", + "Hard": "Iebsa", + "Soft": "Flessibbli", + "Weight": "Piż", + "How much a soft wish counts, from 1 to 3": "Kemm tgħodd xewqa flessibbli, minn 1 sa 3", + "Why the wish exists": "Għaliex teżisti x-xewqa", + "Timetable scenario": "Xenarju tal-orarju", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Mudell ta' ġimgħa waħda, magħmul mill-ġeneratur jew meħud mill-orarju attwali. Iżomm l-input tiegħu u kemm iżomm tajjeb ix-xewqat.", + "The name timetablers know the scenario by": "L-isem li bih dawk li jagħmlu l-orarju jafu x-xenarju", + "Whether the generator made it or it came from the current timetable": "Jekk għamlux il-ġeneratur jew ġiex mill-orarju attwali", + "Generated": "Iġġenerat", + "From the current timetable": "Mill-orarju attwali", + "Week of": "Ġimgħa tal-", + "The Monday of the first week of the window": "It-Tnejn tal-ewwel ġimgħa tal-perjodu", + "Window start": "Bidu tal-perjodu", + "The first day the week pattern applies to": "L-ewwel jum li fih japplika l-mudell tal-ġimgħa", + "Window end": "Tmiem tal-perjodu", + "The last day the week pattern applies to": "L-aħħar jum li fih japplika l-mudell tal-ġimgħa", + "Waiting, generating, done, failed, or published as draft lessons": "Qed jistenna, qed jiġi ġġenerat, lest, falla jew ippubblikat bħala lezzjonijiet abbozz", + "Waiting": "Qed jistenna", + "Generating": "Qed jiġi ġġenerat", + "Failed": "Falla", + "Published": "Ippubblikat", + "Seed": "Żerriegħa", + "The number the generator starts from, so a run can be repeated": "In-numru li bih jibda l-ġeneratur, biex ġirja tkun tista' tiġi ripetuta", + "Input": "Input", + "The periods, rooms, lessons and wishes the scenario was made from": "Il-perjodi, il-kmamar, il-lezzjonijiet u x-xewqat li minnhom sar ix-xenarju", + "Placements": "Postijiet", + "Each lesson with the period and room it was given": "Kull lezzjoni bil-perjodu u l-kamra li ngħatat", + "Unplaced lessons": "Lezzjonijiet mingħajr post", + "Lessons without a place, each with the hard wish that blocked it": "Lezzjonijiet mingħajr post, kull waħda bix-xewqa iebsa li waqqfitha", + "Broken wishes": "Xewqat miksura", + "The wishes this scenario breaks, with the lessons that break them": "Ix-xewqat li dan ix-xenarju jikser, bil-lezzjonijiet li jiksruhom", + "Measures": "Kejl", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Lezzjonijiet imqiegħda, xewqat miksura, perjodi vojta tal-għalliema, lezzjonijiet kuljum u użu tal-kmamar", + "Reason": "Raġuni", + "Why the run failed": "Għaliex falliet il-ġirja", + "Published at": "Ippubblikat fi", + "When the scenario was written out as draft lessons": "Meta x-xenarju nkiteb bħala lezzjonijiet abbozz", + "Edit wish": "Editja x-xewqa", + "New wish": "Xewqa ġdida", + "Hard: the generator always keeps it": "Iebsa: il-ġeneratur dejjem iżommha", + "Soft: the generator keeps it where it can": "Ratba: il-ġeneratur iżommha fejn jista'", + "Weight (1 to 3)": "Piż (minn 1 sa 3)", + "Most lessons a day": "L-akbar numru ta' lezzjonijiet kuljum", + "Period": "Perjodu", + "{day} period {number}": "{day} perjodu {number}", + "Teacher (user name)": "Għalliem (isem tal-utent)", + "Activity (group:subject)": "Attività (grupp:suġġett)", + "Say who or what the wish is about.": "Għid dwar min jew dwar xiex hi x-xewqa.", + "Choose at least one period.": "Agħżel mill-inqas perjodu wieħed.", + "The limit is a whole number of 1 or more.": "Il-limitu huwa numru sħiħ ta' 1 jew aktar.", + "Timetable": "Orarju", + "Wishes": "Xewqat", + "Timetable wishes": "Xewqat għall-orarju", + "Generator run": "Tħaddim tal-ġeneratur", + "Generator progress": "Progress tal-ġeneratur", + "The run failed: {reason}": "It-tħaddim falla: {reason}", + "{placed} of {lessons} lessons placed": "{placed} minn {lessons} lezzjonijiet imqiegħda", + "Generate again": "Iġġenera mill-ġdid", + "Generate": "Iġġenera", + "Every lesson has a place.": "Kull lezzjoni għandha post.", + "Lesson": "Lezzjoni", + "No free period and room": "L-ebda perjodu u kamra ħielsa", + "Broken soft wishes": "Xewqat ratba miksura", + "Every soft wish is kept.": "Kull xewqa ratba hi miżmuma.", + "Wish": "Xewqa", + "Lessons": "Lezzjonijiet", + "Generating: {percent}% of the time budget used": "Qed jiġġenera: intuża {percent}% tal-ħin", + "Waiting to start": "Qed jistenna biex jibda", + "Published as draft lessons": "Ippubblikat bħala lezzjonijiet abbozz", + "Could not read the scenario.": "Ma setax jinqara x-xenarju.", + "Could not start the run.": "Ma setax jibda t-tħaddim.", + "Scenarios": "Xenarji", + "Timetable scenarios": "Xenarji tal-orarju", + "Scenario": "Xenarju", + "Take the current timetable": "Ħu l-orarju attwali", + "Could not take the current timetable.": "Ma setax jittieħed l-orarju attwali.", + "Broken hard wishes": "Xewqat obbligatorji miksura", + "Not on a period of the week grid": "Mhux f'lezzjoni tal-grilja tal-ġimgħa", + "Compare scenarios": "Qabbel ix-xenarji", + "Scenarios to compare": "Xenarji biex jitqabblu", + "Choose two or three scenarios to compare them.": "Agħżel żewġ jew tliet xenarji biex tqabbilhom.", + "Measure": "Kejl", + "Best": "L-aħjar", + "Lessons that differ": "Lezzjonijiet li jvarjaw", + "No lesson differs.": "L-ebda lezzjoni ma tvarja.", + "Not placed": "Mhux imqiegħda", + "{period} in {room}": "{period} f'{room}", + "Lessons placed": "Lezzjonijiet imqiegħda", + "Lessons without a place": "Lezzjonijiet mingħajr post", + "Clashes": "Kunflitti", + "Hard wishes broken": "Xewqat iebsa miksura", + "Soft wishes broken": "Xewqat ratba miksura", + "Soft wishes broken, weighted": "Xewqat ratba miksura, peżati", + "Free periods between lessons, all teachers": "Perjodi ħielsa, l-għalliema kollha", + "Most free periods of one teacher": "L-aktar perjodi ħielsa ta' għalliem wieħed", + "Most lessons of one group on a day": "L-aktar lezzjonijiet ta' grupp wieħed f'ġurnata", + "Room use": "Użu tal-kmamar", + "Publish as draft lessons": "Ippubblika bħala lezzjonijiet abbozz", + "Draft lessons written: {count}": "Lezzjonijiet abbozz miktuba: {count}", + "Could not publish the scenario.": "Ix-xenarju ma setax jiġi ppubblikat.", + "Rules": "Regoli", + "Rules for {column}": "Regoli għal {column}", + "When a card enters this column": "Meta karta tidħol f'din il-kolonna", + "Action": "Azzjoni", + "Set the priority": "Issettja l-prijorità", + "Assign to": "Assenja lil", + "Assign the person who moved the card": "Assenja lill-persuna li ċċaqilqet il-karta", + "Remove the assignee": "Neħħi l-assenjat", + "Add a label": "Żid tikketta", + "No longer a project member": "M'għadux membru tal-proġett", + "This label no longer exists": "Din it-tikketta m'għadhiex teżisti", + "Add rule": "Żid regola", + "Remove rule": "Neħħi regola", + "No rules yet. Add one to change a card when it enters this column.": "Għad m'hemmx regoli. Żid waħda biex tbiddel karta meta tidħol f'din il-kolonna.", + "Could not save the rules. Please try again.": "Ir-regoli ma setgħux jiġu ssejvjati. Erġa' pprova.", + "1 rule runs when a card enters this column": "Regola 1 taħdem meta karta tidħol f'din il-kolonna", + "{count} rules run when a card enters this column": "{count} regoli jaħdmu meta karta tidħol f'din il-kolonna", + "Rules applied: {changes}": "Regoli applikati: {changes}", + "assigned to {name}": "assenjata lil {name}", + "assignee removed": "assenjat imneħħi", + "priority {priority}": "prijorità {priority}", + "label {label}": "tikketta {label}", + "What happens to a card when it enters this column, applied in list order.": "X'jiġri minn karta meta tidħol f'din il-kolonna, fl-ordni tal-lista.", + "Value": "Valur", + "What the rule does to the card.": "X'tagħmel ir-regola lill-karta.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Il-prijorità, l-id tal-utent jew l-id tat-tikketta li tuża l-azzjoni; vojt għal azzjonijiet mingħajr valur.", + "is not": "mhux", + "{dimension} is not": "{dimension} mhux", + "Saved filters": "Filtri ssejvjati", + "No saved filters yet": "Għad m'hemmx filtri ssejvjati", + "Save filter": "Issejvja l-filtru", + "Rename \"{name}\"": "Ibdel l-isem ta' \"{name}\"", + "Delete \"{name}\"": "Ħassar \"{name}\"", + "Clear filters": "Neħħi l-filtri", + "Showing {shown} of {total} tasks": "Qed jintwerew {shown} minn {total} kompitu", + "Me": "Jien", + "No date": "L-ebda data", + "Rename saved filter": "Ibdel l-isem tal-filtru ssejvjat", + "Share with the project": "Aqsam mal-proġett", + "Give the filter a name": "Agħti isem lill-filtru", + "Could not save the filter. Please try again.": "Il-filtru ma setax jiġi ssejvjat. Erġa' pprova.", + "Some labels in \"{name}\" no longer exist and were left out.": "Xi tikketti f'\"{name}\" m'għadhomx jeżistu u tħallew barra.", + "Could not delete the filter. Please try again.": "Il-filtru ma setax jitħassar. Erġa' pprova.", + "Saved filter": "Filtru ssejvjat", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Filtru tal-bord b'isem ta' proġett wieħed, privat għal min issejvjah sakemm ma jinqasamx mal-proġett.", + "The project whose board the filter applies to": "Il-proġett li l-filtru japplika għall-bord tiegħu", + "The name the filter is listed under": "L-isem li bih jidher il-filtru fil-lista", + "Saved by": "Issejvjat minn", + "Nextcloud user id of the person who saved the filter": "L-id tal-utent Nextcloud ta' min issejvja l-filtru", + "Shared with the project": "Maqsum mal-proġett", + "Whether every project member sees and applies the filter": "Jekk kull membru tal-proġett jarax u jistax japplika l-filtru", + "Criteria": "Kriterji", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Il-filtru: assenjat, tikketta, prijorità u data tal-iskadenza, kull wieħed b'huwa jew mhux u l-valuri tiegħu", + "Cross-project view": "Veduta bejn proġetti", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Għażla ssejvjata ta' proġetti li l-kompiti tagħhom jintwerew flimkien f'korsiji tal-istatus, maqsuma man-nies li ssemmi.", + "Shared with": "Maqsuma ma'", + "The name the view is listed under": "L-isem li taħtu titniżżel il-veduta", + "Nextcloud user id of the person who saved the view": "L-id tal-utent ta' Nextcloud tal-persuna li ssejvjat il-veduta", + "Nextcloud user ids of the people the view is shared with": "L-ids tal-utenti ta' Nextcloud tan-nies li magħhom hi maqsuma l-veduta", + "The projects whose tasks the view shows, at most twenty": "Il-proġetti li l-kompiti tagħhom turi l-veduta, mhux aktar minn għoxrin", + "1 project in this view is hidden from you.": "Proġett 1 f'din il-veduta huwa moħbi minnek.", + "{count} projects in this view are hidden from you.": "Proġetti f'din il-veduta moħbija minnek: {count}.", + "{project} has no column for {status}.": "{project} m'għandux kolonna għal {status}.", + "This view does not exist or is not shared with you.": "Din il-veduta ma teżistix jew mhijiex maqsuma miegħek.", + "\"{task}\" moved to {status}.": "\"{task}\" ġie mċaqlaq għal {status}.", + "Project: {title}": "Proġett: {title}", + "Cross-project views": "Vedute bejn proġetti", + "New view": "Veduta ġdida", + "Edit view": "Editja l-veduta", + "Delete view": "Ħassar il-veduta", + "Give the view a name": "Agħti isem lill-veduta", + "Pick at least one project": "Agħżel mill-inqas proġett wieħed", + "A view shows at most {max} projects": "Veduta turi mhux aktar minn {max} proġetti", + "Could not save the view. Please try again.": "Il-veduta ma setgħetx tiġi ssejvjata. Erġa' pprova.", + "Could not delete the view. Please try again.": "Il-veduta ma setgħetx titħassar. Erġa' pprova.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Tħassar \"{title}\"? Il-proġetti u l-kompiti tagħhom jibqgħu kif inhuma.", + "People see the tasks of the projects they are in, never more.": "Kulħadd jara biss il-kompiti tal-proġetti li jkun fihom.", + "No views yet. A view shows the tasks of several of your projects together.": "Għad m'hemmx vedute. Veduta turi flimkien il-kompiti ta' diversi proġetti tiegħek.", + "Projects in view: {count}": "Proġetti fil-veduta: {count}", + "Notify me when a task is assigned to me": "Innotifikani meta jiġi assenjat lili kompitu", + "Also send these to me by email": "Ibgħatomli wkoll bl-email", + "Add an email address in your Nextcloud personal settings to get mail.": "Żid indirizz tal-email fis-settings personali ta' Nextcloud biex tirċievi l-email.", + "Code link": "Link tal-kodiċi", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, fergħa, talba għal għaqda jew kwistjoni fuq pjattaforma tal-kodiċi li taħdem fuq kompitu.", + "The task the link belongs to": "Il-kompitu li jappartjeni għalih il-link", + "The project of the task": "Il-proġett tal-kompitu", + "Task key": "Ċavetta tal-kompitu", + "The task key the forge text named, such as VC-12": "Iċ-ċavetta tal-kompitu li semma t-test tal-pjattaforma, bħal VC-12", + "What the link points at": "Fejn jipponta l-link", + "Link": "Link", + "The address of the item in the forge": "L-indirizz tal-oġġett fuq il-pjattaforma tal-kodiċi", + "The commit message, branch name or merge request title": "Il-messaġġ tal-commit, l-isem tal-fergħa jew it-titlu tat-talba għal għaqda", + "Repository": "Repożitorju", + "The repository, such as acme/portal": "Ir-repożitorju, bħal acme/portal", + "Forge id": "Id fuq il-pjattaforma", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "L-id proprju tal-oġġett fuq il-pjattaforma tal-kodiċi, bħal github:acme/portal#42 jew hash ta' commit", + "State": "Stat", + "The state of a merge request or issue": "L-istat ta' talba għal għaqda jew kwistjoni", + "Who made the commit or opened the merge request": "Min għamel il-commit jew fetaħ it-talba għal għaqda", + "When the commit was made or the merge request last changed": "Meta sar il-commit jew inbidlet l-aħħar darba t-talba għal għaqda", + "Added by": "Miżjud minn", + "Whether a person added the link or the integration wrote it": "Jekk persuna żiedet il-link jew l-integrazzjoni kitbitu", + "Nextcloud user UIDs of project members": "ID tal-utenti Nextcloud tal-membri tal-proġett", + "Add link": "Żid link", + "Added by hand": "Miżjud bl-idejn", + "Branch": "Fergħa", + "Code": "Kodiċi", + "Commit": "Commit", + "From the integration": "Mill-integrazzjoni", + "Link to a commit, branch or merge request": "Link għal commit, fergħa jew talba għal għaqda", + "Merge request": "Talba għal għaqda", + "Merged": "Magħquda", + "No code linked yet. Name {key} in a commit message or paste a link.": "Għad m'hemm l-ebda kodiċi marbut. Semmi {key} f'messaġġ ta' commit jew waħħal link.", + "No code linked yet. Paste a link to a commit or merge request.": "Għad m'hemm l-ebda kodiċi marbut. Waħħal link għal commit jew talba għal għaqda.", + "Paste a web address that starts with https://.": "Waħħal indirizz tal-web li jibda b'https://.", + "Remove link {title}": "Neħħi l-link {title}", + "The link could not be added.": "Il-link ma setax jiżdied.", + "The link could not be removed.": "Il-link ma setax jitneħħa.", + "This link is already on the task.": "Dan il-link diġà jinsab fuq il-kompitu.", + "Code forges": "Pjattaformi tal-kodiċi", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Orbot il-commits u l-pull requests ta' GitHub mal-kompiti. Integriq jirċievi l-avvenimenti; planninq qatt ma jċempel lil GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Niżżel il-konfigurazzjoni u importaha f'Integriq. Imbagħad imla sigriet fir-regola \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "F'GitHub, żid webhook mar-repożitorju b'dan l-indirizz u l-istess sigriet. Agħżel it-tip ta' kontenut application/json u l-avvenimenti push u pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Semmi ċ-ċavetta tal-kompitu, bħal VC-12, f'messaġġ ta' commit, f'isem ta' fergħa jew fit-titlu ta' pull request. Il-link imbagħad jidher fuq dak il-kompitu.", + "Without Integriq, project members can still paste a link on the task page.": "Mingħajr Integriq, il-membri tal-proġett xorta jistgħu jwaħħlu link fil-paġna tal-kompitu.", + "Download the Integriq configuration": "Niżżel il-konfigurazzjoni ta' Integriq", + "Calendar": "Kalendarju", + "Previous": "Ta' qabel", + "Calendar view": "Veduta tal-kalendarju", + "Starts:": "Jibda:", + "No tasks with a date in this month.": "L-ebda kompitu b'data dan ix-xahar.", + "Week of {start} to {end}": "Ġimgħa minn {start} sa {end}", + "My calendar": "Il-kalendarju tiegħi", + "Show as list": "Uri bħala lista", + "Show as calendar": "Uri bħala kalendarju", + "Open my calendar": "Iftaħ il-kalendarju tiegħi", + "Nextcloud Tasks": "Kompiti ta' Nextcloud", + "Show my tasks in Nextcloud Tasks": "Uri l-kompiti tiegħi fil-Kompiti ta' Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Il-kompiti assenjati lilek jew maqsuma miegħek jidhru f'lista \"Planninq\" fil-Kompiti u l-Kalendarju ta' Nextcloud. Il-bidliet li ssir hemm jiġu sostitwiti bil-bidla li jmiss fi Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Dan is-server ma jistax jikteb fil-Kompiti ta' Nextcloud, għalhekk l-esportazzjoni mhix disponibbli.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Immexxi minn Planninq. Il-bidliet li ssir hawn jiġu sostitwiti bil-bidla li jmiss fi Planninq.", + "Working days and holidays": "Ġranet tax-xogħol u btajjel", + "Dates set on the timeline skip the days that are not working days.": "Id-dati stabbiliti fuq il-kronoloġija jaqbżu l-ġranet li mhumiex ġranet tax-xogħol.", + "Working weekdays": "Il-ġranet tax-xogħol tal-ġimgħa", + "Non-working days": "Ġranet mhux tax-xogħol", + "No non-working days yet.": "Għad m'hemm l-ebda jum mhux tax-xogħol.", + "Add day": "Żid jum", + "Year": "Sena", + "Add Dutch national holidays": "Żid il-btajjel nazzjonali Olandiżi", + "Save working days": "Issejvja l-ġranet tax-xogħol", + "Choose at least one working weekday.": "Agħżel mill-inqas jum wieħed tax-xogħol.", + "Working days saved.": "Il-ġranet tax-xogħol ġew issejvjati.", + "Could not save the working days.": "Il-ġranet tax-xogħol ma setgħux jiġu ssejvjati.", + "New Year's Day": "L-Ewwel tas-Sena", + "Easter Sunday": "Ħadd il-Għid", + "Easter Monday": "It-Tnejn ta' wara l-Għid", + "King's Day": "Jum is-Sultan", + "Liberation Day": "Jum il-Ħelsien", + "Ascension Day": "It-Tlugħ fis-Sema", + "Whit Sunday": "Għid il-Ħamsin", + "Whit Monday": "It-Tnejn ta' wara Għid il-Ħamsin", + "Christmas Day": "Il-Milied", + "Boxing Day": "It-tieni jum tal-Milied", + "Dates of {title}": "Id-dati ta' {title}", + "The due date cannot be before the start date.": "Id-data tal-għeluq ma tistax tkun qabel id-data tal-bidu.", + "{title}, from {start} to {end}": "{title}, minn {start} sa {end}", + "The dates could not be saved.": "Id-dati ma setgħux jiġu ssejvjati.", + "{title} now runs from {start} to {end}": "{title} issa jdum minn {start} sa {end}", + "Auto-scheduling": "Skedar awtomatiku", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Meta jkun mixgħul, iċċaqlaq data tal-għeluq aktar tard fuq il-kronoloġija joffri li jiċċaqilqu wkoll il-kompiti li timblokka.", + "Move blocked tasks along when a task slips": "Ċaqlaq il-kompiti mblukkati meta kompitu jdum", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Fuq il-kronoloġija, data tal-għeluq aktar tard toffri li jiċċaqilqu l-kompiti mblukkati. Jgħoddu biss ir-rabtiet \"jimblokka\", u l-kompiti jiċċaqilqu biss aktar tard.", + "Move the tasks that wait for {title}?": "Tiċċaqlaq il-kompiti li qed jistennew lil {title}?", + "These tasks wait for it and would start after its new due date:": "Dawn il-kompiti qed jistennewh u jibdew wara d-data l-ġdida:", + "{count} tasks would move; the first {limit} are listed.": "Jiċċaqilqu {count} kompiti; l-ewwel {limit} huma elenkati.", + "Now": "Issa", + "After the move": "Wara ċ-ċaqliq", + "Only this task": "Dan il-kompitu biss", + "Move all": "Ċaqlaq kollox", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Waqaf f'{title}: id-dati ma setgħux jiġu ssejvjati. Il-kompiti ta' qablu ġew iċċaqilqa.", + "Cumulative flow": "Fluss kumulattiv", + "Show as chart": "Uri bħala graff", + "Show as table": "Uri bħala tabella", + "Tasks per column per day": "Kompiti għal kull kolonna kuljum", + "Tasks without recorded history in this period: {count}": "Kompiti mingħajr storja rreġistrata f'dan il-perjodu: {count}", + "Lead and cycle time": "Ħin tal-kunsinna u ħin taċ-ċiklu", + "No tasks were finished in this period.": "Ebda kompitu ma tlesta f'dan il-perjodu.", + "Finished tasks": "Kompiti mlestija", + "Cycle time, average": "Ħin taċ-ċiklu, medja", + "Cycle time, 85th percentile": "Ħin taċ-ċiklu, il-85 perċentil", + "Lead time, average": "Ħin tal-kunsinna, medja", + "Tasks whose finish time was estimated from their history: {count}": "Kompiti li l-ħin tat-tmiem tagħhom ġie stmat mill-istorja: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Ħin taċ-ċiklu ta' kull kompitu mlesti, bil-medja u l-85 perċentil", + "Slowest tasks": "L-aktar kompiti bil-mod", + "cycle {cycle}, lead {lead}": "ċiklu {cycle}, kunsinna {lead}", + "{days} days": "{days} jiem", + "Could not load the flow of this project.": "Il-fluss ta' dan il-proġett ma setax jitgħabba.", + "Last {days} days": "L-aħħar {days} jiem", + "Portfolio flow": "Fluss tal-portafoll", + "An admin adds portfolios under Projects, Portfolios.": "Amministratur iżid portafolli taħt Proġetti, Portafolli.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Proġetti mhux murija, għax jintwerew l-aktar 50 kull darba: {count}", + "Could not load the flow of this portfolio.": "Il-fluss ta' dan il-portafoll ma setax jitgħabba.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Fluss kumulattiv u ħin taċ-ċiklu fuq il-proġetti ta' portafoll.", + "Edit report": "Editja r-rapport", + "Only tasks where": "Kompiti biss fejn", + "Group by": "Iġbor skont", + "Display": "Wiri", + "Share with everyone who can read its projects": "Aqsam ma' kull min jista' jaqra l-proġetti tiegħu", + "The report could not be saved.": "Ir-rapport ma setax jiġi salvat.", + "Number of tasks": "Numru ta' kompiti", + "Bar": "Vireg", + "Donut": "Ċirku", + "Table": "Tabella", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} minn {total} proġetti f'dan ir-rapport mhumiex viżibbli għalik", + "No tasks match this report.": "L-ebda kompitu ma jaqbel ma' dan ir-rapport.", + "None": "Xejn", + "Could not load this report.": "Dan ir-rapport ma setax jitgħabba.", + "Report": "Rapport", + "Your reports": "Ir-rapporti tiegħek", + "My reports": "Ir-rapporti tiegħi", + "Shared reports": "Rapporti kondiviżi", + "You have not built a report yet.": "Għadek ma għamilt l-ebda rapport.", + "Nobody has shared a report with you yet.": "Ħadd għadu ma qasam rapport miegħek.", + "Reports you built over tasks, and the ones shared with you.": "Rapporti li għamilt fuq il-kompiti, u dawk maqsuma miegħek.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Mistoqsija salvata fuq il-kompiti: liema proġetti, liema filtri, miġbura skont xiex, magħduda jew miġmugħa, u murija bħala tabella jew graff.", + "The name the report is listed under": "L-isem li bih ir-rapport jidher fil-lista", + "What the report shows and who it is for": "X'juri r-rapport u għal min hu", + "Nextcloud user id of the person who saved the report": "L-id tal-utent Nextcloud ta' min issejvja r-rapport", + "Who can open the report": "Min jista' jiftaħ ir-rapport", + "Only me": "Jien biss", + "Everyone who can read its projects": "Kull min jista' jaqra l-proġetti tiegħu", + "The projects the report covers, at most fifty": "Il-proġetti li jkopri r-rapport, l-aktar ħamsin", + "Filters": "Filtri", + "Task fields and the value each must equal": "Oqsma tal-kompitu u l-valur li kull wieħed irid ikun ugwali għalih", + "The task field the report groups on": "Il-qasam tal-kompitu li bih jiġbor ir-rapport", + "Count the tasks, or add up a number on them": "Għodd il-kompiti, jew iġma' numru fuqhom", + "Sum": "Somma", + "Sum of": "Somma ta'", + "The number added up when the measure is a sum": "In-numru li jinġabar meta l-kejl ikun somma", + "Story points": "Punti tal-istorja", + "Estimated duration": "Tul stmat", + "How the report is shown": "Kif jintwera r-rapport", + "Issue type": "Tip ta' talba", + "Task fields and the value each must equal; empty when the report covers every task": "Il-qasam tal-kompitu u l-valur li għandu jkollu kull wieħed; vojt meta r-rapport ikopri l-kompiti kollha", + "The status a task must have": "L-istatus li għandu jkollu kompitu", + "The priority a task must have": "Il-prijorità li għandu jkollu kompitu", + "The user a task must be assigned to": "L-utent li lilu għandu jkun assenjat kompitu", + "A label a task must carry": "Tikketta li għandu jkollu kompitu", + "The board column a task must be in": "Il-kolonna tal-bord li fiha għandu jkun kompitu", + "The issue type a task must have": "It-tip ta' talba li għandu jkollu kompitu", + "Manager groups": "Gruppi tal-maniġers", + "Member groups": "Gruppi tal-membri", + "Viewer groups": "Gruppi tal-qarrejja", + "Viewers": "Qarrejja", + "Owning group": "Grupp sid", + "Nextcloud groups whose members manage the project": "Gruppi Nextcloud li l-membri tagħhom jimmaniġġjaw il-proġett", + "Nextcloud groups whose members work on the project": "Gruppi Nextcloud li l-membri tagħhom jaħdmu fuq il-proġett", + "Nextcloud groups whose members may read the project": "Gruppi Nextcloud li l-membri tagħhom jistgħu jaqraw il-proġett", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utenti Nextcloud li jimmaniġġjaw il-proġett: settings, membri u xogħol", + "Nextcloud user ids who may read the project and its work but not change it": "Utenti Nextcloud li jistgħu jaqraw il-proġett u x-xogħol tiegħu iżda mhux ibiddluhom", + "The Nextcloud group that owns the project with its creator, at most one": "Il-grupp Nextcloud li għandu l-proġett flimkien ma' min ħolqu, l-aktar wieħed", + "Nextcloud user ids who may read this through the project": "Utenti Nextcloud li jistgħu jaqraw dan permezz tal-proġett", + "Nextcloud groups whose members may change this through the project": "Gruppi Nextcloud li l-membri tagħhom jistgħu jbiddlu dan permezz tal-proġett", + "Nextcloud groups whose members may read this through the project": "Gruppi Nextcloud li l-membri tagħhom jistgħu jaqraw dan permezz tal-proġett", + "Search for a person or a group…": "Fittex persuna jew grupp…", + "No one found. Your admin's sharing settings decide who you can find.": "Ħadd ma nstab. L-issettjar tal-qsim tal-amministratur tiegħek jiddeċiedi lil min tista' ssib.", + "Type at least two characters": "Ikteb mill-inqas żewġ karattri", + "Everyone in this group": "Kulħadd f'dan il-grupp", + "Could not search for people. Please try again.": "It-tfittxija għal persuni ma rnexxietx. Erġa' pprova.", + "Could not remove the group": "Il-grupp ma setax jitneħħa", + "Only the owner and managers change who is on this project.": "Is-sid u l-maniġers biss ibiddlu min hu f'dan il-proġett.", + "Role of {name}": "Ir-rwol ta' {name}", + "Manager": "Maniġer", + "Member": "Membru", + "Viewer": "Qarrej", + "Could not change the role": "Ir-rwol ma setax jinbidel", + "Owned by group: {name}": "Proprjetà tal-grupp: {name}", + "No group owns this project.": "L-ebda grupp ma huwa sid ta' dan il-proġett.", + "Owned by group": "Proprjetà tal-grupp", + "Search for a group…": "Fittex grupp…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ma nstab l-ebda grupp. Is-settings tal-qsim tal-amministratur tiegħek jiddeċiedu liema gruppi tista' ssib.", + "No owning group": "L-ebda grupp sid", + "Could not search for groups. Please try again.": "Ma setgħux jiġu mfittxija gruppi. Erġa' pprova.", + "Could not change the owning group": "Il-grupp sid ma setax jinbidel", + "You can read this project. Only its members change it.": "Tista' taqra dan il-proġett. Il-membri tiegħu biss ibiddluh.", + "Course": "Kors", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il-kors mgħallem f'din il-lezzjoni, bħal suġġett fakultattiv, meta l-app tat-tagħlim tal-iskola tkun tafu.", + "Online meeting link": "Link tal-lezzjoni online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Fejn l-istudenti jingħaqdu ma' din il-lezzjoni online. Il-buttuna Ingħaqad tidher biss għal link https." }, "plurals": {} } diff --git a/l10n/nb.js b/l10n/nb.js index c2036238..b4bbf61c 100644 --- a/l10n/nb.js +++ b/l10n/nb.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktive prosjekter", + "Archived projects": "Arkiverte prosjekter", + "Boards": "Tavler", + "My projects": "Mine prosjekter", + "Portfolio": "Portefølje", + "Project board": "Prosjekttavle", + "Projects I am in": "Prosjekter jeg er med i", + "Timeline": "Tidslinje", + "Timesheet": "Timeliste", + "Features & roadmap": "Funksjoner og veikart", + "Flow": "Flyt", + "Flows": "Flyter", + "Reports": "Rapporter", + "Pick a report to open it.": "Velg en rapport for å åpne den.", + "In progress": "Pågår", + "Date": "Dato", + "Due": "Frist", + "Assignee": "Tildelt", + "Who": "Hvem", + "What": "Hva", + "Minutes": "Minutter", + "Entries": "Oppføringer", + "Most recent": "Nyeste", + "Per person": "Per person", + "By status": "Etter status", + "By priority": "Etter prioritet", + "Task status": "Oppgavestatus", + "Time spent": "Brukt tid", + "Capacity": "Kapasitet", + "Due soonest": "Forfaller først", + "Minutes logged": "Registrerte minutter", + "Nothing is due": "Ingenting forfaller", + "Nothing logged yet": "Ingenting registrert ennå", + "What is open, what is blocked, and what is overdue.": "Hva som er åpent, hva som er blokkert, og hva som er forsinket.", + "How allocation is spread across the people working on projects.": "Hvordan belastningen fordeler seg på dem som jobber med prosjekter.", + "Hours logged, and the projects they went to.": "Registrerte timer og prosjektene de gikk til.", + "Billable": "Fakturerbar", + "Budget: {amount}": "Budsjett: {amount}", + "Loading projects": "Laster prosjekter", + "No projects for this client yet": "Ingen prosjekter for denne kunden ennå", + "Open in Planninq": "Åpne i Planninq", + "This project could not be found": "Dette prosjektet ble ikke funnet", + "Untitled project": "Prosjekt uten tittel", + "and {count} more": "og {count} til", + "Store": "Butikk", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installer registre, skjemaer og flyter som andre organisasjoner har publisert.", + "Work Date": "Arbeidsdato", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Kolonnehandlinger", + "Columns": "Kolonner", + "Could not remove the column. Please try again.": "Kolonnen kunne ikke fjernes. Prøv igjen.", + "Could not save the column. Please try again.": "Kolonnen kunne ikke lagres. Prøv igjen.", + "Done column": "Ferdig-kolonne", + "Edit column": "Rediger kolonne", + "Keep the card's status": "Behold kortets status", + "Move its cards to": "Flytt kortene til", + "Move left": "Flytt til venstre", + "Move right": "Flytt til høyre", + "Status of cards moved here": "Status for kort som flyttes hit", + "The last done column cannot be removed.": "Den siste ferdig-kolonnen kan ikke fjernes.", + "WIP limit": "WIP-grense", + "over limit": "over grensen", + "The status a card gets when it is moved into this column.": "Statusen et kort får når det flyttes til denne kolonnen.", + "All priorities": "Alle prioriteter", + "Could not create the task. Please try again.": "Oppgaven kunne ikke opprettes. Prøv igjen.", + "Created": "Opprettet", + "Move to backlog": "Til backlogen", + "Move to board": "Til tavlen", + "New task": "Ny oppgave", + "Nothing in the backlog": "Ingenting i backlogen", + "Rank": "Rang", + "Sort by": "Sorter etter", + "Sort by rank to reorder": "Sorter etter rang for å endre rekkefølgen", + "Task actions": "Oppgavehandlinger", + "All labels": "Alle etiketter", + "Filter tasks by label": "Filtrer oppgaver etter etikett", + "View timeline": "Vis tidslinje", + "Board": "Tavle", + "List": "Liste", + "Column": "Kolonne", + "Board or list": "Tavle eller liste", + "Log": "Logg", + "Add entry": "Legg til oppføring", + "Show": "Vis", + "No actions yet": "Ingen tiltak ennå", + "Closed": "Lukket", + "Entry actions": "Handlinger for oppføringen", + "Add action": "Legg til tiltak", + "by {author}": "av {author}", + "saved {time}": "lagret {time}", + "Attendees: {names}": "Deltakere: {names}", + "Add the first entry": "Legg til den første oppføringen", + "Issues": "Problemer", + "Lessons learned": "Lærdommer", + "Meetings": "Møter", + "Decisions": "Beslutninger", + "Actions": "Tiltak", + "Issue": "Problem", + "Lesson learned": "Lærdom", + "Meeting": "Møte", + "Decision": "Beslutning", + "About this project": "Om dette prosjektet", + "No description yet": "Ingen beskrivelse ennå", + "Start date": "Startdato", + "Not set": "Ikke angitt", + "End date": "Sluttdato", + "Progress": "Fremdrift", + "No tasks yet": "Ingen oppgaver ennå", + "Open the board": "Åpne tavlen", + "People": "Personer", + "Owner": "Eier", + "Latest log entries": "Siste oppføringer", + "Open the log": "Åpne loggen", + "{done} of {total} tasks done": "{done} av {total} oppgaver fullført", + "Edit entry": "Rediger oppføring", + "Type": "Type", + "Attendees": "Deltakere", + "Issue is closed": "Problemet er lukket", + "Could not save the entry. Please try again.": "Oppføringen kunne ikke lagres. Prøv igjen.", + "From: {title}": "Fra: {title}", + "What needs to happen": "Hva som må gjøres", + "Could not create the action. Please try again.": "Tiltaket kunne ikke opprettes. Prøv igjen.", + "The action was created but could not be linked to the entry.": "Tiltaket ble opprettet, men kunne ikke knyttes til oppføringen.", + "Project pages": "Prosjektsider", + "Overview": "Oversikt", + "Risks": "Risikoer", + "Log entry": "Loggoppføring", + "A short name for the entry": "Et kort navn på oppføringen", + "Project": "Prosjekt", + "The project this entry belongs to": "Prosjektet oppføringen hører til", + "What kind of entry this is": "Hva slags oppføring dette er", + "When it happened": "Når det skjedde", + "What happened, in Markdown": "Hva som skjedde, i Markdown", + "Whether an issue is still open": "Om et problem fortsatt er åpent", + "The people at a meeting": "Personene på et møte", + "Tasks that came out of this entry": "Oppgaver som kom ut av denne oppføringen", + "Add risk": "Legg til risiko", + "Risk": "Risiko", + "Score": "Poeng", + "Response": "Håndtering", + "Review date": "Gjennomgangsdato", + "no longer on the project": "er ikke lenger med i prosjektet", + "Edit {title}": "Rediger {title}", + "No risks recorded yet": "Ingen risikoer registrert ennå", + "Add the first risk": "Legg til den første risikoen", + "Medium": "Middels", + "Mitigating": "Reduseres", + "Occurred": "Inntruffet", + "Avoid": "Unngå", + "Reduce": "Redusere", + "Transfer": "Overføre", + "Accept": "Akseptere", + "Highest open risks": "Høyeste åpne risikoer", + "No open risks": "Ingen åpne risikoer", + "Open the risk register": "Åpne risikoregisteret", + "Edit risk": "Rediger risiko", + "What could go wrong": "Hva som kan gå galt", + "Likelihood": "Sannsynlighet", + "Impact": "Konsekvens", + "Score {score}": "Poeng {score}", + "Countermeasures": "Tiltak", + "Could not save the risk. Please try again.": "Risikoen kunne ikke lagres. Prøv igjen.", + "Risks by likelihood and impact": "Risikoer etter sannsynlighet og konsekvens", + "Risk scale": "Risikoskala", + "The levels every project scores its risks on, and where low turns into medium and high": "Nivåene hvert prosjekt vurderer risikoene sine på, og hvor lav går over i middels og høy", + "Number of levels": "Antall nivåer", + "Likelihood labels": "Etiketter for sannsynlighet", + "Impact labels": "Etiketter for konsekvens", + "Level {level}": "Nivå {level}", + "Medium from score": "Middels fra poeng", + "High from score": "Høy fra poeng", + "Risk scale saved": "Risikoskala lagret", + "1 risk uses level {level}. Change it first.": "1 risiko bruker nivå {level}. Endre den først.", + "{count} risks use level {level}. Change them first.": "{count} risikoer bruker nivå {level}. Endre dem først.", + "Every level needs a label, and high must start above medium.": "Hvert nivå trenger en etikett, og høy må starte over middels.", + "The project this risk belongs to": "Prosjektet risikoen hører til", + "The cause and the effect, in Markdown": "Årsak og virkning, i Markdown", + "Category": "Kategori", + "A free grouping, such as planning, budget or supplier": "En fri gruppering, for eksempel planlegging, budsjett eller leverandør", + "How likely it is, on the admin's risk scale": "Hvor sannsynlig det er, på administratorens risikoskala", + "How hard it would hit, on the admin's risk scale": "Hvor hardt det ville ramme, på administratorens risikoskala", + "Likelihood times impact, calculated by the server": "Sannsynlighet ganger konsekvens, beregnet av serveren", + "Where the risk stands": "Hvor risikoen står", + "The person who watches this risk": "Personen som følger med på risikoen", + "How the project answers the risk": "Hvordan prosjektet håndterer risikoen", + "What is done to prevent it or soften it, in Markdown": "Hva som gjøres for å hindre eller dempe den, i Markdown", + "When to look at this risk again": "Når risikoen skal vurderes igjen", + "Very low": "Svært lav", + "Very high": "Svært høy", + "All projects": "Alle prosjekter", + "Project status report": "Prosjektstatusrapport", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "En datert rapport om hvordan et prosjekt ligger an med penger, organisasjon, tid, informasjon, kvalitet og risiko (GROTIK-aspektene), hver med et notat.", + "The project this report is about": "Prosjektet rapporten gjelder", + "Report date": "Rapportdato", + "The day the report describes": "Dagen rapporten beskriver", + "Money": "Penger", + "How the project stands on this aspect": "Hvordan prosjektet ligger an på dette aspektet", + "On track": "I rute", + "At risk": "I fare", + "Off track": "Ute av rute", + "Money note": "Notat om penger", + "A short explanation of this status": "En kort forklaring på denne statusen", + "Organisation": "Organisasjon", + "Organisation note": "Notat om organisasjon", + "Time": "Tid", + "Time note": "Notat om tid", + "Information": "Informasjon", + "Information note": "Notat om informasjon", + "Quality": "Kvalitet", + "Quality note": "Notat om kvalitet", + "Risk note": "Notat om risiko", + "Overall": "Samlet", + "The worst of the six statuses, calculated by the server": "Den dårligste av de seks statusene, beregnet av serveren", + "Health: money": "Helse: penger", + "Copied from the newest status report": "Kopiert fra den nyeste statusrapporten", + "Health: organisation": "Helse: organisasjon", + "Health: time": "Helse: tid", + "Health: information": "Helse: informasjon", + "Health: quality": "Helse: kvalitet", + "Health: risk": "Helse: risiko", + "Health: overall": "Helse: samlet", + "Health: report date": "Helse: rapportdato", + "The date of the newest status report": "Datoen for den nyeste statusrapporten", + "New report": "Ny rapport", + "Only the project owner writes status reports.": "Bare prosjekteieren skriver statusrapporter.", + "Latest report, {date}": "Siste rapport, {date}", + "Aspect": "Aspekt", + "Note": "Notat", + "Report history": "Rapporthistorikk", + "Author": "Forfatter", + "No status reports yet": "Ingen statusrapporter ennå", + "Write the first report": "Skriv den første rapporten", + "Choose a status for every aspect to save the report.": "Velg en status for hvert aspekt for å lagre rapporten.", + "Suggested: on track.": "Forslag: i rute.", + "Suggested: at risk.": "Forslag: i fare.", + "Suggested: off track.": "Forslag: ute av rute.", + "1 task is past its due date.": "1 oppgave har passert fristen.", + "{count} tasks are past their due date.": "{count} oppgaver har passert fristen.", + "The end date has passed with 1 open task.": "Sluttdatoen er passert med 1 åpen oppgave.", + "The end date has passed with {count} open tasks.": "Sluttdatoen er passert med {count} åpne oppgaver.", + "No open task is past its due date.": "Ingen åpen oppgave har passert fristen.", + "The highest open risk, \"{title}\", scores {score}.": "Den høyeste åpne risikoen, \"{title}\", har poengsum {score}.", + "There are no open risks.": "Det finnes ingen åpne risikoer.", + "Costs are at {percent}% of the budget.": "Kostnadene er på {percent}% av budsjettet.", + "No suggestion: the project has no budget.": "Ikke noe forslag: prosjektet har ikke budsjett.", + "No suggestion: no costs are recorded for this project yet.": "Ikke noe forslag: det er ennå ikke registrert kostnader for dette prosjektet.", + "The report was not saved. Only the project owner can write status reports.": "Rapporten ble ikke lagret. Bare prosjekteieren kan skrive statusrapporter.", + "No report": "Ingen rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "En gruppe prosjekter som drives av de samme personene, for eksempel en avdeling eller et program. De ansvarlige leser hvert prosjekt i den.", + "The name of the portfolio": "Navnet på porteføljen", + "What the portfolio holds and who runs it": "Hva porteføljen inneholder og hvem som driver den", + "A colour for the portfolio's section in project lists": "En farge for porteføljens del i prosjektlister", + "Managers": "Ansvarlige", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-bruker-ID-er for personene som driver porteføljen", + "Order": "Rekkefølge", + "Where the portfolio comes in project lists, lowest first": "Hvor porteføljen står i prosjektlister, laveste først", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Porteføljens egen risikoskala som JSON, i samme form som skalaen for hele appen. Tom betyr skalaen for hele appen.", + "Portfolio readers": "Porteføljelesere", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-bruker-ID-er for de ansvarlige for prosjektets portefølje", + "The portfolio this project belongs to": "Porteføljen dette prosjektet hører til", + "No portfolio": "Ingen portefølje", + "All portfolios": "Alle porteføljer", + "You read this project as a manager of its portfolio. Only its members change it.": "Du leser dette prosjektet som ansvarlig for porteføljen. Bare medlemmene endrer det.", + "Portfolios": "Porteføljer", + "Portfolio status": "Porteføljestatus", + "No portfolios yet": "Ingen porteføljer ennå", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "En administrator legger til porteføljer under Prosjekter, Porteføljer. Prosjekter i en portefølje vises her med status.", + "Roll-up": "Oppsummering", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} i rute, {atRisk} i fare, {offTrack} ute av rute, {noReport} uten rapport", + "No project in this portfolio that you can read.": "Ingen prosjekter i denne porteføljen som du kan lese.", + "Start": "Start", + "End": "Slutt", + "Budget": "Budsjett", + "Last report": "Siste rapport", + "Out of date": "Utdatert", + "Portfolio timeline": "Porteføljetidslinje", + "Zoom": "Zoom", + "Could not load the timeline": "Kunne ikke laste tidslinjen", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "En administrator legger til porteføljer under Prosjekter, Porteføljer. Prosjekter i en portefølje vises her på én tidslinje.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Åpne et prosjekt for å se faser og oppgaver. Tidslinjen er skrivebeskyttet.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Utelatt fordi du ikke kan lese dem: {count} prosjekter", + "Week": "Uke", + "Day": "Dag", + "Month": "Måned", + "Please try again later.": "Prøv igjen senere.", + "Status reports": "Statusrapporter", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Etter hvor mange dager et prosjekts siste statusrapport merkes som utdatert i porteføljeoversikten", + "Reporting period (days)": "Rapporteringsperiode (dager)", + "The reporting period is a whole number of days from 1 to 365.": "Rapporteringsperioden er et helt antall dager fra 1 til 365.", + "Reporting period saved": "Rapporteringsperiode lagret", + "The reporting period was not saved. Please try again.": "Rapporteringsperioden ble ikke lagret. Prøv igjen.", + "Every project of a portfolio with its status per aspect, rolled up.": "Hvert prosjekt i en portefølje med status per aspekt, oppsummert.", + "The projects of a portfolio on one timeline.": "Prosjektene i en portefølje på én tidslinje.", + "Phases": "Faser", + "Add phase": "Legg til fase", + "No phases yet": "Ingen faser ennå", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Del prosjektet inn i faser, som initiering, definisjon og gjennomføring. En fase lukkes når det avsluttende dokumentet er lastet opp.", + "{hours} hours": "{hours} timer", + "Concluding document: {title}": "Avsluttende dokument: {title}", + "Concluding document missing": "Avsluttende dokument mangler", + "Move {title} up": "Flytt {title} opp", + "Move {title} down": "Flytt {title} ned", + "Close phase": "Lukk fase", + "Phase": "Fase", + "Files": "Filer", + "Notes": "Notater", + "Audit trail": "Revisjonsspor", + "Edit phase": "Rediger fase", + "Name": "Navn", + "Budget hours": "Budsjettimer", + "Could not save the phase. Please try again.": "Kunne ikke lagre fasen. Prøv igjen.", + "Close phase {title}": "Lukk fasen {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "En fase lukkes med det avsluttende dokumentet: last det opp her eller velg en av fasens filer.", + "Concluding document": "Avsluttende dokument", + "This phase has no files yet.": "Denne fasen har ingen filer ennå.", + "Upload a document": "Last opp et dokument", + "The document was not uploaded. Please try again.": "Dokumentet ble ikke lastet opp. Prøv igjen.", + "Upload the concluding document before you close this phase.": "Last opp det avsluttende dokumentet før du lukker denne fasen.", + "This phase cannot be closed from its current status.": "Denne fasen kan ikke lukkes fra sin nåværende status.", + "The phase was not closed. Please try again.": "Fasen ble ikke lukket. Prøv igjen.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID-en til filen på denne fasen som avslutter den. Fasen kan først fullføres når den er satt og filen er vedlagt.", + "Import from Microsoft Project": "Importer fra Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Velg en plan lagret fra Microsoft Project i XML-format. Ingenting importeres før du bekrefter.", + "Plan file": "Planfil", + "What the import creates": "Hva importen oppretter", + "Tasks": "Oppgaver", + "Sub-tasks": "Underoppgaver", + "Milestones": "Milepæler", + "Links": "Koblinger", + "Already imported, updated in place: {count}": "Allerede importert, oppdatert på stedet: {count}", + "What does not carry over": "Hva som ikke blir med", + "Tasks with resources, which are not imported: {count}": "Oppgaver med ressurser, som ikke importeres: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Oppgaver dypere enn nivå 3, plassert under oppgaven sin på nivå 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Koblinger utenom slutt-til-start, importert som relaterte koblinger: {count}", + "Link lags, which are dropped: {count}": "Forsinkelser på koblinger, som droppes: {count}", + "Links to a summary task, which are not imported: {count}": "Koblinger til en sammendragsoppgave, som ikke importeres: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Koblinger til oppgaver utenfor denne planen, som ikke importeres: {count}", + "No longer in the plan": "Ikke lenger i planen", + "These stay in the project; remove them yourself if they are no longer needed.": "Disse blir i prosjektet; fjern dem selv hvis de ikke lenger trengs.", + "Import": "Importer", + "Close": "Lukk", + "The plan is imported: {created} created, {updated} updated.": "Planen er importert: {created} opprettet, {updated} oppdatert.", + "Links that would close a loop were left out: {count}": "Koblinger som ville lukket en sløyfe, ble utelatt: {count}", + "The import stopped part-way. Run it again to finish it.": "Importen stoppet underveis. Kjør den på nytt for å fullføre den.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Lagre planen i Microsoft Project med Fil, Lagre som, XML-format, og importer den filen.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Denne filen deklarerer en DOCTYPE eller entiteter, som ikke godtas.", + "The file is larger than 10 MB.": "Filen er større enn 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Planen har mer enn 2 000 oppgaver, flere enn én import tar.", + "This file is not a Microsoft Project plan in XML format.": "Denne filen er ikke en Microsoft Project-plan i XML-format.", + "Choose a file to import.": "Velg en fil å importere.", + "Only the project owner can import a plan.": "Bare prosjekteieren kan importere en plan.", + "The plan could not be read. Please try again.": "Planen kunne ikke leses. Prøv igjen.", + "Linked case: {title}": "Tilknyttet sak: {title}", + "Linked to a case": "Knyttet til en sak", + "Hand over to case": "Overlever til sak", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopierer hver fil på prosjektet og oppgavene, og en fil som beskriver prosjektet, uendret til den tilknyttede saken.", + "{date} by {user}": "{date} av {user}", + "Files copied: {count}": "Filer kopiert: {count}", + "Files that failed: {names}": "Filer som feilet: {names}", + "The handover failed. Please try again.": "Overleveringen mislyktes. Prøv igjen.", + "The linked case could not be found, or you cannot open it.": "Den tilknyttede saken ble ikke funnet, eller du kan ikke åpne den.", + "Case handovers": "Overleveringer til saken", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Hver gang prosjektets filer og metadata ble overlevert til saken: når, av hvem, til hvilken sak, hver kopiert fil med sin SHA-256, og filene som feilet.", + "Finance": "Økonomi", + "Add cost line": "Legg til kostnadslinje", + "Delivery terms": "Leveransevilkår", + "Billing model": "Faktureringsmodell", + "Budget in euro": "Budsjett i euro", + "Budget in hours": "Budsjett i timer", + "Hourly rate in euro": "Timepris i euro", + "Planned start": "Planlagt start", + "Planned end": "Planlagt slutt", + "Planned dates": "Planlagte datoer", + "Budget {amount}": "Budsjett {amount}", + "No budget agreed": "Ingen budsjett avtalt", + "Hours": "Timer", + "Only the project owner and the portfolio managers see the amounts.": "Bare prosjekteieren og porteføljelederne ser beløpene.", + "Budget against cost per category": "Budsjett mot kostnader per kategori", + "Labour (booked time)": "Arbeid (registrert tid)", + "No category": "Ingen kategori", + "Hours are not available": "Timene er ikke tilgjengelige", + "Not yet assigned to a category": "Ikke tildelt en kategori ennå", + "Total": "Totalt", + "{spent} spent, {remaining} remaining": "{spent} brukt, {remaining} igjen", + "Budget against cost per phase": "Budsjett mot kostnader per fase", + "No phase": "Ingen fase", + "Cost lines": "Kostnadslinjer", + "From the finance system": "Fra økonomisystemet", + "Edit cost line {amount}": "Rediger kostnadslinjen {amount}", + "No cost lines yet": "Ingen kostnadslinjer ennå", + "Commitments": "Forpliktelser", + "Actual cost": "Faktiske kostnader", + "Forecast": "Prognose", + "Remaining": "Gjenstående", + "Not planned yet": "Ikke planlagt ennå", + "{start} to {end}": "{start} til {end}", + "The terms were not saved. Please try again.": "Vilkårene ble ikke lagret. Prøv igjen.", + "Terms saved": "Vilkår lagret", + "Fixed price": "Fastpris", + "Hourly": "Per time", + "Not billed": "Ikke fakturert", + "Commitment": "Forpliktelse", + "Edit cost line": "Rediger kostnadslinje", + "Kind": "Type", + "Amount in euro": "Beløp i euro", + "Remove": "Fjern", + "Could not save the cost line. Only the project owner changes the money of a project.": "Kunne ikke lagre kostnadslinjen. Bare prosjekteieren endrer pengene i et prosjekt.", + "Could not remove the cost line. Please try again.": "Kunne ikke fjerne kostnadslinjen. Prøv igjen.", + "{amount} over budget": "{amount} over budsjett", + "Cost categories": "Kostnadskategorier", + "The categories every project splits its budget and costs into, one per line": "Kategoriene hvert prosjekt deler budsjettet og kostnadene sine inn i, én per linje", + "Categories": "Kategorier", + "Give at least one category, each name once.": "Oppgi minst én kategori, hvert navn én gang.", + "Cost categories saved": "Kostnadskategorier lagret", + "The cost categories were not saved. Please try again.": "Kostnadskategoriene ble ikke lagret. Prøv igjen.", + "Finance line": "Økonomilinje", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Et pengebeløp på et prosjekt: et budsjett, en forpliktelse, en faktisk kostnad eller en prognose, i en kostnadskategori og eventuelt en fase. Registrert av prosjekteieren eller sendt av økonomisystemet via integrasjonsappen.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Prosjektet beløpet hører til. Tomt for en linje fra økonomisystemet der prosjektnummeret ikke passer til noe prosjekt.", + "The phase this amount belongs to, if any": "Fasen beløpet hører til, hvis noen", + "The cost category, one of the categories the admin set up": "Kostnadskategorien, en av kategoriene administratoren har satt opp", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Om beløpet er et budsjett, en forpliktelse, en faktisk kostnad eller en prognose", + "Amount": "Beløp", + "The amount in the reporting currency (euro)": "Beløpet i rapporteringsvalutaen (euro)", + "The date the amount was booked or is expected": "Datoen beløpet ble bokført eller forventes", + "What the amount is for": "Hva beløpet gjelder", + "Whether a person entered the line or the finance system sent it": "Om en person registrerte linjen eller økonomisystemet sendte den", + "Entered by hand": "Registrert for hånd", + "Finance line id": "Økonomilinjens ID", + "The finance system's own id of this line. One imported line per id.": "Linjens egen ID i økonomisystemet. Én importert linje per ID.", + "Project number": "Prosjektnummer", + "The project number the finance system sent, matched against the project key": "Prosjektnummeret økonomisystemet sendte, sammenlignet med prosjektnøkkelen", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Porteføljen til linjens prosjekt, kopiert fra prosjektet slik at porteføljetotaler trenger ett filter", + "Finance readers": "Økonomilesere", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-bruker-UID-er for personene som kan se beløpet: prosjekteieren og porteføljens ledere", + "Project owner": "Prosjekteier", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-bruker-UID for prosjekteieren, som kan endre og fjerne manuelle linjer", + "How the client pays: not billed, a fixed price, or by the hour.": "Hvordan kunden betaler: ikke fakturert, fastpris eller per time.", + "Portfolio finance": "Porteføljeøkonomi", + "You cannot see the money of any project in this portfolio": "Du kan ikke se pengene til noe prosjekt i denne porteføljen", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serveren returnerte kostnadslinjer fra prosjekter utenfor denne porteføljen, så disse totalene kan være feil.", + "Projects left out because you cannot see their money: {count}": "Prosjekter utelatt fordi du ikke kan se pengene deres: {count}", + "Unmatched finance lines": "Umatchede økonomilinjer", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budsjett, forpliktelser, faktiske kostnader og prognose summert for en portefølje.", + "Subprojects": "Delprosjekter", + "{done} of {total}": "{done} av {total}", + "{done} of {total} tasks done, including subprojects": "{done} av {total} oppgaver fullført, inkludert delprosjekter", + "Show the subprojects of {title}": "Vis delprosjektene under {title}", + "Hide the subprojects of {title}": "Skjul delprosjektene under {title}", + "Part of": "Del av", + "No parent project": "Ingen overordnet prosjekt", + "A project cannot sit under one of its own subprojects.": "Et prosjekt kan ikke ligge under et av sine egne delprosjekter.", + "Projects nest three levels deep at most: programme, project and subproject.": "Prosjekter kan ligge høyst tre nivåer dypt: program, prosjekt og delprosjekt.", + "Parent project": "Overordnet prosjekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Prosjektet dette prosjektet ligger under, for eksempel et program. Prosjekter kan ligge høyst tre nivåer dypt.", + "Yes": "Ja", + "No": "Nei", + "{label} (required)": "{label} (påkrevd)", + "{label} is required": "{label} er påkrevd", + "Project field": "Prosjektfelt", + "A field an admin adds to every project, such as a policy area or a contract value.": "Et felt en administrator legger til hvert prosjekt, for eksempel et politikkområde eller en kontraktverdi.", + "Key": "Nøkkel", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Det faste navnet verdien lagres under, i lower camel case. Behold det når prosjekter bruker det.", + "Label": "Etikett", + "The name people see next to the field": "Navnet folk ser ved feltet", + "What the field holds": "Hva feltet inneholder", + "Text": "Tekst", + "Number": "Tall", + "Choice": "Valg", + "Person": "Person", + "Yes or no": "Ja eller nei", + "Options": "Alternativer", + "The choices of a choice field": "Valgene i et valgfelt", + "Required": "Påkrevd", + "Whether a project must fill in the field": "Om et prosjekt må fylle ut feltet", + "Where the field appears, lowest first": "Hvor feltet vises, laveste først", + "Applies to": "Gjelder for", + "What the field is added to": "Hva feltet legges til", + "Custom fields": "Egne felt", + "The values of the project fields an admin defined, keyed by the field's key.": "Verdiene til prosjektfeltene en administrator har definert, etter feltets nøkkel.", + "Project fields": "Prosjektfelt", + "Related": "Relaterte", + "Remove link": "Fjern lenke", + "Link type": "Lenketype", + "Relates to": "Relatert til", + "Duplicates": "Dupliserer", + "Project key": "Prosjektnøkkel", + "Every task number starts with it, such as VERG-42.": "Hvert oppgavenummer begynner med den, for eksempel VERG-42.", + "This key is already used by another project.": "Denne nøkkelen brukes allerede av et annet prosjekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Bruk 2 til 10 bokstaver og sifre, som begynner med en bokstav.", + "The key cannot change once tasks carry it.": "Nøkkelen kan ikke endres når oppgaver bærer den.", + "Project saved. The existing tasks get their numbers in the background.": "Prosjektet er lagret. De eksisterende oppgavene får numrene sine i bakgrunnen.", + "Next task number": "Neste oppgavenummer", + "The number the next task of this project gets in its key. Only the system writes it.": "Nummeret den neste oppgaven i dette prosjektet får i nøkkelen sin. Bare systemet skriver det.", + "Restore {title}": "Gjenopprett {title}", + "Restore": "Gjenopprett", + "Project restored": "Prosjektet er gjenopprettet", + "Could not restore the project": "Kunne ikke gjenopprette prosjektet", + "Bring this project back to the active list.": "Flytt prosjektet tilbake til listen over aktive prosjekter.", + "Restore project": "Gjenopprett prosjekt", + "Request reason": "Begrunnelse for forespørselen", + "Why the requester needs this project. Filled in when the project is requested.": "Hvorfor den som ber om prosjektet trenger det. Fylles ut ved forespørselen.", + "Reviewed by": "Vurdert av", + "The user who approved or rejected the request.": "Brukeren som godkjente eller avviste forespørselen.", + "Reviewed at": "Vurdert", + "When the request was approved or rejected.": "Når forespørselen ble godkjent eller avvist.", + "Review note": "Vurderingsnotat", + "The reviewer's reason, shown to the requester when a request is not approved.": "Begrunnelsen fra den som vurderte, som den som ba om prosjektet ser når en forespørsel ikke godkjennes.", + "Members of these groups": "Medlemmer av disse gruppene", + "Groups that may create projects": "Grupper som kan opprette prosjekter", + "The group {group} no longer exists. Save to remove it.": "Gruppen {group} finnes ikke lenger. Lagre for å fjerne den.", + "Review project request": "Vurder prosjektforespørsel", + "Requested by": "Forespurt av", + "Why it is needed": "Hvorfor det trengs", + "Desired start date": "Ønsket startdato", + "Why is it not approved?": "Hvorfor godkjennes det ikke?", + "Give a reason. The requester sees it.": "Oppgi en begrunnelse. Den som spør, ser den.", + "Approve": "Godkjenn", + "Reject": "Avvis", + "Reject request": "Avvis forespørselen", + "The review was not saved. Try again.": "Vurderingen ble ikke lagret. Prøv igjen.", + "This project is waiting for review": "Prosjektet venter på vurdering", + "This request was not approved": "Forespørselen ble ikke godkjent", + "Reason: {note}": "Begrunnelse: {note}", + "Review request": "Vurder forespørselen", + "Request a project": "Be om et prosjekt", + "Step {step} of 2": "Trinn {step} av 2", + "Why is this project needed?": "Hvorfor trengs prosjektet?", + "Give a reason. The reviewer reads it.": "Oppgi en begrunnelse. Den som vurderer, leser den.", + "Back": "Tilbake", + "Next": "Neste", + "Send request": "Send forespørsel", + "The request was not sent. Try again.": "Forespørselen ble ikke sendt. Prøv igjen.", + "Requested": "Forespurt", + "Not approved": "Ikke godkjent", + "Your request was sent": "Forespørselen din er sendt", + "Let everyone else request a project": "La alle andre be om et prosjekt", + "Add a task": "Legg til en oppgave", + "Delete task": "Slett oppgave", + "Edit task": "Rediger oppgave", + "Write": "Skriv", + "Preview": "Forhåndsvisning", + "Markdown works here: headings, lists and links.": "Markdown fungerer her: overskrifter, lister og lenker.", + "Could not save the task. Please try again.": "Oppgaven kunne ikke lagres. Prøv igjen.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Det er ført tid på \"{title}\", så den kan ikke slettes. Du kan avbryte den i stedet: timeføringene beholdes.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Slette \"{title}\"? Koblingene til andre oppgaver fjernes også. Dette kan ikke angres.", + "Keep task": "Behold oppgave", + "Cancel task": "Avbryt oppgave", + "Only the reporter, the project owner or an admin can delete this task.": "Bare den som meldte den, prosjekteieren eller en administrator kan slette denne oppgaven.", + "Could not delete the task. Please try again.": "Oppgaven kunne ikke slettes. Prøv igjen.", + "Could not cancel the task. Please try again.": "Oppgaven kunne ikke avbrytes. Prøv igjen.", + "Responsible": "Ansvarlig", + "Also working on this": "Jobber også med dette", + "Labels": "Etiketter", + "Could not change the priority. Please try again.": "Prioriteten kunne ikke endres. Prøv igjen.", + "Other project members who work on this task alongside the person responsible.": "Andre prosjektmedlemmer som jobber med oppgaven sammen med den ansvarlige.", + "Duplicate": "Dupliser", + "Could not copy the task. Please try again.": "Oppgaven kunne ikke kopieres. Prøv igjen.", + "Subtasks": "Deloppgaver", + "{done} of {total} done": "{done} av {total} ferdige", + "Add a subtask": "Legg til en deloppgave", + "Checklist": "Sjekkliste", + "Checklist item actions": "Handlinger for sjekklistepunkt", + "Add a checklist item": "Legg til et sjekklistepunkt", + "Subtasks: {estimate} estimated, {logged} logged": "Deloppgaver: {estimate} estimert, {logged} ført", + "Total estimate: {total}": "Totalt estimat: {total}", + "Part of {title}": "Del av {title}", + "Checklist: {count} done": "Sjekkliste: {count} ferdige", + "This task has subtasks: {count}.": "Denne oppgaven har deloppgaver: {count}.", + "Keep subtasks as separate tasks": "Behold deloppgavene som egne oppgaver", + "Delete subtasks too": "Slett også deloppgavene", + "Copy of {title}": "Kopi av {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Oppgaven ble kopiert, men ikke alle deloppgavene. Sjekk kopien.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Små steg i oppgaven. Hvert punkt har en id, en tekst og om det er ferdig.", + "Open work per person and per project.": "Åpent arbeid per person og per prosjekt.", + "View": "Visning", + "By person": "Per person", + "By project": "Per prosjekt", + "Hours left": "Timer igjen", + "Tasks without an estimate": "Oppgaver uten estimat", + "Due in 14 days": "Forfaller innen 14 dager", + "Shared": "Delt", + "Unassigned": "Ikke tildelt", + "{hours} h": "{hours} t", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Viser arbeid i prosjektene du kan se. Timer teller for den ansvarlige; delte oppgaver telles uten timer.", + "No open work in these projects.": "Ikke noe åpent arbeid i disse prosjektene.", + "Open work": "Åpent arbeid", + "{count} open tasks": "{count} åpne oppgaver", + "Create a project to see capacity here.": "Opprett et prosjekt for å se kapasiteten her.", + "My tasks": "Mine oppgaver", + "Show all my tasks": "Vis alle mine oppgaver", + "No tasks assigned to you": "Du har ingen tildelte oppgaver", + "Browse projects": "Bla gjennom prosjekter", + "Later": "Senere", + "Due {date}": "Forfaller {date}", + "Could not change the status. Please try again.": "Statusen kunne ikke endres. Prøv igjen.", + "Completed today": "Fullført i dag", + "My open tasks": "Mine åpne oppgaver", + "My overdue tasks": "Mine forfalte oppgaver", + "My tasks in progress": "Mine oppgaver som pågår", + "Pin to the top": "Fest øverst", + "Unpin": "Løsne", + "Pinned": "Festet", + "Actions for {title}": "Handlinger for {title}", + "Could not save your project order. Please try again.": "Prosjektrekkefølgen din kunne ikke lagres. Prøv igjen.", + "No boards yet": "Ingen tavler ennå", + "Create a project to get a board.": "Opprett et prosjekt for å få en tavle.", + "Use the Projects page to create and manage your projects and tasks.": "Bruk siden Prosjekter til å opprette og administrere prosjektene og oppgavene dine.", + "Go to projects": "Gå til prosjekter", + "You are not a member of any projects yet.": "Du er ikke medlem av noe prosjekt ennå.", + "Could not search for users. Please try again.": "Kunne ikke søke etter brukere. Prøv igjen.", + "Project creation is restricted to administrators.": "Bare administratorer kan opprette prosjekter.", + "Only the project owner or an administrator can delete this project.": "Bare prosjekteieren eller en administrator kan slette dette prosjektet.", + "No projects are available to you yet. Ask an administrator to create one.": "Ingen prosjekter er tilgjengelige for deg ennå. Be en administrator om å opprette et.", + "Due: {date}": "Forfaller: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Oppgaver med start- eller forfallsdato vises på tidslinjen. Legg til datoer for å se dem her.", + "You do not have access to this project.": "Du har ikke tilgang til dette prosjektet.", + "Zoom level": "Zoomnivå", + "Unscheduled": "Ikke planlagt", + "Start: {date}": "Start: {date}", + "Today": "I dag", + "No scheduled tasks": "Ingen planlagte oppgaver", + "An unexpected error occurred.": "Det oppstod en uventet feil.", + "Column {number} name": "Navn på kolonne {number}", + "Failed to save creation policy": "Kunne ikke lagre retningslinjen for oppretting", + "All authenticated users": "Alle innloggede brukere", + "Control who may create new projects": "Styr hvem som kan opprette nye prosjekter", + "Administrators only": "Bare administratorer", + "Project creation": "Oppretting av prosjekter", + "Allow project creation": "Tillat oppretting av prosjekter", + "Creation policy saved successfully": "Retningslinjen for oppretting er lagret", + "Initializing…": "Starter…", + "e.g. 2h 30m, 90m, 1.5h": "f.eks. 2h 30m, 90m, 1.5h", + "Log time": "Før tid", + "Save estimate": "Lagre estimat", + "Logged: {logged}": "Ført: {logged}", + "over by {amount}": "{amount} over", + "Time tracking": "Timeføring", + "Estimate": "Estimat", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Skriv inn et gyldig estimat (f.eks. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Skriv inn en gyldig varighet (f.eks. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Timeføringen kunne ikke lagres. Prøv igjen.", + "Edit time entry": "Rediger timeføring", + "Duration": "Varighet", + "Date range": "Periode", + "Last week": "Forrige uke", + "No time logged": "Ingen tid ført", + "Log time on a task to see it here.": "Før tid på en oppgave for å se den her.", + "To date": "Til dato", + "This week": "Denne uken", + "Total: {total}": "Totalt: {total}", + "From date": "Fra dato", + "Custom range": "Egen periode", + "All time": "All tid", + "Could not delete a task, so some data may remain. Try deleting the project again.": "En oppgave kunne ikke slettes, så data kan bli liggende igjen. Slett prosjektet på nytt.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "En timeføring kunne ikke slettes, så data kan bli liggende igjen. Slett prosjektet på nytt.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "En kolonne kunne ikke slettes, så data kan bli liggende igjen. Slett prosjektet på nytt.", + "Could not delete the project. Please try again.": "Prosjektet kunne ikke slettes. Prøv igjen.", + "Notification settings": "Varslingsinnstillinger", + "Configure when due-date reminders are sent": "Angi når påminnelser om forfallsdato sendes", + "Due-date reminder lead time (hours)": "Varseltid for påminnelse om forfallsdato (timer)", + "Lead time must be between 1 and 336 hours": "Varseltiden må være mellom 1 og 336 timer", + "Reminder lead time saved successfully": "Varseltid for påminnelse lagret", + "Failed to save reminder lead time": "Kunne ikke lagre varseltiden for påminnelsen", + "Notifications": "Varsler", + "Notify me 1 day before a task's due date": "Varsle meg 1 dag før en oppgaves forfallsdato", + "Draft": "Utkast", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Om timen er et utkast bare læreren ser, blir holdt eller er avlyst.", + "New release": "Ny versjon", + "Roadmap chart. The same releases and epics are listed below.": "Veikartdiagram. De samme versjonene og epicene står i listen nedenfor.", + "Nothing on the roadmap yet": "Ingenting på veikartet ennå", + "Releases with a target date and epics with dated tasks appear here.": "Her vises versjoner med en måldato og epicer med daterte oppgaver.", + "Releases": "Versjoner", + "No releases yet": "Ingen versjoner ennå", + "Target date: {date}": "Måldato: {date}", + "No target date": "Ingen måldato", + "Edit {name}": "Rediger {name}", + "Mark {name} as released": "Merk {name} som utgitt", + "Mark as released": "Merk som utgitt", + "Epics": "Epicer", + "No epics yet. Open a task to make it an epic.": "Ingen epicer ennå. Åpne en oppgave for å gjøre den til en epic.", + "Not scheduled yet": "Ikke planlagt ennå", + "Planned": "Planlagt", + "Released": "Utgitt", + "Edit release": "Rediger versjon", + "Target date": "Måldato", + "Could not save the release. Please try again.": "Kunne ikke lagre versjonen. Prøv igjen.", + "Every task of this release is done or cancelled.": "Alle oppgavene i denne versjonen er ferdige eller avbrutt.", + "Not finished yet: {count}": "Ikke ferdige ennå: {count}", + "What happens to these tasks?": "Hva skjer med disse oppgavene?", + "Move to {name}": "Flytt til {name}", + "Remove the release": "Fjern versjonen", + "Keep it on {name}": "Behold dem på {name}", + "Could not mark the release as released. Please try again.": "Kunne ikke merke versjonen som utgitt. Prøv igjen.", + "Roadmap": "Veikart", + "Tasks or roadmap": "Oppgaver eller veikart", + "Release": "Versjon", + "Epic": "Epic", + "This task is an epic": "Denne oppgaven er en epic", + "A named, dated delivery of a project that its tasks are planned against.": "En navngitt, datert leveranse fra et prosjekt som prosjektets oppgaver planlegges mot.", + "Name of the release": "Navnet på versjonen", + "The project this release belongs to": "Prosjektet versjonen hører til", + "What this release delivers": "Hva versjonen leverer", + "When work on the release starts": "Når arbeidet med versjonen starter", + "The date the release is due": "Datoen versjonen skal være klar", + "Whether the release is planned, released or archived": "Om versjonen er planlagt, utgitt eller arkivert", + "Released on": "Utgitt", + "When the release was marked as released": "Når versjonen ble merket som utgitt", + "The release this task is planned for": "Versjonen oppgaven er planlagt for", + "Board view options": "Visningsvalg for tavlen", + "Colour cards": "Fargelegg kort", + "No colour": "Ingen farge", + "By label": "Etter etikett", + "Swimlanes": "Svømmebaner", + "No swimlanes": "Ingen svømmebaner", + "By assignee": "Etter ansvarlig", + "By epic": "Etter epic", + "No assignee": "Ikke tildelt", + "No epic": "Ingen epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kort blir i sin epic-rad. Endre epic på oppgavesiden.", + "Hand over to": "Overlever til", + "Could not save your board view. It applies until you reload.": "Tavlevisningen kunne ikke lagres. Den gjelder til du laster inn på nytt.", + "Timetable wish": "Timeplanønske", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Et ønske generatoren tar hensyn til. Et hardt ønske holder den alltid, et mykt der det går.", + "Whether the wish is about a teacher, a group, a room or one activity": "Om ønsket gjelder en lærer, en gruppe, et rom eller én aktivitet", + "Teacher": "Lærer", + "Group": "Gruppe", + "Reference": "Referanse", + "The user, group, room or activity the wish is about": "Brukeren, gruppen, rommet eller aktiviteten ønsket gjelder", + "What the wish asks for": "Hva ønsket ber om", + "Not on these periods": "Ikke i disse timene", + "Preferably not on these periods": "Helst ikke i disse timene", + "At most a number of lessons a day": "Høyst et antall timer per dag", + "No free periods between lessons": "Ingen hull mellom timene", + "Always the same room": "Alltid samme rom", + "Periods": "Timer", + "The periods of the week the wish is about, such as wed-5": "Ukens timer ønsket gjelder, for eksempel wed-5", + "Limit": "Grense", + "The most lessons a day, for a wish of that kind": "Flest timer per dag, for et ønske av den typen", + "Strength": "Styrke", + "Whether the generator must keep the wish or should keep it": "Om generatoren må eller bør holde ønsket", + "Hard": "Hardt", + "Soft": "Mykt", + "Weight": "Vekt", + "How much a soft wish counts, from 1 to 3": "Hvor mye et mykt ønske teller, fra 1 til 3", + "Why the wish exists": "Hvorfor ønsket finnes", + "Timetable scenario": "Timeplanscenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Ett ukemønster, laget av generatoren eller hentet fra dagens timeplan. Det tar vare på inndataene og hvor godt det holder ønskene.", + "The name timetablers know the scenario by": "Navnet timeplanleggerne kjenner scenarioet under", + "Whether the generator made it or it came from the current timetable": "Om generatoren laget det eller det kommer fra dagens timeplan", + "Generated": "Generert", + "From the current timetable": "Fra dagens timeplan", + "Week of": "Uke fra", + "The Monday of the first week of the window": "Mandagen i periodens første uke", + "Window start": "Periodens start", + "The first day the week pattern applies to": "Den første dagen ukemønsteret gjelder", + "Window end": "Periodens slutt", + "The last day the week pattern applies to": "Den siste dagen ukemønsteret gjelder", + "Waiting, generating, done, failed, or published as draft lessons": "Venter, genereres, ferdig, mislyktes eller publisert som utkasttimer", + "Waiting": "Venter", + "Generating": "Genereres", + "Failed": "Mislyktes", + "Published": "Publisert", + "Seed": "Frø", + "The number the generator starts from, so a run can be repeated": "Tallet generatoren starter fra, slik at en kjøring kan gjentas", + "Input": "Inndata", + "The periods, rooms, lessons and wishes the scenario was made from": "Timene, rommene, undervisningstimene og ønskene scenarioet ble laget av", + "Placements": "Plasseringer", + "Each lesson with the period and room it was given": "Hver undervisningstime med timen og rommet den fikk", + "Unplaced lessons": "Uplasserte timer", + "Lessons without a place, each with the hard wish that blocked it": "Timer uten plass, hver med det harde ønsket som stoppet den", + "Broken wishes": "Brutte ønsker", + "The wishes this scenario breaks, with the lessons that break them": "Ønskene scenarioet bryter, med timene som bryter dem", + "Measures": "Mål", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Plasserte timer, brutte ønsker, lærerhull, timer per dag og rombruk", + "Reason": "Årsak", + "Why the run failed": "Hvorfor kjøringen mislyktes", + "Published at": "Publisert", + "When the scenario was written out as draft lessons": "Når scenarioet ble skrevet ut som utkasttimer", + "Edit wish": "Rediger ønske", + "New wish": "Nytt ønske", + "Hard: the generator always keeps it": "Hardt: generatoren følger det alltid", + "Soft: the generator keeps it where it can": "Mykt: generatoren følger det der den kan", + "Weight (1 to 3)": "Vekt (1 til 3)", + "Most lessons a day": "Høyst antall timer per dag", + "Period": "Time", + "{day} period {number}": "{day} time {number}", + "Teacher (user name)": "Lærer (brukernavn)", + "Activity (group:subject)": "Aktivitet (gruppe:fag)", + "Say who or what the wish is about.": "Oppgi hvem eller hva ønsket gjelder.", + "Choose at least one period.": "Velg minst én time.", + "The limit is a whole number of 1 or more.": "Grensen er et heltall på 1 eller mer.", + "Timetable": "Timeplan", + "Wishes": "Ønsker", + "Timetable wishes": "Timeplanønsker", + "Generator run": "Generatorkjøring", + "Generator progress": "Generatorens fremdrift", + "The run failed: {reason}": "Kjøringen mislyktes: {reason}", + "{placed} of {lessons} lessons placed": "{placed} av {lessons} timer plassert", + "Generate again": "Generer på nytt", + "Generate": "Generer", + "Every lesson has a place.": "Hver time har en plass.", + "Lesson": "Time", + "No free period and room": "Ingen ledig time og rom", + "Broken soft wishes": "Brutte myke ønsker", + "Every soft wish is kept.": "Hvert mykt ønske er holdt.", + "Wish": "Ønske", + "Lessons": "Timer", + "Generating: {percent}% of the time budget used": "Genererer: {percent} % av tiden brukt", + "Waiting to start": "Venter på start", + "Published as draft lessons": "Publisert som utkast til timer", + "Could not read the scenario.": "Kunne ikke lese scenariet.", + "Could not start the run.": "Kunne ikke starte kjøringen.", + "Scenarios": "Scenarier", + "Timetable scenarios": "Timeplanscenarier", + "Scenario": "Scenario", + "Take the current timetable": "Bruk den gjeldende timeplanen", + "Could not take the current timetable.": "Kunne ikke hente den gjeldende timeplanen.", + "Broken hard wishes": "Brutte harde ønsker", + "Not on a period of the week grid": "Ikke på en time i ukerutenettet", + "Compare scenarios": "Sammenlign scenarier", + "Scenarios to compare": "Scenarier å sammenligne", + "Choose two or three scenarios to compare them.": "Velg to eller tre scenarier for å sammenligne dem.", + "Measure": "Mål", + "Best": "Best", + "Lessons that differ": "Timer som er ulike", + "No lesson differs.": "Ingen timer er ulike.", + "Not placed": "Ikke plassert", + "{period} in {room}": "{period} i {room}", + "Lessons placed": "Plasserte timer", + "Lessons without a place": "Timer uten plass", + "Clashes": "Kollisjoner", + "Hard wishes broken": "Brutte harde ønsker", + "Soft wishes broken": "Brutte myke ønsker", + "Soft wishes broken, weighted": "Brutte myke ønsker, vektet", + "Free periods between lessons, all teachers": "Hulltimer, alle lærere", + "Most free periods of one teacher": "Flest hulltimer for én lærer", + "Most lessons of one group on a day": "Flest timer for én gruppe på en dag", + "Room use": "Rombruk", + "Publish as draft lessons": "Publiser som utkasttimer", + "Draft lessons written: {count}": "Utkasttimer skrevet: {count}", + "Could not publish the scenario.": "Kunne ikke publisere scenarioet.", + "Rules": "Regler", + "Rules for {column}": "Regler for {column}", + "When a card enters this column": "Når et kort kommer inn i denne kolonnen", + "Action": "Handling", + "Set the priority": "Angi prioritet", + "Assign to": "Tildel til", + "Assign the person who moved the card": "Tildel personen som flyttet kortet", + "Remove the assignee": "Fjern ansvarlig", + "Add a label": "Legg til en etikett", + "No longer a project member": "Ikke lenger prosjektmedlem", + "This label no longer exists": "Denne etiketten finnes ikke lenger", + "Add rule": "Legg til regel", + "Remove rule": "Fjern regel", + "No rules yet. Add one to change a card when it enters this column.": "Ingen regler ennå. Legg til en for å endre et kort når det kommer inn i denne kolonnen.", + "Could not save the rules. Please try again.": "Reglene kunne ikke lagres. Prøv igjen.", + "1 rule runs when a card enters this column": "1 regel kjøres når et kort kommer inn i denne kolonnen", + "{count} rules run when a card enters this column": "{count} regler kjøres når et kort kommer inn i denne kolonnen", + "Rules applied: {changes}": "Regler brukt: {changes}", + "assigned to {name}": "tildelt {name}", + "assignee removed": "ansvarlig fjernet", + "priority {priority}": "prioritet {priority}", + "label {label}": "etikett {label}", + "What happens to a card when it enters this column, applied in list order.": "Hva som skjer med et kort når det kommer inn i denne kolonnen, i listens rekkefølge.", + "Value": "Verdi", + "What the rule does to the card.": "Hva regelen gjør med kortet.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioriteten, bruker-ID-en eller etikett-ID-en handlingen bruker; tom for handlinger uten verdi.", + "is not": "er ikke", + "{dimension} is not": "{dimension} er ikke", + "Saved filters": "Lagrede filtre", + "No saved filters yet": "Ingen lagrede filtre ennå", + "Save filter": "Lagre filter", + "Rename \"{name}\"": "Gi nytt navn til «{name}»", + "Delete \"{name}\"": "Slett «{name}»", + "Clear filters": "Tøm filtre", + "Showing {shown} of {total} tasks": "Viser {shown} av {total} oppgaver", + "Me": "Meg", + "No date": "Ingen dato", + "Rename saved filter": "Gi nytt navn til lagret filter", + "Share with the project": "Del med prosjektet", + "Give the filter a name": "Gi filteret et navn", + "Could not save the filter. Please try again.": "Filteret kunne ikke lagres. Prøv igjen.", + "Some labels in \"{name}\" no longer exist and were left out.": "Noen etiketter i «{name}» finnes ikke lenger og er utelatt.", + "Could not delete the filter. Please try again.": "Filteret kunne ikke slettes. Prøv igjen.", + "Saved filter": "Lagret filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Et navngitt tavlefilter for ett prosjekt, privat for den som lagret det med mindre det deles med prosjektet.", + "The project whose board the filter applies to": "Prosjektet hvis tavle filteret gjelder", + "The name the filter is listed under": "Navnet filteret vises under", + "Saved by": "Lagret av", + "Nextcloud user id of the person who saved the filter": "Nextcloud-bruker-ID for den som lagret filteret", + "Shared with the project": "Delt med prosjektet", + "Whether every project member sees and applies the filter": "Om hvert prosjektmedlem ser og kan bruke filteret", + "Criteria": "Kriterier", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filteret: ansvarlig, etikett, prioritet og forfallsdato, hver med er eller er ikke og verdiene sine", + "Cross-project view": "Prosjektovergripende visning", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Et lagret utvalg av prosjekter der oppgavene vises samlet i statusbaner, delt med personene det nevner.", + "Shared with": "Delt med", + "The name the view is listed under": "Navnet visningen står oppført under", + "Nextcloud user id of the person who saved the view": "Nextcloud-bruker-ID for personen som lagret visningen", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-bruker-ID-er for personene visningen er delt med", + "The projects whose tasks the view shows, at most twenty": "Prosjektene som visningen viser oppgavene til, høyst tjue", + "1 project in this view is hidden from you.": "1 prosjekt i denne visningen er skjult for deg.", + "{count} projects in this view are hidden from you.": "{count} prosjekter i denne visningen er skjult for deg.", + "{project} has no column for {status}.": "{project} har ingen kolonne for {status}.", + "This view does not exist or is not shared with you.": "Denne visningen finnes ikke eller er ikke delt med deg.", + "\"{task}\" moved to {status}.": "\"{task}\" flyttet til {status}.", + "Project: {title}": "Prosjekt: {title}", + "Cross-project views": "Prosjektovergripende visninger", + "New view": "Ny visning", + "Edit view": "Rediger visning", + "Delete view": "Slett visning", + "Give the view a name": "Gi visningen et navn", + "Pick at least one project": "Velg minst ett prosjekt", + "A view shows at most {max} projects": "En visning viser høyst {max} prosjekter", + "Could not save the view. Please try again.": "Kunne ikke lagre visningen. Prøv igjen.", + "Could not delete the view. Please try again.": "Kunne ikke slette visningen. Prøv igjen.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Slette \"{title}\"? Prosjektene og oppgavene deres forblir som de er.", + "People see the tasks of the projects they are in, never more.": "Folk ser oppgavene i prosjektene de er med i, aldri mer.", + "No views yet. A view shows the tasks of several of your projects together.": "Ingen visninger ennå. En visning viser oppgavene fra flere av prosjektene dine samlet.", + "Projects in view: {count}": "Prosjekter i visningen: {count}", + "Notify me when a task is assigned to me": "Varsle meg når en oppgave tildeles meg", + "Also send these to me by email": "Send dem også til meg på e-post", + "Add an email address in your Nextcloud personal settings to get mail.": "Legg til en e-postadresse i de personlige Nextcloud-innstillingene dine for å få e-post.", + "Code link": "Kodelenke", + "A commit, branch, merge request or issue in a code forge that works on a task.": "En commit, gren, merge request eller sak i en kodeplattform som jobber med en oppgave.", + "The task the link belongs to": "Oppgaven lenken hører til", + "The project of the task": "Prosjektet til oppgaven", + "Task key": "Oppgavenøkkel", + "The task key the forge text named, such as VC-12": "Oppgavenøkkelen teksten i kodeplattformen nevnte, for eksempel VC-12", + "What the link points at": "Hva lenken peker på", + "Link": "Lenke", + "The address of the item in the forge": "Adressen til elementet i kodeplattformen", + "The commit message, branch name or merge request title": "Commit-meldingen, grennavnet eller tittelen på merge requesten", + "Repository": "Repository", + "The repository, such as acme/portal": "Repositoryet, for eksempel acme/portal", + "Forge id": "Id i plattformen", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Elementets egen id i kodeplattformen, for eksempel github:acme/portal#42 eller en commit-hash", + "State": "Status", + "The state of a merge request or issue": "Statusen til en merge request eller sak", + "Who made the commit or opened the merge request": "Hvem som laget committen eller åpnet merge requesten", + "When the commit was made or the merge request last changed": "Når committen ble laget eller merge requesten sist endret seg", + "Added by": "Lagt til av", + "Whether a person added the link or the integration wrote it": "Om en person la til lenken eller integrasjonen skrev den", + "Nextcloud user UIDs of project members": "Nextcloud-bruker-ID-er for prosjektmedlemmer", + "Add link": "Legg til lenke", + "Added by hand": "Lagt til for hånd", + "Branch": "Gren", + "Code": "Kode", + "Commit": "Commit", + "From the integration": "Fra integrasjonen", + "Link to a commit, branch or merge request": "Lenke til en commit, gren eller merge request", + "Merge request": "Merge request", + "Merged": "Slått sammen", + "No code linked yet. Name {key} in a commit message or paste a link.": "Ingen kode lenket ennå. Nevn {key} i en commit-melding eller lim inn en lenke.", + "No code linked yet. Paste a link to a commit or merge request.": "Ingen kode lenket ennå. Lim inn en lenke til en commit eller merge request.", + "Paste a web address that starts with https://.": "Lim inn en nettadresse som starter med https://.", + "Remove link {title}": "Fjern lenken {title}", + "The link could not be added.": "Lenken kunne ikke legges til.", + "The link could not be removed.": "Lenken kunne ikke fjernes.", + "This link is already on the task.": "Denne lenken er allerede på oppgaven.", + "Code forges": "Kodeplattformer", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Koble GitHub-commits og pull requests til oppgaver. Integriq mottar hendelsene; planninq kaller aldri GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Last ned konfigurasjonen og importer den i Integriq. Fyll deretter inn en hemmelighet i regelen \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Legg i GitHub til en webhook i repositoryet med denne adressen og samme hemmelighet. Velg innholdstypen application/json og hendelsene push og pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nevn oppgavenøkkelen, for eksempel VC-12, i en commit-melding, et grennavn eller tittelen på en pull request. Lenken vises da på den oppgaven.", + "Without Integriq, project members can still paste a link on the task page.": "Uten Integriq kan prosjektmedlemmer fortsatt lime inn en lenke på oppgavesiden.", + "Download the Integriq configuration": "Last ned Integriq-konfigurasjonen", + "Calendar": "Kalender", + "Previous": "Forrige", + "Calendar view": "Kalendervisning", + "Starts:": "Starter:", + "No tasks with a date in this month.": "Ingen oppgaver med dato denne måneden.", + "Week of {start} to {end}": "Uke fra {start} til {end}", + "My calendar": "Min kalender", + "Show as list": "Vis som liste", + "Show as calendar": "Vis som kalender", + "Open my calendar": "Åpne kalenderen min", + "Nextcloud Tasks": "Nextcloud Oppgaver", + "Show my tasks in Nextcloud Tasks": "Vis oppgavene mine i Nextcloud Oppgaver", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Oppgavene som er tildelt deg eller delt med deg, vises i en liste \"Planninq\" i Nextcloud Oppgaver og Kalender. Endringer du gjør der, erstattes ved neste endring i Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Denne serveren kan ikke skrive til Nextcloud Oppgaver, så eksporten er ikke tilgjengelig.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Administreres av Planninq. Endringer du gjør her, erstattes ved neste endring i Planninq.", + "Working days and holidays": "Arbeidsdager og helligdager", + "Dates set on the timeline skip the days that are not working days.": "Datoer satt på tidslinjen hopper over dager som ikke er arbeidsdager.", + "Working weekdays": "Ukens arbeidsdager", + "Non-working days": "Fridager", + "No non-working days yet.": "Ingen fridager ennå.", + "Add day": "Legg til dag", + "Year": "År", + "Add Dutch national holidays": "Legg til nederlandske helligdager", + "Save working days": "Lagre arbeidsdager", + "Choose at least one working weekday.": "Velg minst én arbeidsdag.", + "Working days saved.": "Arbeidsdagene er lagret.", + "Could not save the working days.": "Arbeidsdagene kunne ikke lagres.", + "New Year's Day": "Nyttårsdag", + "Easter Sunday": "Første påskedag", + "Easter Monday": "Andre påskedag", + "King's Day": "Kongens dag", + "Liberation Day": "Frigjøringsdagen", + "Ascension Day": "Kristi himmelfartsdag", + "Whit Sunday": "Første pinsedag", + "Whit Monday": "Andre pinsedag", + "Christmas Day": "Første juledag", + "Boxing Day": "Andre juledag", + "Dates of {title}": "Datoer for {title}", + "The due date cannot be before the start date.": "Forfallsdatoen kan ikke være før startdatoen.", + "{title}, from {start} to {end}": "{title}, fra {start} til {end}", + "The dates could not be saved.": "Datoene kunne ikke lagres.", + "{title} now runs from {start} to {end}": "{title} går nå fra {start} til {end}", + "Auto-scheduling": "Automatisk planlegging", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Når den er på, tilbyr en senere forfallsdato på tidslinjen å flytte oppgavene den blokkerer.", + "Move blocked tasks along when a task slips": "Flytt blokkerte oppgaver når en oppgave blir forsinket", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "På tidslinjen tilbyr en senere forfallsdato å flytte de blokkerte oppgavene. Bare \"blokkerer\"-lenker teller, og oppgaver flyttes bare senere.", + "Move the tasks that wait for {title}?": "Flytte oppgavene som venter på {title}?", + "These tasks wait for it and would start after its new due date:": "Disse oppgavene venter på den og ville starte etter den nye forfallsdatoen:", + "{count} tasks would move; the first {limit} are listed.": "{count} oppgaver ville blitt flyttet; de første {limit} vises.", + "Now": "Nå", + "After the move": "Etter flyttingen", + "Only this task": "Bare denne oppgaven", + "Move all": "Flytt alle", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stoppet ved {title}: datoene kunne ikke lagres. Oppgavene før den ble flyttet.", + "Cumulative flow": "Kumulativ flyt", + "Show as chart": "Vis som diagram", + "Show as table": "Vis som tabell", + "Tasks per column per day": "Oppgaver per kolonne per dag", + "Tasks without recorded history in this period: {count}": "Oppgaver uten registrert historikk i denne perioden: {count}", + "Lead and cycle time": "Ledetid og syklustid", + "No tasks were finished in this period.": "Ingen oppgaver ble fullført i denne perioden.", + "Finished tasks": "Fullførte oppgaver", + "Cycle time, average": "Syklustid, gjennomsnitt", + "Cycle time, 85th percentile": "Syklustid, 85. persentil", + "Lead time, average": "Ledetid, gjennomsnitt", + "Tasks whose finish time was estimated from their history: {count}": "Oppgaver der sluttiden ble anslått fra historikken: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Syklustid for hver fullførte oppgave, med gjennomsnitt og 85. persentil", + "Slowest tasks": "Tregeste oppgaver", + "cycle {cycle}, lead {lead}": "syklus {cycle}, ledetid {lead}", + "{days} days": "{days} dager", + "Could not load the flow of this project.": "Kunne ikke laste inn flyten for dette prosjektet.", + "Last {days} days": "Siste {days} dager", + "Portfolio flow": "Porteføljeflyt", + "An admin adds portfolios under Projects, Portfolios.": "En administrator legger til porteføljer under Prosjekter, Porteføljer.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Prosjekter som ikke vises, fordi høyst 50 vises om gangen: {count}", + "Could not load the flow of this portfolio.": "Kunne ikke laste inn flyten for denne porteføljen.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativ flyt og syklustid på tvers av prosjektene i en portefølje.", + "Edit report": "Rediger rapport", + "Only tasks where": "Bare oppgaver der", + "Group by": "Grupper etter", + "Display": "Visning", + "Share with everyone who can read its projects": "Del med alle som kan lese prosjektene", + "The report could not be saved.": "Rapporten kunne ikke lagres.", + "Number of tasks": "Antall oppgaver", + "Bar": "Stolpe", + "Donut": "Ring", + "Table": "Tabell", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} av {total} prosjekter i rapporten er ikke synlige for deg", + "No tasks match this report.": "Ingen oppgaver passer til rapporten.", + "None": "Ingen", + "Could not load this report.": "Kunne ikke laste inn rapporten.", + "Report": "Rapport", + "Your reports": "Dine rapporter", + "My reports": "Mine rapporter", + "Shared reports": "Delte rapporter", + "You have not built a report yet.": "Du har ikke laget noen rapport ennå.", + "Nobody has shared a report with you yet.": "Ingen har delt en rapport med deg ennå.", + "Reports you built over tasks, and the ones shared with you.": "Rapporter du har laget over oppgaver, og de som er delt med deg.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "En lagret spørring over oppgaver: hvilke prosjekter, hvilke filtre, gruppert etter hva, telt eller summert, og vist som tabell eller diagram.", + "The name the report is listed under": "Navnet rapporten står oppført under", + "What the report shows and who it is for": "Hva rapporten viser og hvem den er for", + "Nextcloud user id of the person who saved the report": "Nextcloud-bruker-id til den som lagret rapporten", + "Who can open the report": "Hvem som kan åpne rapporten", + "Only me": "Bare meg", + "Everyone who can read its projects": "Alle som kan lese prosjektene", + "The projects the report covers, at most fifty": "Prosjektene rapporten dekker, høyst femti", + "Filters": "Filtre", + "Task fields and the value each must equal": "Oppgavefelt og verdien hvert må være lik", + "The task field the report groups on": "Oppgavefeltet rapporten grupperer på", + "Count the tasks, or add up a number on them": "Tell oppgavene, eller summer et tall på dem", + "Sum": "Sum", + "Sum of": "Sum av", + "The number added up when the measure is a sum": "Tallet som summeres når målet er en sum", + "Story points": "Story points", + "Estimated duration": "Anslått varighet", + "How the report is shown": "Hvordan rapporten vises", + "Issue type": "Sakstype", + "Task fields and the value each must equal; empty when the report covers every task": "Oppgavefelt og verdien hvert felt må ha; tomt når rapporten dekker alle oppgaver", + "The status a task must have": "Statusen en oppgave må ha", + "The priority a task must have": "Prioriteten en oppgave må ha", + "The user a task must be assigned to": "Brukeren en oppgave må være tildelt", + "A label a task must carry": "En etikett en oppgave må ha", + "The board column a task must be in": "Tavlekolonnen en oppgave må stå i", + "The issue type a task must have": "Sakstypen en oppgave må ha", + "Manager groups": "Ledergrupper", + "Member groups": "Medlemsgrupper", + "Viewer groups": "Lesergrupper", + "Viewers": "Lesere", + "Owning group": "Eiergruppe", + "Nextcloud groups whose members manage the project": "Nextcloud-grupper der medlemmene leder prosjektet", + "Nextcloud groups whose members work on the project": "Nextcloud-grupper der medlemmene jobber i prosjektet", + "Nextcloud groups whose members may read the project": "Nextcloud-grupper der medlemmene kan lese prosjektet", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-brukere som leder prosjektet: innstillinger, medlemmer og arbeid", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-brukere som kan lese prosjektet og arbeidet, men ikke endre det", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud-gruppen som eier prosjektet sammen med den som opprettet det, høyst én", + "Nextcloud user ids who may read this through the project": "Nextcloud-brukere som kan lese dette gjennom prosjektet", + "Nextcloud groups whose members may change this through the project": "Nextcloud-grupper der medlemmene kan endre dette gjennom prosjektet", + "Nextcloud groups whose members may read this through the project": "Nextcloud-grupper der medlemmene kan lese dette gjennom prosjektet", + "Search for a person or a group…": "Søk etter en person eller en gruppe…", + "No one found. Your admin's sharing settings decide who you can find.": "Ingen funnet. Administratorens delingsinnstillinger bestemmer hvem du kan finne.", + "Type at least two characters": "Skriv minst to tegn", + "Everyone in this group": "Alle i denne gruppen", + "Could not search for people. Please try again.": "Kunne ikke søke etter personer. Prøv igjen.", + "Could not remove the group": "Kunne ikke fjerne gruppen", + "Only the owner and managers change who is on this project.": "Bare eieren og forvalterne endrer hvem som er med i dette prosjektet.", + "Role of {name}": "Rolle for {name}", + "Manager": "Forvalter", + "Member": "Medlem", + "Viewer": "Leser", + "Could not change the role": "Kunne ikke endre rollen", + "Owned by group: {name}": "Eies av gruppen: {name}", + "No group owns this project.": "Ingen gruppe eier dette prosjektet.", + "Owned by group": "Eies av gruppe", + "Search for a group…": "Søk etter en gruppe…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen gruppe funnet. Administratorens delingsinnstillinger avgjør hvilke grupper du kan finne.", + "No owning group": "Ingen eiergruppe", + "Could not search for groups. Please try again.": "Kunne ikke søke etter grupper. Prøv igjen.", + "Could not change the owning group": "Kunne ikke endre eiergruppen", + "You can read this project. Only its members change it.": "Du kan lese dette prosjektet. Bare medlemmene endrer det.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurset timen underviser i, for eksempel et valgfag, når skolens læringsapp kjenner det.", + "Online meeting link": "Lenke til nettimen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvor elevene blir med i timen på nett. Knappen Bli med vises bare for en https-lenke." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nb.json b/l10n/nb.json index 212a00f5..31c1d893 100644 --- a/l10n/nb.json +++ b/l10n/nb.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktive prosjekter", + "Archived projects": "Arkiverte prosjekter", + "Boards": "Tavler", + "My projects": "Mine prosjekter", + "Portfolio": "Portefølje", + "Project board": "Prosjekttavle", + "Projects I am in": "Prosjekter jeg er med i", + "Timeline": "Tidslinje", + "Timesheet": "Timeliste", + "Features & roadmap": "Funksjoner og veikart", + "Flow": "Flyt", + "Flows": "Flyter", + "Reports": "Rapporter", + "Pick a report to open it.": "Velg en rapport for å åpne den.", + "In progress": "Pågår", + "Date": "Dato", + "Due": "Frist", + "Assignee": "Tildelt", + "Who": "Hvem", + "What": "Hva", + "Minutes": "Minutter", + "Entries": "Oppføringer", + "Most recent": "Nyeste", + "Per person": "Per person", + "By status": "Etter status", + "By priority": "Etter prioritet", + "Task status": "Oppgavestatus", + "Time spent": "Brukt tid", + "Capacity": "Kapasitet", + "Due soonest": "Forfaller først", + "Minutes logged": "Registrerte minutter", + "Nothing is due": "Ingenting forfaller", + "Nothing logged yet": "Ingenting registrert ennå", + "What is open, what is blocked, and what is overdue.": "Hva som er åpent, hva som er blokkert, og hva som er forsinket.", + "How allocation is spread across the people working on projects.": "Hvordan belastningen fordeler seg på dem som jobber med prosjekter.", + "Hours logged, and the projects they went to.": "Registrerte timer og prosjektene de gikk til.", + "Billable": "Fakturerbar", + "Budget: {amount}": "Budsjett: {amount}", + "Loading projects": "Laster prosjekter", + "No projects for this client yet": "Ingen prosjekter for denne kunden ennå", + "Open in Planninq": "Åpne i Planninq", + "This project could not be found": "Dette prosjektet ble ikke funnet", + "Untitled project": "Prosjekt uten tittel", + "and {count} more": "og {count} til", + "Store": "Butikk", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installer registre, skjemaer og flyter som andre organisasjoner har publisert.", + "Work Date": "Arbeidsdato", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Kolonnehandlinger", + "Columns": "Kolonner", + "Could not remove the column. Please try again.": "Kolonnen kunne ikke fjernes. Prøv igjen.", + "Could not save the column. Please try again.": "Kolonnen kunne ikke lagres. Prøv igjen.", + "Done column": "Ferdig-kolonne", + "Edit column": "Rediger kolonne", + "Keep the card's status": "Behold kortets status", + "Move its cards to": "Flytt kortene til", + "Move left": "Flytt til venstre", + "Move right": "Flytt til høyre", + "Status of cards moved here": "Status for kort som flyttes hit", + "The last done column cannot be removed.": "Den siste ferdig-kolonnen kan ikke fjernes.", + "WIP limit": "WIP-grense", + "over limit": "over grensen", + "The status a card gets when it is moved into this column.": "Statusen et kort får når det flyttes til denne kolonnen.", + "All priorities": "Alle prioriteter", + "Could not create the task. Please try again.": "Oppgaven kunne ikke opprettes. Prøv igjen.", + "Created": "Opprettet", + "Move to backlog": "Til backlogen", + "Move to board": "Til tavlen", + "New task": "Ny oppgave", + "Nothing in the backlog": "Ingenting i backlogen", + "Rank": "Rang", + "Sort by": "Sorter etter", + "Sort by rank to reorder": "Sorter etter rang for å endre rekkefølgen", + "Task actions": "Oppgavehandlinger", + "All labels": "Alle etiketter", + "Filter tasks by label": "Filtrer oppgaver etter etikett", + "View timeline": "Vis tidslinje", + "Board": "Tavle", + "List": "Liste", + "Column": "Kolonne", + "Board or list": "Tavle eller liste", + "Log": "Logg", + "Add entry": "Legg til oppføring", + "Show": "Vis", + "No actions yet": "Ingen tiltak ennå", + "Closed": "Lukket", + "Entry actions": "Handlinger for oppføringen", + "Add action": "Legg til tiltak", + "by {author}": "av {author}", + "saved {time}": "lagret {time}", + "Attendees: {names}": "Deltakere: {names}", + "Add the first entry": "Legg til den første oppføringen", + "Issues": "Problemer", + "Lessons learned": "Lærdommer", + "Meetings": "Møter", + "Decisions": "Beslutninger", + "Actions": "Tiltak", + "Issue": "Problem", + "Lesson learned": "Lærdom", + "Meeting": "Møte", + "Decision": "Beslutning", + "About this project": "Om dette prosjektet", + "No description yet": "Ingen beskrivelse ennå", + "Start date": "Startdato", + "Not set": "Ikke angitt", + "End date": "Sluttdato", + "Progress": "Fremdrift", + "No tasks yet": "Ingen oppgaver ennå", + "Open the board": "Åpne tavlen", + "People": "Personer", + "Owner": "Eier", + "Latest log entries": "Siste oppføringer", + "Open the log": "Åpne loggen", + "{done} of {total} tasks done": "{done} av {total} oppgaver fullført", + "Edit entry": "Rediger oppføring", + "Type": "Type", + "Attendees": "Deltakere", + "Issue is closed": "Problemet er lukket", + "Could not save the entry. Please try again.": "Oppføringen kunne ikke lagres. Prøv igjen.", + "From: {title}": "Fra: {title}", + "What needs to happen": "Hva som må gjøres", + "Could not create the action. Please try again.": "Tiltaket kunne ikke opprettes. Prøv igjen.", + "The action was created but could not be linked to the entry.": "Tiltaket ble opprettet, men kunne ikke knyttes til oppføringen.", + "Project pages": "Prosjektsider", + "Overview": "Oversikt", + "Risks": "Risikoer", + "Log entry": "Loggoppføring", + "A short name for the entry": "Et kort navn på oppføringen", + "Project": "Prosjekt", + "The project this entry belongs to": "Prosjektet oppføringen hører til", + "What kind of entry this is": "Hva slags oppføring dette er", + "When it happened": "Når det skjedde", + "What happened, in Markdown": "Hva som skjedde, i Markdown", + "Whether an issue is still open": "Om et problem fortsatt er åpent", + "The people at a meeting": "Personene på et møte", + "Tasks that came out of this entry": "Oppgaver som kom ut av denne oppføringen", + "Add risk": "Legg til risiko", + "Risk": "Risiko", + "Score": "Poeng", + "Response": "Håndtering", + "Review date": "Gjennomgangsdato", + "no longer on the project": "er ikke lenger med i prosjektet", + "Edit {title}": "Rediger {title}", + "No risks recorded yet": "Ingen risikoer registrert ennå", + "Add the first risk": "Legg til den første risikoen", + "Medium": "Middels", + "Mitigating": "Reduseres", + "Occurred": "Inntruffet", + "Avoid": "Unngå", + "Reduce": "Redusere", + "Transfer": "Overføre", + "Accept": "Akseptere", + "Highest open risks": "Høyeste åpne risikoer", + "No open risks": "Ingen åpne risikoer", + "Open the risk register": "Åpne risikoregisteret", + "Edit risk": "Rediger risiko", + "What could go wrong": "Hva som kan gå galt", + "Likelihood": "Sannsynlighet", + "Impact": "Konsekvens", + "Score {score}": "Poeng {score}", + "Countermeasures": "Tiltak", + "Could not save the risk. Please try again.": "Risikoen kunne ikke lagres. Prøv igjen.", + "Risks by likelihood and impact": "Risikoer etter sannsynlighet og konsekvens", + "Risk scale": "Risikoskala", + "The levels every project scores its risks on, and where low turns into medium and high": "Nivåene hvert prosjekt vurderer risikoene sine på, og hvor lav går over i middels og høy", + "Number of levels": "Antall nivåer", + "Likelihood labels": "Etiketter for sannsynlighet", + "Impact labels": "Etiketter for konsekvens", + "Level {level}": "Nivå {level}", + "Medium from score": "Middels fra poeng", + "High from score": "Høy fra poeng", + "Risk scale saved": "Risikoskala lagret", + "1 risk uses level {level}. Change it first.": "1 risiko bruker nivå {level}. Endre den først.", + "{count} risks use level {level}. Change them first.": "{count} risikoer bruker nivå {level}. Endre dem først.", + "Every level needs a label, and high must start above medium.": "Hvert nivå trenger en etikett, og høy må starte over middels.", + "The project this risk belongs to": "Prosjektet risikoen hører til", + "The cause and the effect, in Markdown": "Årsak og virkning, i Markdown", + "Category": "Kategori", + "A free grouping, such as planning, budget or supplier": "En fri gruppering, for eksempel planlegging, budsjett eller leverandør", + "How likely it is, on the admin's risk scale": "Hvor sannsynlig det er, på administratorens risikoskala", + "How hard it would hit, on the admin's risk scale": "Hvor hardt det ville ramme, på administratorens risikoskala", + "Likelihood times impact, calculated by the server": "Sannsynlighet ganger konsekvens, beregnet av serveren", + "Where the risk stands": "Hvor risikoen står", + "The person who watches this risk": "Personen som følger med på risikoen", + "How the project answers the risk": "Hvordan prosjektet håndterer risikoen", + "What is done to prevent it or soften it, in Markdown": "Hva som gjøres for å hindre eller dempe den, i Markdown", + "When to look at this risk again": "Når risikoen skal vurderes igjen", + "Very low": "Svært lav", + "Very high": "Svært høy", + "All projects": "Alle prosjekter", + "Project status report": "Prosjektstatusrapport", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "En datert rapport om hvordan et prosjekt ligger an med penger, organisasjon, tid, informasjon, kvalitet og risiko (GROTIK-aspektene), hver med et notat.", + "The project this report is about": "Prosjektet rapporten gjelder", + "Report date": "Rapportdato", + "The day the report describes": "Dagen rapporten beskriver", + "Money": "Penger", + "How the project stands on this aspect": "Hvordan prosjektet ligger an på dette aspektet", + "On track": "I rute", + "At risk": "I fare", + "Off track": "Ute av rute", + "Money note": "Notat om penger", + "A short explanation of this status": "En kort forklaring på denne statusen", + "Organisation": "Organisasjon", + "Organisation note": "Notat om organisasjon", + "Time": "Tid", + "Time note": "Notat om tid", + "Information": "Informasjon", + "Information note": "Notat om informasjon", + "Quality": "Kvalitet", + "Quality note": "Notat om kvalitet", + "Risk note": "Notat om risiko", + "Overall": "Samlet", + "The worst of the six statuses, calculated by the server": "Den dårligste av de seks statusene, beregnet av serveren", + "Health: money": "Helse: penger", + "Copied from the newest status report": "Kopiert fra den nyeste statusrapporten", + "Health: organisation": "Helse: organisasjon", + "Health: time": "Helse: tid", + "Health: information": "Helse: informasjon", + "Health: quality": "Helse: kvalitet", + "Health: risk": "Helse: risiko", + "Health: overall": "Helse: samlet", + "Health: report date": "Helse: rapportdato", + "The date of the newest status report": "Datoen for den nyeste statusrapporten", + "New report": "Ny rapport", + "Only the project owner writes status reports.": "Bare prosjekteieren skriver statusrapporter.", + "Latest report, {date}": "Siste rapport, {date}", + "Aspect": "Aspekt", + "Note": "Notat", + "Report history": "Rapporthistorikk", + "Author": "Forfatter", + "No status reports yet": "Ingen statusrapporter ennå", + "Write the first report": "Skriv den første rapporten", + "Choose a status for every aspect to save the report.": "Velg en status for hvert aspekt for å lagre rapporten.", + "Suggested: on track.": "Forslag: i rute.", + "Suggested: at risk.": "Forslag: i fare.", + "Suggested: off track.": "Forslag: ute av rute.", + "1 task is past its due date.": "1 oppgave har passert fristen.", + "{count} tasks are past their due date.": "{count} oppgaver har passert fristen.", + "The end date has passed with 1 open task.": "Sluttdatoen er passert med 1 åpen oppgave.", + "The end date has passed with {count} open tasks.": "Sluttdatoen er passert med {count} åpne oppgaver.", + "No open task is past its due date.": "Ingen åpen oppgave har passert fristen.", + "The highest open risk, \"{title}\", scores {score}.": "Den høyeste åpne risikoen, \"{title}\", har poengsum {score}.", + "There are no open risks.": "Det finnes ingen åpne risikoer.", + "Costs are at {percent}% of the budget.": "Kostnadene er på {percent}% av budsjettet.", + "No suggestion: the project has no budget.": "Ikke noe forslag: prosjektet har ikke budsjett.", + "No suggestion: no costs are recorded for this project yet.": "Ikke noe forslag: det er ennå ikke registrert kostnader for dette prosjektet.", + "The report was not saved. Only the project owner can write status reports.": "Rapporten ble ikke lagret. Bare prosjekteieren kan skrive statusrapporter.", + "No report": "Ingen rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "En gruppe prosjekter som drives av de samme personene, for eksempel en avdeling eller et program. De ansvarlige leser hvert prosjekt i den.", + "The name of the portfolio": "Navnet på porteføljen", + "What the portfolio holds and who runs it": "Hva porteføljen inneholder og hvem som driver den", + "A colour for the portfolio's section in project lists": "En farge for porteføljens del i prosjektlister", + "Managers": "Ansvarlige", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-bruker-ID-er for personene som driver porteføljen", + "Order": "Rekkefølge", + "Where the portfolio comes in project lists, lowest first": "Hvor porteføljen står i prosjektlister, laveste først", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Porteføljens egen risikoskala som JSON, i samme form som skalaen for hele appen. Tom betyr skalaen for hele appen.", + "Portfolio readers": "Porteføljelesere", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-bruker-ID-er for de ansvarlige for prosjektets portefølje", + "The portfolio this project belongs to": "Porteføljen dette prosjektet hører til", + "No portfolio": "Ingen portefølje", + "All portfolios": "Alle porteføljer", + "You read this project as a manager of its portfolio. Only its members change it.": "Du leser dette prosjektet som ansvarlig for porteføljen. Bare medlemmene endrer det.", + "Portfolios": "Porteføljer", + "Portfolio status": "Porteføljestatus", + "No portfolios yet": "Ingen porteføljer ennå", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "En administrator legger til porteføljer under Prosjekter, Porteføljer. Prosjekter i en portefølje vises her med status.", + "Roll-up": "Oppsummering", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} i rute, {atRisk} i fare, {offTrack} ute av rute, {noReport} uten rapport", + "No project in this portfolio that you can read.": "Ingen prosjekter i denne porteføljen som du kan lese.", + "Start": "Start", + "End": "Slutt", + "Budget": "Budsjett", + "Last report": "Siste rapport", + "Out of date": "Utdatert", + "Portfolio timeline": "Porteføljetidslinje", + "Zoom": "Zoom", + "Could not load the timeline": "Kunne ikke laste tidslinjen", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "En administrator legger til porteføljer under Prosjekter, Porteføljer. Prosjekter i en portefølje vises her på én tidslinje.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Åpne et prosjekt for å se faser og oppgaver. Tidslinjen er skrivebeskyttet.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Utelatt fordi du ikke kan lese dem: {count} prosjekter", + "Week": "Uke", + "Day": "Dag", + "Month": "Måned", + "Please try again later.": "Prøv igjen senere.", + "Status reports": "Statusrapporter", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Etter hvor mange dager et prosjekts siste statusrapport merkes som utdatert i porteføljeoversikten", + "Reporting period (days)": "Rapporteringsperiode (dager)", + "The reporting period is a whole number of days from 1 to 365.": "Rapporteringsperioden er et helt antall dager fra 1 til 365.", + "Reporting period saved": "Rapporteringsperiode lagret", + "The reporting period was not saved. Please try again.": "Rapporteringsperioden ble ikke lagret. Prøv igjen.", + "Every project of a portfolio with its status per aspect, rolled up.": "Hvert prosjekt i en portefølje med status per aspekt, oppsummert.", + "The projects of a portfolio on one timeline.": "Prosjektene i en portefølje på én tidslinje.", + "Phases": "Faser", + "Add phase": "Legg til fase", + "No phases yet": "Ingen faser ennå", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Del prosjektet inn i faser, som initiering, definisjon og gjennomføring. En fase lukkes når det avsluttende dokumentet er lastet opp.", + "{hours} hours": "{hours} timer", + "Concluding document: {title}": "Avsluttende dokument: {title}", + "Concluding document missing": "Avsluttende dokument mangler", + "Move {title} up": "Flytt {title} opp", + "Move {title} down": "Flytt {title} ned", + "Close phase": "Lukk fase", + "Phase": "Fase", + "Files": "Filer", + "Notes": "Notater", + "Audit trail": "Revisjonsspor", + "Edit phase": "Rediger fase", + "Name": "Navn", + "Budget hours": "Budsjettimer", + "Could not save the phase. Please try again.": "Kunne ikke lagre fasen. Prøv igjen.", + "Close phase {title}": "Lukk fasen {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "En fase lukkes med det avsluttende dokumentet: last det opp her eller velg en av fasens filer.", + "Concluding document": "Avsluttende dokument", + "This phase has no files yet.": "Denne fasen har ingen filer ennå.", + "Upload a document": "Last opp et dokument", + "The document was not uploaded. Please try again.": "Dokumentet ble ikke lastet opp. Prøv igjen.", + "Upload the concluding document before you close this phase.": "Last opp det avsluttende dokumentet før du lukker denne fasen.", + "This phase cannot be closed from its current status.": "Denne fasen kan ikke lukkes fra sin nåværende status.", + "The phase was not closed. Please try again.": "Fasen ble ikke lukket. Prøv igjen.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID-en til filen på denne fasen som avslutter den. Fasen kan først fullføres når den er satt og filen er vedlagt.", + "Import from Microsoft Project": "Importer fra Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Velg en plan lagret fra Microsoft Project i XML-format. Ingenting importeres før du bekrefter.", + "Plan file": "Planfil", + "What the import creates": "Hva importen oppretter", + "Tasks": "Oppgaver", + "Sub-tasks": "Underoppgaver", + "Milestones": "Milepæler", + "Links": "Koblinger", + "Already imported, updated in place: {count}": "Allerede importert, oppdatert på stedet: {count}", + "What does not carry over": "Hva som ikke blir med", + "Tasks with resources, which are not imported: {count}": "Oppgaver med ressurser, som ikke importeres: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Oppgaver dypere enn nivå 3, plassert under oppgaven sin på nivå 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Koblinger utenom slutt-til-start, importert som relaterte koblinger: {count}", + "Link lags, which are dropped: {count}": "Forsinkelser på koblinger, som droppes: {count}", + "Links to a summary task, which are not imported: {count}": "Koblinger til en sammendragsoppgave, som ikke importeres: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Koblinger til oppgaver utenfor denne planen, som ikke importeres: {count}", + "No longer in the plan": "Ikke lenger i planen", + "These stay in the project; remove them yourself if they are no longer needed.": "Disse blir i prosjektet; fjern dem selv hvis de ikke lenger trengs.", + "Import": "Importer", + "Close": "Lukk", + "The plan is imported: {created} created, {updated} updated.": "Planen er importert: {created} opprettet, {updated} oppdatert.", + "Links that would close a loop were left out: {count}": "Koblinger som ville lukket en sløyfe, ble utelatt: {count}", + "The import stopped part-way. Run it again to finish it.": "Importen stoppet underveis. Kjør den på nytt for å fullføre den.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Lagre planen i Microsoft Project med Fil, Lagre som, XML-format, og importer den filen.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Denne filen deklarerer en DOCTYPE eller entiteter, som ikke godtas.", + "The file is larger than 10 MB.": "Filen er større enn 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Planen har mer enn 2 000 oppgaver, flere enn én import tar.", + "This file is not a Microsoft Project plan in XML format.": "Denne filen er ikke en Microsoft Project-plan i XML-format.", + "Choose a file to import.": "Velg en fil å importere.", + "Only the project owner can import a plan.": "Bare prosjekteieren kan importere en plan.", + "The plan could not be read. Please try again.": "Planen kunne ikke leses. Prøv igjen.", + "Linked case: {title}": "Tilknyttet sak: {title}", + "Linked to a case": "Knyttet til en sak", + "Hand over to case": "Overlever til sak", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopierer hver fil på prosjektet og oppgavene, og en fil som beskriver prosjektet, uendret til den tilknyttede saken.", + "{date} by {user}": "{date} av {user}", + "Files copied: {count}": "Filer kopiert: {count}", + "Files that failed: {names}": "Filer som feilet: {names}", + "The handover failed. Please try again.": "Overleveringen mislyktes. Prøv igjen.", + "The linked case could not be found, or you cannot open it.": "Den tilknyttede saken ble ikke funnet, eller du kan ikke åpne den.", + "Case handovers": "Overleveringer til saken", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Hver gang prosjektets filer og metadata ble overlevert til saken: når, av hvem, til hvilken sak, hver kopiert fil med sin SHA-256, og filene som feilet.", + "Finance": "Økonomi", + "Add cost line": "Legg til kostnadslinje", + "Delivery terms": "Leveransevilkår", + "Billing model": "Faktureringsmodell", + "Budget in euro": "Budsjett i euro", + "Budget in hours": "Budsjett i timer", + "Hourly rate in euro": "Timepris i euro", + "Planned start": "Planlagt start", + "Planned end": "Planlagt slutt", + "Planned dates": "Planlagte datoer", + "Budget {amount}": "Budsjett {amount}", + "No budget agreed": "Ingen budsjett avtalt", + "Hours": "Timer", + "Only the project owner and the portfolio managers see the amounts.": "Bare prosjekteieren og porteføljelederne ser beløpene.", + "Budget against cost per category": "Budsjett mot kostnader per kategori", + "Labour (booked time)": "Arbeid (registrert tid)", + "No category": "Ingen kategori", + "Hours are not available": "Timene er ikke tilgjengelige", + "Not yet assigned to a category": "Ikke tildelt en kategori ennå", + "Total": "Totalt", + "{spent} spent, {remaining} remaining": "{spent} brukt, {remaining} igjen", + "Budget against cost per phase": "Budsjett mot kostnader per fase", + "No phase": "Ingen fase", + "Cost lines": "Kostnadslinjer", + "From the finance system": "Fra økonomisystemet", + "Edit cost line {amount}": "Rediger kostnadslinjen {amount}", + "No cost lines yet": "Ingen kostnadslinjer ennå", + "Commitments": "Forpliktelser", + "Actual cost": "Faktiske kostnader", + "Forecast": "Prognose", + "Remaining": "Gjenstående", + "Not planned yet": "Ikke planlagt ennå", + "{start} to {end}": "{start} til {end}", + "The terms were not saved. Please try again.": "Vilkårene ble ikke lagret. Prøv igjen.", + "Terms saved": "Vilkår lagret", + "Fixed price": "Fastpris", + "Hourly": "Per time", + "Not billed": "Ikke fakturert", + "Commitment": "Forpliktelse", + "Edit cost line": "Rediger kostnadslinje", + "Kind": "Type", + "Amount in euro": "Beløp i euro", + "Remove": "Fjern", + "Could not save the cost line. Only the project owner changes the money of a project.": "Kunne ikke lagre kostnadslinjen. Bare prosjekteieren endrer pengene i et prosjekt.", + "Could not remove the cost line. Please try again.": "Kunne ikke fjerne kostnadslinjen. Prøv igjen.", + "{amount} over budget": "{amount} over budsjett", + "Cost categories": "Kostnadskategorier", + "The categories every project splits its budget and costs into, one per line": "Kategoriene hvert prosjekt deler budsjettet og kostnadene sine inn i, én per linje", + "Categories": "Kategorier", + "Give at least one category, each name once.": "Oppgi minst én kategori, hvert navn én gang.", + "Cost categories saved": "Kostnadskategorier lagret", + "The cost categories were not saved. Please try again.": "Kostnadskategoriene ble ikke lagret. Prøv igjen.", + "Finance line": "Økonomilinje", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Et pengebeløp på et prosjekt: et budsjett, en forpliktelse, en faktisk kostnad eller en prognose, i en kostnadskategori og eventuelt en fase. Registrert av prosjekteieren eller sendt av økonomisystemet via integrasjonsappen.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Prosjektet beløpet hører til. Tomt for en linje fra økonomisystemet der prosjektnummeret ikke passer til noe prosjekt.", + "The phase this amount belongs to, if any": "Fasen beløpet hører til, hvis noen", + "The cost category, one of the categories the admin set up": "Kostnadskategorien, en av kategoriene administratoren har satt opp", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Om beløpet er et budsjett, en forpliktelse, en faktisk kostnad eller en prognose", + "Amount": "Beløp", + "The amount in the reporting currency (euro)": "Beløpet i rapporteringsvalutaen (euro)", + "The date the amount was booked or is expected": "Datoen beløpet ble bokført eller forventes", + "What the amount is for": "Hva beløpet gjelder", + "Whether a person entered the line or the finance system sent it": "Om en person registrerte linjen eller økonomisystemet sendte den", + "Entered by hand": "Registrert for hånd", + "Finance line id": "Økonomilinjens ID", + "The finance system's own id of this line. One imported line per id.": "Linjens egen ID i økonomisystemet. Én importert linje per ID.", + "Project number": "Prosjektnummer", + "The project number the finance system sent, matched against the project key": "Prosjektnummeret økonomisystemet sendte, sammenlignet med prosjektnøkkelen", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Porteføljen til linjens prosjekt, kopiert fra prosjektet slik at porteføljetotaler trenger ett filter", + "Finance readers": "Økonomilesere", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-bruker-UID-er for personene som kan se beløpet: prosjekteieren og porteføljens ledere", + "Project owner": "Prosjekteier", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-bruker-UID for prosjekteieren, som kan endre og fjerne manuelle linjer", + "How the client pays: not billed, a fixed price, or by the hour.": "Hvordan kunden betaler: ikke fakturert, fastpris eller per time.", + "Portfolio finance": "Porteføljeøkonomi", + "You cannot see the money of any project in this portfolio": "Du kan ikke se pengene til noe prosjekt i denne porteføljen", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serveren returnerte kostnadslinjer fra prosjekter utenfor denne porteføljen, så disse totalene kan være feil.", + "Projects left out because you cannot see their money: {count}": "Prosjekter utelatt fordi du ikke kan se pengene deres: {count}", + "Unmatched finance lines": "Umatchede økonomilinjer", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budsjett, forpliktelser, faktiske kostnader og prognose summert for en portefølje.", + "Subprojects": "Delprosjekter", + "{done} of {total}": "{done} av {total}", + "{done} of {total} tasks done, including subprojects": "{done} av {total} oppgaver fullført, inkludert delprosjekter", + "Show the subprojects of {title}": "Vis delprosjektene under {title}", + "Hide the subprojects of {title}": "Skjul delprosjektene under {title}", + "Part of": "Del av", + "No parent project": "Ingen overordnet prosjekt", + "A project cannot sit under one of its own subprojects.": "Et prosjekt kan ikke ligge under et av sine egne delprosjekter.", + "Projects nest three levels deep at most: programme, project and subproject.": "Prosjekter kan ligge høyst tre nivåer dypt: program, prosjekt og delprosjekt.", + "Parent project": "Overordnet prosjekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Prosjektet dette prosjektet ligger under, for eksempel et program. Prosjekter kan ligge høyst tre nivåer dypt.", + "Yes": "Ja", + "No": "Nei", + "{label} (required)": "{label} (påkrevd)", + "{label} is required": "{label} er påkrevd", + "Project field": "Prosjektfelt", + "A field an admin adds to every project, such as a policy area or a contract value.": "Et felt en administrator legger til hvert prosjekt, for eksempel et politikkområde eller en kontraktverdi.", + "Key": "Nøkkel", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Det faste navnet verdien lagres under, i lower camel case. Behold det når prosjekter bruker det.", + "Label": "Etikett", + "The name people see next to the field": "Navnet folk ser ved feltet", + "What the field holds": "Hva feltet inneholder", + "Text": "Tekst", + "Number": "Tall", + "Choice": "Valg", + "Person": "Person", + "Yes or no": "Ja eller nei", + "Options": "Alternativer", + "The choices of a choice field": "Valgene i et valgfelt", + "Required": "Påkrevd", + "Whether a project must fill in the field": "Om et prosjekt må fylle ut feltet", + "Where the field appears, lowest first": "Hvor feltet vises, laveste først", + "Applies to": "Gjelder for", + "What the field is added to": "Hva feltet legges til", + "Custom fields": "Egne felt", + "The values of the project fields an admin defined, keyed by the field's key.": "Verdiene til prosjektfeltene en administrator har definert, etter feltets nøkkel.", + "Project fields": "Prosjektfelt", + "Related": "Relaterte", + "Remove link": "Fjern lenke", + "Link type": "Lenketype", + "Relates to": "Relatert til", + "Duplicates": "Dupliserer", + "Project key": "Prosjektnøkkel", + "Every task number starts with it, such as VERG-42.": "Hvert oppgavenummer begynner med den, for eksempel VERG-42.", + "This key is already used by another project.": "Denne nøkkelen brukes allerede av et annet prosjekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Bruk 2 til 10 bokstaver og sifre, som begynner med en bokstav.", + "The key cannot change once tasks carry it.": "Nøkkelen kan ikke endres når oppgaver bærer den.", + "Project saved. The existing tasks get their numbers in the background.": "Prosjektet er lagret. De eksisterende oppgavene får numrene sine i bakgrunnen.", + "Next task number": "Neste oppgavenummer", + "The number the next task of this project gets in its key. Only the system writes it.": "Nummeret den neste oppgaven i dette prosjektet får i nøkkelen sin. Bare systemet skriver det.", + "Restore {title}": "Gjenopprett {title}", + "Restore": "Gjenopprett", + "Project restored": "Prosjektet er gjenopprettet", + "Could not restore the project": "Kunne ikke gjenopprette prosjektet", + "Bring this project back to the active list.": "Flytt prosjektet tilbake til listen over aktive prosjekter.", + "Restore project": "Gjenopprett prosjekt", + "Request reason": "Begrunnelse for forespørselen", + "Why the requester needs this project. Filled in when the project is requested.": "Hvorfor den som ber om prosjektet trenger det. Fylles ut ved forespørselen.", + "Reviewed by": "Vurdert av", + "The user who approved or rejected the request.": "Brukeren som godkjente eller avviste forespørselen.", + "Reviewed at": "Vurdert", + "When the request was approved or rejected.": "Når forespørselen ble godkjent eller avvist.", + "Review note": "Vurderingsnotat", + "The reviewer's reason, shown to the requester when a request is not approved.": "Begrunnelsen fra den som vurderte, som den som ba om prosjektet ser når en forespørsel ikke godkjennes.", + "Members of these groups": "Medlemmer av disse gruppene", + "Groups that may create projects": "Grupper som kan opprette prosjekter", + "The group {group} no longer exists. Save to remove it.": "Gruppen {group} finnes ikke lenger. Lagre for å fjerne den.", + "Review project request": "Vurder prosjektforespørsel", + "Requested by": "Forespurt av", + "Why it is needed": "Hvorfor det trengs", + "Desired start date": "Ønsket startdato", + "Why is it not approved?": "Hvorfor godkjennes det ikke?", + "Give a reason. The requester sees it.": "Oppgi en begrunnelse. Den som spør, ser den.", + "Approve": "Godkjenn", + "Reject": "Avvis", + "Reject request": "Avvis forespørselen", + "The review was not saved. Try again.": "Vurderingen ble ikke lagret. Prøv igjen.", + "This project is waiting for review": "Prosjektet venter på vurdering", + "This request was not approved": "Forespørselen ble ikke godkjent", + "Reason: {note}": "Begrunnelse: {note}", + "Review request": "Vurder forespørselen", + "Request a project": "Be om et prosjekt", + "Step {step} of 2": "Trinn {step} av 2", + "Why is this project needed?": "Hvorfor trengs prosjektet?", + "Give a reason. The reviewer reads it.": "Oppgi en begrunnelse. Den som vurderer, leser den.", + "Back": "Tilbake", + "Next": "Neste", + "Send request": "Send forespørsel", + "The request was not sent. Try again.": "Forespørselen ble ikke sendt. Prøv igjen.", + "Requested": "Forespurt", + "Not approved": "Ikke godkjent", + "Your request was sent": "Forespørselen din er sendt", + "Let everyone else request a project": "La alle andre be om et prosjekt", + "Add a task": "Legg til en oppgave", + "Delete task": "Slett oppgave", + "Edit task": "Rediger oppgave", + "Write": "Skriv", + "Preview": "Forhåndsvisning", + "Markdown works here: headings, lists and links.": "Markdown fungerer her: overskrifter, lister og lenker.", + "Could not save the task. Please try again.": "Oppgaven kunne ikke lagres. Prøv igjen.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Det er ført tid på \"{title}\", så den kan ikke slettes. Du kan avbryte den i stedet: timeføringene beholdes.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Slette \"{title}\"? Koblingene til andre oppgaver fjernes også. Dette kan ikke angres.", + "Keep task": "Behold oppgave", + "Cancel task": "Avbryt oppgave", + "Only the reporter, the project owner or an admin can delete this task.": "Bare den som meldte den, prosjekteieren eller en administrator kan slette denne oppgaven.", + "Could not delete the task. Please try again.": "Oppgaven kunne ikke slettes. Prøv igjen.", + "Could not cancel the task. Please try again.": "Oppgaven kunne ikke avbrytes. Prøv igjen.", + "Responsible": "Ansvarlig", + "Also working on this": "Jobber også med dette", + "Labels": "Etiketter", + "Could not change the priority. Please try again.": "Prioriteten kunne ikke endres. Prøv igjen.", + "Other project members who work on this task alongside the person responsible.": "Andre prosjektmedlemmer som jobber med oppgaven sammen med den ansvarlige.", + "Duplicate": "Dupliser", + "Could not copy the task. Please try again.": "Oppgaven kunne ikke kopieres. Prøv igjen.", + "Subtasks": "Deloppgaver", + "{done} of {total} done": "{done} av {total} ferdige", + "Add a subtask": "Legg til en deloppgave", + "Checklist": "Sjekkliste", + "Checklist item actions": "Handlinger for sjekklistepunkt", + "Add a checklist item": "Legg til et sjekklistepunkt", + "Subtasks: {estimate} estimated, {logged} logged": "Deloppgaver: {estimate} estimert, {logged} ført", + "Total estimate: {total}": "Totalt estimat: {total}", + "Part of {title}": "Del av {title}", + "Checklist: {count} done": "Sjekkliste: {count} ferdige", + "This task has subtasks: {count}.": "Denne oppgaven har deloppgaver: {count}.", + "Keep subtasks as separate tasks": "Behold deloppgavene som egne oppgaver", + "Delete subtasks too": "Slett også deloppgavene", + "Copy of {title}": "Kopi av {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Oppgaven ble kopiert, men ikke alle deloppgavene. Sjekk kopien.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Små steg i oppgaven. Hvert punkt har en id, en tekst og om det er ferdig.", + "Open work per person and per project.": "Åpent arbeid per person og per prosjekt.", + "View": "Visning", + "By person": "Per person", + "By project": "Per prosjekt", + "Hours left": "Timer igjen", + "Tasks without an estimate": "Oppgaver uten estimat", + "Due in 14 days": "Forfaller innen 14 dager", + "Shared": "Delt", + "Unassigned": "Ikke tildelt", + "{hours} h": "{hours} t", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Viser arbeid i prosjektene du kan se. Timer teller for den ansvarlige; delte oppgaver telles uten timer.", + "No open work in these projects.": "Ikke noe åpent arbeid i disse prosjektene.", + "Open work": "Åpent arbeid", + "{count} open tasks": "{count} åpne oppgaver", + "Create a project to see capacity here.": "Opprett et prosjekt for å se kapasiteten her.", + "My tasks": "Mine oppgaver", + "Show all my tasks": "Vis alle mine oppgaver", + "No tasks assigned to you": "Du har ingen tildelte oppgaver", + "Browse projects": "Bla gjennom prosjekter", + "Later": "Senere", + "Due {date}": "Forfaller {date}", + "Could not change the status. Please try again.": "Statusen kunne ikke endres. Prøv igjen.", + "Completed today": "Fullført i dag", + "My open tasks": "Mine åpne oppgaver", + "My overdue tasks": "Mine forfalte oppgaver", + "My tasks in progress": "Mine oppgaver som pågår", + "Pin to the top": "Fest øverst", + "Unpin": "Løsne", + "Pinned": "Festet", + "Actions for {title}": "Handlinger for {title}", + "Could not save your project order. Please try again.": "Prosjektrekkefølgen din kunne ikke lagres. Prøv igjen.", + "No boards yet": "Ingen tavler ennå", + "Create a project to get a board.": "Opprett et prosjekt for å få en tavle.", + "Use the Projects page to create and manage your projects and tasks.": "Bruk siden Prosjekter til å opprette og administrere prosjektene og oppgavene dine.", + "Go to projects": "Gå til prosjekter", + "You are not a member of any projects yet.": "Du er ikke medlem av noe prosjekt ennå.", + "Could not search for users. Please try again.": "Kunne ikke søke etter brukere. Prøv igjen.", + "Project creation is restricted to administrators.": "Bare administratorer kan opprette prosjekter.", + "Only the project owner or an administrator can delete this project.": "Bare prosjekteieren eller en administrator kan slette dette prosjektet.", + "No projects are available to you yet. Ask an administrator to create one.": "Ingen prosjekter er tilgjengelige for deg ennå. Be en administrator om å opprette et.", + "Due: {date}": "Forfaller: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Oppgaver med start- eller forfallsdato vises på tidslinjen. Legg til datoer for å se dem her.", + "You do not have access to this project.": "Du har ikke tilgang til dette prosjektet.", + "Zoom level": "Zoomnivå", + "Unscheduled": "Ikke planlagt", + "Start: {date}": "Start: {date}", + "Today": "I dag", + "No scheduled tasks": "Ingen planlagte oppgaver", + "An unexpected error occurred.": "Det oppstod en uventet feil.", + "Column {number} name": "Navn på kolonne {number}", + "Failed to save creation policy": "Kunne ikke lagre retningslinjen for oppretting", + "All authenticated users": "Alle innloggede brukere", + "Control who may create new projects": "Styr hvem som kan opprette nye prosjekter", + "Administrators only": "Bare administratorer", + "Project creation": "Oppretting av prosjekter", + "Allow project creation": "Tillat oppretting av prosjekter", + "Creation policy saved successfully": "Retningslinjen for oppretting er lagret", + "Initializing…": "Starter…", + "e.g. 2h 30m, 90m, 1.5h": "f.eks. 2h 30m, 90m, 1.5h", + "Log time": "Før tid", + "Save estimate": "Lagre estimat", + "Logged: {logged}": "Ført: {logged}", + "over by {amount}": "{amount} over", + "Time tracking": "Timeføring", + "Estimate": "Estimat", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Skriv inn et gyldig estimat (f.eks. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Skriv inn en gyldig varighet (f.eks. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Timeføringen kunne ikke lagres. Prøv igjen.", + "Edit time entry": "Rediger timeføring", + "Duration": "Varighet", + "Date range": "Periode", + "Last week": "Forrige uke", + "No time logged": "Ingen tid ført", + "Log time on a task to see it here.": "Før tid på en oppgave for å se den her.", + "To date": "Til dato", + "This week": "Denne uken", + "Total: {total}": "Totalt: {total}", + "From date": "Fra dato", + "Custom range": "Egen periode", + "All time": "All tid", + "Could not delete a task, so some data may remain. Try deleting the project again.": "En oppgave kunne ikke slettes, så data kan bli liggende igjen. Slett prosjektet på nytt.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "En timeføring kunne ikke slettes, så data kan bli liggende igjen. Slett prosjektet på nytt.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "En kolonne kunne ikke slettes, så data kan bli liggende igjen. Slett prosjektet på nytt.", + "Could not delete the project. Please try again.": "Prosjektet kunne ikke slettes. Prøv igjen.", + "Notification settings": "Varslingsinnstillinger", + "Configure when due-date reminders are sent": "Angi når påminnelser om forfallsdato sendes", + "Due-date reminder lead time (hours)": "Varseltid for påminnelse om forfallsdato (timer)", + "Lead time must be between 1 and 336 hours": "Varseltiden må være mellom 1 og 336 timer", + "Reminder lead time saved successfully": "Varseltid for påminnelse lagret", + "Failed to save reminder lead time": "Kunne ikke lagre varseltiden for påminnelsen", + "Notifications": "Varsler", + "Notify me 1 day before a task's due date": "Varsle meg 1 dag før en oppgaves forfallsdato", + "Draft": "Utkast", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Om timen er et utkast bare læreren ser, blir holdt eller er avlyst.", + "New release": "Ny versjon", + "Roadmap chart. The same releases and epics are listed below.": "Veikartdiagram. De samme versjonene og epicene står i listen nedenfor.", + "Nothing on the roadmap yet": "Ingenting på veikartet ennå", + "Releases with a target date and epics with dated tasks appear here.": "Her vises versjoner med en måldato og epicer med daterte oppgaver.", + "Releases": "Versjoner", + "No releases yet": "Ingen versjoner ennå", + "Target date: {date}": "Måldato: {date}", + "No target date": "Ingen måldato", + "Edit {name}": "Rediger {name}", + "Mark {name} as released": "Merk {name} som utgitt", + "Mark as released": "Merk som utgitt", + "Epics": "Epicer", + "No epics yet. Open a task to make it an epic.": "Ingen epicer ennå. Åpne en oppgave for å gjøre den til en epic.", + "Not scheduled yet": "Ikke planlagt ennå", + "Planned": "Planlagt", + "Released": "Utgitt", + "Edit release": "Rediger versjon", + "Target date": "Måldato", + "Could not save the release. Please try again.": "Kunne ikke lagre versjonen. Prøv igjen.", + "Every task of this release is done or cancelled.": "Alle oppgavene i denne versjonen er ferdige eller avbrutt.", + "Not finished yet: {count}": "Ikke ferdige ennå: {count}", + "What happens to these tasks?": "Hva skjer med disse oppgavene?", + "Move to {name}": "Flytt til {name}", + "Remove the release": "Fjern versjonen", + "Keep it on {name}": "Behold dem på {name}", + "Could not mark the release as released. Please try again.": "Kunne ikke merke versjonen som utgitt. Prøv igjen.", + "Roadmap": "Veikart", + "Tasks or roadmap": "Oppgaver eller veikart", + "Release": "Versjon", + "Epic": "Epic", + "This task is an epic": "Denne oppgaven er en epic", + "A named, dated delivery of a project that its tasks are planned against.": "En navngitt, datert leveranse fra et prosjekt som prosjektets oppgaver planlegges mot.", + "Name of the release": "Navnet på versjonen", + "The project this release belongs to": "Prosjektet versjonen hører til", + "What this release delivers": "Hva versjonen leverer", + "When work on the release starts": "Når arbeidet med versjonen starter", + "The date the release is due": "Datoen versjonen skal være klar", + "Whether the release is planned, released or archived": "Om versjonen er planlagt, utgitt eller arkivert", + "Released on": "Utgitt", + "When the release was marked as released": "Når versjonen ble merket som utgitt", + "The release this task is planned for": "Versjonen oppgaven er planlagt for", + "Board view options": "Visningsvalg for tavlen", + "Colour cards": "Fargelegg kort", + "No colour": "Ingen farge", + "By label": "Etter etikett", + "Swimlanes": "Svømmebaner", + "No swimlanes": "Ingen svømmebaner", + "By assignee": "Etter ansvarlig", + "By epic": "Etter epic", + "No assignee": "Ikke tildelt", + "No epic": "Ingen epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kort blir i sin epic-rad. Endre epic på oppgavesiden.", + "Hand over to": "Overlever til", + "Could not save your board view. It applies until you reload.": "Tavlevisningen kunne ikke lagres. Den gjelder til du laster inn på nytt.", + "Timetable wish": "Timeplanønske", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Et ønske generatoren tar hensyn til. Et hardt ønske holder den alltid, et mykt der det går.", + "Whether the wish is about a teacher, a group, a room or one activity": "Om ønsket gjelder en lærer, en gruppe, et rom eller én aktivitet", + "Teacher": "Lærer", + "Group": "Gruppe", + "Reference": "Referanse", + "The user, group, room or activity the wish is about": "Brukeren, gruppen, rommet eller aktiviteten ønsket gjelder", + "What the wish asks for": "Hva ønsket ber om", + "Not on these periods": "Ikke i disse timene", + "Preferably not on these periods": "Helst ikke i disse timene", + "At most a number of lessons a day": "Høyst et antall timer per dag", + "No free periods between lessons": "Ingen hull mellom timene", + "Always the same room": "Alltid samme rom", + "Periods": "Timer", + "The periods of the week the wish is about, such as wed-5": "Ukens timer ønsket gjelder, for eksempel wed-5", + "Limit": "Grense", + "The most lessons a day, for a wish of that kind": "Flest timer per dag, for et ønske av den typen", + "Strength": "Styrke", + "Whether the generator must keep the wish or should keep it": "Om generatoren må eller bør holde ønsket", + "Hard": "Hardt", + "Soft": "Mykt", + "Weight": "Vekt", + "How much a soft wish counts, from 1 to 3": "Hvor mye et mykt ønske teller, fra 1 til 3", + "Why the wish exists": "Hvorfor ønsket finnes", + "Timetable scenario": "Timeplanscenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Ett ukemønster, laget av generatoren eller hentet fra dagens timeplan. Det tar vare på inndataene og hvor godt det holder ønskene.", + "The name timetablers know the scenario by": "Navnet timeplanleggerne kjenner scenarioet under", + "Whether the generator made it or it came from the current timetable": "Om generatoren laget det eller det kommer fra dagens timeplan", + "Generated": "Generert", + "From the current timetable": "Fra dagens timeplan", + "Week of": "Uke fra", + "The Monday of the first week of the window": "Mandagen i periodens første uke", + "Window start": "Periodens start", + "The first day the week pattern applies to": "Den første dagen ukemønsteret gjelder", + "Window end": "Periodens slutt", + "The last day the week pattern applies to": "Den siste dagen ukemønsteret gjelder", + "Waiting, generating, done, failed, or published as draft lessons": "Venter, genereres, ferdig, mislyktes eller publisert som utkasttimer", + "Waiting": "Venter", + "Generating": "Genereres", + "Failed": "Mislyktes", + "Published": "Publisert", + "Seed": "Frø", + "The number the generator starts from, so a run can be repeated": "Tallet generatoren starter fra, slik at en kjøring kan gjentas", + "Input": "Inndata", + "The periods, rooms, lessons and wishes the scenario was made from": "Timene, rommene, undervisningstimene og ønskene scenarioet ble laget av", + "Placements": "Plasseringer", + "Each lesson with the period and room it was given": "Hver undervisningstime med timen og rommet den fikk", + "Unplaced lessons": "Uplasserte timer", + "Lessons without a place, each with the hard wish that blocked it": "Timer uten plass, hver med det harde ønsket som stoppet den", + "Broken wishes": "Brutte ønsker", + "The wishes this scenario breaks, with the lessons that break them": "Ønskene scenarioet bryter, med timene som bryter dem", + "Measures": "Mål", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Plasserte timer, brutte ønsker, lærerhull, timer per dag og rombruk", + "Reason": "Årsak", + "Why the run failed": "Hvorfor kjøringen mislyktes", + "Published at": "Publisert", + "When the scenario was written out as draft lessons": "Når scenarioet ble skrevet ut som utkasttimer", + "Edit wish": "Rediger ønske", + "New wish": "Nytt ønske", + "Hard: the generator always keeps it": "Hardt: generatoren følger det alltid", + "Soft: the generator keeps it where it can": "Mykt: generatoren følger det der den kan", + "Weight (1 to 3)": "Vekt (1 til 3)", + "Most lessons a day": "Høyst antall timer per dag", + "Period": "Time", + "{day} period {number}": "{day} time {number}", + "Teacher (user name)": "Lærer (brukernavn)", + "Activity (group:subject)": "Aktivitet (gruppe:fag)", + "Say who or what the wish is about.": "Oppgi hvem eller hva ønsket gjelder.", + "Choose at least one period.": "Velg minst én time.", + "The limit is a whole number of 1 or more.": "Grensen er et heltall på 1 eller mer.", + "Timetable": "Timeplan", + "Wishes": "Ønsker", + "Timetable wishes": "Timeplanønsker", + "Generator run": "Generatorkjøring", + "Generator progress": "Generatorens fremdrift", + "The run failed: {reason}": "Kjøringen mislyktes: {reason}", + "{placed} of {lessons} lessons placed": "{placed} av {lessons} timer plassert", + "Generate again": "Generer på nytt", + "Generate": "Generer", + "Every lesson has a place.": "Hver time har en plass.", + "Lesson": "Time", + "No free period and room": "Ingen ledig time og rom", + "Broken soft wishes": "Brutte myke ønsker", + "Every soft wish is kept.": "Hvert mykt ønske er holdt.", + "Wish": "Ønske", + "Lessons": "Timer", + "Generating: {percent}% of the time budget used": "Genererer: {percent} % av tiden brukt", + "Waiting to start": "Venter på start", + "Published as draft lessons": "Publisert som utkast til timer", + "Could not read the scenario.": "Kunne ikke lese scenariet.", + "Could not start the run.": "Kunne ikke starte kjøringen.", + "Scenarios": "Scenarier", + "Timetable scenarios": "Timeplanscenarier", + "Scenario": "Scenario", + "Take the current timetable": "Bruk den gjeldende timeplanen", + "Could not take the current timetable.": "Kunne ikke hente den gjeldende timeplanen.", + "Broken hard wishes": "Brutte harde ønsker", + "Not on a period of the week grid": "Ikke på en time i ukerutenettet", + "Compare scenarios": "Sammenlign scenarier", + "Scenarios to compare": "Scenarier å sammenligne", + "Choose two or three scenarios to compare them.": "Velg to eller tre scenarier for å sammenligne dem.", + "Measure": "Mål", + "Best": "Best", + "Lessons that differ": "Timer som er ulike", + "No lesson differs.": "Ingen timer er ulike.", + "Not placed": "Ikke plassert", + "{period} in {room}": "{period} i {room}", + "Lessons placed": "Plasserte timer", + "Lessons without a place": "Timer uten plass", + "Clashes": "Kollisjoner", + "Hard wishes broken": "Brutte harde ønsker", + "Soft wishes broken": "Brutte myke ønsker", + "Soft wishes broken, weighted": "Brutte myke ønsker, vektet", + "Free periods between lessons, all teachers": "Hulltimer, alle lærere", + "Most free periods of one teacher": "Flest hulltimer for én lærer", + "Most lessons of one group on a day": "Flest timer for én gruppe på en dag", + "Room use": "Rombruk", + "Publish as draft lessons": "Publiser som utkasttimer", + "Draft lessons written: {count}": "Utkasttimer skrevet: {count}", + "Could not publish the scenario.": "Kunne ikke publisere scenarioet.", + "Rules": "Regler", + "Rules for {column}": "Regler for {column}", + "When a card enters this column": "Når et kort kommer inn i denne kolonnen", + "Action": "Handling", + "Set the priority": "Angi prioritet", + "Assign to": "Tildel til", + "Assign the person who moved the card": "Tildel personen som flyttet kortet", + "Remove the assignee": "Fjern ansvarlig", + "Add a label": "Legg til en etikett", + "No longer a project member": "Ikke lenger prosjektmedlem", + "This label no longer exists": "Denne etiketten finnes ikke lenger", + "Add rule": "Legg til regel", + "Remove rule": "Fjern regel", + "No rules yet. Add one to change a card when it enters this column.": "Ingen regler ennå. Legg til en for å endre et kort når det kommer inn i denne kolonnen.", + "Could not save the rules. Please try again.": "Reglene kunne ikke lagres. Prøv igjen.", + "1 rule runs when a card enters this column": "1 regel kjøres når et kort kommer inn i denne kolonnen", + "{count} rules run when a card enters this column": "{count} regler kjøres når et kort kommer inn i denne kolonnen", + "Rules applied: {changes}": "Regler brukt: {changes}", + "assigned to {name}": "tildelt {name}", + "assignee removed": "ansvarlig fjernet", + "priority {priority}": "prioritet {priority}", + "label {label}": "etikett {label}", + "What happens to a card when it enters this column, applied in list order.": "Hva som skjer med et kort når det kommer inn i denne kolonnen, i listens rekkefølge.", + "Value": "Verdi", + "What the rule does to the card.": "Hva regelen gjør med kortet.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioriteten, bruker-ID-en eller etikett-ID-en handlingen bruker; tom for handlinger uten verdi.", + "is not": "er ikke", + "{dimension} is not": "{dimension} er ikke", + "Saved filters": "Lagrede filtre", + "No saved filters yet": "Ingen lagrede filtre ennå", + "Save filter": "Lagre filter", + "Rename \"{name}\"": "Gi nytt navn til «{name}»", + "Delete \"{name}\"": "Slett «{name}»", + "Clear filters": "Tøm filtre", + "Showing {shown} of {total} tasks": "Viser {shown} av {total} oppgaver", + "Me": "Meg", + "No date": "Ingen dato", + "Rename saved filter": "Gi nytt navn til lagret filter", + "Share with the project": "Del med prosjektet", + "Give the filter a name": "Gi filteret et navn", + "Could not save the filter. Please try again.": "Filteret kunne ikke lagres. Prøv igjen.", + "Some labels in \"{name}\" no longer exist and were left out.": "Noen etiketter i «{name}» finnes ikke lenger og er utelatt.", + "Could not delete the filter. Please try again.": "Filteret kunne ikke slettes. Prøv igjen.", + "Saved filter": "Lagret filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Et navngitt tavlefilter for ett prosjekt, privat for den som lagret det med mindre det deles med prosjektet.", + "The project whose board the filter applies to": "Prosjektet hvis tavle filteret gjelder", + "The name the filter is listed under": "Navnet filteret vises under", + "Saved by": "Lagret av", + "Nextcloud user id of the person who saved the filter": "Nextcloud-bruker-ID for den som lagret filteret", + "Shared with the project": "Delt med prosjektet", + "Whether every project member sees and applies the filter": "Om hvert prosjektmedlem ser og kan bruke filteret", + "Criteria": "Kriterier", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filteret: ansvarlig, etikett, prioritet og forfallsdato, hver med er eller er ikke og verdiene sine", + "Cross-project view": "Prosjektovergripende visning", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Et lagret utvalg av prosjekter der oppgavene vises samlet i statusbaner, delt med personene det nevner.", + "Shared with": "Delt med", + "The name the view is listed under": "Navnet visningen står oppført under", + "Nextcloud user id of the person who saved the view": "Nextcloud-bruker-ID for personen som lagret visningen", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-bruker-ID-er for personene visningen er delt med", + "The projects whose tasks the view shows, at most twenty": "Prosjektene som visningen viser oppgavene til, høyst tjue", + "1 project in this view is hidden from you.": "1 prosjekt i denne visningen er skjult for deg.", + "{count} projects in this view are hidden from you.": "{count} prosjekter i denne visningen er skjult for deg.", + "{project} has no column for {status}.": "{project} har ingen kolonne for {status}.", + "This view does not exist or is not shared with you.": "Denne visningen finnes ikke eller er ikke delt med deg.", + "\"{task}\" moved to {status}.": "\"{task}\" flyttet til {status}.", + "Project: {title}": "Prosjekt: {title}", + "Cross-project views": "Prosjektovergripende visninger", + "New view": "Ny visning", + "Edit view": "Rediger visning", + "Delete view": "Slett visning", + "Give the view a name": "Gi visningen et navn", + "Pick at least one project": "Velg minst ett prosjekt", + "A view shows at most {max} projects": "En visning viser høyst {max} prosjekter", + "Could not save the view. Please try again.": "Kunne ikke lagre visningen. Prøv igjen.", + "Could not delete the view. Please try again.": "Kunne ikke slette visningen. Prøv igjen.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Slette \"{title}\"? Prosjektene og oppgavene deres forblir som de er.", + "People see the tasks of the projects they are in, never more.": "Folk ser oppgavene i prosjektene de er med i, aldri mer.", + "No views yet. A view shows the tasks of several of your projects together.": "Ingen visninger ennå. En visning viser oppgavene fra flere av prosjektene dine samlet.", + "Projects in view: {count}": "Prosjekter i visningen: {count}", + "Notify me when a task is assigned to me": "Varsle meg når en oppgave tildeles meg", + "Also send these to me by email": "Send dem også til meg på e-post", + "Add an email address in your Nextcloud personal settings to get mail.": "Legg til en e-postadresse i de personlige Nextcloud-innstillingene dine for å få e-post.", + "Code link": "Kodelenke", + "A commit, branch, merge request or issue in a code forge that works on a task.": "En commit, gren, merge request eller sak i en kodeplattform som jobber med en oppgave.", + "The task the link belongs to": "Oppgaven lenken hører til", + "The project of the task": "Prosjektet til oppgaven", + "Task key": "Oppgavenøkkel", + "The task key the forge text named, such as VC-12": "Oppgavenøkkelen teksten i kodeplattformen nevnte, for eksempel VC-12", + "What the link points at": "Hva lenken peker på", + "Link": "Lenke", + "The address of the item in the forge": "Adressen til elementet i kodeplattformen", + "The commit message, branch name or merge request title": "Commit-meldingen, grennavnet eller tittelen på merge requesten", + "Repository": "Repository", + "The repository, such as acme/portal": "Repositoryet, for eksempel acme/portal", + "Forge id": "Id i plattformen", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Elementets egen id i kodeplattformen, for eksempel github:acme/portal#42 eller en commit-hash", + "State": "Status", + "The state of a merge request or issue": "Statusen til en merge request eller sak", + "Who made the commit or opened the merge request": "Hvem som laget committen eller åpnet merge requesten", + "When the commit was made or the merge request last changed": "Når committen ble laget eller merge requesten sist endret seg", + "Added by": "Lagt til av", + "Whether a person added the link or the integration wrote it": "Om en person la til lenken eller integrasjonen skrev den", + "Nextcloud user UIDs of project members": "Nextcloud-bruker-ID-er for prosjektmedlemmer", + "Add link": "Legg til lenke", + "Added by hand": "Lagt til for hånd", + "Branch": "Gren", + "Code": "Kode", + "Commit": "Commit", + "From the integration": "Fra integrasjonen", + "Link to a commit, branch or merge request": "Lenke til en commit, gren eller merge request", + "Merge request": "Merge request", + "Merged": "Slått sammen", + "No code linked yet. Name {key} in a commit message or paste a link.": "Ingen kode lenket ennå. Nevn {key} i en commit-melding eller lim inn en lenke.", + "No code linked yet. Paste a link to a commit or merge request.": "Ingen kode lenket ennå. Lim inn en lenke til en commit eller merge request.", + "Paste a web address that starts with https://.": "Lim inn en nettadresse som starter med https://.", + "Remove link {title}": "Fjern lenken {title}", + "The link could not be added.": "Lenken kunne ikke legges til.", + "The link could not be removed.": "Lenken kunne ikke fjernes.", + "This link is already on the task.": "Denne lenken er allerede på oppgaven.", + "Code forges": "Kodeplattformer", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Koble GitHub-commits og pull requests til oppgaver. Integriq mottar hendelsene; planninq kaller aldri GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Last ned konfigurasjonen og importer den i Integriq. Fyll deretter inn en hemmelighet i regelen \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Legg i GitHub til en webhook i repositoryet med denne adressen og samme hemmelighet. Velg innholdstypen application/json og hendelsene push og pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nevn oppgavenøkkelen, for eksempel VC-12, i en commit-melding, et grennavn eller tittelen på en pull request. Lenken vises da på den oppgaven.", + "Without Integriq, project members can still paste a link on the task page.": "Uten Integriq kan prosjektmedlemmer fortsatt lime inn en lenke på oppgavesiden.", + "Download the Integriq configuration": "Last ned Integriq-konfigurasjonen", + "Calendar": "Kalender", + "Previous": "Forrige", + "Calendar view": "Kalendervisning", + "Starts:": "Starter:", + "No tasks with a date in this month.": "Ingen oppgaver med dato denne måneden.", + "Week of {start} to {end}": "Uke fra {start} til {end}", + "My calendar": "Min kalender", + "Show as list": "Vis som liste", + "Show as calendar": "Vis som kalender", + "Open my calendar": "Åpne kalenderen min", + "Nextcloud Tasks": "Nextcloud Oppgaver", + "Show my tasks in Nextcloud Tasks": "Vis oppgavene mine i Nextcloud Oppgaver", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Oppgavene som er tildelt deg eller delt med deg, vises i en liste \"Planninq\" i Nextcloud Oppgaver og Kalender. Endringer du gjør der, erstattes ved neste endring i Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Denne serveren kan ikke skrive til Nextcloud Oppgaver, så eksporten er ikke tilgjengelig.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Administreres av Planninq. Endringer du gjør her, erstattes ved neste endring i Planninq.", + "Working days and holidays": "Arbeidsdager og helligdager", + "Dates set on the timeline skip the days that are not working days.": "Datoer satt på tidslinjen hopper over dager som ikke er arbeidsdager.", + "Working weekdays": "Ukens arbeidsdager", + "Non-working days": "Fridager", + "No non-working days yet.": "Ingen fridager ennå.", + "Add day": "Legg til dag", + "Year": "År", + "Add Dutch national holidays": "Legg til nederlandske helligdager", + "Save working days": "Lagre arbeidsdager", + "Choose at least one working weekday.": "Velg minst én arbeidsdag.", + "Working days saved.": "Arbeidsdagene er lagret.", + "Could not save the working days.": "Arbeidsdagene kunne ikke lagres.", + "New Year's Day": "Nyttårsdag", + "Easter Sunday": "Første påskedag", + "Easter Monday": "Andre påskedag", + "King's Day": "Kongens dag", + "Liberation Day": "Frigjøringsdagen", + "Ascension Day": "Kristi himmelfartsdag", + "Whit Sunday": "Første pinsedag", + "Whit Monday": "Andre pinsedag", + "Christmas Day": "Første juledag", + "Boxing Day": "Andre juledag", + "Dates of {title}": "Datoer for {title}", + "The due date cannot be before the start date.": "Forfallsdatoen kan ikke være før startdatoen.", + "{title}, from {start} to {end}": "{title}, fra {start} til {end}", + "The dates could not be saved.": "Datoene kunne ikke lagres.", + "{title} now runs from {start} to {end}": "{title} går nå fra {start} til {end}", + "Auto-scheduling": "Automatisk planlegging", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Når den er på, tilbyr en senere forfallsdato på tidslinjen å flytte oppgavene den blokkerer.", + "Move blocked tasks along when a task slips": "Flytt blokkerte oppgaver når en oppgave blir forsinket", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "På tidslinjen tilbyr en senere forfallsdato å flytte de blokkerte oppgavene. Bare \"blokkerer\"-lenker teller, og oppgaver flyttes bare senere.", + "Move the tasks that wait for {title}?": "Flytte oppgavene som venter på {title}?", + "These tasks wait for it and would start after its new due date:": "Disse oppgavene venter på den og ville starte etter den nye forfallsdatoen:", + "{count} tasks would move; the first {limit} are listed.": "{count} oppgaver ville blitt flyttet; de første {limit} vises.", + "Now": "Nå", + "After the move": "Etter flyttingen", + "Only this task": "Bare denne oppgaven", + "Move all": "Flytt alle", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stoppet ved {title}: datoene kunne ikke lagres. Oppgavene før den ble flyttet.", + "Cumulative flow": "Kumulativ flyt", + "Show as chart": "Vis som diagram", + "Show as table": "Vis som tabell", + "Tasks per column per day": "Oppgaver per kolonne per dag", + "Tasks without recorded history in this period: {count}": "Oppgaver uten registrert historikk i denne perioden: {count}", + "Lead and cycle time": "Ledetid og syklustid", + "No tasks were finished in this period.": "Ingen oppgaver ble fullført i denne perioden.", + "Finished tasks": "Fullførte oppgaver", + "Cycle time, average": "Syklustid, gjennomsnitt", + "Cycle time, 85th percentile": "Syklustid, 85. persentil", + "Lead time, average": "Ledetid, gjennomsnitt", + "Tasks whose finish time was estimated from their history: {count}": "Oppgaver der sluttiden ble anslått fra historikken: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Syklustid for hver fullførte oppgave, med gjennomsnitt og 85. persentil", + "Slowest tasks": "Tregeste oppgaver", + "cycle {cycle}, lead {lead}": "syklus {cycle}, ledetid {lead}", + "{days} days": "{days} dager", + "Could not load the flow of this project.": "Kunne ikke laste inn flyten for dette prosjektet.", + "Last {days} days": "Siste {days} dager", + "Portfolio flow": "Porteføljeflyt", + "An admin adds portfolios under Projects, Portfolios.": "En administrator legger til porteføljer under Prosjekter, Porteføljer.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Prosjekter som ikke vises, fordi høyst 50 vises om gangen: {count}", + "Could not load the flow of this portfolio.": "Kunne ikke laste inn flyten for denne porteføljen.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativ flyt og syklustid på tvers av prosjektene i en portefølje.", + "Edit report": "Rediger rapport", + "Only tasks where": "Bare oppgaver der", + "Group by": "Grupper etter", + "Display": "Visning", + "Share with everyone who can read its projects": "Del med alle som kan lese prosjektene", + "The report could not be saved.": "Rapporten kunne ikke lagres.", + "Number of tasks": "Antall oppgaver", + "Bar": "Stolpe", + "Donut": "Ring", + "Table": "Tabell", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} av {total} prosjekter i rapporten er ikke synlige for deg", + "No tasks match this report.": "Ingen oppgaver passer til rapporten.", + "None": "Ingen", + "Could not load this report.": "Kunne ikke laste inn rapporten.", + "Report": "Rapport", + "Your reports": "Dine rapporter", + "My reports": "Mine rapporter", + "Shared reports": "Delte rapporter", + "You have not built a report yet.": "Du har ikke laget noen rapport ennå.", + "Nobody has shared a report with you yet.": "Ingen har delt en rapport med deg ennå.", + "Reports you built over tasks, and the ones shared with you.": "Rapporter du har laget over oppgaver, og de som er delt med deg.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "En lagret spørring over oppgaver: hvilke prosjekter, hvilke filtre, gruppert etter hva, telt eller summert, og vist som tabell eller diagram.", + "The name the report is listed under": "Navnet rapporten står oppført under", + "What the report shows and who it is for": "Hva rapporten viser og hvem den er for", + "Nextcloud user id of the person who saved the report": "Nextcloud-bruker-id til den som lagret rapporten", + "Who can open the report": "Hvem som kan åpne rapporten", + "Only me": "Bare meg", + "Everyone who can read its projects": "Alle som kan lese prosjektene", + "The projects the report covers, at most fifty": "Prosjektene rapporten dekker, høyst femti", + "Filters": "Filtre", + "Task fields and the value each must equal": "Oppgavefelt og verdien hvert må være lik", + "The task field the report groups on": "Oppgavefeltet rapporten grupperer på", + "Count the tasks, or add up a number on them": "Tell oppgavene, eller summer et tall på dem", + "Sum": "Sum", + "Sum of": "Sum av", + "The number added up when the measure is a sum": "Tallet som summeres når målet er en sum", + "Story points": "Story points", + "Estimated duration": "Anslått varighet", + "How the report is shown": "Hvordan rapporten vises", + "Issue type": "Sakstype", + "Task fields and the value each must equal; empty when the report covers every task": "Oppgavefelt og verdien hvert felt må ha; tomt når rapporten dekker alle oppgaver", + "The status a task must have": "Statusen en oppgave må ha", + "The priority a task must have": "Prioriteten en oppgave må ha", + "The user a task must be assigned to": "Brukeren en oppgave må være tildelt", + "A label a task must carry": "En etikett en oppgave må ha", + "The board column a task must be in": "Tavlekolonnen en oppgave må stå i", + "The issue type a task must have": "Sakstypen en oppgave må ha", + "Manager groups": "Ledergrupper", + "Member groups": "Medlemsgrupper", + "Viewer groups": "Lesergrupper", + "Viewers": "Lesere", + "Owning group": "Eiergruppe", + "Nextcloud groups whose members manage the project": "Nextcloud-grupper der medlemmene leder prosjektet", + "Nextcloud groups whose members work on the project": "Nextcloud-grupper der medlemmene jobber i prosjektet", + "Nextcloud groups whose members may read the project": "Nextcloud-grupper der medlemmene kan lese prosjektet", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-brukere som leder prosjektet: innstillinger, medlemmer og arbeid", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-brukere som kan lese prosjektet og arbeidet, men ikke endre det", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud-gruppen som eier prosjektet sammen med den som opprettet det, høyst én", + "Nextcloud user ids who may read this through the project": "Nextcloud-brukere som kan lese dette gjennom prosjektet", + "Nextcloud groups whose members may change this through the project": "Nextcloud-grupper der medlemmene kan endre dette gjennom prosjektet", + "Nextcloud groups whose members may read this through the project": "Nextcloud-grupper der medlemmene kan lese dette gjennom prosjektet", + "Search for a person or a group…": "Søk etter en person eller en gruppe…", + "No one found. Your admin's sharing settings decide who you can find.": "Ingen funnet. Administratorens delingsinnstillinger bestemmer hvem du kan finne.", + "Type at least two characters": "Skriv minst to tegn", + "Everyone in this group": "Alle i denne gruppen", + "Could not search for people. Please try again.": "Kunne ikke søke etter personer. Prøv igjen.", + "Could not remove the group": "Kunne ikke fjerne gruppen", + "Only the owner and managers change who is on this project.": "Bare eieren og forvalterne endrer hvem som er med i dette prosjektet.", + "Role of {name}": "Rolle for {name}", + "Manager": "Forvalter", + "Member": "Medlem", + "Viewer": "Leser", + "Could not change the role": "Kunne ikke endre rollen", + "Owned by group: {name}": "Eies av gruppen: {name}", + "No group owns this project.": "Ingen gruppe eier dette prosjektet.", + "Owned by group": "Eies av gruppe", + "Search for a group…": "Søk etter en gruppe…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen gruppe funnet. Administratorens delingsinnstillinger avgjør hvilke grupper du kan finne.", + "No owning group": "Ingen eiergruppe", + "Could not search for groups. Please try again.": "Kunne ikke søke etter grupper. Prøv igjen.", + "Could not change the owning group": "Kunne ikke endre eiergruppen", + "You can read this project. Only its members change it.": "Du kan lese dette prosjektet. Bare medlemmene endrer det.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurset timen underviser i, for eksempel et valgfag, når skolens læringsapp kjenner det.", + "Online meeting link": "Lenke til nettimen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Hvor elevene blir med i timen på nett. Knappen Bli med vises bare for en https-lenke." }, "plurals": {} } diff --git a/l10n/nl.js b/l10n/nl.js index 346e1328..2298fe38 100644 --- a/l10n/nl.js +++ b/l10n/nl.js @@ -1,6 +1,14 @@ OC.L10N.register( "planninq", { + "Load example data?": "Voorbeeldgegevens laden?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Voorbeeldgegevens vullen de lijsten, detailpagina’s en dashboards, zodat je de app meteen ziet werken. Kies \"Geen\" op een productieomgeving.", + "Load the example data": "Laad de voorbeeldgegevens", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Laadt wat je koos. De gegevens zijn herkenbaar voorbeeldgegevens, je kunt dit meer dan een keer uitvoeren en je kunt ze daarna verwijderen.", + "None, I will set this up myself": "Geen, ik richt dit zelf in", + "Nothing is imported. You start with an empty app and add your own data.": "Er wordt niets geïmporteerd. Je begint met een lege app en voegt zelf gegevens toe.", + "Example data": "Voorbeeldgegevens", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Voorbeeldwaarden voor elk schema dat deze app levert, gegenereerd uit de schema’s zelf. Het laat de lijsten, detailpagina’s en dashboards werkend zien in plaats van een verhaal te vertellen. Veilig om vaker uit te voeren, en je kunt het daarna verwijderen.", "Welcome": "Welkom", "A short setup to get this app ready. Nothing here is required; you can close it and come back later.": "Een korte installatie om deze app klaar te zetten. Niets hiervan is verplicht; je kunt dit sluiten en later terugkomen.", "Demo data (optional)": "Demovoorbeelddata (optioneel)", @@ -213,7 +221,1159 @@ OC.L10N.register( "Overdue": "Verlopen", "Assigned to: {user}": "Toegewezen aan: {user}", "No tasks": "Geen taken", - "Could not move the task. Please try again.": "De taak kon niet worden verplaatst. Probeer het opnieuw." + "Could not move the task. Please try again.": "De taak kon niet worden verplaatst. Probeer het opnieuw.", + "Active projects": "Actieve projecten", + "Archived projects": "Gearchiveerde projecten", + "Boards": "Borden", + "My projects": "Mijn projecten", + "Portfolio": "Portfolio", + "Project board": "Projectbord", + "Projects I am in": "Projecten waarin ik deelneem", + "Timeline": "Tijdlijn", + "Timesheet": "Urenregistratie", + "Features & roadmap": "Functies en roadmap", + "Flow": "Flow", + "Flows": "Flows", + "Reports": "Rapporten", + "Pick a report to open it.": "Kies een rapport om het te openen.", + "In progress": "In behandeling", + "Date": "Datum", + "Due": "Deadline", + "Assignee": "Toegewezen aan", + "Who": "Wie", + "What": "Wat", + "Minutes": "Minuten", + "Entries": "Regels", + "Most recent": "Meest recent", + "Per person": "Per persoon", + "By status": "Op status", + "By priority": "Op prioriteit", + "Task status": "Taakstatus", + "Time spent": "Bestede tijd", + "Capacity": "Capaciteit", + "Due soonest": "Eerst aan de beurt", + "Minutes logged": "Geregistreerde minuten", + "Nothing is due": "Er staat niets open", + "Nothing logged yet": "Nog niets geregistreerd", + "What is open, what is blocked, and what is overdue.": "Wat openstaat, wat geblokkeerd is en wat te laat is.", + "How allocation is spread across the people working on projects.": "Hoe de inzet verdeeld is over de mensen die aan projecten werken.", + "Hours logged, and the projects they went to.": "Geregistreerde uren en de projecten waaraan ze zijn besteed.", + "Billable": "Factureerbaar", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Projecten laden", + "No projects for this client yet": "Nog geen projecten voor deze klant", + "Open in Planninq": "Openen in Planninq", + "This project could not be found": "Dit project is niet gevonden", + "Untitled project": "Naamloos project", + "and {count} more": "en nog {count}", + "Store": "Store", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installeer registers, schema's en flows die andere organisaties hebben gepubliceerd.", + "Work Date": "Werkdatum", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Roosterles", + "Source id": "Bron-id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "Het id dat het roosterpakket aan deze les geeft. Een nieuwe levering met hetzelfde id en dezelfde bron werkt deze les bij in plaats van er een toe te voegen.", + "Source": "Bron", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "Het systeem dat deze les leverde, bijvoorbeeld roster-zermelo, of manual voor een les die met de hand is ingevoerd.", + "Subject": "Vak", + "The subject as the school names it.": "Het vak zoals de school het noemt.", + "The name shown for this lesson. Left empty, the subject is shown.": "De naam die bij deze les staat. Leeg gelaten, dan staat het vak er.", + "Starts at": "Begint om", + "When the lesson starts.": "Wanneer de les begint.", + "Ends at": "Eindigt om", + "When the lesson ends.": "Wanneer de les eindigt.", + "Group code": "Groepscode", + "The code the school uses for the group or class.": "De code die de school gebruikt voor de groep of klas.", + "Cohort": "Groep", + "The cohort this lesson is for, when the school code is linked to one.": "De groep waarvoor deze les is, als de schoolcode aan een groep gekoppeld is.", + "Teacher code": "Docentcode", + "The code the school uses for the teacher.": "De code die de school gebruikt voor de docent.", + "Teacher account": "Docentaccount", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "Het Nextcloud-account van de docent, als de docentcode aan een account gekoppeld is.", + "Room code": "Lokaalcode", + "The code the school uses for the room.": "De code die de school gebruikt voor het lokaal.", + "Room": "Lokaal", + "The room name shown with the lesson.": "De naam van het lokaal die bij de les staat.", + "Whether the lesson goes ahead or is cancelled.": "Of de les doorgaat of uitvalt.", + "Scheduled": "Ingepland", + "Imported at": "Geïmporteerd op", + "When this lesson was last delivered. Set by planninq.": "Wanneer deze les voor het laatst geleverd is. Planninq vult dit in.", + "Column actions": "Kolomacties", + "Columns": "Kolommen", + "Could not remove the column. Please try again.": "De kolom kon niet worden verwijderd. Probeer het opnieuw.", + "Could not save the column. Please try again.": "De kolom kon niet worden opgeslagen. Probeer het opnieuw.", + "Done column": "Klaar-kolom", + "Edit column": "Kolom bewerken", + "Keep the card's status": "Status van de kaart behouden", + "Move its cards to": "Verplaats de kaarten naar", + "Move left": "Naar links", + "Move right": "Naar rechts", + "Status of cards moved here": "Status van kaarten die hierheen gaan", + "The last done column cannot be removed.": "De laatste klaar-kolom kan niet worden verwijderd.", + "WIP limit": "WIP-limiet", + "over limit": "boven de limiet", + "The status a card gets when it is moved into this column.": "De status die een kaart krijgt als die naar deze kolom wordt verplaatst.", + "All priorities": "Alle prioriteiten", + "Could not create the task. Please try again.": "De taak kon niet worden aangemaakt. Probeer het opnieuw.", + "Created": "Aangemaakt", + "Move to backlog": "Naar de backlog", + "Move to board": "Naar het bord", + "New task": "Nieuwe taak", + "Nothing in the backlog": "Niets in de backlog", + "Rank": "Rangorde", + "Sort by": "Sorteren op", + "Sort by rank to reorder": "Sorteer op rangorde om te herschikken", + "Task actions": "Taakacties", + "All labels": "Alle labels", + "Filter tasks by label": "Taken filteren op label", + "View timeline": "Tijdlijn bekijken", + "Board": "Bord", + "List": "Lijst", + "Column": "Kolom", + "Board or list": "Bord of lijst", + "Log": "Logboek", + "Add entry": "Notitie toevoegen", + "Show": "Tonen", + "No actions yet": "Nog geen acties", + "Closed": "Gesloten", + "Entry actions": "Notitieacties", + "Add action": "Actie toevoegen", + "by {author}": "door {author}", + "saved {time}": "opgeslagen {time}", + "Attendees: {names}": "Aanwezigen: {names}", + "Add the first entry": "Eerste notitie toevoegen", + "Issues": "Issues", + "Lessons learned": "Leerpunten", + "Meetings": "Overleggen", + "Decisions": "Besluiten", + "Actions": "Acties", + "Issue": "Issue", + "Lesson learned": "Leerpunt", + "Meeting": "Overleg", + "Decision": "Besluit", + "About this project": "Over dit project", + "No description yet": "Nog geen beschrijving", + "Start date": "Startdatum", + "Not set": "Niet ingesteld", + "End date": "Einddatum", + "Progress": "Voortgang", + "No tasks yet": "Nog geen taken", + "Open the board": "Bord openen", + "People": "Mensen", + "Owner": "Eigenaar", + "Latest log entries": "Laatste notities", + "Open the log": "Logboek openen", + "{done} of {total} tasks done": "{done} van {total} taken klaar", + "Edit entry": "Notitie bewerken", + "Type": "Soort", + "Attendees": "Aanwezigen", + "Issue is closed": "Issue is gesloten", + "Could not save the entry. Please try again.": "De notitie kon niet worden opgeslagen. Probeer het opnieuw.", + "From: {title}": "Uit: {title}", + "What needs to happen": "Wat er moet gebeuren", + "Could not create the action. Please try again.": "De actie kon niet worden aangemaakt. Probeer het opnieuw.", + "The action was created but could not be linked to the entry.": "De actie is aangemaakt, maar kon niet aan de notitie worden gekoppeld.", + "Project pages": "Projectpagina's", + "Overview": "Overzicht", + "Risks": "Risico's", + "Log entry": "Logboeknotitie", + "A short name for the entry": "Een korte naam voor de notitie", + "Project": "Project", + "The project this entry belongs to": "Het project waar deze notitie bij hoort", + "What kind of entry this is": "Wat voor notitie dit is", + "When it happened": "Wanneer het gebeurde", + "What happened, in Markdown": "Wat er gebeurde, in Markdown", + "Whether an issue is still open": "Of een issue nog openstaat", + "The people at a meeting": "De mensen bij een overleg", + "Tasks that came out of this entry": "Taken die uit deze notitie voortkwamen", + "Add risk": "Risico toevoegen", + "Risk": "Risico", + "Score": "Score", + "Response": "Reactie", + "Review date": "Evaluatiedatum", + "no longer on the project": "niet meer in het project", + "Edit {title}": "{title} bewerken", + "No risks recorded yet": "Nog geen risico's vastgelegd", + "Add the first risk": "Eerste risico toevoegen", + "Medium": "Gemiddeld", + "Mitigating": "Wordt beperkt", + "Occurred": "Opgetreden", + "Avoid": "Vermijden", + "Reduce": "Beperken", + "Transfer": "Overdragen", + "Accept": "Accepteren", + "Highest open risks": "Hoogste open risico's", + "No open risks": "Geen open risico's", + "Open the risk register": "Risicoregister openen", + "Edit risk": "Risico bewerken", + "What could go wrong": "Wat er mis kan gaan", + "Likelihood": "Kans", + "Impact": "Impact", + "Score {score}": "Score {score}", + "Countermeasures": "Maatregelen", + "Could not save the risk. Please try again.": "Het risico kon niet worden opgeslagen. Probeer het opnieuw.", + "Risks by likelihood and impact": "Risico's naar kans en impact", + "Risk scale": "Risicoschaal", + "The levels every project scores its risks on, and where low turns into medium and high": "De niveaus waarop elk project zijn risico's scoort, en waar laag overgaat in gemiddeld en hoog", + "Number of levels": "Aantal niveaus", + "Likelihood labels": "Labels voor kans", + "Impact labels": "Labels voor impact", + "Level {level}": "Niveau {level}", + "Medium from score": "Gemiddeld vanaf score", + "High from score": "Hoog vanaf score", + "Risk scale saved": "Risicoschaal opgeslagen", + "1 risk uses level {level}. Change it first.": "1 risico gebruikt niveau {level}. Pas dat eerst aan.", + "{count} risks use level {level}. Change them first.": "{count} risico's gebruiken niveau {level}. Pas die eerst aan.", + "Every level needs a label, and high must start above medium.": "Elk niveau heeft een label nodig, en hoog moet boven gemiddeld beginnen.", + "The project this risk belongs to": "Het project waar dit risico bij hoort", + "The cause and the effect, in Markdown": "De oorzaak en het gevolg, in Markdown", + "Category": "Categorie", + "A free grouping, such as planning, budget or supplier": "Een vrije indeling, zoals planning, budget of leverancier", + "How likely it is, on the admin's risk scale": "Hoe waarschijnlijk het is, op de risicoschaal van de beheerder", + "How hard it would hit, on the admin's risk scale": "Hoe hard het zou aankomen, op de risicoschaal van de beheerder", + "Likelihood times impact, calculated by the server": "Kans maal impact, berekend door de server", + "Where the risk stands": "Hoe het risico ervoor staat", + "The person who watches this risk": "De persoon die dit risico in de gaten houdt", + "How the project answers the risk": "Hoe het project op het risico reageert", + "What is done to prevent it or soften it, in Markdown": "Wat er gedaan wordt om het te voorkomen of te verzachten, in Markdown", + "When to look at this risk again": "Wanneer dit risico opnieuw bekeken wordt", + "Very low": "Zeer laag", + "Very high": "Zeer hoog", + "All projects": "Alle projecten", + "Project status report": "Projectstatusrapportage", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Een gedateerde rapportage over hoe een project ervoor staat op geld, organisatie, tijd, informatie, kwaliteit en risico (de GROTIK-aspecten), elk met een toelichting.", + "The project this report is about": "Het project waar deze rapportage over gaat", + "Report date": "Rapportagedatum", + "The day the report describes": "De dag die de rapportage beschrijft", + "Money": "Geld", + "How the project stands on this aspect": "Hoe het project ervoor staat op dit aspect", + "On track": "Op koers", + "At risk": "Onder druk", + "Off track": "Uit koers", + "Money note": "Toelichting geld", + "A short explanation of this status": "Een korte toelichting op deze status", + "Organisation": "Organisatie", + "Organisation note": "Toelichting organisatie", + "Time": "Tijd", + "Time note": "Toelichting tijd", + "Information": "Informatie", + "Information note": "Toelichting informatie", + "Quality": "Kwaliteit", + "Quality note": "Toelichting kwaliteit", + "Risk note": "Toelichting risico", + "Overall": "Totaal", + "The worst of the six statuses, calculated by the server": "De slechtste van de zes statussen, berekend door de server", + "Health: money": "Gezondheid: geld", + "Copied from the newest status report": "Overgenomen uit de nieuwste statusrapportage", + "Health: organisation": "Gezondheid: organisatie", + "Health: time": "Gezondheid: tijd", + "Health: information": "Gezondheid: informatie", + "Health: quality": "Gezondheid: kwaliteit", + "Health: risk": "Gezondheid: risico", + "Health: overall": "Gezondheid: totaal", + "Health: report date": "Gezondheid: rapportagedatum", + "The date of the newest status report": "De datum van de nieuwste statusrapportage", + "New report": "Nieuwe rapportage", + "Only the project owner writes status reports.": "Alleen de projecteigenaar schrijft statusrapportages.", + "Latest report, {date}": "Laatste rapportage, {date}", + "Aspect": "Aspect", + "Note": "Toelichting", + "Report history": "Eerdere rapportages", + "Author": "Auteur", + "No status reports yet": "Nog geen statusrapportages", + "Write the first report": "Schrijf de eerste rapportage", + "Choose a status for every aspect to save the report.": "Kies voor elk aspect een status om de rapportage op te slaan.", + "Suggested: on track.": "Voorstel: op koers.", + "Suggested: at risk.": "Voorstel: onder druk.", + "Suggested: off track.": "Voorstel: uit koers.", + "1 task is past its due date.": "1 taak is over de einddatum.", + "{count} tasks are past their due date.": "{count} taken zijn over de einddatum.", + "The end date has passed with 1 open task.": "De einddatum is verstreken met 1 open taak.", + "The end date has passed with {count} open tasks.": "De einddatum is verstreken met {count} open taken.", + "No open task is past its due date.": "Geen open taak is over de einddatum.", + "The highest open risk, \"{title}\", scores {score}.": "Het hoogste open risico, \"{title}\", scoort {score}.", + "There are no open risks.": "Er zijn geen open risico's.", + "Costs are at {percent}% of the budget.": "De kosten staan op {percent}% van het budget.", + "No suggestion: the project has no budget.": "Geen voorstel: het project heeft geen budget.", + "No suggestion: no costs are recorded for this project yet.": "Geen voorstel: er zijn nog geen kosten geboekt voor dit project.", + "The report was not saved. Only the project owner can write status reports.": "De rapportage is niet opgeslagen. Alleen de projecteigenaar kan statusrapportages schrijven.", + "No report": "Geen rapportage", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Een groep projecten die door dezelfde mensen wordt gerund, zoals een afdeling of een programma. De beheerders lezen elk project erin.", + "The name of the portfolio": "De naam van het portfolio", + "What the portfolio holds and who runs it": "Wat het portfolio bevat en wie het runt", + "A colour for the portfolio's section in project lists": "Een kleur voor de sectie van het portfolio in projectlijsten", + "Managers": "Beheerders", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-gebruikers-ID's van de mensen die het portfolio runnen", + "Order": "Volgorde", + "Where the portfolio comes in project lists, lowest first": "Waar het portfolio in projectlijsten staat, laagste eerst", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "De eigen risicoschaal van dit portfolio als JSON, in dezelfde vorm als de schaal voor de hele app. Leeg betekent de schaal voor de hele app.", + "Portfolio readers": "Portfoliolezers", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-gebruikers-ID's van de beheerders van het portfolio van het project", + "The portfolio this project belongs to": "Het portfolio waar dit project bij hoort", + "No portfolio": "Geen portfolio", + "All portfolios": "Alle portfolio's", + "You read this project as a manager of its portfolio. Only its members change it.": "Je leest dit project als beheerder van het portfolio. Alleen de leden wijzigen het.", + "Portfolios": "Portfolio's", + "Portfolio status": "Portfoliostatus", + "No portfolios yet": "Nog geen portfolio's", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Een beheerder voegt portfolio's toe onder Projecten, Portfolio's. Projecten in een portfolio staan hier met hun status.", + "Roll-up": "Samenvatting", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} op koers, {atRisk} met risico, {offTrack} uit koers, {noReport} zonder rapportage", + "No project in this portfolio that you can read.": "Geen project in dit portfolio dat je kunt lezen.", + "Start": "Start", + "End": "Einde", + "Budget": "Budget", + "Last report": "Laatste rapportage", + "Out of date": "Verouderd", + "Portfolio timeline": "Portfoliotijdlijn", + "Zoom": "Zoom", + "Could not load the timeline": "De tijdlijn kon niet worden geladen", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Een beheerder voegt portfolio's toe onder Projecten, Portfolio's. Projecten in een portfolio staan hier op één tijdlijn.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Open een project om de fasen en taken te zien. De tijdlijn is alleen-lezen.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Weggelaten omdat je ze niet kunt lezen: {count} projecten", + "Week": "Week", + "Day": "Dag", + "Month": "Maand", + "Please try again later.": "Probeer het later opnieuw.", + "Status reports": "Statusrapportages", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Na hoeveel dagen de laatste statusrapportage van een project als verouderd wordt gemarkeerd in het portfolio-overzicht", + "Reporting period (days)": "Rapportageperiode (dagen)", + "The reporting period is a whole number of days from 1 to 365.": "De rapportageperiode is een heel aantal dagen van 1 tot 365.", + "Reporting period saved": "Rapportageperiode opgeslagen", + "The reporting period was not saved. Please try again.": "De rapportageperiode is niet opgeslagen. Probeer het opnieuw.", + "Every project of a portfolio with its status per aspect, rolled up.": "Elk project van een portfolio met de status per aspect, samengevat.", + "The projects of a portfolio on one timeline.": "De projecten van een portfolio op één tijdlijn.", + "Phases": "Fasen", + "Add phase": "Fase toevoegen", + "No phases yet": "Nog geen fasen", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Deel het project op in fasen, zoals initiatie, definitie en realisatie. Een fase sluit zodra het afsluitende document is geüpload.", + "{hours} hours": "{hours} uur", + "Concluding document: {title}": "Afsluitend document: {title}", + "Concluding document missing": "Afsluitend document ontbreekt", + "Move {title} up": "{title} omhoog", + "Move {title} down": "{title} omlaag", + "Close phase": "Fase afsluiten", + "Phase": "Fase", + "Files": "Bestanden", + "Notes": "Notities", + "Audit trail": "Audittrail", + "Edit phase": "Fase bewerken", + "Name": "Naam", + "Budget hours": "Budgeturen", + "Could not save the phase. Please try again.": "De fase kon niet worden opgeslagen. Probeer het opnieuw.", + "Close phase {title}": "Fase {title} afsluiten", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Een fase sluit met het afsluitende document: upload het hier of kies een van de bestanden van de fase.", + "Concluding document": "Afsluitend document", + "This phase has no files yet.": "Deze fase heeft nog geen bestanden.", + "Upload a document": "Document uploaden", + "The document was not uploaded. Please try again.": "Het document is niet geüpload. Probeer het opnieuw.", + "Upload the concluding document before you close this phase.": "Upload het afsluitende document voordat je deze fase afsluit.", + "This phase cannot be closed from its current status.": "Deze fase kan vanuit de huidige status niet worden afgesloten.", + "The phase was not closed. Please try again.": "De fase is niet afgesloten. Probeer het opnieuw.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Het id van het bestand op deze fase dat de fase afsluit. De fase kan pas worden afgerond als het is ingevuld en het bestand is bijgevoegd.", + "Import from Microsoft Project": "Importeren uit Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Kies een planning die in Microsoft Project als XML is opgeslagen. Er wordt niets geïmporteerd tot je bevestigt.", + "Plan file": "Planningsbestand", + "What the import creates": "Wat de import aanmaakt", + "Tasks": "Taken", + "Sub-tasks": "Subtaken", + "Milestones": "Mijlpalen", + "Links": "Koppelingen", + "Already imported, updated in place: {count}": "Al geïmporteerd, ter plekke bijgewerkt: {count}", + "What does not carry over": "Wat niet wordt overgenomen", + "Tasks with resources, which are not imported: {count}": "Taken met resources, die niet worden geïmporteerd: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Taken dieper dan niveau 3, geplaatst onder hun taak op niveau 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Koppelingen anders dan einde-naar-begin, geïmporteerd als gerelateerde koppelingen: {count}", + "Link lags, which are dropped: {count}": "Vertragingen op koppelingen, die vervallen: {count}", + "Links to a summary task, which are not imported: {count}": "Koppelingen naar een overzichtstaak, die niet worden geïmporteerd: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Koppelingen naar taken buiten deze planning, die niet worden geïmporteerd: {count}", + "No longer in the plan": "Niet meer in de planning", + "These stay in the project; remove them yourself if they are no longer needed.": "Deze blijven in het project; verwijder ze zelf als ze niet meer nodig zijn.", + "Import": "Importeren", + "Close": "Sluiten", + "The plan is imported: {created} created, {updated} updated.": "De planning is geïmporteerd: {created} aangemaakt, {updated} bijgewerkt.", + "Links that would close a loop were left out: {count}": "Koppelingen die een lus zouden vormen zijn weggelaten: {count}", + "The import stopped part-way. Run it again to finish it.": "De import is halverwege gestopt. Voer hem opnieuw uit om hem af te maken.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Sla de planning in Microsoft Project op via Bestand, Opslaan als, XML-indeling, en importeer dat bestand.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Dit bestand declareert een DOCTYPE of entiteiten, en die worden niet geaccepteerd.", + "The file is larger than 10 MB.": "Het bestand is groter dan 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "De planning heeft meer dan 2.000 taken, meer dan één import aankan.", + "This file is not a Microsoft Project plan in XML format.": "Dit bestand is geen Microsoft Project-planning in XML-indeling.", + "Choose a file to import.": "Kies een bestand om te importeren.", + "Only the project owner can import a plan.": "Alleen de projecteigenaar kan een planning importeren.", + "The plan could not be read. Please try again.": "De planning kon niet worden gelezen. Probeer het opnieuw.", + "Linked case: {title}": "Gekoppelde zaak: {title}", + "Linked to a case": "Gekoppeld aan een zaak", + "Hand over to case": "Overdragen aan zaak", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopieert elk bestand van het project en de taken, en een bestand dat het project beschrijft, ongewijzigd naar de gekoppelde zaak.", + "{date} by {user}": "{date} door {user}", + "Files copied: {count}": "Bestanden gekopieerd: {count}", + "Files that failed: {names}": "Mislukte bestanden: {names}", + "The handover failed. Please try again.": "De overdracht is mislukt. Probeer het opnieuw.", + "The linked case could not be found, or you cannot open it.": "De gekoppelde zaak is niet gevonden, of je kunt hem niet openen.", + "Case handovers": "Overdrachten aan de zaak", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Elke keer dat de bestanden en metadata van het project aan de zaak zijn overgedragen: wanneer, door wie, aan welke zaak, elk gekopieerd bestand met zijn SHA-256, en de bestanden die mislukten.", + "Finance": "Financiën", + "Add cost line": "Kostenregel toevoegen", + "Delivery terms": "Leveringsvoorwaarden", + "Billing model": "Factuurmodel", + "Budget in euro": "Budget in euro", + "Budget in hours": "Budget in uren", + "Hourly rate in euro": "Uurtarief in euro", + "Planned start": "Geplande start", + "Planned end": "Gepland einde", + "Planned dates": "Geplande data", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Geen budget afgesproken", + "Hours": "Uren", + "Only the project owner and the portfolio managers see the amounts.": "Alleen de projecteigenaar en de portfoliomanagers zien de bedragen.", + "Budget against cost per category": "Budget tegenover kosten per categorie", + "Labour (booked time)": "Arbeid (geboekte uren)", + "No category": "Geen categorie", + "Hours are not available": "Uren zijn niet beschikbaar", + "Not yet assigned to a category": "Nog niet aan een categorie toegewezen", + "Total": "Totaal", + "{spent} spent, {remaining} remaining": "{spent} besteed, {remaining} over", + "Budget against cost per phase": "Budget tegenover kosten per fase", + "No phase": "Geen fase", + "Cost lines": "Kostenregels", + "From the finance system": "Uit het financiële systeem", + "Edit cost line {amount}": "Kostenregel {amount} bewerken", + "No cost lines yet": "Nog geen kostenregels", + "Commitments": "Verplichtingen", + "Actual cost": "Werkelijke kosten", + "Forecast": "Prognose", + "Remaining": "Resterend", + "Not planned yet": "Nog niet gepland", + "{start} to {end}": "{start} tot {end}", + "The terms were not saved. Please try again.": "De voorwaarden zijn niet opgeslagen. Probeer het opnieuw.", + "Terms saved": "Voorwaarden opgeslagen", + "Fixed price": "Vaste prijs", + "Hourly": "Per uur", + "Not billed": "Niet gefactureerd", + "Commitment": "Verplichting", + "Edit cost line": "Kostenregel bewerken", + "Kind": "Soort", + "Amount in euro": "Bedrag in euro", + "Remove": "Verwijderen", + "Could not save the cost line. Only the project owner changes the money of a project.": "De kostenregel kon niet worden opgeslagen. Alleen de projecteigenaar wijzigt het geld van een project.", + "Could not remove the cost line. Please try again.": "De kostenregel kon niet worden verwijderd. Probeer het opnieuw.", + "{amount} over budget": "{amount} boven budget", + "Cost categories": "Kostencategorieën", + "The categories every project splits its budget and costs into, one per line": "De categorieën waarin elk project zijn budget en kosten verdeelt, één per regel", + "Categories": "Categorieën", + "Give at least one category, each name once.": "Geef minstens één categorie, elke naam één keer.", + "Cost categories saved": "Kostencategorieën opgeslagen", + "The cost categories were not saved. Please try again.": "De kostencategorieën zijn niet opgeslagen. Probeer het opnieuw.", + "Finance line": "Financiële regel", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Eén geldbedrag op een project: een budget, een verplichting, werkelijke kosten of een prognose, in een kostencategorie en eventueel een fase. Ingevoerd door de projecteigenaar, of door het financiële systeem via de integratie-app.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Het project waar dit bedrag bij hoort. Leeg voor een regel uit het financiële systeem waarvan het projectnummer bij geen project past.", + "The phase this amount belongs to, if any": "De fase waar dit bedrag bij hoort, als die er is", + "The cost category, one of the categories the admin set up": "De kostencategorie, een van de categorieën die de beheerder heeft ingesteld", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Of het bedrag een budget, een verplichting, werkelijke kosten of een prognose is", + "Amount": "Bedrag", + "The amount in the reporting currency (euro)": "Het bedrag in de rapportagevaluta (euro)", + "The date the amount was booked or is expected": "De datum waarop het bedrag is geboekt of wordt verwacht", + "What the amount is for": "Waar het bedrag voor is", + "Whether a person entered the line or the finance system sent it": "Of een persoon de regel invoerde of het financiële systeem hem stuurde", + "Entered by hand": "Met de hand ingevoerd", + "Finance line id": "Id van de financiële regel", + "The finance system's own id of this line. One imported line per id.": "Het eigen id van deze regel in het financiële systeem. Eén geïmporteerde regel per id.", + "Project number": "Projectnummer", + "The project number the finance system sent, matched against the project key": "Het projectnummer dat het financiële systeem stuurde, vergeleken met de projectsleutel", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Het portfolio van het project van de regel, overgenomen van het project zodat portfoliototalen één filter nodig hebben", + "Finance readers": "Financiële lezers", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-gebruikers-UID's van de mensen die dit bedrag mogen zien: de projecteigenaar en de managers van het portfolio", + "Project owner": "Projecteigenaar", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-gebruikers-UID van de projecteigenaar, die handmatige regels mag wijzigen en verwijderen", + "How the client pays: not billed, a fixed price, or by the hour.": "Hoe de klant betaalt: niet gefactureerd, een vaste prijs of per uur.", + "Portfolio finance": "Portfoliofinanciën", + "You cannot see the money of any project in this portfolio": "Je kunt het geld van geen enkel project in dit portfolio zien", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "De server gaf kostenregels van projecten buiten dit portfolio terug, dus deze totalen kunnen onjuist zijn.", + "Projects left out because you cannot see their money: {count}": "Weggelaten projecten omdat je hun geld niet kunt zien: {count}", + "Unmatched finance lines": "Niet-gekoppelde financiële regels", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, verplichtingen, werkelijke kosten en prognose opgeteld over een portfolio.", + "Subprojects": "Deelprojecten", + "{done} of {total}": "{done} van {total}", + "{done} of {total} tasks done, including subprojects": "{done} van {total} taken klaar, inclusief deelprojecten", + "Show the subprojects of {title}": "Deelprojecten van {title} tonen", + "Hide the subprojects of {title}": "Deelprojecten van {title} verbergen", + "Part of": "Onderdeel van", + "No parent project": "Geen bovenliggend project", + "A project cannot sit under one of its own subprojects.": "Een project kan niet onder een van zijn eigen deelprojecten vallen.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projecten nesten hooguit drie niveaus diep: programma, project en deelproject.", + "Parent project": "Bovenliggend project", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Het project waaronder dit project valt, zoals een programma. Projecten nesten hooguit drie niveaus diep.", + "Yes": "Ja", + "No": "Nee", + "{label} (required)": "{label} (verplicht)", + "{label} is required": "{label} is verplicht", + "Project field": "Projectveld", + "A field an admin adds to every project, such as a policy area or a contract value.": "Een veld dat een beheerder aan elk project toevoegt, zoals een beleidsveld of een contractwaarde.", + "Key": "Sleutel", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "De vaste naam waaronder de waarde wordt opgeslagen, in lower camel case. Houd hem gelijk zodra projecten hem gebruiken.", + "Label": "Label", + "The name people see next to the field": "De naam die mensen naast het veld zien", + "What the field holds": "Wat het veld bevat", + "Text": "Tekst", + "Number": "Getal", + "Choice": "Keuze", + "Person": "Persoon", + "Yes or no": "Ja of nee", + "Options": "Opties", + "The choices of a choice field": "De keuzes van een keuzeveld", + "Required": "Verplicht", + "Whether a project must fill in the field": "Of een project het veld moet invullen", + "Where the field appears, lowest first": "Waar het veld verschijnt, laagste eerst", + "Applies to": "Geldt voor", + "What the field is added to": "Waaraan het veld wordt toegevoegd", + "Custom fields": "Eigen velden", + "The values of the project fields an admin defined, keyed by the field's key.": "De waarden van de projectvelden die een beheerder instelde, op de sleutel van het veld.", + "Project fields": "Projectvelden", + "Related": "Gerelateerd", + "Remove link": "Koppeling verwijderen", + "Link type": "Soort koppeling", + "Relates to": "Hangt samen met", + "Duplicates": "Dupliceert", + "Project key": "Projectsleutel", + "Every task number starts with it, such as VERG-42.": "Elk taaknummer begint ermee, zoals VERG-42.", + "This key is already used by another project.": "Deze sleutel wordt al door een ander project gebruikt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Gebruik 2 tot 10 letters en cijfers, beginnend met een letter.", + "The key cannot change once tasks carry it.": "De sleutel kan niet meer veranderen zodra taken hem dragen.", + "Project saved. The existing tasks get their numbers in the background.": "Project opgeslagen. De bestaande taken krijgen op de achtergrond hun nummer.", + "Next task number": "Volgend taaknummer", + "The number the next task of this project gets in its key. Only the system writes it.": "Het nummer dat de volgende taak van dit project in zijn sleutel krijgt. Alleen het systeem schrijft het.", + "Restore {title}": "{title} herstellen", + "Restore": "Herstellen", + "Project restored": "Project hersteld", + "Could not restore the project": "Het project kon niet worden hersteld", + "Bring this project back to the active list.": "Zet dit project terug in de lijst met actieve projecten.", + "Restore project": "Project herstellen", + "Request reason": "Reden van de aanvraag", + "Why the requester needs this project. Filled in when the project is requested.": "Waarom de aanvrager dit project nodig heeft. Ingevuld bij de aanvraag.", + "Reviewed by": "Beoordeeld door", + "The user who approved or rejected the request.": "De gebruiker die de aanvraag goedkeurde of afwees.", + "Reviewed at": "Beoordeeld op", + "When the request was approved or rejected.": "Wanneer de aanvraag werd goedgekeurd of afgewezen.", + "Review note": "Toelichting van de beoordelaar", + "The reviewer's reason, shown to the requester when a request is not approved.": "De reden van de beoordelaar, die de aanvrager ziet als een aanvraag niet is goedgekeurd.", + "Members of these groups": "Leden van deze groepen", + "Groups that may create projects": "Groepen die projecten mogen aanmaken", + "The group {group} no longer exists. Save to remove it.": "De groep {group} bestaat niet meer. Sla op om hem te verwijderen.", + "Review project request": "Projectaanvraag beoordelen", + "Requested by": "Aangevraagd door", + "Why it is needed": "Waarom het nodig is", + "Desired start date": "Gewenste startdatum", + "Why is it not approved?": "Waarom wordt het niet goedgekeurd?", + "Give a reason. The requester sees it.": "Geef een reden. De aanvrager ziet die.", + "Approve": "Goedkeuren", + "Reject": "Afwijzen", + "Reject request": "Aanvraag afwijzen", + "The review was not saved. Try again.": "De beoordeling is niet opgeslagen. Probeer het opnieuw.", + "This project is waiting for review": "Dit project wacht op beoordeling", + "This request was not approved": "Deze aanvraag is niet goedgekeurd", + "Reason: {note}": "Reden: {note}", + "Review request": "Aanvraag beoordelen", + "Request a project": "Een project aanvragen", + "Step {step} of 2": "Stap {step} van 2", + "Why is this project needed?": "Waarom is dit project nodig?", + "Give a reason. The reviewer reads it.": "Geef een reden. De beoordelaar leest die.", + "Back": "Terug", + "Next": "Volgende", + "Send request": "Aanvraag versturen", + "The request was not sent. Try again.": "De aanvraag is niet verstuurd. Probeer het opnieuw.", + "Requested": "Aangevraagd", + "Not approved": "Niet goedgekeurd", + "Your request was sent": "Je aanvraag is verstuurd", + "Let everyone else request a project": "Laat alle anderen een project aanvragen", + "Add a task": "Taak toevoegen", + "Delete task": "Taak verwijderen", + "Edit task": "Taak bewerken", + "Write": "Schrijven", + "Preview": "Voorbeeld", + "Markdown works here: headings, lists and links.": "Markdown werkt hier: koppen, lijsten en links.", + "Could not save the task. Please try again.": "De taak kon niet worden opgeslagen. Probeer het opnieuw.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Op \"{title}\" is tijd geschreven, dus deze kan niet worden verwijderd. Je kunt de taak wel annuleren: de tijdregels blijven bestaan.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "\"{title}\" verwijderen? De koppelingen met andere taken worden ook verwijderd. Dit kan niet ongedaan worden gemaakt.", + "Keep task": "Taak behouden", + "Cancel task": "Taak annuleren", + "Only the reporter, the project owner or an admin can delete this task.": "Alleen de melder, de projecteigenaar of een beheerder kan deze taak verwijderen.", + "Could not delete the task. Please try again.": "De taak kon niet worden verwijderd. Probeer het opnieuw.", + "Could not cancel the task. Please try again.": "De taak kon niet worden geannuleerd. Probeer het opnieuw.", + "Responsible": "Verantwoordelijk", + "Also working on this": "Werkt hier ook aan", + "Labels": "Labels", + "Could not change the priority. Please try again.": "De prioriteit kon niet worden gewijzigd. Probeer het opnieuw.", + "Other project members who work on this task alongside the person responsible.": "Andere projectleden die samen met de verantwoordelijke aan deze taak werken.", + "Duplicate": "Dupliceren", + "Could not copy the task. Please try again.": "De taak kon niet worden gekopieerd. Probeer het opnieuw.", + "Subtasks": "Subtaken", + "{done} of {total} done": "{done} van {total} klaar", + "Add a subtask": "Subtaak toevoegen", + "Checklist": "Checklist", + "Checklist item actions": "Acties voor checklistitem", + "Add a checklist item": "Checklistitem toevoegen", + "Subtasks: {estimate} estimated, {logged} logged": "Subtaken: {estimate} geschat, {logged} geschreven", + "Total estimate: {total}": "Totale schatting: {total}", + "Part of {title}": "Onderdeel van {title}", + "Checklist: {count} done": "Checklist: {count} klaar", + "This task has subtasks: {count}.": "Deze taak heeft subtaken: {count}.", + "Keep subtasks as separate tasks": "Subtaken als losse taken behouden", + "Delete subtasks too": "Subtaken ook verwijderen", + "Copy of {title}": "Kopie van {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "De taak is gekopieerd, maar niet al haar subtaken. Controleer de kopie.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Kleine stappen binnen de taak. Elk item heeft een id, een tekst en of het klaar is.", + "Open work per person and per project.": "Openstaand werk per persoon en per project.", + "View": "Weergave", + "By person": "Per persoon", + "By project": "Per project", + "Hours left": "Resterende uren", + "Tasks without an estimate": "Taken zonder schatting", + "Due in 14 days": "Binnen 14 dagen", + "Shared": "Gedeeld", + "Unassigned": "Niet toegewezen", + "{hours} h": "{hours} u", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Je ziet werk in de projecten die je kunt inzien. Uren tellen voor de verantwoordelijke; gedeelde taken tellen zonder uren.", + "No open work in these projects.": "Geen openstaand werk in deze projecten.", + "Open work": "Openstaand werk", + "{count} open tasks": "{count} open taken", + "Create a project to see capacity here.": "Maak een project aan om hier de capaciteit te zien.", + "My tasks": "Mijn taken", + "Show all my tasks": "Alle taken van mij tonen", + "No tasks assigned to you": "Geen taken aan jou toegewezen", + "Browse projects": "Projecten bekijken", + "Later": "Later", + "Due {date}": "Uiterlijk {date}", + "Could not change the status. Please try again.": "De status kon niet worden gewijzigd. Probeer het opnieuw.", + "Completed today": "Vandaag afgerond", + "My open tasks": "Mijn open taken", + "My overdue tasks": "Mijn te late taken", + "My tasks in progress": "Mijn taken in uitvoering", + "Pin to the top": "Bovenaan vastzetten", + "Unpin": "Losmaken", + "Pinned": "Vastgezet", + "Actions for {title}": "Acties voor {title}", + "Could not save your project order. Please try again.": "Je projectvolgorde kon niet worden opgeslagen. Probeer het opnieuw.", + "No boards yet": "Nog geen borden", + "Create a project to get a board.": "Maak een project aan om een bord te krijgen.", + "Use the Projects page to create and manage your projects and tasks.": "Gebruik de pagina Projecten om je projecten en taken aan te maken en te beheren.", + "Go to projects": "Naar projecten", + "You are not a member of any projects yet.": "Je bent nog geen lid van een project.", + "Could not search for users. Please try again.": "Gebruikers zoeken lukte niet. Probeer het opnieuw.", + "Project creation is restricted to administrators.": "Alleen beheerders kunnen projecten aanmaken.", + "Only the project owner or an administrator can delete this project.": "Alleen de projecteigenaar of een beheerder kan dit project verwijderen.", + "No projects are available to you yet. Ask an administrator to create one.": "Er zijn nog geen projecten voor jou beschikbaar. Vraag een beheerder er een aan te maken.", + "Due: {date}": "Uiterlijk: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Taken met een start- of einddatum verschijnen op de tijdlijn. Voeg datums toe om ze hier te zien.", + "You do not have access to this project.": "Je hebt geen toegang tot dit project.", + "Zoom level": "Zoomniveau", + "Unscheduled": "Niet ingepland", + "Start: {date}": "Start: {date}", + "Today": "Vandaag", + "No scheduled tasks": "Geen ingeplande taken", + "An unexpected error occurred.": "Er is een onverwachte fout opgetreden.", + "Column {number} name": "Naam van kolom {number}", + "Failed to save creation policy": "Het aanmaakbeleid kon niet worden opgeslagen", + "All authenticated users": "Alle ingelogde gebruikers", + "Control who may create new projects": "Bepaal wie nieuwe projecten mag aanmaken", + "Administrators only": "Alleen beheerders", + "Project creation": "Projecten aanmaken", + "Allow project creation": "Projecten aanmaken toestaan", + "Creation policy saved successfully": "Aanmaakbeleid opgeslagen", + "Initializing…": "Bezig met starten…", + "e.g. 2h 30m, 90m, 1.5h": "bijv. 2h 30m, 90m, 1.5h", + "Log time": "Tijd schrijven", + "Save estimate": "Schatting opslaan", + "Logged: {logged}": "Geschreven: {logged}", + "over by {amount}": "{amount} te veel", + "Time tracking": "Tijdregistratie", + "Estimate": "Schatting", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Voer een geldige schatting in (bijv. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Voer een geldige duur in (bijv. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "De tijdregel kon niet worden opgeslagen. Probeer het opnieuw.", + "Edit time entry": "Tijdregel bewerken", + "Duration": "Duur", + "Date range": "Periode", + "Last week": "Vorige week", + "No time logged": "Geen tijd geschreven", + "Log time on a task to see it here.": "Schrijf tijd op een taak om die hier te zien.", + "To date": "Tot datum", + "This week": "Deze week", + "Total: {total}": "Totaal: {total}", + "From date": "Vanaf datum", + "Custom range": "Eigen periode", + "All time": "Alles", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Een taak kon niet worden verwijderd, dus er kunnen gegevens achterblijven. Verwijder het project opnieuw.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Een tijdregel kon niet worden verwijderd, dus er kunnen gegevens achterblijven. Verwijder het project opnieuw.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Een kolom kon niet worden verwijderd, dus er kunnen gegevens achterblijven. Verwijder het project opnieuw.", + "Could not delete the project. Please try again.": "Het project kon niet worden verwijderd. Probeer het opnieuw.", + "Draft": "Concept", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Of de les een concept is dat alleen de docent ziet, doorgaat of vervalt.", + "New release": "Nieuwe release", + "Roadmap chart. The same releases and epics are listed below.": "Roadmapgrafiek. Dezelfde releases en epics staan hieronder in een lijst.", + "Nothing on the roadmap yet": "Nog niets op de roadmap", + "Releases with a target date and epics with dated tasks appear here.": "Releases met een streefdatum en epics met taken die een datum hebben, verschijnen hier.", + "Releases": "Releases", + "No releases yet": "Nog geen releases", + "Target date: {date}": "Streefdatum: {date}", + "No target date": "Geen streefdatum", + "Edit {name}": "{name} bewerken", + "Mark {name} as released": "{name} als uitgebracht markeren", + "Mark as released": "Markeren als uitgebracht", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Nog geen epics. Open een taak om er een epic van te maken.", + "Not scheduled yet": "Nog niet gepland", + "Planned": "Gepland", + "Released": "Uitgebracht", + "Edit release": "Release bewerken", + "Target date": "Streefdatum", + "Could not save the release. Please try again.": "Kon de release niet opslaan. Probeer het opnieuw.", + "Every task of this release is done or cancelled.": "Elke taak van deze release is klaar of geannuleerd.", + "Not finished yet: {count}": "Nog niet klaar: {count}", + "What happens to these tasks?": "Wat gebeurt er met deze taken?", + "Move to {name}": "Verplaatsen naar {name}", + "Remove the release": "De release weghalen", + "Keep it on {name}": "Op {name} laten staan", + "Could not mark the release as released. Please try again.": "Kon de release niet als uitgebracht markeren. Probeer het opnieuw.", + "Roadmap": "Roadmap", + "Tasks or roadmap": "Taken of roadmap", + "Release": "Release", + "Epic": "Epic", + "This task is an epic": "Deze taak is een epic", + "A named, dated delivery of a project that its tasks are planned against.": "Een benoemde, gedateerde oplevering van een project waartegen de taken worden gepland.", + "Name of the release": "Naam van de release", + "The project this release belongs to": "Het project waar deze release bij hoort", + "What this release delivers": "Wat deze release oplevert", + "When work on the release starts": "Wanneer het werk aan de release begint", + "The date the release is due": "De datum waarop de release klaar moet zijn", + "Whether the release is planned, released or archived": "Of de release gepland, uitgebracht of gearchiveerd is", + "Released on": "Uitgebracht op", + "When the release was marked as released": "Wanneer de release als uitgebracht is gemarkeerd", + "The release this task is planned for": "De release waarvoor deze taak is gepland", + "Board view options": "Weergaveopties van het bord", + "Colour cards": "Kaarten kleuren", + "No colour": "Geen kleur", + "By label": "Op label", + "Swimlanes": "Swimlanes", + "No swimlanes": "Geen swimlanes", + "By assignee": "Op toegewezen persoon", + "By epic": "Op epic", + "No assignee": "Niet toegewezen", + "No epic": "Geen epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kaarten blijven in hun epic-rij. Wijzig de epic op de taakpagina.", + "Hand over to": "Overdragen aan", + "Could not save your board view. It applies until you reload.": "Kon de bordweergave niet opslaan. Ze geldt tot u de pagina herlaadt.", + "Timetable wish": "Roosterwens", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Een wens die de generator meeweegt. Een harde wens houdt hij altijd aan, een zachte wens waar het kan.", + "Whether the wish is about a teacher, a group, a room or one activity": "Of de wens gaat over een docent, een groep, een lokaal of één activiteit", + "Teacher": "Docent", + "Group": "Groep", + "Reference": "Verwijzing", + "The user, group, room or activity the wish is about": "De gebruiker, groep, het lokaal of de activiteit waar de wens over gaat", + "What the wish asks for": "Wat de wens vraagt", + "Not on these periods": "Niet op deze lesuren", + "Preferably not on these periods": "Liever niet op deze lesuren", + "At most a number of lessons a day": "Hoogstens een aantal lessen per dag", + "No free periods between lessons": "Geen tussenuren", + "Always the same room": "Altijd hetzelfde lokaal", + "Periods": "Lesuren", + "The periods of the week the wish is about, such as wed-5": "De lesuren van de week waar de wens over gaat, zoals wed-5", + "Limit": "Grens", + "The most lessons a day, for a wish of that kind": "Het hoogste aantal lessen per dag, voor een wens van die soort", + "Strength": "Sterkte", + "Whether the generator must keep the wish or should keep it": "Of de generator de wens moet of zou moeten aanhouden", + "Hard": "Hard", + "Soft": "Zacht", + "Weight": "Gewicht", + "How much a soft wish counts, from 1 to 3": "Hoe zwaar een zachte wens telt, van 1 tot 3", + "Why the wish exists": "Waarom de wens bestaat", + "Timetable scenario": "Roosterscenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Eén weekpatroon, gemaakt door de generator of overgenomen uit het huidige rooster. Het bewaart de invoer en hoe goed het de wensen aanhoudt.", + "The name timetablers know the scenario by": "De naam waaronder roostermakers het scenario kennen", + "Whether the generator made it or it came from the current timetable": "Of de generator het maakte of het uit het huidige rooster komt", + "Generated": "Gegenereerd", + "From the current timetable": "Uit het huidige rooster", + "Week of": "Week van", + "The Monday of the first week of the window": "De maandag van de eerste week van de periode", + "Window start": "Begin van de periode", + "The first day the week pattern applies to": "De eerste dag waarop het weekpatroon geldt", + "Window end": "Einde van de periode", + "The last day the week pattern applies to": "De laatste dag waarop het weekpatroon geldt", + "Waiting, generating, done, failed, or published as draft lessons": "Wachtend, bezig, klaar, mislukt of gepubliceerd als conceptlessen", + "Waiting": "Wachtend", + "Generating": "Bezig met genereren", + "Failed": "Mislukt", + "Published": "Gepubliceerd", + "Seed": "Startgetal", + "The number the generator starts from, so a run can be repeated": "Het getal waarmee de generator begint, zodat een run te herhalen is", + "Input": "Invoer", + "The periods, rooms, lessons and wishes the scenario was made from": "De lesuren, lokalen, lessen en wensen waaruit het scenario is gemaakt", + "Placements": "Plaatsingen", + "Each lesson with the period and room it was given": "Elke les met het lesuur en lokaal dat hij kreeg", + "Unplaced lessons": "Niet geplaatste lessen", + "Lessons without a place, each with the hard wish that blocked it": "Lessen zonder plek, elk met de harde wens die hem tegenhield", + "Broken wishes": "Geschonden wensen", + "The wishes this scenario breaks, with the lessons that break them": "De wensen die dit scenario niet aanhoudt, met de lessen die ze schenden", + "Measures": "Maatstaven", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Geplaatste lessen, geschonden wensen, tussenuren van docenten, lessen per dag en lokaalgebruik", + "Reason": "Reden", + "Why the run failed": "Waarom de run mislukte", + "Published at": "Gepubliceerd op", + "When the scenario was written out as draft lessons": "Wanneer het scenario als conceptlessen is weggeschreven", + "Edit wish": "Wens bewerken", + "New wish": "Nieuwe wens", + "Hard: the generator always keeps it": "Hard: de generator houdt zich er altijd aan", + "Soft: the generator keeps it where it can": "Zacht: de generator houdt zich eraan waar het kan", + "Weight (1 to 3)": "Gewicht (1 tot 3)", + "Most lessons a day": "Hoogstens aantal lessen per dag", + "Period": "Lesuur", + "{day} period {number}": "{day} lesuur {number}", + "Teacher (user name)": "Docent (gebruikersnaam)", + "Activity (group:subject)": "Activiteit (groep:vak)", + "Say who or what the wish is about.": "Geef aan over wie of wat de wens gaat.", + "Choose at least one period.": "Kies minstens één lesuur.", + "The limit is a whole number of 1 or more.": "De limiet is een heel getal van 1 of meer.", + "Timetable": "Rooster", + "Wishes": "Wensen", + "Timetable wishes": "Roosterwensen", + "Generator run": "Generatorrun", + "Generator progress": "Voortgang van de generator", + "The run failed: {reason}": "De run is mislukt: {reason}", + "{placed} of {lessons} lessons placed": "{placed} van {lessons} lessen geplaatst", + "Generate again": "Opnieuw genereren", + "Generate": "Genereren", + "Every lesson has a place.": "Elke les heeft een plek.", + "Lesson": "Les", + "No free period and room": "Geen vrij lesuur en lokaal", + "Broken soft wishes": "Geschonden zachte wensen", + "Every soft wish is kept.": "Elke zachte wens is gehouden.", + "Wish": "Wens", + "Lessons": "Lessen", + "Generating: {percent}% of the time budget used": "Bezig met genereren: {percent}% van de tijd gebruikt", + "Waiting to start": "Wacht op start", + "Published as draft lessons": "Gepubliceerd als conceptlessen", + "Could not read the scenario.": "Kon het scenario niet lezen.", + "Could not start the run.": "Kon de run niet starten.", + "Scenarios": "Scenario's", + "Timetable scenarios": "Roosterscenario's", + "Scenario": "Scenario", + "Take the current timetable": "Huidig rooster overnemen", + "Could not take the current timetable.": "Kon het huidige rooster niet overnemen.", + "Broken hard wishes": "Geschonden harde wensen", + "Not on a period of the week grid": "Niet op een lesuur van het weekrooster", + "Compare scenarios": "Scenario's vergelijken", + "Scenarios to compare": "Te vergelijken scenario's", + "Choose two or three scenarios to compare them.": "Kies twee of drie scenario's om ze te vergelijken.", + "Measure": "Meting", + "Best": "Beste", + "Lessons that differ": "Lessen die verschillen", + "No lesson differs.": "Geen les verschilt.", + "Not placed": "Niet geplaatst", + "{period} in {room}": "{period} in {room}", + "Lessons placed": "Geplaatste lessen", + "Lessons without a place": "Lessen zonder plek", + "Clashes": "Botsingen", + "Hard wishes broken": "Geschonden harde wensen", + "Soft wishes broken": "Geschonden zachte wensen", + "Soft wishes broken, weighted": "Geschonden zachte wensen, gewogen", + "Free periods between lessons, all teachers": "Tussenuren, alle docenten", + "Most free periods of one teacher": "Meeste tussenuren van één docent", + "Most lessons of one group on a day": "Meeste lessen van één groep op een dag", + "Room use": "Lokaalgebruik", + "Publish as draft lessons": "Publiceren als conceptlessen", + "Draft lessons written: {count}": "Conceptlessen geschreven: {count}", + "Could not publish the scenario.": "Kon het scenario niet publiceren.", + "Rules": "Regels", + "Rules for {column}": "Regels voor {column}", + "When a card enters this column": "Wanneer een kaart deze kolom binnenkomt", + "Action": "Actie", + "Set the priority": "Prioriteit instellen", + "Assign to": "Toewijzen aan", + "Assign the person who moved the card": "De persoon die de kaart verplaatste toewijzen", + "Remove the assignee": "Toewijzing verwijderen", + "Add a label": "Label toevoegen", + "No longer a project member": "Geen projectlid meer", + "This label no longer exists": "Dit label bestaat niet meer", + "Add rule": "Regel toevoegen", + "Remove rule": "Regel verwijderen", + "No rules yet. Add one to change a card when it enters this column.": "Nog geen regels. Voeg er een toe om een kaart te wijzigen wanneer die deze kolom binnenkomt.", + "Could not save the rules. Please try again.": "De regels konden niet worden opgeslagen. Probeer het opnieuw.", + "1 rule runs when a card enters this column": "1 regel wordt uitgevoerd wanneer een kaart deze kolom binnenkomt", + "{count} rules run when a card enters this column": "{count} regels worden uitgevoerd wanneer een kaart deze kolom binnenkomt", + "Rules applied: {changes}": "Regels toegepast: {changes}", + "assigned to {name}": "toegewezen aan {name}", + "assignee removed": "toewijzing verwijderd", + "priority {priority}": "prioriteit {priority}", + "label {label}": "label {label}", + "What happens to a card when it enters this column, applied in list order.": "Wat er met een kaart gebeurt wanneer die deze kolom binnenkomt, in de volgorde van de lijst.", + "Value": "Waarde", + "What the rule does to the card.": "Wat de regel met de kaart doet.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "De prioriteit, de gebruikers-id of de label-id die de actie gebruikt; leeg voor acties zonder waarde.", + "is not": "is niet", + "{dimension} is not": "{dimension} is niet", + "Saved filters": "Opgeslagen filters", + "No saved filters yet": "Nog geen opgeslagen filters", + "Save filter": "Filter opslaan", + "Rename \"{name}\"": "\"{name}\" hernoemen", + "Delete \"{name}\"": "\"{name}\" verwijderen", + "Clear filters": "Filters wissen", + "Showing {shown} of {total} tasks": "{shown} van {total} taken zichtbaar", + "Me": "Ik", + "No date": "Geen datum", + "Rename saved filter": "Opgeslagen filter hernoemen", + "Share with the project": "Delen met het project", + "Give the filter a name": "Geef het filter een naam", + "Could not save the filter. Please try again.": "Het filter kon niet worden opgeslagen. Probeer het opnieuw.", + "Some labels in \"{name}\" no longer exist and were left out.": "Sommige labels in \"{name}\" bestaan niet meer en zijn weggelaten.", + "Could not delete the filter. Please try again.": "Het filter kon niet worden verwijderd. Probeer het opnieuw.", + "Saved filter": "Opgeslagen filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Een benoemd bordfilter van één project, alleen zichtbaar voor wie het opsloeg, tenzij gedeeld met het project.", + "The project whose board the filter applies to": "Het project op wiens bord het filter werkt", + "The name the filter is listed under": "De naam waaronder het filter in de lijst staat", + "Saved by": "Opgeslagen door", + "Nextcloud user id of the person who saved the filter": "Nextcloud-gebruikers-id van wie het filter opsloeg", + "Shared with the project": "Gedeeld met het project", + "Whether every project member sees and applies the filter": "Of elk projectlid het filter ziet en kan toepassen", + "Criteria": "Criteria", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Het filter: toegewezen aan, label, prioriteit en vervaldatum, elk met is of is niet en de waarden", + "Cross-project view": "Projectoverstijgende weergave", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Een opgeslagen selectie van projecten waarvan de taken samen in statusbanen worden getoond, gedeeld met de mensen die erin staan.", + "Shared with": "Gedeeld met", + "The name the view is listed under": "De naam waaronder de weergave wordt vermeld", + "Nextcloud user id of the person who saved the view": "Nextcloud-gebruikers-id van de persoon die de weergave heeft opgeslagen", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-gebruikers-id's van de mensen met wie de weergave is gedeeld", + "The projects whose tasks the view shows, at most twenty": "De projecten waarvan de weergave de taken toont, hooguit twintig", + "1 project in this view is hidden from you.": "1 project in deze weergave is voor jou verborgen.", + "{count} projects in this view are hidden from you.": "{count} projecten in deze weergave zijn voor jou verborgen.", + "{project} has no column for {status}.": "{project} heeft geen kolom voor {status}.", + "This view does not exist or is not shared with you.": "Deze weergave bestaat niet of is niet met je gedeeld.", + "\"{task}\" moved to {status}.": "\"{task}\" is verplaatst naar {status}.", + "Project: {title}": "Project: {title}", + "Cross-project views": "Projectoverstijgende weergaven", + "New view": "Nieuwe weergave", + "Edit view": "Weergave bewerken", + "Delete view": "Weergave verwijderen", + "Give the view a name": "Geef de weergave een naam", + "Pick at least one project": "Kies minstens één project", + "A view shows at most {max} projects": "Een weergave toont hooguit {max} projecten", + "Could not save the view. Please try again.": "Kon de weergave niet opslaan. Probeer het opnieuw.", + "Could not delete the view. Please try again.": "Kon de weergave niet verwijderen. Probeer het opnieuw.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "\"{title}\" verwijderen? De projecten en hun taken blijven zoals ze zijn.", + "People see the tasks of the projects they are in, never more.": "Mensen zien de taken van de projecten waarin ze zitten, nooit meer.", + "No views yet. A view shows the tasks of several of your projects together.": "Nog geen weergaven. Een weergave toont de taken van meerdere van je projecten samen.", + "Projects in view: {count}": "Projecten in weergave: {count}", + "Notify me when a task is assigned to me": "Stuur mij een melding als een taak aan mij wordt toegewezen", + "Also send these to me by email": "Stuur deze ook per e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Voeg een e-mailadres toe in je persoonlijke Nextcloud-instellingen om e-mail te krijgen.", + "Code link": "Codekoppeling", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Een commit, branch, merge request of issue in een codeplatform dat aan een taak werkt.", + "The task the link belongs to": "De taak waar de koppeling bij hoort", + "The project of the task": "Het project van de taak", + "Task key": "Taaksleutel", + "The task key the forge text named, such as VC-12": "De taaksleutel die in de tekst van het codeplatform stond, zoals VC-12", + "What the link points at": "Waar de koppeling naar wijst", + "Link": "Koppeling", + "The address of the item in the forge": "Het adres van het item in het codeplatform", + "The commit message, branch name or merge request title": "Het commitbericht, de branchnaam of de titel van het merge request", + "Repository": "Repository", + "The repository, such as acme/portal": "De repository, zoals acme/portal", + "Forge id": "Id in het codeplatform", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Het eigen id van het item in het codeplatform, zoals github:acme/portal#42 of een commit-hash", + "State": "Status", + "The state of a merge request or issue": "De status van een merge request of issue", + "Who made the commit or opened the merge request": "Wie de commit maakte of het merge request opende", + "When the commit was made or the merge request last changed": "Wanneer de commit is gemaakt of het merge request voor het laatst veranderde", + "Added by": "Toegevoegd door", + "Whether a person added the link or the integration wrote it": "Of een persoon de koppeling toevoegde of de integratie hem schreef", + "Nextcloud user UIDs of project members": "Nextcloud-gebruikers-id's van projectleden", + "Add link": "Koppeling toevoegen", + "Added by hand": "Met de hand toegevoegd", + "Branch": "Branch", + "Code": "Code", + "Commit": "Commit", + "From the integration": "Via de integratie", + "Link to a commit, branch or merge request": "Koppeling naar een commit, branch of merge request", + "Merge request": "Merge request", + "Merged": "Samengevoegd", + "No code linked yet. Name {key} in a commit message or paste a link.": "Nog geen code gekoppeld. Noem {key} in een commitbericht of plak een koppeling.", + "No code linked yet. Paste a link to a commit or merge request.": "Nog geen code gekoppeld. Plak een koppeling naar een commit of merge request.", + "Paste a web address that starts with https://.": "Plak een webadres dat begint met https://.", + "Remove link {title}": "Koppeling {title} verwijderen", + "The link could not be added.": "De koppeling kon niet worden toegevoegd.", + "The link could not be removed.": "De koppeling kon niet worden verwijderd.", + "This link is already on the task.": "Deze koppeling staat al bij de taak.", + "Code forges": "Codeplatforms", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Koppel GitHub-commits en pull requests aan taken. Integriq ontvangt de gebeurtenissen; planninq roept GitHub nooit aan.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Download de configuratie en importeer die in Integriq. Vul daarna een geheim in bij de regel \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Voeg in GitHub een webhook aan de repository toe met dit adres en hetzelfde geheim. Kies inhoudstype application/json en de gebeurtenissen push en pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Noem de taaksleutel, zoals VC-12, in een commitbericht, branchnaam of titel van een pull request. De koppeling verschijnt dan bij die taak.", + "Without Integriq, project members can still paste a link on the task page.": "Zonder Integriq kunnen projectleden nog steeds een koppeling plakken op de taakpagina.", + "Download the Integriq configuration": "Integriq-configuratie downloaden", + "Calendar": "Kalender", + "Previous": "Vorige", + "Calendar view": "Kalenderweergave", + "Starts:": "Begint:", + "No tasks with a date in this month.": "Geen taken met een datum in deze maand.", + "Week of {start} to {end}": "Week van {start} tot {end}", + "My calendar": "Mijn kalender", + "Show as list": "Als lijst tonen", + "Show as calendar": "Als kalender tonen", + "Open my calendar": "Mijn kalender openen", + "Nextcloud Tasks": "Nextcloud Taken", + "Show my tasks in Nextcloud Tasks": "Mijn taken tonen in Nextcloud Taken", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "De taken die aan je zijn toegewezen of met je zijn gedeeld, staan in een lijst \"Planninq\" in Nextcloud Taken en Agenda. Wijzigingen die je daar maakt, worden vervangen bij de volgende wijziging in Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Deze server kan niet naar Nextcloud Taken schrijven, dus de export is niet beschikbaar.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Beheerd door Planninq. Wijzigingen die je hier maakt, worden vervangen bij de volgende wijziging in Planninq.", + "Working days and holidays": "Werkdagen en feestdagen", + "Dates set on the timeline skip the days that are not working days.": "Datums die je op de tijdlijn zet, slaan de dagen over die geen werkdag zijn.", + "Working weekdays": "Werkdagen van de week", + "Non-working days": "Niet-werkdagen", + "No non-working days yet.": "Nog geen niet-werkdagen.", + "Add day": "Dag toevoegen", + "Year": "Jaar", + "Add Dutch national holidays": "Nederlandse feestdagen toevoegen", + "Save working days": "Werkdagen opslaan", + "Choose at least one working weekday.": "Kies minstens één werkdag.", + "Working days saved.": "Werkdagen opgeslagen.", + "Could not save the working days.": "De werkdagen konden niet worden opgeslagen.", + "New Year's Day": "Nieuwjaarsdag", + "Easter Sunday": "Eerste paasdag", + "Easter Monday": "Tweede paasdag", + "King's Day": "Koningsdag", + "Liberation Day": "Bevrijdingsdag", + "Ascension Day": "Hemelvaartsdag", + "Whit Sunday": "Eerste pinksterdag", + "Whit Monday": "Tweede pinksterdag", + "Christmas Day": "Eerste kerstdag", + "Boxing Day": "Tweede kerstdag", + "Dates of {title}": "Datums van {title}", + "The due date cannot be before the start date.": "De vervaldatum kan niet voor de startdatum liggen.", + "{title}, from {start} to {end}": "{title}, van {start} tot {end}", + "The dates could not be saved.": "De datums konden niet worden opgeslagen.", + "{title} now runs from {start} to {end}": "{title} loopt nu van {start} tot {end}", + "Auto-scheduling": "Automatisch plannen", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Als dit aan staat, biedt het later zetten van een vervaldatum op de tijdlijn aan om de taken die erop wachten mee te schuiven.", + "Move blocked tasks along when a task slips": "Geblokkeerde taken meeschuiven als een taak uitloopt", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Op de tijdlijn biedt een latere vervaldatum aan om de taken die erop wachten mee te schuiven. Alleen \"blokkeert\"-koppelingen tellen, en taken schuiven alleen later.", + "Move the tasks that wait for {title}?": "De taken verschuiven die op {title} wachten?", + "These tasks wait for it and would start after its new due date:": "Deze taken wachten erop en zouden na de nieuwe vervaldatum beginnen:", + "{count} tasks would move; the first {limit} are listed.": "{count} taken zouden verschuiven; de eerste {limit} staan hier.", + "Now": "Nu", + "After the move": "Na het verschuiven", + "Only this task": "Alleen deze taak", + "Move all": "Alles verschuiven", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Gestopt bij {title}: de datums konden niet worden opgeslagen. De taken daarvoor zijn verschoven.", + "Cumulative flow": "Cumulatieve flow", + "Show as chart": "Als grafiek tonen", + "Show as table": "Als tabel tonen", + "Tasks per column per day": "Taken per kolom per dag", + "Tasks without recorded history in this period: {count}": "Taken zonder vastgelegde geschiedenis in deze periode: {count}", + "Lead and cycle time": "Doorlooptijd en cyclustijd", + "No tasks were finished in this period.": "Er zijn in deze periode geen taken afgerond.", + "Finished tasks": "Afgeronde taken", + "Cycle time, average": "Cyclustijd, gemiddeld", + "Cycle time, 85th percentile": "Cyclustijd, 85e percentiel", + "Lead time, average": "Doorlooptijd, gemiddeld", + "Tasks whose finish time was estimated from their history: {count}": "Taken waarvan de eindtijd uit de geschiedenis is geschat: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Cyclustijd van elke afgeronde taak, met het gemiddelde en het 85e percentiel", + "Slowest tasks": "Traagste taken", + "cycle {cycle}, lead {lead}": "cyclus {cycle}, doorloop {lead}", + "{days} days": "{days} dagen", + "Could not load the flow of this project.": "De flow van dit project kon niet worden geladen.", + "Last {days} days": "Laatste {days} dagen", + "Portfolio flow": "Portfolioflow", + "An admin adds portfolios under Projects, Portfolios.": "Een beheerder voegt portfolio's toe onder Projecten, Portfolio's.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projecten die niet getoond worden, omdat er hooguit 50 tegelijk getoond worden: {count}", + "Could not load the flow of this portfolio.": "De flow van dit portfolio kon niet worden geladen.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Cumulatieve flow en cyclustijd over de projecten van een portfolio.", + "Edit report": "Rapport bewerken", + "Only tasks where": "Alleen taken waarbij", + "Group by": "Groeperen op", + "Display": "Weergave", + "Share with everyone who can read its projects": "Delen met iedereen die de projecten mag lezen", + "The report could not be saved.": "Het rapport kon niet worden opgeslagen.", + "Number of tasks": "Aantal taken", + "Bar": "Staaf", + "Donut": "Donut", + "Table": "Tabel", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} van {total} projecten in dit rapport zijn voor jou niet zichtbaar", + "No tasks match this report.": "Geen taken passen bij dit rapport.", + "None": "Geen", + "Could not load this report.": "Dit rapport kon niet worden geladen.", + "Report": "Rapport", + "Your reports": "Je rapporten", + "My reports": "Mijn rapporten", + "Shared reports": "Gedeelde rapporten", + "You have not built a report yet.": "Je hebt nog geen rapport gemaakt.", + "Nobody has shared a report with you yet.": "Niemand heeft nog een rapport met je gedeeld.", + "Reports you built over tasks, and the ones shared with you.": "Rapporten die je over taken hebt gemaakt, en de rapporten die met je zijn gedeeld.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Een opgeslagen vraag over taken: welke projecten, welke filters, gegroepeerd waarop, geteld of opgeteld, en getoond als tabel of grafiek.", + "The name the report is listed under": "De naam waaronder het rapport in de lijst staat", + "What the report shows and who it is for": "Wat het rapport laat zien en voor wie het is", + "Nextcloud user id of the person who saved the report": "Nextcloud-gebruikers-id van wie het rapport heeft opgeslagen", + "Who can open the report": "Wie het rapport kan openen", + "Only me": "Alleen ik", + "Everyone who can read its projects": "Iedereen die de projecten mag lezen", + "The projects the report covers, at most fifty": "De projecten die het rapport beslaat, hooguit vijftig", + "Filters": "Filters", + "Task fields and the value each must equal": "Taakvelden en de waarde waaraan elk gelijk moet zijn", + "The task field the report groups on": "Het taakveld waarop het rapport groepeert", + "Count the tasks, or add up a number on them": "De taken tellen, of een getal op de taken optellen", + "Sum": "Som", + "Sum of": "Som van", + "The number added up when the measure is a sum": "Het getal dat wordt opgeteld als de maat een som is", + "Story points": "Storypoints", + "Estimated duration": "Geschatte duur", + "How the report is shown": "Hoe het rapport wordt getoond", + "Issue type": "Soort issue", + "Task fields and the value each must equal; empty when the report covers every task": "Taakvelden en de waarde waaraan elk moet voldoen; leeg als het rapport alle taken omvat", + "The status a task must have": "De status die een taak moet hebben", + "The priority a task must have": "De prioriteit die een taak moet hebben", + "The user a task must be assigned to": "De gebruiker aan wie een taak moet zijn toegewezen", + "A label a task must carry": "Een label dat een taak moet dragen", + "The board column a task must be in": "De bordkolom waarin een taak moet staan", + "The issue type a task must have": "Het soort issue dat een taak moet hebben", + "Manager groups": "Beheerdersgroepen", + "Member groups": "Ledengroepen", + "Viewer groups": "Lezersgroepen", + "Viewers": "Lezers", + "Owning group": "Eigenaarsgroep", + "Nextcloud groups whose members manage the project": "Nextcloud-groepen waarvan de leden het project beheren", + "Nextcloud groups whose members work on the project": "Nextcloud-groepen waarvan de leden aan het project werken", + "Nextcloud groups whose members may read the project": "Nextcloud-groepen waarvan de leden het project mogen lezen", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-gebruikers die het project beheren: instellingen, leden en werk", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-gebruikers die het project en het werk mogen lezen maar niet wijzigen", + "The Nextcloud group that owns the project with its creator, at most one": "De Nextcloud-groep die het project samen met de maker bezit, hooguit één", + "Nextcloud user ids who may read this through the project": "Nextcloud-gebruikers die dit via het project mogen lezen", + "Nextcloud groups whose members may change this through the project": "Nextcloud-groepen waarvan de leden dit via het project mogen wijzigen", + "Nextcloud groups whose members may read this through the project": "Nextcloud-groepen waarvan de leden dit via het project mogen lezen", + "Search for a person or a group…": "Zoek een persoon of een groep…", + "No one found. Your admin's sharing settings decide who you can find.": "Niemand gevonden. De instellingen voor delen van je beheerder bepalen wie je kunt vinden.", + "Type at least two characters": "Typ minstens twee tekens", + "Everyone in this group": "Iedereen in deze groep", + "Could not search for people. Please try again.": "Zoeken naar personen is mislukt. Probeer het opnieuw.", + "Could not remove the group": "De groep kon niet worden verwijderd", + "Only the owner and managers change who is on this project.": "Alleen de eigenaar en beheerders bepalen wie er op dit project staat.", + "Role of {name}": "Rol van {name}", + "Manager": "Beheerder", + "Member": "Lid", + "Viewer": "Lezer", + "Could not change the role": "De rol kon niet worden gewijzigd", + "Owned by group: {name}": "Eigendom van groep: {name}", + "No group owns this project.": "Geen groep is eigenaar van dit project.", + "Owned by group": "Eigendom van groep", + "Search for a group…": "Zoek een groep…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Geen groep gevonden. De deelinstellingen van je beheerder bepalen welke groepen je kunt vinden.", + "No owning group": "Geen eigenaar-groep", + "Could not search for groups. Please try again.": "Kon niet naar groepen zoeken. Probeer het opnieuw.", + "Could not change the owning group": "De eigenaar-groep kon niet worden gewijzigd", + "You can read this project. Only its members change it.": "Je kunt dit project lezen. Alleen de leden wijzigen het.", + "Course": "Vak", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Het vak dat in deze les gegeven wordt, zoals een keuzevak, als de leerapp van de school het kent.", + "Online meeting link": "Link naar de online les", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Waar leerlingen online aan deze les deelnemen. Leerlingen zien alleen bij een https-link een knop Deelnemen." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/nl.json b/l10n/nl.json index f0dce9ab..8e5f3f53 100644 --- a/l10n/nl.json +++ b/l10n/nl.json @@ -1,5 +1,13 @@ { "translations": { + "Load example data?": "Voorbeeldgegevens laden?", + "Example data fills the lists, detail pages and dashboards so you can see the app working straight away. Pick \"None\" on a production install.": "Voorbeeldgegevens vullen de lijsten, detailpagina’s en dashboards, zodat je de app meteen ziet werken. Kies \"Geen\" op een productieomgeving.", + "Load the example data": "Laad de voorbeeldgegevens", + "Loads what you picked. The data is obviously sample data, it is safe to run more than once, and you can delete it afterwards.": "Laadt wat je koos. De gegevens zijn herkenbaar voorbeeldgegevens, je kunt dit meer dan een keer uitvoeren en je kunt ze daarna verwijderen.", + "None, I will set this up myself": "Geen, ik richt dit zelf in", + "Nothing is imported. You start with an empty app and add your own data.": "Er wordt niets geïmporteerd. Je begint met een lege app en voegt zelf gegevens toe.", + "Example data": "Voorbeeldgegevens", + "Sample values for every schema this app supplies, generated from the schemas themselves. It shows the lists, detail pages and dashboards working rather than telling a story. Safe to run more than once, and you can delete it afterwards.": "Voorbeeldwaarden voor elk schema dat deze app levert, gegenereerd uit de schema’s zelf. Het laat de lijsten, detailpagina’s en dashboards werkend zien in plaats van een verhaal te vertellen. Veilig om vaker uit te voeren, en je kunt het daarna verwijderen.", "Welcome": "Welkom", "A short setup to get this app ready. Nothing here is required; you can close it and come back later.": "Een korte installatie om deze app klaar te zetten. Niets hiervan is verplicht; je kunt dit sluiten en later terugkomen.", "Demo data (optional)": "Demovoorbeelddata (optioneel)", @@ -212,7 +220,1159 @@ "Overdue": "Verlopen", "Assigned to: {user}": "Toegewezen aan: {user}", "No tasks": "Geen taken", - "Could not move the task. Please try again.": "De taak kon niet worden verplaatst. Probeer het opnieuw." + "Could not move the task. Please try again.": "De taak kon niet worden verplaatst. Probeer het opnieuw.", + "Active projects": "Actieve projecten", + "Archived projects": "Gearchiveerde projecten", + "Boards": "Borden", + "My projects": "Mijn projecten", + "Portfolio": "Portfolio", + "Project board": "Projectbord", + "Projects I am in": "Projecten waarin ik deelneem", + "Timeline": "Tijdlijn", + "Timesheet": "Urenregistratie", + "Features & roadmap": "Functies en roadmap", + "Flow": "Flow", + "Flows": "Flows", + "Reports": "Rapporten", + "Pick a report to open it.": "Kies een rapport om het te openen.", + "In progress": "In behandeling", + "Date": "Datum", + "Due": "Deadline", + "Assignee": "Toegewezen aan", + "Who": "Wie", + "What": "Wat", + "Minutes": "Minuten", + "Entries": "Regels", + "Most recent": "Meest recent", + "Per person": "Per persoon", + "By status": "Op status", + "By priority": "Op prioriteit", + "Task status": "Taakstatus", + "Time spent": "Bestede tijd", + "Capacity": "Capaciteit", + "Due soonest": "Eerst aan de beurt", + "Minutes logged": "Geregistreerde minuten", + "Nothing is due": "Er staat niets open", + "Nothing logged yet": "Nog niets geregistreerd", + "What is open, what is blocked, and what is overdue.": "Wat openstaat, wat geblokkeerd is en wat te laat is.", + "How allocation is spread across the people working on projects.": "Hoe de inzet verdeeld is over de mensen die aan projecten werken.", + "Hours logged, and the projects they went to.": "Geregistreerde uren en de projecten waaraan ze zijn besteed.", + "Billable": "Factureerbaar", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Projecten laden", + "No projects for this client yet": "Nog geen projecten voor deze klant", + "Open in Planninq": "Openen in Planninq", + "This project could not be found": "Dit project is niet gevonden", + "Untitled project": "Naamloos project", + "and {count} more": "en nog {count}", + "Store": "Store", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installeer registers, schema's en flows die andere organisaties hebben gepubliceerd.", + "Work Date": "Werkdatum", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Roosterles", + "Source id": "Bron-id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "Het id dat het roosterpakket aan deze les geeft. Een nieuwe levering met hetzelfde id en dezelfde bron werkt deze les bij in plaats van er een toe te voegen.", + "Source": "Bron", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "Het systeem dat deze les leverde, bijvoorbeeld roster-zermelo, of manual voor een les die met de hand is ingevoerd.", + "Subject": "Vak", + "The subject as the school names it.": "Het vak zoals de school het noemt.", + "The name shown for this lesson. Left empty, the subject is shown.": "De naam die bij deze les staat. Leeg gelaten, dan staat het vak er.", + "Starts at": "Begint om", + "When the lesson starts.": "Wanneer de les begint.", + "Ends at": "Eindigt om", + "When the lesson ends.": "Wanneer de les eindigt.", + "Group code": "Groepscode", + "The code the school uses for the group or class.": "De code die de school gebruikt voor de groep of klas.", + "Cohort": "Groep", + "The cohort this lesson is for, when the school code is linked to one.": "De groep waarvoor deze les is, als de schoolcode aan een groep gekoppeld is.", + "Teacher code": "Docentcode", + "The code the school uses for the teacher.": "De code die de school gebruikt voor de docent.", + "Teacher account": "Docentaccount", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "Het Nextcloud-account van de docent, als de docentcode aan een account gekoppeld is.", + "Room code": "Lokaalcode", + "The code the school uses for the room.": "De code die de school gebruikt voor het lokaal.", + "Room": "Lokaal", + "The room name shown with the lesson.": "De naam van het lokaal die bij de les staat.", + "Whether the lesson goes ahead or is cancelled.": "Of de les doorgaat of uitvalt.", + "Scheduled": "Ingepland", + "Imported at": "Geïmporteerd op", + "When this lesson was last delivered. Set by planninq.": "Wanneer deze les voor het laatst geleverd is. Planninq vult dit in.", + "Column actions": "Kolomacties", + "Columns": "Kolommen", + "Could not remove the column. Please try again.": "De kolom kon niet worden verwijderd. Probeer het opnieuw.", + "Could not save the column. Please try again.": "De kolom kon niet worden opgeslagen. Probeer het opnieuw.", + "Done column": "Klaar-kolom", + "Edit column": "Kolom bewerken", + "Keep the card's status": "Status van de kaart behouden", + "Move its cards to": "Verplaats de kaarten naar", + "Move left": "Naar links", + "Move right": "Naar rechts", + "Status of cards moved here": "Status van kaarten die hierheen gaan", + "The last done column cannot be removed.": "De laatste klaar-kolom kan niet worden verwijderd.", + "WIP limit": "WIP-limiet", + "over limit": "boven de limiet", + "The status a card gets when it is moved into this column.": "De status die een kaart krijgt als die naar deze kolom wordt verplaatst.", + "All priorities": "Alle prioriteiten", + "Could not create the task. Please try again.": "De taak kon niet worden aangemaakt. Probeer het opnieuw.", + "Created": "Aangemaakt", + "Move to backlog": "Naar de backlog", + "Move to board": "Naar het bord", + "New task": "Nieuwe taak", + "Nothing in the backlog": "Niets in de backlog", + "Rank": "Rangorde", + "Sort by": "Sorteren op", + "Sort by rank to reorder": "Sorteer op rangorde om te herschikken", + "Task actions": "Taakacties", + "All labels": "Alle labels", + "Filter tasks by label": "Taken filteren op label", + "View timeline": "Tijdlijn bekijken", + "Board": "Bord", + "List": "Lijst", + "Column": "Kolom", + "Board or list": "Bord of lijst", + "Log": "Logboek", + "Add entry": "Notitie toevoegen", + "Show": "Tonen", + "No actions yet": "Nog geen acties", + "Closed": "Gesloten", + "Entry actions": "Notitieacties", + "Add action": "Actie toevoegen", + "by {author}": "door {author}", + "saved {time}": "opgeslagen {time}", + "Attendees: {names}": "Aanwezigen: {names}", + "Add the first entry": "Eerste notitie toevoegen", + "Issues": "Issues", + "Lessons learned": "Leerpunten", + "Meetings": "Overleggen", + "Decisions": "Besluiten", + "Actions": "Acties", + "Issue": "Issue", + "Lesson learned": "Leerpunt", + "Meeting": "Overleg", + "Decision": "Besluit", + "About this project": "Over dit project", + "No description yet": "Nog geen beschrijving", + "Start date": "Startdatum", + "Not set": "Niet ingesteld", + "End date": "Einddatum", + "Progress": "Voortgang", + "No tasks yet": "Nog geen taken", + "Open the board": "Bord openen", + "People": "Mensen", + "Owner": "Eigenaar", + "Latest log entries": "Laatste notities", + "Open the log": "Logboek openen", + "{done} of {total} tasks done": "{done} van {total} taken klaar", + "Edit entry": "Notitie bewerken", + "Type": "Soort", + "Attendees": "Aanwezigen", + "Issue is closed": "Issue is gesloten", + "Could not save the entry. Please try again.": "De notitie kon niet worden opgeslagen. Probeer het opnieuw.", + "From: {title}": "Uit: {title}", + "What needs to happen": "Wat er moet gebeuren", + "Could not create the action. Please try again.": "De actie kon niet worden aangemaakt. Probeer het opnieuw.", + "The action was created but could not be linked to the entry.": "De actie is aangemaakt, maar kon niet aan de notitie worden gekoppeld.", + "Project pages": "Projectpagina's", + "Overview": "Overzicht", + "Risks": "Risico's", + "Log entry": "Logboeknotitie", + "A short name for the entry": "Een korte naam voor de notitie", + "Project": "Project", + "The project this entry belongs to": "Het project waar deze notitie bij hoort", + "What kind of entry this is": "Wat voor notitie dit is", + "When it happened": "Wanneer het gebeurde", + "What happened, in Markdown": "Wat er gebeurde, in Markdown", + "Whether an issue is still open": "Of een issue nog openstaat", + "The people at a meeting": "De mensen bij een overleg", + "Tasks that came out of this entry": "Taken die uit deze notitie voortkwamen", + "Add risk": "Risico toevoegen", + "Risk": "Risico", + "Score": "Score", + "Response": "Reactie", + "Review date": "Evaluatiedatum", + "no longer on the project": "niet meer in het project", + "Edit {title}": "{title} bewerken", + "No risks recorded yet": "Nog geen risico's vastgelegd", + "Add the first risk": "Eerste risico toevoegen", + "Medium": "Gemiddeld", + "Mitigating": "Wordt beperkt", + "Occurred": "Opgetreden", + "Avoid": "Vermijden", + "Reduce": "Beperken", + "Transfer": "Overdragen", + "Accept": "Accepteren", + "Highest open risks": "Hoogste open risico's", + "No open risks": "Geen open risico's", + "Open the risk register": "Risicoregister openen", + "Edit risk": "Risico bewerken", + "What could go wrong": "Wat er mis kan gaan", + "Likelihood": "Kans", + "Impact": "Impact", + "Score {score}": "Score {score}", + "Countermeasures": "Maatregelen", + "Could not save the risk. Please try again.": "Het risico kon niet worden opgeslagen. Probeer het opnieuw.", + "Risks by likelihood and impact": "Risico's naar kans en impact", + "Risk scale": "Risicoschaal", + "The levels every project scores its risks on, and where low turns into medium and high": "De niveaus waarop elk project zijn risico's scoort, en waar laag overgaat in gemiddeld en hoog", + "Number of levels": "Aantal niveaus", + "Likelihood labels": "Labels voor kans", + "Impact labels": "Labels voor impact", + "Level {level}": "Niveau {level}", + "Medium from score": "Gemiddeld vanaf score", + "High from score": "Hoog vanaf score", + "Risk scale saved": "Risicoschaal opgeslagen", + "1 risk uses level {level}. Change it first.": "1 risico gebruikt niveau {level}. Pas dat eerst aan.", + "{count} risks use level {level}. Change them first.": "{count} risico's gebruiken niveau {level}. Pas die eerst aan.", + "Every level needs a label, and high must start above medium.": "Elk niveau heeft een label nodig, en hoog moet boven gemiddeld beginnen.", + "The project this risk belongs to": "Het project waar dit risico bij hoort", + "The cause and the effect, in Markdown": "De oorzaak en het gevolg, in Markdown", + "Category": "Categorie", + "A free grouping, such as planning, budget or supplier": "Een vrije indeling, zoals planning, budget of leverancier", + "How likely it is, on the admin's risk scale": "Hoe waarschijnlijk het is, op de risicoschaal van de beheerder", + "How hard it would hit, on the admin's risk scale": "Hoe hard het zou aankomen, op de risicoschaal van de beheerder", + "Likelihood times impact, calculated by the server": "Kans maal impact, berekend door de server", + "Where the risk stands": "Hoe het risico ervoor staat", + "The person who watches this risk": "De persoon die dit risico in de gaten houdt", + "How the project answers the risk": "Hoe het project op het risico reageert", + "What is done to prevent it or soften it, in Markdown": "Wat er gedaan wordt om het te voorkomen of te verzachten, in Markdown", + "When to look at this risk again": "Wanneer dit risico opnieuw bekeken wordt", + "Very low": "Zeer laag", + "Very high": "Zeer hoog", + "All projects": "Alle projecten", + "Project status report": "Projectstatusrapportage", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Een gedateerde rapportage over hoe een project ervoor staat op geld, organisatie, tijd, informatie, kwaliteit en risico (de GROTIK-aspecten), elk met een toelichting.", + "The project this report is about": "Het project waar deze rapportage over gaat", + "Report date": "Rapportagedatum", + "The day the report describes": "De dag die de rapportage beschrijft", + "Money": "Geld", + "How the project stands on this aspect": "Hoe het project ervoor staat op dit aspect", + "On track": "Op koers", + "At risk": "Onder druk", + "Off track": "Uit koers", + "Money note": "Toelichting geld", + "A short explanation of this status": "Een korte toelichting op deze status", + "Organisation": "Organisatie", + "Organisation note": "Toelichting organisatie", + "Time": "Tijd", + "Time note": "Toelichting tijd", + "Information": "Informatie", + "Information note": "Toelichting informatie", + "Quality": "Kwaliteit", + "Quality note": "Toelichting kwaliteit", + "Risk note": "Toelichting risico", + "Overall": "Totaal", + "The worst of the six statuses, calculated by the server": "De slechtste van de zes statussen, berekend door de server", + "Health: money": "Gezondheid: geld", + "Copied from the newest status report": "Overgenomen uit de nieuwste statusrapportage", + "Health: organisation": "Gezondheid: organisatie", + "Health: time": "Gezondheid: tijd", + "Health: information": "Gezondheid: informatie", + "Health: quality": "Gezondheid: kwaliteit", + "Health: risk": "Gezondheid: risico", + "Health: overall": "Gezondheid: totaal", + "Health: report date": "Gezondheid: rapportagedatum", + "The date of the newest status report": "De datum van de nieuwste statusrapportage", + "New report": "Nieuwe rapportage", + "Only the project owner writes status reports.": "Alleen de projecteigenaar schrijft statusrapportages.", + "Latest report, {date}": "Laatste rapportage, {date}", + "Aspect": "Aspect", + "Note": "Toelichting", + "Report history": "Eerdere rapportages", + "Author": "Auteur", + "No status reports yet": "Nog geen statusrapportages", + "Write the first report": "Schrijf de eerste rapportage", + "Choose a status for every aspect to save the report.": "Kies voor elk aspect een status om de rapportage op te slaan.", + "Suggested: on track.": "Voorstel: op koers.", + "Suggested: at risk.": "Voorstel: onder druk.", + "Suggested: off track.": "Voorstel: uit koers.", + "1 task is past its due date.": "1 taak is over de einddatum.", + "{count} tasks are past their due date.": "{count} taken zijn over de einddatum.", + "The end date has passed with 1 open task.": "De einddatum is verstreken met 1 open taak.", + "The end date has passed with {count} open tasks.": "De einddatum is verstreken met {count} open taken.", + "No open task is past its due date.": "Geen open taak is over de einddatum.", + "The highest open risk, \"{title}\", scores {score}.": "Het hoogste open risico, \"{title}\", scoort {score}.", + "There are no open risks.": "Er zijn geen open risico's.", + "Costs are at {percent}% of the budget.": "De kosten staan op {percent}% van het budget.", + "No suggestion: the project has no budget.": "Geen voorstel: het project heeft geen budget.", + "No suggestion: no costs are recorded for this project yet.": "Geen voorstel: er zijn nog geen kosten geboekt voor dit project.", + "The report was not saved. Only the project owner can write status reports.": "De rapportage is niet opgeslagen. Alleen de projecteigenaar kan statusrapportages schrijven.", + "No report": "Geen rapportage", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Een groep projecten die door dezelfde mensen wordt gerund, zoals een afdeling of een programma. De beheerders lezen elk project erin.", + "The name of the portfolio": "De naam van het portfolio", + "What the portfolio holds and who runs it": "Wat het portfolio bevat en wie het runt", + "A colour for the portfolio's section in project lists": "Een kleur voor de sectie van het portfolio in projectlijsten", + "Managers": "Beheerders", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-gebruikers-ID's van de mensen die het portfolio runnen", + "Order": "Volgorde", + "Where the portfolio comes in project lists, lowest first": "Waar het portfolio in projectlijsten staat, laagste eerst", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "De eigen risicoschaal van dit portfolio als JSON, in dezelfde vorm als de schaal voor de hele app. Leeg betekent de schaal voor de hele app.", + "Portfolio readers": "Portfoliolezers", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-gebruikers-ID's van de beheerders van het portfolio van het project", + "The portfolio this project belongs to": "Het portfolio waar dit project bij hoort", + "No portfolio": "Geen portfolio", + "All portfolios": "Alle portfolio's", + "You read this project as a manager of its portfolio. Only its members change it.": "Je leest dit project als beheerder van het portfolio. Alleen de leden wijzigen het.", + "Portfolios": "Portfolio's", + "Portfolio status": "Portfoliostatus", + "No portfolios yet": "Nog geen portfolio's", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Een beheerder voegt portfolio's toe onder Projecten, Portfolio's. Projecten in een portfolio staan hier met hun status.", + "Roll-up": "Samenvatting", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} op koers, {atRisk} met risico, {offTrack} uit koers, {noReport} zonder rapportage", + "No project in this portfolio that you can read.": "Geen project in dit portfolio dat je kunt lezen.", + "Start": "Start", + "End": "Einde", + "Budget": "Budget", + "Last report": "Laatste rapportage", + "Out of date": "Verouderd", + "Portfolio timeline": "Portfoliotijdlijn", + "Zoom": "Zoom", + "Could not load the timeline": "De tijdlijn kon niet worden geladen", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Een beheerder voegt portfolio's toe onder Projecten, Portfolio's. Projecten in een portfolio staan hier op één tijdlijn.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Open een project om de fasen en taken te zien. De tijdlijn is alleen-lezen.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Weggelaten omdat je ze niet kunt lezen: {count} projecten", + "Week": "Week", + "Day": "Dag", + "Month": "Maand", + "Please try again later.": "Probeer het later opnieuw.", + "Status reports": "Statusrapportages", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Na hoeveel dagen de laatste statusrapportage van een project als verouderd wordt gemarkeerd in het portfolio-overzicht", + "Reporting period (days)": "Rapportageperiode (dagen)", + "The reporting period is a whole number of days from 1 to 365.": "De rapportageperiode is een heel aantal dagen van 1 tot 365.", + "Reporting period saved": "Rapportageperiode opgeslagen", + "The reporting period was not saved. Please try again.": "De rapportageperiode is niet opgeslagen. Probeer het opnieuw.", + "Every project of a portfolio with its status per aspect, rolled up.": "Elk project van een portfolio met de status per aspect, samengevat.", + "The projects of a portfolio on one timeline.": "De projecten van een portfolio op één tijdlijn.", + "Phases": "Fasen", + "Add phase": "Fase toevoegen", + "No phases yet": "Nog geen fasen", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Deel het project op in fasen, zoals initiatie, definitie en realisatie. Een fase sluit zodra het afsluitende document is geüpload.", + "{hours} hours": "{hours} uur", + "Concluding document: {title}": "Afsluitend document: {title}", + "Concluding document missing": "Afsluitend document ontbreekt", + "Move {title} up": "{title} omhoog", + "Move {title} down": "{title} omlaag", + "Close phase": "Fase afsluiten", + "Phase": "Fase", + "Files": "Bestanden", + "Notes": "Notities", + "Audit trail": "Audittrail", + "Edit phase": "Fase bewerken", + "Name": "Naam", + "Budget hours": "Budgeturen", + "Could not save the phase. Please try again.": "De fase kon niet worden opgeslagen. Probeer het opnieuw.", + "Close phase {title}": "Fase {title} afsluiten", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Een fase sluit met het afsluitende document: upload het hier of kies een van de bestanden van de fase.", + "Concluding document": "Afsluitend document", + "This phase has no files yet.": "Deze fase heeft nog geen bestanden.", + "Upload a document": "Document uploaden", + "The document was not uploaded. Please try again.": "Het document is niet geüpload. Probeer het opnieuw.", + "Upload the concluding document before you close this phase.": "Upload het afsluitende document voordat je deze fase afsluit.", + "This phase cannot be closed from its current status.": "Deze fase kan vanuit de huidige status niet worden afgesloten.", + "The phase was not closed. Please try again.": "De fase is niet afgesloten. Probeer het opnieuw.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Het id van het bestand op deze fase dat de fase afsluit. De fase kan pas worden afgerond als het is ingevuld en het bestand is bijgevoegd.", + "Import from Microsoft Project": "Importeren uit Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Kies een planning die in Microsoft Project als XML is opgeslagen. Er wordt niets geïmporteerd tot je bevestigt.", + "Plan file": "Planningsbestand", + "What the import creates": "Wat de import aanmaakt", + "Tasks": "Taken", + "Sub-tasks": "Subtaken", + "Milestones": "Mijlpalen", + "Links": "Koppelingen", + "Already imported, updated in place: {count}": "Al geïmporteerd, ter plekke bijgewerkt: {count}", + "What does not carry over": "Wat niet wordt overgenomen", + "Tasks with resources, which are not imported: {count}": "Taken met resources, die niet worden geïmporteerd: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Taken dieper dan niveau 3, geplaatst onder hun taak op niveau 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Koppelingen anders dan einde-naar-begin, geïmporteerd als gerelateerde koppelingen: {count}", + "Link lags, which are dropped: {count}": "Vertragingen op koppelingen, die vervallen: {count}", + "Links to a summary task, which are not imported: {count}": "Koppelingen naar een overzichtstaak, die niet worden geïmporteerd: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Koppelingen naar taken buiten deze planning, die niet worden geïmporteerd: {count}", + "No longer in the plan": "Niet meer in de planning", + "These stay in the project; remove them yourself if they are no longer needed.": "Deze blijven in het project; verwijder ze zelf als ze niet meer nodig zijn.", + "Import": "Importeren", + "Close": "Sluiten", + "The plan is imported: {created} created, {updated} updated.": "De planning is geïmporteerd: {created} aangemaakt, {updated} bijgewerkt.", + "Links that would close a loop were left out: {count}": "Koppelingen die een lus zouden vormen zijn weggelaten: {count}", + "The import stopped part-way. Run it again to finish it.": "De import is halverwege gestopt. Voer hem opnieuw uit om hem af te maken.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Sla de planning in Microsoft Project op via Bestand, Opslaan als, XML-indeling, en importeer dat bestand.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Dit bestand declareert een DOCTYPE of entiteiten, en die worden niet geaccepteerd.", + "The file is larger than 10 MB.": "Het bestand is groter dan 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "De planning heeft meer dan 2.000 taken, meer dan één import aankan.", + "This file is not a Microsoft Project plan in XML format.": "Dit bestand is geen Microsoft Project-planning in XML-indeling.", + "Choose a file to import.": "Kies een bestand om te importeren.", + "Only the project owner can import a plan.": "Alleen de projecteigenaar kan een planning importeren.", + "The plan could not be read. Please try again.": "De planning kon niet worden gelezen. Probeer het opnieuw.", + "Linked case: {title}": "Gekoppelde zaak: {title}", + "Linked to a case": "Gekoppeld aan een zaak", + "Hand over to case": "Overdragen aan zaak", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopieert elk bestand van het project en de taken, en een bestand dat het project beschrijft, ongewijzigd naar de gekoppelde zaak.", + "{date} by {user}": "{date} door {user}", + "Files copied: {count}": "Bestanden gekopieerd: {count}", + "Files that failed: {names}": "Mislukte bestanden: {names}", + "The handover failed. Please try again.": "De overdracht is mislukt. Probeer het opnieuw.", + "The linked case could not be found, or you cannot open it.": "De gekoppelde zaak is niet gevonden, of je kunt hem niet openen.", + "Case handovers": "Overdrachten aan de zaak", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Elke keer dat de bestanden en metadata van het project aan de zaak zijn overgedragen: wanneer, door wie, aan welke zaak, elk gekopieerd bestand met zijn SHA-256, en de bestanden die mislukten.", + "Finance": "Financiën", + "Add cost line": "Kostenregel toevoegen", + "Delivery terms": "Leveringsvoorwaarden", + "Billing model": "Factuurmodel", + "Budget in euro": "Budget in euro", + "Budget in hours": "Budget in uren", + "Hourly rate in euro": "Uurtarief in euro", + "Planned start": "Geplande start", + "Planned end": "Gepland einde", + "Planned dates": "Geplande data", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Geen budget afgesproken", + "Hours": "Uren", + "Only the project owner and the portfolio managers see the amounts.": "Alleen de projecteigenaar en de portfoliomanagers zien de bedragen.", + "Budget against cost per category": "Budget tegenover kosten per categorie", + "Labour (booked time)": "Arbeid (geboekte uren)", + "No category": "Geen categorie", + "Hours are not available": "Uren zijn niet beschikbaar", + "Not yet assigned to a category": "Nog niet aan een categorie toegewezen", + "Total": "Totaal", + "{spent} spent, {remaining} remaining": "{spent} besteed, {remaining} over", + "Budget against cost per phase": "Budget tegenover kosten per fase", + "No phase": "Geen fase", + "Cost lines": "Kostenregels", + "From the finance system": "Uit het financiële systeem", + "Edit cost line {amount}": "Kostenregel {amount} bewerken", + "No cost lines yet": "Nog geen kostenregels", + "Commitments": "Verplichtingen", + "Actual cost": "Werkelijke kosten", + "Forecast": "Prognose", + "Remaining": "Resterend", + "Not planned yet": "Nog niet gepland", + "{start} to {end}": "{start} tot {end}", + "The terms were not saved. Please try again.": "De voorwaarden zijn niet opgeslagen. Probeer het opnieuw.", + "Terms saved": "Voorwaarden opgeslagen", + "Fixed price": "Vaste prijs", + "Hourly": "Per uur", + "Not billed": "Niet gefactureerd", + "Commitment": "Verplichting", + "Edit cost line": "Kostenregel bewerken", + "Kind": "Soort", + "Amount in euro": "Bedrag in euro", + "Remove": "Verwijderen", + "Could not save the cost line. Only the project owner changes the money of a project.": "De kostenregel kon niet worden opgeslagen. Alleen de projecteigenaar wijzigt het geld van een project.", + "Could not remove the cost line. Please try again.": "De kostenregel kon niet worden verwijderd. Probeer het opnieuw.", + "{amount} over budget": "{amount} boven budget", + "Cost categories": "Kostencategorieën", + "The categories every project splits its budget and costs into, one per line": "De categorieën waarin elk project zijn budget en kosten verdeelt, één per regel", + "Categories": "Categorieën", + "Give at least one category, each name once.": "Geef minstens één categorie, elke naam één keer.", + "Cost categories saved": "Kostencategorieën opgeslagen", + "The cost categories were not saved. Please try again.": "De kostencategorieën zijn niet opgeslagen. Probeer het opnieuw.", + "Finance line": "Financiële regel", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Eén geldbedrag op een project: een budget, een verplichting, werkelijke kosten of een prognose, in een kostencategorie en eventueel een fase. Ingevoerd door de projecteigenaar, of door het financiële systeem via de integratie-app.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Het project waar dit bedrag bij hoort. Leeg voor een regel uit het financiële systeem waarvan het projectnummer bij geen project past.", + "The phase this amount belongs to, if any": "De fase waar dit bedrag bij hoort, als die er is", + "The cost category, one of the categories the admin set up": "De kostencategorie, een van de categorieën die de beheerder heeft ingesteld", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Of het bedrag een budget, een verplichting, werkelijke kosten of een prognose is", + "Amount": "Bedrag", + "The amount in the reporting currency (euro)": "Het bedrag in de rapportagevaluta (euro)", + "The date the amount was booked or is expected": "De datum waarop het bedrag is geboekt of wordt verwacht", + "What the amount is for": "Waar het bedrag voor is", + "Whether a person entered the line or the finance system sent it": "Of een persoon de regel invoerde of het financiële systeem hem stuurde", + "Entered by hand": "Met de hand ingevoerd", + "Finance line id": "Id van de financiële regel", + "The finance system's own id of this line. One imported line per id.": "Het eigen id van deze regel in het financiële systeem. Eén geïmporteerde regel per id.", + "Project number": "Projectnummer", + "The project number the finance system sent, matched against the project key": "Het projectnummer dat het financiële systeem stuurde, vergeleken met de projectsleutel", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Het portfolio van het project van de regel, overgenomen van het project zodat portfoliototalen één filter nodig hebben", + "Finance readers": "Financiële lezers", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-gebruikers-UID's van de mensen die dit bedrag mogen zien: de projecteigenaar en de managers van het portfolio", + "Project owner": "Projecteigenaar", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-gebruikers-UID van de projecteigenaar, die handmatige regels mag wijzigen en verwijderen", + "How the client pays: not billed, a fixed price, or by the hour.": "Hoe de klant betaalt: niet gefactureerd, een vaste prijs of per uur.", + "Portfolio finance": "Portfoliofinanciën", + "You cannot see the money of any project in this portfolio": "Je kunt het geld van geen enkel project in dit portfolio zien", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "De server gaf kostenregels van projecten buiten dit portfolio terug, dus deze totalen kunnen onjuist zijn.", + "Projects left out because you cannot see their money: {count}": "Weggelaten projecten omdat je hun geld niet kunt zien: {count}", + "Unmatched finance lines": "Niet-gekoppelde financiële regels", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, verplichtingen, werkelijke kosten en prognose opgeteld over een portfolio.", + "Subprojects": "Deelprojecten", + "{done} of {total}": "{done} van {total}", + "{done} of {total} tasks done, including subprojects": "{done} van {total} taken klaar, inclusief deelprojecten", + "Show the subprojects of {title}": "Deelprojecten van {title} tonen", + "Hide the subprojects of {title}": "Deelprojecten van {title} verbergen", + "Part of": "Onderdeel van", + "No parent project": "Geen bovenliggend project", + "A project cannot sit under one of its own subprojects.": "Een project kan niet onder een van zijn eigen deelprojecten vallen.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projecten nesten hooguit drie niveaus diep: programma, project en deelproject.", + "Parent project": "Bovenliggend project", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Het project waaronder dit project valt, zoals een programma. Projecten nesten hooguit drie niveaus diep.", + "Yes": "Ja", + "No": "Nee", + "{label} (required)": "{label} (verplicht)", + "{label} is required": "{label} is verplicht", + "Project field": "Projectveld", + "A field an admin adds to every project, such as a policy area or a contract value.": "Een veld dat een beheerder aan elk project toevoegt, zoals een beleidsveld of een contractwaarde.", + "Key": "Sleutel", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "De vaste naam waaronder de waarde wordt opgeslagen, in lower camel case. Houd hem gelijk zodra projecten hem gebruiken.", + "Label": "Label", + "The name people see next to the field": "De naam die mensen naast het veld zien", + "What the field holds": "Wat het veld bevat", + "Text": "Tekst", + "Number": "Getal", + "Choice": "Keuze", + "Person": "Persoon", + "Yes or no": "Ja of nee", + "Options": "Opties", + "The choices of a choice field": "De keuzes van een keuzeveld", + "Required": "Verplicht", + "Whether a project must fill in the field": "Of een project het veld moet invullen", + "Where the field appears, lowest first": "Waar het veld verschijnt, laagste eerst", + "Applies to": "Geldt voor", + "What the field is added to": "Waaraan het veld wordt toegevoegd", + "Custom fields": "Eigen velden", + "The values of the project fields an admin defined, keyed by the field's key.": "De waarden van de projectvelden die een beheerder instelde, op de sleutel van het veld.", + "Project fields": "Projectvelden", + "Related": "Gerelateerd", + "Remove link": "Koppeling verwijderen", + "Link type": "Soort koppeling", + "Relates to": "Hangt samen met", + "Duplicates": "Dupliceert", + "Project key": "Projectsleutel", + "Every task number starts with it, such as VERG-42.": "Elk taaknummer begint ermee, zoals VERG-42.", + "This key is already used by another project.": "Deze sleutel wordt al door een ander project gebruikt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Gebruik 2 tot 10 letters en cijfers, beginnend met een letter.", + "The key cannot change once tasks carry it.": "De sleutel kan niet meer veranderen zodra taken hem dragen.", + "Project saved. The existing tasks get their numbers in the background.": "Project opgeslagen. De bestaande taken krijgen op de achtergrond hun nummer.", + "Next task number": "Volgend taaknummer", + "The number the next task of this project gets in its key. Only the system writes it.": "Het nummer dat de volgende taak van dit project in zijn sleutel krijgt. Alleen het systeem schrijft het.", + "Restore {title}": "{title} herstellen", + "Restore": "Herstellen", + "Project restored": "Project hersteld", + "Could not restore the project": "Het project kon niet worden hersteld", + "Bring this project back to the active list.": "Zet dit project terug in de lijst met actieve projecten.", + "Restore project": "Project herstellen", + "Request reason": "Reden van de aanvraag", + "Why the requester needs this project. Filled in when the project is requested.": "Waarom de aanvrager dit project nodig heeft. Ingevuld bij de aanvraag.", + "Reviewed by": "Beoordeeld door", + "The user who approved or rejected the request.": "De gebruiker die de aanvraag goedkeurde of afwees.", + "Reviewed at": "Beoordeeld op", + "When the request was approved or rejected.": "Wanneer de aanvraag werd goedgekeurd of afgewezen.", + "Review note": "Toelichting van de beoordelaar", + "The reviewer's reason, shown to the requester when a request is not approved.": "De reden van de beoordelaar, die de aanvrager ziet als een aanvraag niet is goedgekeurd.", + "Members of these groups": "Leden van deze groepen", + "Groups that may create projects": "Groepen die projecten mogen aanmaken", + "The group {group} no longer exists. Save to remove it.": "De groep {group} bestaat niet meer. Sla op om hem te verwijderen.", + "Review project request": "Projectaanvraag beoordelen", + "Requested by": "Aangevraagd door", + "Why it is needed": "Waarom het nodig is", + "Desired start date": "Gewenste startdatum", + "Why is it not approved?": "Waarom wordt het niet goedgekeurd?", + "Give a reason. The requester sees it.": "Geef een reden. De aanvrager ziet die.", + "Approve": "Goedkeuren", + "Reject": "Afwijzen", + "Reject request": "Aanvraag afwijzen", + "The review was not saved. Try again.": "De beoordeling is niet opgeslagen. Probeer het opnieuw.", + "This project is waiting for review": "Dit project wacht op beoordeling", + "This request was not approved": "Deze aanvraag is niet goedgekeurd", + "Reason: {note}": "Reden: {note}", + "Review request": "Aanvraag beoordelen", + "Request a project": "Een project aanvragen", + "Step {step} of 2": "Stap {step} van 2", + "Why is this project needed?": "Waarom is dit project nodig?", + "Give a reason. The reviewer reads it.": "Geef een reden. De beoordelaar leest die.", + "Back": "Terug", + "Next": "Volgende", + "Send request": "Aanvraag versturen", + "The request was not sent. Try again.": "De aanvraag is niet verstuurd. Probeer het opnieuw.", + "Requested": "Aangevraagd", + "Not approved": "Niet goedgekeurd", + "Your request was sent": "Je aanvraag is verstuurd", + "Let everyone else request a project": "Laat alle anderen een project aanvragen", + "Add a task": "Taak toevoegen", + "Delete task": "Taak verwijderen", + "Edit task": "Taak bewerken", + "Write": "Schrijven", + "Preview": "Voorbeeld", + "Markdown works here: headings, lists and links.": "Markdown werkt hier: koppen, lijsten en links.", + "Could not save the task. Please try again.": "De taak kon niet worden opgeslagen. Probeer het opnieuw.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Op \"{title}\" is tijd geschreven, dus deze kan niet worden verwijderd. Je kunt de taak wel annuleren: de tijdregels blijven bestaan.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "\"{title}\" verwijderen? De koppelingen met andere taken worden ook verwijderd. Dit kan niet ongedaan worden gemaakt.", + "Keep task": "Taak behouden", + "Cancel task": "Taak annuleren", + "Only the reporter, the project owner or an admin can delete this task.": "Alleen de melder, de projecteigenaar of een beheerder kan deze taak verwijderen.", + "Could not delete the task. Please try again.": "De taak kon niet worden verwijderd. Probeer het opnieuw.", + "Could not cancel the task. Please try again.": "De taak kon niet worden geannuleerd. Probeer het opnieuw.", + "Responsible": "Verantwoordelijk", + "Also working on this": "Werkt hier ook aan", + "Labels": "Labels", + "Could not change the priority. Please try again.": "De prioriteit kon niet worden gewijzigd. Probeer het opnieuw.", + "Other project members who work on this task alongside the person responsible.": "Andere projectleden die samen met de verantwoordelijke aan deze taak werken.", + "Duplicate": "Dupliceren", + "Could not copy the task. Please try again.": "De taak kon niet worden gekopieerd. Probeer het opnieuw.", + "Subtasks": "Subtaken", + "{done} of {total} done": "{done} van {total} klaar", + "Add a subtask": "Subtaak toevoegen", + "Checklist": "Checklist", + "Checklist item actions": "Acties voor checklistitem", + "Add a checklist item": "Checklistitem toevoegen", + "Subtasks: {estimate} estimated, {logged} logged": "Subtaken: {estimate} geschat, {logged} geschreven", + "Total estimate: {total}": "Totale schatting: {total}", + "Part of {title}": "Onderdeel van {title}", + "Checklist: {count} done": "Checklist: {count} klaar", + "This task has subtasks: {count}.": "Deze taak heeft subtaken: {count}.", + "Keep subtasks as separate tasks": "Subtaken als losse taken behouden", + "Delete subtasks too": "Subtaken ook verwijderen", + "Copy of {title}": "Kopie van {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "De taak is gekopieerd, maar niet al haar subtaken. Controleer de kopie.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Kleine stappen binnen de taak. Elk item heeft een id, een tekst en of het klaar is.", + "Open work per person and per project.": "Openstaand werk per persoon en per project.", + "View": "Weergave", + "By person": "Per persoon", + "By project": "Per project", + "Hours left": "Resterende uren", + "Tasks without an estimate": "Taken zonder schatting", + "Due in 14 days": "Binnen 14 dagen", + "Shared": "Gedeeld", + "Unassigned": "Niet toegewezen", + "{hours} h": "{hours} u", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Je ziet werk in de projecten die je kunt inzien. Uren tellen voor de verantwoordelijke; gedeelde taken tellen zonder uren.", + "No open work in these projects.": "Geen openstaand werk in deze projecten.", + "Open work": "Openstaand werk", + "{count} open tasks": "{count} open taken", + "Create a project to see capacity here.": "Maak een project aan om hier de capaciteit te zien.", + "My tasks": "Mijn taken", + "Show all my tasks": "Alle taken van mij tonen", + "No tasks assigned to you": "Geen taken aan jou toegewezen", + "Browse projects": "Projecten bekijken", + "Later": "Later", + "Due {date}": "Uiterlijk {date}", + "Could not change the status. Please try again.": "De status kon niet worden gewijzigd. Probeer het opnieuw.", + "Completed today": "Vandaag afgerond", + "My open tasks": "Mijn open taken", + "My overdue tasks": "Mijn te late taken", + "My tasks in progress": "Mijn taken in uitvoering", + "Pin to the top": "Bovenaan vastzetten", + "Unpin": "Losmaken", + "Pinned": "Vastgezet", + "Actions for {title}": "Acties voor {title}", + "Could not save your project order. Please try again.": "Je projectvolgorde kon niet worden opgeslagen. Probeer het opnieuw.", + "No boards yet": "Nog geen borden", + "Create a project to get a board.": "Maak een project aan om een bord te krijgen.", + "Use the Projects page to create and manage your projects and tasks.": "Gebruik de pagina Projecten om je projecten en taken aan te maken en te beheren.", + "Go to projects": "Naar projecten", + "You are not a member of any projects yet.": "Je bent nog geen lid van een project.", + "Could not search for users. Please try again.": "Gebruikers zoeken lukte niet. Probeer het opnieuw.", + "Project creation is restricted to administrators.": "Alleen beheerders kunnen projecten aanmaken.", + "Only the project owner or an administrator can delete this project.": "Alleen de projecteigenaar of een beheerder kan dit project verwijderen.", + "No projects are available to you yet. Ask an administrator to create one.": "Er zijn nog geen projecten voor jou beschikbaar. Vraag een beheerder er een aan te maken.", + "Due: {date}": "Uiterlijk: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Taken met een start- of einddatum verschijnen op de tijdlijn. Voeg datums toe om ze hier te zien.", + "You do not have access to this project.": "Je hebt geen toegang tot dit project.", + "Zoom level": "Zoomniveau", + "Unscheduled": "Niet ingepland", + "Start: {date}": "Start: {date}", + "Today": "Vandaag", + "No scheduled tasks": "Geen ingeplande taken", + "An unexpected error occurred.": "Er is een onverwachte fout opgetreden.", + "Column {number} name": "Naam van kolom {number}", + "Failed to save creation policy": "Het aanmaakbeleid kon niet worden opgeslagen", + "All authenticated users": "Alle ingelogde gebruikers", + "Control who may create new projects": "Bepaal wie nieuwe projecten mag aanmaken", + "Administrators only": "Alleen beheerders", + "Project creation": "Projecten aanmaken", + "Allow project creation": "Projecten aanmaken toestaan", + "Creation policy saved successfully": "Aanmaakbeleid opgeslagen", + "Initializing…": "Bezig met starten…", + "e.g. 2h 30m, 90m, 1.5h": "bijv. 2h 30m, 90m, 1.5h", + "Log time": "Tijd schrijven", + "Save estimate": "Schatting opslaan", + "Logged: {logged}": "Geschreven: {logged}", + "over by {amount}": "{amount} te veel", + "Time tracking": "Tijdregistratie", + "Estimate": "Schatting", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Voer een geldige schatting in (bijv. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Voer een geldige duur in (bijv. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "De tijdregel kon niet worden opgeslagen. Probeer het opnieuw.", + "Edit time entry": "Tijdregel bewerken", + "Duration": "Duur", + "Date range": "Periode", + "Last week": "Vorige week", + "No time logged": "Geen tijd geschreven", + "Log time on a task to see it here.": "Schrijf tijd op een taak om die hier te zien.", + "To date": "Tot datum", + "This week": "Deze week", + "Total: {total}": "Totaal: {total}", + "From date": "Vanaf datum", + "Custom range": "Eigen periode", + "All time": "Alles", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Een taak kon niet worden verwijderd, dus er kunnen gegevens achterblijven. Verwijder het project opnieuw.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Een tijdregel kon niet worden verwijderd, dus er kunnen gegevens achterblijven. Verwijder het project opnieuw.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Een kolom kon niet worden verwijderd, dus er kunnen gegevens achterblijven. Verwijder het project opnieuw.", + "Could not delete the project. Please try again.": "Het project kon niet worden verwijderd. Probeer het opnieuw.", + "Draft": "Concept", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Of de les een concept is dat alleen de docent ziet, doorgaat of vervalt.", + "New release": "Nieuwe release", + "Roadmap chart. The same releases and epics are listed below.": "Roadmapgrafiek. Dezelfde releases en epics staan hieronder in een lijst.", + "Nothing on the roadmap yet": "Nog niets op de roadmap", + "Releases with a target date and epics with dated tasks appear here.": "Releases met een streefdatum en epics met taken die een datum hebben, verschijnen hier.", + "Releases": "Releases", + "No releases yet": "Nog geen releases", + "Target date: {date}": "Streefdatum: {date}", + "No target date": "Geen streefdatum", + "Edit {name}": "{name} bewerken", + "Mark {name} as released": "{name} als uitgebracht markeren", + "Mark as released": "Markeren als uitgebracht", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Nog geen epics. Open een taak om er een epic van te maken.", + "Not scheduled yet": "Nog niet gepland", + "Planned": "Gepland", + "Released": "Uitgebracht", + "Edit release": "Release bewerken", + "Target date": "Streefdatum", + "Could not save the release. Please try again.": "Kon de release niet opslaan. Probeer het opnieuw.", + "Every task of this release is done or cancelled.": "Elke taak van deze release is klaar of geannuleerd.", + "Not finished yet: {count}": "Nog niet klaar: {count}", + "What happens to these tasks?": "Wat gebeurt er met deze taken?", + "Move to {name}": "Verplaatsen naar {name}", + "Remove the release": "De release weghalen", + "Keep it on {name}": "Op {name} laten staan", + "Could not mark the release as released. Please try again.": "Kon de release niet als uitgebracht markeren. Probeer het opnieuw.", + "Roadmap": "Roadmap", + "Tasks or roadmap": "Taken of roadmap", + "Release": "Release", + "Epic": "Epic", + "This task is an epic": "Deze taak is een epic", + "A named, dated delivery of a project that its tasks are planned against.": "Een benoemde, gedateerde oplevering van een project waartegen de taken worden gepland.", + "Name of the release": "Naam van de release", + "The project this release belongs to": "Het project waar deze release bij hoort", + "What this release delivers": "Wat deze release oplevert", + "When work on the release starts": "Wanneer het werk aan de release begint", + "The date the release is due": "De datum waarop de release klaar moet zijn", + "Whether the release is planned, released or archived": "Of de release gepland, uitgebracht of gearchiveerd is", + "Released on": "Uitgebracht op", + "When the release was marked as released": "Wanneer de release als uitgebracht is gemarkeerd", + "The release this task is planned for": "De release waarvoor deze taak is gepland", + "Board view options": "Weergaveopties van het bord", + "Colour cards": "Kaarten kleuren", + "No colour": "Geen kleur", + "By label": "Op label", + "Swimlanes": "Swimlanes", + "No swimlanes": "Geen swimlanes", + "By assignee": "Op toegewezen persoon", + "By epic": "Op epic", + "No assignee": "Niet toegewezen", + "No epic": "Geen epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kaarten blijven in hun epic-rij. Wijzig de epic op de taakpagina.", + "Hand over to": "Overdragen aan", + "Could not save your board view. It applies until you reload.": "Kon de bordweergave niet opslaan. Ze geldt tot u de pagina herlaadt.", + "Timetable wish": "Roosterwens", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Een wens die de generator meeweegt. Een harde wens houdt hij altijd aan, een zachte wens waar het kan.", + "Whether the wish is about a teacher, a group, a room or one activity": "Of de wens gaat over een docent, een groep, een lokaal of één activiteit", + "Teacher": "Docent", + "Group": "Groep", + "Reference": "Verwijzing", + "The user, group, room or activity the wish is about": "De gebruiker, groep, het lokaal of de activiteit waar de wens over gaat", + "What the wish asks for": "Wat de wens vraagt", + "Not on these periods": "Niet op deze lesuren", + "Preferably not on these periods": "Liever niet op deze lesuren", + "At most a number of lessons a day": "Hoogstens een aantal lessen per dag", + "No free periods between lessons": "Geen tussenuren", + "Always the same room": "Altijd hetzelfde lokaal", + "Periods": "Lesuren", + "The periods of the week the wish is about, such as wed-5": "De lesuren van de week waar de wens over gaat, zoals wed-5", + "Limit": "Grens", + "The most lessons a day, for a wish of that kind": "Het hoogste aantal lessen per dag, voor een wens van die soort", + "Strength": "Sterkte", + "Whether the generator must keep the wish or should keep it": "Of de generator de wens moet of zou moeten aanhouden", + "Hard": "Hard", + "Soft": "Zacht", + "Weight": "Gewicht", + "How much a soft wish counts, from 1 to 3": "Hoe zwaar een zachte wens telt, van 1 tot 3", + "Why the wish exists": "Waarom de wens bestaat", + "Timetable scenario": "Roosterscenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Eén weekpatroon, gemaakt door de generator of overgenomen uit het huidige rooster. Het bewaart de invoer en hoe goed het de wensen aanhoudt.", + "The name timetablers know the scenario by": "De naam waaronder roostermakers het scenario kennen", + "Whether the generator made it or it came from the current timetable": "Of de generator het maakte of het uit het huidige rooster komt", + "Generated": "Gegenereerd", + "From the current timetable": "Uit het huidige rooster", + "Week of": "Week van", + "The Monday of the first week of the window": "De maandag van de eerste week van de periode", + "Window start": "Begin van de periode", + "The first day the week pattern applies to": "De eerste dag waarop het weekpatroon geldt", + "Window end": "Einde van de periode", + "The last day the week pattern applies to": "De laatste dag waarop het weekpatroon geldt", + "Waiting, generating, done, failed, or published as draft lessons": "Wachtend, bezig, klaar, mislukt of gepubliceerd als conceptlessen", + "Waiting": "Wachtend", + "Generating": "Bezig met genereren", + "Failed": "Mislukt", + "Published": "Gepubliceerd", + "Seed": "Startgetal", + "The number the generator starts from, so a run can be repeated": "Het getal waarmee de generator begint, zodat een run te herhalen is", + "Input": "Invoer", + "The periods, rooms, lessons and wishes the scenario was made from": "De lesuren, lokalen, lessen en wensen waaruit het scenario is gemaakt", + "Placements": "Plaatsingen", + "Each lesson with the period and room it was given": "Elke les met het lesuur en lokaal dat hij kreeg", + "Unplaced lessons": "Niet geplaatste lessen", + "Lessons without a place, each with the hard wish that blocked it": "Lessen zonder plek, elk met de harde wens die hem tegenhield", + "Broken wishes": "Geschonden wensen", + "The wishes this scenario breaks, with the lessons that break them": "De wensen die dit scenario niet aanhoudt, met de lessen die ze schenden", + "Measures": "Maatstaven", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Geplaatste lessen, geschonden wensen, tussenuren van docenten, lessen per dag en lokaalgebruik", + "Reason": "Reden", + "Why the run failed": "Waarom de run mislukte", + "Published at": "Gepubliceerd op", + "When the scenario was written out as draft lessons": "Wanneer het scenario als conceptlessen is weggeschreven", + "Edit wish": "Wens bewerken", + "New wish": "Nieuwe wens", + "Hard: the generator always keeps it": "Hard: de generator houdt zich er altijd aan", + "Soft: the generator keeps it where it can": "Zacht: de generator houdt zich eraan waar het kan", + "Weight (1 to 3)": "Gewicht (1 tot 3)", + "Most lessons a day": "Hoogstens aantal lessen per dag", + "Period": "Lesuur", + "{day} period {number}": "{day} lesuur {number}", + "Teacher (user name)": "Docent (gebruikersnaam)", + "Activity (group:subject)": "Activiteit (groep:vak)", + "Say who or what the wish is about.": "Geef aan over wie of wat de wens gaat.", + "Choose at least one period.": "Kies minstens één lesuur.", + "The limit is a whole number of 1 or more.": "De limiet is een heel getal van 1 of meer.", + "Timetable": "Rooster", + "Wishes": "Wensen", + "Timetable wishes": "Roosterwensen", + "Generator run": "Generatorrun", + "Generator progress": "Voortgang van de generator", + "The run failed: {reason}": "De run is mislukt: {reason}", + "{placed} of {lessons} lessons placed": "{placed} van {lessons} lessen geplaatst", + "Generate again": "Opnieuw genereren", + "Generate": "Genereren", + "Every lesson has a place.": "Elke les heeft een plek.", + "Lesson": "Les", + "No free period and room": "Geen vrij lesuur en lokaal", + "Broken soft wishes": "Geschonden zachte wensen", + "Every soft wish is kept.": "Elke zachte wens is gehouden.", + "Wish": "Wens", + "Lessons": "Lessen", + "Generating: {percent}% of the time budget used": "Bezig met genereren: {percent}% van de tijd gebruikt", + "Waiting to start": "Wacht op start", + "Published as draft lessons": "Gepubliceerd als conceptlessen", + "Could not read the scenario.": "Kon het scenario niet lezen.", + "Could not start the run.": "Kon de run niet starten.", + "Scenarios": "Scenario's", + "Timetable scenarios": "Roosterscenario's", + "Scenario": "Scenario", + "Take the current timetable": "Huidig rooster overnemen", + "Could not take the current timetable.": "Kon het huidige rooster niet overnemen.", + "Broken hard wishes": "Geschonden harde wensen", + "Not on a period of the week grid": "Niet op een lesuur van het weekrooster", + "Compare scenarios": "Scenario's vergelijken", + "Scenarios to compare": "Te vergelijken scenario's", + "Choose two or three scenarios to compare them.": "Kies twee of drie scenario's om ze te vergelijken.", + "Measure": "Meting", + "Best": "Beste", + "Lessons that differ": "Lessen die verschillen", + "No lesson differs.": "Geen les verschilt.", + "Not placed": "Niet geplaatst", + "{period} in {room}": "{period} in {room}", + "Lessons placed": "Geplaatste lessen", + "Lessons without a place": "Lessen zonder plek", + "Clashes": "Botsingen", + "Hard wishes broken": "Geschonden harde wensen", + "Soft wishes broken": "Geschonden zachte wensen", + "Soft wishes broken, weighted": "Geschonden zachte wensen, gewogen", + "Free periods between lessons, all teachers": "Tussenuren, alle docenten", + "Most free periods of one teacher": "Meeste tussenuren van één docent", + "Most lessons of one group on a day": "Meeste lessen van één groep op een dag", + "Room use": "Lokaalgebruik", + "Publish as draft lessons": "Publiceren als conceptlessen", + "Draft lessons written: {count}": "Conceptlessen geschreven: {count}", + "Could not publish the scenario.": "Kon het scenario niet publiceren.", + "Rules": "Regels", + "Rules for {column}": "Regels voor {column}", + "When a card enters this column": "Wanneer een kaart deze kolom binnenkomt", + "Action": "Actie", + "Set the priority": "Prioriteit instellen", + "Assign to": "Toewijzen aan", + "Assign the person who moved the card": "De persoon die de kaart verplaatste toewijzen", + "Remove the assignee": "Toewijzing verwijderen", + "Add a label": "Label toevoegen", + "No longer a project member": "Geen projectlid meer", + "This label no longer exists": "Dit label bestaat niet meer", + "Add rule": "Regel toevoegen", + "Remove rule": "Regel verwijderen", + "No rules yet. Add one to change a card when it enters this column.": "Nog geen regels. Voeg er een toe om een kaart te wijzigen wanneer die deze kolom binnenkomt.", + "Could not save the rules. Please try again.": "De regels konden niet worden opgeslagen. Probeer het opnieuw.", + "1 rule runs when a card enters this column": "1 regel wordt uitgevoerd wanneer een kaart deze kolom binnenkomt", + "{count} rules run when a card enters this column": "{count} regels worden uitgevoerd wanneer een kaart deze kolom binnenkomt", + "Rules applied: {changes}": "Regels toegepast: {changes}", + "assigned to {name}": "toegewezen aan {name}", + "assignee removed": "toewijzing verwijderd", + "priority {priority}": "prioriteit {priority}", + "label {label}": "label {label}", + "What happens to a card when it enters this column, applied in list order.": "Wat er met een kaart gebeurt wanneer die deze kolom binnenkomt, in de volgorde van de lijst.", + "Value": "Waarde", + "What the rule does to the card.": "Wat de regel met de kaart doet.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "De prioriteit, de gebruikers-id of de label-id die de actie gebruikt; leeg voor acties zonder waarde.", + "is not": "is niet", + "{dimension} is not": "{dimension} is niet", + "Saved filters": "Opgeslagen filters", + "No saved filters yet": "Nog geen opgeslagen filters", + "Save filter": "Filter opslaan", + "Rename \"{name}\"": "\"{name}\" hernoemen", + "Delete \"{name}\"": "\"{name}\" verwijderen", + "Clear filters": "Filters wissen", + "Showing {shown} of {total} tasks": "{shown} van {total} taken zichtbaar", + "Me": "Ik", + "No date": "Geen datum", + "Rename saved filter": "Opgeslagen filter hernoemen", + "Share with the project": "Delen met het project", + "Give the filter a name": "Geef het filter een naam", + "Could not save the filter. Please try again.": "Het filter kon niet worden opgeslagen. Probeer het opnieuw.", + "Some labels in \"{name}\" no longer exist and were left out.": "Sommige labels in \"{name}\" bestaan niet meer en zijn weggelaten.", + "Could not delete the filter. Please try again.": "Het filter kon niet worden verwijderd. Probeer het opnieuw.", + "Saved filter": "Opgeslagen filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Een benoemd bordfilter van één project, alleen zichtbaar voor wie het opsloeg, tenzij gedeeld met het project.", + "The project whose board the filter applies to": "Het project op wiens bord het filter werkt", + "The name the filter is listed under": "De naam waaronder het filter in de lijst staat", + "Saved by": "Opgeslagen door", + "Nextcloud user id of the person who saved the filter": "Nextcloud-gebruikers-id van wie het filter opsloeg", + "Shared with the project": "Gedeeld met het project", + "Whether every project member sees and applies the filter": "Of elk projectlid het filter ziet en kan toepassen", + "Criteria": "Criteria", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Het filter: toegewezen aan, label, prioriteit en vervaldatum, elk met is of is niet en de waarden", + "Cross-project view": "Projectoverstijgende weergave", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Een opgeslagen selectie van projecten waarvan de taken samen in statusbanen worden getoond, gedeeld met de mensen die erin staan.", + "Shared with": "Gedeeld met", + "The name the view is listed under": "De naam waaronder de weergave wordt vermeld", + "Nextcloud user id of the person who saved the view": "Nextcloud-gebruikers-id van de persoon die de weergave heeft opgeslagen", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-gebruikers-id's van de mensen met wie de weergave is gedeeld", + "The projects whose tasks the view shows, at most twenty": "De projecten waarvan de weergave de taken toont, hooguit twintig", + "1 project in this view is hidden from you.": "1 project in deze weergave is voor jou verborgen.", + "{count} projects in this view are hidden from you.": "{count} projecten in deze weergave zijn voor jou verborgen.", + "{project} has no column for {status}.": "{project} heeft geen kolom voor {status}.", + "This view does not exist or is not shared with you.": "Deze weergave bestaat niet of is niet met je gedeeld.", + "\"{task}\" moved to {status}.": "\"{task}\" is verplaatst naar {status}.", + "Project: {title}": "Project: {title}", + "Cross-project views": "Projectoverstijgende weergaven", + "New view": "Nieuwe weergave", + "Edit view": "Weergave bewerken", + "Delete view": "Weergave verwijderen", + "Give the view a name": "Geef de weergave een naam", + "Pick at least one project": "Kies minstens één project", + "A view shows at most {max} projects": "Een weergave toont hooguit {max} projecten", + "Could not save the view. Please try again.": "Kon de weergave niet opslaan. Probeer het opnieuw.", + "Could not delete the view. Please try again.": "Kon de weergave niet verwijderen. Probeer het opnieuw.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "\"{title}\" verwijderen? De projecten en hun taken blijven zoals ze zijn.", + "People see the tasks of the projects they are in, never more.": "Mensen zien de taken van de projecten waarin ze zitten, nooit meer.", + "No views yet. A view shows the tasks of several of your projects together.": "Nog geen weergaven. Een weergave toont de taken van meerdere van je projecten samen.", + "Projects in view: {count}": "Projecten in weergave: {count}", + "Notify me when a task is assigned to me": "Stuur mij een melding als een taak aan mij wordt toegewezen", + "Also send these to me by email": "Stuur deze ook per e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Voeg een e-mailadres toe in je persoonlijke Nextcloud-instellingen om e-mail te krijgen.", + "Code link": "Codekoppeling", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Een commit, branch, merge request of issue in een codeplatform dat aan een taak werkt.", + "The task the link belongs to": "De taak waar de koppeling bij hoort", + "The project of the task": "Het project van de taak", + "Task key": "Taaksleutel", + "The task key the forge text named, such as VC-12": "De taaksleutel die in de tekst van het codeplatform stond, zoals VC-12", + "What the link points at": "Waar de koppeling naar wijst", + "Link": "Koppeling", + "The address of the item in the forge": "Het adres van het item in het codeplatform", + "The commit message, branch name or merge request title": "Het commitbericht, de branchnaam of de titel van het merge request", + "Repository": "Repository", + "The repository, such as acme/portal": "De repository, zoals acme/portal", + "Forge id": "Id in het codeplatform", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Het eigen id van het item in het codeplatform, zoals github:acme/portal#42 of een commit-hash", + "State": "Status", + "The state of a merge request or issue": "De status van een merge request of issue", + "Who made the commit or opened the merge request": "Wie de commit maakte of het merge request opende", + "When the commit was made or the merge request last changed": "Wanneer de commit is gemaakt of het merge request voor het laatst veranderde", + "Added by": "Toegevoegd door", + "Whether a person added the link or the integration wrote it": "Of een persoon de koppeling toevoegde of de integratie hem schreef", + "Nextcloud user UIDs of project members": "Nextcloud-gebruikers-id's van projectleden", + "Add link": "Koppeling toevoegen", + "Added by hand": "Met de hand toegevoegd", + "Branch": "Branch", + "Code": "Code", + "Commit": "Commit", + "From the integration": "Via de integratie", + "Link to a commit, branch or merge request": "Koppeling naar een commit, branch of merge request", + "Merge request": "Merge request", + "Merged": "Samengevoegd", + "No code linked yet. Name {key} in a commit message or paste a link.": "Nog geen code gekoppeld. Noem {key} in een commitbericht of plak een koppeling.", + "No code linked yet. Paste a link to a commit or merge request.": "Nog geen code gekoppeld. Plak een koppeling naar een commit of merge request.", + "Paste a web address that starts with https://.": "Plak een webadres dat begint met https://.", + "Remove link {title}": "Koppeling {title} verwijderen", + "The link could not be added.": "De koppeling kon niet worden toegevoegd.", + "The link could not be removed.": "De koppeling kon niet worden verwijderd.", + "This link is already on the task.": "Deze koppeling staat al bij de taak.", + "Code forges": "Codeplatforms", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Koppel GitHub-commits en pull requests aan taken. Integriq ontvangt de gebeurtenissen; planninq roept GitHub nooit aan.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Download de configuratie en importeer die in Integriq. Vul daarna een geheim in bij de regel \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Voeg in GitHub een webhook aan de repository toe met dit adres en hetzelfde geheim. Kies inhoudstype application/json en de gebeurtenissen push en pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Noem de taaksleutel, zoals VC-12, in een commitbericht, branchnaam of titel van een pull request. De koppeling verschijnt dan bij die taak.", + "Without Integriq, project members can still paste a link on the task page.": "Zonder Integriq kunnen projectleden nog steeds een koppeling plakken op de taakpagina.", + "Download the Integriq configuration": "Integriq-configuratie downloaden", + "Calendar": "Kalender", + "Previous": "Vorige", + "Calendar view": "Kalenderweergave", + "Starts:": "Begint:", + "No tasks with a date in this month.": "Geen taken met een datum in deze maand.", + "Week of {start} to {end}": "Week van {start} tot {end}", + "My calendar": "Mijn kalender", + "Show as list": "Als lijst tonen", + "Show as calendar": "Als kalender tonen", + "Open my calendar": "Mijn kalender openen", + "Nextcloud Tasks": "Nextcloud Taken", + "Show my tasks in Nextcloud Tasks": "Mijn taken tonen in Nextcloud Taken", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "De taken die aan je zijn toegewezen of met je zijn gedeeld, staan in een lijst \"Planninq\" in Nextcloud Taken en Agenda. Wijzigingen die je daar maakt, worden vervangen bij de volgende wijziging in Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Deze server kan niet naar Nextcloud Taken schrijven, dus de export is niet beschikbaar.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Beheerd door Planninq. Wijzigingen die je hier maakt, worden vervangen bij de volgende wijziging in Planninq.", + "Working days and holidays": "Werkdagen en feestdagen", + "Dates set on the timeline skip the days that are not working days.": "Datums die je op de tijdlijn zet, slaan de dagen over die geen werkdag zijn.", + "Working weekdays": "Werkdagen van de week", + "Non-working days": "Niet-werkdagen", + "No non-working days yet.": "Nog geen niet-werkdagen.", + "Add day": "Dag toevoegen", + "Year": "Jaar", + "Add Dutch national holidays": "Nederlandse feestdagen toevoegen", + "Save working days": "Werkdagen opslaan", + "Choose at least one working weekday.": "Kies minstens één werkdag.", + "Working days saved.": "Werkdagen opgeslagen.", + "Could not save the working days.": "De werkdagen konden niet worden opgeslagen.", + "New Year's Day": "Nieuwjaarsdag", + "Easter Sunday": "Eerste paasdag", + "Easter Monday": "Tweede paasdag", + "King's Day": "Koningsdag", + "Liberation Day": "Bevrijdingsdag", + "Ascension Day": "Hemelvaartsdag", + "Whit Sunday": "Eerste pinksterdag", + "Whit Monday": "Tweede pinksterdag", + "Christmas Day": "Eerste kerstdag", + "Boxing Day": "Tweede kerstdag", + "Dates of {title}": "Datums van {title}", + "The due date cannot be before the start date.": "De vervaldatum kan niet voor de startdatum liggen.", + "{title}, from {start} to {end}": "{title}, van {start} tot {end}", + "The dates could not be saved.": "De datums konden niet worden opgeslagen.", + "{title} now runs from {start} to {end}": "{title} loopt nu van {start} tot {end}", + "Auto-scheduling": "Automatisch plannen", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Als dit aan staat, biedt het later zetten van een vervaldatum op de tijdlijn aan om de taken die erop wachten mee te schuiven.", + "Move blocked tasks along when a task slips": "Geblokkeerde taken meeschuiven als een taak uitloopt", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Op de tijdlijn biedt een latere vervaldatum aan om de taken die erop wachten mee te schuiven. Alleen \"blokkeert\"-koppelingen tellen, en taken schuiven alleen later.", + "Move the tasks that wait for {title}?": "De taken verschuiven die op {title} wachten?", + "These tasks wait for it and would start after its new due date:": "Deze taken wachten erop en zouden na de nieuwe vervaldatum beginnen:", + "{count} tasks would move; the first {limit} are listed.": "{count} taken zouden verschuiven; de eerste {limit} staan hier.", + "Now": "Nu", + "After the move": "Na het verschuiven", + "Only this task": "Alleen deze taak", + "Move all": "Alles verschuiven", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Gestopt bij {title}: de datums konden niet worden opgeslagen. De taken daarvoor zijn verschoven.", + "Cumulative flow": "Cumulatieve flow", + "Show as chart": "Als grafiek tonen", + "Show as table": "Als tabel tonen", + "Tasks per column per day": "Taken per kolom per dag", + "Tasks without recorded history in this period: {count}": "Taken zonder vastgelegde geschiedenis in deze periode: {count}", + "Lead and cycle time": "Doorlooptijd en cyclustijd", + "No tasks were finished in this period.": "Er zijn in deze periode geen taken afgerond.", + "Finished tasks": "Afgeronde taken", + "Cycle time, average": "Cyclustijd, gemiddeld", + "Cycle time, 85th percentile": "Cyclustijd, 85e percentiel", + "Lead time, average": "Doorlooptijd, gemiddeld", + "Tasks whose finish time was estimated from their history: {count}": "Taken waarvan de eindtijd uit de geschiedenis is geschat: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Cyclustijd van elke afgeronde taak, met het gemiddelde en het 85e percentiel", + "Slowest tasks": "Traagste taken", + "cycle {cycle}, lead {lead}": "cyclus {cycle}, doorloop {lead}", + "{days} days": "{days} dagen", + "Could not load the flow of this project.": "De flow van dit project kon niet worden geladen.", + "Last {days} days": "Laatste {days} dagen", + "Portfolio flow": "Portfolioflow", + "An admin adds portfolios under Projects, Portfolios.": "Een beheerder voegt portfolio's toe onder Projecten, Portfolio's.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projecten die niet getoond worden, omdat er hooguit 50 tegelijk getoond worden: {count}", + "Could not load the flow of this portfolio.": "De flow van dit portfolio kon niet worden geladen.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Cumulatieve flow en cyclustijd over de projecten van een portfolio.", + "Edit report": "Rapport bewerken", + "Only tasks where": "Alleen taken waarbij", + "Group by": "Groeperen op", + "Display": "Weergave", + "Share with everyone who can read its projects": "Delen met iedereen die de projecten mag lezen", + "The report could not be saved.": "Het rapport kon niet worden opgeslagen.", + "Number of tasks": "Aantal taken", + "Bar": "Staaf", + "Donut": "Donut", + "Table": "Tabel", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} van {total} projecten in dit rapport zijn voor jou niet zichtbaar", + "No tasks match this report.": "Geen taken passen bij dit rapport.", + "None": "Geen", + "Could not load this report.": "Dit rapport kon niet worden geladen.", + "Report": "Rapport", + "Your reports": "Je rapporten", + "My reports": "Mijn rapporten", + "Shared reports": "Gedeelde rapporten", + "You have not built a report yet.": "Je hebt nog geen rapport gemaakt.", + "Nobody has shared a report with you yet.": "Niemand heeft nog een rapport met je gedeeld.", + "Reports you built over tasks, and the ones shared with you.": "Rapporten die je over taken hebt gemaakt, en de rapporten die met je zijn gedeeld.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Een opgeslagen vraag over taken: welke projecten, welke filters, gegroepeerd waarop, geteld of opgeteld, en getoond als tabel of grafiek.", + "The name the report is listed under": "De naam waaronder het rapport in de lijst staat", + "What the report shows and who it is for": "Wat het rapport laat zien en voor wie het is", + "Nextcloud user id of the person who saved the report": "Nextcloud-gebruikers-id van wie het rapport heeft opgeslagen", + "Who can open the report": "Wie het rapport kan openen", + "Only me": "Alleen ik", + "Everyone who can read its projects": "Iedereen die de projecten mag lezen", + "The projects the report covers, at most fifty": "De projecten die het rapport beslaat, hooguit vijftig", + "Filters": "Filters", + "Task fields and the value each must equal": "Taakvelden en de waarde waaraan elk gelijk moet zijn", + "The task field the report groups on": "Het taakveld waarop het rapport groepeert", + "Count the tasks, or add up a number on them": "De taken tellen, of een getal op de taken optellen", + "Sum": "Som", + "Sum of": "Som van", + "The number added up when the measure is a sum": "Het getal dat wordt opgeteld als de maat een som is", + "Story points": "Storypoints", + "Estimated duration": "Geschatte duur", + "How the report is shown": "Hoe het rapport wordt getoond", + "Issue type": "Soort issue", + "Task fields and the value each must equal; empty when the report covers every task": "Taakvelden en de waarde waaraan elk moet voldoen; leeg als het rapport alle taken omvat", + "The status a task must have": "De status die een taak moet hebben", + "The priority a task must have": "De prioriteit die een taak moet hebben", + "The user a task must be assigned to": "De gebruiker aan wie een taak moet zijn toegewezen", + "A label a task must carry": "Een label dat een taak moet dragen", + "The board column a task must be in": "De bordkolom waarin een taak moet staan", + "The issue type a task must have": "Het soort issue dat een taak moet hebben", + "Manager groups": "Beheerdersgroepen", + "Member groups": "Ledengroepen", + "Viewer groups": "Lezersgroepen", + "Viewers": "Lezers", + "Owning group": "Eigenaarsgroep", + "Nextcloud groups whose members manage the project": "Nextcloud-groepen waarvan de leden het project beheren", + "Nextcloud groups whose members work on the project": "Nextcloud-groepen waarvan de leden aan het project werken", + "Nextcloud groups whose members may read the project": "Nextcloud-groepen waarvan de leden het project mogen lezen", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-gebruikers die het project beheren: instellingen, leden en werk", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-gebruikers die het project en het werk mogen lezen maar niet wijzigen", + "The Nextcloud group that owns the project with its creator, at most one": "De Nextcloud-groep die het project samen met de maker bezit, hooguit één", + "Nextcloud user ids who may read this through the project": "Nextcloud-gebruikers die dit via het project mogen lezen", + "Nextcloud groups whose members may change this through the project": "Nextcloud-groepen waarvan de leden dit via het project mogen wijzigen", + "Nextcloud groups whose members may read this through the project": "Nextcloud-groepen waarvan de leden dit via het project mogen lezen", + "Search for a person or a group…": "Zoek een persoon of een groep…", + "No one found. Your admin's sharing settings decide who you can find.": "Niemand gevonden. De instellingen voor delen van je beheerder bepalen wie je kunt vinden.", + "Type at least two characters": "Typ minstens twee tekens", + "Everyone in this group": "Iedereen in deze groep", + "Could not search for people. Please try again.": "Zoeken naar personen is mislukt. Probeer het opnieuw.", + "Could not remove the group": "De groep kon niet worden verwijderd", + "Only the owner and managers change who is on this project.": "Alleen de eigenaar en beheerders bepalen wie er op dit project staat.", + "Role of {name}": "Rol van {name}", + "Manager": "Beheerder", + "Member": "Lid", + "Viewer": "Lezer", + "Could not change the role": "De rol kon niet worden gewijzigd", + "Owned by group: {name}": "Eigendom van groep: {name}", + "No group owns this project.": "Geen groep is eigenaar van dit project.", + "Owned by group": "Eigendom van groep", + "Search for a group…": "Zoek een groep…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Geen groep gevonden. De deelinstellingen van je beheerder bepalen welke groepen je kunt vinden.", + "No owning group": "Geen eigenaar-groep", + "Could not search for groups. Please try again.": "Kon niet naar groepen zoeken. Probeer het opnieuw.", + "Could not change the owning group": "De eigenaar-groep kon niet worden gewijzigd", + "You can read this project. Only its members change it.": "Je kunt dit project lezen. Alleen de leden wijzigen het.", + "Course": "Vak", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Het vak dat in deze les gegeven wordt, zoals een keuzevak, als de leerapp van de school het kent.", + "Online meeting link": "Link naar de online les", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Waar leerlingen online aan deze les deelnemen. Leerlingen zien alleen bij een https-link een knop Deelnemen." }, "plurals": {}, "pluralForm": "nplurals=2; plural=(n != 1);" diff --git a/l10n/pl.js b/l10n/pl.js index 1d63af14..ddc53c0a 100644 --- a/l10n/pl.js +++ b/l10n/pl.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktywne projekty", + "Archived projects": "Zarchiwizowane projekty", + "Boards": "Tablice", + "My projects": "Moje projekty", + "Portfolio": "Portfolio", + "Project board": "Tablica projektu", + "Projects I am in": "Projekty, w których uczestniczę", + "Timeline": "Oś czasu", + "Timesheet": "Ewidencja czasu pracy", + "Features & roadmap": "Funkcje i plan rozwoju", + "Flow": "Przepływ", + "Flows": "Przepływy", + "Reports": "Raporty", + "Pick a report to open it.": "Wybierz raport, aby go otworzyć.", + "In progress": "W toku", + "Date": "Data", + "Due": "Termin", + "Assignee": "Przypisane do", + "Who": "Kto", + "What": "Co", + "Minutes": "Minuty", + "Entries": "Wpisy", + "Most recent": "Najnowsze", + "Per person": "Na osobę", + "By status": "Według statusu", + "By priority": "Według priorytetu", + "Task status": "Status zadań", + "Time spent": "Poświęcony czas", + "Capacity": "Wydajność", + "Due soonest": "Najbliższy termin", + "Minutes logged": "Zarejestrowane minuty", + "Nothing is due": "Nic nie jest zaplanowane", + "Nothing logged yet": "Nic jeszcze nie zarejestrowano", + "What is open, what is blocked, and what is overdue.": "Co jest otwarte, co zablokowane i co po terminie.", + "How allocation is spread across the people working on projects.": "Jak obciążenie rozkłada się na osoby pracujące nad projektami.", + "Hours logged, and the projects they went to.": "Zarejestrowane godziny i projekty, na które poszły.", + "Billable": "Rozliczalne", + "Budget: {amount}": "Budżet: {amount}", + "Loading projects": "Wczytywanie projektów", + "No projects for this client yet": "Brak projektów dla tego klienta", + "Open in Planninq": "Otwórz w Planninq", + "This project could not be found": "Nie znaleziono tego projektu", + "Untitled project": "Projekt bez nazwy", + "and {count} more": "i jeszcze {count}", + "Store": "Sklep", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Zainstaluj rejestry, schematy i przepływy opublikowane przez inne organizacje.", + "Work Date": "Data pracy", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Akcje kolumny", + "Columns": "Kolumny", + "Could not remove the column. Please try again.": "Nie udało się usunąć kolumny. Spróbuj ponownie.", + "Could not save the column. Please try again.": "Nie udało się zapisać kolumny. Spróbuj ponownie.", + "Done column": "Kolumna ukończonych", + "Edit column": "Edytuj kolumnę", + "Keep the card's status": "Zachowaj status karty", + "Move its cards to": "Przenieś jej karty do", + "Move left": "Przesuń w lewo", + "Move right": "Przesuń w prawo", + "Status of cards moved here": "Status kart przeniesionych tutaj", + "The last done column cannot be removed.": "Ostatniej kolumny ukończonych nie można usunąć.", + "WIP limit": "Limit WIP", + "over limit": "powyżej limitu", + "The status a card gets when it is moved into this column.": "Status, który karta otrzymuje po przeniesieniu do tej kolumny.", + "All priorities": "Wszystkie priorytety", + "Could not create the task. Please try again.": "Nie udało się utworzyć zadania. Spróbuj ponownie.", + "Created": "Utworzono", + "Move to backlog": "Do backlogu", + "Move to board": "Na tablicę", + "New task": "Nowe zadanie", + "Nothing in the backlog": "Backlog jest pusty", + "Rank": "Pozycja", + "Sort by": "Sortuj według", + "Sort by rank to reorder": "Sortuj według pozycji, aby zmienić kolejność", + "Task actions": "Akcje zadania", + "All labels": "Wszystkie etykiety", + "Filter tasks by label": "Filtruj zadania według etykiety", + "View timeline": "Pokaż oś czasu", + "Board": "Tablica", + "List": "Lista", + "Column": "Kolumna", + "Board or list": "Tablica lub lista", + "Log": "Dziennik", + "Add entry": "Dodaj wpis", + "Show": "Pokaż", + "No actions yet": "Brak działań", + "Closed": "Zamknięty", + "Entry actions": "Akcje wpisu", + "Add action": "Dodaj działanie", + "by {author}": "autor: {author}", + "saved {time}": "zapisano {time}", + "Attendees: {names}": "Uczestnicy: {names}", + "Add the first entry": "Dodaj pierwszy wpis", + "Issues": "Problemy", + "Lessons learned": "Wnioski", + "Meetings": "Spotkania", + "Decisions": "Decyzje", + "Actions": "Działania", + "Issue": "Problem", + "Lesson learned": "Wniosek", + "Meeting": "Spotkanie", + "Decision": "Decyzja", + "About this project": "O projekcie", + "No description yet": "Brak opisu", + "Start date": "Data rozpoczęcia", + "Not set": "Nie ustawiono", + "End date": "Data zakończenia", + "Progress": "Postęp", + "No tasks yet": "Brak zadań", + "Open the board": "Otwórz tablicę", + "People": "Osoby", + "Owner": "Właściciel", + "Latest log entries": "Najnowsze wpisy", + "Open the log": "Otwórz dziennik", + "{done} of {total} tasks done": "Ukończono {done} z {total} zadań", + "Edit entry": "Edytuj wpis", + "Type": "Rodzaj", + "Attendees": "Uczestnicy", + "Issue is closed": "Problem jest zamknięty", + "Could not save the entry. Please try again.": "Nie udało się zapisać wpisu. Spróbuj ponownie.", + "From: {title}": "Z: {title}", + "What needs to happen": "Co trzeba zrobić", + "Could not create the action. Please try again.": "Nie udało się utworzyć działania. Spróbuj ponownie.", + "The action was created but could not be linked to the entry.": "Działanie utworzono, ale nie udało się go powiązać z wpisem.", + "Project pages": "Strony projektu", + "Overview": "Przegląd", + "Risks": "Ryzyka", + "Log entry": "Wpis dziennika", + "A short name for the entry": "Krótka nazwa wpisu", + "Project": "Projekt", + "The project this entry belongs to": "Projekt, do którego należy ten wpis", + "What kind of entry this is": "Jakiego rodzaju jest to wpis", + "When it happened": "Kiedy to się stało", + "What happened, in Markdown": "Co się stało, w Markdownie", + "Whether an issue is still open": "Czy problem jest nadal otwarty", + "The people at a meeting": "Osoby na spotkaniu", + "Tasks that came out of this entry": "Zadania wynikające z tego wpisu", + "Add risk": "Dodaj ryzyko", + "Risk": "Ryzyko", + "Score": "Wynik", + "Response": "Reakcja", + "Review date": "Data przeglądu", + "no longer on the project": "nie należy już do projektu", + "Edit {title}": "Edytuj {title}", + "No risks recorded yet": "Nie zapisano jeszcze żadnych ryzyk", + "Add the first risk": "Dodaj pierwsze ryzyko", + "Medium": "Średnie", + "Mitigating": "Łagodzone", + "Occurred": "Wystąpiło", + "Avoid": "Unikać", + "Reduce": "Ograniczać", + "Transfer": "Przenieść", + "Accept": "Zaakceptować", + "Highest open risks": "Najwyższe otwarte ryzyka", + "No open risks": "Brak otwartych ryzyk", + "Open the risk register": "Otwórz rejestr ryzyk", + "Edit risk": "Edytuj ryzyko", + "What could go wrong": "Co może pójść źle", + "Likelihood": "Prawdopodobieństwo", + "Impact": "Wpływ", + "Score {score}": "Wynik {score}", + "Countermeasures": "Środki zaradcze", + "Could not save the risk. Please try again.": "Nie udało się zapisać ryzyka. Spróbuj ponownie.", + "Risks by likelihood and impact": "Ryzyka według prawdopodobieństwa i wpływu", + "Risk scale": "Skala ryzyka", + "The levels every project scores its risks on, and where low turns into medium and high": "Poziomy, na których każdy projekt ocenia swoje ryzyka, i gdzie niskie przechodzi w średnie i wysokie", + "Number of levels": "Liczba poziomów", + "Likelihood labels": "Etykiety prawdopodobieństwa", + "Impact labels": "Etykiety wpływu", + "Level {level}": "Poziom {level}", + "Medium from score": "Średnie od wyniku", + "High from score": "Wysokie od wyniku", + "Risk scale saved": "Zapisano skalę ryzyka", + "1 risk uses level {level}. Change it first.": "1 ryzyko używa poziomu {level}. Najpierw je zmień.", + "{count} risks use level {level}. Change them first.": "Ryzyka używające poziomu {level}: {count}. Najpierw je zmień.", + "Every level needs a label, and high must start above medium.": "Każdy poziom potrzebuje etykiety, a wysokie musi zaczynać się powyżej średniego.", + "The project this risk belongs to": "Projekt, do którego należy to ryzyko", + "The cause and the effect, in Markdown": "Przyczyna i skutek, w Markdownie", + "Category": "Kategoria", + "A free grouping, such as planning, budget or supplier": "Dowolne grupowanie, np. harmonogram, budżet lub dostawca", + "How likely it is, on the admin's risk scale": "Jak bardzo jest prawdopodobne, w skali ryzyka administratora", + "How hard it would hit, on the admin's risk scale": "Jak mocno by uderzyło, w skali ryzyka administratora", + "Likelihood times impact, calculated by the server": "Prawdopodobieństwo razy wpływ, obliczane przez serwer", + "Where the risk stands": "Na jakim etapie jest ryzyko", + "The person who watches this risk": "Osoba, która pilnuje tego ryzyka", + "How the project answers the risk": "Jak projekt reaguje na ryzyko", + "What is done to prevent it or soften it, in Markdown": "Co się robi, aby mu zapobiec lub je złagodzić, w Markdownie", + "When to look at this risk again": "Kiedy ponownie przejrzeć to ryzyko", + "Very low": "Bardzo niskie", + "Very high": "Bardzo wysokie", + "All projects": "Wszystkie projekty", + "Project status report": "Raport stanu projektu", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datowany raport o tym, jak projekt wypada pod względem pieniędzy, organizacji, czasu, informacji, jakości i ryzyka (aspekty GROTIK), każdy z notatką.", + "The project this report is about": "Projekt, którego dotyczy raport", + "Report date": "Data raportu", + "The day the report describes": "Dzień opisany w raporcie", + "Money": "Pieniądze", + "How the project stands on this aspect": "Jak projekt wypada w tym aspekcie", + "On track": "Zgodnie z planem", + "At risk": "Zagrożony", + "Off track": "Poza planem", + "Money note": "Notatka o pieniądzach", + "A short explanation of this status": "Krótkie wyjaśnienie tego stanu", + "Organisation": "Organizacja", + "Organisation note": "Notatka o organizacji", + "Time": "Czas", + "Time note": "Notatka o czasie", + "Information": "Informacja", + "Information note": "Notatka o informacji", + "Quality": "Jakość", + "Quality note": "Notatka o jakości", + "Risk note": "Notatka o ryzyku", + "Overall": "Ogółem", + "The worst of the six statuses, calculated by the server": "Najgorszy z sześciu stanów, obliczany przez serwer", + "Health: money": "Kondycja: pieniądze", + "Copied from the newest status report": "Skopiowano z najnowszego raportu stanu", + "Health: organisation": "Kondycja: organizacja", + "Health: time": "Kondycja: czas", + "Health: information": "Kondycja: informacja", + "Health: quality": "Kondycja: jakość", + "Health: risk": "Kondycja: ryzyko", + "Health: overall": "Kondycja: ogółem", + "Health: report date": "Kondycja: data raportu", + "The date of the newest status report": "Data najnowszego raportu stanu", + "New report": "Nowy raport", + "Only the project owner writes status reports.": "Tylko właściciel projektu pisze raporty stanu.", + "Latest report, {date}": "Ostatni raport, {date}", + "Aspect": "Aspekt", + "Note": "Notatka", + "Report history": "Historia raportów", + "Author": "Autor", + "No status reports yet": "Brak raportów stanu", + "Write the first report": "Napisz pierwszy raport", + "Choose a status for every aspect to save the report.": "Wybierz stan dla każdego aspektu, aby zapisać raport.", + "Suggested: on track.": "Sugestia: zgodnie z planem.", + "Suggested: at risk.": "Sugestia: zagrożony.", + "Suggested: off track.": "Sugestia: poza planem.", + "1 task is past its due date.": "1 zadanie jest po terminie.", + "{count} tasks are past their due date.": "Zadania po terminie: {count}.", + "The end date has passed with 1 open task.": "Data zakończenia minęła, a 1 zadanie jest otwarte.", + "The end date has passed with {count} open tasks.": "Data zakończenia minęła, a otwartych zadań jest {count}.", + "No open task is past its due date.": "Żadne otwarte zadanie nie jest po terminie.", + "The highest open risk, \"{title}\", scores {score}.": "Najwyższe otwarte ryzyko, \"{title}\", ma wynik {score}.", + "There are no open risks.": "Brak otwartych ryzyk.", + "Costs are at {percent}% of the budget.": "Koszty wynoszą {percent}% budżetu.", + "No suggestion: the project has no budget.": "Brak sugestii: projekt nie ma budżetu.", + "No suggestion: no costs are recorded for this project yet.": "Brak sugestii: dla tego projektu nie zarejestrowano jeszcze kosztów.", + "The report was not saved. Only the project owner can write status reports.": "Raport nie został zapisany. Tylko właściciel projektu może pisać raporty stanu.", + "No report": "Brak raportu", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Grupa projektów prowadzonych przez te same osoby, na przykład dział lub program. Jej kierownicy czytają każdy projekt w niej.", + "The name of the portfolio": "Nazwa portfela", + "What the portfolio holds and who runs it": "Co zawiera portfel i kto go prowadzi", + "A colour for the portfolio's section in project lists": "Kolor sekcji portfela na listach projektów", + "Managers": "Kierownicy", + "Nextcloud user UIDs of the people who run the portfolio": "Identyfikatory użytkowników Nextcloud osób prowadzących portfel", + "Order": "Kolejność", + "Where the portfolio comes in project lists, lowest first": "Miejsce portfela na listach projektów, od najniższego", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Własna skala ryzyka tego portfela w formacie JSON, w tej samej postaci co skala całej aplikacji. Puste oznacza skalę aplikacji.", + "Portfolio readers": "Czytelnicy portfela", + "Nextcloud user UIDs of the managers of the project's portfolio": "Identyfikatory użytkowników Nextcloud kierowników portfela projektu", + "The portfolio this project belongs to": "Portfel, do którego należy ten projekt", + "No portfolio": "Bez portfela", + "All portfolios": "Wszystkie portfele", + "You read this project as a manager of its portfolio. Only its members change it.": "Czytasz ten projekt jako kierownik jego portfela. Zmieniają go tylko jego członkowie.", + "Portfolios": "Portfele", + "Portfolio status": "Status portfela", + "No portfolios yet": "Brak portfeli", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administrator dodaje portfele w Projekty, Portfele. Projekty z portfela są tu wymienione z ich statusem.", + "Roll-up": "Podsumowanie", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} zgodnie z planem, {atRisk} zagrożone, {offTrack} poza planem, {noReport} bez raportu", + "No project in this portfolio that you can read.": "Brak projektu w tym portfelu, który możesz odczytać.", + "Start": "Początek", + "End": "Koniec", + "Budget": "Budżet", + "Last report": "Ostatni raport", + "Out of date": "Nieaktualny", + "Portfolio timeline": "Oś czasu portfela", + "Zoom": "Powiększenie", + "Could not load the timeline": "Nie udało się wczytać osi czasu", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administrator dodaje portfele w Projekty, Portfele. Projekty z portfela są tu pokazane na jednej osi czasu.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Otwórz projekt, aby zobaczyć jego fazy i zadania. Oś czasu jest tylko do odczytu.", + "Phase: {title}": "Faza: {title}", + "Left out because you cannot read them: {count} projects": "Pominięte, bo nie możesz ich odczytać: {count} projektów", + "Week": "Tydzień", + "Day": "Dzień", + "Month": "Miesiąc", + "Please try again later.": "Spróbuj ponownie później.", + "Status reports": "Raporty statusu", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Po ilu dniach ostatni raport statusu projektu jest oznaczany jako nieaktualny w przeglądzie portfela", + "Reporting period (days)": "Okres raportowania (dni)", + "The reporting period is a whole number of days from 1 to 365.": "Okres raportowania to pełna liczba dni od 1 do 365.", + "Reporting period saved": "Okres raportowania zapisany", + "The reporting period was not saved. Please try again.": "Okres raportowania nie został zapisany. Spróbuj ponownie.", + "Every project of a portfolio with its status per aspect, rolled up.": "Każdy projekt portfela ze statusem dla każdego aspektu, podsumowany.", + "The projects of a portfolio on one timeline.": "Projekty portfela na jednej osi czasu.", + "Phases": "Fazy", + "Add phase": "Dodaj fazę", + "No phases yet": "Brak faz", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Podziel projekt na fazy, np. inicjację, definicję i realizację. Faza zamyka się po przesłaniu jej dokumentu zamykającego.", + "{hours} hours": "{hours} godz.", + "Concluding document: {title}": "Dokument zamykający: {title}", + "Concluding document missing": "Brak dokumentu zamykającego", + "Move {title} up": "Przesuń {title} w górę", + "Move {title} down": "Przesuń {title} w dół", + "Close phase": "Zamknij fazę", + "Phase": "Faza", + "Files": "Pliki", + "Notes": "Notatki", + "Audit trail": "Dziennik audytu", + "Edit phase": "Edytuj fazę", + "Name": "Nazwa", + "Budget hours": "Godziny w budżecie", + "Could not save the phase. Please try again.": "Nie udało się zapisać fazy. Spróbuj ponownie.", + "Close phase {title}": "Zamknij fazę {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Faza zamyka się z dokumentem zamykającym: prześlij go tutaj lub wybierz jeden z plików fazy.", + "Concluding document": "Dokument zamykający", + "This phase has no files yet.": "Ta faza nie ma jeszcze plików.", + "Upload a document": "Prześlij dokument", + "The document was not uploaded. Please try again.": "Dokument nie został przesłany. Spróbuj ponownie.", + "Upload the concluding document before you close this phase.": "Prześlij dokument zamykający, zanim zamkniesz tę fazę.", + "This phase cannot be closed from its current status.": "Tej fazy nie można zamknąć z jej obecnego statusu.", + "The phase was not closed. Please try again.": "Faza nie została zamknięta. Spróbuj ponownie.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Identyfikator pliku tej fazy, który ją zamyka. Fazę można ukończyć dopiero, gdy jest ustawiony, a plik dołączony.", + "Import from Microsoft Project": "Importuj z Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Wybierz plan zapisany w Microsoft Project w formacie XML. Nic nie zostanie zaimportowane, dopóki nie potwierdzisz.", + "Plan file": "Plik planu", + "What the import creates": "Co utworzy import", + "Tasks": "Zadania", + "Sub-tasks": "Podzadania", + "Milestones": "Kamienie milowe", + "Links": "Powiązania", + "Already imported, updated in place: {count}": "Już zaimportowane, zaktualizowane na miejscu: {count}", + "What does not carry over": "Czego nie przeniesiono", + "Tasks with resources, which are not imported: {count}": "Zadania z zasobami, które nie są importowane: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Zadania głębiej niż poziom 3, umieszczone pod swoim zadaniem poziomu 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Powiązania inne niż koniec-początek, zaimportowane jako powiązania pokrewne: {count}", + "Link lags, which are dropped: {count}": "Opóźnienia powiązań, które są pomijane: {count}", + "Links to a summary task, which are not imported: {count}": "Powiązania z zadaniem sumarycznym, które nie są importowane: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Powiązania z zadaniami spoza tego planu, które nie są importowane: {count}", + "No longer in the plan": "Już nie w planie", + "These stay in the project; remove them yourself if they are no longer needed.": "Pozostają w projekcie; usuń je sam, jeśli nie są już potrzebne.", + "Import": "Importuj", + "Close": "Zamknij", + "The plan is imported: {created} created, {updated} updated.": "Plan został zaimportowany: utworzono {created}, zaktualizowano {updated}.", + "Links that would close a loop were left out: {count}": "Powiązania, które zamknęłyby pętlę, pominięto: {count}", + "The import stopped part-way. Run it again to finish it.": "Import zatrzymał się w połowie. Uruchom go ponownie, aby go dokończyć.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Zapisz plan w Microsoft Project przez Plik, Zapisz jako, format XML, i zaimportuj ten plik.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ten plik deklaruje DOCTYPE lub encje, które nie są akceptowane.", + "The file is larger than 10 MB.": "Plik jest większy niż 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plan ma ponad 2000 zadań, więcej niż przyjmuje jeden import.", + "This file is not a Microsoft Project plan in XML format.": "Ten plik nie jest planem Microsoft Project w formacie XML.", + "Choose a file to import.": "Wybierz plik do zaimportowania.", + "Only the project owner can import a plan.": "Tylko właściciel projektu może zaimportować plan.", + "The plan could not be read. Please try again.": "Nie udało się odczytać planu. Spróbuj ponownie.", + "Linked case: {title}": "Powiązana sprawa: {title}", + "Linked to a case": "Powiązane ze sprawą", + "Hand over to case": "Przekaż do sprawy", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopiuje bez zmian każdy plik projektu i jego zadań oraz plik opisujący projekt do powiązanej sprawy.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Skopiowane pliki: {count}", + "Files that failed: {names}": "Pliki, których nie udało się skopiować: {names}", + "The handover failed. Please try again.": "Przekazanie nie powiodło się. Spróbuj ponownie.", + "The linked case could not be found, or you cannot open it.": "Nie znaleziono powiązanej sprawy lub nie możesz jej otworzyć.", + "Case handovers": "Przekazania do sprawy", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Każde przekazanie plików i metadanych projektu do jego sprawy: kiedy, przez kogo, do której sprawy, każdy skopiowany plik z jego SHA-256 oraz pliki, których nie udało się skopiować.", + "Finance": "Finanse", + "Add cost line": "Dodaj pozycję kosztów", + "Delivery terms": "Warunki realizacji", + "Billing model": "Model rozliczeń", + "Budget in euro": "Budżet w euro", + "Budget in hours": "Budżet w godzinach", + "Hourly rate in euro": "Stawka godzinowa w euro", + "Planned start": "Planowany początek", + "Planned end": "Planowany koniec", + "Planned dates": "Planowane daty", + "Budget {amount}": "Budżet {amount}", + "No budget agreed": "Nie uzgodniono budżetu", + "Hours": "Godziny", + "Only the project owner and the portfolio managers see the amounts.": "Tylko właściciel projektu i menedżerowie portfela widzą kwoty.", + "Budget against cost per category": "Budżet a koszty według kategorii", + "Labour (booked time)": "Praca (zarejestrowany czas)", + "No category": "Brak kategorii", + "Hours are not available": "Godziny są niedostępne", + "Not yet assigned to a category": "Jeszcze nie przypisano do kategorii", + "Total": "Razem", + "{spent} spent, {remaining} remaining": "{spent} wydano, {remaining} pozostało", + "Budget against cost per phase": "Budżet a koszty według fazy", + "No phase": "Brak fazy", + "Cost lines": "Pozycje kosztów", + "From the finance system": "Z systemu finansowego", + "Edit cost line {amount}": "Edytuj pozycję kosztów {amount}", + "No cost lines yet": "Brak pozycji kosztów", + "Commitments": "Zobowiązania", + "Actual cost": "Koszt rzeczywisty", + "Forecast": "Prognoza", + "Remaining": "Pozostało", + "Not planned yet": "Jeszcze nie zaplanowano", + "{start} to {end}": "{start} do {end}", + "The terms were not saved. Please try again.": "Warunki nie zostały zapisane. Spróbuj ponownie.", + "Terms saved": "Warunki zapisane", + "Fixed price": "Cena stała", + "Hourly": "Godzinowo", + "Not billed": "Bez fakturowania", + "Commitment": "Zobowiązanie", + "Edit cost line": "Edytuj pozycję kosztów", + "Kind": "Rodzaj", + "Amount in euro": "Kwota w euro", + "Remove": "Usuń", + "Could not save the cost line. Only the project owner changes the money of a project.": "Nie udało się zapisać pozycji kosztów. Tylko właściciel projektu zmienia pieniądze projektu.", + "Could not remove the cost line. Please try again.": "Nie udało się usunąć pozycji kosztów. Spróbuj ponownie.", + "{amount} over budget": "{amount} ponad budżet", + "Cost categories": "Kategorie kosztów", + "The categories every project splits its budget and costs into, one per line": "Kategorie, na które każdy projekt dzieli swój budżet i koszty, po jednej w wierszu", + "Categories": "Kategorie", + "Give at least one category, each name once.": "Podaj co najmniej jedną kategorię, każdą nazwę raz.", + "Cost categories saved": "Kategorie kosztów zapisane", + "The cost categories were not saved. Please try again.": "Kategorie kosztów nie zostały zapisane. Spróbuj ponownie.", + "Finance line": "Pozycja finansowa", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Jedna kwota pieniędzy w projekcie: budżet, zobowiązanie, koszt rzeczywisty lub prognoza, w kategorii kosztów i opcjonalnie w fazie. Wprowadzona przez właściciela projektu lub przez system finansowy za pośrednictwem aplikacji integracyjnej.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt, do którego należy ta kwota. Puste dla pozycji z systemu finansowego, której numer projektu nie pasuje do żadnego projektu.", + "The phase this amount belongs to, if any": "Faza, do której należy ta kwota, jeśli jest", + "The cost category, one of the categories the admin set up": "Kategoria kosztów, jedna z kategorii ustawionych przez administratora", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Czy kwota jest budżetem, zobowiązaniem, kosztem rzeczywistym czy prognozą", + "Amount": "Kwota", + "The amount in the reporting currency (euro)": "Kwota w walucie sprawozdawczej (euro)", + "The date the amount was booked or is expected": "Data zaksięgowania lub oczekiwania kwoty", + "What the amount is for": "Na co jest kwota", + "Whether a person entered the line or the finance system sent it": "Czy pozycję wprowadziła osoba, czy wysłał ją system finansowy", + "Entered by hand": "Wprowadzone ręcznie", + "Finance line id": "Id pozycji finansowej", + "The finance system's own id of this line. One imported line per id.": "Własny id tej pozycji w systemie finansowym. Jedna zaimportowana pozycja na id.", + "Project number": "Numer projektu", + "The project number the finance system sent, matched against the project key": "Numer projektu wysłany przez system finansowy, porównywany z kluczem projektu", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfel projektu pozycji, skopiowany z projektu, aby sumy portfela wymagały jednego filtra", + "Finance readers": "Czytelnicy finansów", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Identyfikatory UID Nextcloud osób, które mogą widzieć tę kwotę: właściciela projektu i menedżerów jego portfela", + "Project owner": "Właściciel projektu", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Identyfikator UID Nextcloud właściciela projektu, który może zmieniać i usuwać pozycje ręczne", + "How the client pays: not billed, a fixed price, or by the hour.": "Jak płaci klient: bez fakturowania, cena stała lub godzinowo.", + "Portfolio finance": "Finanse portfela", + "You cannot see the money of any project in this portfolio": "Nie widzisz pieniędzy żadnego projektu w tym portfelu", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serwer zwrócił pozycje kosztów projektów spoza tego portfela, więc te sumy mogą być błędne.", + "Projects left out because you cannot see their money: {count}": "Pominięte projekty, bo nie widzisz ich pieniędzy: {count}", + "Unmatched finance lines": "Niedopasowane pozycje finansowe", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budżet, zobowiązania, koszt rzeczywisty i prognoza zsumowane dla portfela.", + "Subprojects": "Podprojekty", + "{done} of {total}": "{done} z {total}", + "{done} of {total} tasks done, including subprojects": "{done} z {total} zadań wykonanych, z podprojektami", + "Show the subprojects of {title}": "Pokaż podprojekty {title}", + "Hide the subprojects of {title}": "Ukryj podprojekty {title}", + "Part of": "Część", + "No parent project": "Brak projektu nadrzędnego", + "A project cannot sit under one of its own subprojects.": "Projekt nie może znaleźć się pod jednym ze swoich podprojektów.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekty zagnieżdżają się najwyżej na trzech poziomach: program, projekt i podprojekt.", + "Parent project": "Projekt nadrzędny", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt, pod którym znajduje się ten projekt, np. program. Projekty zagnieżdżają się najwyżej na trzech poziomach.", + "Yes": "Tak", + "No": "Nie", + "{label} (required)": "{label} (wymagane)", + "{label} is required": "{label} jest wymagane", + "Project field": "Pole projektu", + "A field an admin adds to every project, such as a policy area or a contract value.": "Pole, które administrator dodaje do każdego projektu, np. obszar polityki lub wartość umowy.", + "Key": "Klucz", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stała nazwa, pod którą zapisywana jest wartość, w lower camel case. Nie zmieniaj jej, gdy projekty jej używają.", + "Label": "Etykieta", + "The name people see next to the field": "Nazwa widoczna obok pola", + "What the field holds": "Co zawiera pole", + "Text": "Tekst", + "Number": "Liczba", + "Choice": "Wybór", + "Person": "Osoba", + "Yes or no": "Tak lub nie", + "Options": "Opcje", + "The choices of a choice field": "Opcje pola wyboru", + "Required": "Wymagane", + "Whether a project must fill in the field": "Czy projekt musi wypełnić pole", + "Where the field appears, lowest first": "Gdzie pole się pojawia, najniższe najpierw", + "Applies to": "Dotyczy", + "What the field is added to": "Do czego dodaje się pole", + "Custom fields": "Własne pola", + "The values of the project fields an admin defined, keyed by the field's key.": "Wartości pól projektu zdefiniowanych przez administratora, według klucza pola.", + "Project fields": "Pola projektu", + "Related": "Powiązane", + "Remove link": "Usuń powiązanie", + "Link type": "Rodzaj powiązania", + "Relates to": "Powiązane z", + "Duplicates": "Duplikuje", + "Project key": "Klucz projektu", + "Every task number starts with it, such as VERG-42.": "Każdy numer zadania zaczyna się od niego, np. VERG-42.", + "This key is already used by another project.": "Ten klucz jest już używany przez inny projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Użyj od 2 do 10 liter i cyfr, zaczynając od litery.", + "The key cannot change once tasks carry it.": "Klucz nie może się zmienić, gdy zadania go noszą.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt zapisany. Istniejące zadania otrzymują numery w tle.", + "Next task number": "Numer następnego zadania", + "The number the next task of this project gets in its key. Only the system writes it.": "Numer, który następne zadanie tego projektu otrzymuje w swoim kluczu. Zapisuje go tylko system.", + "Restore {title}": "Przywróć {title}", + "Restore": "Przywróć", + "Project restored": "Projekt przywrócony", + "Could not restore the project": "Nie udało się przywrócić projektu", + "Bring this project back to the active list.": "Przywróć ten projekt na listę aktywnych projektów.", + "Restore project": "Przywróć projekt", + "Request reason": "Powód wniosku", + "Why the requester needs this project. Filled in when the project is requested.": "Dlaczego wnioskodawca potrzebuje tego projektu. Wypełniane przy wniosku.", + "Reviewed by": "Rozpatrzone przez", + "The user who approved or rejected the request.": "Użytkownik, który zatwierdził lub odrzucił wniosek.", + "Reviewed at": "Rozpatrzone dnia", + "When the request was approved or rejected.": "Kiedy wniosek został zatwierdzony lub odrzucony.", + "Review note": "Uwaga rozpatrującego", + "The reviewer's reason, shown to the requester when a request is not approved.": "Powód rozpatrującego, który widzi wnioskodawca, gdy wniosek nie zostanie zatwierdzony.", + "Members of these groups": "Członkowie tych grup", + "Groups that may create projects": "Grupy, które mogą tworzyć projekty", + "The group {group} no longer exists. Save to remove it.": "Grupa {group} już nie istnieje. Zapisz, aby ją usunąć.", + "Review project request": "Rozpatrz wniosek o projekt", + "Requested by": "Wnioskodawca", + "Why it is needed": "Dlaczego jest potrzebny", + "Desired start date": "Pożądana data rozpoczęcia", + "Why is it not approved?": "Dlaczego nie został zatwierdzony?", + "Give a reason. The requester sees it.": "Podaj powód. Wnioskodawca go zobaczy.", + "Approve": "Zatwierdź", + "Reject": "Odrzuć", + "Reject request": "Odrzuć wniosek", + "The review was not saved. Try again.": "Rozpatrzenie nie zostało zapisane. Spróbuj ponownie.", + "This project is waiting for review": "Ten projekt czeka na rozpatrzenie", + "This request was not approved": "Ten wniosek nie został zatwierdzony", + "Reason: {note}": "Powód: {note}", + "Review request": "Rozpatrz wniosek", + "Request a project": "Złóż wniosek o projekt", + "Step {step} of 2": "Krok {step} z 2", + "Why is this project needed?": "Dlaczego ten projekt jest potrzebny?", + "Give a reason. The reviewer reads it.": "Podaj powód. Rozpatrujący go przeczyta.", + "Back": "Wstecz", + "Next": "Dalej", + "Send request": "Wyślij wniosek", + "The request was not sent. Try again.": "Wniosek nie został wysłany. Spróbuj ponownie.", + "Requested": "Wnioskowany", + "Not approved": "Nie zatwierdzono", + "Your request was sent": "Twój wniosek został wysłany", + "Let everyone else request a project": "Pozwól wszystkim pozostałym składać wnioski o projekt", + "Add a task": "Dodaj zadanie", + "Delete task": "Usuń zadanie", + "Edit task": "Edytuj zadanie", + "Write": "Pisz", + "Preview": "Podgląd", + "Markdown works here: headings, lists and links.": "Tutaj działa Markdown: nagłówki, listy i linki.", + "Could not save the task. Please try again.": "Nie udało się zapisać zadania. Spróbuj ponownie.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "W zadaniu \"{title}\" zarejestrowano czas, więc nie można go usunąć. Zamiast tego możesz je anulować: wpisy czasu pozostaną.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Usunąć \"{title}\"? Jego powiązania z innymi zadaniami również zostaną usunięte. Tej operacji nie można cofnąć.", + "Keep task": "Zachowaj zadanie", + "Cancel task": "Anuluj zadanie", + "Only the reporter, the project owner or an admin can delete this task.": "Tylko zgłaszający, właściciel projektu lub administrator może usunąć to zadanie.", + "Could not delete the task. Please try again.": "Nie udało się usunąć zadania. Spróbuj ponownie.", + "Could not cancel the task. Please try again.": "Nie udało się anulować zadania. Spróbuj ponownie.", + "Responsible": "Odpowiedzialny", + "Also working on this": "Pracują nad tym także", + "Labels": "Etykiety", + "Could not change the priority. Please try again.": "Nie udało się zmienić priorytetu. Spróbuj ponownie.", + "Other project members who work on this task alongside the person responsible.": "Inni członkowie projektu, którzy pracują nad tym zadaniem razem z osobą odpowiedzialną.", + "Duplicate": "Duplikuj", + "Could not copy the task. Please try again.": "Nie udało się skopiować zadania. Spróbuj ponownie.", + "Subtasks": "Podzadania", + "{done} of {total} done": "Ukończono {done} z {total}", + "Add a subtask": "Dodaj podzadanie", + "Checklist": "Lista kontrolna", + "Checklist item actions": "Działania elementu listy", + "Add a checklist item": "Dodaj element listy kontrolnej", + "Subtasks: {estimate} estimated, {logged} logged": "Podzadania: szacowane {estimate}, zarejestrowane {logged}", + "Total estimate: {total}": "Łączne oszacowanie: {total}", + "Part of {title}": "Część zadania {title}", + "Checklist: {count} done": "Lista kontrolna: ukończono {count}", + "This task has subtasks: {count}.": "To zadanie ma podzadania: {count}.", + "Keep subtasks as separate tasks": "Zachowaj podzadania jako osobne zadania", + "Delete subtasks too": "Usuń również podzadania", + "Copy of {title}": "Kopia: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Zadanie zostało skopiowane, ale nie wszystkie jego podzadania. Sprawdź kopię.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Małe kroki w ramach zadania. Każdy element ma identyfikator, tekst i informację, czy jest ukończony.", + "Open work per person and per project.": "Otwarta praca według osób i projektów.", + "View": "Widok", + "By person": "Według osoby", + "By project": "Według projektu", + "Hours left": "Pozostałe godziny", + "Tasks without an estimate": "Zadania bez szacunku", + "Due in 14 days": "Termin w ciągu 14 dni", + "Shared": "Udostępnione", + "Unassigned": "Nieprzypisane", + "{hours} h": "{hours} godz.", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Widoczna jest praca w projektach, które możesz zobaczyć. Godziny liczą się dla osoby odpowiedzialnej; udostępnione zadania liczone są bez godzin.", + "No open work in these projects.": "Brak otwartej pracy w tych projektach.", + "Open work": "Otwarta praca", + "{count} open tasks": "{count} otwartych zadań", + "Create a project to see capacity here.": "Utwórz projekt, aby zobaczyć tutaj obłożenie.", + "My tasks": "Moje zadania", + "Show all my tasks": "Pokaż wszystkie moje zadania", + "No tasks assigned to you": "Nie masz przypisanych zadań", + "Browse projects": "Przeglądaj projekty", + "Later": "Później", + "Due {date}": "Termin {date}", + "Could not change the status. Please try again.": "Nie udało się zmienić statusu. Spróbuj ponownie.", + "Completed today": "Ukończone dzisiaj", + "My open tasks": "Moje otwarte zadania", + "My overdue tasks": "Moje zaległe zadania", + "My tasks in progress": "Moje zadania w toku", + "Pin to the top": "Przypnij na górze", + "Unpin": "Odepnij", + "Pinned": "Przypięte", + "Actions for {title}": "Akcje dla {title}", + "Could not save your project order. Please try again.": "Nie udało się zapisać kolejności projektów. Spróbuj ponownie.", + "No boards yet": "Jeszcze brak tablic", + "Create a project to get a board.": "Utwórz projekt, aby mieć tablicę.", + "Use the Projects page to create and manage your projects and tasks.": "Użyj strony Projekty, aby tworzyć projekty i zadania oraz nimi zarządzać.", + "Go to projects": "Przejdź do projektów", + "You are not a member of any projects yet.": "Nie jesteś jeszcze członkiem żadnego projektu.", + "Could not search for users. Please try again.": "Nie udało się wyszukać użytkowników. Spróbuj ponownie.", + "Project creation is restricted to administrators.": "Tylko administratorzy mogą tworzyć projekty.", + "Only the project owner or an administrator can delete this project.": "Tylko właściciel projektu lub administrator może usunąć ten projekt.", + "No projects are available to you yet. Ask an administrator to create one.": "Nie masz jeszcze dostępnych projektów. Poproś administratora o utworzenie projektu.", + "Due: {date}": "Termin: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Zadania z datą rozpoczęcia lub terminem pojawiają się na osi czasu. Dodaj daty, aby je tu zobaczyć.", + "You do not have access to this project.": "Nie masz dostępu do tego projektu.", + "Zoom level": "Poziom powiększenia", + "Unscheduled": "Niezaplanowane", + "Start: {date}": "Początek: {date}", + "Today": "Dzisiaj", + "No scheduled tasks": "Brak zaplanowanych zadań", + "An unexpected error occurred.": "Wystąpił nieoczekiwany błąd.", + "Column {number} name": "Nazwa kolumny {number}", + "Failed to save creation policy": "Nie udało się zapisać zasady tworzenia", + "All authenticated users": "Wszyscy zalogowani użytkownicy", + "Control who may create new projects": "Określ, kto może tworzyć nowe projekty", + "Administrators only": "Tylko administratorzy", + "Project creation": "Tworzenie projektów", + "Allow project creation": "Zezwalaj na tworzenie projektów", + "Creation policy saved successfully": "Zapisano zasadę tworzenia", + "Initializing…": "Uruchamianie…", + "e.g. 2h 30m, 90m, 1.5h": "np. 2h 30m, 90m, 1.5h", + "Log time": "Zapisz czas", + "Save estimate": "Zapisz szacunek", + "Logged: {logged}": "Zapisano: {logged}", + "over by {amount}": "przekroczono o {amount}", + "Time tracking": "Rejestracja czasu", + "Estimate": "Szacunek", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Wpisz prawidłowy szacunek (np. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Wpisz prawidłowy czas trwania (np. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Nie udało się zapisać wpisu czasu. Spróbuj ponownie.", + "Edit time entry": "Edytuj wpis czasu", + "Duration": "Czas trwania", + "Date range": "Zakres dat", + "Last week": "Poprzedni tydzień", + "No time logged": "Brak zapisanego czasu", + "Log time on a task to see it here.": "Zapisz czas na zadaniu, aby go tu zobaczyć.", + "To date": "Do daty", + "This week": "Ten tydzień", + "Total: {total}": "Razem: {total}", + "From date": "Od daty", + "Custom range": "Własny zakres", + "All time": "Cały czas", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Nie udało się usunąć zadania, więc mogą pozostać dane. Usuń projekt ponownie.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Nie udało się usunąć wpisu czasu, więc mogą pozostać dane. Usuń projekt ponownie.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Nie udało się usunąć kolumny, więc mogą pozostać dane. Usuń projekt ponownie.", + "Could not delete the project. Please try again.": "Nie udało się usunąć projektu. Spróbuj ponownie.", + "Notification settings": "Ustawienia powiadomień", + "Configure when due-date reminders are sent": "Określ, kiedy wysyłane są przypomnienia o terminach", + "Due-date reminder lead time (hours)": "Wyprzedzenie przypomnienia o terminie (godziny)", + "Lead time must be between 1 and 336 hours": "Wyprzedzenie musi wynosić od 1 do 336 godzin", + "Reminder lead time saved successfully": "Zapisano wyprzedzenie przypomnienia", + "Failed to save reminder lead time": "Nie udało się zapisać wyprzedzenia przypomnienia", + "Notifications": "Powiadomienia", + "Notify me 1 day before a task's due date": "Powiadom mnie 1 dzień przed terminem zadania", + "Draft": "Wersja robocza", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Czy lekcja jest wersją roboczą widoczną tylko dla jej nauczyciela, odbywa się czy jest odwołana.", + "New release": "Nowe wydanie", + "Roadmap chart. The same releases and epics are listed below.": "Wykres planu rozwoju. Te same wydania i epiki są wymienione poniżej.", + "Nothing on the roadmap yet": "Na planie rozwoju nie ma jeszcze nic", + "Releases with a target date and epics with dated tasks appear here.": "Tutaj pojawiają się wydania z datą docelową i epiki z zadaniami, które mają datę.", + "Releases": "Wydania", + "No releases yet": "Brak wydań", + "Target date: {date}": "Data docelowa: {date}", + "No target date": "Brak daty docelowej", + "Edit {name}": "Edytuj {name}", + "Mark {name} as released": "Oznacz {name} jako wydane", + "Mark as released": "Oznacz jako wydane", + "Epics": "Epiki", + "No epics yet. Open a task to make it an epic.": "Brak epików. Otwórz zadanie, aby zrobić z niego epik.", + "Not scheduled yet": "Jeszcze nie zaplanowane", + "Planned": "Zaplanowane", + "Released": "Wydane", + "Edit release": "Edytuj wydanie", + "Target date": "Data docelowa", + "Could not save the release. Please try again.": "Nie udało się zapisać wydania. Spróbuj ponownie.", + "Every task of this release is done or cancelled.": "Każde zadanie tego wydania jest ukończone lub anulowane.", + "Not finished yet: {count}": "Jeszcze nieukończone: {count}", + "What happens to these tasks?": "Co stanie się z tymi zadaniami?", + "Move to {name}": "Przenieś do {name}", + "Remove the release": "Usuń wydanie", + "Keep it on {name}": "Zostaw je w {name}", + "Could not mark the release as released. Please try again.": "Nie udało się oznaczyć wydania jako wydanego. Spróbuj ponownie.", + "Roadmap": "Plan rozwoju", + "Tasks or roadmap": "Zadania lub plan rozwoju", + "Release": "Wydanie", + "Epic": "Epik", + "This task is an epic": "To zadanie jest epikiem", + "A named, dated delivery of a project that its tasks are planned against.": "Nazwana, datowana dostawa projektu, na którą planuje się jego zadania.", + "Name of the release": "Nazwa wydania", + "The project this release belongs to": "Projekt, do którego należy to wydanie", + "What this release delivers": "Co dostarcza to wydanie", + "When work on the release starts": "Kiedy zaczyna się praca nad wydaniem", + "The date the release is due": "Data, na którą wydanie ma być gotowe", + "Whether the release is planned, released or archived": "Czy wydanie jest zaplanowane, wydane czy zarchiwizowane", + "Released on": "Wydano", + "When the release was marked as released": "Kiedy wydanie oznaczono jako wydane", + "The release this task is planned for": "Wydanie, na które zaplanowano to zadanie", + "Board view options": "Opcje widoku tablicy", + "Colour cards": "Koloruj karty", + "No colour": "Bez koloru", + "By label": "Według etykiety", + "Swimlanes": "Tory", + "No swimlanes": "Bez torów", + "By assignee": "Według osoby przypisanej", + "By epic": "Według epiki", + "No assignee": "Nieprzypisane", + "No epic": "Bez epiki", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Karty zostają w wierszu swojej epiki. Zmień epikę na stronie zadania.", + "Hand over to": "Przekaż", + "Could not save your board view. It applies until you reload.": "Nie udało się zapisać widoku tablicy. Obowiązuje do ponownego załadowania.", + "Timetable wish": "Życzenie planu lekcji", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Życzenie, które generator bierze pod uwagę. Twarde życzenie zawsze spełnia, miękkie tam, gdzie może.", + "Whether the wish is about a teacher, a group, a room or one activity": "Czy życzenie dotyczy nauczyciela, grupy, sali czy jednego zajęcia", + "Teacher": "Nauczyciel", + "Group": "Grupa", + "Reference": "Odniesienie", + "The user, group, room or activity the wish is about": "Użytkownik, grupa, sala lub zajęcie, którego dotyczy życzenie", + "What the wish asks for": "O co prosi życzenie", + "Not on these periods": "Nie w tych godzinach", + "Preferably not on these periods": "Najlepiej nie w tych godzinach", + "At most a number of lessons a day": "Najwyżej określona liczba lekcji dziennie", + "No free periods between lessons": "Bez okienek między lekcjami", + "Always the same room": "Zawsze ta sama sala", + "Periods": "Godziny", + "The periods of the week the wish is about, such as wed-5": "Godziny tygodnia, których dotyczy życzenie, np. wed-5", + "Limit": "Limit", + "The most lessons a day, for a wish of that kind": "Najwięcej lekcji dziennie, dla życzenia tego rodzaju", + "Strength": "Siła", + "Whether the generator must keep the wish or should keep it": "Czy generator musi, czy powinien spełnić życzenie", + "Hard": "Twarde", + "Soft": "Miękkie", + "Weight": "Waga", + "How much a soft wish counts, from 1 to 3": "Ile waży miękkie życzenie, od 1 do 3", + "Why the wish exists": "Dlaczego życzenie istnieje", + "Timetable scenario": "Scenariusz planu lekcji", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jeden wzór tygodnia, zrobiony przez generator lub wzięty z obecnego planu. Zachowuje swoje dane wejściowe i to, jak dobrze spełnia życzenia.", + "The name timetablers know the scenario by": "Nazwa, pod którą układający plan znają scenariusz", + "Whether the generator made it or it came from the current timetable": "Czy zrobił go generator, czy pochodzi z obecnego planu", + "Generated": "Wygenerowany", + "From the current timetable": "Z obecnego planu", + "Week of": "Tydzień od", + "The Monday of the first week of the window": "Poniedziałek pierwszego tygodnia okresu", + "Window start": "Początek okresu", + "The first day the week pattern applies to": "Pierwszy dzień, którego dotyczy wzór tygodnia", + "Window end": "Koniec okresu", + "The last day the week pattern applies to": "Ostatni dzień, którego dotyczy wzór tygodnia", + "Waiting, generating, done, failed, or published as draft lessons": "Oczekuje, generowanie, gotowy, nieudany lub opublikowany jako lekcje robocze", + "Waiting": "Oczekuje", + "Generating": "Generowanie", + "Failed": "Nieudany", + "Published": "Opublikowany", + "Seed": "Ziarno", + "The number the generator starts from, so a run can be repeated": "Liczba, od której zaczyna generator, aby przebieg można było powtórzyć", + "Input": "Dane wejściowe", + "The periods, rooms, lessons and wishes the scenario was made from": "Godziny, sale, lekcje i życzenia, z których powstał scenariusz", + "Placements": "Rozmieszczenia", + "Each lesson with the period and room it was given": "Każda lekcja z przydzieloną godziną i salą", + "Unplaced lessons": "Nierozmieszczone lekcje", + "Lessons without a place, each with the hard wish that blocked it": "Lekcje bez miejsca, każda z twardym życzeniem, które ją zablokowało", + "Broken wishes": "Niespełnione życzenia", + "The wishes this scenario breaks, with the lessons that break them": "Życzenia, których ten scenariusz nie spełnia, z lekcjami, które je łamią", + "Measures": "Miary", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Rozmieszczone lekcje, niespełnione życzenia, okienka nauczycieli, lekcje dziennie i wykorzystanie sal", + "Reason": "Powód", + "Why the run failed": "Dlaczego przebieg się nie udał", + "Published at": "Opublikowano", + "When the scenario was written out as draft lessons": "Kiedy scenariusz zapisano jako lekcje robocze", + "Edit wish": "Edytuj życzenie", + "New wish": "Nowe życzenie", + "Hard: the generator always keeps it": "Twarde: generator zawsze go przestrzega", + "Soft: the generator keeps it where it can": "Miękkie: generator przestrzega go, gdy może", + "Weight (1 to 3)": "Waga (od 1 do 3)", + "Most lessons a day": "Najwyżej lekcji dziennie", + "Period": "Lekcja", + "{day} period {number}": "{day} lekcja {number}", + "Teacher (user name)": "Nauczyciel (nazwa użytkownika)", + "Activity (group:subject)": "Zajęcia (grupa:przedmiot)", + "Say who or what the wish is about.": "Podaj, kogo lub czego dotyczy życzenie.", + "Choose at least one period.": "Wybierz co najmniej jedną lekcję.", + "The limit is a whole number of 1 or more.": "Limit to liczba całkowita równa 1 lub większa.", + "Timetable": "Plan lekcji", + "Wishes": "Życzenia", + "Timetable wishes": "Życzenia do planu lekcji", + "Generator run": "Przebieg generatora", + "Generator progress": "Postęp generatora", + "The run failed: {reason}": "Przebieg się nie powiódł: {reason}", + "{placed} of {lessons} lessons placed": "Umieszczono {placed} z {lessons} lekcji", + "Generate again": "Generuj ponownie", + "Generate": "Generuj", + "Every lesson has a place.": "Każda lekcja ma miejsce.", + "Lesson": "Lekcja", + "No free period and room": "Brak wolnej godziny i sali", + "Broken soft wishes": "Niedotrzymane miękkie życzenia", + "Every soft wish is kept.": "Każde miękkie życzenie jest dotrzymane.", + "Wish": "Życzenie", + "Lessons": "Lekcje", + "Generating: {percent}% of the time budget used": "Generowanie: wykorzystano {percent}% czasu", + "Waiting to start": "Oczekuje na start", + "Published as draft lessons": "Opublikowano jako szkice lekcji", + "Could not read the scenario.": "Nie udało się odczytać scenariusza.", + "Could not start the run.": "Nie udało się uruchomić przebiegu.", + "Scenarios": "Scenariusze", + "Timetable scenarios": "Scenariusze planu lekcji", + "Scenario": "Scenariusz", + "Take the current timetable": "Przejmij obecny plan lekcji", + "Could not take the current timetable.": "Nie udało się przejąć obecnego planu lekcji.", + "Broken hard wishes": "Naruszone twarde życzenia", + "Not on a period of the week grid": "Nie na godzinie siatki tygodniowej", + "Compare scenarios": "Porównaj scenariusze", + "Scenarios to compare": "Scenariusze do porównania", + "Choose two or three scenarios to compare them.": "Wybierz dwa lub trzy scenariusze, aby je porównać.", + "Measure": "Miara", + "Best": "Najlepsza", + "Lessons that differ": "Lekcje, które się różnią", + "No lesson differs.": "Żadna lekcja się nie różni.", + "Not placed": "Nieumieszczona", + "{period} in {room}": "{period} w {room}", + "Lessons placed": "Umieszczone lekcje", + "Lessons without a place": "Lekcje bez miejsca", + "Clashes": "Konflikty", + "Hard wishes broken": "Niedotrzymane twarde życzenia", + "Soft wishes broken": "Niedotrzymane miękkie życzenia", + "Soft wishes broken, weighted": "Niedotrzymane miękkie życzenia, ważone", + "Free periods between lessons, all teachers": "Okienka, wszyscy nauczyciele", + "Most free periods of one teacher": "Najwięcej okienek jednego nauczyciela", + "Most lessons of one group on a day": "Najwięcej lekcji jednej grupy w dniu", + "Room use": "Wykorzystanie sal", + "Publish as draft lessons": "Opublikuj jako lekcje robocze", + "Draft lessons written: {count}": "Zapisane lekcje robocze: {count}", + "Could not publish the scenario.": "Nie udało się opublikować scenariusza.", + "Rules": "Reguły", + "Rules for {column}": "Reguły dla {column}", + "When a card enters this column": "Gdy karta trafia do tej kolumny", + "Action": "Akcja", + "Set the priority": "Ustaw priorytet", + "Assign to": "Przypisz do", + "Assign the person who moved the card": "Przypisz osobie, która przeniosła kartę", + "Remove the assignee": "Usuń osobę przypisaną", + "Add a label": "Dodaj etykietę", + "No longer a project member": "Już nie jest członkiem projektu", + "This label no longer exists": "Ta etykieta już nie istnieje", + "Add rule": "Dodaj regułę", + "Remove rule": "Usuń regułę", + "No rules yet. Add one to change a card when it enters this column.": "Brak reguł. Dodaj regułę, aby zmieniać kartę, gdy trafia do tej kolumny.", + "Could not save the rules. Please try again.": "Nie udało się zapisać reguł. Spróbuj ponownie.", + "1 rule runs when a card enters this column": "1 reguła działa, gdy karta trafia do tej kolumny", + "{count} rules run when a card enters this column": "Liczba reguł, które działają, gdy karta trafia do tej kolumny: {count}", + "Rules applied: {changes}": "Zastosowane reguły: {changes}", + "assigned to {name}": "przypisano do {name}", + "assignee removed": "usunięto osobę przypisaną", + "priority {priority}": "priorytet {priority}", + "label {label}": "etykieta {label}", + "What happens to a card when it enters this column, applied in list order.": "Co dzieje się z kartą, gdy trafia do tej kolumny, w kolejności listy.", + "Value": "Wartość", + "What the rule does to the card.": "Co reguła robi z kartą.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Priorytet, identyfikator użytkownika lub etykiety używany przez akcję; puste dla akcji bez wartości.", + "is not": "nie jest", + "{dimension} is not": "{dimension} nie jest", + "Saved filters": "Zapisane filtry", + "No saved filters yet": "Brak zapisanych filtrów", + "Save filter": "Zapisz filtr", + "Rename \"{name}\"": "Zmień nazwę „{name}”", + "Delete \"{name}\"": "Usuń „{name}”", + "Clear filters": "Wyczyść filtry", + "Showing {shown} of {total} tasks": "Wyświetlane zadania: {shown} z {total}", + "Me": "Ja", + "No date": "Bez daty", + "Rename saved filter": "Zmień nazwę zapisanego filtra", + "Share with the project": "Udostępnij projektowi", + "Give the filter a name": "Nadaj filtrowi nazwę", + "Could not save the filter. Please try again.": "Nie udało się zapisać filtra. Spróbuj ponownie.", + "Some labels in \"{name}\" no longer exist and were left out.": "Niektóre etykiety w „{name}” już nie istnieją i zostały pominięte.", + "Could not delete the filter. Please try again.": "Nie udało się usunąć filtra. Spróbuj ponownie.", + "Saved filter": "Zapisany filtr", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Nazwany filtr tablicy jednego projektu, prywatny dla osoby, która go zapisała, chyba że udostępniono go projektowi.", + "The project whose board the filter applies to": "Projekt, do którego tablicy odnosi się filtr", + "The name the filter is listed under": "Nazwa, pod którą filtr jest na liście", + "Saved by": "Zapisane przez", + "Nextcloud user id of the person who saved the filter": "Identyfikator użytkownika Nextcloud osoby, która zapisała filtr", + "Shared with the project": "Udostępniony projektowi", + "Whether every project member sees and applies the filter": "Czy każdy członek projektu widzi filtr i może go zastosować", + "Criteria": "Kryteria", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtr: osoba przypisana, etykieta, priorytet i termin, każdy z jest lub nie jest i wartościami", + "Cross-project view": "Widok międzyprojektowy", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Zapisany wybór projektów, których zadania są pokazywane razem w torach statusów, udostępniony wymienionym osobom.", + "Shared with": "Udostępniony", + "The name the view is listed under": "Nazwa, pod którą widok jest wymieniony", + "Nextcloud user id of the person who saved the view": "Identyfikator użytkownika Nextcloud osoby, która zapisała widok", + "Nextcloud user ids of the people the view is shared with": "Identyfikatory użytkowników Nextcloud osób, którym udostępniono widok", + "The projects whose tasks the view shows, at most twenty": "Projekty, których zadania pokazuje widok, najwyżej dwadzieścia", + "1 project in this view is hidden from you.": "1 projekt w tym widoku jest przed tobą ukryty.", + "{count} projects in this view are hidden from you.": "Projekty w tym widoku ukryte przed tobą: {count}.", + "{project} has no column for {status}.": "Projekt {project} nie ma kolumny dla statusu {status}.", + "This view does not exist or is not shared with you.": "Ten widok nie istnieje lub nie został ci udostępniony.", + "\"{task}\" moved to {status}.": "\"{task}\" przeniesiono do {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Widoki międzyprojektowe", + "New view": "Nowy widok", + "Edit view": "Edytuj widok", + "Delete view": "Usuń widok", + "Give the view a name": "Nadaj widokowi nazwę", + "Pick at least one project": "Wybierz co najmniej jeden projekt", + "A view shows at most {max} projects": "Widok pokazuje najwyżej {max} projektów", + "Could not save the view. Please try again.": "Nie udało się zapisać widoku. Spróbuj ponownie.", + "Could not delete the view. Please try again.": "Nie udało się usunąć widoku. Spróbuj ponownie.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Usunąć „{title}”? Projekty i ich zadania pozostaną bez zmian.", + "People see the tasks of the projects they are in, never more.": "Każdy widzi tylko zadania projektów, w których jest.", + "No views yet. A view shows the tasks of several of your projects together.": "Brak widoków. Widok pokazuje razem zadania kilku twoich projektów.", + "Projects in view: {count}": "Projekty w widoku: {count}", + "Notify me when a task is assigned to me": "Powiadamiaj mnie, gdy zostanie mi przypisane zadanie", + "Also send these to me by email": "Wysyłaj mi je także e-mailem", + "Add an email address in your Nextcloud personal settings to get mail.": "Dodaj adres e-mail w osobistych ustawieniach Nextcloud, aby otrzymywać wiadomości.", + "Code link": "Link do kodu", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, gałąź, prośba o scalenie lub zgłoszenie w serwisie z kodem, które dotyczy zadania.", + "The task the link belongs to": "Zadanie, do którego należy link", + "The project of the task": "Projekt zadania", + "Task key": "Klucz zadania", + "The task key the forge text named, such as VC-12": "Klucz zadania wskazany w tekście serwisu z kodem, np. VC-12", + "What the link points at": "Na co wskazuje link", + "Link": "Link", + "The address of the item in the forge": "Adres elementu w serwisie z kodem", + "The commit message, branch name or merge request title": "Opis commita, nazwa gałęzi lub tytuł prośby o scalenie", + "Repository": "Repozytorium", + "The repository, such as acme/portal": "Repozytorium, np. acme/portal", + "Forge id": "Id w serwisie", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Własne id elementu w serwisie z kodem, np. github:acme/portal#42 lub hash commita", + "State": "Stan", + "The state of a merge request or issue": "Stan prośby o scalenie lub zgłoszenia", + "Who made the commit or opened the merge request": "Kto wykonał commit lub otworzył prośbę o scalenie", + "When the commit was made or the merge request last changed": "Kiedy wykonano commit lub ostatnio zmieniła się prośba o scalenie", + "Added by": "Dodane przez", + "Whether a person added the link or the integration wrote it": "Czy link dodała osoba, czy zapisała go integracja", + "Nextcloud user UIDs of project members": "Identyfikatory użytkowników Nextcloud członków projektu", + "Add link": "Dodaj link", + "Added by hand": "Dodany ręcznie", + "Branch": "Gałąź", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Z integracji", + "Link to a commit, branch or merge request": "Link do commita, gałęzi lub prośby o scalenie", + "Merge request": "Prośba o scalenie", + "Merged": "Scalona", + "No code linked yet. Name {key} in a commit message or paste a link.": "Brak powiązanego kodu. Wpisz {key} w opisie commita lub wklej link.", + "No code linked yet. Paste a link to a commit or merge request.": "Brak powiązanego kodu. Wklej link do commita lub prośby o scalenie.", + "Paste a web address that starts with https://.": "Wklej adres internetowy zaczynający się od https://.", + "Remove link {title}": "Usuń link {title}", + "The link could not be added.": "Nie udało się dodać linku.", + "The link could not be removed.": "Nie udało się usunąć linku.", + "This link is already on the task.": "Ten link jest już przy zadaniu.", + "Code forges": "Serwisy z kodem", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Łącz commity i pull requesty z GitHuba z zadaniami. Integriq odbiera zdarzenia; planninq nigdy nie wywołuje GitHuba.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Pobierz konfigurację i zaimportuj ją w Integriq. Następnie wpisz sekret w regule \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "W GitHubie dodaj do repozytorium webhook z tym adresem i tym samym sekretem. Wybierz typ treści application/json oraz zdarzenia push i pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Wpisz klucz zadania, np. VC-12, w opisie commita, nazwie gałęzi lub tytule pull requesta. Link pojawi się wtedy przy tym zadaniu.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriq członkowie projektu nadal mogą wkleić link na stronie zadania.", + "Download the Integriq configuration": "Pobierz konfigurację Integriq", + "Calendar": "Kalendarz", + "Previous": "Poprzedni", + "Calendar view": "Widok kalendarza", + "Starts:": "Początek:", + "No tasks with a date in this month.": "Brak zadań z datą w tym miesiącu.", + "Week of {start} to {end}": "Tydzień od {start} do {end}", + "My calendar": "Mój kalendarz", + "Show as list": "Pokaż jako listę", + "Show as calendar": "Pokaż jako kalendarz", + "Open my calendar": "Otwórz mój kalendarz", + "Nextcloud Tasks": "Zadania Nextcloud", + "Show my tasks in Nextcloud Tasks": "Pokaż moje zadania w Zadaniach Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Zadania przypisane do Ciebie lub Tobie udostępnione pojawiają się na liście \"Planninq\" w Zadaniach i Kalendarzu Nextcloud. Zmiany wprowadzone tam są zastępowane przy następnej zmianie w Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ten serwer nie może zapisywać w Zadaniach Nextcloud, więc eksport jest niedostępny.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Zarządzane przez Planninq. Zmiany wprowadzone tutaj są zastępowane przy następnej zmianie w Planninq.", + "Working days and holidays": "Dni robocze i święta", + "Dates set on the timeline skip the days that are not working days.": "Daty ustawione na osi czasu pomijają dni, które nie są robocze.", + "Working weekdays": "Dni robocze tygodnia", + "Non-working days": "Dni wolne", + "No non-working days yet.": "Brak jeszcze dni wolnych.", + "Add day": "Dodaj dzień", + "Year": "Rok", + "Add Dutch national holidays": "Dodaj holenderskie święta państwowe", + "Save working days": "Zapisz dni robocze", + "Choose at least one working weekday.": "Wybierz co najmniej jeden dzień roboczy.", + "Working days saved.": "Dni robocze zapisane.", + "Could not save the working days.": "Nie udało się zapisać dni roboczych.", + "New Year's Day": "Nowy Rok", + "Easter Sunday": "Niedziela Wielkanocna", + "Easter Monday": "Poniedziałek Wielkanocny", + "King's Day": "Dzień Króla", + "Liberation Day": "Dzień Wyzwolenia", + "Ascension Day": "Wniebowstąpienie", + "Whit Sunday": "Zielone Świątki", + "Whit Monday": "Drugi dzień Zielonych Świątek", + "Christmas Day": "Boże Narodzenie", + "Boxing Day": "Drugi dzień Bożego Narodzenia", + "Dates of {title}": "Daty zadania {title}", + "The due date cannot be before the start date.": "Termin nie może przypadać przed datą rozpoczęcia.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Nie udało się zapisać dat.", + "{title} now runs from {start} to {end}": "{title} trwa teraz od {start} do {end}", + "Auto-scheduling": "Automatyczne planowanie", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Gdy jest włączone, przesunięcie terminu na osi czasu na później proponuje przesunięcie blokowanych zadań.", + "Move blocked tasks along when a task slips": "Przesuwaj zablokowane zadania, gdy zadanie się opóźnia", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na osi czasu późniejszy termin proponuje przesunięcie blokowanych zadań. Liczą się tylko powiązania \"blokuje\", a zadania przesuwają się tylko na później.", + "Move the tasks that wait for {title}?": "Przesunąć zadania czekające na {title}?", + "These tasks wait for it and would start after its new due date:": "Te zadania na nie czekają i zaczęłyby się po nowym terminie:", + "{count} tasks would move; the first {limit} are listed.": "Przesunięto by {count} zadań; pokazano pierwsze {limit}.", + "Now": "Teraz", + "After the move": "Po przesunięciu", + "Only this task": "Tylko to zadanie", + "Move all": "Przesuń wszystkie", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Zatrzymano przy {title}: nie udało się zapisać dat. Zadania przed nim zostały przesunięte.", + "Cumulative flow": "Przepływ skumulowany", + "Show as chart": "Pokaż jako wykres", + "Show as table": "Pokaż jako tabelę", + "Tasks per column per day": "Zadania w kolumnie na dzień", + "Tasks without recorded history in this period: {count}": "Zadania bez zapisanej historii w tym okresie: {count}", + "Lead and cycle time": "Czas realizacji i czas cyklu", + "No tasks were finished in this period.": "W tym okresie nie ukończono żadnych zadań.", + "Finished tasks": "Ukończone zadania", + "Cycle time, average": "Czas cyklu, średnia", + "Cycle time, 85th percentile": "Czas cyklu, 85. percentyl", + "Lead time, average": "Czas realizacji, średnia", + "Tasks whose finish time was estimated from their history: {count}": "Zadania, których czas zakończenia oszacowano z historii: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Czas cyklu każdego ukończonego zadania, ze średnią i 85. percentylem", + "Slowest tasks": "Najwolniejsze zadania", + "cycle {cycle}, lead {lead}": "cykl {cycle}, realizacja {lead}", + "{days} days": "{days} dni", + "Could not load the flow of this project.": "Nie udało się wczytać przepływu tego projektu.", + "Last {days} days": "Ostatnie {days} dni", + "Portfolio flow": "Przepływ portfela", + "An admin adds portfolios under Projects, Portfolios.": "Administrator dodaje portfele w Projekty, Portfele.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekty niewyświetlone, bo naraz wyświetla się najwyżej 50: {count}", + "Could not load the flow of this portfolio.": "Nie udało się wczytać przepływu tego portfela.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Przepływ skumulowany i czas cyklu w projektach portfela.", + "Edit report": "Edytuj raport", + "Only tasks where": "Tylko zadania, w których", + "Group by": "Grupuj według", + "Display": "Widok", + "Share with everyone who can read its projects": "Udostępnij wszystkim, którzy mogą czytać jego projekty", + "The report could not be saved.": "Nie udało się zapisać raportu.", + "Number of tasks": "Liczba zadań", + "Bar": "Słupki", + "Donut": "Pierścień", + "Table": "Tabela", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} z {total} projektów w tym raporcie jest dla ciebie niewidocznych", + "No tasks match this report.": "Żadne zadanie nie pasuje do tego raportu.", + "None": "Brak", + "Could not load this report.": "Nie udało się wczytać tego raportu.", + "Report": "Raport", + "Your reports": "Twoje raporty", + "My reports": "Moje raporty", + "Shared reports": "Udostępnione raporty", + "You have not built a report yet.": "Nie utworzono jeszcze żadnego raportu.", + "Nobody has shared a report with you yet.": "Nikt jeszcze nie udostępnił ci raportu.", + "Reports you built over tasks, and the ones shared with you.": "Raporty utworzone przez ciebie na podstawie zadań oraz udostępnione tobie.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Zapisane zapytanie o zadania: które projekty, jakie filtry, grupowanie według czego, liczba lub suma, pokazane jako tabela lub wykres.", + "The name the report is listed under": "Nazwa, pod którą raport jest wymieniony", + "What the report shows and who it is for": "Co pokazuje raport i dla kogo jest", + "Nextcloud user id of the person who saved the report": "Identyfikator użytkownika Nextcloud osoby, która zapisała raport", + "Who can open the report": "Kto może otworzyć raport", + "Only me": "Tylko ja", + "Everyone who can read its projects": "Każdy, kto może czytać jego projekty", + "The projects the report covers, at most fifty": "Projekty objęte raportem, najwyżej pięćdziesiąt", + "Filters": "Filtry", + "Task fields and the value each must equal": "Pola zadania i wartość, której każde musi być równe", + "The task field the report groups on": "Pole zadania, według którego raport grupuje", + "Count the tasks, or add up a number on them": "Policz zadania albo zsumuj na nich liczbę", + "Sum": "Suma", + "Sum of": "Suma pola", + "The number added up when the measure is a sum": "Liczba sumowana, gdy miarą jest suma", + "Story points": "Punkty historyjki", + "Estimated duration": "Szacowany czas trwania", + "How the report is shown": "Jak raport jest pokazywany", + "Issue type": "Typ zgłoszenia", + "Task fields and the value each must equal; empty when the report covers every task": "Pola zadania i wartość, jaką każde musi mieć; puste, gdy raport obejmuje wszystkie zadania", + "The status a task must have": "Status, jaki musi mieć zadanie", + "The priority a task must have": "Priorytet, jaki musi mieć zadanie", + "The user a task must be assigned to": "Użytkownik, do którego musi być przypisane zadanie", + "A label a task must carry": "Etykieta, którą musi mieć zadanie", + "The board column a task must be in": "Kolumna tablicy, w której musi być zadanie", + "The issue type a task must have": "Typ zgłoszenia, jaki musi mieć zadanie", + "Manager groups": "Grupy menedżerów", + "Member groups": "Grupy członków", + "Viewer groups": "Grupy czytelników", + "Viewers": "Czytelnicy", + "Owning group": "Grupa właścicielska", + "Nextcloud groups whose members manage the project": "Grupy Nextcloud, których członkowie zarządzają projektem", + "Nextcloud groups whose members work on the project": "Grupy Nextcloud, których członkowie pracują nad projektem", + "Nextcloud groups whose members may read the project": "Grupy Nextcloud, których członkowie mogą czytać projekt", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Użytkownicy Nextcloud zarządzający projektem: ustawieniami, członkami i pracą", + "Nextcloud user ids who may read the project and its work but not change it": "Użytkownicy Nextcloud, którzy mogą czytać projekt i jego pracę, ale nie zmieniać", + "The Nextcloud group that owns the project with its creator, at most one": "Grupa Nextcloud, która jest właścicielem projektu razem z jego twórcą, najwyżej jedna", + "Nextcloud user ids who may read this through the project": "Użytkownicy Nextcloud, którzy mogą czytać to przez projekt", + "Nextcloud groups whose members may change this through the project": "Grupy Nextcloud, których członkowie mogą zmieniać to przez projekt", + "Nextcloud groups whose members may read this through the project": "Grupy Nextcloud, których członkowie mogą czytać to przez projekt", + "Search for a person or a group…": "Szukaj osoby lub grupy…", + "No one found. Your admin's sharing settings decide who you can find.": "Nikogo nie znaleziono. Ustawienia udostępniania administratora decydują, kogo możesz znaleźć.", + "Type at least two characters": "Wpisz co najmniej dwa znaki", + "Everyone in this group": "Wszyscy w tej grupie", + "Could not search for people. Please try again.": "Nie udało się wyszukać osób. Spróbuj ponownie.", + "Could not remove the group": "Nie udało się usunąć grupy", + "Only the owner and managers change who is on this project.": "Tylko właściciel i menedżerowie zmieniają, kto należy do tego projektu.", + "Role of {name}": "Rola: {name}", + "Manager": "Menedżer", + "Member": "Członek", + "Viewer": "Czytelnik", + "Could not change the role": "Nie udało się zmienić roli", + "Owned by group: {name}": "Własność grupy: {name}", + "No group owns this project.": "Żadna grupa nie jest właścicielem tego projektu.", + "Owned by group": "Własność grupy", + "Search for a group…": "Wyszukaj grupę…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nie znaleziono grupy. Ustawienia udostępniania administratora decydują, które grupy możesz znaleźć.", + "No owning group": "Brak grupy właściciela", + "Could not search for groups. Please try again.": "Nie udało się wyszukać grup. Spróbuj ponownie.", + "Could not change the owning group": "Nie udało się zmienić grupy właściciela", + "You can read this project. Only its members change it.": "Możesz czytać ten projekt. Zmieniają go tylko jego członkowie.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurs, którego dotyczy ta lekcja, na przykład przedmiot do wyboru, gdy szkolna aplikacja do nauki go zna.", + "Online meeting link": "Link do lekcji online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdzie uczniowie dołączają do tej lekcji online. Przycisk Dołącz pojawia się tylko dla linku https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pl.json b/l10n/pl.json index 06b45c6a..bcbeedfc 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktywne projekty", + "Archived projects": "Zarchiwizowane projekty", + "Boards": "Tablice", + "My projects": "Moje projekty", + "Portfolio": "Portfolio", + "Project board": "Tablica projektu", + "Projects I am in": "Projekty, w których uczestniczę", + "Timeline": "Oś czasu", + "Timesheet": "Ewidencja czasu pracy", + "Features & roadmap": "Funkcje i plan rozwoju", + "Flow": "Przepływ", + "Flows": "Przepływy", + "Reports": "Raporty", + "Pick a report to open it.": "Wybierz raport, aby go otworzyć.", + "In progress": "W toku", + "Date": "Data", + "Due": "Termin", + "Assignee": "Przypisane do", + "Who": "Kto", + "What": "Co", + "Minutes": "Minuty", + "Entries": "Wpisy", + "Most recent": "Najnowsze", + "Per person": "Na osobę", + "By status": "Według statusu", + "By priority": "Według priorytetu", + "Task status": "Status zadań", + "Time spent": "Poświęcony czas", + "Capacity": "Wydajność", + "Due soonest": "Najbliższy termin", + "Minutes logged": "Zarejestrowane minuty", + "Nothing is due": "Nic nie jest zaplanowane", + "Nothing logged yet": "Nic jeszcze nie zarejestrowano", + "What is open, what is blocked, and what is overdue.": "Co jest otwarte, co zablokowane i co po terminie.", + "How allocation is spread across the people working on projects.": "Jak obciążenie rozkłada się na osoby pracujące nad projektami.", + "Hours logged, and the projects they went to.": "Zarejestrowane godziny i projekty, na które poszły.", + "Billable": "Rozliczalne", + "Budget: {amount}": "Budżet: {amount}", + "Loading projects": "Wczytywanie projektów", + "No projects for this client yet": "Brak projektów dla tego klienta", + "Open in Planninq": "Otwórz w Planninq", + "This project could not be found": "Nie znaleziono tego projektu", + "Untitled project": "Projekt bez nazwy", + "and {count} more": "i jeszcze {count}", + "Store": "Sklep", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Zainstaluj rejestry, schematy i przepływy opublikowane przez inne organizacje.", + "Work Date": "Data pracy", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Akcje kolumny", + "Columns": "Kolumny", + "Could not remove the column. Please try again.": "Nie udało się usunąć kolumny. Spróbuj ponownie.", + "Could not save the column. Please try again.": "Nie udało się zapisać kolumny. Spróbuj ponownie.", + "Done column": "Kolumna ukończonych", + "Edit column": "Edytuj kolumnę", + "Keep the card's status": "Zachowaj status karty", + "Move its cards to": "Przenieś jej karty do", + "Move left": "Przesuń w lewo", + "Move right": "Przesuń w prawo", + "Status of cards moved here": "Status kart przeniesionych tutaj", + "The last done column cannot be removed.": "Ostatniej kolumny ukończonych nie można usunąć.", + "WIP limit": "Limit WIP", + "over limit": "powyżej limitu", + "The status a card gets when it is moved into this column.": "Status, który karta otrzymuje po przeniesieniu do tej kolumny.", + "All priorities": "Wszystkie priorytety", + "Could not create the task. Please try again.": "Nie udało się utworzyć zadania. Spróbuj ponownie.", + "Created": "Utworzono", + "Move to backlog": "Do backlogu", + "Move to board": "Na tablicę", + "New task": "Nowe zadanie", + "Nothing in the backlog": "Backlog jest pusty", + "Rank": "Pozycja", + "Sort by": "Sortuj według", + "Sort by rank to reorder": "Sortuj według pozycji, aby zmienić kolejność", + "Task actions": "Akcje zadania", + "All labels": "Wszystkie etykiety", + "Filter tasks by label": "Filtruj zadania według etykiety", + "View timeline": "Pokaż oś czasu", + "Board": "Tablica", + "List": "Lista", + "Column": "Kolumna", + "Board or list": "Tablica lub lista", + "Log": "Dziennik", + "Add entry": "Dodaj wpis", + "Show": "Pokaż", + "No actions yet": "Brak działań", + "Closed": "Zamknięty", + "Entry actions": "Akcje wpisu", + "Add action": "Dodaj działanie", + "by {author}": "autor: {author}", + "saved {time}": "zapisano {time}", + "Attendees: {names}": "Uczestnicy: {names}", + "Add the first entry": "Dodaj pierwszy wpis", + "Issues": "Problemy", + "Lessons learned": "Wnioski", + "Meetings": "Spotkania", + "Decisions": "Decyzje", + "Actions": "Działania", + "Issue": "Problem", + "Lesson learned": "Wniosek", + "Meeting": "Spotkanie", + "Decision": "Decyzja", + "About this project": "O projekcie", + "No description yet": "Brak opisu", + "Start date": "Data rozpoczęcia", + "Not set": "Nie ustawiono", + "End date": "Data zakończenia", + "Progress": "Postęp", + "No tasks yet": "Brak zadań", + "Open the board": "Otwórz tablicę", + "People": "Osoby", + "Owner": "Właściciel", + "Latest log entries": "Najnowsze wpisy", + "Open the log": "Otwórz dziennik", + "{done} of {total} tasks done": "Ukończono {done} z {total} zadań", + "Edit entry": "Edytuj wpis", + "Type": "Rodzaj", + "Attendees": "Uczestnicy", + "Issue is closed": "Problem jest zamknięty", + "Could not save the entry. Please try again.": "Nie udało się zapisać wpisu. Spróbuj ponownie.", + "From: {title}": "Z: {title}", + "What needs to happen": "Co trzeba zrobić", + "Could not create the action. Please try again.": "Nie udało się utworzyć działania. Spróbuj ponownie.", + "The action was created but could not be linked to the entry.": "Działanie utworzono, ale nie udało się go powiązać z wpisem.", + "Project pages": "Strony projektu", + "Overview": "Przegląd", + "Risks": "Ryzyka", + "Log entry": "Wpis dziennika", + "A short name for the entry": "Krótka nazwa wpisu", + "Project": "Projekt", + "The project this entry belongs to": "Projekt, do którego należy ten wpis", + "What kind of entry this is": "Jakiego rodzaju jest to wpis", + "When it happened": "Kiedy to się stało", + "What happened, in Markdown": "Co się stało, w Markdownie", + "Whether an issue is still open": "Czy problem jest nadal otwarty", + "The people at a meeting": "Osoby na spotkaniu", + "Tasks that came out of this entry": "Zadania wynikające z tego wpisu", + "Add risk": "Dodaj ryzyko", + "Risk": "Ryzyko", + "Score": "Wynik", + "Response": "Reakcja", + "Review date": "Data przeglądu", + "no longer on the project": "nie należy już do projektu", + "Edit {title}": "Edytuj {title}", + "No risks recorded yet": "Nie zapisano jeszcze żadnych ryzyk", + "Add the first risk": "Dodaj pierwsze ryzyko", + "Medium": "Średnie", + "Mitigating": "Łagodzone", + "Occurred": "Wystąpiło", + "Avoid": "Unikać", + "Reduce": "Ograniczać", + "Transfer": "Przenieść", + "Accept": "Zaakceptować", + "Highest open risks": "Najwyższe otwarte ryzyka", + "No open risks": "Brak otwartych ryzyk", + "Open the risk register": "Otwórz rejestr ryzyk", + "Edit risk": "Edytuj ryzyko", + "What could go wrong": "Co może pójść źle", + "Likelihood": "Prawdopodobieństwo", + "Impact": "Wpływ", + "Score {score}": "Wynik {score}", + "Countermeasures": "Środki zaradcze", + "Could not save the risk. Please try again.": "Nie udało się zapisać ryzyka. Spróbuj ponownie.", + "Risks by likelihood and impact": "Ryzyka według prawdopodobieństwa i wpływu", + "Risk scale": "Skala ryzyka", + "The levels every project scores its risks on, and where low turns into medium and high": "Poziomy, na których każdy projekt ocenia swoje ryzyka, i gdzie niskie przechodzi w średnie i wysokie", + "Number of levels": "Liczba poziomów", + "Likelihood labels": "Etykiety prawdopodobieństwa", + "Impact labels": "Etykiety wpływu", + "Level {level}": "Poziom {level}", + "Medium from score": "Średnie od wyniku", + "High from score": "Wysokie od wyniku", + "Risk scale saved": "Zapisano skalę ryzyka", + "1 risk uses level {level}. Change it first.": "1 ryzyko używa poziomu {level}. Najpierw je zmień.", + "{count} risks use level {level}. Change them first.": "Ryzyka używające poziomu {level}: {count}. Najpierw je zmień.", + "Every level needs a label, and high must start above medium.": "Każdy poziom potrzebuje etykiety, a wysokie musi zaczynać się powyżej średniego.", + "The project this risk belongs to": "Projekt, do którego należy to ryzyko", + "The cause and the effect, in Markdown": "Przyczyna i skutek, w Markdownie", + "Category": "Kategoria", + "A free grouping, such as planning, budget or supplier": "Dowolne grupowanie, np. harmonogram, budżet lub dostawca", + "How likely it is, on the admin's risk scale": "Jak bardzo jest prawdopodobne, w skali ryzyka administratora", + "How hard it would hit, on the admin's risk scale": "Jak mocno by uderzyło, w skali ryzyka administratora", + "Likelihood times impact, calculated by the server": "Prawdopodobieństwo razy wpływ, obliczane przez serwer", + "Where the risk stands": "Na jakim etapie jest ryzyko", + "The person who watches this risk": "Osoba, która pilnuje tego ryzyka", + "How the project answers the risk": "Jak projekt reaguje na ryzyko", + "What is done to prevent it or soften it, in Markdown": "Co się robi, aby mu zapobiec lub je złagodzić, w Markdownie", + "When to look at this risk again": "Kiedy ponownie przejrzeć to ryzyko", + "Very low": "Bardzo niskie", + "Very high": "Bardzo wysokie", + "All projects": "Wszystkie projekty", + "Project status report": "Raport stanu projektu", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datowany raport o tym, jak projekt wypada pod względem pieniędzy, organizacji, czasu, informacji, jakości i ryzyka (aspekty GROTIK), każdy z notatką.", + "The project this report is about": "Projekt, którego dotyczy raport", + "Report date": "Data raportu", + "The day the report describes": "Dzień opisany w raporcie", + "Money": "Pieniądze", + "How the project stands on this aspect": "Jak projekt wypada w tym aspekcie", + "On track": "Zgodnie z planem", + "At risk": "Zagrożony", + "Off track": "Poza planem", + "Money note": "Notatka o pieniądzach", + "A short explanation of this status": "Krótkie wyjaśnienie tego stanu", + "Organisation": "Organizacja", + "Organisation note": "Notatka o organizacji", + "Time": "Czas", + "Time note": "Notatka o czasie", + "Information": "Informacja", + "Information note": "Notatka o informacji", + "Quality": "Jakość", + "Quality note": "Notatka o jakości", + "Risk note": "Notatka o ryzyku", + "Overall": "Ogółem", + "The worst of the six statuses, calculated by the server": "Najgorszy z sześciu stanów, obliczany przez serwer", + "Health: money": "Kondycja: pieniądze", + "Copied from the newest status report": "Skopiowano z najnowszego raportu stanu", + "Health: organisation": "Kondycja: organizacja", + "Health: time": "Kondycja: czas", + "Health: information": "Kondycja: informacja", + "Health: quality": "Kondycja: jakość", + "Health: risk": "Kondycja: ryzyko", + "Health: overall": "Kondycja: ogółem", + "Health: report date": "Kondycja: data raportu", + "The date of the newest status report": "Data najnowszego raportu stanu", + "New report": "Nowy raport", + "Only the project owner writes status reports.": "Tylko właściciel projektu pisze raporty stanu.", + "Latest report, {date}": "Ostatni raport, {date}", + "Aspect": "Aspekt", + "Note": "Notatka", + "Report history": "Historia raportów", + "Author": "Autor", + "No status reports yet": "Brak raportów stanu", + "Write the first report": "Napisz pierwszy raport", + "Choose a status for every aspect to save the report.": "Wybierz stan dla każdego aspektu, aby zapisać raport.", + "Suggested: on track.": "Sugestia: zgodnie z planem.", + "Suggested: at risk.": "Sugestia: zagrożony.", + "Suggested: off track.": "Sugestia: poza planem.", + "1 task is past its due date.": "1 zadanie jest po terminie.", + "{count} tasks are past their due date.": "Zadania po terminie: {count}.", + "The end date has passed with 1 open task.": "Data zakończenia minęła, a 1 zadanie jest otwarte.", + "The end date has passed with {count} open tasks.": "Data zakończenia minęła, a otwartych zadań jest {count}.", + "No open task is past its due date.": "Żadne otwarte zadanie nie jest po terminie.", + "The highest open risk, \"{title}\", scores {score}.": "Najwyższe otwarte ryzyko, \"{title}\", ma wynik {score}.", + "There are no open risks.": "Brak otwartych ryzyk.", + "Costs are at {percent}% of the budget.": "Koszty wynoszą {percent}% budżetu.", + "No suggestion: the project has no budget.": "Brak sugestii: projekt nie ma budżetu.", + "No suggestion: no costs are recorded for this project yet.": "Brak sugestii: dla tego projektu nie zarejestrowano jeszcze kosztów.", + "The report was not saved. Only the project owner can write status reports.": "Raport nie został zapisany. Tylko właściciel projektu może pisać raporty stanu.", + "No report": "Brak raportu", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Grupa projektów prowadzonych przez te same osoby, na przykład dział lub program. Jej kierownicy czytają każdy projekt w niej.", + "The name of the portfolio": "Nazwa portfela", + "What the portfolio holds and who runs it": "Co zawiera portfel i kto go prowadzi", + "A colour for the portfolio's section in project lists": "Kolor sekcji portfela na listach projektów", + "Managers": "Kierownicy", + "Nextcloud user UIDs of the people who run the portfolio": "Identyfikatory użytkowników Nextcloud osób prowadzących portfel", + "Order": "Kolejność", + "Where the portfolio comes in project lists, lowest first": "Miejsce portfela na listach projektów, od najniższego", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Własna skala ryzyka tego portfela w formacie JSON, w tej samej postaci co skala całej aplikacji. Puste oznacza skalę aplikacji.", + "Portfolio readers": "Czytelnicy portfela", + "Nextcloud user UIDs of the managers of the project's portfolio": "Identyfikatory użytkowników Nextcloud kierowników portfela projektu", + "The portfolio this project belongs to": "Portfel, do którego należy ten projekt", + "No portfolio": "Bez portfela", + "All portfolios": "Wszystkie portfele", + "You read this project as a manager of its portfolio. Only its members change it.": "Czytasz ten projekt jako kierownik jego portfela. Zmieniają go tylko jego członkowie.", + "Portfolios": "Portfele", + "Portfolio status": "Status portfela", + "No portfolios yet": "Brak portfeli", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Administrator dodaje portfele w Projekty, Portfele. Projekty z portfela są tu wymienione z ich statusem.", + "Roll-up": "Podsumowanie", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} zgodnie z planem, {atRisk} zagrożone, {offTrack} poza planem, {noReport} bez raportu", + "No project in this portfolio that you can read.": "Brak projektu w tym portfelu, który możesz odczytać.", + "Start": "Początek", + "End": "Koniec", + "Budget": "Budżet", + "Last report": "Ostatni raport", + "Out of date": "Nieaktualny", + "Portfolio timeline": "Oś czasu portfela", + "Zoom": "Powiększenie", + "Could not load the timeline": "Nie udało się wczytać osi czasu", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Administrator dodaje portfele w Projekty, Portfele. Projekty z portfela są tu pokazane na jednej osi czasu.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Otwórz projekt, aby zobaczyć jego fazy i zadania. Oś czasu jest tylko do odczytu.", + "Phase: {title}": "Faza: {title}", + "Left out because you cannot read them: {count} projects": "Pominięte, bo nie możesz ich odczytać: {count} projektów", + "Week": "Tydzień", + "Day": "Dzień", + "Month": "Miesiąc", + "Please try again later.": "Spróbuj ponownie później.", + "Status reports": "Raporty statusu", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Po ilu dniach ostatni raport statusu projektu jest oznaczany jako nieaktualny w przeglądzie portfela", + "Reporting period (days)": "Okres raportowania (dni)", + "The reporting period is a whole number of days from 1 to 365.": "Okres raportowania to pełna liczba dni od 1 do 365.", + "Reporting period saved": "Okres raportowania zapisany", + "The reporting period was not saved. Please try again.": "Okres raportowania nie został zapisany. Spróbuj ponownie.", + "Every project of a portfolio with its status per aspect, rolled up.": "Każdy projekt portfela ze statusem dla każdego aspektu, podsumowany.", + "The projects of a portfolio on one timeline.": "Projekty portfela na jednej osi czasu.", + "Phases": "Fazy", + "Add phase": "Dodaj fazę", + "No phases yet": "Brak faz", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Podziel projekt na fazy, np. inicjację, definicję i realizację. Faza zamyka się po przesłaniu jej dokumentu zamykającego.", + "{hours} hours": "{hours} godz.", + "Concluding document: {title}": "Dokument zamykający: {title}", + "Concluding document missing": "Brak dokumentu zamykającego", + "Move {title} up": "Przesuń {title} w górę", + "Move {title} down": "Przesuń {title} w dół", + "Close phase": "Zamknij fazę", + "Phase": "Faza", + "Files": "Pliki", + "Notes": "Notatki", + "Audit trail": "Dziennik audytu", + "Edit phase": "Edytuj fazę", + "Name": "Nazwa", + "Budget hours": "Godziny w budżecie", + "Could not save the phase. Please try again.": "Nie udało się zapisać fazy. Spróbuj ponownie.", + "Close phase {title}": "Zamknij fazę {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Faza zamyka się z dokumentem zamykającym: prześlij go tutaj lub wybierz jeden z plików fazy.", + "Concluding document": "Dokument zamykający", + "This phase has no files yet.": "Ta faza nie ma jeszcze plików.", + "Upload a document": "Prześlij dokument", + "The document was not uploaded. Please try again.": "Dokument nie został przesłany. Spróbuj ponownie.", + "Upload the concluding document before you close this phase.": "Prześlij dokument zamykający, zanim zamkniesz tę fazę.", + "This phase cannot be closed from its current status.": "Tej fazy nie można zamknąć z jej obecnego statusu.", + "The phase was not closed. Please try again.": "Faza nie została zamknięta. Spróbuj ponownie.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Identyfikator pliku tej fazy, który ją zamyka. Fazę można ukończyć dopiero, gdy jest ustawiony, a plik dołączony.", + "Import from Microsoft Project": "Importuj z Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Wybierz plan zapisany w Microsoft Project w formacie XML. Nic nie zostanie zaimportowane, dopóki nie potwierdzisz.", + "Plan file": "Plik planu", + "What the import creates": "Co utworzy import", + "Tasks": "Zadania", + "Sub-tasks": "Podzadania", + "Milestones": "Kamienie milowe", + "Links": "Powiązania", + "Already imported, updated in place: {count}": "Już zaimportowane, zaktualizowane na miejscu: {count}", + "What does not carry over": "Czego nie przeniesiono", + "Tasks with resources, which are not imported: {count}": "Zadania z zasobami, które nie są importowane: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Zadania głębiej niż poziom 3, umieszczone pod swoim zadaniem poziomu 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Powiązania inne niż koniec-początek, zaimportowane jako powiązania pokrewne: {count}", + "Link lags, which are dropped: {count}": "Opóźnienia powiązań, które są pomijane: {count}", + "Links to a summary task, which are not imported: {count}": "Powiązania z zadaniem sumarycznym, które nie są importowane: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Powiązania z zadaniami spoza tego planu, które nie są importowane: {count}", + "No longer in the plan": "Już nie w planie", + "These stay in the project; remove them yourself if they are no longer needed.": "Pozostają w projekcie; usuń je sam, jeśli nie są już potrzebne.", + "Import": "Importuj", + "Close": "Zamknij", + "The plan is imported: {created} created, {updated} updated.": "Plan został zaimportowany: utworzono {created}, zaktualizowano {updated}.", + "Links that would close a loop were left out: {count}": "Powiązania, które zamknęłyby pętlę, pominięto: {count}", + "The import stopped part-way. Run it again to finish it.": "Import zatrzymał się w połowie. Uruchom go ponownie, aby go dokończyć.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Zapisz plan w Microsoft Project przez Plik, Zapisz jako, format XML, i zaimportuj ten plik.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ten plik deklaruje DOCTYPE lub encje, które nie są akceptowane.", + "The file is larger than 10 MB.": "Plik jest większy niż 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plan ma ponad 2000 zadań, więcej niż przyjmuje jeden import.", + "This file is not a Microsoft Project plan in XML format.": "Ten plik nie jest planem Microsoft Project w formacie XML.", + "Choose a file to import.": "Wybierz plik do zaimportowania.", + "Only the project owner can import a plan.": "Tylko właściciel projektu może zaimportować plan.", + "The plan could not be read. Please try again.": "Nie udało się odczytać planu. Spróbuj ponownie.", + "Linked case: {title}": "Powiązana sprawa: {title}", + "Linked to a case": "Powiązane ze sprawą", + "Hand over to case": "Przekaż do sprawy", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopiuje bez zmian każdy plik projektu i jego zadań oraz plik opisujący projekt do powiązanej sprawy.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Skopiowane pliki: {count}", + "Files that failed: {names}": "Pliki, których nie udało się skopiować: {names}", + "The handover failed. Please try again.": "Przekazanie nie powiodło się. Spróbuj ponownie.", + "The linked case could not be found, or you cannot open it.": "Nie znaleziono powiązanej sprawy lub nie możesz jej otworzyć.", + "Case handovers": "Przekazania do sprawy", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Każde przekazanie plików i metadanych projektu do jego sprawy: kiedy, przez kogo, do której sprawy, każdy skopiowany plik z jego SHA-256 oraz pliki, których nie udało się skopiować.", + "Finance": "Finanse", + "Add cost line": "Dodaj pozycję kosztów", + "Delivery terms": "Warunki realizacji", + "Billing model": "Model rozliczeń", + "Budget in euro": "Budżet w euro", + "Budget in hours": "Budżet w godzinach", + "Hourly rate in euro": "Stawka godzinowa w euro", + "Planned start": "Planowany początek", + "Planned end": "Planowany koniec", + "Planned dates": "Planowane daty", + "Budget {amount}": "Budżet {amount}", + "No budget agreed": "Nie uzgodniono budżetu", + "Hours": "Godziny", + "Only the project owner and the portfolio managers see the amounts.": "Tylko właściciel projektu i menedżerowie portfela widzą kwoty.", + "Budget against cost per category": "Budżet a koszty według kategorii", + "Labour (booked time)": "Praca (zarejestrowany czas)", + "No category": "Brak kategorii", + "Hours are not available": "Godziny są niedostępne", + "Not yet assigned to a category": "Jeszcze nie przypisano do kategorii", + "Total": "Razem", + "{spent} spent, {remaining} remaining": "{spent} wydano, {remaining} pozostało", + "Budget against cost per phase": "Budżet a koszty według fazy", + "No phase": "Brak fazy", + "Cost lines": "Pozycje kosztów", + "From the finance system": "Z systemu finansowego", + "Edit cost line {amount}": "Edytuj pozycję kosztów {amount}", + "No cost lines yet": "Brak pozycji kosztów", + "Commitments": "Zobowiązania", + "Actual cost": "Koszt rzeczywisty", + "Forecast": "Prognoza", + "Remaining": "Pozostało", + "Not planned yet": "Jeszcze nie zaplanowano", + "{start} to {end}": "{start} do {end}", + "The terms were not saved. Please try again.": "Warunki nie zostały zapisane. Spróbuj ponownie.", + "Terms saved": "Warunki zapisane", + "Fixed price": "Cena stała", + "Hourly": "Godzinowo", + "Not billed": "Bez fakturowania", + "Commitment": "Zobowiązanie", + "Edit cost line": "Edytuj pozycję kosztów", + "Kind": "Rodzaj", + "Amount in euro": "Kwota w euro", + "Remove": "Usuń", + "Could not save the cost line. Only the project owner changes the money of a project.": "Nie udało się zapisać pozycji kosztów. Tylko właściciel projektu zmienia pieniądze projektu.", + "Could not remove the cost line. Please try again.": "Nie udało się usunąć pozycji kosztów. Spróbuj ponownie.", + "{amount} over budget": "{amount} ponad budżet", + "Cost categories": "Kategorie kosztów", + "The categories every project splits its budget and costs into, one per line": "Kategorie, na które każdy projekt dzieli swój budżet i koszty, po jednej w wierszu", + "Categories": "Kategorie", + "Give at least one category, each name once.": "Podaj co najmniej jedną kategorię, każdą nazwę raz.", + "Cost categories saved": "Kategorie kosztów zapisane", + "The cost categories were not saved. Please try again.": "Kategorie kosztów nie zostały zapisane. Spróbuj ponownie.", + "Finance line": "Pozycja finansowa", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Jedna kwota pieniędzy w projekcie: budżet, zobowiązanie, koszt rzeczywisty lub prognoza, w kategorii kosztów i opcjonalnie w fazie. Wprowadzona przez właściciela projektu lub przez system finansowy za pośrednictwem aplikacji integracyjnej.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt, do którego należy ta kwota. Puste dla pozycji z systemu finansowego, której numer projektu nie pasuje do żadnego projektu.", + "The phase this amount belongs to, if any": "Faza, do której należy ta kwota, jeśli jest", + "The cost category, one of the categories the admin set up": "Kategoria kosztów, jedna z kategorii ustawionych przez administratora", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Czy kwota jest budżetem, zobowiązaniem, kosztem rzeczywistym czy prognozą", + "Amount": "Kwota", + "The amount in the reporting currency (euro)": "Kwota w walucie sprawozdawczej (euro)", + "The date the amount was booked or is expected": "Data zaksięgowania lub oczekiwania kwoty", + "What the amount is for": "Na co jest kwota", + "Whether a person entered the line or the finance system sent it": "Czy pozycję wprowadziła osoba, czy wysłał ją system finansowy", + "Entered by hand": "Wprowadzone ręcznie", + "Finance line id": "Id pozycji finansowej", + "The finance system's own id of this line. One imported line per id.": "Własny id tej pozycji w systemie finansowym. Jedna zaimportowana pozycja na id.", + "Project number": "Numer projektu", + "The project number the finance system sent, matched against the project key": "Numer projektu wysłany przez system finansowy, porównywany z kluczem projektu", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfel projektu pozycji, skopiowany z projektu, aby sumy portfela wymagały jednego filtra", + "Finance readers": "Czytelnicy finansów", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Identyfikatory UID Nextcloud osób, które mogą widzieć tę kwotę: właściciela projektu i menedżerów jego portfela", + "Project owner": "Właściciel projektu", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Identyfikator UID Nextcloud właściciela projektu, który może zmieniać i usuwać pozycje ręczne", + "How the client pays: not billed, a fixed price, or by the hour.": "Jak płaci klient: bez fakturowania, cena stała lub godzinowo.", + "Portfolio finance": "Finanse portfela", + "You cannot see the money of any project in this portfolio": "Nie widzisz pieniędzy żadnego projektu w tym portfelu", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serwer zwrócił pozycje kosztów projektów spoza tego portfela, więc te sumy mogą być błędne.", + "Projects left out because you cannot see their money: {count}": "Pominięte projekty, bo nie widzisz ich pieniędzy: {count}", + "Unmatched finance lines": "Niedopasowane pozycje finansowe", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budżet, zobowiązania, koszt rzeczywisty i prognoza zsumowane dla portfela.", + "Subprojects": "Podprojekty", + "{done} of {total}": "{done} z {total}", + "{done} of {total} tasks done, including subprojects": "{done} z {total} zadań wykonanych, z podprojektami", + "Show the subprojects of {title}": "Pokaż podprojekty {title}", + "Hide the subprojects of {title}": "Ukryj podprojekty {title}", + "Part of": "Część", + "No parent project": "Brak projektu nadrzędnego", + "A project cannot sit under one of its own subprojects.": "Projekt nie może znaleźć się pod jednym ze swoich podprojektów.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekty zagnieżdżają się najwyżej na trzech poziomach: program, projekt i podprojekt.", + "Parent project": "Projekt nadrzędny", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt, pod którym znajduje się ten projekt, np. program. Projekty zagnieżdżają się najwyżej na trzech poziomach.", + "Yes": "Tak", + "No": "Nie", + "{label} (required)": "{label} (wymagane)", + "{label} is required": "{label} jest wymagane", + "Project field": "Pole projektu", + "A field an admin adds to every project, such as a policy area or a contract value.": "Pole, które administrator dodaje do każdego projektu, np. obszar polityki lub wartość umowy.", + "Key": "Klucz", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stała nazwa, pod którą zapisywana jest wartość, w lower camel case. Nie zmieniaj jej, gdy projekty jej używają.", + "Label": "Etykieta", + "The name people see next to the field": "Nazwa widoczna obok pola", + "What the field holds": "Co zawiera pole", + "Text": "Tekst", + "Number": "Liczba", + "Choice": "Wybór", + "Person": "Osoba", + "Yes or no": "Tak lub nie", + "Options": "Opcje", + "The choices of a choice field": "Opcje pola wyboru", + "Required": "Wymagane", + "Whether a project must fill in the field": "Czy projekt musi wypełnić pole", + "Where the field appears, lowest first": "Gdzie pole się pojawia, najniższe najpierw", + "Applies to": "Dotyczy", + "What the field is added to": "Do czego dodaje się pole", + "Custom fields": "Własne pola", + "The values of the project fields an admin defined, keyed by the field's key.": "Wartości pól projektu zdefiniowanych przez administratora, według klucza pola.", + "Project fields": "Pola projektu", + "Related": "Powiązane", + "Remove link": "Usuń powiązanie", + "Link type": "Rodzaj powiązania", + "Relates to": "Powiązane z", + "Duplicates": "Duplikuje", + "Project key": "Klucz projektu", + "Every task number starts with it, such as VERG-42.": "Każdy numer zadania zaczyna się od niego, np. VERG-42.", + "This key is already used by another project.": "Ten klucz jest już używany przez inny projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Użyj od 2 do 10 liter i cyfr, zaczynając od litery.", + "The key cannot change once tasks carry it.": "Klucz nie może się zmienić, gdy zadania go noszą.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt zapisany. Istniejące zadania otrzymują numery w tle.", + "Next task number": "Numer następnego zadania", + "The number the next task of this project gets in its key. Only the system writes it.": "Numer, który następne zadanie tego projektu otrzymuje w swoim kluczu. Zapisuje go tylko system.", + "Restore {title}": "Przywróć {title}", + "Restore": "Przywróć", + "Project restored": "Projekt przywrócony", + "Could not restore the project": "Nie udało się przywrócić projektu", + "Bring this project back to the active list.": "Przywróć ten projekt na listę aktywnych projektów.", + "Restore project": "Przywróć projekt", + "Request reason": "Powód wniosku", + "Why the requester needs this project. Filled in when the project is requested.": "Dlaczego wnioskodawca potrzebuje tego projektu. Wypełniane przy wniosku.", + "Reviewed by": "Rozpatrzone przez", + "The user who approved or rejected the request.": "Użytkownik, który zatwierdził lub odrzucił wniosek.", + "Reviewed at": "Rozpatrzone dnia", + "When the request was approved or rejected.": "Kiedy wniosek został zatwierdzony lub odrzucony.", + "Review note": "Uwaga rozpatrującego", + "The reviewer's reason, shown to the requester when a request is not approved.": "Powód rozpatrującego, który widzi wnioskodawca, gdy wniosek nie zostanie zatwierdzony.", + "Members of these groups": "Członkowie tych grup", + "Groups that may create projects": "Grupy, które mogą tworzyć projekty", + "The group {group} no longer exists. Save to remove it.": "Grupa {group} już nie istnieje. Zapisz, aby ją usunąć.", + "Review project request": "Rozpatrz wniosek o projekt", + "Requested by": "Wnioskodawca", + "Why it is needed": "Dlaczego jest potrzebny", + "Desired start date": "Pożądana data rozpoczęcia", + "Why is it not approved?": "Dlaczego nie został zatwierdzony?", + "Give a reason. The requester sees it.": "Podaj powód. Wnioskodawca go zobaczy.", + "Approve": "Zatwierdź", + "Reject": "Odrzuć", + "Reject request": "Odrzuć wniosek", + "The review was not saved. Try again.": "Rozpatrzenie nie zostało zapisane. Spróbuj ponownie.", + "This project is waiting for review": "Ten projekt czeka na rozpatrzenie", + "This request was not approved": "Ten wniosek nie został zatwierdzony", + "Reason: {note}": "Powód: {note}", + "Review request": "Rozpatrz wniosek", + "Request a project": "Złóż wniosek o projekt", + "Step {step} of 2": "Krok {step} z 2", + "Why is this project needed?": "Dlaczego ten projekt jest potrzebny?", + "Give a reason. The reviewer reads it.": "Podaj powód. Rozpatrujący go przeczyta.", + "Back": "Wstecz", + "Next": "Dalej", + "Send request": "Wyślij wniosek", + "The request was not sent. Try again.": "Wniosek nie został wysłany. Spróbuj ponownie.", + "Requested": "Wnioskowany", + "Not approved": "Nie zatwierdzono", + "Your request was sent": "Twój wniosek został wysłany", + "Let everyone else request a project": "Pozwól wszystkim pozostałym składać wnioski o projekt", + "Add a task": "Dodaj zadanie", + "Delete task": "Usuń zadanie", + "Edit task": "Edytuj zadanie", + "Write": "Pisz", + "Preview": "Podgląd", + "Markdown works here: headings, lists and links.": "Tutaj działa Markdown: nagłówki, listy i linki.", + "Could not save the task. Please try again.": "Nie udało się zapisać zadania. Spróbuj ponownie.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "W zadaniu \"{title}\" zarejestrowano czas, więc nie można go usunąć. Zamiast tego możesz je anulować: wpisy czasu pozostaną.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Usunąć \"{title}\"? Jego powiązania z innymi zadaniami również zostaną usunięte. Tej operacji nie można cofnąć.", + "Keep task": "Zachowaj zadanie", + "Cancel task": "Anuluj zadanie", + "Only the reporter, the project owner or an admin can delete this task.": "Tylko zgłaszający, właściciel projektu lub administrator może usunąć to zadanie.", + "Could not delete the task. Please try again.": "Nie udało się usunąć zadania. Spróbuj ponownie.", + "Could not cancel the task. Please try again.": "Nie udało się anulować zadania. Spróbuj ponownie.", + "Responsible": "Odpowiedzialny", + "Also working on this": "Pracują nad tym także", + "Labels": "Etykiety", + "Could not change the priority. Please try again.": "Nie udało się zmienić priorytetu. Spróbuj ponownie.", + "Other project members who work on this task alongside the person responsible.": "Inni członkowie projektu, którzy pracują nad tym zadaniem razem z osobą odpowiedzialną.", + "Duplicate": "Duplikuj", + "Could not copy the task. Please try again.": "Nie udało się skopiować zadania. Spróbuj ponownie.", + "Subtasks": "Podzadania", + "{done} of {total} done": "Ukończono {done} z {total}", + "Add a subtask": "Dodaj podzadanie", + "Checklist": "Lista kontrolna", + "Checklist item actions": "Działania elementu listy", + "Add a checklist item": "Dodaj element listy kontrolnej", + "Subtasks: {estimate} estimated, {logged} logged": "Podzadania: szacowane {estimate}, zarejestrowane {logged}", + "Total estimate: {total}": "Łączne oszacowanie: {total}", + "Part of {title}": "Część zadania {title}", + "Checklist: {count} done": "Lista kontrolna: ukończono {count}", + "This task has subtasks: {count}.": "To zadanie ma podzadania: {count}.", + "Keep subtasks as separate tasks": "Zachowaj podzadania jako osobne zadania", + "Delete subtasks too": "Usuń również podzadania", + "Copy of {title}": "Kopia: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Zadanie zostało skopiowane, ale nie wszystkie jego podzadania. Sprawdź kopię.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Małe kroki w ramach zadania. Każdy element ma identyfikator, tekst i informację, czy jest ukończony.", + "Open work per person and per project.": "Otwarta praca według osób i projektów.", + "View": "Widok", + "By person": "Według osoby", + "By project": "Według projektu", + "Hours left": "Pozostałe godziny", + "Tasks without an estimate": "Zadania bez szacunku", + "Due in 14 days": "Termin w ciągu 14 dni", + "Shared": "Udostępnione", + "Unassigned": "Nieprzypisane", + "{hours} h": "{hours} godz.", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Widoczna jest praca w projektach, które możesz zobaczyć. Godziny liczą się dla osoby odpowiedzialnej; udostępnione zadania liczone są bez godzin.", + "No open work in these projects.": "Brak otwartej pracy w tych projektach.", + "Open work": "Otwarta praca", + "{count} open tasks": "{count} otwartych zadań", + "Create a project to see capacity here.": "Utwórz projekt, aby zobaczyć tutaj obłożenie.", + "My tasks": "Moje zadania", + "Show all my tasks": "Pokaż wszystkie moje zadania", + "No tasks assigned to you": "Nie masz przypisanych zadań", + "Browse projects": "Przeglądaj projekty", + "Later": "Później", + "Due {date}": "Termin {date}", + "Could not change the status. Please try again.": "Nie udało się zmienić statusu. Spróbuj ponownie.", + "Completed today": "Ukończone dzisiaj", + "My open tasks": "Moje otwarte zadania", + "My overdue tasks": "Moje zaległe zadania", + "My tasks in progress": "Moje zadania w toku", + "Pin to the top": "Przypnij na górze", + "Unpin": "Odepnij", + "Pinned": "Przypięte", + "Actions for {title}": "Akcje dla {title}", + "Could not save your project order. Please try again.": "Nie udało się zapisać kolejności projektów. Spróbuj ponownie.", + "No boards yet": "Jeszcze brak tablic", + "Create a project to get a board.": "Utwórz projekt, aby mieć tablicę.", + "Use the Projects page to create and manage your projects and tasks.": "Użyj strony Projekty, aby tworzyć projekty i zadania oraz nimi zarządzać.", + "Go to projects": "Przejdź do projektów", + "You are not a member of any projects yet.": "Nie jesteś jeszcze członkiem żadnego projektu.", + "Could not search for users. Please try again.": "Nie udało się wyszukać użytkowników. Spróbuj ponownie.", + "Project creation is restricted to administrators.": "Tylko administratorzy mogą tworzyć projekty.", + "Only the project owner or an administrator can delete this project.": "Tylko właściciel projektu lub administrator może usunąć ten projekt.", + "No projects are available to you yet. Ask an administrator to create one.": "Nie masz jeszcze dostępnych projektów. Poproś administratora o utworzenie projektu.", + "Due: {date}": "Termin: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Zadania z datą rozpoczęcia lub terminem pojawiają się na osi czasu. Dodaj daty, aby je tu zobaczyć.", + "You do not have access to this project.": "Nie masz dostępu do tego projektu.", + "Zoom level": "Poziom powiększenia", + "Unscheduled": "Niezaplanowane", + "Start: {date}": "Początek: {date}", + "Today": "Dzisiaj", + "No scheduled tasks": "Brak zaplanowanych zadań", + "An unexpected error occurred.": "Wystąpił nieoczekiwany błąd.", + "Column {number} name": "Nazwa kolumny {number}", + "Failed to save creation policy": "Nie udało się zapisać zasady tworzenia", + "All authenticated users": "Wszyscy zalogowani użytkownicy", + "Control who may create new projects": "Określ, kto może tworzyć nowe projekty", + "Administrators only": "Tylko administratorzy", + "Project creation": "Tworzenie projektów", + "Allow project creation": "Zezwalaj na tworzenie projektów", + "Creation policy saved successfully": "Zapisano zasadę tworzenia", + "Initializing…": "Uruchamianie…", + "e.g. 2h 30m, 90m, 1.5h": "np. 2h 30m, 90m, 1.5h", + "Log time": "Zapisz czas", + "Save estimate": "Zapisz szacunek", + "Logged: {logged}": "Zapisano: {logged}", + "over by {amount}": "przekroczono o {amount}", + "Time tracking": "Rejestracja czasu", + "Estimate": "Szacunek", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Wpisz prawidłowy szacunek (np. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Wpisz prawidłowy czas trwania (np. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Nie udało się zapisać wpisu czasu. Spróbuj ponownie.", + "Edit time entry": "Edytuj wpis czasu", + "Duration": "Czas trwania", + "Date range": "Zakres dat", + "Last week": "Poprzedni tydzień", + "No time logged": "Brak zapisanego czasu", + "Log time on a task to see it here.": "Zapisz czas na zadaniu, aby go tu zobaczyć.", + "To date": "Do daty", + "This week": "Ten tydzień", + "Total: {total}": "Razem: {total}", + "From date": "Od daty", + "Custom range": "Własny zakres", + "All time": "Cały czas", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Nie udało się usunąć zadania, więc mogą pozostać dane. Usuń projekt ponownie.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Nie udało się usunąć wpisu czasu, więc mogą pozostać dane. Usuń projekt ponownie.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Nie udało się usunąć kolumny, więc mogą pozostać dane. Usuń projekt ponownie.", + "Could not delete the project. Please try again.": "Nie udało się usunąć projektu. Spróbuj ponownie.", + "Notification settings": "Ustawienia powiadomień", + "Configure when due-date reminders are sent": "Określ, kiedy wysyłane są przypomnienia o terminach", + "Due-date reminder lead time (hours)": "Wyprzedzenie przypomnienia o terminie (godziny)", + "Lead time must be between 1 and 336 hours": "Wyprzedzenie musi wynosić od 1 do 336 godzin", + "Reminder lead time saved successfully": "Zapisano wyprzedzenie przypomnienia", + "Failed to save reminder lead time": "Nie udało się zapisać wyprzedzenia przypomnienia", + "Notifications": "Powiadomienia", + "Notify me 1 day before a task's due date": "Powiadom mnie 1 dzień przed terminem zadania", + "Draft": "Wersja robocza", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Czy lekcja jest wersją roboczą widoczną tylko dla jej nauczyciela, odbywa się czy jest odwołana.", + "New release": "Nowe wydanie", + "Roadmap chart. The same releases and epics are listed below.": "Wykres planu rozwoju. Te same wydania i epiki są wymienione poniżej.", + "Nothing on the roadmap yet": "Na planie rozwoju nie ma jeszcze nic", + "Releases with a target date and epics with dated tasks appear here.": "Tutaj pojawiają się wydania z datą docelową i epiki z zadaniami, które mają datę.", + "Releases": "Wydania", + "No releases yet": "Brak wydań", + "Target date: {date}": "Data docelowa: {date}", + "No target date": "Brak daty docelowej", + "Edit {name}": "Edytuj {name}", + "Mark {name} as released": "Oznacz {name} jako wydane", + "Mark as released": "Oznacz jako wydane", + "Epics": "Epiki", + "No epics yet. Open a task to make it an epic.": "Brak epików. Otwórz zadanie, aby zrobić z niego epik.", + "Not scheduled yet": "Jeszcze nie zaplanowane", + "Planned": "Zaplanowane", + "Released": "Wydane", + "Edit release": "Edytuj wydanie", + "Target date": "Data docelowa", + "Could not save the release. Please try again.": "Nie udało się zapisać wydania. Spróbuj ponownie.", + "Every task of this release is done or cancelled.": "Każde zadanie tego wydania jest ukończone lub anulowane.", + "Not finished yet: {count}": "Jeszcze nieukończone: {count}", + "What happens to these tasks?": "Co stanie się z tymi zadaniami?", + "Move to {name}": "Przenieś do {name}", + "Remove the release": "Usuń wydanie", + "Keep it on {name}": "Zostaw je w {name}", + "Could not mark the release as released. Please try again.": "Nie udało się oznaczyć wydania jako wydanego. Spróbuj ponownie.", + "Roadmap": "Plan rozwoju", + "Tasks or roadmap": "Zadania lub plan rozwoju", + "Release": "Wydanie", + "Epic": "Epik", + "This task is an epic": "To zadanie jest epikiem", + "A named, dated delivery of a project that its tasks are planned against.": "Nazwana, datowana dostawa projektu, na którą planuje się jego zadania.", + "Name of the release": "Nazwa wydania", + "The project this release belongs to": "Projekt, do którego należy to wydanie", + "What this release delivers": "Co dostarcza to wydanie", + "When work on the release starts": "Kiedy zaczyna się praca nad wydaniem", + "The date the release is due": "Data, na którą wydanie ma być gotowe", + "Whether the release is planned, released or archived": "Czy wydanie jest zaplanowane, wydane czy zarchiwizowane", + "Released on": "Wydano", + "When the release was marked as released": "Kiedy wydanie oznaczono jako wydane", + "The release this task is planned for": "Wydanie, na które zaplanowano to zadanie", + "Board view options": "Opcje widoku tablicy", + "Colour cards": "Koloruj karty", + "No colour": "Bez koloru", + "By label": "Według etykiety", + "Swimlanes": "Tory", + "No swimlanes": "Bez torów", + "By assignee": "Według osoby przypisanej", + "By epic": "Według epiki", + "No assignee": "Nieprzypisane", + "No epic": "Bez epiki", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Karty zostają w wierszu swojej epiki. Zmień epikę na stronie zadania.", + "Hand over to": "Przekaż", + "Could not save your board view. It applies until you reload.": "Nie udało się zapisać widoku tablicy. Obowiązuje do ponownego załadowania.", + "Timetable wish": "Życzenie planu lekcji", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Życzenie, które generator bierze pod uwagę. Twarde życzenie zawsze spełnia, miękkie tam, gdzie może.", + "Whether the wish is about a teacher, a group, a room or one activity": "Czy życzenie dotyczy nauczyciela, grupy, sali czy jednego zajęcia", + "Teacher": "Nauczyciel", + "Group": "Grupa", + "Reference": "Odniesienie", + "The user, group, room or activity the wish is about": "Użytkownik, grupa, sala lub zajęcie, którego dotyczy życzenie", + "What the wish asks for": "O co prosi życzenie", + "Not on these periods": "Nie w tych godzinach", + "Preferably not on these periods": "Najlepiej nie w tych godzinach", + "At most a number of lessons a day": "Najwyżej określona liczba lekcji dziennie", + "No free periods between lessons": "Bez okienek między lekcjami", + "Always the same room": "Zawsze ta sama sala", + "Periods": "Godziny", + "The periods of the week the wish is about, such as wed-5": "Godziny tygodnia, których dotyczy życzenie, np. wed-5", + "Limit": "Limit", + "The most lessons a day, for a wish of that kind": "Najwięcej lekcji dziennie, dla życzenia tego rodzaju", + "Strength": "Siła", + "Whether the generator must keep the wish or should keep it": "Czy generator musi, czy powinien spełnić życzenie", + "Hard": "Twarde", + "Soft": "Miękkie", + "Weight": "Waga", + "How much a soft wish counts, from 1 to 3": "Ile waży miękkie życzenie, od 1 do 3", + "Why the wish exists": "Dlaczego życzenie istnieje", + "Timetable scenario": "Scenariusz planu lekcji", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jeden wzór tygodnia, zrobiony przez generator lub wzięty z obecnego planu. Zachowuje swoje dane wejściowe i to, jak dobrze spełnia życzenia.", + "The name timetablers know the scenario by": "Nazwa, pod którą układający plan znają scenariusz", + "Whether the generator made it or it came from the current timetable": "Czy zrobił go generator, czy pochodzi z obecnego planu", + "Generated": "Wygenerowany", + "From the current timetable": "Z obecnego planu", + "Week of": "Tydzień od", + "The Monday of the first week of the window": "Poniedziałek pierwszego tygodnia okresu", + "Window start": "Początek okresu", + "The first day the week pattern applies to": "Pierwszy dzień, którego dotyczy wzór tygodnia", + "Window end": "Koniec okresu", + "The last day the week pattern applies to": "Ostatni dzień, którego dotyczy wzór tygodnia", + "Waiting, generating, done, failed, or published as draft lessons": "Oczekuje, generowanie, gotowy, nieudany lub opublikowany jako lekcje robocze", + "Waiting": "Oczekuje", + "Generating": "Generowanie", + "Failed": "Nieudany", + "Published": "Opublikowany", + "Seed": "Ziarno", + "The number the generator starts from, so a run can be repeated": "Liczba, od której zaczyna generator, aby przebieg można było powtórzyć", + "Input": "Dane wejściowe", + "The periods, rooms, lessons and wishes the scenario was made from": "Godziny, sale, lekcje i życzenia, z których powstał scenariusz", + "Placements": "Rozmieszczenia", + "Each lesson with the period and room it was given": "Każda lekcja z przydzieloną godziną i salą", + "Unplaced lessons": "Nierozmieszczone lekcje", + "Lessons without a place, each with the hard wish that blocked it": "Lekcje bez miejsca, każda z twardym życzeniem, które ją zablokowało", + "Broken wishes": "Niespełnione życzenia", + "The wishes this scenario breaks, with the lessons that break them": "Życzenia, których ten scenariusz nie spełnia, z lekcjami, które je łamią", + "Measures": "Miary", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Rozmieszczone lekcje, niespełnione życzenia, okienka nauczycieli, lekcje dziennie i wykorzystanie sal", + "Reason": "Powód", + "Why the run failed": "Dlaczego przebieg się nie udał", + "Published at": "Opublikowano", + "When the scenario was written out as draft lessons": "Kiedy scenariusz zapisano jako lekcje robocze", + "Edit wish": "Edytuj życzenie", + "New wish": "Nowe życzenie", + "Hard: the generator always keeps it": "Twarde: generator zawsze go przestrzega", + "Soft: the generator keeps it where it can": "Miękkie: generator przestrzega go, gdy może", + "Weight (1 to 3)": "Waga (od 1 do 3)", + "Most lessons a day": "Najwyżej lekcji dziennie", + "Period": "Lekcja", + "{day} period {number}": "{day} lekcja {number}", + "Teacher (user name)": "Nauczyciel (nazwa użytkownika)", + "Activity (group:subject)": "Zajęcia (grupa:przedmiot)", + "Say who or what the wish is about.": "Podaj, kogo lub czego dotyczy życzenie.", + "Choose at least one period.": "Wybierz co najmniej jedną lekcję.", + "The limit is a whole number of 1 or more.": "Limit to liczba całkowita równa 1 lub większa.", + "Timetable": "Plan lekcji", + "Wishes": "Życzenia", + "Timetable wishes": "Życzenia do planu lekcji", + "Generator run": "Przebieg generatora", + "Generator progress": "Postęp generatora", + "The run failed: {reason}": "Przebieg się nie powiódł: {reason}", + "{placed} of {lessons} lessons placed": "Umieszczono {placed} z {lessons} lekcji", + "Generate again": "Generuj ponownie", + "Generate": "Generuj", + "Every lesson has a place.": "Każda lekcja ma miejsce.", + "Lesson": "Lekcja", + "No free period and room": "Brak wolnej godziny i sali", + "Broken soft wishes": "Niedotrzymane miękkie życzenia", + "Every soft wish is kept.": "Każde miękkie życzenie jest dotrzymane.", + "Wish": "Życzenie", + "Lessons": "Lekcje", + "Generating: {percent}% of the time budget used": "Generowanie: wykorzystano {percent}% czasu", + "Waiting to start": "Oczekuje na start", + "Published as draft lessons": "Opublikowano jako szkice lekcji", + "Could not read the scenario.": "Nie udało się odczytać scenariusza.", + "Could not start the run.": "Nie udało się uruchomić przebiegu.", + "Scenarios": "Scenariusze", + "Timetable scenarios": "Scenariusze planu lekcji", + "Scenario": "Scenariusz", + "Take the current timetable": "Przejmij obecny plan lekcji", + "Could not take the current timetable.": "Nie udało się przejąć obecnego planu lekcji.", + "Broken hard wishes": "Naruszone twarde życzenia", + "Not on a period of the week grid": "Nie na godzinie siatki tygodniowej", + "Compare scenarios": "Porównaj scenariusze", + "Scenarios to compare": "Scenariusze do porównania", + "Choose two or three scenarios to compare them.": "Wybierz dwa lub trzy scenariusze, aby je porównać.", + "Measure": "Miara", + "Best": "Najlepsza", + "Lessons that differ": "Lekcje, które się różnią", + "No lesson differs.": "Żadna lekcja się nie różni.", + "Not placed": "Nieumieszczona", + "{period} in {room}": "{period} w {room}", + "Lessons placed": "Umieszczone lekcje", + "Lessons without a place": "Lekcje bez miejsca", + "Clashes": "Konflikty", + "Hard wishes broken": "Niedotrzymane twarde życzenia", + "Soft wishes broken": "Niedotrzymane miękkie życzenia", + "Soft wishes broken, weighted": "Niedotrzymane miękkie życzenia, ważone", + "Free periods between lessons, all teachers": "Okienka, wszyscy nauczyciele", + "Most free periods of one teacher": "Najwięcej okienek jednego nauczyciela", + "Most lessons of one group on a day": "Najwięcej lekcji jednej grupy w dniu", + "Room use": "Wykorzystanie sal", + "Publish as draft lessons": "Opublikuj jako lekcje robocze", + "Draft lessons written: {count}": "Zapisane lekcje robocze: {count}", + "Could not publish the scenario.": "Nie udało się opublikować scenariusza.", + "Rules": "Reguły", + "Rules for {column}": "Reguły dla {column}", + "When a card enters this column": "Gdy karta trafia do tej kolumny", + "Action": "Akcja", + "Set the priority": "Ustaw priorytet", + "Assign to": "Przypisz do", + "Assign the person who moved the card": "Przypisz osobie, która przeniosła kartę", + "Remove the assignee": "Usuń osobę przypisaną", + "Add a label": "Dodaj etykietę", + "No longer a project member": "Już nie jest członkiem projektu", + "This label no longer exists": "Ta etykieta już nie istnieje", + "Add rule": "Dodaj regułę", + "Remove rule": "Usuń regułę", + "No rules yet. Add one to change a card when it enters this column.": "Brak reguł. Dodaj regułę, aby zmieniać kartę, gdy trafia do tej kolumny.", + "Could not save the rules. Please try again.": "Nie udało się zapisać reguł. Spróbuj ponownie.", + "1 rule runs when a card enters this column": "1 reguła działa, gdy karta trafia do tej kolumny", + "{count} rules run when a card enters this column": "Liczba reguł, które działają, gdy karta trafia do tej kolumny: {count}", + "Rules applied: {changes}": "Zastosowane reguły: {changes}", + "assigned to {name}": "przypisano do {name}", + "assignee removed": "usunięto osobę przypisaną", + "priority {priority}": "priorytet {priority}", + "label {label}": "etykieta {label}", + "What happens to a card when it enters this column, applied in list order.": "Co dzieje się z kartą, gdy trafia do tej kolumny, w kolejności listy.", + "Value": "Wartość", + "What the rule does to the card.": "Co reguła robi z kartą.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Priorytet, identyfikator użytkownika lub etykiety używany przez akcję; puste dla akcji bez wartości.", + "is not": "nie jest", + "{dimension} is not": "{dimension} nie jest", + "Saved filters": "Zapisane filtry", + "No saved filters yet": "Brak zapisanych filtrów", + "Save filter": "Zapisz filtr", + "Rename \"{name}\"": "Zmień nazwę „{name}”", + "Delete \"{name}\"": "Usuń „{name}”", + "Clear filters": "Wyczyść filtry", + "Showing {shown} of {total} tasks": "Wyświetlane zadania: {shown} z {total}", + "Me": "Ja", + "No date": "Bez daty", + "Rename saved filter": "Zmień nazwę zapisanego filtra", + "Share with the project": "Udostępnij projektowi", + "Give the filter a name": "Nadaj filtrowi nazwę", + "Could not save the filter. Please try again.": "Nie udało się zapisać filtra. Spróbuj ponownie.", + "Some labels in \"{name}\" no longer exist and were left out.": "Niektóre etykiety w „{name}” już nie istnieją i zostały pominięte.", + "Could not delete the filter. Please try again.": "Nie udało się usunąć filtra. Spróbuj ponownie.", + "Saved filter": "Zapisany filtr", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Nazwany filtr tablicy jednego projektu, prywatny dla osoby, która go zapisała, chyba że udostępniono go projektowi.", + "The project whose board the filter applies to": "Projekt, do którego tablicy odnosi się filtr", + "The name the filter is listed under": "Nazwa, pod którą filtr jest na liście", + "Saved by": "Zapisane przez", + "Nextcloud user id of the person who saved the filter": "Identyfikator użytkownika Nextcloud osoby, która zapisała filtr", + "Shared with the project": "Udostępniony projektowi", + "Whether every project member sees and applies the filter": "Czy każdy członek projektu widzi filtr i może go zastosować", + "Criteria": "Kryteria", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtr: osoba przypisana, etykieta, priorytet i termin, każdy z jest lub nie jest i wartościami", + "Cross-project view": "Widok międzyprojektowy", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Zapisany wybór projektów, których zadania są pokazywane razem w torach statusów, udostępniony wymienionym osobom.", + "Shared with": "Udostępniony", + "The name the view is listed under": "Nazwa, pod którą widok jest wymieniony", + "Nextcloud user id of the person who saved the view": "Identyfikator użytkownika Nextcloud osoby, która zapisała widok", + "Nextcloud user ids of the people the view is shared with": "Identyfikatory użytkowników Nextcloud osób, którym udostępniono widok", + "The projects whose tasks the view shows, at most twenty": "Projekty, których zadania pokazuje widok, najwyżej dwadzieścia", + "1 project in this view is hidden from you.": "1 projekt w tym widoku jest przed tobą ukryty.", + "{count} projects in this view are hidden from you.": "Projekty w tym widoku ukryte przed tobą: {count}.", + "{project} has no column for {status}.": "Projekt {project} nie ma kolumny dla statusu {status}.", + "This view does not exist or is not shared with you.": "Ten widok nie istnieje lub nie został ci udostępniony.", + "\"{task}\" moved to {status}.": "\"{task}\" przeniesiono do {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Widoki międzyprojektowe", + "New view": "Nowy widok", + "Edit view": "Edytuj widok", + "Delete view": "Usuń widok", + "Give the view a name": "Nadaj widokowi nazwę", + "Pick at least one project": "Wybierz co najmniej jeden projekt", + "A view shows at most {max} projects": "Widok pokazuje najwyżej {max} projektów", + "Could not save the view. Please try again.": "Nie udało się zapisać widoku. Spróbuj ponownie.", + "Could not delete the view. Please try again.": "Nie udało się usunąć widoku. Spróbuj ponownie.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Usunąć „{title}”? Projekty i ich zadania pozostaną bez zmian.", + "People see the tasks of the projects they are in, never more.": "Każdy widzi tylko zadania projektów, w których jest.", + "No views yet. A view shows the tasks of several of your projects together.": "Brak widoków. Widok pokazuje razem zadania kilku twoich projektów.", + "Projects in view: {count}": "Projekty w widoku: {count}", + "Notify me when a task is assigned to me": "Powiadamiaj mnie, gdy zostanie mi przypisane zadanie", + "Also send these to me by email": "Wysyłaj mi je także e-mailem", + "Add an email address in your Nextcloud personal settings to get mail.": "Dodaj adres e-mail w osobistych ustawieniach Nextcloud, aby otrzymywać wiadomości.", + "Code link": "Link do kodu", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, gałąź, prośba o scalenie lub zgłoszenie w serwisie z kodem, które dotyczy zadania.", + "The task the link belongs to": "Zadanie, do którego należy link", + "The project of the task": "Projekt zadania", + "Task key": "Klucz zadania", + "The task key the forge text named, such as VC-12": "Klucz zadania wskazany w tekście serwisu z kodem, np. VC-12", + "What the link points at": "Na co wskazuje link", + "Link": "Link", + "The address of the item in the forge": "Adres elementu w serwisie z kodem", + "The commit message, branch name or merge request title": "Opis commita, nazwa gałęzi lub tytuł prośby o scalenie", + "Repository": "Repozytorium", + "The repository, such as acme/portal": "Repozytorium, np. acme/portal", + "Forge id": "Id w serwisie", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Własne id elementu w serwisie z kodem, np. github:acme/portal#42 lub hash commita", + "State": "Stan", + "The state of a merge request or issue": "Stan prośby o scalenie lub zgłoszenia", + "Who made the commit or opened the merge request": "Kto wykonał commit lub otworzył prośbę o scalenie", + "When the commit was made or the merge request last changed": "Kiedy wykonano commit lub ostatnio zmieniła się prośba o scalenie", + "Added by": "Dodane przez", + "Whether a person added the link or the integration wrote it": "Czy link dodała osoba, czy zapisała go integracja", + "Nextcloud user UIDs of project members": "Identyfikatory użytkowników Nextcloud członków projektu", + "Add link": "Dodaj link", + "Added by hand": "Dodany ręcznie", + "Branch": "Gałąź", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Z integracji", + "Link to a commit, branch or merge request": "Link do commita, gałęzi lub prośby o scalenie", + "Merge request": "Prośba o scalenie", + "Merged": "Scalona", + "No code linked yet. Name {key} in a commit message or paste a link.": "Brak powiązanego kodu. Wpisz {key} w opisie commita lub wklej link.", + "No code linked yet. Paste a link to a commit or merge request.": "Brak powiązanego kodu. Wklej link do commita lub prośby o scalenie.", + "Paste a web address that starts with https://.": "Wklej adres internetowy zaczynający się od https://.", + "Remove link {title}": "Usuń link {title}", + "The link could not be added.": "Nie udało się dodać linku.", + "The link could not be removed.": "Nie udało się usunąć linku.", + "This link is already on the task.": "Ten link jest już przy zadaniu.", + "Code forges": "Serwisy z kodem", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Łącz commity i pull requesty z GitHuba z zadaniami. Integriq odbiera zdarzenia; planninq nigdy nie wywołuje GitHuba.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Pobierz konfigurację i zaimportuj ją w Integriq. Następnie wpisz sekret w regule \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "W GitHubie dodaj do repozytorium webhook z tym adresem i tym samym sekretem. Wybierz typ treści application/json oraz zdarzenia push i pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Wpisz klucz zadania, np. VC-12, w opisie commita, nazwie gałęzi lub tytule pull requesta. Link pojawi się wtedy przy tym zadaniu.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriq członkowie projektu nadal mogą wkleić link na stronie zadania.", + "Download the Integriq configuration": "Pobierz konfigurację Integriq", + "Calendar": "Kalendarz", + "Previous": "Poprzedni", + "Calendar view": "Widok kalendarza", + "Starts:": "Początek:", + "No tasks with a date in this month.": "Brak zadań z datą w tym miesiącu.", + "Week of {start} to {end}": "Tydzień od {start} do {end}", + "My calendar": "Mój kalendarz", + "Show as list": "Pokaż jako listę", + "Show as calendar": "Pokaż jako kalendarz", + "Open my calendar": "Otwórz mój kalendarz", + "Nextcloud Tasks": "Zadania Nextcloud", + "Show my tasks in Nextcloud Tasks": "Pokaż moje zadania w Zadaniach Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Zadania przypisane do Ciebie lub Tobie udostępnione pojawiają się na liście \"Planninq\" w Zadaniach i Kalendarzu Nextcloud. Zmiany wprowadzone tam są zastępowane przy następnej zmianie w Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ten serwer nie może zapisywać w Zadaniach Nextcloud, więc eksport jest niedostępny.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Zarządzane przez Planninq. Zmiany wprowadzone tutaj są zastępowane przy następnej zmianie w Planninq.", + "Working days and holidays": "Dni robocze i święta", + "Dates set on the timeline skip the days that are not working days.": "Daty ustawione na osi czasu pomijają dni, które nie są robocze.", + "Working weekdays": "Dni robocze tygodnia", + "Non-working days": "Dni wolne", + "No non-working days yet.": "Brak jeszcze dni wolnych.", + "Add day": "Dodaj dzień", + "Year": "Rok", + "Add Dutch national holidays": "Dodaj holenderskie święta państwowe", + "Save working days": "Zapisz dni robocze", + "Choose at least one working weekday.": "Wybierz co najmniej jeden dzień roboczy.", + "Working days saved.": "Dni robocze zapisane.", + "Could not save the working days.": "Nie udało się zapisać dni roboczych.", + "New Year's Day": "Nowy Rok", + "Easter Sunday": "Niedziela Wielkanocna", + "Easter Monday": "Poniedziałek Wielkanocny", + "King's Day": "Dzień Króla", + "Liberation Day": "Dzień Wyzwolenia", + "Ascension Day": "Wniebowstąpienie", + "Whit Sunday": "Zielone Świątki", + "Whit Monday": "Drugi dzień Zielonych Świątek", + "Christmas Day": "Boże Narodzenie", + "Boxing Day": "Drugi dzień Bożego Narodzenia", + "Dates of {title}": "Daty zadania {title}", + "The due date cannot be before the start date.": "Termin nie może przypadać przed datą rozpoczęcia.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Nie udało się zapisać dat.", + "{title} now runs from {start} to {end}": "{title} trwa teraz od {start} do {end}", + "Auto-scheduling": "Automatyczne planowanie", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Gdy jest włączone, przesunięcie terminu na osi czasu na później proponuje przesunięcie blokowanych zadań.", + "Move blocked tasks along when a task slips": "Przesuwaj zablokowane zadania, gdy zadanie się opóźnia", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na osi czasu późniejszy termin proponuje przesunięcie blokowanych zadań. Liczą się tylko powiązania \"blokuje\", a zadania przesuwają się tylko na później.", + "Move the tasks that wait for {title}?": "Przesunąć zadania czekające na {title}?", + "These tasks wait for it and would start after its new due date:": "Te zadania na nie czekają i zaczęłyby się po nowym terminie:", + "{count} tasks would move; the first {limit} are listed.": "Przesunięto by {count} zadań; pokazano pierwsze {limit}.", + "Now": "Teraz", + "After the move": "Po przesunięciu", + "Only this task": "Tylko to zadanie", + "Move all": "Przesuń wszystkie", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Zatrzymano przy {title}: nie udało się zapisać dat. Zadania przed nim zostały przesunięte.", + "Cumulative flow": "Przepływ skumulowany", + "Show as chart": "Pokaż jako wykres", + "Show as table": "Pokaż jako tabelę", + "Tasks per column per day": "Zadania w kolumnie na dzień", + "Tasks without recorded history in this period: {count}": "Zadania bez zapisanej historii w tym okresie: {count}", + "Lead and cycle time": "Czas realizacji i czas cyklu", + "No tasks were finished in this period.": "W tym okresie nie ukończono żadnych zadań.", + "Finished tasks": "Ukończone zadania", + "Cycle time, average": "Czas cyklu, średnia", + "Cycle time, 85th percentile": "Czas cyklu, 85. percentyl", + "Lead time, average": "Czas realizacji, średnia", + "Tasks whose finish time was estimated from their history: {count}": "Zadania, których czas zakończenia oszacowano z historii: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Czas cyklu każdego ukończonego zadania, ze średnią i 85. percentylem", + "Slowest tasks": "Najwolniejsze zadania", + "cycle {cycle}, lead {lead}": "cykl {cycle}, realizacja {lead}", + "{days} days": "{days} dni", + "Could not load the flow of this project.": "Nie udało się wczytać przepływu tego projektu.", + "Last {days} days": "Ostatnie {days} dni", + "Portfolio flow": "Przepływ portfela", + "An admin adds portfolios under Projects, Portfolios.": "Administrator dodaje portfele w Projekty, Portfele.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekty niewyświetlone, bo naraz wyświetla się najwyżej 50: {count}", + "Could not load the flow of this portfolio.": "Nie udało się wczytać przepływu tego portfela.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Przepływ skumulowany i czas cyklu w projektach portfela.", + "Edit report": "Edytuj raport", + "Only tasks where": "Tylko zadania, w których", + "Group by": "Grupuj według", + "Display": "Widok", + "Share with everyone who can read its projects": "Udostępnij wszystkim, którzy mogą czytać jego projekty", + "The report could not be saved.": "Nie udało się zapisać raportu.", + "Number of tasks": "Liczba zadań", + "Bar": "Słupki", + "Donut": "Pierścień", + "Table": "Tabela", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} z {total} projektów w tym raporcie jest dla ciebie niewidocznych", + "No tasks match this report.": "Żadne zadanie nie pasuje do tego raportu.", + "None": "Brak", + "Could not load this report.": "Nie udało się wczytać tego raportu.", + "Report": "Raport", + "Your reports": "Twoje raporty", + "My reports": "Moje raporty", + "Shared reports": "Udostępnione raporty", + "You have not built a report yet.": "Nie utworzono jeszcze żadnego raportu.", + "Nobody has shared a report with you yet.": "Nikt jeszcze nie udostępnił ci raportu.", + "Reports you built over tasks, and the ones shared with you.": "Raporty utworzone przez ciebie na podstawie zadań oraz udostępnione tobie.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Zapisane zapytanie o zadania: które projekty, jakie filtry, grupowanie według czego, liczba lub suma, pokazane jako tabela lub wykres.", + "The name the report is listed under": "Nazwa, pod którą raport jest wymieniony", + "What the report shows and who it is for": "Co pokazuje raport i dla kogo jest", + "Nextcloud user id of the person who saved the report": "Identyfikator użytkownika Nextcloud osoby, która zapisała raport", + "Who can open the report": "Kto może otworzyć raport", + "Only me": "Tylko ja", + "Everyone who can read its projects": "Każdy, kto może czytać jego projekty", + "The projects the report covers, at most fifty": "Projekty objęte raportem, najwyżej pięćdziesiąt", + "Filters": "Filtry", + "Task fields and the value each must equal": "Pola zadania i wartość, której każde musi być równe", + "The task field the report groups on": "Pole zadania, według którego raport grupuje", + "Count the tasks, or add up a number on them": "Policz zadania albo zsumuj na nich liczbę", + "Sum": "Suma", + "Sum of": "Suma pola", + "The number added up when the measure is a sum": "Liczba sumowana, gdy miarą jest suma", + "Story points": "Punkty historyjki", + "Estimated duration": "Szacowany czas trwania", + "How the report is shown": "Jak raport jest pokazywany", + "Issue type": "Typ zgłoszenia", + "Task fields and the value each must equal; empty when the report covers every task": "Pola zadania i wartość, jaką każde musi mieć; puste, gdy raport obejmuje wszystkie zadania", + "The status a task must have": "Status, jaki musi mieć zadanie", + "The priority a task must have": "Priorytet, jaki musi mieć zadanie", + "The user a task must be assigned to": "Użytkownik, do którego musi być przypisane zadanie", + "A label a task must carry": "Etykieta, którą musi mieć zadanie", + "The board column a task must be in": "Kolumna tablicy, w której musi być zadanie", + "The issue type a task must have": "Typ zgłoszenia, jaki musi mieć zadanie", + "Manager groups": "Grupy menedżerów", + "Member groups": "Grupy członków", + "Viewer groups": "Grupy czytelników", + "Viewers": "Czytelnicy", + "Owning group": "Grupa właścicielska", + "Nextcloud groups whose members manage the project": "Grupy Nextcloud, których członkowie zarządzają projektem", + "Nextcloud groups whose members work on the project": "Grupy Nextcloud, których członkowie pracują nad projektem", + "Nextcloud groups whose members may read the project": "Grupy Nextcloud, których członkowie mogą czytać projekt", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Użytkownicy Nextcloud zarządzający projektem: ustawieniami, członkami i pracą", + "Nextcloud user ids who may read the project and its work but not change it": "Użytkownicy Nextcloud, którzy mogą czytać projekt i jego pracę, ale nie zmieniać", + "The Nextcloud group that owns the project with its creator, at most one": "Grupa Nextcloud, która jest właścicielem projektu razem z jego twórcą, najwyżej jedna", + "Nextcloud user ids who may read this through the project": "Użytkownicy Nextcloud, którzy mogą czytać to przez projekt", + "Nextcloud groups whose members may change this through the project": "Grupy Nextcloud, których członkowie mogą zmieniać to przez projekt", + "Nextcloud groups whose members may read this through the project": "Grupy Nextcloud, których członkowie mogą czytać to przez projekt", + "Search for a person or a group…": "Szukaj osoby lub grupy…", + "No one found. Your admin's sharing settings decide who you can find.": "Nikogo nie znaleziono. Ustawienia udostępniania administratora decydują, kogo możesz znaleźć.", + "Type at least two characters": "Wpisz co najmniej dwa znaki", + "Everyone in this group": "Wszyscy w tej grupie", + "Could not search for people. Please try again.": "Nie udało się wyszukać osób. Spróbuj ponownie.", + "Could not remove the group": "Nie udało się usunąć grupy", + "Only the owner and managers change who is on this project.": "Tylko właściciel i menedżerowie zmieniają, kto należy do tego projektu.", + "Role of {name}": "Rola: {name}", + "Manager": "Menedżer", + "Member": "Członek", + "Viewer": "Czytelnik", + "Could not change the role": "Nie udało się zmienić roli", + "Owned by group: {name}": "Własność grupy: {name}", + "No group owns this project.": "Żadna grupa nie jest właścicielem tego projektu.", + "Owned by group": "Własność grupy", + "Search for a group…": "Wyszukaj grupę…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nie znaleziono grupy. Ustawienia udostępniania administratora decydują, które grupy możesz znaleźć.", + "No owning group": "Brak grupy właściciela", + "Could not search for groups. Please try again.": "Nie udało się wyszukać grup. Spróbuj ponownie.", + "Could not change the owning group": "Nie udało się zmienić grupy właściciela", + "You can read this project. Only its members change it.": "Możesz czytać ten projekt. Zmieniają go tylko jego członkowie.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurs, którego dotyczy ta lekcja, na przykład przedmiot do wyboru, gdy szkolna aplikacja do nauki go zna.", + "Online meeting link": "Link do lekcji online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Gdzie uczniowie dołączają do tej lekcji online. Przycisk Dołącz pojawia się tylko dla linku https." }, "plurals": {} } diff --git a/l10n/pt.js b/l10n/pt.js index 195ce8b3..5cd007cd 100644 --- a/l10n/pt.js +++ b/l10n/pt.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Projetos ativos", + "Archived projects": "Projetos arquivados", + "Boards": "Quadros", + "My projects": "Os meus projetos", + "Portfolio": "Carteira", + "Project board": "Quadro do projeto", + "Projects I am in": "Projetos em que participo", + "Timeline": "Cronologia", + "Timesheet": "Folha de horas", + "Features & roadmap": "Funcionalidades e roteiro", + "Flow": "Fluxo", + "Flows": "Fluxos", + "Reports": "Relatórios", + "Pick a report to open it.": "Escolha um relatório para o abrir.", + "In progress": "Em curso", + "Date": "Data", + "Due": "Prazo", + "Assignee": "Atribuído a", + "Who": "Quem", + "What": "O quê", + "Minutes": "Minutos", + "Entries": "Entradas", + "Most recent": "Mais recentes", + "Per person": "Por pessoa", + "By status": "Por estado", + "By priority": "Por prioridade", + "Task status": "Estado das tarefas", + "Time spent": "Tempo gasto", + "Capacity": "Capacidade", + "Due soonest": "Vencem primeiro", + "Minutes logged": "Minutos registados", + "Nothing is due": "Nada está por vencer", + "Nothing logged yet": "Ainda nada registado", + "What is open, what is blocked, and what is overdue.": "O que está aberto, o que está bloqueado e o que está atrasado.", + "How allocation is spread across the people working on projects.": "Como a alocação se distribui pelas pessoas que trabalham em projetos.", + "Hours logged, and the projects they went to.": "As horas registadas e os projetos para onde foram.", + "Billable": "Faturável", + "Budget: {amount}": "Orçamento: {amount}", + "Loading projects": "A carregar projetos", + "No projects for this client yet": "Ainda não há projetos para este cliente", + "Open in Planninq": "Abrir no Planninq", + "This project could not be found": "Este projeto não foi encontrado", + "Untitled project": "Projeto sem título", + "and {count} more": "e mais {count}", + "Store": "Loja", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instale registos, esquemas e fluxos publicados por outras organizações.", + "Work Date": "Data de trabalho", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Ações da coluna", + "Columns": "Colunas", + "Could not remove the column. Please try again.": "Não foi possível remover a coluna. Tente novamente.", + "Could not save the column. Please try again.": "Não foi possível guardar a coluna. Tente novamente.", + "Done column": "Coluna de concluído", + "Edit column": "Editar coluna", + "Keep the card's status": "Manter o estado do cartão", + "Move its cards to": "Mover os seus cartões para", + "Move left": "Mover para a esquerda", + "Move right": "Mover para a direita", + "Status of cards moved here": "Estado dos cartões movidos para aqui", + "The last done column cannot be removed.": "A última coluna de concluído não pode ser removida.", + "WIP limit": "Limite WIP", + "over limit": "acima do limite", + "The status a card gets when it is moved into this column.": "O estado que um cartão recebe quando é movido para esta coluna.", + "All priorities": "Todas as prioridades", + "Could not create the task. Please try again.": "Não foi possível criar a tarefa. Tente novamente.", + "Created": "Criada", + "Move to backlog": "Para o backlog", + "Move to board": "Para o quadro", + "New task": "Nova tarefa", + "Nothing in the backlog": "Nada no backlog", + "Rank": "Posição", + "Sort by": "Ordenar por", + "Sort by rank to reorder": "Ordene por posição para reordenar", + "Task actions": "Ações da tarefa", + "All labels": "Todas as etiquetas", + "Filter tasks by label": "Filtrar tarefas por etiqueta", + "View timeline": "Ver cronologia", + "Board": "Quadro", + "List": "Lista", + "Column": "Coluna", + "Board or list": "Quadro ou lista", + "Log": "Registo", + "Add entry": "Adicionar entrada", + "Show": "Mostrar", + "No actions yet": "Ainda não há ações", + "Closed": "Fechado", + "Entry actions": "Ações da entrada", + "Add action": "Adicionar ação", + "by {author}": "por {author}", + "saved {time}": "guardado {time}", + "Attendees: {names}": "Participantes: {names}", + "Add the first entry": "Adicionar a primeira entrada", + "Issues": "Problemas", + "Lessons learned": "Lições aprendidas", + "Meetings": "Reuniões", + "Decisions": "Decisões", + "Actions": "Ações", + "Issue": "Problema", + "Lesson learned": "Lição aprendida", + "Meeting": "Reunião", + "Decision": "Decisão", + "About this project": "Sobre este projeto", + "No description yet": "Ainda sem descrição", + "Start date": "Data de início", + "Not set": "Não definida", + "End date": "Data de fim", + "Progress": "Progresso", + "No tasks yet": "Ainda não há tarefas", + "Open the board": "Abrir o quadro", + "People": "Pessoas", + "Owner": "Proprietário", + "Latest log entries": "Entradas mais recentes", + "Open the log": "Abrir o registo", + "{done} of {total} tasks done": "{done} de {total} tarefas concluídas", + "Edit entry": "Editar entrada", + "Type": "Tipo", + "Attendees": "Participantes", + "Issue is closed": "O problema está fechado", + "Could not save the entry. Please try again.": "Não foi possível guardar a entrada. Tente novamente.", + "From: {title}": "De: {title}", + "What needs to happen": "O que tem de acontecer", + "Could not create the action. Please try again.": "Não foi possível criar a ação. Tente novamente.", + "The action was created but could not be linked to the entry.": "A ação foi criada, mas não foi possível ligá-la à entrada.", + "Project pages": "Páginas do projeto", + "Overview": "Visão geral", + "Risks": "Riscos", + "Log entry": "Entrada de registo", + "A short name for the entry": "Um nome curto para a entrada", + "Project": "Projeto", + "The project this entry belongs to": "O projeto a que esta entrada pertence", + "What kind of entry this is": "Que tipo de entrada é", + "When it happened": "Quando aconteceu", + "What happened, in Markdown": "O que aconteceu, em Markdown", + "Whether an issue is still open": "Se um problema ainda está aberto", + "The people at a meeting": "As pessoas numa reunião", + "Tasks that came out of this entry": "Tarefas que resultaram desta entrada", + "Add risk": "Adicionar risco", + "Risk": "Risco", + "Score": "Pontuação", + "Response": "Resposta", + "Review date": "Data de revisão", + "no longer on the project": "já não está no projeto", + "Edit {title}": "Editar {title}", + "No risks recorded yet": "Ainda não há riscos registados", + "Add the first risk": "Adicionar o primeiro risco", + "Medium": "Médio", + "Mitigating": "Em mitigação", + "Occurred": "Ocorreu", + "Avoid": "Evitar", + "Reduce": "Reduzir", + "Transfer": "Transferir", + "Accept": "Aceitar", + "Highest open risks": "Riscos abertos mais altos", + "No open risks": "Não há riscos abertos", + "Open the risk register": "Abrir o registo de riscos", + "Edit risk": "Editar risco", + "What could go wrong": "O que pode correr mal", + "Likelihood": "Probabilidade", + "Impact": "Impacto", + "Score {score}": "Pontuação {score}", + "Countermeasures": "Contramedidas", + "Could not save the risk. Please try again.": "Não foi possível guardar o risco. Tente novamente.", + "Risks by likelihood and impact": "Riscos por probabilidade e impacto", + "Risk scale": "Escala de risco", + "The levels every project scores its risks on, and where low turns into medium and high": "Os níveis em que cada projeto pontua os seus riscos, e onde baixo passa a médio e alto", + "Number of levels": "Número de níveis", + "Likelihood labels": "Etiquetas de probabilidade", + "Impact labels": "Etiquetas de impacto", + "Level {level}": "Nível {level}", + "Medium from score": "Médio a partir da pontuação", + "High from score": "Alto a partir da pontuação", + "Risk scale saved": "Escala de risco guardada", + "1 risk uses level {level}. Change it first.": "1 risco usa o nível {level}. Altere-o primeiro.", + "{count} risks use level {level}. Change them first.": "{count} riscos usam o nível {level}. Altere-os primeiro.", + "Every level needs a label, and high must start above medium.": "Cada nível precisa de uma etiqueta, e alto tem de começar acima de médio.", + "The project this risk belongs to": "O projeto a que este risco pertence", + "The cause and the effect, in Markdown": "A causa e o efeito, em Markdown", + "Category": "Categoria", + "A free grouping, such as planning, budget or supplier": "Um agrupamento livre, como planeamento, orçamento ou fornecedor", + "How likely it is, on the admin's risk scale": "Quão provável é, na escala de risco do administrador", + "How hard it would hit, on the admin's risk scale": "Quão forte atingiria, na escala de risco do administrador", + "Likelihood times impact, calculated by the server": "Probabilidade vezes impacto, calculado pelo servidor", + "Where the risk stands": "Em que ponto está o risco", + "The person who watches this risk": "A pessoa que acompanha este risco", + "How the project answers the risk": "Como o projeto responde ao risco", + "What is done to prevent it or soften it, in Markdown": "O que se faz para o evitar ou atenuar, em Markdown", + "When to look at this risk again": "Quando rever este risco de novo", + "Very low": "Muito baixo", + "Very high": "Muito alto", + "All projects": "Todos os projetos", + "Project status report": "Relatório de estado do projeto", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Um relatório datado sobre como um projeto está em dinheiro, organização, tempo, informação, qualidade e risco (os aspetos GROTIK), cada um com uma nota.", + "The project this report is about": "O projeto de que trata este relatório", + "Report date": "Data do relatório", + "The day the report describes": "O dia que o relatório descreve", + "Money": "Dinheiro", + "How the project stands on this aspect": "Como o projeto está neste aspeto", + "On track": "No rumo", + "At risk": "Em risco", + "Off track": "Fora do rumo", + "Money note": "Nota sobre dinheiro", + "A short explanation of this status": "Uma breve explicação deste estado", + "Organisation": "Organização", + "Organisation note": "Nota sobre organização", + "Time": "Tempo", + "Time note": "Nota sobre tempo", + "Information": "Informação", + "Information note": "Nota sobre informação", + "Quality": "Qualidade", + "Quality note": "Nota sobre qualidade", + "Risk note": "Nota sobre risco", + "Overall": "Geral", + "The worst of the six statuses, calculated by the server": "O pior dos seis estados, calculado pelo servidor", + "Health: money": "Saúde: dinheiro", + "Copied from the newest status report": "Copiado do relatório de estado mais recente", + "Health: organisation": "Saúde: organização", + "Health: time": "Saúde: tempo", + "Health: information": "Saúde: informação", + "Health: quality": "Saúde: qualidade", + "Health: risk": "Saúde: risco", + "Health: overall": "Saúde: geral", + "Health: report date": "Saúde: data do relatório", + "The date of the newest status report": "A data do relatório de estado mais recente", + "New report": "Novo relatório", + "Only the project owner writes status reports.": "Só o proprietário do projeto escreve relatórios de estado.", + "Latest report, {date}": "Último relatório, {date}", + "Aspect": "Aspeto", + "Note": "Nota", + "Report history": "Histórico de relatórios", + "Author": "Autor", + "No status reports yet": "Ainda não há relatórios de estado", + "Write the first report": "Escrever o primeiro relatório", + "Choose a status for every aspect to save the report.": "Escolha um estado para cada aspeto para guardar o relatório.", + "Suggested: on track.": "Sugestão: no rumo.", + "Suggested: at risk.": "Sugestão: em risco.", + "Suggested: off track.": "Sugestão: fora do rumo.", + "1 task is past its due date.": "1 tarefa passou do prazo.", + "{count} tasks are past their due date.": "{count} tarefas passaram do prazo.", + "The end date has passed with 1 open task.": "A data de fim passou com 1 tarefa aberta.", + "The end date has passed with {count} open tasks.": "A data de fim passou com {count} tarefas abertas.", + "No open task is past its due date.": "Nenhuma tarefa aberta passou do prazo.", + "The highest open risk, \"{title}\", scores {score}.": "O risco aberto mais alto, \"{title}\", tem pontuação {score}.", + "There are no open risks.": "Não há riscos abertos.", + "Costs are at {percent}% of the budget.": "Os custos estão em {percent}% do orçamento.", + "No suggestion: the project has no budget.": "Sem sugestão: o projeto não tem orçamento.", + "No suggestion: no costs are recorded for this project yet.": "Sem sugestão: ainda não há custos registados para este projeto.", + "The report was not saved. Only the project owner can write status reports.": "O relatório não foi guardado. Só o proprietário do projeto pode escrever relatórios de estado.", + "No report": "Sem relatório", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Um grupo de projetos geridos pelas mesmas pessoas, como um departamento ou um programa. Os seus gestores leem todos os projetos que contém.", + "The name of the portfolio": "O nome do portefólio", + "What the portfolio holds and who runs it": "O que o portefólio contém e quem o gere", + "A colour for the portfolio's section in project lists": "Uma cor para a secção do portefólio nas listas de projetos", + "Managers": "Gestores", + "Nextcloud user UIDs of the people who run the portfolio": "IDs de utilizador Nextcloud das pessoas que gerem o portefólio", + "Order": "Ordem", + "Where the portfolio comes in project lists, lowest first": "Onde o portefólio aparece nas listas de projetos, o mais baixo primeiro", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "A escala de risco própria deste portefólio em JSON, com a mesma forma da escala da aplicação. Vazio significa a escala da aplicação.", + "Portfolio readers": "Leitores do portefólio", + "Nextcloud user UIDs of the managers of the project's portfolio": "IDs de utilizador Nextcloud dos gestores do portefólio do projeto", + "The portfolio this project belongs to": "O portefólio a que este projeto pertence", + "No portfolio": "Sem portefólio", + "All portfolios": "Todos os portefólios", + "You read this project as a manager of its portfolio. Only its members change it.": "Lê este projeto como gestor do seu portefólio. Só os membros o alteram.", + "Portfolios": "Portefólios", + "Portfolio status": "Estado do portefólio", + "No portfolios yet": "Ainda não há portefólios", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Um administrador adiciona portefólios em Projetos, Portefólios. Os projetos de um portefólio aparecem aqui com o seu estado.", + "Roll-up": "Resumo", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} no rumo, {atRisk} em risco, {offTrack} fora do rumo, {noReport} sem relatório", + "No project in this portfolio that you can read.": "Nenhum projeto deste portefólio que possa ler.", + "Start": "Início", + "End": "Fim", + "Budget": "Orçamento", + "Last report": "Último relatório", + "Out of date": "Desatualizado", + "Portfolio timeline": "Cronograma do portefólio", + "Zoom": "Zoom", + "Could not load the timeline": "Não foi possível carregar o cronograma", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Um administrador adiciona portefólios em Projetos, Portefólios. Os projetos de um portefólio aparecem aqui num só cronograma.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Abra um projeto para ver as fases e tarefas. O cronograma é só de leitura.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Omitidos porque não os pode ler: {count} projetos", + "Week": "Semana", + "Day": "Dia", + "Month": "Mês", + "Please try again later.": "Tente novamente mais tarde.", + "Status reports": "Relatórios de estado", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Após quantos dias o último relatório de estado de um projeto é marcado como desatualizado na vista do portefólio", + "Reporting period (days)": "Período de relatório (dias)", + "The reporting period is a whole number of days from 1 to 365.": "O período de relatório é um número inteiro de dias de 1 a 365.", + "Reporting period saved": "Período de relatório guardado", + "The reporting period was not saved. Please try again.": "O período de relatório não foi guardado. Tente novamente.", + "Every project of a portfolio with its status per aspect, rolled up.": "Cada projeto de um portefólio com o seu estado por aspeto, resumido.", + "The projects of a portfolio on one timeline.": "Os projetos de um portefólio num só cronograma.", + "Phases": "Fases", + "Add phase": "Adicionar fase", + "No phases yet": "Ainda não há fases", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Divida o projeto em fases, como iniciação, definição e execução. Uma fase fecha quando o documento de encerramento é carregado.", + "{hours} hours": "{hours} horas", + "Concluding document: {title}": "Documento de encerramento: {title}", + "Concluding document missing": "Falta o documento de encerramento", + "Move {title} up": "Subir {title}", + "Move {title} down": "Descer {title}", + "Close phase": "Fechar fase", + "Phase": "Fase", + "Files": "Ficheiros", + "Notes": "Notas", + "Audit trail": "Registo de auditoria", + "Edit phase": "Editar fase", + "Name": "Nome", + "Budget hours": "Horas orçamentadas", + "Could not save the phase. Please try again.": "Não foi possível guardar a fase. Tente novamente.", + "Close phase {title}": "Fechar a fase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Uma fase fecha com o seu documento de encerramento: carregue-o aqui ou escolha um dos ficheiros da fase.", + "Concluding document": "Documento de encerramento", + "This phase has no files yet.": "Esta fase ainda não tem ficheiros.", + "Upload a document": "Carregar um documento", + "The document was not uploaded. Please try again.": "O documento não foi carregado. Tente novamente.", + "Upload the concluding document before you close this phase.": "Carregue o documento de encerramento antes de fechar esta fase.", + "This phase cannot be closed from its current status.": "Esta fase não pode ser fechada a partir do estado atual.", + "The phase was not closed. Please try again.": "A fase não foi fechada. Tente novamente.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "O id do ficheiro desta fase que a encerra. A fase só pode ser concluída quando estiver definido e o ficheiro anexado.", + "Import from Microsoft Project": "Importar do Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Escolha um plano guardado no Microsoft Project em formato XML. Nada é importado até confirmar.", + "Plan file": "Ficheiro do plano", + "What the import creates": "O que a importação cria", + "Tasks": "Tarefas", + "Sub-tasks": "Subtarefas", + "Milestones": "Marcos", + "Links": "Ligações", + "Already imported, updated in place: {count}": "Já importados, atualizados no local: {count}", + "What does not carry over": "O que não é transferido", + "Tasks with resources, which are not imported: {count}": "Tarefas com recursos, que não são importadas: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tarefas abaixo do nível 3, colocadas sob a sua tarefa de nível 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Ligações que não são de fim para início, importadas como ligações relacionadas: {count}", + "Link lags, which are dropped: {count}": "Desfasamentos de ligações, que são descartados: {count}", + "Links to a summary task, which are not imported: {count}": "Ligações a uma tarefa de resumo, que não são importadas: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Ligações a tarefas fora deste plano, que não são importadas: {count}", + "No longer in the plan": "Já não está no plano", + "These stay in the project; remove them yourself if they are no longer needed.": "Ficam no projeto; remova-as você mesmo se já não forem necessárias.", + "Import": "Importar", + "Close": "Fechar", + "The plan is imported: {created} created, {updated} updated.": "O plano foi importado: {created} criados, {updated} atualizados.", + "Links that would close a loop were left out: {count}": "As ligações que fechariam um ciclo foram omitidas: {count}", + "The import stopped part-way. Run it again to finish it.": "A importação parou a meio. Execute-a de novo para a concluir.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Guarde o plano no Microsoft Project com Ficheiro, Guardar como, formato XML, e importe esse ficheiro.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Este ficheiro declara um DOCTYPE ou entidades, que não são aceites.", + "The file is larger than 10 MB.": "O ficheiro tem mais de 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "O plano tem mais de 2.000 tarefas, mais do que uma importação aceita.", + "This file is not a Microsoft Project plan in XML format.": "Este ficheiro não é um plano do Microsoft Project em formato XML.", + "Choose a file to import.": "Escolha um ficheiro para importar.", + "Only the project owner can import a plan.": "Só o proprietário do projeto pode importar um plano.", + "The plan could not be read. Please try again.": "Não foi possível ler o plano. Tente novamente.", + "Linked case: {title}": "Processo associado: {title}", + "Linked to a case": "Associado a um processo", + "Hand over to case": "Entregar ao processo", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copia sem alterações cada ficheiro do projeto e das suas tarefas, e um ficheiro que descreve o projeto, para o processo associado.", + "{date} by {user}": "{date} por {user}", + "Files copied: {count}": "Ficheiros copiados: {count}", + "Files that failed: {names}": "Ficheiros com falha: {names}", + "The handover failed. Please try again.": "A entrega falhou. Tente novamente.", + "The linked case could not be found, or you cannot open it.": "O processo associado não foi encontrado, ou não o pode abrir.", + "Case handovers": "Entregas ao processo", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Cada entrega dos ficheiros e metadados do projeto ao seu processo: quando, por quem, a que processo, cada ficheiro copiado com o seu SHA-256 e os ficheiros que falharam.", + "Finance": "Finanças", + "Add cost line": "Adicionar linha de custo", + "Delivery terms": "Condições de entrega", + "Billing model": "Modelo de faturação", + "Budget in euro": "Orçamento em euros", + "Budget in hours": "Orçamento em horas", + "Hourly rate in euro": "Taxa horária em euros", + "Planned start": "Início previsto", + "Planned end": "Fim previsto", + "Planned dates": "Datas previstas", + "Budget {amount}": "Orçamento {amount}", + "No budget agreed": "Sem orçamento acordado", + "Hours": "Horas", + "Only the project owner and the portfolio managers see the amounts.": "Só o proprietário do projeto e os gestores do portefólio veem os montantes.", + "Budget against cost per category": "Orçamento face aos custos por categoria", + "Labour (booked time)": "Mão de obra (horas registadas)", + "No category": "Sem categoria", + "Hours are not available": "As horas não estão disponíveis", + "Not yet assigned to a category": "Ainda não atribuído a uma categoria", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} gastos, {remaining} restantes", + "Budget against cost per phase": "Orçamento face aos custos por fase", + "No phase": "Sem fase", + "Cost lines": "Linhas de custo", + "From the finance system": "Do sistema financeiro", + "Edit cost line {amount}": "Editar a linha de custo {amount}", + "No cost lines yet": "Ainda não há linhas de custo", + "Commitments": "Compromissos", + "Actual cost": "Custo real", + "Forecast": "Previsão", + "Remaining": "Restante", + "Not planned yet": "Ainda não planeado", + "{start} to {end}": "{start} a {end}", + "The terms were not saved. Please try again.": "As condições não foram guardadas. Tente novamente.", + "Terms saved": "Condições guardadas", + "Fixed price": "Preço fixo", + "Hourly": "À hora", + "Not billed": "Não faturado", + "Commitment": "Compromisso", + "Edit cost line": "Editar linha de custo", + "Kind": "Tipo", + "Amount in euro": "Montante em euros", + "Remove": "Remover", + "Could not save the cost line. Only the project owner changes the money of a project.": "Não foi possível guardar a linha de custo. Só o proprietário do projeto altera o dinheiro de um projeto.", + "Could not remove the cost line. Please try again.": "Não foi possível remover a linha de custo. Tente novamente.", + "{amount} over budget": "{amount} acima do orçamento", + "Cost categories": "Categorias de custo", + "The categories every project splits its budget and costs into, one per line": "As categorias em que cada projeto divide o orçamento e os custos, uma por linha", + "Categories": "Categorias", + "Give at least one category, each name once.": "Indique pelo menos uma categoria, cada nome uma só vez.", + "Cost categories saved": "Categorias de custo guardadas", + "The cost categories were not saved. Please try again.": "As categorias de custo não foram guardadas. Tente novamente.", + "Finance line": "Linha financeira", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Um montante de um projeto: um orçamento, um compromisso, um custo real ou uma previsão, numa categoria de custo e opcionalmente numa fase. Registado pelo proprietário do projeto ou pelo sistema financeiro através da aplicação de integração.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "O projeto a que este montante pertence. Vazio para uma linha do sistema financeiro cujo número de projeto não corresponde a nenhum projeto.", + "The phase this amount belongs to, if any": "A fase a que este montante pertence, se houver", + "The cost category, one of the categories the admin set up": "A categoria de custo, uma das definidas pelo administrador", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Se o montante é um orçamento, um compromisso, um custo real ou uma previsão", + "Amount": "Montante", + "The amount in the reporting currency (euro)": "O montante na moeda de relato (euro)", + "The date the amount was booked or is expected": "A data em que o montante foi registado ou é esperado", + "What the amount is for": "Para que serve o montante", + "Whether a person entered the line or the finance system sent it": "Se uma pessoa registou a linha ou se o sistema financeiro a enviou", + "Entered by hand": "Registado à mão", + "Finance line id": "Id da linha financeira", + "The finance system's own id of this line. One imported line per id.": "O id próprio desta linha no sistema financeiro. Uma linha importada por id.", + "Project number": "Número do projeto", + "The project number the finance system sent, matched against the project key": "O número do projeto enviado pelo sistema financeiro, comparado com a chave do projeto", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "O portefólio do projeto da linha, copiado do projeto para que os totais do portefólio precisem de um só filtro", + "Finance readers": "Leitores financeiros", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID do Nextcloud das pessoas que podem ver este montante: o proprietário do projeto e os gestores do seu portefólio", + "Project owner": "Proprietário do projeto", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID do Nextcloud do proprietário do projeto, que pode alterar e remover linhas manuais", + "How the client pays: not billed, a fixed price, or by the hour.": "Como o cliente paga: não faturado, preço fixo ou à hora.", + "Portfolio finance": "Finanças do portefólio", + "You cannot see the money of any project in this portfolio": "Não pode ver o dinheiro de nenhum projeto deste portefólio", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "O servidor devolveu linhas de custo de projetos fora deste portefólio, por isso estes totais podem estar errados.", + "Projects left out because you cannot see their money: {count}": "Projetos deixados de fora porque não pode ver o seu dinheiro: {count}", + "Unmatched finance lines": "Linhas financeiras sem correspondência", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Orçamento, compromissos, custo real e previsão somados num portefólio.", + "Subprojects": "Subprojetos", + "{done} of {total}": "{done} de {total}", + "{done} of {total} tasks done, including subprojects": "{done} de {total} tarefas concluídas, incluindo subprojetos", + "Show the subprojects of {title}": "Mostrar os subprojetos de {title}", + "Hide the subprojects of {title}": "Ocultar os subprojetos de {title}", + "Part of": "Faz parte de", + "No parent project": "Sem projeto superior", + "A project cannot sit under one of its own subprojects.": "Um projeto não pode ficar sob um dos seus próprios subprojetos.", + "Projects nest three levels deep at most: programme, project and subproject.": "Os projetos aninham-se no máximo em três níveis: programa, projeto e subprojeto.", + "Parent project": "Projeto superior", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "O projeto sob o qual este projeto fica, como um programa. Os projetos aninham-se no máximo em três níveis.", + "Yes": "Sim", + "No": "Não", + "{label} (required)": "{label} (obrigatório)", + "{label} is required": "{label} é obrigatório", + "Project field": "Campo de projeto", + "A field an admin adds to every project, such as a policy area or a contract value.": "Um campo que um administrador acrescenta a cada projeto, como uma área de política ou um valor de contrato.", + "Key": "Chave", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "O nome fixo com que o valor é guardado, em lower camel case. Mantenha-o assim que os projetos o usem.", + "Label": "Etiqueta", + "The name people see next to the field": "O nome que as pessoas veem junto ao campo", + "What the field holds": "O que o campo contém", + "Text": "Texto", + "Number": "Número", + "Choice": "Escolha", + "Person": "Pessoa", + "Yes or no": "Sim ou não", + "Options": "Opções", + "The choices of a choice field": "As escolhas de um campo de escolha", + "Required": "Obrigatório", + "Whether a project must fill in the field": "Se um projeto tem de preencher o campo", + "Where the field appears, lowest first": "Onde o campo aparece, o menor primeiro", + "Applies to": "Aplica-se a", + "What the field is added to": "A que o campo é acrescentado", + "Custom fields": "Campos próprios", + "The values of the project fields an admin defined, keyed by the field's key.": "Os valores dos campos de projeto definidos por um administrador, pela chave do campo.", + "Project fields": "Campos de projeto", + "Related": "Relacionadas", + "Remove link": "Remover a ligação", + "Link type": "Tipo de ligação", + "Relates to": "Relaciona-se com", + "Duplicates": "Duplica", + "Project key": "Chave do projeto", + "Every task number starts with it, such as VERG-42.": "Cada número de tarefa começa por ela, por exemplo VERG-42.", + "This key is already used by another project.": "Esta chave já é usada por outro projeto.", + "Use 2 to 10 letters and digits, starting with a letter.": "Use de 2 a 10 letras e algarismos, começando por uma letra.", + "The key cannot change once tasks carry it.": "A chave não pode mudar depois de as tarefas a usarem.", + "Project saved. The existing tasks get their numbers in the background.": "Projeto guardado. As tarefas existentes recebem o seu número em segundo plano.", + "Next task number": "Número da próxima tarefa", + "The number the next task of this project gets in its key. Only the system writes it.": "O número que a próxima tarefa deste projeto recebe na sua chave. Só o sistema o escreve.", + "Restore {title}": "Restaurar {title}", + "Restore": "Restaurar", + "Project restored": "Projeto restaurado", + "Could not restore the project": "Não foi possível restaurar o projeto", + "Bring this project back to the active list.": "Devolver este projeto à lista de projetos ativos.", + "Restore project": "Restaurar projeto", + "Request reason": "Motivo do pedido", + "Why the requester needs this project. Filled in when the project is requested.": "Porque o requerente precisa deste projeto. Preenchido no pedido.", + "Reviewed by": "Revisto por", + "The user who approved or rejected the request.": "O utilizador que aprovou ou rejeitou o pedido.", + "Reviewed at": "Revisto em", + "When the request was approved or rejected.": "Quando o pedido foi aprovado ou rejeitado.", + "Review note": "Nota de revisão", + "The reviewer's reason, shown to the requester when a request is not approved.": "O motivo do revisor, mostrado ao requerente quando um pedido não é aprovado.", + "Members of these groups": "Membros destes grupos", + "Groups that may create projects": "Grupos que podem criar projetos", + "The group {group} no longer exists. Save to remove it.": "O grupo {group} já não existe. Guarde para o remover.", + "Review project request": "Rever o pedido de projeto", + "Requested by": "Pedido por", + "Why it is needed": "Porque é necessário", + "Desired start date": "Data de início pretendida", + "Why is it not approved?": "Porque não é aprovado?", + "Give a reason. The requester sees it.": "Indique um motivo. O requerente vai vê-lo.", + "Approve": "Aprovar", + "Reject": "Rejeitar", + "Reject request": "Rejeitar o pedido", + "The review was not saved. Try again.": "A revisão não foi guardada. Tente novamente.", + "This project is waiting for review": "Este projeto aguarda revisão", + "This request was not approved": "Este pedido não foi aprovado", + "Reason: {note}": "Motivo: {note}", + "Review request": "Rever o pedido", + "Request a project": "Pedir um projeto", + "Step {step} of 2": "Passo {step} de 2", + "Why is this project needed?": "Porque é necessário este projeto?", + "Give a reason. The reviewer reads it.": "Indique um motivo. O revisor vai lê-lo.", + "Back": "Voltar", + "Next": "Seguinte", + "Send request": "Enviar pedido", + "The request was not sent. Try again.": "O pedido não foi enviado. Tente novamente.", + "Requested": "Pedido", + "Not approved": "Não aprovado", + "Your request was sent": "O seu pedido foi enviado", + "Let everyone else request a project": "Permitir que todos os outros peçam um projeto", + "Add a task": "Adicionar uma tarefa", + "Delete task": "Eliminar tarefa", + "Edit task": "Editar tarefa", + "Write": "Escrever", + "Preview": "Pré-visualizar", + "Markdown works here: headings, lists and links.": "Aqui funciona Markdown: títulos, listas e ligações.", + "Could not save the task. Please try again.": "Não foi possível guardar a tarefa. Tente novamente.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "\"{title}\" tem tempo registado, por isso não pode ser eliminada. Pode cancelá-la em vez disso: os registos de tempo mantêm-se.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Eliminar \"{title}\"? As ligações a outras tarefas também são removidas. Esta ação não pode ser anulada.", + "Keep task": "Manter tarefa", + "Cancel task": "Cancelar tarefa", + "Only the reporter, the project owner or an admin can delete this task.": "Só quem a reportou, o proprietário do projeto ou um administrador pode eliminar esta tarefa.", + "Could not delete the task. Please try again.": "Não foi possível eliminar a tarefa. Tente novamente.", + "Could not cancel the task. Please try again.": "Não foi possível cancelar a tarefa. Tente novamente.", + "Responsible": "Responsável", + "Also working on this": "Também trabalham nisto", + "Labels": "Etiquetas", + "Could not change the priority. Please try again.": "Não foi possível alterar a prioridade. Tente novamente.", + "Other project members who work on this task alongside the person responsible.": "Outros membros do projeto que trabalham nesta tarefa com a pessoa responsável.", + "Duplicate": "Duplicar", + "Could not copy the task. Please try again.": "Não foi possível copiar a tarefa. Tente novamente.", + "Subtasks": "Subtarefas", + "{done} of {total} done": "{done} de {total} concluídas", + "Add a subtask": "Adicionar uma subtarefa", + "Checklist": "Lista de verificação", + "Checklist item actions": "Ações do item da lista", + "Add a checklist item": "Adicionar um item à lista", + "Subtasks: {estimate} estimated, {logged} logged": "Subtarefas: {estimate} estimado, {logged} registado", + "Total estimate: {total}": "Estimativa total: {total}", + "Part of {title}": "Parte de {title}", + "Checklist: {count} done": "Lista de verificação: {count} concluídos", + "This task has subtasks: {count}.": "Esta tarefa tem subtarefas: {count}.", + "Keep subtasks as separate tasks": "Manter as subtarefas como tarefas separadas", + "Delete subtasks too": "Eliminar também as subtarefas", + "Copy of {title}": "Cópia de {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "A tarefa foi copiada, mas não todas as suas subtarefas. Verifique a cópia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Pequenos passos dentro da tarefa. Cada item tem um id, um texto e se está concluído.", + "Open work per person and per project.": "Trabalho em aberto por pessoa e por projeto.", + "View": "Vista", + "By person": "Por pessoa", + "By project": "Por projeto", + "Hours left": "Horas restantes", + "Tasks without an estimate": "Tarefas sem estimativa", + "Due in 14 days": "Vence em 14 dias", + "Shared": "Partilhadas", + "Unassigned": "Não atribuídas", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Mostra o trabalho nos projetos que pode ver. As horas contam para a pessoa responsável; as tarefas partilhadas contam sem horas.", + "No open work in these projects.": "Não há trabalho em aberto nestes projetos.", + "Open work": "Trabalho em aberto", + "{count} open tasks": "{count} tarefas em aberto", + "Create a project to see capacity here.": "Crie um projeto para ver aqui a capacidade.", + "My tasks": "As minhas tarefas", + "Show all my tasks": "Mostrar todas as minhas tarefas", + "No tasks assigned to you": "Não tem tarefas atribuídas", + "Browse projects": "Ver projetos", + "Later": "Mais tarde", + "Due {date}": "Vence {date}", + "Could not change the status. Please try again.": "Não foi possível alterar o estado. Tente novamente.", + "Completed today": "Concluídas hoje", + "My open tasks": "As minhas tarefas em aberto", + "My overdue tasks": "As minhas tarefas em atraso", + "My tasks in progress": "As minhas tarefas em curso", + "Pin to the top": "Fixar no topo", + "Unpin": "Desafixar", + "Pinned": "Fixado", + "Actions for {title}": "Ações para {title}", + "Could not save your project order. Please try again.": "Não foi possível guardar a ordem dos seus projetos. Tente novamente.", + "No boards yet": "Ainda não há quadros", + "Create a project to get a board.": "Crie um projeto para ter um quadro.", + "Use the Projects page to create and manage your projects and tasks.": "Use a página Projetos para criar e gerir os seus projetos e tarefas.", + "Go to projects": "Ir para projetos", + "You are not a member of any projects yet.": "Ainda não é membro de nenhum projeto.", + "Could not search for users. Please try again.": "Não foi possível pesquisar utilizadores. Tente novamente.", + "Project creation is restricted to administrators.": "Só os administradores podem criar projetos.", + "Only the project owner or an administrator can delete this project.": "Só o proprietário do projeto ou um administrador pode eliminar este projeto.", + "No projects are available to you yet. Ask an administrator to create one.": "Ainda não tem projetos disponíveis. Peça a um administrador para criar um.", + "Due: {date}": "Vence: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "As tarefas com data de início ou de vencimento aparecem na cronologia. Adicione datas para as ver aqui.", + "You do not have access to this project.": "Não tem acesso a este projeto.", + "Zoom level": "Nível de zoom", + "Unscheduled": "Não planeadas", + "Start: {date}": "Início: {date}", + "Today": "Hoje", + "No scheduled tasks": "Sem tarefas planeadas", + "An unexpected error occurred.": "Ocorreu um erro inesperado.", + "Column {number} name": "Nome da coluna {number}", + "Failed to save creation policy": "Não foi possível guardar a política de criação", + "All authenticated users": "Todos os utilizadores autenticados", + "Control who may create new projects": "Controlar quem pode criar novos projetos", + "Administrators only": "Só administradores", + "Project creation": "Criação de projetos", + "Allow project creation": "Permitir a criação de projetos", + "Creation policy saved successfully": "Política de criação guardada", + "Initializing…": "A iniciar…", + "e.g. 2h 30m, 90m, 1.5h": "p. ex. 2h 30m, 90m, 1.5h", + "Log time": "Registar tempo", + "Save estimate": "Guardar estimativa", + "Logged: {logged}": "Registado: {logged}", + "over by {amount}": "excedido em {amount}", + "Time tracking": "Registo de tempo", + "Estimate": "Estimativa", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Introduza uma estimativa válida (p. ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Introduza uma duração válida (p. ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Não foi possível guardar o registo de tempo. Tente novamente.", + "Edit time entry": "Editar registo de tempo", + "Duration": "Duração", + "Date range": "Período", + "Last week": "Semana passada", + "No time logged": "Sem tempo registado", + "Log time on a task to see it here.": "Registe tempo numa tarefa para o ver aqui.", + "To date": "Até à data", + "This week": "Esta semana", + "Total: {total}": "Total: {total}", + "From date": "Desde a data", + "Custom range": "Período personalizado", + "All time": "Todo o tempo", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Não foi possível eliminar uma tarefa, por isso podem ficar dados. Elimine o projeto novamente.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Não foi possível eliminar um registo de tempo, por isso podem ficar dados. Elimine o projeto novamente.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Não foi possível eliminar uma coluna, por isso podem ficar dados. Elimine o projeto novamente.", + "Could not delete the project. Please try again.": "Não foi possível eliminar o projeto. Tente novamente.", + "Notification settings": "Definições de notificações", + "Configure when due-date reminders are sent": "Configurar quando são enviados os lembretes de prazo", + "Due-date reminder lead time (hours)": "Antecedência do lembrete de prazo (horas)", + "Lead time must be between 1 and 336 hours": "A antecedência deve estar entre 1 e 336 horas", + "Reminder lead time saved successfully": "Antecedência do lembrete guardada", + "Failed to save reminder lead time": "Não foi possível guardar a antecedência do lembrete", + "Notifications": "Notificações", + "Notify me 1 day before a task's due date": "Avisar-me 1 dia antes do prazo de uma tarefa", + "Draft": "Rascunho", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Se a aula é um rascunho que só o seu professor vê, se realiza ou está cancelada.", + "New release": "Nova versão", + "Roadmap chart. The same releases and epics are listed below.": "Gráfico do roteiro. As mesmas versões e épicos estão listados abaixo.", + "Nothing on the roadmap yet": "Ainda não há nada no roteiro", + "Releases with a target date and epics with dated tasks appear here.": "Aqui aparecem as versões com data-alvo e os épicos com tarefas datadas.", + "Releases": "Versões", + "No releases yet": "Ainda não há versões", + "Target date: {date}": "Data-alvo: {date}", + "No target date": "Sem data-alvo", + "Edit {name}": "Editar {name}", + "Mark {name} as released": "Marcar {name} como lançada", + "Mark as released": "Marcar como lançada", + "Epics": "Épicos", + "No epics yet. Open a task to make it an epic.": "Ainda não há épicos. Abra uma tarefa para a tornar um épico.", + "Not scheduled yet": "Ainda não agendado", + "Planned": "Planeada", + "Released": "Lançada", + "Edit release": "Editar versão", + "Target date": "Data-alvo", + "Could not save the release. Please try again.": "Não foi possível guardar a versão. Tente novamente.", + "Every task of this release is done or cancelled.": "Todas as tarefas desta versão estão concluídas ou canceladas.", + "Not finished yet: {count}": "Ainda por concluir: {count}", + "What happens to these tasks?": "O que acontece a estas tarefas?", + "Move to {name}": "Mover para {name}", + "Remove the release": "Remover a versão", + "Keep it on {name}": "Mantê-las em {name}", + "Could not mark the release as released. Please try again.": "Não foi possível marcar a versão como lançada. Tente novamente.", + "Roadmap": "Roteiro", + "Tasks or roadmap": "Tarefas ou roteiro", + "Release": "Versão", + "Epic": "Épico", + "This task is an epic": "Esta tarefa é um épico", + "A named, dated delivery of a project that its tasks are planned against.": "Uma entrega de um projeto com nome e data, face à qual as suas tarefas são planeadas.", + "Name of the release": "Nome da versão", + "The project this release belongs to": "O projeto a que esta versão pertence", + "What this release delivers": "O que esta versão entrega", + "When work on the release starts": "Quando começa o trabalho na versão", + "The date the release is due": "A data em que a versão deve estar pronta", + "Whether the release is planned, released or archived": "Se a versão está planeada, lançada ou arquivada", + "Released on": "Lançada em", + "When the release was marked as released": "Quando a versão foi marcada como lançada", + "The release this task is planned for": "A versão para a qual esta tarefa está planeada", + "Board view options": "Opções de vista do quadro", + "Colour cards": "Colorir cartões", + "No colour": "Sem cor", + "By label": "Por etiqueta", + "Swimlanes": "Raias", + "No swimlanes": "Sem raias", + "By assignee": "Por responsável", + "By epic": "Por épico", + "No assignee": "Sem responsável", + "No epic": "Sem épico", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Os cartões ficam na linha do seu épico. Altere o épico na página da tarefa.", + "Hand over to": "Passar a", + "Could not save your board view. It applies until you reload.": "Não foi possível guardar a vista do quadro. Aplica-se até recarregar.", + "Timetable wish": "Desejo de horário", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Um desejo que o gerador tem em conta. Respeita sempre um desejo rígido, e um flexível quando pode.", + "Whether the wish is about a teacher, a group, a room or one activity": "Se o desejo é sobre um professor, uma turma, uma sala ou uma atividade", + "Teacher": "Professor", + "Group": "Turma", + "Reference": "Referência", + "The user, group, room or activity the wish is about": "O utilizador, turma, sala ou atividade a que o desejo se refere", + "What the wish asks for": "O que o desejo pede", + "Not on these periods": "Não nestes tempos", + "Preferably not on these periods": "De preferência não nestes tempos", + "At most a number of lessons a day": "No máximo um número de aulas por dia", + "No free periods between lessons": "Sem tempos livres entre aulas", + "Always the same room": "Sempre a mesma sala", + "Periods": "Tempos", + "The periods of the week the wish is about, such as wed-5": "Os tempos da semana a que o desejo se refere, como wed-5", + "Limit": "Limite", + "The most lessons a day, for a wish of that kind": "O máximo de aulas por dia, para um desejo desse tipo", + "Strength": "Força", + "Whether the generator must keep the wish or should keep it": "Se o gerador tem de ou deve respeitar o desejo", + "Hard": "Rígido", + "Soft": "Flexível", + "Weight": "Peso", + "How much a soft wish counts, from 1 to 3": "Quanto conta um desejo flexível, de 1 a 3", + "Why the wish exists": "Porque existe o desejo", + "Timetable scenario": "Cenário de horário", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Um padrão semanal, feito pelo gerador ou tirado do horário atual. Guarda os seus dados de entrada e quanto respeita os desejos.", + "The name timetablers know the scenario by": "O nome pelo qual quem faz horários conhece o cenário", + "Whether the generator made it or it came from the current timetable": "Se foi o gerador a fazê-lo ou se vem do horário atual", + "Generated": "Gerado", + "From the current timetable": "Do horário atual", + "Week of": "Semana de", + "The Monday of the first week of the window": "A segunda-feira da primeira semana do período", + "Window start": "Início do período", + "The first day the week pattern applies to": "O primeiro dia em que o padrão semanal se aplica", + "Window end": "Fim do período", + "The last day the week pattern applies to": "O último dia em que o padrão semanal se aplica", + "Waiting, generating, done, failed, or published as draft lessons": "Em espera, a gerar, concluído, falhado ou publicado como aulas rascunho", + "Waiting": "Em espera", + "Generating": "A gerar", + "Failed": "Falhado", + "Published": "Publicado", + "Seed": "Semente", + "The number the generator starts from, so a run can be repeated": "O número com que o gerador começa, para se poder repetir uma execução", + "Input": "Entrada", + "The periods, rooms, lessons and wishes the scenario was made from": "Os tempos, salas, aulas e desejos de onde saiu o cenário", + "Placements": "Colocações", + "Each lesson with the period and room it was given": "Cada aula com o tempo e a sala que recebeu", + "Unplaced lessons": "Aulas por colocar", + "Lessons without a place, each with the hard wish that blocked it": "Aulas sem lugar, cada uma com o desejo rígido que a bloqueou", + "Broken wishes": "Desejos não cumpridos", + "The wishes this scenario breaks, with the lessons that break them": "Os desejos que este cenário não cumpre, com as aulas em causa", + "Measures": "Medidas", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Aulas colocadas, desejos não cumpridos, furos dos professores, aulas por dia e uso das salas", + "Reason": "Motivo", + "Why the run failed": "Porque falhou a execução", + "Published at": "Publicado em", + "When the scenario was written out as draft lessons": "Quando o cenário foi escrito como aulas rascunho", + "Edit wish": "Editar desejo", + "New wish": "Novo desejo", + "Hard: the generator always keeps it": "Rígido: o gerador cumpre-o sempre", + "Soft: the generator keeps it where it can": "Flexível: o gerador cumpre-o quando pode", + "Weight (1 to 3)": "Peso (1 a 3)", + "Most lessons a day": "Máximo de aulas por dia", + "Period": "Tempo", + "{day} period {number}": "{day} tempo {number}", + "Teacher (user name)": "Professor (nome de utilizador)", + "Activity (group:subject)": "Atividade (grupo:disciplina)", + "Say who or what the wish is about.": "Indique a quem ou a quê se refere o desejo.", + "Choose at least one period.": "Escolha pelo menos um tempo.", + "The limit is a whole number of 1 or more.": "O limite é um número inteiro de 1 ou mais.", + "Timetable": "Horário", + "Wishes": "Desejos", + "Timetable wishes": "Desejos de horário", + "Generator run": "Execução do gerador", + "Generator progress": "Progresso do gerador", + "The run failed: {reason}": "A execução falhou: {reason}", + "{placed} of {lessons} lessons placed": "{placed} de {lessons} aulas colocadas", + "Generate again": "Gerar novamente", + "Generate": "Gerar", + "Every lesson has a place.": "Cada aula tem um lugar.", + "Lesson": "Aula", + "No free period and room": "Sem tempo nem sala livre", + "Broken soft wishes": "Desejos flexíveis não cumpridos", + "Every soft wish is kept.": "Cada desejo flexível é cumprido.", + "Wish": "Desejo", + "Lessons": "Aulas", + "Generating: {percent}% of the time budget used": "A gerar: {percent}% do tempo usado", + "Waiting to start": "A aguardar início", + "Published as draft lessons": "Publicado como aulas em rascunho", + "Could not read the scenario.": "Não foi possível ler o cenário.", + "Could not start the run.": "Não foi possível iniciar a execução.", + "Scenarios": "Cenários", + "Timetable scenarios": "Cenários de horário", + "Scenario": "Cenário", + "Take the current timetable": "Usar o horário atual", + "Could not take the current timetable.": "Não foi possível usar o horário atual.", + "Broken hard wishes": "Desejos obrigatórios não cumpridos", + "Not on a period of the week grid": "Não está num tempo da grelha semanal", + "Compare scenarios": "Comparar cenários", + "Scenarios to compare": "Cenários a comparar", + "Choose two or three scenarios to compare them.": "Escolha dois ou três cenários para os comparar.", + "Measure": "Medida", + "Best": "Melhor", + "Lessons that differ": "Aulas que diferem", + "No lesson differs.": "Nenhuma aula difere.", + "Not placed": "Não colocada", + "{period} in {room}": "{period} em {room}", + "Lessons placed": "Aulas colocadas", + "Lessons without a place": "Aulas sem lugar", + "Clashes": "Conflitos", + "Hard wishes broken": "Desejos rígidos não cumpridos", + "Soft wishes broken": "Desejos flexíveis não cumpridos", + "Soft wishes broken, weighted": "Desejos flexíveis não cumpridos, ponderados", + "Free periods between lessons, all teachers": "Furos, todos os professores", + "Most free periods of one teacher": "Mais furos de um professor", + "Most lessons of one group on a day": "Mais aulas de um grupo num dia", + "Room use": "Ocupação das salas", + "Publish as draft lessons": "Publicar como aulas em rascunho", + "Draft lessons written: {count}": "Aulas em rascunho escritas: {count}", + "Could not publish the scenario.": "Não foi possível publicar o cenário.", + "Rules": "Regras", + "Rules for {column}": "Regras de {column}", + "When a card enters this column": "Quando um cartão entra nesta coluna", + "Action": "Ação", + "Set the priority": "Definir a prioridade", + "Assign to": "Atribuir a", + "Assign the person who moved the card": "Atribuir à pessoa que moveu o cartão", + "Remove the assignee": "Remover o responsável", + "Add a label": "Adicionar uma etiqueta", + "No longer a project member": "Já não é membro do projeto", + "This label no longer exists": "Esta etiqueta já não existe", + "Add rule": "Adicionar regra", + "Remove rule": "Remover regra", + "No rules yet. Add one to change a card when it enters this column.": "Ainda não há regras. Adicione uma para alterar um cartão quando entra nesta coluna.", + "Could not save the rules. Please try again.": "Não foi possível guardar as regras. Tente novamente.", + "1 rule runs when a card enters this column": "1 regra é executada quando um cartão entra nesta coluna", + "{count} rules run when a card enters this column": "{count} regras são executadas quando um cartão entra nesta coluna", + "Rules applied: {changes}": "Regras aplicadas: {changes}", + "assigned to {name}": "atribuído a {name}", + "assignee removed": "responsável removido", + "priority {priority}": "prioridade {priority}", + "label {label}": "etiqueta {label}", + "What happens to a card when it enters this column, applied in list order.": "O que acontece a um cartão quando entra nesta coluna, pela ordem da lista.", + "Value": "Valor", + "What the rule does to the card.": "O que a regra faz ao cartão.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "A prioridade, o id de utilizador ou o id de etiqueta que a ação usa; vazio para ações sem valor.", + "is not": "não é", + "{dimension} is not": "{dimension} não é", + "Saved filters": "Filtros guardados", + "No saved filters yet": "Ainda não há filtros guardados", + "Save filter": "Guardar filtro", + "Rename \"{name}\"": "Mudar o nome de \"{name}\"", + "Delete \"{name}\"": "Eliminar \"{name}\"", + "Clear filters": "Limpar filtros", + "Showing {shown} of {total} tasks": "A mostrar {shown} de {total} tarefas", + "Me": "Eu", + "No date": "Sem data", + "Rename saved filter": "Mudar o nome do filtro guardado", + "Share with the project": "Partilhar com o projeto", + "Give the filter a name": "Dê um nome ao filtro", + "Could not save the filter. Please try again.": "Não foi possível guardar o filtro. Tente novamente.", + "Some labels in \"{name}\" no longer exist and were left out.": "Algumas etiquetas de \"{name}\" já não existem e foram omitidas.", + "Could not delete the filter. Please try again.": "Não foi possível eliminar o filtro. Tente novamente.", + "Saved filter": "Filtro guardado", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Um filtro de quadro com nome de um projeto, privado para quem o guardou, a menos que seja partilhado com o projeto.", + "The project whose board the filter applies to": "O projeto a cujo quadro o filtro se aplica", + "The name the filter is listed under": "O nome com que o filtro aparece na lista", + "Saved by": "Guardado por", + "Nextcloud user id of the person who saved the filter": "Id de utilizador Nextcloud de quem guardou o filtro", + "Shared with the project": "Partilhado com o projeto", + "Whether every project member sees and applies the filter": "Se cada membro do projeto vê e pode aplicar o filtro", + "Criteria": "Critérios", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "O filtro: responsável, etiqueta, prioridade e prazo, cada um com é ou não é e os seus valores", + "Cross-project view": "Vista entre projetos", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Uma seleção guardada de projetos cujas tarefas são mostradas em conjunto em faixas de estado, partilhada com as pessoas que indica.", + "Shared with": "Partilhada com", + "The name the view is listed under": "O nome com que a vista é listada", + "Nextcloud user id of the person who saved the view": "Id de utilizador Nextcloud da pessoa que guardou a vista", + "Nextcloud user ids of the people the view is shared with": "Ids de utilizador Nextcloud das pessoas com quem a vista é partilhada", + "The projects whose tasks the view shows, at most twenty": "Os projetos cujas tarefas a vista mostra, no máximo vinte", + "1 project in this view is hidden from you.": "1 projeto desta vista está oculto para si.", + "{count} projects in this view are hidden from you.": "{count} projetos desta vista estão ocultos para si.", + "{project} has no column for {status}.": "{project} não tem coluna para {status}.", + "This view does not exist or is not shared with you.": "Esta vista não existe ou não foi partilhada consigo.", + "\"{task}\" moved to {status}.": "\"{task}\" movida para {status}.", + "Project: {title}": "Projeto: {title}", + "Cross-project views": "Vistas entre projetos", + "New view": "Nova vista", + "Edit view": "Editar vista", + "Delete view": "Eliminar vista", + "Give the view a name": "Dê um nome à vista", + "Pick at least one project": "Escolha pelo menos um projeto", + "A view shows at most {max} projects": "Uma vista mostra no máximo {max} projetos", + "Could not save the view. Please try again.": "Não foi possível guardar a vista. Tente novamente.", + "Could not delete the view. Please try again.": "Não foi possível eliminar a vista. Tente novamente.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Eliminar \"{title}\"? Os projetos e as suas tarefas ficam como estão.", + "People see the tasks of the projects they are in, never more.": "Cada pessoa vê as tarefas dos projetos em que está, nunca mais.", + "No views yet. A view shows the tasks of several of your projects together.": "Ainda não há vistas. Uma vista mostra em conjunto as tarefas de vários dos seus projetos.", + "Projects in view: {count}": "Projetos na vista: {count}", + "Notify me when a task is assigned to me": "Notificar-me quando uma tarefa me for atribuída", + "Also send these to me by email": "Enviar-me também estes avisos por e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Adicione um endereço de e-mail nas definições pessoais do Nextcloud para receber e-mail.", + "Code link": "Ligação de código", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Um commit, ramo, pedido de merge ou issue numa forja de código que trabalha numa tarefa.", + "The task the link belongs to": "A tarefa a que a ligação pertence", + "The project of the task": "O projeto da tarefa", + "Task key": "Chave da tarefa", + "The task key the forge text named, such as VC-12": "A chave da tarefa indicada no texto da forja, como VC-12", + "What the link points at": "Para onde aponta a ligação", + "Link": "Ligação", + "The address of the item in the forge": "O endereço do item na forja", + "The commit message, branch name or merge request title": "A mensagem do commit, o nome do ramo ou o título do pedido de merge", + "Repository": "Repositório", + "The repository, such as acme/portal": "O repositório, como acme/portal", + "Forge id": "Id na forja", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "O id próprio do item na forja, como github:acme/portal#42 ou um hash de commit", + "State": "Estado", + "The state of a merge request or issue": "O estado de um pedido de merge ou issue", + "Who made the commit or opened the merge request": "Quem fez o commit ou abriu o pedido de merge", + "When the commit was made or the merge request last changed": "Quando o commit foi feito ou o pedido de merge mudou pela última vez", + "Added by": "Adicionado por", + "Whether a person added the link or the integration wrote it": "Se uma pessoa adicionou a ligação ou a integração a escreveu", + "Nextcloud user UIDs of project members": "UIDs de utilizador Nextcloud dos membros do projeto", + "Add link": "Adicionar ligação", + "Added by hand": "Adicionado à mão", + "Branch": "Ramo", + "Code": "Código", + "Commit": "Commit", + "From the integration": "Pela integração", + "Link to a commit, branch or merge request": "Ligação a um commit, ramo ou pedido de merge", + "Merge request": "Pedido de merge", + "Merged": "Integrado", + "No code linked yet. Name {key} in a commit message or paste a link.": "Ainda não há código ligado. Indique {key} numa mensagem de commit ou cole uma ligação.", + "No code linked yet. Paste a link to a commit or merge request.": "Ainda não há código ligado. Cole uma ligação a um commit ou pedido de merge.", + "Paste a web address that starts with https://.": "Cole um endereço web que comece por https://.", + "Remove link {title}": "Remover a ligação {title}", + "The link could not be added.": "Não foi possível adicionar a ligação.", + "The link could not be removed.": "Não foi possível remover a ligação.", + "This link is already on the task.": "Esta ligação já está na tarefa.", + "Code forges": "Forjas de código", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Ligue commits e pull requests do GitHub a tarefas. O Integriq recebe os eventos; o planninq nunca chama o GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Descarregue a configuração e importe-a no Integriq. Depois preencha um segredo na regra \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "No GitHub, adicione ao repositório um webhook com este endereço e o mesmo segredo. Escolha o tipo de conteúdo application/json e os eventos push e pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Indique a chave da tarefa, como VC-12, numa mensagem de commit, num nome de ramo ou no título de uma pull request. A ligação aparece então nessa tarefa.", + "Without Integriq, project members can still paste a link on the task page.": "Sem o Integriq, os membros do projeto podem continuar a colar uma ligação na página da tarefa.", + "Download the Integriq configuration": "Descarregar a configuração do Integriq", + "Calendar": "Calendário", + "Previous": "Anterior", + "Calendar view": "Vista do calendário", + "Starts:": "Começa:", + "No tasks with a date in this month.": "Não há tarefas com data neste mês.", + "Week of {start} to {end}": "Semana de {start} a {end}", + "My calendar": "O meu calendário", + "Show as list": "Mostrar como lista", + "Show as calendar": "Mostrar como calendário", + "Open my calendar": "Abrir o meu calendário", + "Nextcloud Tasks": "Tarefas do Nextcloud", + "Show my tasks in Nextcloud Tasks": "Mostrar as minhas tarefas nas Tarefas do Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "As tarefas atribuídas a si ou partilhadas consigo aparecem numa lista \"Planninq\" nas Tarefas e no Calendário do Nextcloud. As alterações feitas aí são substituídas na próxima alteração no Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Este servidor não consegue escrever nas Tarefas do Nextcloud, por isso a exportação não está disponível.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Gerido pelo Planninq. As alterações feitas aqui são substituídas na próxima alteração no Planninq.", + "Working days and holidays": "Dias úteis e feriados", + "Dates set on the timeline skip the days that are not working days.": "As datas definidas na cronologia saltam os dias que não são úteis.", + "Working weekdays": "Dias úteis da semana", + "Non-working days": "Dias não úteis", + "No non-working days yet.": "Ainda não há dias não úteis.", + "Add day": "Adicionar dia", + "Year": "Ano", + "Add Dutch national holidays": "Adicionar feriados nacionais neerlandeses", + "Save working days": "Guardar dias úteis", + "Choose at least one working weekday.": "Escolha pelo menos um dia útil.", + "Working days saved.": "Dias úteis guardados.", + "Could not save the working days.": "Não foi possível guardar os dias úteis.", + "New Year's Day": "Dia de Ano Novo", + "Easter Sunday": "Domingo de Páscoa", + "Easter Monday": "Segunda-feira de Páscoa", + "King's Day": "Dia do Rei", + "Liberation Day": "Dia da Libertação", + "Ascension Day": "Ascensão", + "Whit Sunday": "Domingo de Pentecostes", + "Whit Monday": "Segunda-feira de Pentecostes", + "Christmas Day": "Dia de Natal", + "Boxing Day": "Segundo dia de Natal", + "Dates of {title}": "Datas de {title}", + "The due date cannot be before the start date.": "A data limite não pode ser anterior à data de início.", + "{title}, from {start} to {end}": "{title}, de {start} a {end}", + "The dates could not be saved.": "Não foi possível guardar as datas.", + "{title} now runs from {start} to {end}": "{title} decorre agora de {start} a {end}", + "Auto-scheduling": "Agendamento automático", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Quando ativo, adiar uma data limite na cronologia propõe mover também as tarefas que ela bloqueia.", + "Move blocked tasks along when a task slips": "Mover as tarefas bloqueadas quando uma tarefa atrasa", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na cronologia, uma data limite posterior propõe mover as tarefas bloqueadas. Só contam as ligações \"bloqueia\", e as tarefas só avançam para mais tarde.", + "Move the tasks that wait for {title}?": "Mover as tarefas que esperam por {title}?", + "These tasks wait for it and would start after its new due date:": "Estas tarefas esperam por ela e começariam depois da nova data limite:", + "{count} tasks would move; the first {limit} are listed.": "{count} tarefas seriam movidas; as primeiras {limit} estão listadas.", + "Now": "Agora", + "After the move": "Depois da mudança", + "Only this task": "Só esta tarefa", + "Move all": "Mover todas", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Parado em {title}: não foi possível guardar as datas. As tarefas anteriores foram movidas.", + "Cumulative flow": "Fluxo acumulado", + "Show as chart": "Mostrar como gráfico", + "Show as table": "Mostrar como tabela", + "Tasks per column per day": "Tarefas por coluna por dia", + "Tasks without recorded history in this period: {count}": "Tarefas sem histórico registado neste período: {count}", + "Lead and cycle time": "Prazo de entrega e tempo de ciclo", + "No tasks were finished in this period.": "Nenhuma tarefa foi concluída neste período.", + "Finished tasks": "Tarefas concluídas", + "Cycle time, average": "Tempo de ciclo, média", + "Cycle time, 85th percentile": "Tempo de ciclo, percentil 85", + "Lead time, average": "Prazo de entrega, média", + "Tasks whose finish time was estimated from their history: {count}": "Tarefas cuja hora de conclusão foi estimada a partir do histórico: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Tempo de ciclo de cada tarefa concluída, com a média e o percentil 85", + "Slowest tasks": "Tarefas mais lentas", + "cycle {cycle}, lead {lead}": "ciclo {cycle}, prazo {lead}", + "{days} days": "{days} dias", + "Could not load the flow of this project.": "Não foi possível carregar o fluxo deste projeto.", + "Last {days} days": "Últimos {days} dias", + "Portfolio flow": "Fluxo do portefólio", + "An admin adds portfolios under Projects, Portfolios.": "Um administrador adiciona portefólios em Projetos, Portefólios.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projetos não mostrados, porque são mostrados no máximo 50 de cada vez: {count}", + "Could not load the flow of this portfolio.": "Não foi possível carregar o fluxo deste portefólio.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Fluxo acumulado e tempo de ciclo dos projetos de um portefólio.", + "Edit report": "Editar relatório", + "Only tasks where": "Apenas tarefas em que", + "Group by": "Agrupar por", + "Display": "Apresentação", + "Share with everyone who can read its projects": "Partilhar com todos os que podem ler os seus projetos", + "The report could not be saved.": "Não foi possível guardar o relatório.", + "Number of tasks": "Número de tarefas", + "Bar": "Barras", + "Donut": "Anel", + "Table": "Tabela", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} de {total} projetos deste relatório não estão visíveis para si", + "No tasks match this report.": "Nenhuma tarefa corresponde a este relatório.", + "None": "Nenhum", + "Could not load this report.": "Não foi possível carregar este relatório.", + "Report": "Relatório", + "Your reports": "Os seus relatórios", + "My reports": "Os meus relatórios", + "Shared reports": "Relatórios partilhados", + "You have not built a report yet.": "Ainda não criou nenhum relatório.", + "Nobody has shared a report with you yet.": "Ninguém partilhou ainda um relatório consigo.", + "Reports you built over tasks, and the ones shared with you.": "Relatórios que criou sobre tarefas, e os partilhados consigo.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Uma consulta guardada sobre tarefas: que projetos, que filtros, agrupada por quê, contada ou somada, e mostrada como tabela ou gráfico.", + "The name the report is listed under": "O nome com que o relatório aparece na lista", + "What the report shows and who it is for": "O que o relatório mostra e para quem é", + "Nextcloud user id of the person who saved the report": "Id de utilizador Nextcloud de quem guardou o relatório", + "Who can open the report": "Quem pode abrir o relatório", + "Only me": "Só eu", + "Everyone who can read its projects": "Todos os que podem ler os seus projetos", + "The projects the report covers, at most fifty": "Os projetos que o relatório abrange, no máximo cinquenta", + "Filters": "Filtros", + "Task fields and the value each must equal": "Campos da tarefa e o valor a que cada um deve ser igual", + "The task field the report groups on": "O campo da tarefa pelo qual o relatório agrupa", + "Count the tasks, or add up a number on them": "Contar as tarefas, ou somar um número delas", + "Sum": "Soma", + "Sum of": "Soma de", + "The number added up when the measure is a sum": "O número somado quando a medida é uma soma", + "Story points": "Pontos de história", + "Estimated duration": "Duração estimada", + "How the report is shown": "Como o relatório é mostrado", + "Issue type": "Tipo de pedido", + "Task fields and the value each must equal; empty when the report covers every task": "Campos da tarefa e o valor que cada um deve ter; vazio se o relatório abrange todas as tarefas", + "The status a task must have": "O estado que uma tarefa deve ter", + "The priority a task must have": "A prioridade que uma tarefa deve ter", + "The user a task must be assigned to": "O utilizador a quem uma tarefa deve estar atribuída", + "A label a task must carry": "Uma etiqueta que uma tarefa deve ter", + "The board column a task must be in": "A coluna do quadro em que uma tarefa deve estar", + "The issue type a task must have": "O tipo de pedido que uma tarefa deve ter", + "Manager groups": "Grupos gestores", + "Member groups": "Grupos membros", + "Viewer groups": "Grupos leitores", + "Viewers": "Leitores", + "Owning group": "Grupo proprietário", + "Nextcloud groups whose members manage the project": "Grupos Nextcloud cujos membros gerem o projeto", + "Nextcloud groups whose members work on the project": "Grupos Nextcloud cujos membros trabalham no projeto", + "Nextcloud groups whose members may read the project": "Grupos Nextcloud cujos membros podem ler o projeto", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utilizadores Nextcloud que gerem o projeto: definições, membros e trabalho", + "Nextcloud user ids who may read the project and its work but not change it": "Utilizadores Nextcloud que podem ler o projeto e o seu trabalho sem o alterar", + "The Nextcloud group that owns the project with its creator, at most one": "O grupo Nextcloud que detém o projeto com quem o criou, no máximo um", + "Nextcloud user ids who may read this through the project": "Utilizadores Nextcloud que podem ler isto através do projeto", + "Nextcloud groups whose members may change this through the project": "Grupos Nextcloud cujos membros podem alterar isto através do projeto", + "Nextcloud groups whose members may read this through the project": "Grupos Nextcloud cujos membros podem ler isto através do projeto", + "Search for a person or a group…": "Procurar uma pessoa ou um grupo…", + "No one found. Your admin's sharing settings decide who you can find.": "Ninguém encontrado. As definições de partilha do seu administrador decidem quem pode encontrar.", + "Type at least two characters": "Escreva pelo menos dois caracteres", + "Everyone in this group": "Todos neste grupo", + "Could not search for people. Please try again.": "Não foi possível procurar pessoas. Tente novamente.", + "Could not remove the group": "Não foi possível remover o grupo", + "Only the owner and managers change who is on this project.": "Só o proprietário e os gestores mudam quem está neste projeto.", + "Role of {name}": "Função de {name}", + "Manager": "Gestor", + "Member": "Membro", + "Viewer": "Leitor", + "Could not change the role": "Não foi possível alterar a função", + "Owned by group: {name}": "Propriedade do grupo: {name}", + "No group owns this project.": "Nenhum grupo é proprietário deste projeto.", + "Owned by group": "Propriedade do grupo", + "Search for a group…": "Procurar um grupo…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nenhum grupo encontrado. As definições de partilha do seu administrador decidem que grupos pode encontrar.", + "No owning group": "Sem grupo proprietário", + "Could not search for groups. Please try again.": "Não foi possível procurar grupos. Tente novamente.", + "Could not change the owning group": "Não foi possível alterar o grupo proprietário", + "You can read this project. Only its members change it.": "Pode ler este projeto. Só os seus membros o alteram.", + "Course": "Disciplina", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "A disciplina lecionada nesta aula, como uma opção, quando a aplicação de aprendizagem da escola a conhece.", + "Online meeting link": "Ligação da aula online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Onde os alunos entram nesta aula online. O botão Entrar só aparece com uma ligação https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/pt.json b/l10n/pt.json index 37934377..e06ca66b 100644 --- a/l10n/pt.json +++ b/l10n/pt.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Projetos ativos", + "Archived projects": "Projetos arquivados", + "Boards": "Quadros", + "My projects": "Os meus projetos", + "Portfolio": "Carteira", + "Project board": "Quadro do projeto", + "Projects I am in": "Projetos em que participo", + "Timeline": "Cronologia", + "Timesheet": "Folha de horas", + "Features & roadmap": "Funcionalidades e roteiro", + "Flow": "Fluxo", + "Flows": "Fluxos", + "Reports": "Relatórios", + "Pick a report to open it.": "Escolha um relatório para o abrir.", + "In progress": "Em curso", + "Date": "Data", + "Due": "Prazo", + "Assignee": "Atribuído a", + "Who": "Quem", + "What": "O quê", + "Minutes": "Minutos", + "Entries": "Entradas", + "Most recent": "Mais recentes", + "Per person": "Por pessoa", + "By status": "Por estado", + "By priority": "Por prioridade", + "Task status": "Estado das tarefas", + "Time spent": "Tempo gasto", + "Capacity": "Capacidade", + "Due soonest": "Vencem primeiro", + "Minutes logged": "Minutos registados", + "Nothing is due": "Nada está por vencer", + "Nothing logged yet": "Ainda nada registado", + "What is open, what is blocked, and what is overdue.": "O que está aberto, o que está bloqueado e o que está atrasado.", + "How allocation is spread across the people working on projects.": "Como a alocação se distribui pelas pessoas que trabalham em projetos.", + "Hours logged, and the projects they went to.": "As horas registadas e os projetos para onde foram.", + "Billable": "Faturável", + "Budget: {amount}": "Orçamento: {amount}", + "Loading projects": "A carregar projetos", + "No projects for this client yet": "Ainda não há projetos para este cliente", + "Open in Planninq": "Abrir no Planninq", + "This project could not be found": "Este projeto não foi encontrado", + "Untitled project": "Projeto sem título", + "and {count} more": "e mais {count}", + "Store": "Loja", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instale registos, esquemas e fluxos publicados por outras organizações.", + "Work Date": "Data de trabalho", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Ações da coluna", + "Columns": "Colunas", + "Could not remove the column. Please try again.": "Não foi possível remover a coluna. Tente novamente.", + "Could not save the column. Please try again.": "Não foi possível guardar a coluna. Tente novamente.", + "Done column": "Coluna de concluído", + "Edit column": "Editar coluna", + "Keep the card's status": "Manter o estado do cartão", + "Move its cards to": "Mover os seus cartões para", + "Move left": "Mover para a esquerda", + "Move right": "Mover para a direita", + "Status of cards moved here": "Estado dos cartões movidos para aqui", + "The last done column cannot be removed.": "A última coluna de concluído não pode ser removida.", + "WIP limit": "Limite WIP", + "over limit": "acima do limite", + "The status a card gets when it is moved into this column.": "O estado que um cartão recebe quando é movido para esta coluna.", + "All priorities": "Todas as prioridades", + "Could not create the task. Please try again.": "Não foi possível criar a tarefa. Tente novamente.", + "Created": "Criada", + "Move to backlog": "Para o backlog", + "Move to board": "Para o quadro", + "New task": "Nova tarefa", + "Nothing in the backlog": "Nada no backlog", + "Rank": "Posição", + "Sort by": "Ordenar por", + "Sort by rank to reorder": "Ordene por posição para reordenar", + "Task actions": "Ações da tarefa", + "All labels": "Todas as etiquetas", + "Filter tasks by label": "Filtrar tarefas por etiqueta", + "View timeline": "Ver cronologia", + "Board": "Quadro", + "List": "Lista", + "Column": "Coluna", + "Board or list": "Quadro ou lista", + "Log": "Registo", + "Add entry": "Adicionar entrada", + "Show": "Mostrar", + "No actions yet": "Ainda não há ações", + "Closed": "Fechado", + "Entry actions": "Ações da entrada", + "Add action": "Adicionar ação", + "by {author}": "por {author}", + "saved {time}": "guardado {time}", + "Attendees: {names}": "Participantes: {names}", + "Add the first entry": "Adicionar a primeira entrada", + "Issues": "Problemas", + "Lessons learned": "Lições aprendidas", + "Meetings": "Reuniões", + "Decisions": "Decisões", + "Actions": "Ações", + "Issue": "Problema", + "Lesson learned": "Lição aprendida", + "Meeting": "Reunião", + "Decision": "Decisão", + "About this project": "Sobre este projeto", + "No description yet": "Ainda sem descrição", + "Start date": "Data de início", + "Not set": "Não definida", + "End date": "Data de fim", + "Progress": "Progresso", + "No tasks yet": "Ainda não há tarefas", + "Open the board": "Abrir o quadro", + "People": "Pessoas", + "Owner": "Proprietário", + "Latest log entries": "Entradas mais recentes", + "Open the log": "Abrir o registo", + "{done} of {total} tasks done": "{done} de {total} tarefas concluídas", + "Edit entry": "Editar entrada", + "Type": "Tipo", + "Attendees": "Participantes", + "Issue is closed": "O problema está fechado", + "Could not save the entry. Please try again.": "Não foi possível guardar a entrada. Tente novamente.", + "From: {title}": "De: {title}", + "What needs to happen": "O que tem de acontecer", + "Could not create the action. Please try again.": "Não foi possível criar a ação. Tente novamente.", + "The action was created but could not be linked to the entry.": "A ação foi criada, mas não foi possível ligá-la à entrada.", + "Project pages": "Páginas do projeto", + "Overview": "Visão geral", + "Risks": "Riscos", + "Log entry": "Entrada de registo", + "A short name for the entry": "Um nome curto para a entrada", + "Project": "Projeto", + "The project this entry belongs to": "O projeto a que esta entrada pertence", + "What kind of entry this is": "Que tipo de entrada é", + "When it happened": "Quando aconteceu", + "What happened, in Markdown": "O que aconteceu, em Markdown", + "Whether an issue is still open": "Se um problema ainda está aberto", + "The people at a meeting": "As pessoas numa reunião", + "Tasks that came out of this entry": "Tarefas que resultaram desta entrada", + "Add risk": "Adicionar risco", + "Risk": "Risco", + "Score": "Pontuação", + "Response": "Resposta", + "Review date": "Data de revisão", + "no longer on the project": "já não está no projeto", + "Edit {title}": "Editar {title}", + "No risks recorded yet": "Ainda não há riscos registados", + "Add the first risk": "Adicionar o primeiro risco", + "Medium": "Médio", + "Mitigating": "Em mitigação", + "Occurred": "Ocorreu", + "Avoid": "Evitar", + "Reduce": "Reduzir", + "Transfer": "Transferir", + "Accept": "Aceitar", + "Highest open risks": "Riscos abertos mais altos", + "No open risks": "Não há riscos abertos", + "Open the risk register": "Abrir o registo de riscos", + "Edit risk": "Editar risco", + "What could go wrong": "O que pode correr mal", + "Likelihood": "Probabilidade", + "Impact": "Impacto", + "Score {score}": "Pontuação {score}", + "Countermeasures": "Contramedidas", + "Could not save the risk. Please try again.": "Não foi possível guardar o risco. Tente novamente.", + "Risks by likelihood and impact": "Riscos por probabilidade e impacto", + "Risk scale": "Escala de risco", + "The levels every project scores its risks on, and where low turns into medium and high": "Os níveis em que cada projeto pontua os seus riscos, e onde baixo passa a médio e alto", + "Number of levels": "Número de níveis", + "Likelihood labels": "Etiquetas de probabilidade", + "Impact labels": "Etiquetas de impacto", + "Level {level}": "Nível {level}", + "Medium from score": "Médio a partir da pontuação", + "High from score": "Alto a partir da pontuação", + "Risk scale saved": "Escala de risco guardada", + "1 risk uses level {level}. Change it first.": "1 risco usa o nível {level}. Altere-o primeiro.", + "{count} risks use level {level}. Change them first.": "{count} riscos usam o nível {level}. Altere-os primeiro.", + "Every level needs a label, and high must start above medium.": "Cada nível precisa de uma etiqueta, e alto tem de começar acima de médio.", + "The project this risk belongs to": "O projeto a que este risco pertence", + "The cause and the effect, in Markdown": "A causa e o efeito, em Markdown", + "Category": "Categoria", + "A free grouping, such as planning, budget or supplier": "Um agrupamento livre, como planeamento, orçamento ou fornecedor", + "How likely it is, on the admin's risk scale": "Quão provável é, na escala de risco do administrador", + "How hard it would hit, on the admin's risk scale": "Quão forte atingiria, na escala de risco do administrador", + "Likelihood times impact, calculated by the server": "Probabilidade vezes impacto, calculado pelo servidor", + "Where the risk stands": "Em que ponto está o risco", + "The person who watches this risk": "A pessoa que acompanha este risco", + "How the project answers the risk": "Como o projeto responde ao risco", + "What is done to prevent it or soften it, in Markdown": "O que se faz para o evitar ou atenuar, em Markdown", + "When to look at this risk again": "Quando rever este risco de novo", + "Very low": "Muito baixo", + "Very high": "Muito alto", + "All projects": "Todos os projetos", + "Project status report": "Relatório de estado do projeto", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Um relatório datado sobre como um projeto está em dinheiro, organização, tempo, informação, qualidade e risco (os aspetos GROTIK), cada um com uma nota.", + "The project this report is about": "O projeto de que trata este relatório", + "Report date": "Data do relatório", + "The day the report describes": "O dia que o relatório descreve", + "Money": "Dinheiro", + "How the project stands on this aspect": "Como o projeto está neste aspeto", + "On track": "No rumo", + "At risk": "Em risco", + "Off track": "Fora do rumo", + "Money note": "Nota sobre dinheiro", + "A short explanation of this status": "Uma breve explicação deste estado", + "Organisation": "Organização", + "Organisation note": "Nota sobre organização", + "Time": "Tempo", + "Time note": "Nota sobre tempo", + "Information": "Informação", + "Information note": "Nota sobre informação", + "Quality": "Qualidade", + "Quality note": "Nota sobre qualidade", + "Risk note": "Nota sobre risco", + "Overall": "Geral", + "The worst of the six statuses, calculated by the server": "O pior dos seis estados, calculado pelo servidor", + "Health: money": "Saúde: dinheiro", + "Copied from the newest status report": "Copiado do relatório de estado mais recente", + "Health: organisation": "Saúde: organização", + "Health: time": "Saúde: tempo", + "Health: information": "Saúde: informação", + "Health: quality": "Saúde: qualidade", + "Health: risk": "Saúde: risco", + "Health: overall": "Saúde: geral", + "Health: report date": "Saúde: data do relatório", + "The date of the newest status report": "A data do relatório de estado mais recente", + "New report": "Novo relatório", + "Only the project owner writes status reports.": "Só o proprietário do projeto escreve relatórios de estado.", + "Latest report, {date}": "Último relatório, {date}", + "Aspect": "Aspeto", + "Note": "Nota", + "Report history": "Histórico de relatórios", + "Author": "Autor", + "No status reports yet": "Ainda não há relatórios de estado", + "Write the first report": "Escrever o primeiro relatório", + "Choose a status for every aspect to save the report.": "Escolha um estado para cada aspeto para guardar o relatório.", + "Suggested: on track.": "Sugestão: no rumo.", + "Suggested: at risk.": "Sugestão: em risco.", + "Suggested: off track.": "Sugestão: fora do rumo.", + "1 task is past its due date.": "1 tarefa passou do prazo.", + "{count} tasks are past their due date.": "{count} tarefas passaram do prazo.", + "The end date has passed with 1 open task.": "A data de fim passou com 1 tarefa aberta.", + "The end date has passed with {count} open tasks.": "A data de fim passou com {count} tarefas abertas.", + "No open task is past its due date.": "Nenhuma tarefa aberta passou do prazo.", + "The highest open risk, \"{title}\", scores {score}.": "O risco aberto mais alto, \"{title}\", tem pontuação {score}.", + "There are no open risks.": "Não há riscos abertos.", + "Costs are at {percent}% of the budget.": "Os custos estão em {percent}% do orçamento.", + "No suggestion: the project has no budget.": "Sem sugestão: o projeto não tem orçamento.", + "No suggestion: no costs are recorded for this project yet.": "Sem sugestão: ainda não há custos registados para este projeto.", + "The report was not saved. Only the project owner can write status reports.": "O relatório não foi guardado. Só o proprietário do projeto pode escrever relatórios de estado.", + "No report": "Sem relatório", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Um grupo de projetos geridos pelas mesmas pessoas, como um departamento ou um programa. Os seus gestores leem todos os projetos que contém.", + "The name of the portfolio": "O nome do portefólio", + "What the portfolio holds and who runs it": "O que o portefólio contém e quem o gere", + "A colour for the portfolio's section in project lists": "Uma cor para a secção do portefólio nas listas de projetos", + "Managers": "Gestores", + "Nextcloud user UIDs of the people who run the portfolio": "IDs de utilizador Nextcloud das pessoas que gerem o portefólio", + "Order": "Ordem", + "Where the portfolio comes in project lists, lowest first": "Onde o portefólio aparece nas listas de projetos, o mais baixo primeiro", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "A escala de risco própria deste portefólio em JSON, com a mesma forma da escala da aplicação. Vazio significa a escala da aplicação.", + "Portfolio readers": "Leitores do portefólio", + "Nextcloud user UIDs of the managers of the project's portfolio": "IDs de utilizador Nextcloud dos gestores do portefólio do projeto", + "The portfolio this project belongs to": "O portefólio a que este projeto pertence", + "No portfolio": "Sem portefólio", + "All portfolios": "Todos os portefólios", + "You read this project as a manager of its portfolio. Only its members change it.": "Lê este projeto como gestor do seu portefólio. Só os membros o alteram.", + "Portfolios": "Portefólios", + "Portfolio status": "Estado do portefólio", + "No portfolios yet": "Ainda não há portefólios", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Um administrador adiciona portefólios em Projetos, Portefólios. Os projetos de um portefólio aparecem aqui com o seu estado.", + "Roll-up": "Resumo", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} no rumo, {atRisk} em risco, {offTrack} fora do rumo, {noReport} sem relatório", + "No project in this portfolio that you can read.": "Nenhum projeto deste portefólio que possa ler.", + "Start": "Início", + "End": "Fim", + "Budget": "Orçamento", + "Last report": "Último relatório", + "Out of date": "Desatualizado", + "Portfolio timeline": "Cronograma do portefólio", + "Zoom": "Zoom", + "Could not load the timeline": "Não foi possível carregar o cronograma", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Um administrador adiciona portefólios em Projetos, Portefólios. Os projetos de um portefólio aparecem aqui num só cronograma.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Abra um projeto para ver as fases e tarefas. O cronograma é só de leitura.", + "Phase: {title}": "Fase: {title}", + "Left out because you cannot read them: {count} projects": "Omitidos porque não os pode ler: {count} projetos", + "Week": "Semana", + "Day": "Dia", + "Month": "Mês", + "Please try again later.": "Tente novamente mais tarde.", + "Status reports": "Relatórios de estado", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Após quantos dias o último relatório de estado de um projeto é marcado como desatualizado na vista do portefólio", + "Reporting period (days)": "Período de relatório (dias)", + "The reporting period is a whole number of days from 1 to 365.": "O período de relatório é um número inteiro de dias de 1 a 365.", + "Reporting period saved": "Período de relatório guardado", + "The reporting period was not saved. Please try again.": "O período de relatório não foi guardado. Tente novamente.", + "Every project of a portfolio with its status per aspect, rolled up.": "Cada projeto de um portefólio com o seu estado por aspeto, resumido.", + "The projects of a portfolio on one timeline.": "Os projetos de um portefólio num só cronograma.", + "Phases": "Fases", + "Add phase": "Adicionar fase", + "No phases yet": "Ainda não há fases", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Divida o projeto em fases, como iniciação, definição e execução. Uma fase fecha quando o documento de encerramento é carregado.", + "{hours} hours": "{hours} horas", + "Concluding document: {title}": "Documento de encerramento: {title}", + "Concluding document missing": "Falta o documento de encerramento", + "Move {title} up": "Subir {title}", + "Move {title} down": "Descer {title}", + "Close phase": "Fechar fase", + "Phase": "Fase", + "Files": "Ficheiros", + "Notes": "Notas", + "Audit trail": "Registo de auditoria", + "Edit phase": "Editar fase", + "Name": "Nome", + "Budget hours": "Horas orçamentadas", + "Could not save the phase. Please try again.": "Não foi possível guardar a fase. Tente novamente.", + "Close phase {title}": "Fechar a fase {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Uma fase fecha com o seu documento de encerramento: carregue-o aqui ou escolha um dos ficheiros da fase.", + "Concluding document": "Documento de encerramento", + "This phase has no files yet.": "Esta fase ainda não tem ficheiros.", + "Upload a document": "Carregar um documento", + "The document was not uploaded. Please try again.": "O documento não foi carregado. Tente novamente.", + "Upload the concluding document before you close this phase.": "Carregue o documento de encerramento antes de fechar esta fase.", + "This phase cannot be closed from its current status.": "Esta fase não pode ser fechada a partir do estado atual.", + "The phase was not closed. Please try again.": "A fase não foi fechada. Tente novamente.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "O id do ficheiro desta fase que a encerra. A fase só pode ser concluída quando estiver definido e o ficheiro anexado.", + "Import from Microsoft Project": "Importar do Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Escolha um plano guardado no Microsoft Project em formato XML. Nada é importado até confirmar.", + "Plan file": "Ficheiro do plano", + "What the import creates": "O que a importação cria", + "Tasks": "Tarefas", + "Sub-tasks": "Subtarefas", + "Milestones": "Marcos", + "Links": "Ligações", + "Already imported, updated in place: {count}": "Já importados, atualizados no local: {count}", + "What does not carry over": "O que não é transferido", + "Tasks with resources, which are not imported: {count}": "Tarefas com recursos, que não são importadas: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Tarefas abaixo do nível 3, colocadas sob a sua tarefa de nível 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Ligações que não são de fim para início, importadas como ligações relacionadas: {count}", + "Link lags, which are dropped: {count}": "Desfasamentos de ligações, que são descartados: {count}", + "Links to a summary task, which are not imported: {count}": "Ligações a uma tarefa de resumo, que não são importadas: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Ligações a tarefas fora deste plano, que não são importadas: {count}", + "No longer in the plan": "Já não está no plano", + "These stay in the project; remove them yourself if they are no longer needed.": "Ficam no projeto; remova-as você mesmo se já não forem necessárias.", + "Import": "Importar", + "Close": "Fechar", + "The plan is imported: {created} created, {updated} updated.": "O plano foi importado: {created} criados, {updated} atualizados.", + "Links that would close a loop were left out: {count}": "As ligações que fechariam um ciclo foram omitidas: {count}", + "The import stopped part-way. Run it again to finish it.": "A importação parou a meio. Execute-a de novo para a concluir.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Guarde o plano no Microsoft Project com Ficheiro, Guardar como, formato XML, e importe esse ficheiro.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Este ficheiro declara um DOCTYPE ou entidades, que não são aceites.", + "The file is larger than 10 MB.": "O ficheiro tem mais de 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "O plano tem mais de 2.000 tarefas, mais do que uma importação aceita.", + "This file is not a Microsoft Project plan in XML format.": "Este ficheiro não é um plano do Microsoft Project em formato XML.", + "Choose a file to import.": "Escolha um ficheiro para importar.", + "Only the project owner can import a plan.": "Só o proprietário do projeto pode importar um plano.", + "The plan could not be read. Please try again.": "Não foi possível ler o plano. Tente novamente.", + "Linked case: {title}": "Processo associado: {title}", + "Linked to a case": "Associado a um processo", + "Hand over to case": "Entregar ao processo", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copia sem alterações cada ficheiro do projeto e das suas tarefas, e um ficheiro que descreve o projeto, para o processo associado.", + "{date} by {user}": "{date} por {user}", + "Files copied: {count}": "Ficheiros copiados: {count}", + "Files that failed: {names}": "Ficheiros com falha: {names}", + "The handover failed. Please try again.": "A entrega falhou. Tente novamente.", + "The linked case could not be found, or you cannot open it.": "O processo associado não foi encontrado, ou não o pode abrir.", + "Case handovers": "Entregas ao processo", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Cada entrega dos ficheiros e metadados do projeto ao seu processo: quando, por quem, a que processo, cada ficheiro copiado com o seu SHA-256 e os ficheiros que falharam.", + "Finance": "Finanças", + "Add cost line": "Adicionar linha de custo", + "Delivery terms": "Condições de entrega", + "Billing model": "Modelo de faturação", + "Budget in euro": "Orçamento em euros", + "Budget in hours": "Orçamento em horas", + "Hourly rate in euro": "Taxa horária em euros", + "Planned start": "Início previsto", + "Planned end": "Fim previsto", + "Planned dates": "Datas previstas", + "Budget {amount}": "Orçamento {amount}", + "No budget agreed": "Sem orçamento acordado", + "Hours": "Horas", + "Only the project owner and the portfolio managers see the amounts.": "Só o proprietário do projeto e os gestores do portefólio veem os montantes.", + "Budget against cost per category": "Orçamento face aos custos por categoria", + "Labour (booked time)": "Mão de obra (horas registadas)", + "No category": "Sem categoria", + "Hours are not available": "As horas não estão disponíveis", + "Not yet assigned to a category": "Ainda não atribuído a uma categoria", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} gastos, {remaining} restantes", + "Budget against cost per phase": "Orçamento face aos custos por fase", + "No phase": "Sem fase", + "Cost lines": "Linhas de custo", + "From the finance system": "Do sistema financeiro", + "Edit cost line {amount}": "Editar a linha de custo {amount}", + "No cost lines yet": "Ainda não há linhas de custo", + "Commitments": "Compromissos", + "Actual cost": "Custo real", + "Forecast": "Previsão", + "Remaining": "Restante", + "Not planned yet": "Ainda não planeado", + "{start} to {end}": "{start} a {end}", + "The terms were not saved. Please try again.": "As condições não foram guardadas. Tente novamente.", + "Terms saved": "Condições guardadas", + "Fixed price": "Preço fixo", + "Hourly": "À hora", + "Not billed": "Não faturado", + "Commitment": "Compromisso", + "Edit cost line": "Editar linha de custo", + "Kind": "Tipo", + "Amount in euro": "Montante em euros", + "Remove": "Remover", + "Could not save the cost line. Only the project owner changes the money of a project.": "Não foi possível guardar a linha de custo. Só o proprietário do projeto altera o dinheiro de um projeto.", + "Could not remove the cost line. Please try again.": "Não foi possível remover a linha de custo. Tente novamente.", + "{amount} over budget": "{amount} acima do orçamento", + "Cost categories": "Categorias de custo", + "The categories every project splits its budget and costs into, one per line": "As categorias em que cada projeto divide o orçamento e os custos, uma por linha", + "Categories": "Categorias", + "Give at least one category, each name once.": "Indique pelo menos uma categoria, cada nome uma só vez.", + "Cost categories saved": "Categorias de custo guardadas", + "The cost categories were not saved. Please try again.": "As categorias de custo não foram guardadas. Tente novamente.", + "Finance line": "Linha financeira", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Um montante de um projeto: um orçamento, um compromisso, um custo real ou uma previsão, numa categoria de custo e opcionalmente numa fase. Registado pelo proprietário do projeto ou pelo sistema financeiro através da aplicação de integração.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "O projeto a que este montante pertence. Vazio para uma linha do sistema financeiro cujo número de projeto não corresponde a nenhum projeto.", + "The phase this amount belongs to, if any": "A fase a que este montante pertence, se houver", + "The cost category, one of the categories the admin set up": "A categoria de custo, uma das definidas pelo administrador", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Se o montante é um orçamento, um compromisso, um custo real ou uma previsão", + "Amount": "Montante", + "The amount in the reporting currency (euro)": "O montante na moeda de relato (euro)", + "The date the amount was booked or is expected": "A data em que o montante foi registado ou é esperado", + "What the amount is for": "Para que serve o montante", + "Whether a person entered the line or the finance system sent it": "Se uma pessoa registou a linha ou se o sistema financeiro a enviou", + "Entered by hand": "Registado à mão", + "Finance line id": "Id da linha financeira", + "The finance system's own id of this line. One imported line per id.": "O id próprio desta linha no sistema financeiro. Uma linha importada por id.", + "Project number": "Número do projeto", + "The project number the finance system sent, matched against the project key": "O número do projeto enviado pelo sistema financeiro, comparado com a chave do projeto", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "O portefólio do projeto da linha, copiado do projeto para que os totais do portefólio precisem de um só filtro", + "Finance readers": "Leitores financeiros", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID do Nextcloud das pessoas que podem ver este montante: o proprietário do projeto e os gestores do seu portefólio", + "Project owner": "Proprietário do projeto", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID do Nextcloud do proprietário do projeto, que pode alterar e remover linhas manuais", + "How the client pays: not billed, a fixed price, or by the hour.": "Como o cliente paga: não faturado, preço fixo ou à hora.", + "Portfolio finance": "Finanças do portefólio", + "You cannot see the money of any project in this portfolio": "Não pode ver o dinheiro de nenhum projeto deste portefólio", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "O servidor devolveu linhas de custo de projetos fora deste portefólio, por isso estes totais podem estar errados.", + "Projects left out because you cannot see their money: {count}": "Projetos deixados de fora porque não pode ver o seu dinheiro: {count}", + "Unmatched finance lines": "Linhas financeiras sem correspondência", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Orçamento, compromissos, custo real e previsão somados num portefólio.", + "Subprojects": "Subprojetos", + "{done} of {total}": "{done} de {total}", + "{done} of {total} tasks done, including subprojects": "{done} de {total} tarefas concluídas, incluindo subprojetos", + "Show the subprojects of {title}": "Mostrar os subprojetos de {title}", + "Hide the subprojects of {title}": "Ocultar os subprojetos de {title}", + "Part of": "Faz parte de", + "No parent project": "Sem projeto superior", + "A project cannot sit under one of its own subprojects.": "Um projeto não pode ficar sob um dos seus próprios subprojetos.", + "Projects nest three levels deep at most: programme, project and subproject.": "Os projetos aninham-se no máximo em três níveis: programa, projeto e subprojeto.", + "Parent project": "Projeto superior", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "O projeto sob o qual este projeto fica, como um programa. Os projetos aninham-se no máximo em três níveis.", + "Yes": "Sim", + "No": "Não", + "{label} (required)": "{label} (obrigatório)", + "{label} is required": "{label} é obrigatório", + "Project field": "Campo de projeto", + "A field an admin adds to every project, such as a policy area or a contract value.": "Um campo que um administrador acrescenta a cada projeto, como uma área de política ou um valor de contrato.", + "Key": "Chave", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "O nome fixo com que o valor é guardado, em lower camel case. Mantenha-o assim que os projetos o usem.", + "Label": "Etiqueta", + "The name people see next to the field": "O nome que as pessoas veem junto ao campo", + "What the field holds": "O que o campo contém", + "Text": "Texto", + "Number": "Número", + "Choice": "Escolha", + "Person": "Pessoa", + "Yes or no": "Sim ou não", + "Options": "Opções", + "The choices of a choice field": "As escolhas de um campo de escolha", + "Required": "Obrigatório", + "Whether a project must fill in the field": "Se um projeto tem de preencher o campo", + "Where the field appears, lowest first": "Onde o campo aparece, o menor primeiro", + "Applies to": "Aplica-se a", + "What the field is added to": "A que o campo é acrescentado", + "Custom fields": "Campos próprios", + "The values of the project fields an admin defined, keyed by the field's key.": "Os valores dos campos de projeto definidos por um administrador, pela chave do campo.", + "Project fields": "Campos de projeto", + "Related": "Relacionadas", + "Remove link": "Remover a ligação", + "Link type": "Tipo de ligação", + "Relates to": "Relaciona-se com", + "Duplicates": "Duplica", + "Project key": "Chave do projeto", + "Every task number starts with it, such as VERG-42.": "Cada número de tarefa começa por ela, por exemplo VERG-42.", + "This key is already used by another project.": "Esta chave já é usada por outro projeto.", + "Use 2 to 10 letters and digits, starting with a letter.": "Use de 2 a 10 letras e algarismos, começando por uma letra.", + "The key cannot change once tasks carry it.": "A chave não pode mudar depois de as tarefas a usarem.", + "Project saved. The existing tasks get their numbers in the background.": "Projeto guardado. As tarefas existentes recebem o seu número em segundo plano.", + "Next task number": "Número da próxima tarefa", + "The number the next task of this project gets in its key. Only the system writes it.": "O número que a próxima tarefa deste projeto recebe na sua chave. Só o sistema o escreve.", + "Restore {title}": "Restaurar {title}", + "Restore": "Restaurar", + "Project restored": "Projeto restaurado", + "Could not restore the project": "Não foi possível restaurar o projeto", + "Bring this project back to the active list.": "Devolver este projeto à lista de projetos ativos.", + "Restore project": "Restaurar projeto", + "Request reason": "Motivo do pedido", + "Why the requester needs this project. Filled in when the project is requested.": "Porque o requerente precisa deste projeto. Preenchido no pedido.", + "Reviewed by": "Revisto por", + "The user who approved or rejected the request.": "O utilizador que aprovou ou rejeitou o pedido.", + "Reviewed at": "Revisto em", + "When the request was approved or rejected.": "Quando o pedido foi aprovado ou rejeitado.", + "Review note": "Nota de revisão", + "The reviewer's reason, shown to the requester when a request is not approved.": "O motivo do revisor, mostrado ao requerente quando um pedido não é aprovado.", + "Members of these groups": "Membros destes grupos", + "Groups that may create projects": "Grupos que podem criar projetos", + "The group {group} no longer exists. Save to remove it.": "O grupo {group} já não existe. Guarde para o remover.", + "Review project request": "Rever o pedido de projeto", + "Requested by": "Pedido por", + "Why it is needed": "Porque é necessário", + "Desired start date": "Data de início pretendida", + "Why is it not approved?": "Porque não é aprovado?", + "Give a reason. The requester sees it.": "Indique um motivo. O requerente vai vê-lo.", + "Approve": "Aprovar", + "Reject": "Rejeitar", + "Reject request": "Rejeitar o pedido", + "The review was not saved. Try again.": "A revisão não foi guardada. Tente novamente.", + "This project is waiting for review": "Este projeto aguarda revisão", + "This request was not approved": "Este pedido não foi aprovado", + "Reason: {note}": "Motivo: {note}", + "Review request": "Rever o pedido", + "Request a project": "Pedir um projeto", + "Step {step} of 2": "Passo {step} de 2", + "Why is this project needed?": "Porque é necessário este projeto?", + "Give a reason. The reviewer reads it.": "Indique um motivo. O revisor vai lê-lo.", + "Back": "Voltar", + "Next": "Seguinte", + "Send request": "Enviar pedido", + "The request was not sent. Try again.": "O pedido não foi enviado. Tente novamente.", + "Requested": "Pedido", + "Not approved": "Não aprovado", + "Your request was sent": "O seu pedido foi enviado", + "Let everyone else request a project": "Permitir que todos os outros peçam um projeto", + "Add a task": "Adicionar uma tarefa", + "Delete task": "Eliminar tarefa", + "Edit task": "Editar tarefa", + "Write": "Escrever", + "Preview": "Pré-visualizar", + "Markdown works here: headings, lists and links.": "Aqui funciona Markdown: títulos, listas e ligações.", + "Could not save the task. Please try again.": "Não foi possível guardar a tarefa. Tente novamente.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "\"{title}\" tem tempo registado, por isso não pode ser eliminada. Pode cancelá-la em vez disso: os registos de tempo mantêm-se.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Eliminar \"{title}\"? As ligações a outras tarefas também são removidas. Esta ação não pode ser anulada.", + "Keep task": "Manter tarefa", + "Cancel task": "Cancelar tarefa", + "Only the reporter, the project owner or an admin can delete this task.": "Só quem a reportou, o proprietário do projeto ou um administrador pode eliminar esta tarefa.", + "Could not delete the task. Please try again.": "Não foi possível eliminar a tarefa. Tente novamente.", + "Could not cancel the task. Please try again.": "Não foi possível cancelar a tarefa. Tente novamente.", + "Responsible": "Responsável", + "Also working on this": "Também trabalham nisto", + "Labels": "Etiquetas", + "Could not change the priority. Please try again.": "Não foi possível alterar a prioridade. Tente novamente.", + "Other project members who work on this task alongside the person responsible.": "Outros membros do projeto que trabalham nesta tarefa com a pessoa responsável.", + "Duplicate": "Duplicar", + "Could not copy the task. Please try again.": "Não foi possível copiar a tarefa. Tente novamente.", + "Subtasks": "Subtarefas", + "{done} of {total} done": "{done} de {total} concluídas", + "Add a subtask": "Adicionar uma subtarefa", + "Checklist": "Lista de verificação", + "Checklist item actions": "Ações do item da lista", + "Add a checklist item": "Adicionar um item à lista", + "Subtasks: {estimate} estimated, {logged} logged": "Subtarefas: {estimate} estimado, {logged} registado", + "Total estimate: {total}": "Estimativa total: {total}", + "Part of {title}": "Parte de {title}", + "Checklist: {count} done": "Lista de verificação: {count} concluídos", + "This task has subtasks: {count}.": "Esta tarefa tem subtarefas: {count}.", + "Keep subtasks as separate tasks": "Manter as subtarefas como tarefas separadas", + "Delete subtasks too": "Eliminar também as subtarefas", + "Copy of {title}": "Cópia de {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "A tarefa foi copiada, mas não todas as suas subtarefas. Verifique a cópia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Pequenos passos dentro da tarefa. Cada item tem um id, um texto e se está concluído.", + "Open work per person and per project.": "Trabalho em aberto por pessoa e por projeto.", + "View": "Vista", + "By person": "Por pessoa", + "By project": "Por projeto", + "Hours left": "Horas restantes", + "Tasks without an estimate": "Tarefas sem estimativa", + "Due in 14 days": "Vence em 14 dias", + "Shared": "Partilhadas", + "Unassigned": "Não atribuídas", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Mostra o trabalho nos projetos que pode ver. As horas contam para a pessoa responsável; as tarefas partilhadas contam sem horas.", + "No open work in these projects.": "Não há trabalho em aberto nestes projetos.", + "Open work": "Trabalho em aberto", + "{count} open tasks": "{count} tarefas em aberto", + "Create a project to see capacity here.": "Crie um projeto para ver aqui a capacidade.", + "My tasks": "As minhas tarefas", + "Show all my tasks": "Mostrar todas as minhas tarefas", + "No tasks assigned to you": "Não tem tarefas atribuídas", + "Browse projects": "Ver projetos", + "Later": "Mais tarde", + "Due {date}": "Vence {date}", + "Could not change the status. Please try again.": "Não foi possível alterar o estado. Tente novamente.", + "Completed today": "Concluídas hoje", + "My open tasks": "As minhas tarefas em aberto", + "My overdue tasks": "As minhas tarefas em atraso", + "My tasks in progress": "As minhas tarefas em curso", + "Pin to the top": "Fixar no topo", + "Unpin": "Desafixar", + "Pinned": "Fixado", + "Actions for {title}": "Ações para {title}", + "Could not save your project order. Please try again.": "Não foi possível guardar a ordem dos seus projetos. Tente novamente.", + "No boards yet": "Ainda não há quadros", + "Create a project to get a board.": "Crie um projeto para ter um quadro.", + "Use the Projects page to create and manage your projects and tasks.": "Use a página Projetos para criar e gerir os seus projetos e tarefas.", + "Go to projects": "Ir para projetos", + "You are not a member of any projects yet.": "Ainda não é membro de nenhum projeto.", + "Could not search for users. Please try again.": "Não foi possível pesquisar utilizadores. Tente novamente.", + "Project creation is restricted to administrators.": "Só os administradores podem criar projetos.", + "Only the project owner or an administrator can delete this project.": "Só o proprietário do projeto ou um administrador pode eliminar este projeto.", + "No projects are available to you yet. Ask an administrator to create one.": "Ainda não tem projetos disponíveis. Peça a um administrador para criar um.", + "Due: {date}": "Vence: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "As tarefas com data de início ou de vencimento aparecem na cronologia. Adicione datas para as ver aqui.", + "You do not have access to this project.": "Não tem acesso a este projeto.", + "Zoom level": "Nível de zoom", + "Unscheduled": "Não planeadas", + "Start: {date}": "Início: {date}", + "Today": "Hoje", + "No scheduled tasks": "Sem tarefas planeadas", + "An unexpected error occurred.": "Ocorreu um erro inesperado.", + "Column {number} name": "Nome da coluna {number}", + "Failed to save creation policy": "Não foi possível guardar a política de criação", + "All authenticated users": "Todos os utilizadores autenticados", + "Control who may create new projects": "Controlar quem pode criar novos projetos", + "Administrators only": "Só administradores", + "Project creation": "Criação de projetos", + "Allow project creation": "Permitir a criação de projetos", + "Creation policy saved successfully": "Política de criação guardada", + "Initializing…": "A iniciar…", + "e.g. 2h 30m, 90m, 1.5h": "p. ex. 2h 30m, 90m, 1.5h", + "Log time": "Registar tempo", + "Save estimate": "Guardar estimativa", + "Logged: {logged}": "Registado: {logged}", + "over by {amount}": "excedido em {amount}", + "Time tracking": "Registo de tempo", + "Estimate": "Estimativa", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Introduza uma estimativa válida (p. ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Introduza uma duração válida (p. ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Não foi possível guardar o registo de tempo. Tente novamente.", + "Edit time entry": "Editar registo de tempo", + "Duration": "Duração", + "Date range": "Período", + "Last week": "Semana passada", + "No time logged": "Sem tempo registado", + "Log time on a task to see it here.": "Registe tempo numa tarefa para o ver aqui.", + "To date": "Até à data", + "This week": "Esta semana", + "Total: {total}": "Total: {total}", + "From date": "Desde a data", + "Custom range": "Período personalizado", + "All time": "Todo o tempo", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Não foi possível eliminar uma tarefa, por isso podem ficar dados. Elimine o projeto novamente.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Não foi possível eliminar um registo de tempo, por isso podem ficar dados. Elimine o projeto novamente.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Não foi possível eliminar uma coluna, por isso podem ficar dados. Elimine o projeto novamente.", + "Could not delete the project. Please try again.": "Não foi possível eliminar o projeto. Tente novamente.", + "Notification settings": "Definições de notificações", + "Configure when due-date reminders are sent": "Configurar quando são enviados os lembretes de prazo", + "Due-date reminder lead time (hours)": "Antecedência do lembrete de prazo (horas)", + "Lead time must be between 1 and 336 hours": "A antecedência deve estar entre 1 e 336 horas", + "Reminder lead time saved successfully": "Antecedência do lembrete guardada", + "Failed to save reminder lead time": "Não foi possível guardar a antecedência do lembrete", + "Notifications": "Notificações", + "Notify me 1 day before a task's due date": "Avisar-me 1 dia antes do prazo de uma tarefa", + "Draft": "Rascunho", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Se a aula é um rascunho que só o seu professor vê, se realiza ou está cancelada.", + "New release": "Nova versão", + "Roadmap chart. The same releases and epics are listed below.": "Gráfico do roteiro. As mesmas versões e épicos estão listados abaixo.", + "Nothing on the roadmap yet": "Ainda não há nada no roteiro", + "Releases with a target date and epics with dated tasks appear here.": "Aqui aparecem as versões com data-alvo e os épicos com tarefas datadas.", + "Releases": "Versões", + "No releases yet": "Ainda não há versões", + "Target date: {date}": "Data-alvo: {date}", + "No target date": "Sem data-alvo", + "Edit {name}": "Editar {name}", + "Mark {name} as released": "Marcar {name} como lançada", + "Mark as released": "Marcar como lançada", + "Epics": "Épicos", + "No epics yet. Open a task to make it an epic.": "Ainda não há épicos. Abra uma tarefa para a tornar um épico.", + "Not scheduled yet": "Ainda não agendado", + "Planned": "Planeada", + "Released": "Lançada", + "Edit release": "Editar versão", + "Target date": "Data-alvo", + "Could not save the release. Please try again.": "Não foi possível guardar a versão. Tente novamente.", + "Every task of this release is done or cancelled.": "Todas as tarefas desta versão estão concluídas ou canceladas.", + "Not finished yet: {count}": "Ainda por concluir: {count}", + "What happens to these tasks?": "O que acontece a estas tarefas?", + "Move to {name}": "Mover para {name}", + "Remove the release": "Remover a versão", + "Keep it on {name}": "Mantê-las em {name}", + "Could not mark the release as released. Please try again.": "Não foi possível marcar a versão como lançada. Tente novamente.", + "Roadmap": "Roteiro", + "Tasks or roadmap": "Tarefas ou roteiro", + "Release": "Versão", + "Epic": "Épico", + "This task is an epic": "Esta tarefa é um épico", + "A named, dated delivery of a project that its tasks are planned against.": "Uma entrega de um projeto com nome e data, face à qual as suas tarefas são planeadas.", + "Name of the release": "Nome da versão", + "The project this release belongs to": "O projeto a que esta versão pertence", + "What this release delivers": "O que esta versão entrega", + "When work on the release starts": "Quando começa o trabalho na versão", + "The date the release is due": "A data em que a versão deve estar pronta", + "Whether the release is planned, released or archived": "Se a versão está planeada, lançada ou arquivada", + "Released on": "Lançada em", + "When the release was marked as released": "Quando a versão foi marcada como lançada", + "The release this task is planned for": "A versão para a qual esta tarefa está planeada", + "Board view options": "Opções de vista do quadro", + "Colour cards": "Colorir cartões", + "No colour": "Sem cor", + "By label": "Por etiqueta", + "Swimlanes": "Raias", + "No swimlanes": "Sem raias", + "By assignee": "Por responsável", + "By epic": "Por épico", + "No assignee": "Sem responsável", + "No epic": "Sem épico", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Os cartões ficam na linha do seu épico. Altere o épico na página da tarefa.", + "Hand over to": "Passar a", + "Could not save your board view. It applies until you reload.": "Não foi possível guardar a vista do quadro. Aplica-se até recarregar.", + "Timetable wish": "Desejo de horário", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Um desejo que o gerador tem em conta. Respeita sempre um desejo rígido, e um flexível quando pode.", + "Whether the wish is about a teacher, a group, a room or one activity": "Se o desejo é sobre um professor, uma turma, uma sala ou uma atividade", + "Teacher": "Professor", + "Group": "Turma", + "Reference": "Referência", + "The user, group, room or activity the wish is about": "O utilizador, turma, sala ou atividade a que o desejo se refere", + "What the wish asks for": "O que o desejo pede", + "Not on these periods": "Não nestes tempos", + "Preferably not on these periods": "De preferência não nestes tempos", + "At most a number of lessons a day": "No máximo um número de aulas por dia", + "No free periods between lessons": "Sem tempos livres entre aulas", + "Always the same room": "Sempre a mesma sala", + "Periods": "Tempos", + "The periods of the week the wish is about, such as wed-5": "Os tempos da semana a que o desejo se refere, como wed-5", + "Limit": "Limite", + "The most lessons a day, for a wish of that kind": "O máximo de aulas por dia, para um desejo desse tipo", + "Strength": "Força", + "Whether the generator must keep the wish or should keep it": "Se o gerador tem de ou deve respeitar o desejo", + "Hard": "Rígido", + "Soft": "Flexível", + "Weight": "Peso", + "How much a soft wish counts, from 1 to 3": "Quanto conta um desejo flexível, de 1 a 3", + "Why the wish exists": "Porque existe o desejo", + "Timetable scenario": "Cenário de horário", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Um padrão semanal, feito pelo gerador ou tirado do horário atual. Guarda os seus dados de entrada e quanto respeita os desejos.", + "The name timetablers know the scenario by": "O nome pelo qual quem faz horários conhece o cenário", + "Whether the generator made it or it came from the current timetable": "Se foi o gerador a fazê-lo ou se vem do horário atual", + "Generated": "Gerado", + "From the current timetable": "Do horário atual", + "Week of": "Semana de", + "The Monday of the first week of the window": "A segunda-feira da primeira semana do período", + "Window start": "Início do período", + "The first day the week pattern applies to": "O primeiro dia em que o padrão semanal se aplica", + "Window end": "Fim do período", + "The last day the week pattern applies to": "O último dia em que o padrão semanal se aplica", + "Waiting, generating, done, failed, or published as draft lessons": "Em espera, a gerar, concluído, falhado ou publicado como aulas rascunho", + "Waiting": "Em espera", + "Generating": "A gerar", + "Failed": "Falhado", + "Published": "Publicado", + "Seed": "Semente", + "The number the generator starts from, so a run can be repeated": "O número com que o gerador começa, para se poder repetir uma execução", + "Input": "Entrada", + "The periods, rooms, lessons and wishes the scenario was made from": "Os tempos, salas, aulas e desejos de onde saiu o cenário", + "Placements": "Colocações", + "Each lesson with the period and room it was given": "Cada aula com o tempo e a sala que recebeu", + "Unplaced lessons": "Aulas por colocar", + "Lessons without a place, each with the hard wish that blocked it": "Aulas sem lugar, cada uma com o desejo rígido que a bloqueou", + "Broken wishes": "Desejos não cumpridos", + "The wishes this scenario breaks, with the lessons that break them": "Os desejos que este cenário não cumpre, com as aulas em causa", + "Measures": "Medidas", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Aulas colocadas, desejos não cumpridos, furos dos professores, aulas por dia e uso das salas", + "Reason": "Motivo", + "Why the run failed": "Porque falhou a execução", + "Published at": "Publicado em", + "When the scenario was written out as draft lessons": "Quando o cenário foi escrito como aulas rascunho", + "Edit wish": "Editar desejo", + "New wish": "Novo desejo", + "Hard: the generator always keeps it": "Rígido: o gerador cumpre-o sempre", + "Soft: the generator keeps it where it can": "Flexível: o gerador cumpre-o quando pode", + "Weight (1 to 3)": "Peso (1 a 3)", + "Most lessons a day": "Máximo de aulas por dia", + "Period": "Tempo", + "{day} period {number}": "{day} tempo {number}", + "Teacher (user name)": "Professor (nome de utilizador)", + "Activity (group:subject)": "Atividade (grupo:disciplina)", + "Say who or what the wish is about.": "Indique a quem ou a quê se refere o desejo.", + "Choose at least one period.": "Escolha pelo menos um tempo.", + "The limit is a whole number of 1 or more.": "O limite é um número inteiro de 1 ou mais.", + "Timetable": "Horário", + "Wishes": "Desejos", + "Timetable wishes": "Desejos de horário", + "Generator run": "Execução do gerador", + "Generator progress": "Progresso do gerador", + "The run failed: {reason}": "A execução falhou: {reason}", + "{placed} of {lessons} lessons placed": "{placed} de {lessons} aulas colocadas", + "Generate again": "Gerar novamente", + "Generate": "Gerar", + "Every lesson has a place.": "Cada aula tem um lugar.", + "Lesson": "Aula", + "No free period and room": "Sem tempo nem sala livre", + "Broken soft wishes": "Desejos flexíveis não cumpridos", + "Every soft wish is kept.": "Cada desejo flexível é cumprido.", + "Wish": "Desejo", + "Lessons": "Aulas", + "Generating: {percent}% of the time budget used": "A gerar: {percent}% do tempo usado", + "Waiting to start": "A aguardar início", + "Published as draft lessons": "Publicado como aulas em rascunho", + "Could not read the scenario.": "Não foi possível ler o cenário.", + "Could not start the run.": "Não foi possível iniciar a execução.", + "Scenarios": "Cenários", + "Timetable scenarios": "Cenários de horário", + "Scenario": "Cenário", + "Take the current timetable": "Usar o horário atual", + "Could not take the current timetable.": "Não foi possível usar o horário atual.", + "Broken hard wishes": "Desejos obrigatórios não cumpridos", + "Not on a period of the week grid": "Não está num tempo da grelha semanal", + "Compare scenarios": "Comparar cenários", + "Scenarios to compare": "Cenários a comparar", + "Choose two or three scenarios to compare them.": "Escolha dois ou três cenários para os comparar.", + "Measure": "Medida", + "Best": "Melhor", + "Lessons that differ": "Aulas que diferem", + "No lesson differs.": "Nenhuma aula difere.", + "Not placed": "Não colocada", + "{period} in {room}": "{period} em {room}", + "Lessons placed": "Aulas colocadas", + "Lessons without a place": "Aulas sem lugar", + "Clashes": "Conflitos", + "Hard wishes broken": "Desejos rígidos não cumpridos", + "Soft wishes broken": "Desejos flexíveis não cumpridos", + "Soft wishes broken, weighted": "Desejos flexíveis não cumpridos, ponderados", + "Free periods between lessons, all teachers": "Furos, todos os professores", + "Most free periods of one teacher": "Mais furos de um professor", + "Most lessons of one group on a day": "Mais aulas de um grupo num dia", + "Room use": "Ocupação das salas", + "Publish as draft lessons": "Publicar como aulas em rascunho", + "Draft lessons written: {count}": "Aulas em rascunho escritas: {count}", + "Could not publish the scenario.": "Não foi possível publicar o cenário.", + "Rules": "Regras", + "Rules for {column}": "Regras de {column}", + "When a card enters this column": "Quando um cartão entra nesta coluna", + "Action": "Ação", + "Set the priority": "Definir a prioridade", + "Assign to": "Atribuir a", + "Assign the person who moved the card": "Atribuir à pessoa que moveu o cartão", + "Remove the assignee": "Remover o responsável", + "Add a label": "Adicionar uma etiqueta", + "No longer a project member": "Já não é membro do projeto", + "This label no longer exists": "Esta etiqueta já não existe", + "Add rule": "Adicionar regra", + "Remove rule": "Remover regra", + "No rules yet. Add one to change a card when it enters this column.": "Ainda não há regras. Adicione uma para alterar um cartão quando entra nesta coluna.", + "Could not save the rules. Please try again.": "Não foi possível guardar as regras. Tente novamente.", + "1 rule runs when a card enters this column": "1 regra é executada quando um cartão entra nesta coluna", + "{count} rules run when a card enters this column": "{count} regras são executadas quando um cartão entra nesta coluna", + "Rules applied: {changes}": "Regras aplicadas: {changes}", + "assigned to {name}": "atribuído a {name}", + "assignee removed": "responsável removido", + "priority {priority}": "prioridade {priority}", + "label {label}": "etiqueta {label}", + "What happens to a card when it enters this column, applied in list order.": "O que acontece a um cartão quando entra nesta coluna, pela ordem da lista.", + "Value": "Valor", + "What the rule does to the card.": "O que a regra faz ao cartão.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "A prioridade, o id de utilizador ou o id de etiqueta que a ação usa; vazio para ações sem valor.", + "is not": "não é", + "{dimension} is not": "{dimension} não é", + "Saved filters": "Filtros guardados", + "No saved filters yet": "Ainda não há filtros guardados", + "Save filter": "Guardar filtro", + "Rename \"{name}\"": "Mudar o nome de \"{name}\"", + "Delete \"{name}\"": "Eliminar \"{name}\"", + "Clear filters": "Limpar filtros", + "Showing {shown} of {total} tasks": "A mostrar {shown} de {total} tarefas", + "Me": "Eu", + "No date": "Sem data", + "Rename saved filter": "Mudar o nome do filtro guardado", + "Share with the project": "Partilhar com o projeto", + "Give the filter a name": "Dê um nome ao filtro", + "Could not save the filter. Please try again.": "Não foi possível guardar o filtro. Tente novamente.", + "Some labels in \"{name}\" no longer exist and were left out.": "Algumas etiquetas de \"{name}\" já não existem e foram omitidas.", + "Could not delete the filter. Please try again.": "Não foi possível eliminar o filtro. Tente novamente.", + "Saved filter": "Filtro guardado", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Um filtro de quadro com nome de um projeto, privado para quem o guardou, a menos que seja partilhado com o projeto.", + "The project whose board the filter applies to": "O projeto a cujo quadro o filtro se aplica", + "The name the filter is listed under": "O nome com que o filtro aparece na lista", + "Saved by": "Guardado por", + "Nextcloud user id of the person who saved the filter": "Id de utilizador Nextcloud de quem guardou o filtro", + "Shared with the project": "Partilhado com o projeto", + "Whether every project member sees and applies the filter": "Se cada membro do projeto vê e pode aplicar o filtro", + "Criteria": "Critérios", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "O filtro: responsável, etiqueta, prioridade e prazo, cada um com é ou não é e os seus valores", + "Cross-project view": "Vista entre projetos", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Uma seleção guardada de projetos cujas tarefas são mostradas em conjunto em faixas de estado, partilhada com as pessoas que indica.", + "Shared with": "Partilhada com", + "The name the view is listed under": "O nome com que a vista é listada", + "Nextcloud user id of the person who saved the view": "Id de utilizador Nextcloud da pessoa que guardou a vista", + "Nextcloud user ids of the people the view is shared with": "Ids de utilizador Nextcloud das pessoas com quem a vista é partilhada", + "The projects whose tasks the view shows, at most twenty": "Os projetos cujas tarefas a vista mostra, no máximo vinte", + "1 project in this view is hidden from you.": "1 projeto desta vista está oculto para si.", + "{count} projects in this view are hidden from you.": "{count} projetos desta vista estão ocultos para si.", + "{project} has no column for {status}.": "{project} não tem coluna para {status}.", + "This view does not exist or is not shared with you.": "Esta vista não existe ou não foi partilhada consigo.", + "\"{task}\" moved to {status}.": "\"{task}\" movida para {status}.", + "Project: {title}": "Projeto: {title}", + "Cross-project views": "Vistas entre projetos", + "New view": "Nova vista", + "Edit view": "Editar vista", + "Delete view": "Eliminar vista", + "Give the view a name": "Dê um nome à vista", + "Pick at least one project": "Escolha pelo menos um projeto", + "A view shows at most {max} projects": "Uma vista mostra no máximo {max} projetos", + "Could not save the view. Please try again.": "Não foi possível guardar a vista. Tente novamente.", + "Could not delete the view. Please try again.": "Não foi possível eliminar a vista. Tente novamente.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Eliminar \"{title}\"? Os projetos e as suas tarefas ficam como estão.", + "People see the tasks of the projects they are in, never more.": "Cada pessoa vê as tarefas dos projetos em que está, nunca mais.", + "No views yet. A view shows the tasks of several of your projects together.": "Ainda não há vistas. Uma vista mostra em conjunto as tarefas de vários dos seus projetos.", + "Projects in view: {count}": "Projetos na vista: {count}", + "Notify me when a task is assigned to me": "Notificar-me quando uma tarefa me for atribuída", + "Also send these to me by email": "Enviar-me também estes avisos por e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Adicione um endereço de e-mail nas definições pessoais do Nextcloud para receber e-mail.", + "Code link": "Ligação de código", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Um commit, ramo, pedido de merge ou issue numa forja de código que trabalha numa tarefa.", + "The task the link belongs to": "A tarefa a que a ligação pertence", + "The project of the task": "O projeto da tarefa", + "Task key": "Chave da tarefa", + "The task key the forge text named, such as VC-12": "A chave da tarefa indicada no texto da forja, como VC-12", + "What the link points at": "Para onde aponta a ligação", + "Link": "Ligação", + "The address of the item in the forge": "O endereço do item na forja", + "The commit message, branch name or merge request title": "A mensagem do commit, o nome do ramo ou o título do pedido de merge", + "Repository": "Repositório", + "The repository, such as acme/portal": "O repositório, como acme/portal", + "Forge id": "Id na forja", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "O id próprio do item na forja, como github:acme/portal#42 ou um hash de commit", + "State": "Estado", + "The state of a merge request or issue": "O estado de um pedido de merge ou issue", + "Who made the commit or opened the merge request": "Quem fez o commit ou abriu o pedido de merge", + "When the commit was made or the merge request last changed": "Quando o commit foi feito ou o pedido de merge mudou pela última vez", + "Added by": "Adicionado por", + "Whether a person added the link or the integration wrote it": "Se uma pessoa adicionou a ligação ou a integração a escreveu", + "Nextcloud user UIDs of project members": "UIDs de utilizador Nextcloud dos membros do projeto", + "Add link": "Adicionar ligação", + "Added by hand": "Adicionado à mão", + "Branch": "Ramo", + "Code": "Código", + "Commit": "Commit", + "From the integration": "Pela integração", + "Link to a commit, branch or merge request": "Ligação a um commit, ramo ou pedido de merge", + "Merge request": "Pedido de merge", + "Merged": "Integrado", + "No code linked yet. Name {key} in a commit message or paste a link.": "Ainda não há código ligado. Indique {key} numa mensagem de commit ou cole uma ligação.", + "No code linked yet. Paste a link to a commit or merge request.": "Ainda não há código ligado. Cole uma ligação a um commit ou pedido de merge.", + "Paste a web address that starts with https://.": "Cole um endereço web que comece por https://.", + "Remove link {title}": "Remover a ligação {title}", + "The link could not be added.": "Não foi possível adicionar a ligação.", + "The link could not be removed.": "Não foi possível remover a ligação.", + "This link is already on the task.": "Esta ligação já está na tarefa.", + "Code forges": "Forjas de código", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Ligue commits e pull requests do GitHub a tarefas. O Integriq recebe os eventos; o planninq nunca chama o GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Descarregue a configuração e importe-a no Integriq. Depois preencha um segredo na regra \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "No GitHub, adicione ao repositório um webhook com este endereço e o mesmo segredo. Escolha o tipo de conteúdo application/json e os eventos push e pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Indique a chave da tarefa, como VC-12, numa mensagem de commit, num nome de ramo ou no título de uma pull request. A ligação aparece então nessa tarefa.", + "Without Integriq, project members can still paste a link on the task page.": "Sem o Integriq, os membros do projeto podem continuar a colar uma ligação na página da tarefa.", + "Download the Integriq configuration": "Descarregar a configuração do Integriq", + "Calendar": "Calendário", + "Previous": "Anterior", + "Calendar view": "Vista do calendário", + "Starts:": "Começa:", + "No tasks with a date in this month.": "Não há tarefas com data neste mês.", + "Week of {start} to {end}": "Semana de {start} a {end}", + "My calendar": "O meu calendário", + "Show as list": "Mostrar como lista", + "Show as calendar": "Mostrar como calendário", + "Open my calendar": "Abrir o meu calendário", + "Nextcloud Tasks": "Tarefas do Nextcloud", + "Show my tasks in Nextcloud Tasks": "Mostrar as minhas tarefas nas Tarefas do Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "As tarefas atribuídas a si ou partilhadas consigo aparecem numa lista \"Planninq\" nas Tarefas e no Calendário do Nextcloud. As alterações feitas aí são substituídas na próxima alteração no Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Este servidor não consegue escrever nas Tarefas do Nextcloud, por isso a exportação não está disponível.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Gerido pelo Planninq. As alterações feitas aqui são substituídas na próxima alteração no Planninq.", + "Working days and holidays": "Dias úteis e feriados", + "Dates set on the timeline skip the days that are not working days.": "As datas definidas na cronologia saltam os dias que não são úteis.", + "Working weekdays": "Dias úteis da semana", + "Non-working days": "Dias não úteis", + "No non-working days yet.": "Ainda não há dias não úteis.", + "Add day": "Adicionar dia", + "Year": "Ano", + "Add Dutch national holidays": "Adicionar feriados nacionais neerlandeses", + "Save working days": "Guardar dias úteis", + "Choose at least one working weekday.": "Escolha pelo menos um dia útil.", + "Working days saved.": "Dias úteis guardados.", + "Could not save the working days.": "Não foi possível guardar os dias úteis.", + "New Year's Day": "Dia de Ano Novo", + "Easter Sunday": "Domingo de Páscoa", + "Easter Monday": "Segunda-feira de Páscoa", + "King's Day": "Dia do Rei", + "Liberation Day": "Dia da Libertação", + "Ascension Day": "Ascensão", + "Whit Sunday": "Domingo de Pentecostes", + "Whit Monday": "Segunda-feira de Pentecostes", + "Christmas Day": "Dia de Natal", + "Boxing Day": "Segundo dia de Natal", + "Dates of {title}": "Datas de {title}", + "The due date cannot be before the start date.": "A data limite não pode ser anterior à data de início.", + "{title}, from {start} to {end}": "{title}, de {start} a {end}", + "The dates could not be saved.": "Não foi possível guardar as datas.", + "{title} now runs from {start} to {end}": "{title} decorre agora de {start} a {end}", + "Auto-scheduling": "Agendamento automático", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Quando ativo, adiar uma data limite na cronologia propõe mover também as tarefas que ela bloqueia.", + "Move blocked tasks along when a task slips": "Mover as tarefas bloqueadas quando uma tarefa atrasa", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na cronologia, uma data limite posterior propõe mover as tarefas bloqueadas. Só contam as ligações \"bloqueia\", e as tarefas só avançam para mais tarde.", + "Move the tasks that wait for {title}?": "Mover as tarefas que esperam por {title}?", + "These tasks wait for it and would start after its new due date:": "Estas tarefas esperam por ela e começariam depois da nova data limite:", + "{count} tasks would move; the first {limit} are listed.": "{count} tarefas seriam movidas; as primeiras {limit} estão listadas.", + "Now": "Agora", + "After the move": "Depois da mudança", + "Only this task": "Só esta tarefa", + "Move all": "Mover todas", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Parado em {title}: não foi possível guardar as datas. As tarefas anteriores foram movidas.", + "Cumulative flow": "Fluxo acumulado", + "Show as chart": "Mostrar como gráfico", + "Show as table": "Mostrar como tabela", + "Tasks per column per day": "Tarefas por coluna por dia", + "Tasks without recorded history in this period: {count}": "Tarefas sem histórico registado neste período: {count}", + "Lead and cycle time": "Prazo de entrega e tempo de ciclo", + "No tasks were finished in this period.": "Nenhuma tarefa foi concluída neste período.", + "Finished tasks": "Tarefas concluídas", + "Cycle time, average": "Tempo de ciclo, média", + "Cycle time, 85th percentile": "Tempo de ciclo, percentil 85", + "Lead time, average": "Prazo de entrega, média", + "Tasks whose finish time was estimated from their history: {count}": "Tarefas cuja hora de conclusão foi estimada a partir do histórico: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Tempo de ciclo de cada tarefa concluída, com a média e o percentil 85", + "Slowest tasks": "Tarefas mais lentas", + "cycle {cycle}, lead {lead}": "ciclo {cycle}, prazo {lead}", + "{days} days": "{days} dias", + "Could not load the flow of this project.": "Não foi possível carregar o fluxo deste projeto.", + "Last {days} days": "Últimos {days} dias", + "Portfolio flow": "Fluxo do portefólio", + "An admin adds portfolios under Projects, Portfolios.": "Um administrador adiciona portefólios em Projetos, Portefólios.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projetos não mostrados, porque são mostrados no máximo 50 de cada vez: {count}", + "Could not load the flow of this portfolio.": "Não foi possível carregar o fluxo deste portefólio.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Fluxo acumulado e tempo de ciclo dos projetos de um portefólio.", + "Edit report": "Editar relatório", + "Only tasks where": "Apenas tarefas em que", + "Group by": "Agrupar por", + "Display": "Apresentação", + "Share with everyone who can read its projects": "Partilhar com todos os que podem ler os seus projetos", + "The report could not be saved.": "Não foi possível guardar o relatório.", + "Number of tasks": "Número de tarefas", + "Bar": "Barras", + "Donut": "Anel", + "Table": "Tabela", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} de {total} projetos deste relatório não estão visíveis para si", + "No tasks match this report.": "Nenhuma tarefa corresponde a este relatório.", + "None": "Nenhum", + "Could not load this report.": "Não foi possível carregar este relatório.", + "Report": "Relatório", + "Your reports": "Os seus relatórios", + "My reports": "Os meus relatórios", + "Shared reports": "Relatórios partilhados", + "You have not built a report yet.": "Ainda não criou nenhum relatório.", + "Nobody has shared a report with you yet.": "Ninguém partilhou ainda um relatório consigo.", + "Reports you built over tasks, and the ones shared with you.": "Relatórios que criou sobre tarefas, e os partilhados consigo.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Uma consulta guardada sobre tarefas: que projetos, que filtros, agrupada por quê, contada ou somada, e mostrada como tabela ou gráfico.", + "The name the report is listed under": "O nome com que o relatório aparece na lista", + "What the report shows and who it is for": "O que o relatório mostra e para quem é", + "Nextcloud user id of the person who saved the report": "Id de utilizador Nextcloud de quem guardou o relatório", + "Who can open the report": "Quem pode abrir o relatório", + "Only me": "Só eu", + "Everyone who can read its projects": "Todos os que podem ler os seus projetos", + "The projects the report covers, at most fifty": "Os projetos que o relatório abrange, no máximo cinquenta", + "Filters": "Filtros", + "Task fields and the value each must equal": "Campos da tarefa e o valor a que cada um deve ser igual", + "The task field the report groups on": "O campo da tarefa pelo qual o relatório agrupa", + "Count the tasks, or add up a number on them": "Contar as tarefas, ou somar um número delas", + "Sum": "Soma", + "Sum of": "Soma de", + "The number added up when the measure is a sum": "O número somado quando a medida é uma soma", + "Story points": "Pontos de história", + "Estimated duration": "Duração estimada", + "How the report is shown": "Como o relatório é mostrado", + "Issue type": "Tipo de pedido", + "Task fields and the value each must equal; empty when the report covers every task": "Campos da tarefa e o valor que cada um deve ter; vazio se o relatório abrange todas as tarefas", + "The status a task must have": "O estado que uma tarefa deve ter", + "The priority a task must have": "A prioridade que uma tarefa deve ter", + "The user a task must be assigned to": "O utilizador a quem uma tarefa deve estar atribuída", + "A label a task must carry": "Uma etiqueta que uma tarefa deve ter", + "The board column a task must be in": "A coluna do quadro em que uma tarefa deve estar", + "The issue type a task must have": "O tipo de pedido que uma tarefa deve ter", + "Manager groups": "Grupos gestores", + "Member groups": "Grupos membros", + "Viewer groups": "Grupos leitores", + "Viewers": "Leitores", + "Owning group": "Grupo proprietário", + "Nextcloud groups whose members manage the project": "Grupos Nextcloud cujos membros gerem o projeto", + "Nextcloud groups whose members work on the project": "Grupos Nextcloud cujos membros trabalham no projeto", + "Nextcloud groups whose members may read the project": "Grupos Nextcloud cujos membros podem ler o projeto", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utilizadores Nextcloud que gerem o projeto: definições, membros e trabalho", + "Nextcloud user ids who may read the project and its work but not change it": "Utilizadores Nextcloud que podem ler o projeto e o seu trabalho sem o alterar", + "The Nextcloud group that owns the project with its creator, at most one": "O grupo Nextcloud que detém o projeto com quem o criou, no máximo um", + "Nextcloud user ids who may read this through the project": "Utilizadores Nextcloud que podem ler isto através do projeto", + "Nextcloud groups whose members may change this through the project": "Grupos Nextcloud cujos membros podem alterar isto através do projeto", + "Nextcloud groups whose members may read this through the project": "Grupos Nextcloud cujos membros podem ler isto através do projeto", + "Search for a person or a group…": "Procurar uma pessoa ou um grupo…", + "No one found. Your admin's sharing settings decide who you can find.": "Ninguém encontrado. As definições de partilha do seu administrador decidem quem pode encontrar.", + "Type at least two characters": "Escreva pelo menos dois caracteres", + "Everyone in this group": "Todos neste grupo", + "Could not search for people. Please try again.": "Não foi possível procurar pessoas. Tente novamente.", + "Could not remove the group": "Não foi possível remover o grupo", + "Only the owner and managers change who is on this project.": "Só o proprietário e os gestores mudam quem está neste projeto.", + "Role of {name}": "Função de {name}", + "Manager": "Gestor", + "Member": "Membro", + "Viewer": "Leitor", + "Could not change the role": "Não foi possível alterar a função", + "Owned by group: {name}": "Propriedade do grupo: {name}", + "No group owns this project.": "Nenhum grupo é proprietário deste projeto.", + "Owned by group": "Propriedade do grupo", + "Search for a group…": "Procurar um grupo…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nenhum grupo encontrado. As definições de partilha do seu administrador decidem que grupos pode encontrar.", + "No owning group": "Sem grupo proprietário", + "Could not search for groups. Please try again.": "Não foi possível procurar grupos. Tente novamente.", + "Could not change the owning group": "Não foi possível alterar o grupo proprietário", + "You can read this project. Only its members change it.": "Pode ler este projeto. Só os seus membros o alteram.", + "Course": "Disciplina", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "A disciplina lecionada nesta aula, como uma opção, quando a aplicação de aprendizagem da escola a conhece.", + "Online meeting link": "Ligação da aula online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Onde os alunos entram nesta aula online. O botão Entrar só aparece com uma ligação https." }, "plurals": {} } diff --git a/l10n/rm.js b/l10n/rm.js index d154ffc1..5c50e571 100644 --- a/l10n/rm.js +++ b/l10n/rm.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Projects activs", + "Archived projects": "Projects archivads", + "Boards": "Tavlas", + "My projects": "Mes projects", + "Portfolio": "Portfolio", + "Project board": "Tavla dal project", + "Projects I am in": "Projects en ils quals jau sun involvà", + "Timeline": "Lingia dal temp", + "Timesheet": "Register da temp", + "Features & roadmap": "Funcziuns e plan da svilup", + "Flow": "Flux", + "Flows": "Fluxs", + "Reports": "Rapports", + "Pick a report to open it.": "Tscherni in rapport per l'avrir.", + "In progress": "En lavur", + "Date": "Data", + "Due": "Termin", + "Assignee": "Attribuì a", + "Who": "Tgi", + "What": "Tge", + "Minutes": "Minutas", + "Entries": "Endataziuns", + "Most recent": "Ils pli novs", + "Per person": "Per persuna", + "By status": "Tenor il status", + "By priority": "Tenor la prioritad", + "Task status": "Status dals incumbens", + "Time spent": "Temp duvrà", + "Capacity": "Capacitad", + "Due soonest": "Termin pli datier", + "Minutes logged": "Minutas registradas", + "Nothing is due": "Nagut n'è da terminar", + "Nothing logged yet": "Anc nagut registrà", + "What is open, what is blocked, and what is overdue.": "Tge ch'è avert, tge ch'è bloccà e tge ch'è memia tard.", + "How allocation is spread across the people working on projects.": "Co che la chargia è repartida tranter las persunas che lavuran a projects.", + "Hours logged, and the projects they went to.": "Las uras registradas ed ils projects vi dals quals ellas èn ìdas.", + "Billable": "Facturabel", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Chargiar ils projects", + "No projects for this client yet": "Anc nagins projects per quest client", + "Open in Planninq": "Avrir en Planninq", + "This project could not be found": "Quest project n'è betg vegnì chattà", + "Untitled project": "Project senza titel", + "and {count} more": "e {count} dapli", + "Store": "Butia", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installescha registers, schemas e process ch'autras organisaziuns han publitgà.", + "Work Date": "Data da lavur", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Acziuns da la colonna", + "Columns": "Colonnas", + "Could not remove the column. Please try again.": "La colonna n'ha betg pudì vegnir allontanada. Empruvai anc ina giada.", + "Could not save the column. Please try again.": "La colonna n'ha betg pudì vegnir memorisada. Empruvai anc ina giada.", + "Done column": "Colonna terminà", + "Edit column": "Modifitgar la colonna", + "Keep the card's status": "Mantegnair il status da la carta", + "Move its cards to": "Spustar sias cartas en", + "Move left": "Spustar a sanestra", + "Move right": "Spustar a dretga", + "Status of cards moved here": "Status da las cartas spustadas qua", + "The last done column cannot be removed.": "L'ultima colonna terminà na po betg vegnir allontanada.", + "WIP limit": "Limita WIP", + "over limit": "sur la limita", + "The status a card gets when it is moved into this column.": "Il status che ina carta survegn cura ch'ella vegn spustada en questa colonna.", + "All priorities": "Tut las prioritads", + "Could not create the task. Please try again.": "L'incumbensa n'ha betg pudì vegnir creada. Empruvai anc ina giada.", + "Created": "Creà", + "Move to backlog": "En il backlog", + "Move to board": "Sin la tavla", + "New task": "Nova incumbensa", + "Nothing in the backlog": "Nagut en il backlog", + "Rank": "Rang", + "Sort by": "Zavrar tenor", + "Sort by rank to reorder": "Zavrai tenor rang per midar la successiun", + "Task actions": "Acziuns da l'incumbensa", + "All labels": "Tut las etichettas", + "Filter tasks by label": "Filtrar las incumbensas tenor etichetta", + "View timeline": "Mussar la cronologia", + "Board": "Tavla", + "List": "Glista", + "Column": "Colonna", + "Board or list": "Tavla u glista", + "Log": "Protocol", + "Add entry": "Agiuntar ina inscripziun", + "Show": "Mussar", + "No actions yet": "Anc naginas acziuns", + "Closed": "Serrà", + "Entry actions": "Acziuns da l'inscripziun", + "Add action": "Agiuntar ina acziun", + "by {author}": "da {author}", + "saved {time}": "memorisà {time}", + "Attendees: {names}": "Participants: {names}", + "Add the first entry": "Agiuntar l'emprima inscripziun", + "Issues": "Problems", + "Lessons learned": "Enconuschientschas", + "Meetings": "Sesidas", + "Decisions": "Decisiuns", + "Actions": "Acziuns", + "Issue": "Problem", + "Lesson learned": "Enconuschientscha", + "Meeting": "Sesida", + "Decision": "Decisiun", + "About this project": "Davart quest project", + "No description yet": "Anc nagina descripziun", + "Start date": "Data da cumenzament", + "Not set": "Betg definì", + "End date": "Data da fin", + "Progress": "Progress", + "No tasks yet": "Anc naginas incumbensas", + "Open the board": "Avrir la tavla", + "People": "Persunas", + "Owner": "Possessur", + "Latest log entries": "Ultimas inscripziuns", + "Open the log": "Avrir il protocol", + "{done} of {total} tasks done": "{done} da {total} incumbensas terminadas", + "Edit entry": "Modifitgar l'inscripziun", + "Type": "Gener", + "Attendees": "Participants", + "Issue is closed": "Il problem è serrà", + "Could not save the entry. Please try again.": "L'inscripziun n'ha betg pudì vegnir memorisada. Empruvai anc ina giada.", + "From: {title}": "Da: {title}", + "What needs to happen": "Tge che sto succeder", + "Could not create the action. Please try again.": "L'acziun n'ha betg pudì vegnir creada. Empruvai anc ina giada.", + "The action was created but could not be linked to the entry.": "L'acziun è vegnida creada, ma n'ha betg pudì vegnir colliada cun l'inscripziun.", + "Project pages": "Paginas dal project", + "Overview": "Survista", + "Risks": "Ristgs", + "Log entry": "Inscripziun dal protocol", + "A short name for the entry": "In num curt per l'inscripziun", + "Project": "Project", + "The project this entry belongs to": "Il project al qual l'inscripziun appartegna", + "What kind of entry this is": "Tge gener d'inscripziun che quai è", + "When it happened": "Cura che quai è capità", + "What happened, in Markdown": "Tge ch'è capità, en Markdown", + "Whether an issue is still open": "Sch'in problem è anc avert", + "The people at a meeting": "Las persunas ad ina sesida", + "Tasks that came out of this entry": "Incumbensas ch'èn resultadas da questa inscripziun", + "Add risk": "Agiuntar in ristg", + "Risk": "Ristg", + "Score": "Puncts", + "Response": "Reacziun", + "Review date": "Data da revisiun", + "no longer on the project": "betg pli en il project", + "Edit {title}": "Modifitgar {title}", + "No risks recorded yet": "Anc nagins ristgs registrads", + "Add the first risk": "Agiuntar l'emprim ristg", + "Medium": "Mesaun", + "Mitigating": "Vegn mitigà", + "Occurred": "Succedì", + "Avoid": "Evitar", + "Reduce": "Reducir", + "Transfer": "Transferir", + "Accept": "Acceptar", + "Highest open risks": "Ils pli auts ristgs averts", + "No open risks": "Nagins ristgs averts", + "Open the risk register": "Avrir il register da ristgs", + "Edit risk": "Modifitgar il ristg", + "What could go wrong": "Tge che pudess ir mal", + "Likelihood": "Probabilitad", + "Impact": "Effect", + "Score {score}": "Puncts {score}", + "Countermeasures": "Contramesiras", + "Could not save the risk. Please try again.": "Il ristg n'ha betg pudì vegnir memorisà. Empruvai anc ina giada.", + "Risks by likelihood and impact": "Ristgs tenor probabilitad ed effect", + "Risk scale": "Scala da ristg", + "The levels every project scores its risks on, and where low turns into medium and high": "Ils nivels sin ils quals mintga project valitescha ses ristgs, e nua che bass daventa mesaun ed aut", + "Number of levels": "Dumber da nivels", + "Likelihood labels": "Etichettas da probabilitad", + "Impact labels": "Etichettas d'effect", + "Level {level}": "Nivel {level}", + "Medium from score": "Mesaun a partir dals puncts", + "High from score": "Aut a partir dals puncts", + "Risk scale saved": "Scala da ristg memorisada", + "1 risk uses level {level}. Change it first.": "1 ristg dovra il nivel {level}. Midai el l'emprim.", + "{count} risks use level {level}. Change them first.": "{count} ristgs dovran il nivel {level}. Midai els l'emprim.", + "Every level needs a label, and high must start above medium.": "Mintga nivel dovra ina etichetta, ed aut sto cumenzar sur mesaun.", + "The project this risk belongs to": "Il project al qual quest ristg appartegna", + "The cause and the effect, in Markdown": "La chaschun e l'effect, en Markdown", + "Category": "Categoria", + "A free grouping, such as planning, budget or supplier": "Ina gruppaziun libra, sco planisaziun, budget u furnitur", + "How likely it is, on the admin's risk scale": "Co probabel ch'el è, sin la scala da ristg da l'administratur", + "How hard it would hit, on the admin's risk scale": "Co ferm ch'el pertutgass, sin la scala da ristg da l'administratur", + "Likelihood times impact, calculated by the server": "Probabilitad giada effect, calculà dal server", + "Where the risk stands": "Nua ch'il ristg stat", + "The person who watches this risk": "La persuna che surveglia quest ristg", + "How the project answers the risk": "Co ch'il project reagescha sin il ristg", + "What is done to prevent it or soften it, in Markdown": "Tge che vegn fatg per al impedir u mitigiar, en Markdown", + "When to look at this risk again": "Cura revair danovamain quest ristg", + "Very low": "Fitg bass", + "Very high": "Fitg aut", + "All projects": "Tut ils projects", + "Project status report": "Rapport da status dal project", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "In rapport datà davart co in project stat cun daners, organisaziun, temp, infurmaziun, qualitad e ristg (ils aspects GROTIK), mintgin cun ina notizia.", + "The project this report is about": "Il project dal qual il rapport tracta", + "Report date": "Data dal rapport", + "The day the report describes": "Il di che il rapport descriva", + "Money": "Daners", + "How the project stands on this aspect": "Co il project stat en quest aspect", + "On track": "Tenor plan", + "At risk": "En privel", + "Off track": "Ordaifer il plan", + "Money note": "Notizia davart ils daners", + "A short explanation of this status": "Ina curta explicaziun da quest status", + "Organisation": "Organisaziun", + "Organisation note": "Notizia davart l'organisaziun", + "Time": "Temp", + "Time note": "Notizia davart il temp", + "Information": "Infurmaziun", + "Information note": "Notizia davart l'infurmaziun", + "Quality": "Qualitad", + "Quality note": "Notizia davart la qualitad", + "Risk note": "Notizia davart il ristg", + "Overall": "Total", + "The worst of the six statuses, calculated by the server": "Il mender dals sis status, calculà dal server", + "Health: money": "Sanadad: daners", + "Copied from the newest status report": "Copià dal rapport da status il pli nov", + "Health: organisation": "Sanadad: organisaziun", + "Health: time": "Sanadad: temp", + "Health: information": "Sanadad: infurmaziun", + "Health: quality": "Sanadad: qualitad", + "Health: risk": "Sanadad: ristg", + "Health: overall": "Sanadad: total", + "Health: report date": "Sanadad: data dal rapport", + "The date of the newest status report": "La data dal rapport da status il pli nov", + "New report": "Nov rapport", + "Only the project owner writes status reports.": "Mo il possessur dal project scriva rapports da status.", + "Latest report, {date}": "Ultim rapport, {date}", + "Aspect": "Aspect", + "Note": "Notizia", + "Report history": "Istorgia dals rapports", + "Author": "Autur", + "No status reports yet": "Anc nagins rapports da status", + "Write the first report": "Scriver l'emprim rapport", + "Choose a status for every aspect to save the report.": "Tscherna in status per mintga aspect per memorisar il rapport.", + "Suggested: on track.": "Proposta: tenor plan.", + "Suggested: at risk.": "Proposta: en privel.", + "Suggested: off track.": "Proposta: ordaifer il plan.", + "1 task is past its due date.": "1 incumbensa ha surpassà il termin.", + "{count} tasks are past their due date.": "Incumbensas che han surpassà il termin: {count}.", + "The end date has passed with 1 open task.": "La data da fin è passada cun 1 incumbensa averta.", + "The end date has passed with {count} open tasks.": "La data da fin è passada, incumbensas avertas: {count}.", + "No open task is past its due date.": "Nagina incumbensa averta n'ha surpassà il termin.", + "The highest open risk, \"{title}\", scores {score}.": "Il pli aut ristg avert, \"{title}\", ha la valur {score}.", + "There are no open risks.": "I na dat nagins ristgs averts.", + "Costs are at {percent}% of the budget.": "Ils custs èn tar {percent}% dal budget.", + "No suggestion: the project has no budget.": "Nagina proposta: il project n'ha nagin budget.", + "No suggestion: no costs are recorded for this project yet.": "Nagina proposta: per quest project n'èn anc nagins custs registrads.", + "The report was not saved. Only the project owner can write status reports.": "Il rapport n'è betg vegnì memorisà. Mo il possessur dal project po scriver rapports da status.", + "No report": "Nagin rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Ina gruppa da projects manads da las medemas persunas, per exempel in departament u in program. Ses responsabels legian mintga project en ella.", + "The name of the portfolio": "Il num dal portfolio", + "What the portfolio holds and who runs it": "Tge ch'il portfolio cuntegna e tgi ch'al maina", + "A colour for the portfolio's section in project lists": "Ina colur per la secziun dal portfolio en glistas da projects", + "Managers": "Responsabels", + "Nextcloud user UIDs of the people who run the portfolio": "IDs d'utilisaders Nextcloud da las persunas che mainan il portfolio", + "Order": "Urden", + "Where the portfolio comes in project lists, lowest first": "Nua ch'il portfolio stat en glistas da projects, il pli bass l'emprim", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "L'atgna scala da ristgs da quest portfolio sco JSON, en la medema furma sco quella da l'entira app. Vid significa la scala da l'app.", + "Portfolio readers": "Lecturs dal portfolio", + "Nextcloud user UIDs of the managers of the project's portfolio": "IDs d'utilisaders Nextcloud dals responsabels dal portfolio dal project", + "The portfolio this project belongs to": "Il portfolio al qual quest project appartegna", + "No portfolio": "Nagin portfolio", + "All portfolios": "Tut ils portfolios", + "You read this project as a manager of its portfolio. Only its members change it.": "Vus legis quest project sco responsabel da ses portfolio. Mo ses commembers al midan.", + "Portfolios": "Portfolios", + "Portfolio status": "Status dal portfolio", + "No portfolios yet": "Anc nagins portfolios", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "In administratur agiunta portfolios sut Projects, Portfolios. Ils projects d'in portfolio èn enumerads qua cun lur status.", + "Roll-up": "Resumaziun", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} tenor plan, {atRisk} en privel, {offTrack} ordaifer il plan, {noReport} senza rapport", + "No project in this portfolio that you can read.": "Nagin project en quest portfolio che ti pos leger.", + "Start": "Entschatta", + "End": "Fin", + "Budget": "Budget", + "Last report": "Ultim rapport", + "Out of date": "Antiquà", + "Portfolio timeline": "Lingia da temp dal portfolio", + "Zoom": "Zoom", + "Could not load the timeline": "Impussibel da chargiar la lingia da temp", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "In administratur agiunta portfolios sut Projects, Portfolios. Ils projects d'in portfolio èn mussads qua sin ina lingia da temp.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Avra in project per vesair sias fasas e lezias. La lingia da temp è mo per leger.", + "Phase: {title}": "Fasa: {title}", + "Left out because you cannot read them: {count} projects": "Laschads davent perquai che ti na pos betg als leger: {count} projects", + "Week": "Emna", + "Day": "Di", + "Month": "Mais", + "Please try again later.": "Emprova pli tard anc ina giada.", + "Status reports": "Rapports da status", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Suenter quants dis ch'il davos rapport da status d'in project vegn marcà sco antiquà en la survista dal portfolio", + "Reporting period (days)": "Perioda da rapport (dis)", + "The reporting period is a whole number of days from 1 to 365.": "La perioda da rapport è in dumber entir da dis da 1 fin 365.", + "Reporting period saved": "Perioda da rapport memorisada", + "The reporting period was not saved. Please try again.": "La perioda da rapport n'è betg vegnida memorisada. Emprova anc ina giada.", + "Every project of a portfolio with its status per aspect, rolled up.": "Mintga project d'in portfolio cun ses status per aspect, resumà.", + "The projects of a portfolio on one timeline.": "Ils projects d'in portfolio sin ina lingia da temp.", + "Phases": "Fasas", + "Add phase": "Agiuntar ina fasa", + "No phases yet": "Anc naginas fasas", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Parta il project en fasas, sco iniziaziun, definiziun e realisaziun. Ina fasa vegn serrada uschespert che ses document da conclusiun è chargià si.", + "{hours} hours": "{hours} uras", + "Concluding document: {title}": "Document da conclusiun: {title}", + "Concluding document missing": "Document da conclusiun manca", + "Move {title} up": "Spustar {title} ensi", + "Move {title} down": "Spustar {title} engiu", + "Close phase": "Serrar la fasa", + "Phase": "Fasa", + "Files": "Datotecas", + "Notes": "Notizias", + "Audit trail": "Protocol da revisiun", + "Edit phase": "Modifitgar la fasa", + "Name": "Num", + "Budget hours": "Uras budgetadas", + "Could not save the phase. Please try again.": "Impussibel da memorisar la fasa. Emprova anc ina giada.", + "Close phase {title}": "Serrar la fasa {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Ina fasa vegn serrada cun ses document da conclusiun: chargia el si qua u tscherna ina da las datotecas da la fasa.", + "Concluding document": "Document da conclusiun", + "This phase has no files yet.": "Questa fasa n'ha anc naginas datotecas.", + "Upload a document": "Chargiar si in document", + "The document was not uploaded. Please try again.": "Il document n'è betg vegnì chargià si. Emprova anc ina giada.", + "Upload the concluding document before you close this phase.": "Chargia si il document da conclusiun avant che serrar questa fasa.", + "This phase cannot be closed from its current status.": "Questa fasa na po betg vegnir serrada da ses status actual.", + "The phase was not closed. Please try again.": "La fasa n'è betg vegnida serrada. Emprova anc ina giada.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "L'ID da la datoteca da questa fasa che la conclusiuna. La fasa po vegnir terminada pir cura ch'el è inditgà e la datoteca agiuntada.", + "Import from Microsoft Project": "Importar da Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Tscherni in plan memorisà da Microsoft Project en il format XML. Nagut na vegn importà avant che Vus confermais.", + "Plan file": "Datoteca dal plan", + "What the import creates": "Tge che l'import creescha", + "Tasks": "Incumbensas", + "Sub-tasks": "Sutincumbensas", + "Milestones": "Tappas", + "Links": "Colliaziuns", + "Already imported, updated in place: {count}": "Gia importà, actualisà al lieu: {count}", + "What does not carry over": "Tge che na vegn betg surpiglià", + "Tasks with resources, which are not imported: {count}": "Incumbensas cun resursas, che na vegnan betg importadas: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Incumbensas pli profundas che il nivel 3, plazzadas sut lur incumbensa dal nivel 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Colliaziuns auter che fin-cumenzament, importadas sco colliaziuns parentadas: {count}", + "Link lags, which are dropped: {count}": "Retardaziuns da colliaziuns, che crodan davent: {count}", + "Links to a summary task, which are not imported: {count}": "Colliaziuns cun ina incumbensa da resumaziun, che na vegnan betg importadas: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Colliaziuns cun incumbensas ordaifer quest plan, che na vegnan betg importadas: {count}", + "No longer in the plan": "Betg pli en il plan", + "These stay in the project; remove them yourself if they are no longer needed.": "Quellas restan en il project; allontanai ellas sez, sch'ellas na vegnan betg pli duvradas.", + "Import": "Importar", + "Close": "Serrar", + "The plan is imported: {created} created, {updated} updated.": "Il plan è importà: {created} creadas, {updated} actualisadas.", + "Links that would close a loop were left out: {count}": "Colliaziuns che serrassan in circul èn vegnidas laschadas davent: {count}", + "The import stopped part-way. Run it again to finish it.": "L'import è sa fermà a mesa via. Exequì el anc ina giada per al terminar.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Memorisai il plan en Microsoft Project cun Datoteca, Memorisar sco, format XML, ed importai quella datoteca.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Questa datoteca declera in DOCTYPE u entitads, che na vegnan betg acceptadas.", + "The file is larger than 10 MB.": "La datoteca è pli gronda che 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Il plan ha dapli che 2 000 incumbensas, dapli ch'in import prenda.", + "This file is not a Microsoft Project plan in XML format.": "Questa datoteca n'è betg in plan da Microsoft Project en il format XML.", + "Choose a file to import.": "Tscherni ina datoteca per importar.", + "Only the project owner can import a plan.": "Mo il possessur dal project po importar in plan.", + "The plan could not be read. Please try again.": "Il plan n'ha betg pudì vegnir legì. Empruvai anc ina giada.", + "Linked case: {title}": "Cas collià: {title}", + "Linked to a case": "Collià cun in cas", + "Hand over to case": "Surdar al cas", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copiescha senza midadas mintga datoteca dal project e da sias incumbensas, ed ina datoteca che descriva il project, en il cas collià.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Datotecas copiadas: {count}", + "Files that failed: {names}": "Datotecas che n'han betg funcziunà: {names}", + "The handover failed. Please try again.": "La surdada n'ha betg funcziunà. Empruvai anc ina giada.", + "The linked case could not be found, or you cannot open it.": "Il cas collià n'è betg vegnì chattà, u Vus na pudais betg l'avrir.", + "Case handovers": "Surdadas al cas", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Mintga surdada da las datotecas e da las metadatas dal project a ses cas: cura, da tgi, a tge cas, mintga datoteca copiada cun ses SHA-256, e las datotecas che n'han betg funcziunà.", + "Finance": "Finanzas", + "Add cost line": "Agiuntar ina lingia da custs", + "Delivery terms": "Cundiziuns da furniziun", + "Billing model": "Model da facturaziun", + "Budget in euro": "Budget en euro", + "Budget in hours": "Budget en uras", + "Hourly rate in euro": "Tariffa per ura en euro", + "Planned start": "Cumenzament planisà", + "Planned end": "Fin planisada", + "Planned dates": "Datas planisadas", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Nagin budget cunvegnì", + "Hours": "Uras", + "Only the project owner and the portfolio managers see the amounts.": "Mo il possessur dal project ed ils manaschers dal portfolio vesan ils imports.", + "Budget against cost per category": "Budget cunter custs per categoria", + "Labour (booked time)": "Lavur (temp registrà)", + "No category": "Nagina categoria", + "Hours are not available": "Las uras n'èn betg disponiblas", + "Not yet assigned to a category": "Anc betg attribuì ad ina categoria", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} spendì, {remaining} restant", + "Budget against cost per phase": "Budget cunter custs per fasa", + "No phase": "Nagina fasa", + "Cost lines": "Lingias da custs", + "From the finance system": "Dal sistem finanzial", + "Edit cost line {amount}": "Modifitgar la lingia da custs {amount}", + "No cost lines yet": "Anc naginas lingias da custs", + "Commitments": "Obligaziuns", + "Actual cost": "Custs effectivs", + "Forecast": "Prognosa", + "Remaining": "Restant", + "Not planned yet": "Anc betg planisà", + "{start} to {end}": "{start} fin {end}", + "The terms were not saved. Please try again.": "Las cundiziuns n'èn betg vegnidas memorisadas. Emprova anc ina giada.", + "Terms saved": "Cundiziuns memorisadas", + "Fixed price": "Pretsch fix", + "Hourly": "Per ura", + "Not billed": "Betg facturà", + "Commitment": "Obligaziun", + "Edit cost line": "Modifitgar ina lingia da custs", + "Kind": "Gener", + "Amount in euro": "Import en euro", + "Remove": "Allontanar", + "Could not save the cost line. Only the project owner changes the money of a project.": "La lingia da custs n'ha betg pudì vegnir memorisada. Mo il possessur dal project mida ils daners d'in project.", + "Could not remove the cost line. Please try again.": "La lingia da custs n'ha betg pudì vegnir allontanada. Emprova anc ina giada.", + "{amount} over budget": "{amount} sur il budget", + "Cost categories": "Categorias da custs", + "The categories every project splits its budget and costs into, one per line": "Las categorias en las qualas mintga project parta ses budget e ses custs, ina per lingia", + "Categories": "Categorias", + "Give at least one category, each name once.": "Inditgescha almain ina categoria, mintga num ina giada.", + "Cost categories saved": "Categorias da custs memorisadas", + "The cost categories were not saved. Please try again.": "Las categorias da custs n'èn betg vegnidas memorisadas. Emprova anc ina giada.", + "Finance line": "Lingia finanziala", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "In import da daners d'in project: in budget, ina obligaziun, custs effectivs u ina prognosa, en ina categoria da custs e sche giavischà en ina fasa. Endatà dal possessur dal project u tramess dal sistem finanzial tras l'app d'integraziun.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Il project al qual quest import appartegna. Vid per ina lingia dal sistem finanzial, il numer da project da la quala na correspunda a nagin project.", + "The phase this amount belongs to, if any": "La fasa a la quala quest import appartegna, sch'i dat ina", + "The cost category, one of the categories the admin set up": "La categoria da custs, ina da las categorias che l'administratur ha endrizzà", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Sche l'import è in budget, ina obligaziun, custs effectivs u ina prognosa", + "Amount": "Import", + "The amount in the reporting currency (euro)": "L'import en la valuta da rapport (euro)", + "The date the amount was booked or is expected": "La data da la registraziun u da l'aspectativa da l'import", + "What the amount is for": "Per tge che l'import è", + "Whether a person entered the line or the finance system sent it": "Sch'ina persuna ha endatà la lingia u sch'il sistem finanzial l'ha tramessa", + "Entered by hand": "Endatà a maun", + "Finance line id": "Id da la lingia finanziala", + "The finance system's own id of this line. One imported line per id.": "L'agen id da questa lingia en il sistem finanzial. Ina lingia importada per id.", + "Project number": "Numer dal project", + "The project number the finance system sent, matched against the project key": "Il numer dal project ch'il sistem finanzial ha tramess, cumparegià cun la clav dal project", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Il portfolio dal project da la lingia, copià dal project, uschia che las summas dal portfolio dovran in filter", + "Finance readers": "Lecturs da finanzas", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UIDs d'utilisaders da Nextcloud da las persunas che dastgan vesair quest import: il possessur dal project ed ils manaschers da ses portfolio", + "Project owner": "Possessur dal project", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID d'utilisader da Nextcloud dal possessur dal project, che dastga midar ed allontanar lingias manualas", + "How the client pays: not billed, a fixed price, or by the hour.": "Co ch'il client paja: betg facturà, pretsch fix u per ura.", + "Portfolio finance": "Finanzas dal portfolio", + "You cannot see the money of any project in this portfolio": "Ti na vesas ils daners da nagin project en quest portfolio", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Il server ha returnà lingias da custs da projects ordaifer quest portfolio, pertge pon questas summas esser faussas.", + "Projects left out because you cannot see their money: {count}": "Projects laschads davent perquai che ti na vesas betg lur daners: {count}", + "Unmatched finance lines": "Lingias finanzialas betg attribuidas", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, obligaziuns, custs effectivs e prognosa summads per in portfolio.", + "Subprojects": "Sutprojects", + "{done} of {total}": "{done} da {total}", + "{done} of {total} tasks done, including subprojects": "{done} da {total} incumbensas terminadas, inclus ils sutprojects", + "Show the subprojects of {title}": "Mussar ils sutprojects da {title}", + "Hide the subprojects of {title}": "Zuppentar ils sutprojects da {title}", + "Part of": "Part da", + "No parent project": "Nagin project superiur", + "A project cannot sit under one of its own subprojects.": "In project na po betg star sut in da ses agens sutprojects.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projects vegnan ennidads al pli trais nivels: program, project e sutproject.", + "Parent project": "Project superiur", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Il project sut il qual quest project stat, sco in program. Projects vegnan ennidads al pli trais nivels.", + "Yes": "Gea", + "No": "Na", + "{label} (required)": "{label} (obligatoric)", + "{label} is required": "{label} è obligatoric", + "Project field": "Champ da project", + "A field an admin adds to every project, such as a policy area or a contract value.": "In champ che in administratur agiunta a mintga project, sco in sectur politic u ina valur da contract.", + "Key": "Clav", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Il num fix sut il qual la valur vegn memorisada, en lower camel case. Mantegna el, uschespert che projects al dovran.", + "Label": "Etichetta", + "The name people see next to the field": "Il num che la glieud vesa sper il champ", + "What the field holds": "Tge ch'il champ cuntegna", + "Text": "Text", + "Number": "Numer", + "Choice": "Tscherna", + "Person": "Persuna", + "Yes or no": "Gea u na", + "Options": "Opziuns", + "The choices of a choice field": "Las opziuns d'in champ da tscherna", + "Required": "Obligatoric", + "Whether a project must fill in the field": "Sch'in project sto emplenir il champ", + "Where the field appears, lowest first": "Nua ch'il champ cumpara, il pli bass l'emprim", + "Applies to": "Vala per", + "What the field is added to": "Tar tge ch'il champ vegn agiuntà", + "Custom fields": "Agens champs", + "The values of the project fields an admin defined, keyed by the field's key.": "Las valurs dals champs da project che in administratur ha definì, tenor la clav dal champ.", + "Project fields": "Champs da project", + "Related": "Colliads", + "Remove link": "Allontanar la colliaziun", + "Link type": "Tip da colliaziun", + "Relates to": "Collià cun", + "Duplicates": "Duplitgescha", + "Project key": "Clav dal project", + "Every task number starts with it, such as VERG-42.": "Mintga numer d’incumbensa cumenza cun ella, per exempel VERG-42.", + "This key is already used by another project.": "Questa clav vegn gia duvrada d’in auter project.", + "Use 2 to 10 letters and digits, starting with a letter.": "Duvrai 2 fin 10 bustabs e cifras che cumenzan cun in bustab.", + "The key cannot change once tasks carry it.": "La clav na po betg pli midar, uschespert che incumbensas la portan.", + "Project saved. The existing tasks get their numbers in the background.": "Project memorisà. Las incumbensas existentas survegnan lur numers en il fund.", + "Next task number": "Numer da la proxima incumbensa", + "The number the next task of this project gets in its key. Only the system writes it.": "Il numer che la proxima incumbensa da quest project survegn en sia clav. Mo il sistem al scriva.", + "Restore {title}": "Restaurar {title}", + "Restore": "Restaurar", + "Project restored": "Project restaurà", + "Could not restore the project": "Il project n’ha betg pudì vegnir restaurà", + "Bring this project back to the active list.": "Returnar quest project en la glista dals projects activs.", + "Restore project": "Restaurar il project", + "Request reason": "Motiv da la dumonda", + "Why the requester needs this project. Filled in when the project is requested.": "Pertge che la persuna che dumonda dovra quest project. Vegn emplenì cun la dumonda.", + "Reviewed by": "Examinà da", + "The user who approved or rejected the request.": "L’utilisader che ha approvà u refusà la dumonda.", + "Reviewed at": "Examinà ils", + "When the request was approved or rejected.": "Cura che la dumonda è vegnida approvada u refusada.", + "Review note": "Remartga da l’examinatur", + "The reviewer's reason, shown to the requester when a request is not approved.": "Il motiv da l’examinatur, che la persuna che dumonda vesa, sch’ina dumonda na vegn betg approvada.", + "Members of these groups": "Commembers da questas gruppas", + "Groups that may create projects": "Gruppas che dastgan crear projects", + "The group {group} no longer exists. Save to remove it.": "La gruppa {group} n’exista betg pli. Memorisai per l’allontanar.", + "Review project request": "Examinar la dumonda da project", + "Requested by": "Dumandà da", + "Why it is needed": "Pertge ch’el è necessari", + "Desired start date": "Data da cumenzament giavischada", + "Why is it not approved?": "Pertge n’è el betg approvà?", + "Give a reason. The requester sees it.": "Inditgai in motiv. La persuna che dumonda al vesa.", + "Approve": "Approvar", + "Reject": "Refusar", + "Reject request": "Refusar la dumonda", + "The review was not saved. Try again.": "L’examinaziun n’è betg vegnida memorisada. Empruvai anc ina giada.", + "This project is waiting for review": "Quest project spetga l’examinaziun", + "This request was not approved": "Questa dumonda n’è betg vegnida approvada", + "Reason: {note}": "Motiv: {note}", + "Review request": "Examinar la dumonda", + "Request a project": "Dumandar in project", + "Step {step} of 2": "Pass {step} da 2", + "Why is this project needed?": "Pertge è quest project necessari?", + "Give a reason. The reviewer reads it.": "Inditgai in motiv. L’examinatur al legia.", + "Back": "Enavos", + "Next": "Vinavant", + "Send request": "Trametter la dumonda", + "The request was not sent. Try again.": "La dumonda n’è betg vegnida tramessa. Empruvai anc ina giada.", + "Requested": "Dumandà", + "Not approved": "Betg approvà", + "Your request was sent": "Vossa dumonda è vegnida tramessa", + "Let everyone else request a project": "Laschar dumandar tut ils auters in project", + "Add a task": "Agiuntar in pensum", + "Delete task": "Stizzar il pensum", + "Edit task": "Modifitgar il pensum", + "Write": "Scriver", + "Preview": "Prevista", + "Markdown works here: headings, lists and links.": "Qua funcziuna Markdown: titels, glistas e colliaziuns.", + "Could not save the task. Please try again.": "Il pensum n'ha betg pudì vegnir memorisà. Emprova anc ina giada.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Sin \"{title}\" è temp registrà, perquai na po el betg vegnir stizzà. Ti pos al annullar enstagl: las registraziuns da temp restan.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Stizzar \"{title}\"? Sias colliaziuns cun auters pensums vegnan era allontanadas. Quai na po betg vegnir revocà.", + "Keep task": "Tegnair il pensum", + "Cancel task": "Annullar il pensum", + "Only the reporter, the project owner or an admin can delete this task.": "Mo la persuna che l'ha annunzià, il possessur dal project u in administratur po stizzar quest pensum.", + "Could not delete the task. Please try again.": "Il pensum n'ha betg pudì vegnir stizzà. Emprova anc ina giada.", + "Could not cancel the task. Please try again.": "Il pensum n'ha betg pudì vegnir annullà. Emprova anc ina giada.", + "Responsible": "Responsabel", + "Also working on this": "Lavuran era vi", + "Labels": "Etichettas", + "Could not change the priority. Please try again.": "La prioritad n'ha betg pudì vegnir midada. Emprova anc ina giada.", + "Other project members who work on this task alongside the person responsible.": "Auters commembers dal project che lavuran vi da quest pensum ensemen cun la persuna responsabla.", + "Duplicate": "Duplitgar", + "Could not copy the task. Please try again.": "Il pensum n'ha betg pudì vegnir copià. Emprova anc ina giada.", + "Subtasks": "Sutpensums", + "{done} of {total} done": "{done} da {total} terminads", + "Add a subtask": "Agiuntar in sutpensum", + "Checklist": "Glista da controlla", + "Checklist item actions": "Acziuns per l'element da la glista", + "Add a checklist item": "Agiuntar in element a la glista", + "Subtasks: {estimate} estimated, {logged} logged": "Sutpensums: {estimate} stimà, {logged} registrà", + "Total estimate: {total}": "Stima totala: {total}", + "Part of {title}": "Part da {title}", + "Checklist: {count} done": "Glista da controlla: {count} terminads", + "This task has subtasks: {count}.": "Quest pensum ha sutpensums: {count}.", + "Keep subtasks as separate tasks": "Tegnair ils sutpensums sco pensums separads", + "Delete subtasks too": "Stizzar era ils sutpensums", + "Copy of {title}": "Copia da {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Il pensum è vegnì copià, ma betg tut ils sutpensums. Controllescha la copia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Pass pitschens entaifer il pensum. Mintga element ha in id, in text e sch'el è terminà.", + "Open work per person and per project.": "Lavur avert per persuna e per project.", + "View": "Vista", + "By person": "Tenor persuna", + "By project": "Tenor project", + "Hours left": "Uras restantas", + "Tasks without an estimate": "Incumbensas senza stima", + "Due in 14 days": "Scadent en 14 dis", + "Shared": "Cundividì", + "Unassigned": "Betg attribuì", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Igl è mussà la lavur en ils projects che ti vesas. Las uras dumbran per la persuna responsabla; incumbensas cundivididas dumbran senza uras.", + "No open work in these projects.": "Nagina lavur averta en quests projects.", + "Open work": "Lavur averta", + "{count} open tasks": "{count} incumbensas avertas", + "Create a project to see capacity here.": "Creescha in project per vesair qua la capacitad.", + "My tasks": "Mias incumbensas", + "Show all my tasks": "Mussar tut mias incumbensas", + "No tasks assigned to you": "Ti n'has nagina incumbensa attribuida", + "Browse projects": "Tschertgar projects", + "Later": "Pli tard", + "Due {date}": "Scadenza {date}", + "Could not change the status. Please try again.": "Il status n'ha betg pudì vegnir midà. Emprova anc ina giada.", + "Completed today": "Terminà oz", + "My open tasks": "Mias incumbensas avertas", + "My overdue tasks": "Mias incumbensas en retard", + "My tasks in progress": "Mias incumbensas en lavur", + "Pin to the top": "Fixar sisum", + "Unpin": "Distatgar", + "Pinned": "Fixà", + "Actions for {title}": "Acziuns per {title}", + "Could not save your project order. Please try again.": "L'urden da tes projects n'ha betg pudì vegnir memorisà. Emprova anc ina giada.", + "No boards yet": "Anc naginas tavlas", + "Create a project to get a board.": "Creescha in project per survegnir ina tavla.", + "Use the Projects page to create and manage your projects and tasks.": "Dovra la pagina Projects per crear ed administrar tes projects e tias incumbensas.", + "Go to projects": "Ir als projects", + "You are not a member of any projects yet.": "Ti n'es anc commember da nagin project.", + "Could not search for users. Please try again.": "Betg pussaivel da tschertgar utilisaders. Emprova anc ina giada.", + "Project creation is restricted to administrators.": "Mo administraturs pon crear projects.", + "Only the project owner or an administrator can delete this project.": "Mo il possessur dal project u in administratur po stizzar quest project.", + "No projects are available to you yet. Ask an administrator to create one.": "I n'ha anc nagins projects disponibels per tai. Dumonda in administratur da crear in.", + "Due: {date}": "Scadenza: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Incumbensas cun ina data da cumenzament u da scadenza cumparan sin la lingia da temp. Agiunta datas per las vesair qua.", + "You do not have access to this project.": "Ti n'has nagin access a quest project.", + "Zoom level": "Nivel da zoom", + "Unscheduled": "Betg planisà", + "Start: {date}": "Cumenzament: {date}", + "Today": "Oz", + "No scheduled tasks": "Naginas incumbensas planisadas", + "An unexpected error occurred.": "I è capità ina errur nunspetgada.", + "Column {number} name": "Num da la colonna {number}", + "Failed to save creation policy": "La regla da crear n'ha betg pudì vegnir memorisada", + "All authenticated users": "Tut ils utilisaders annunziads", + "Control who may create new projects": "Fixescha tgi che dastga crear novs projects", + "Administrators only": "Mo administraturs", + "Project creation": "Crear projects", + "Allow project creation": "Permetter da crear projects", + "Creation policy saved successfully": "Regla da crear memorisada", + "Initializing…": "Aviar…", + "e.g. 2h 30m, 90m, 1.5h": "p.ex. 2h 30m, 90m, 1.5h", + "Log time": "Registrar temp", + "Save estimate": "Memorisar la stima", + "Logged: {logged}": "Registrà: {logged}", + "over by {amount}": "{amount} surpassà", + "Time tracking": "Registraziun dal temp", + "Estimate": "Stima", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Endatescha ina stima valida (p.ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Endatescha ina durada valida (p.ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "L'inscripziun da temp n'ha betg pudì vegnir memorisada. Emprova anc ina giada.", + "Edit time entry": "Modifitgar l'inscripziun da temp", + "Duration": "Durada", + "Date range": "Perioda", + "Last week": "L'emna passada", + "No time logged": "Nagin temp registrà", + "Log time on a task to see it here.": "Registrescha temp sin ina incumbensa per al vesair qua.", + "To date": "Fin la data", + "This week": "Quest'emna", + "Total: {total}": "Total: {total}", + "From date": "Da la data", + "Custom range": "Perioda individuala", + "All time": "Tut il temp", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Ina incumbensa n'ha betg pudì vegnir stizzada, uschia pon restar datas. Stizza il project anc ina giada.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Ina inscripziun da temp n'ha betg pudì vegnir stizzada, uschia pon restar datas. Stizza il project anc ina giada.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Ina colonna n'ha betg pudì vegnir stizzada, uschia pon restar datas. Stizza il project anc ina giada.", + "Could not delete the project. Please try again.": "Il project n'ha betg pudì vegnir stizzà. Emprova anc ina giada.", + "Notification settings": "Parameters da las notificaziuns", + "Configure when due-date reminders are sent": "Fixescha cura che las regurdientschas da scadenza vegnan tramessas", + "Due-date reminder lead time (hours)": "Temp ordavant da la regurdientscha (uras)", + "Lead time must be between 1 and 336 hours": "Il temp sto esser tranter 1 e 336 uras", + "Reminder lead time saved successfully": "Temp da la regurdientscha memorisà", + "Failed to save reminder lead time": "Betg pussaivel da memorisar il temp da la regurdientscha", + "Notifications": "Notificaziuns", + "Notify me 1 day before a task's due date": "Ma notifitgar 1 di avant la scadenza d'ina incumbensa", + "Draft": "Sboz", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Sche la lecziun è in sboz che mo ses magister vesa, ha lieu u è annullada.", + "New release": "Nova versiun", + "Roadmap chart. The same releases and epics are listed below.": "Diagram dal plan da svilup. Las medemas versiuns ed epics èn enumeradas sutvart.", + "Nothing on the roadmap yet": "Anc nagut sin il plan da svilup", + "Releases with a target date and epics with dated tasks appear here.": "Qua cumparan las versiuns cun ina data da mira ed ils epics cun incumbensas datadas.", + "Releases": "Versiuns", + "No releases yet": "Anc naginas versiuns", + "Target date: {date}": "Data da mira: {date}", + "No target date": "Nagina data da mira", + "Edit {name}": "Modifitgar {name}", + "Mark {name} as released": "Marcar {name} sco publitgada", + "Mark as released": "Marcar sco publitgada", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Anc nagins epics. Avri ina incumbensa per far in epic ord ella.", + "Not scheduled yet": "Anc betg planisà", + "Planned": "Planisada", + "Released": "Publitgada", + "Edit release": "Modifitgar la versiun", + "Target date": "Data da mira", + "Could not save the release. Please try again.": "Betg reussì da memorisar la versiun. Emprova anc ina giada.", + "Every task of this release is done or cancelled.": "Mintga incumbensa da questa versiun è fatga u annullada.", + "Not finished yet: {count}": "Anc betg terminadas: {count}", + "What happens to these tasks?": "Tge capita cun questas incumbensas?", + "Move to {name}": "Spustar en {name}", + "Remove the release": "Allontanar la versiun", + "Keep it on {name}": "Las laschar en {name}", + "Could not mark the release as released. Please try again.": "Betg reussì da marcar la versiun sco publitgada. Emprova anc ina giada.", + "Roadmap": "Plan da svilup", + "Tasks or roadmap": "Incumbensas u plan da svilup", + "Release": "Versiun", + "Epic": "Epic", + "This task is an epic": "Questa incumbensa è in epic", + "A named, dated delivery of a project that its tasks are planned against.": "Ina furniziun d'in project cun num e data, tenor la quala ses incumbensas vegnan planisadas.", + "Name of the release": "Num da la versiun", + "The project this release belongs to": "Il project al qual questa versiun appartegna", + "What this release delivers": "Tge che questa versiun furnescha", + "When work on the release starts": "Cura che la lavur vi da la versiun cumenza", + "The date the release is due": "La data, fin cura che la versiun sto esser pronta", + "Whether the release is planned, released or archived": "Sche la versiun è planisada, publitgada u archivada", + "Released on": "Publitgada ils", + "When the release was marked as released": "Cura che la versiun è vegnida marcada sco publitgada", + "The release this task is planned for": "La versiun per la quala questa incumbensa è planisada", + "Board view options": "Opziuns da la vista da la tavla", + "Colour cards": "Colurar las cartas", + "No colour": "Nagina colur", + "By label": "Tenor etichetta", + "Swimlanes": "Lingias", + "No swimlanes": "Naginas lingias", + "By assignee": "Tenor persuna responsabla", + "By epic": "Tenor epic", + "No assignee": "Betg attribuì", + "No epic": "Nagin epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Las cartas restan en la lingia da lur epic. Midai l'epic sin la pagina da la lavur.", + "Hand over to": "Surdar a", + "Could not save your board view. It applies until you reload.": "Vossa vista da la tavla n'è betg vegnida memorisada. Ella vala fin che Vus chargiais da nov.", + "Timetable wish": "Giavisch d'urari", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "In giavisch che il generatur resguarda. In giavisch dir resguarda el adina, in giavisch flexibel nua ch'i va.", + "Whether the wish is about a teacher, a group, a room or one activity": "Sch'il giavisch pertutga in magister, ina gruppa, ina stanza u ina activitad", + "Teacher": "Magister", + "Group": "Gruppa", + "Reference": "Referenza", + "The user, group, room or activity the wish is about": "L'utilisader, la gruppa, la stanza u l'activitad dal giavisch", + "What the wish asks for": "Tge ch'il giavisch dumonda", + "Not on these periods": "Betg en questas uras", + "Preferably not on these periods": "Plitost betg en questas uras", + "At most a number of lessons a day": "Maximalmain in dumber d'uras per di", + "No free periods between lessons": "Naginas uras libras tranter las lecziuns", + "Always the same room": "Adina la medema stanza", + "Periods": "Uras", + "The periods of the week the wish is about, such as wed-5": "Las uras da l'emna dal giavisch, per exempel wed-5", + "Limit": "Limita", + "The most lessons a day, for a wish of that kind": "Il dumber maximal d'uras per di, per in giavisch da quella sort", + "Strength": "Fermezza", + "Whether the generator must keep the wish or should keep it": "Sch'il generatur sto u duess resguardar il giavisch", + "Hard": "Dir", + "Soft": "Flexibel", + "Weight": "Paisa", + "How much a soft wish counts, from 1 to 3": "Quant ch'in giavisch flexibel quinta, da 1 fin 3", + "Why the wish exists": "Pertge ch'il giavisch exista", + "Timetable scenario": "Scenari d'urari", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "In model d'emna, fatg dal generatur u prendì da l'urari actual. El tegna sias datas d'entrada e quant bain ch'el resguarda ils giavischs.", + "The name timetablers know the scenario by": "Il num sut il qual ils planisaders enconuschan il scenari", + "Whether the generator made it or it came from the current timetable": "Sch'il generatur l'ha fatg u sch'el deriva da l'urari actual", + "Generated": "Generà", + "From the current timetable": "Da l'urari actual", + "Week of": "Emna dals", + "The Monday of the first week of the window": "Il glindesdi da l'emprima emna da la perioda", + "Window start": "Entschatta da la perioda", + "The first day the week pattern applies to": "L'emprim di che il model d'emna vala", + "Window end": "Fin da la perioda", + "The last day the week pattern applies to": "L'ultim di che il model d'emna vala", + "Waiting, generating, done, failed, or published as draft lessons": "En spetga, vegn generà, finì, fallì u publitgà sco lecziuns sbozz", + "Waiting": "En spetga", + "Generating": "Vegn generà", + "Failed": "Fallì", + "Published": "Publitgà", + "Seed": "Grauna", + "The number the generator starts from, so a run can be repeated": "Il dumber cun il qual il generatur cumenza, per che in currer possia vegnir repetì", + "Input": "Entrada", + "The periods, rooms, lessons and wishes the scenario was made from": "Las uras, stanzas, lecziuns e giavischs dals quals il scenari è nà", + "Placements": "Plazzaments", + "Each lesson with the period and room it was given": "Mintga lecziun cun l'ura e la stanza ch'ella ha survegnì", + "Unplaced lessons": "Lecziuns betg plazzadas", + "Lessons without a place, each with the hard wish that blocked it": "Lecziuns senza plazza, mintgina cun il giavisch dir che l'ha bloccada", + "Broken wishes": "Giavischs violads", + "The wishes this scenario breaks, with the lessons that break them": "Ils giavischs che quest scenari violescha, cun las lecziuns pertutgadas", + "Measures": "Mesiras", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Lecziuns plazzadas, giavischs violads, uras libras dals magisters, lecziuns per di e utilisaziun da las stanzas", + "Reason": "Motiv", + "Why the run failed": "Pertge ch'il currer è fallì", + "Published at": "Publitgà ils", + "When the scenario was written out as draft lessons": "Cura ch'il scenari è vegnì scrit sco lecziuns sbozz", + "Edit wish": "Modifitgar il giavisch", + "New wish": "Nov giavisch", + "Hard: the generator always keeps it": "Obligatoric: il generatur al resguarda adina", + "Soft: the generator keeps it where it can": "Flexibel: il generatur al resguarda nua ch'el po", + "Weight (1 to 3)": "Paisa (1 fin 3)", + "Most lessons a day": "Il pli bler lecziuns per di", + "Period": "Ura", + "{day} period {number}": "{day} ura {number}", + "Teacher (user name)": "Magister (num d'utilisader)", + "Activity (group:subject)": "Activitad (gruppa:rom)", + "Say who or what the wish is about.": "Inditgai per tgi u tge ch'il giavisch vala.", + "Choose at least one period.": "Tscherni almain ina ura.", + "The limit is a whole number of 1 or more.": "La limita è in dumber entir da 1 u dapli.", + "Timetable": "Plan d'uras", + "Wishes": "Giavischs", + "Timetable wishes": "Giavischs per il plan d'uras", + "Generator run": "Lantschada dal generatur", + "Generator progress": "Progress dal generatur", + "The run failed: {reason}": "La lantschada n'è betg reussida: {reason}", + "{placed} of {lessons} lessons placed": "{placed} da {lessons} lecziuns plazzadas", + "Generate again": "Generar danovamain", + "Generate": "Generar", + "Every lesson has a place.": "Mintga lecziun ha in plaz.", + "Lesson": "Lecziun", + "No free period and room": "Nagina ura e nagina stanza libra", + "Broken soft wishes": "Giavischs flexibels violads", + "Every soft wish is kept.": "Mintga giavisch flexibel vegn resguardà.", + "Wish": "Giavisch", + "Lessons": "Lecziuns", + "Generating: {percent}% of the time budget used": "Generescha: {percent}% dal temp duvrà", + "Waiting to start": "Spetga sin il cumenzament", + "Published as draft lessons": "Publitgà sco sbozs da lecziuns", + "Could not read the scenario.": "Il scenari n'ha betg pudì vegnir legì.", + "Could not start the run.": "La lantschada n'ha betg pudì vegnir cumenzada.", + "Scenarios": "Scenaris", + "Timetable scenarios": "Scenaris dal plan d'uras", + "Scenario": "Scenari", + "Take the current timetable": "Surpigliar l'urari actual", + "Could not take the current timetable.": "Impussibel da surpigliar l'urari actual.", + "Broken hard wishes": "Giavischs obligatorics violads", + "Not on a period of the week grid": "Betg sin ina lecziun da la grilla da l'emna", + "Compare scenarios": "Cumparegliar scenaris", + "Scenarios to compare": "Scenaris da cumparegliar", + "Choose two or three scenarios to compare them.": "Tscherni dus u trais scenaris per als cumparegliar.", + "Measure": "Mesira", + "Best": "Il meglier", + "Lessons that differ": "Lecziuns che sa distinguan", + "No lesson differs.": "Nagina lecziun na sa distingua.", + "Not placed": "Betg plazzà", + "{period} in {room}": "{period} en {room}", + "Lessons placed": "Lecziuns plazzadas", + "Lessons without a place": "Lecziuns senza plaz", + "Clashes": "Conflicts", + "Hard wishes broken": "Giavischs obligatorics violads", + "Soft wishes broken": "Giavischs flexibels violads", + "Soft wishes broken, weighted": "Giavischs flexibels violads, ponderads", + "Free periods between lessons, all teachers": "Uras libras, tut ils magisters", + "Most free periods of one teacher": "Il pli bler uras libras d'in magister", + "Most lessons of one group on a day": "Il pli bler lecziuns d'ina gruppa en in di", + "Room use": "Utilisaziun da las stanzas", + "Publish as draft lessons": "Publitgar sco lecziuns sbozs", + "Draft lessons written: {count}": "Lecziuns sbozs scrittas: {count}", + "Could not publish the scenario.": "Impussibel da publitgar il scenari.", + "Rules": "Reglas", + "Rules for {column}": "Reglas per {column}", + "When a card enters this column": "Cura che ina carta entra en questa colonna", + "Action": "Acziun", + "Set the priority": "Fixar la prioritad", + "Assign to": "Attribuir a", + "Assign the person who moved the card": "Attribuir a la persuna che ha spustà la carta", + "Remove the assignee": "Allontanar la persuna responsabla", + "Add a label": "Agiuntar ina etichetta", + "No longer a project member": "Betg pli commember dal project", + "This label no longer exists": "Questa etichetta n'exista betg pli", + "Add rule": "Agiuntar ina regla", + "Remove rule": "Allontanar la regla", + "No rules yet. Add one to change a card when it enters this column.": "Anc naginas reglas. Agiuntai ina per midar ina carta cura ch'ella entra en questa colonna.", + "Could not save the rules. Please try again.": "Las reglas n'han betg pudì vegnir memorisadas. Empruvai anc ina giada.", + "1 rule runs when a card enters this column": "1 regla vegn exequida cura che ina carta entra en questa colonna", + "{count} rules run when a card enters this column": "{count} reglas vegnan exequidas cura che ina carta entra en questa colonna", + "Rules applied: {changes}": "Reglas applitgadas: {changes}", + "assigned to {name}": "attribuì a {name}", + "assignee removed": "persuna responsabla allontanada", + "priority {priority}": "prioritad {priority}", + "label {label}": "etichetta {label}", + "What happens to a card when it enters this column, applied in list order.": "Tge che capita cun ina carta cura ch'ella entra en questa colonna, en la successiun da la glista.", + "Value": "Valur", + "What the rule does to the card.": "Tge che la regla fa cun la carta.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "La prioritad, l'id da l'utilisader u l'id da l'etichetta che l'acziun dovra; vid per acziuns senza valur.", + "is not": "n'è betg", + "{dimension} is not": "{dimension} n'è betg", + "Saved filters": "Filters memorisads", + "No saved filters yet": "Anc nagins filters memorisads", + "Save filter": "Memorisar il filter", + "Rename \"{name}\"": "Renumnar «{name}»", + "Delete \"{name}\"": "Stizzar «{name}»", + "Clear filters": "Stizzar ils filters", + "Showing {shown} of {total} tasks": "Mussa {shown} da {total} lavurs", + "Me": "Jau", + "No date": "Nagina data", + "Rename saved filter": "Renumnar il filter memorisà", + "Share with the project": "Parter cun il project", + "Give the filter a name": "Dai in num al filter", + "Could not save the filter. Please try again.": "Il filter n'ha betg pudì vegnir memorisà. Empruvai anc ina giada.", + "Some labels in \"{name}\" no longer exist and were left out.": "Intginas etichettas en «{name}» n'existan betg pli e èn vegnidas laschadas davent.", + "Could not delete the filter. Please try again.": "Il filter n'ha betg pudì vegnir stizzà. Empruvai anc ina giada.", + "Saved filter": "Filter memorisà", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "In filter da tavla cun num d'in project, privat per la persuna che l'ha memorisà, nun ch'el vegnia partì cun il project.", + "The project whose board the filter applies to": "Il project sin la tavla dal qual il filter vala", + "The name the filter is listed under": "Il num sut il qual il filter è en la glista", + "Saved by": "Memorisà da", + "Nextcloud user id of the person who saved the filter": "Id d'utilisader Nextcloud da la persuna che ha memorisà il filter", + "Shared with the project": "Partì cun il project", + "Whether every project member sees and applies the filter": "Sch'ils commembers dal project vesan il filter e pon applitgar el", + "Criteria": "Criteris", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Il filter: persuna responsabla, etichetta, prioritad e termin, mintgin cun è u n'è betg e sias valurs", + "Cross-project view": "Vista tranter projects", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Ina selecziun memorisada da projects, dals quals las incumbensas vegnan mussadas ensemen en colonnas da status, cundividida cun las persunas numnadas.", + "Shared with": "Cundividì cun", + "The name the view is listed under": "Il num sut il qual la vista è enumerada", + "Nextcloud user id of the person who saved the view": "ID d'utilisader Nextcloud da la persuna che ha memorisà la vista", + "Nextcloud user ids of the people the view is shared with": "IDs d'utilisaders Nextcloud da las persunas cun las qualas la vista è cundividida", + "The projects whose tasks the view shows, at most twenty": "Ils projects, da quals la vista mussa las incumbensas, maximalmain ventg", + "1 project in this view is hidden from you.": "1 project en questa vista è zuppà per tai.", + "{count} projects in this view are hidden from you.": "{count} projects en questa vista èn zuppads per tai.", + "{project} has no column for {status}.": "{project} n'ha nagina colonna per {status}.", + "This view does not exist or is not shared with you.": "Questa vista n'exista betg u n'è betg cundividida cun tai.", + "\"{task}\" moved to {status}.": "\"{task}\" spustà en {status}.", + "Project: {title}": "Project: {title}", + "Cross-project views": "Vistas tranter projects", + "New view": "Nova vista", + "Edit view": "Modifitgar la vista", + "Delete view": "Stizzar la vista", + "Give the view a name": "Dà in num a la vista", + "Pick at least one project": "Tscherna almain in project", + "A view shows at most {max} projects": "Ina vista mussa maximalmain {max} projects", + "Could not save the view. Please try again.": "Impussibel da memorisar la vista. Emprova anc ina giada.", + "Could not delete the view. Please try again.": "Impussibel da stizzar la vista. Emprova anc ina giada.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Stizzar \"{title}\"? Ils projects e lur incumbensas restan sco ch'els èn.", + "People see the tasks of the projects they are in, never more.": "Mintgin vesa mo las incumbensas dals projects nua ch'el è.", + "No views yet. A view shows the tasks of several of your projects together.": "Anc naginas vistas. Ina vista mussa ensemen las incumbensas da plirs da tes projects.", + "Projects in view: {count}": "Projects en la vista: {count}", + "Notify me when a task is assigned to me": "Ma avisar cura ch'ina incumbensa ma vegn attribuida", + "Also send these to me by email": "Ma trametter quai era per e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Agiunta ina adressa dad e-mail en tes parameters persunals da Nextcloud per retschaiver e-mails.", + "Code link": "Colliaziun da code", + "A commit, branch, merge request or issue in a code forge that works on a task.": "In commit, in rom, ina dumonda da fusiun u in problem sin ina plattafurma da code che lavura vi d'ina incumbensa.", + "The task the link belongs to": "L'incumbensa a la quala la colliaziun tutga", + "The project of the task": "Il project da l'incumbensa", + "Task key": "Clav da l'incumbensa", + "The task key the forge text named, such as VC-12": "La clav da l'incumbensa numnada en il text da la plattafurma, p.ex. VC-12", + "What the link points at": "Nua che la colliaziun mussa", + "Link": "Colliaziun", + "The address of the item in the forge": "L'adressa da l'element sin la plattafurma da code", + "The commit message, branch name or merge request title": "Il messadi dal commit, il num dal rom u il titel da la dumonda da fusiun", + "Repository": "Repositori", + "The repository, such as acme/portal": "Il repositori, p.ex. acme/portal", + "Forge id": "Id sin la plattafurma", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "L'agen id da l'element sin la plattafurma da code, p.ex. github:acme/portal#42 u in hash da commit", + "State": "Stadi", + "The state of a merge request or issue": "Il stadi d'ina dumonda da fusiun u d'in problem", + "Who made the commit or opened the merge request": "Tgi che ha fatg il commit u avert la dumonda da fusiun", + "When the commit was made or the merge request last changed": "Cura ch'il commit è vegnì fatg u la dumonda da fusiun è sa midada l'ultima giada", + "Added by": "Agiuntà da", + "Whether a person added the link or the integration wrote it": "Sch'ina persuna ha agiuntà la colliaziun u sche l'integraziun l'ha scritta", + "Nextcloud user UIDs of project members": "IDs d'utilisaders Nextcloud dals commembers dal project", + "Add link": "Agiuntar ina colliaziun", + "Added by hand": "Agiuntà a maun", + "Branch": "Rom", + "Code": "Code", + "Commit": "Commit", + "From the integration": "Da l'integraziun", + "Link to a commit, branch or merge request": "Colliaziun ad in commit, rom u dumonda da fusiun", + "Merge request": "Dumonda da fusiun", + "Merged": "Fusiunà", + "No code linked yet. Name {key} in a commit message or paste a link.": "Anc nagin code collià. Numna {key} en in messadi da commit u encollescha ina colliaziun.", + "No code linked yet. Paste a link to a commit or merge request.": "Anc nagin code collià. Encollescha ina colliaziun ad in commit u ina dumonda da fusiun.", + "Paste a web address that starts with https://.": "Encollescha ina adressa web che cumenza cun https://.", + "Remove link {title}": "Allontanar la colliaziun {title}", + "The link could not be added.": "La colliaziun n'ha betg pudì vegnir agiuntada.", + "The link could not be removed.": "La colliaziun n'ha betg pudì vegnir allontanada.", + "This link is already on the task.": "Questa colliaziun è gia tar l'incumbensa.", + "Code forges": "Plattafurmas da code", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Colliai commits e pull requests da GitHub cun incumbensas. Integriq retschaiva ils eveniments; planninq na clama mai GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Chargiai giu la configuraziun ed importai ella en Integriq. Inscrivi lura in secret en la regla \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Agiuntai en GitHub al repositori in webhook cun questa adressa ed il medem secret. Tschernai il tip da cuntegn application/json ed ils eveniments push e pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Numnai la clav da l'incumbensa, p.ex. VC-12, en in messadi da commit, in num da rom u il titel d'in pull request. La colliaziun cumpara lura tar quella incumbensa.", + "Without Integriq, project members can still paste a link on the task page.": "Senza Integriq pon ils commembers dal project anc adina encollar ina colliaziun sin la pagina da l'incumbensa.", + "Download the Integriq configuration": "Chargiar giu la configuraziun d'Integriq", + "Calendar": "Chalender", + "Previous": "Precedent", + "Calendar view": "Vista dal chalender", + "Starts:": "Cumenza:", + "No tasks with a date in this month.": "Naginas incumbensas cun data quest mais.", + "Week of {start} to {end}": "Emna da {start} fin {end}", + "My calendar": "Mes chalender", + "Show as list": "Mussar sco glista", + "Show as calendar": "Mussar sco chalender", + "Open my calendar": "Avrir mes chalender", + "Nextcloud Tasks": "Incumbensas Nextcloud", + "Show my tasks in Nextcloud Tasks": "Mussar mias incumbensas en Incumbensas Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Las incumbensas attribuidas a tai u partidas cun tai cumparan en ina glista \"Planninq\" en Incumbensas e Chalender da Nextcloud. Midadas fatgas là vegnan remplazzadas da la proxima midada en Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Quest server na po betg scriver en Incumbensas Nextcloud, perquai n'è l'export betg disponibel.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Administrà da Planninq. Midadas fatgas qua vegnan remplazzadas da la proxima midada en Planninq.", + "Working days and holidays": "Dis da lavur e dis da festa", + "Dates set on the timeline skip the days that are not working days.": "Datas fixadas sin la lingia da temp sursiglian ils dis che n'èn betg dis da lavur.", + "Working weekdays": "Dis da lavur da l'emna", + "Non-working days": "Dis libers", + "No non-working days yet.": "Anc nagins dis libers.", + "Add day": "Agiuntar in di", + "Year": "Onn", + "Add Dutch national holidays": "Agiuntar ils dis da festa naziunals ollandais", + "Save working days": "Memorisar ils dis da lavur", + "Choose at least one working weekday.": "Tscherna almain in di da lavur.", + "Working days saved.": "Dis da lavur memorisads.", + "Could not save the working days.": "Ils dis da lavur n'han betg pudì vegnir memorisads.", + "New Year's Day": "Bumaun", + "Easter Sunday": "Dumengia da Pasca", + "Easter Monday": "Glindesdi da Pasca", + "King's Day": "Di dal retg", + "Liberation Day": "Di da la liberaziun", + "Ascension Day": "Ascensiun", + "Whit Sunday": "Dumengia da Tschuncaisma", + "Whit Monday": "Glindesdi da Tschuncaisma", + "Christmas Day": "Nadal", + "Boxing Day": "Segund di da Nadal", + "Dates of {title}": "Datas da {title}", + "The due date cannot be before the start date.": "Il termin na po betg esser avant la data da cumenzament.", + "{title}, from {start} to {end}": "{title}, dals {start} fin ils {end}", + "The dates could not be saved.": "Las datas n'han betg pudì vegnir memorisadas.", + "{title} now runs from {start} to {end}": "{title} dura ussa dals {start} fin ils {end}", + "Auto-scheduling": "Planisaziun automatica", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Sche activà, porscha in termin pli tard sin la lingia da temp da spustar er las incumbensas ch'el blochescha.", + "Move blocked tasks along when a task slips": "Spustar incumbensas blocadas cur ch'ina incumbensa sa retarda", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Sin la lingia da temp porscha in termin pli tard da spustar las incumbensas blocadas. Mo colliaziuns \"blochescha\" quintan, e las incumbensas vegnan mo spustadas pli tard.", + "Move the tasks that wait for {title}?": "Spustar las incumbensas che spetgan {title}?", + "These tasks wait for it and would start after its new due date:": "Questas incumbensas spetgan sin quella e cumenzassan suenter il nov termin:", + "{count} tasks would move; the first {limit} are listed.": "{count} incumbensas vegnissan spustadas; las emprimas {limit} èn enumeradas.", + "Now": "Uss", + "After the move": "Suenter il spustament", + "Only this task": "Mo questa incumbensa", + "Move all": "Spustar tut", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Fermà tar {title}: las datas n'han betg pudì vegnir memorisadas. Las incumbensas avant èn vegnidas spustadas.", + "Cumulative flow": "Flux cumulativ", + "Show as chart": "Mussar sco diagram", + "Show as table": "Mussar sco tabella", + "Tasks per column per day": "Incumbensas per colonna per di", + "Tasks without recorded history in this period: {count}": "Incumbensas senza istorgia registrada en questa perioda: {count}", + "Lead and cycle time": "Temp da furniziun e temp da ciclus", + "No tasks were finished in this period.": "En questa perioda n'è nagina incumbensa vegnida terminada.", + "Finished tasks": "Incumbensas terminadas", + "Cycle time, average": "Temp da ciclus, media", + "Cycle time, 85th percentile": "Temp da ciclus, 85avel percentil", + "Lead time, average": "Temp da furniziun, media", + "Tasks whose finish time was estimated from their history: {count}": "Incumbensas, da las qualas il temp da fin è vegnì stimà da l'istorgia: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Temp da ciclus da mintga incumbensa terminada, cun la media ed il 85avel percentil", + "Slowest tasks": "Las incumbensas las pli plaunas", + "cycle {cycle}, lead {lead}": "ciclus {cycle}, furniziun {lead}", + "{days} days": "{days} dis", + "Could not load the flow of this project.": "Betg pussaivel da chargiar il flux da quest project.", + "Last {days} days": "Ultims {days} dis", + "Portfolio flow": "Flux dal portfolio", + "An admin adds portfolios under Projects, Portfolios.": "In administratur agiunta portfolios sut Projects, Portfolios.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projects betg mussads, perquai ch'i vegnan mussads maximalmain 50 a la giada: {count}", + "Could not load the flow of this portfolio.": "Betg pussaivel da chargiar il flux da quest portfolio.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flux cumulativ e temp da ciclus sur ils projects d'in portfolio.", + "Edit report": "Modifitgar il rapport", + "Only tasks where": "Mo incumbensas, nua che", + "Group by": "Gruppar tenor", + "Display": "Visualisaziun", + "Share with everyone who can read its projects": "Parter cun tuts che pon leger ses projects", + "The report could not be saved.": "Il rapport n'ha betg pudì vegnir memorisà.", + "Number of tasks": "Dumber d'incumbensas", + "Bar": "Travs", + "Donut": "Anè", + "Table": "Tabella", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} da {total} projects en quest rapport n'èn betg visibels per tai", + "No tasks match this report.": "Nagina incumbensa na correspunda a quest rapport.", + "None": "Nagin", + "Could not load this report.": "Betg pussaivel da chargiar quest rapport.", + "Report": "Rapport", + "Your reports": "Tes rapports", + "My reports": "Mes rapports", + "Shared reports": "Rapports partids", + "You have not built a report yet.": "Ti n'has anc betg fatg in rapport.", + "Nobody has shared a report with you yet.": "Nagin n'ha anc partì in rapport cun tai.", + "Reports you built over tasks, and the ones shared with you.": "Rapports che ti has fatg davart incumbensas, e quels ch'èn vegnids partids cun tai.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Ina dumonda memorisada davart incumbensas: tge projects, tge filters, gruppà tenor tge, dumbrà u summà, e mussà sco tabella u diagram.", + "The name the report is listed under": "Il num sut il qual il rapport è enumerà", + "What the report shows and who it is for": "Tge ch'il rapport mussa e per tgi ch'el è", + "Nextcloud user id of the person who saved the report": "ID d'utilisader da Nextcloud da la persuna che ha memorisà il rapport", + "Who can open the report": "Tgi che po avrir il rapport", + "Only me": "Mo jau", + "Everyone who can read its projects": "Tuts che pon leger ses projects", + "The projects the report covers, at most fifty": "Ils projects ch'il rapport cumpiglia, maximalmain tschuncanta", + "Filters": "Filters", + "Task fields and the value each must equal": "Champs da l'incumbensa e la valur a la quala mintgin sto esser egual", + "The task field the report groups on": "Il champ da l'incumbensa tenor il qual il rapport gruppescha", + "Count the tasks, or add up a number on them": "Dumbrar las incumbensas u summar in dumber sin ellas", + "Sum": "Summa", + "Sum of": "Summa da", + "The number added up when the measure is a sum": "Il dumber che vegn summà, sch'la mesira è ina summa", + "Story points": "Puncts d'istorgia", + "Estimated duration": "Durada stimada", + "How the report is shown": "Co ch'il rapport vegn mussà", + "Issue type": "Tip da dumonda", + "Task fields and the value each must equal; empty when the report covers every task": "Champs da la lavur e la valur che mintga champ sto avair; vid sch'il rapport cumpiglia tut las lavurs", + "The status a task must have": "Il status che ina lavur sto avair", + "The priority a task must have": "La prioritad che ina lavur sto avair", + "The user a task must be assigned to": "L'utilisader al qual ina lavur sto esser attribuida", + "A label a task must carry": "Ina etichetta che ina lavur sto purtar", + "The board column a task must be in": "La colonna da la tavla en la quala ina lavur sto esser", + "The issue type a task must have": "Il tip da dumonda che ina lavur sto avair", + "Manager groups": "Gruppas da manaschers", + "Member groups": "Gruppas da commembers", + "Viewer groups": "Gruppas da lecturs", + "Viewers": "Lecturs", + "Owning group": "Gruppa da possessur", + "Nextcloud groups whose members manage the project": "Gruppas Nextcloud dals quals ils commembers mainan il project", + "Nextcloud groups whose members work on the project": "Gruppas Nextcloud dals quals ils commembers lavuran vi dal project", + "Nextcloud groups whose members may read the project": "Gruppas Nextcloud dals quals ils commembers dastgan leger il project", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utilisaders Nextcloud che mainan il project: parameters, commembers e lavur", + "Nextcloud user ids who may read the project and its work but not change it": "Utilisaders Nextcloud che dastgan leger il project e sia lavur, ma betg midar", + "The Nextcloud group that owns the project with its creator, at most one": "La gruppa Nextcloud che possede il project ensemen cun ses creader, maximalmain ina", + "Nextcloud user ids who may read this through the project": "Utilisaders Nextcloud che dastgan leger quai tras il project", + "Nextcloud groups whose members may change this through the project": "Gruppas Nextcloud dals quals ils commembers dastgan midar quai tras il project", + "Nextcloud groups whose members may read this through the project": "Gruppas Nextcloud dals quals ils commembers dastgan leger quai tras il project", + "Search for a person or a group…": "Tschertgar ina persuna u ina gruppa…", + "No one found. Your admin's sharing settings decide who you can find.": "Nagin chattà. Las configuraziuns da cundivisiun da tes administratur decidan tgi che ti pos chattar.", + "Type at least two characters": "Endatescha almain dus caracters", + "Everyone in this group": "Tuts en questa gruppa", + "Could not search for people. Please try again.": "Betg reussì da tschertgar persunas. Emprova anc ina giada.", + "Could not remove the group": "Betg reussì dad allontanar la gruppa", + "Only the owner and managers change who is on this project.": "Mo il possessur ed ils administraturs midan tgi che è en quest project.", + "Role of {name}": "Rolla da {name}", + "Manager": "Administratur", + "Member": "Commember", + "Viewer": "Lectur", + "Could not change the role": "Betg reussì da midar la rolla", + "Owned by group: {name}": "En possess da la gruppa: {name}", + "No group owns this project.": "Nagina gruppa n'è possessura da quest project.", + "Owned by group": "En possess da la gruppa", + "Search for a group…": "Tschertgar ina gruppa…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Chattà nagina gruppa. Las configuraziuns da cundivisiun da tes administratur decidan tge gruppas che ti pos chattar.", + "No owning group": "Nagina gruppa possessura", + "Could not search for groups. Please try again.": "Impussibel da tschertgar gruppas. Emprova anc ina giada.", + "Could not change the owning group": "Impussibel da midar la gruppa possessura", + "You can read this project. Only its members change it.": "Ti pos leger quest project. Mo ses commembers al midan.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il curs che vegn instruì en questa lecziun, per exempel ina materia facultativa, sche l'app d'emprender da la scola al enconuscha.", + "Online meeting link": "Link a la lecziun online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Nua che las scolaras ed ils scolars sa participeschan online a questa lecziun. Il buttun Participar cumpara mo per in link https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/rm.json b/l10n/rm.json index ebbfc633..8c6220a5 100644 --- a/l10n/rm.json +++ b/l10n/rm.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Projects activs", + "Archived projects": "Projects archivads", + "Boards": "Tavlas", + "My projects": "Mes projects", + "Portfolio": "Portfolio", + "Project board": "Tavla dal project", + "Projects I am in": "Projects en ils quals jau sun involvà", + "Timeline": "Lingia dal temp", + "Timesheet": "Register da temp", + "Features & roadmap": "Funcziuns e plan da svilup", + "Flow": "Flux", + "Flows": "Fluxs", + "Reports": "Rapports", + "Pick a report to open it.": "Tscherni in rapport per l'avrir.", + "In progress": "En lavur", + "Date": "Data", + "Due": "Termin", + "Assignee": "Attribuì a", + "Who": "Tgi", + "What": "Tge", + "Minutes": "Minutas", + "Entries": "Endataziuns", + "Most recent": "Ils pli novs", + "Per person": "Per persuna", + "By status": "Tenor il status", + "By priority": "Tenor la prioritad", + "Task status": "Status dals incumbens", + "Time spent": "Temp duvrà", + "Capacity": "Capacitad", + "Due soonest": "Termin pli datier", + "Minutes logged": "Minutas registradas", + "Nothing is due": "Nagut n'è da terminar", + "Nothing logged yet": "Anc nagut registrà", + "What is open, what is blocked, and what is overdue.": "Tge ch'è avert, tge ch'è bloccà e tge ch'è memia tard.", + "How allocation is spread across the people working on projects.": "Co che la chargia è repartida tranter las persunas che lavuran a projects.", + "Hours logged, and the projects they went to.": "Las uras registradas ed ils projects vi dals quals ellas èn ìdas.", + "Billable": "Facturabel", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Chargiar ils projects", + "No projects for this client yet": "Anc nagins projects per quest client", + "Open in Planninq": "Avrir en Planninq", + "This project could not be found": "Quest project n'è betg vegnì chattà", + "Untitled project": "Project senza titel", + "and {count} more": "e {count} dapli", + "Store": "Butia", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installescha registers, schemas e process ch'autras organisaziuns han publitgà.", + "Work Date": "Data da lavur", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Acziuns da la colonna", + "Columns": "Colonnas", + "Could not remove the column. Please try again.": "La colonna n'ha betg pudì vegnir allontanada. Empruvai anc ina giada.", + "Could not save the column. Please try again.": "La colonna n'ha betg pudì vegnir memorisada. Empruvai anc ina giada.", + "Done column": "Colonna terminà", + "Edit column": "Modifitgar la colonna", + "Keep the card's status": "Mantegnair il status da la carta", + "Move its cards to": "Spustar sias cartas en", + "Move left": "Spustar a sanestra", + "Move right": "Spustar a dretga", + "Status of cards moved here": "Status da las cartas spustadas qua", + "The last done column cannot be removed.": "L'ultima colonna terminà na po betg vegnir allontanada.", + "WIP limit": "Limita WIP", + "over limit": "sur la limita", + "The status a card gets when it is moved into this column.": "Il status che ina carta survegn cura ch'ella vegn spustada en questa colonna.", + "All priorities": "Tut las prioritads", + "Could not create the task. Please try again.": "L'incumbensa n'ha betg pudì vegnir creada. Empruvai anc ina giada.", + "Created": "Creà", + "Move to backlog": "En il backlog", + "Move to board": "Sin la tavla", + "New task": "Nova incumbensa", + "Nothing in the backlog": "Nagut en il backlog", + "Rank": "Rang", + "Sort by": "Zavrar tenor", + "Sort by rank to reorder": "Zavrai tenor rang per midar la successiun", + "Task actions": "Acziuns da l'incumbensa", + "All labels": "Tut las etichettas", + "Filter tasks by label": "Filtrar las incumbensas tenor etichetta", + "View timeline": "Mussar la cronologia", + "Board": "Tavla", + "List": "Glista", + "Column": "Colonna", + "Board or list": "Tavla u glista", + "Log": "Protocol", + "Add entry": "Agiuntar ina inscripziun", + "Show": "Mussar", + "No actions yet": "Anc naginas acziuns", + "Closed": "Serrà", + "Entry actions": "Acziuns da l'inscripziun", + "Add action": "Agiuntar ina acziun", + "by {author}": "da {author}", + "saved {time}": "memorisà {time}", + "Attendees: {names}": "Participants: {names}", + "Add the first entry": "Agiuntar l'emprima inscripziun", + "Issues": "Problems", + "Lessons learned": "Enconuschientschas", + "Meetings": "Sesidas", + "Decisions": "Decisiuns", + "Actions": "Acziuns", + "Issue": "Problem", + "Lesson learned": "Enconuschientscha", + "Meeting": "Sesida", + "Decision": "Decisiun", + "About this project": "Davart quest project", + "No description yet": "Anc nagina descripziun", + "Start date": "Data da cumenzament", + "Not set": "Betg definì", + "End date": "Data da fin", + "Progress": "Progress", + "No tasks yet": "Anc naginas incumbensas", + "Open the board": "Avrir la tavla", + "People": "Persunas", + "Owner": "Possessur", + "Latest log entries": "Ultimas inscripziuns", + "Open the log": "Avrir il protocol", + "{done} of {total} tasks done": "{done} da {total} incumbensas terminadas", + "Edit entry": "Modifitgar l'inscripziun", + "Type": "Gener", + "Attendees": "Participants", + "Issue is closed": "Il problem è serrà", + "Could not save the entry. Please try again.": "L'inscripziun n'ha betg pudì vegnir memorisada. Empruvai anc ina giada.", + "From: {title}": "Da: {title}", + "What needs to happen": "Tge che sto succeder", + "Could not create the action. Please try again.": "L'acziun n'ha betg pudì vegnir creada. Empruvai anc ina giada.", + "The action was created but could not be linked to the entry.": "L'acziun è vegnida creada, ma n'ha betg pudì vegnir colliada cun l'inscripziun.", + "Project pages": "Paginas dal project", + "Overview": "Survista", + "Risks": "Ristgs", + "Log entry": "Inscripziun dal protocol", + "A short name for the entry": "In num curt per l'inscripziun", + "Project": "Project", + "The project this entry belongs to": "Il project al qual l'inscripziun appartegna", + "What kind of entry this is": "Tge gener d'inscripziun che quai è", + "When it happened": "Cura che quai è capità", + "What happened, in Markdown": "Tge ch'è capità, en Markdown", + "Whether an issue is still open": "Sch'in problem è anc avert", + "The people at a meeting": "Las persunas ad ina sesida", + "Tasks that came out of this entry": "Incumbensas ch'èn resultadas da questa inscripziun", + "Add risk": "Agiuntar in ristg", + "Risk": "Ristg", + "Score": "Puncts", + "Response": "Reacziun", + "Review date": "Data da revisiun", + "no longer on the project": "betg pli en il project", + "Edit {title}": "Modifitgar {title}", + "No risks recorded yet": "Anc nagins ristgs registrads", + "Add the first risk": "Agiuntar l'emprim ristg", + "Medium": "Mesaun", + "Mitigating": "Vegn mitigà", + "Occurred": "Succedì", + "Avoid": "Evitar", + "Reduce": "Reducir", + "Transfer": "Transferir", + "Accept": "Acceptar", + "Highest open risks": "Ils pli auts ristgs averts", + "No open risks": "Nagins ristgs averts", + "Open the risk register": "Avrir il register da ristgs", + "Edit risk": "Modifitgar il ristg", + "What could go wrong": "Tge che pudess ir mal", + "Likelihood": "Probabilitad", + "Impact": "Effect", + "Score {score}": "Puncts {score}", + "Countermeasures": "Contramesiras", + "Could not save the risk. Please try again.": "Il ristg n'ha betg pudì vegnir memorisà. Empruvai anc ina giada.", + "Risks by likelihood and impact": "Ristgs tenor probabilitad ed effect", + "Risk scale": "Scala da ristg", + "The levels every project scores its risks on, and where low turns into medium and high": "Ils nivels sin ils quals mintga project valitescha ses ristgs, e nua che bass daventa mesaun ed aut", + "Number of levels": "Dumber da nivels", + "Likelihood labels": "Etichettas da probabilitad", + "Impact labels": "Etichettas d'effect", + "Level {level}": "Nivel {level}", + "Medium from score": "Mesaun a partir dals puncts", + "High from score": "Aut a partir dals puncts", + "Risk scale saved": "Scala da ristg memorisada", + "1 risk uses level {level}. Change it first.": "1 ristg dovra il nivel {level}. Midai el l'emprim.", + "{count} risks use level {level}. Change them first.": "{count} ristgs dovran il nivel {level}. Midai els l'emprim.", + "Every level needs a label, and high must start above medium.": "Mintga nivel dovra ina etichetta, ed aut sto cumenzar sur mesaun.", + "The project this risk belongs to": "Il project al qual quest ristg appartegna", + "The cause and the effect, in Markdown": "La chaschun e l'effect, en Markdown", + "Category": "Categoria", + "A free grouping, such as planning, budget or supplier": "Ina gruppaziun libra, sco planisaziun, budget u furnitur", + "How likely it is, on the admin's risk scale": "Co probabel ch'el è, sin la scala da ristg da l'administratur", + "How hard it would hit, on the admin's risk scale": "Co ferm ch'el pertutgass, sin la scala da ristg da l'administratur", + "Likelihood times impact, calculated by the server": "Probabilitad giada effect, calculà dal server", + "Where the risk stands": "Nua ch'il ristg stat", + "The person who watches this risk": "La persuna che surveglia quest ristg", + "How the project answers the risk": "Co ch'il project reagescha sin il ristg", + "What is done to prevent it or soften it, in Markdown": "Tge che vegn fatg per al impedir u mitigiar, en Markdown", + "When to look at this risk again": "Cura revair danovamain quest ristg", + "Very low": "Fitg bass", + "Very high": "Fitg aut", + "All projects": "Tut ils projects", + "Project status report": "Rapport da status dal project", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "In rapport datà davart co in project stat cun daners, organisaziun, temp, infurmaziun, qualitad e ristg (ils aspects GROTIK), mintgin cun ina notizia.", + "The project this report is about": "Il project dal qual il rapport tracta", + "Report date": "Data dal rapport", + "The day the report describes": "Il di che il rapport descriva", + "Money": "Daners", + "How the project stands on this aspect": "Co il project stat en quest aspect", + "On track": "Tenor plan", + "At risk": "En privel", + "Off track": "Ordaifer il plan", + "Money note": "Notizia davart ils daners", + "A short explanation of this status": "Ina curta explicaziun da quest status", + "Organisation": "Organisaziun", + "Organisation note": "Notizia davart l'organisaziun", + "Time": "Temp", + "Time note": "Notizia davart il temp", + "Information": "Infurmaziun", + "Information note": "Notizia davart l'infurmaziun", + "Quality": "Qualitad", + "Quality note": "Notizia davart la qualitad", + "Risk note": "Notizia davart il ristg", + "Overall": "Total", + "The worst of the six statuses, calculated by the server": "Il mender dals sis status, calculà dal server", + "Health: money": "Sanadad: daners", + "Copied from the newest status report": "Copià dal rapport da status il pli nov", + "Health: organisation": "Sanadad: organisaziun", + "Health: time": "Sanadad: temp", + "Health: information": "Sanadad: infurmaziun", + "Health: quality": "Sanadad: qualitad", + "Health: risk": "Sanadad: ristg", + "Health: overall": "Sanadad: total", + "Health: report date": "Sanadad: data dal rapport", + "The date of the newest status report": "La data dal rapport da status il pli nov", + "New report": "Nov rapport", + "Only the project owner writes status reports.": "Mo il possessur dal project scriva rapports da status.", + "Latest report, {date}": "Ultim rapport, {date}", + "Aspect": "Aspect", + "Note": "Notizia", + "Report history": "Istorgia dals rapports", + "Author": "Autur", + "No status reports yet": "Anc nagins rapports da status", + "Write the first report": "Scriver l'emprim rapport", + "Choose a status for every aspect to save the report.": "Tscherna in status per mintga aspect per memorisar il rapport.", + "Suggested: on track.": "Proposta: tenor plan.", + "Suggested: at risk.": "Proposta: en privel.", + "Suggested: off track.": "Proposta: ordaifer il plan.", + "1 task is past its due date.": "1 incumbensa ha surpassà il termin.", + "{count} tasks are past their due date.": "Incumbensas che han surpassà il termin: {count}.", + "The end date has passed with 1 open task.": "La data da fin è passada cun 1 incumbensa averta.", + "The end date has passed with {count} open tasks.": "La data da fin è passada, incumbensas avertas: {count}.", + "No open task is past its due date.": "Nagina incumbensa averta n'ha surpassà il termin.", + "The highest open risk, \"{title}\", scores {score}.": "Il pli aut ristg avert, \"{title}\", ha la valur {score}.", + "There are no open risks.": "I na dat nagins ristgs averts.", + "Costs are at {percent}% of the budget.": "Ils custs èn tar {percent}% dal budget.", + "No suggestion: the project has no budget.": "Nagina proposta: il project n'ha nagin budget.", + "No suggestion: no costs are recorded for this project yet.": "Nagina proposta: per quest project n'èn anc nagins custs registrads.", + "The report was not saved. Only the project owner can write status reports.": "Il rapport n'è betg vegnì memorisà. Mo il possessur dal project po scriver rapports da status.", + "No report": "Nagin rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Ina gruppa da projects manads da las medemas persunas, per exempel in departament u in program. Ses responsabels legian mintga project en ella.", + "The name of the portfolio": "Il num dal portfolio", + "What the portfolio holds and who runs it": "Tge ch'il portfolio cuntegna e tgi ch'al maina", + "A colour for the portfolio's section in project lists": "Ina colur per la secziun dal portfolio en glistas da projects", + "Managers": "Responsabels", + "Nextcloud user UIDs of the people who run the portfolio": "IDs d'utilisaders Nextcloud da las persunas che mainan il portfolio", + "Order": "Urden", + "Where the portfolio comes in project lists, lowest first": "Nua ch'il portfolio stat en glistas da projects, il pli bass l'emprim", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "L'atgna scala da ristgs da quest portfolio sco JSON, en la medema furma sco quella da l'entira app. Vid significa la scala da l'app.", + "Portfolio readers": "Lecturs dal portfolio", + "Nextcloud user UIDs of the managers of the project's portfolio": "IDs d'utilisaders Nextcloud dals responsabels dal portfolio dal project", + "The portfolio this project belongs to": "Il portfolio al qual quest project appartegna", + "No portfolio": "Nagin portfolio", + "All portfolios": "Tut ils portfolios", + "You read this project as a manager of its portfolio. Only its members change it.": "Vus legis quest project sco responsabel da ses portfolio. Mo ses commembers al midan.", + "Portfolios": "Portfolios", + "Portfolio status": "Status dal portfolio", + "No portfolios yet": "Anc nagins portfolios", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "In administratur agiunta portfolios sut Projects, Portfolios. Ils projects d'in portfolio èn enumerads qua cun lur status.", + "Roll-up": "Resumaziun", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} tenor plan, {atRisk} en privel, {offTrack} ordaifer il plan, {noReport} senza rapport", + "No project in this portfolio that you can read.": "Nagin project en quest portfolio che ti pos leger.", + "Start": "Entschatta", + "End": "Fin", + "Budget": "Budget", + "Last report": "Ultim rapport", + "Out of date": "Antiquà", + "Portfolio timeline": "Lingia da temp dal portfolio", + "Zoom": "Zoom", + "Could not load the timeline": "Impussibel da chargiar la lingia da temp", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "In administratur agiunta portfolios sut Projects, Portfolios. Ils projects d'in portfolio èn mussads qua sin ina lingia da temp.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Avra in project per vesair sias fasas e lezias. La lingia da temp è mo per leger.", + "Phase: {title}": "Fasa: {title}", + "Left out because you cannot read them: {count} projects": "Laschads davent perquai che ti na pos betg als leger: {count} projects", + "Week": "Emna", + "Day": "Di", + "Month": "Mais", + "Please try again later.": "Emprova pli tard anc ina giada.", + "Status reports": "Rapports da status", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Suenter quants dis ch'il davos rapport da status d'in project vegn marcà sco antiquà en la survista dal portfolio", + "Reporting period (days)": "Perioda da rapport (dis)", + "The reporting period is a whole number of days from 1 to 365.": "La perioda da rapport è in dumber entir da dis da 1 fin 365.", + "Reporting period saved": "Perioda da rapport memorisada", + "The reporting period was not saved. Please try again.": "La perioda da rapport n'è betg vegnida memorisada. Emprova anc ina giada.", + "Every project of a portfolio with its status per aspect, rolled up.": "Mintga project d'in portfolio cun ses status per aspect, resumà.", + "The projects of a portfolio on one timeline.": "Ils projects d'in portfolio sin ina lingia da temp.", + "Phases": "Fasas", + "Add phase": "Agiuntar ina fasa", + "No phases yet": "Anc naginas fasas", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Parta il project en fasas, sco iniziaziun, definiziun e realisaziun. Ina fasa vegn serrada uschespert che ses document da conclusiun è chargià si.", + "{hours} hours": "{hours} uras", + "Concluding document: {title}": "Document da conclusiun: {title}", + "Concluding document missing": "Document da conclusiun manca", + "Move {title} up": "Spustar {title} ensi", + "Move {title} down": "Spustar {title} engiu", + "Close phase": "Serrar la fasa", + "Phase": "Fasa", + "Files": "Datotecas", + "Notes": "Notizias", + "Audit trail": "Protocol da revisiun", + "Edit phase": "Modifitgar la fasa", + "Name": "Num", + "Budget hours": "Uras budgetadas", + "Could not save the phase. Please try again.": "Impussibel da memorisar la fasa. Emprova anc ina giada.", + "Close phase {title}": "Serrar la fasa {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Ina fasa vegn serrada cun ses document da conclusiun: chargia el si qua u tscherna ina da las datotecas da la fasa.", + "Concluding document": "Document da conclusiun", + "This phase has no files yet.": "Questa fasa n'ha anc naginas datotecas.", + "Upload a document": "Chargiar si in document", + "The document was not uploaded. Please try again.": "Il document n'è betg vegnì chargià si. Emprova anc ina giada.", + "Upload the concluding document before you close this phase.": "Chargia si il document da conclusiun avant che serrar questa fasa.", + "This phase cannot be closed from its current status.": "Questa fasa na po betg vegnir serrada da ses status actual.", + "The phase was not closed. Please try again.": "La fasa n'è betg vegnida serrada. Emprova anc ina giada.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "L'ID da la datoteca da questa fasa che la conclusiuna. La fasa po vegnir terminada pir cura ch'el è inditgà e la datoteca agiuntada.", + "Import from Microsoft Project": "Importar da Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Tscherni in plan memorisà da Microsoft Project en il format XML. Nagut na vegn importà avant che Vus confermais.", + "Plan file": "Datoteca dal plan", + "What the import creates": "Tge che l'import creescha", + "Tasks": "Incumbensas", + "Sub-tasks": "Sutincumbensas", + "Milestones": "Tappas", + "Links": "Colliaziuns", + "Already imported, updated in place: {count}": "Gia importà, actualisà al lieu: {count}", + "What does not carry over": "Tge che na vegn betg surpiglià", + "Tasks with resources, which are not imported: {count}": "Incumbensas cun resursas, che na vegnan betg importadas: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Incumbensas pli profundas che il nivel 3, plazzadas sut lur incumbensa dal nivel 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Colliaziuns auter che fin-cumenzament, importadas sco colliaziuns parentadas: {count}", + "Link lags, which are dropped: {count}": "Retardaziuns da colliaziuns, che crodan davent: {count}", + "Links to a summary task, which are not imported: {count}": "Colliaziuns cun ina incumbensa da resumaziun, che na vegnan betg importadas: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Colliaziuns cun incumbensas ordaifer quest plan, che na vegnan betg importadas: {count}", + "No longer in the plan": "Betg pli en il plan", + "These stay in the project; remove them yourself if they are no longer needed.": "Quellas restan en il project; allontanai ellas sez, sch'ellas na vegnan betg pli duvradas.", + "Import": "Importar", + "Close": "Serrar", + "The plan is imported: {created} created, {updated} updated.": "Il plan è importà: {created} creadas, {updated} actualisadas.", + "Links that would close a loop were left out: {count}": "Colliaziuns che serrassan in circul èn vegnidas laschadas davent: {count}", + "The import stopped part-way. Run it again to finish it.": "L'import è sa fermà a mesa via. Exequì el anc ina giada per al terminar.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Memorisai il plan en Microsoft Project cun Datoteca, Memorisar sco, format XML, ed importai quella datoteca.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Questa datoteca declera in DOCTYPE u entitads, che na vegnan betg acceptadas.", + "The file is larger than 10 MB.": "La datoteca è pli gronda che 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Il plan ha dapli che 2 000 incumbensas, dapli ch'in import prenda.", + "This file is not a Microsoft Project plan in XML format.": "Questa datoteca n'è betg in plan da Microsoft Project en il format XML.", + "Choose a file to import.": "Tscherni ina datoteca per importar.", + "Only the project owner can import a plan.": "Mo il possessur dal project po importar in plan.", + "The plan could not be read. Please try again.": "Il plan n'ha betg pudì vegnir legì. Empruvai anc ina giada.", + "Linked case: {title}": "Cas collià: {title}", + "Linked to a case": "Collià cun in cas", + "Hand over to case": "Surdar al cas", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copiescha senza midadas mintga datoteca dal project e da sias incumbensas, ed ina datoteca che descriva il project, en il cas collià.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Datotecas copiadas: {count}", + "Files that failed: {names}": "Datotecas che n'han betg funcziunà: {names}", + "The handover failed. Please try again.": "La surdada n'ha betg funcziunà. Empruvai anc ina giada.", + "The linked case could not be found, or you cannot open it.": "Il cas collià n'è betg vegnì chattà, u Vus na pudais betg l'avrir.", + "Case handovers": "Surdadas al cas", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Mintga surdada da las datotecas e da las metadatas dal project a ses cas: cura, da tgi, a tge cas, mintga datoteca copiada cun ses SHA-256, e las datotecas che n'han betg funcziunà.", + "Finance": "Finanzas", + "Add cost line": "Agiuntar ina lingia da custs", + "Delivery terms": "Cundiziuns da furniziun", + "Billing model": "Model da facturaziun", + "Budget in euro": "Budget en euro", + "Budget in hours": "Budget en uras", + "Hourly rate in euro": "Tariffa per ura en euro", + "Planned start": "Cumenzament planisà", + "Planned end": "Fin planisada", + "Planned dates": "Datas planisadas", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Nagin budget cunvegnì", + "Hours": "Uras", + "Only the project owner and the portfolio managers see the amounts.": "Mo il possessur dal project ed ils manaschers dal portfolio vesan ils imports.", + "Budget against cost per category": "Budget cunter custs per categoria", + "Labour (booked time)": "Lavur (temp registrà)", + "No category": "Nagina categoria", + "Hours are not available": "Las uras n'èn betg disponiblas", + "Not yet assigned to a category": "Anc betg attribuì ad ina categoria", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} spendì, {remaining} restant", + "Budget against cost per phase": "Budget cunter custs per fasa", + "No phase": "Nagina fasa", + "Cost lines": "Lingias da custs", + "From the finance system": "Dal sistem finanzial", + "Edit cost line {amount}": "Modifitgar la lingia da custs {amount}", + "No cost lines yet": "Anc naginas lingias da custs", + "Commitments": "Obligaziuns", + "Actual cost": "Custs effectivs", + "Forecast": "Prognosa", + "Remaining": "Restant", + "Not planned yet": "Anc betg planisà", + "{start} to {end}": "{start} fin {end}", + "The terms were not saved. Please try again.": "Las cundiziuns n'èn betg vegnidas memorisadas. Emprova anc ina giada.", + "Terms saved": "Cundiziuns memorisadas", + "Fixed price": "Pretsch fix", + "Hourly": "Per ura", + "Not billed": "Betg facturà", + "Commitment": "Obligaziun", + "Edit cost line": "Modifitgar ina lingia da custs", + "Kind": "Gener", + "Amount in euro": "Import en euro", + "Remove": "Allontanar", + "Could not save the cost line. Only the project owner changes the money of a project.": "La lingia da custs n'ha betg pudì vegnir memorisada. Mo il possessur dal project mida ils daners d'in project.", + "Could not remove the cost line. Please try again.": "La lingia da custs n'ha betg pudì vegnir allontanada. Emprova anc ina giada.", + "{amount} over budget": "{amount} sur il budget", + "Cost categories": "Categorias da custs", + "The categories every project splits its budget and costs into, one per line": "Las categorias en las qualas mintga project parta ses budget e ses custs, ina per lingia", + "Categories": "Categorias", + "Give at least one category, each name once.": "Inditgescha almain ina categoria, mintga num ina giada.", + "Cost categories saved": "Categorias da custs memorisadas", + "The cost categories were not saved. Please try again.": "Las categorias da custs n'èn betg vegnidas memorisadas. Emprova anc ina giada.", + "Finance line": "Lingia finanziala", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "In import da daners d'in project: in budget, ina obligaziun, custs effectivs u ina prognosa, en ina categoria da custs e sche giavischà en ina fasa. Endatà dal possessur dal project u tramess dal sistem finanzial tras l'app d'integraziun.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Il project al qual quest import appartegna. Vid per ina lingia dal sistem finanzial, il numer da project da la quala na correspunda a nagin project.", + "The phase this amount belongs to, if any": "La fasa a la quala quest import appartegna, sch'i dat ina", + "The cost category, one of the categories the admin set up": "La categoria da custs, ina da las categorias che l'administratur ha endrizzà", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Sche l'import è in budget, ina obligaziun, custs effectivs u ina prognosa", + "Amount": "Import", + "The amount in the reporting currency (euro)": "L'import en la valuta da rapport (euro)", + "The date the amount was booked or is expected": "La data da la registraziun u da l'aspectativa da l'import", + "What the amount is for": "Per tge che l'import è", + "Whether a person entered the line or the finance system sent it": "Sch'ina persuna ha endatà la lingia u sch'il sistem finanzial l'ha tramessa", + "Entered by hand": "Endatà a maun", + "Finance line id": "Id da la lingia finanziala", + "The finance system's own id of this line. One imported line per id.": "L'agen id da questa lingia en il sistem finanzial. Ina lingia importada per id.", + "Project number": "Numer dal project", + "The project number the finance system sent, matched against the project key": "Il numer dal project ch'il sistem finanzial ha tramess, cumparegià cun la clav dal project", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Il portfolio dal project da la lingia, copià dal project, uschia che las summas dal portfolio dovran in filter", + "Finance readers": "Lecturs da finanzas", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UIDs d'utilisaders da Nextcloud da las persunas che dastgan vesair quest import: il possessur dal project ed ils manaschers da ses portfolio", + "Project owner": "Possessur dal project", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID d'utilisader da Nextcloud dal possessur dal project, che dastga midar ed allontanar lingias manualas", + "How the client pays: not billed, a fixed price, or by the hour.": "Co ch'il client paja: betg facturà, pretsch fix u per ura.", + "Portfolio finance": "Finanzas dal portfolio", + "You cannot see the money of any project in this portfolio": "Ti na vesas ils daners da nagin project en quest portfolio", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Il server ha returnà lingias da custs da projects ordaifer quest portfolio, pertge pon questas summas esser faussas.", + "Projects left out because you cannot see their money: {count}": "Projects laschads davent perquai che ti na vesas betg lur daners: {count}", + "Unmatched finance lines": "Lingias finanzialas betg attribuidas", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, obligaziuns, custs effectivs e prognosa summads per in portfolio.", + "Subprojects": "Sutprojects", + "{done} of {total}": "{done} da {total}", + "{done} of {total} tasks done, including subprojects": "{done} da {total} incumbensas terminadas, inclus ils sutprojects", + "Show the subprojects of {title}": "Mussar ils sutprojects da {title}", + "Hide the subprojects of {title}": "Zuppentar ils sutprojects da {title}", + "Part of": "Part da", + "No parent project": "Nagin project superiur", + "A project cannot sit under one of its own subprojects.": "In project na po betg star sut in da ses agens sutprojects.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projects vegnan ennidads al pli trais nivels: program, project e sutproject.", + "Parent project": "Project superiur", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Il project sut il qual quest project stat, sco in program. Projects vegnan ennidads al pli trais nivels.", + "Yes": "Gea", + "No": "Na", + "{label} (required)": "{label} (obligatoric)", + "{label} is required": "{label} è obligatoric", + "Project field": "Champ da project", + "A field an admin adds to every project, such as a policy area or a contract value.": "In champ che in administratur agiunta a mintga project, sco in sectur politic u ina valur da contract.", + "Key": "Clav", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Il num fix sut il qual la valur vegn memorisada, en lower camel case. Mantegna el, uschespert che projects al dovran.", + "Label": "Etichetta", + "The name people see next to the field": "Il num che la glieud vesa sper il champ", + "What the field holds": "Tge ch'il champ cuntegna", + "Text": "Text", + "Number": "Numer", + "Choice": "Tscherna", + "Person": "Persuna", + "Yes or no": "Gea u na", + "Options": "Opziuns", + "The choices of a choice field": "Las opziuns d'in champ da tscherna", + "Required": "Obligatoric", + "Whether a project must fill in the field": "Sch'in project sto emplenir il champ", + "Where the field appears, lowest first": "Nua ch'il champ cumpara, il pli bass l'emprim", + "Applies to": "Vala per", + "What the field is added to": "Tar tge ch'il champ vegn agiuntà", + "Custom fields": "Agens champs", + "The values of the project fields an admin defined, keyed by the field's key.": "Las valurs dals champs da project che in administratur ha definì, tenor la clav dal champ.", + "Project fields": "Champs da project", + "Related": "Colliads", + "Remove link": "Allontanar la colliaziun", + "Link type": "Tip da colliaziun", + "Relates to": "Collià cun", + "Duplicates": "Duplitgescha", + "Project key": "Clav dal project", + "Every task number starts with it, such as VERG-42.": "Mintga numer d’incumbensa cumenza cun ella, per exempel VERG-42.", + "This key is already used by another project.": "Questa clav vegn gia duvrada d’in auter project.", + "Use 2 to 10 letters and digits, starting with a letter.": "Duvrai 2 fin 10 bustabs e cifras che cumenzan cun in bustab.", + "The key cannot change once tasks carry it.": "La clav na po betg pli midar, uschespert che incumbensas la portan.", + "Project saved. The existing tasks get their numbers in the background.": "Project memorisà. Las incumbensas existentas survegnan lur numers en il fund.", + "Next task number": "Numer da la proxima incumbensa", + "The number the next task of this project gets in its key. Only the system writes it.": "Il numer che la proxima incumbensa da quest project survegn en sia clav. Mo il sistem al scriva.", + "Restore {title}": "Restaurar {title}", + "Restore": "Restaurar", + "Project restored": "Project restaurà", + "Could not restore the project": "Il project n’ha betg pudì vegnir restaurà", + "Bring this project back to the active list.": "Returnar quest project en la glista dals projects activs.", + "Restore project": "Restaurar il project", + "Request reason": "Motiv da la dumonda", + "Why the requester needs this project. Filled in when the project is requested.": "Pertge che la persuna che dumonda dovra quest project. Vegn emplenì cun la dumonda.", + "Reviewed by": "Examinà da", + "The user who approved or rejected the request.": "L’utilisader che ha approvà u refusà la dumonda.", + "Reviewed at": "Examinà ils", + "When the request was approved or rejected.": "Cura che la dumonda è vegnida approvada u refusada.", + "Review note": "Remartga da l’examinatur", + "The reviewer's reason, shown to the requester when a request is not approved.": "Il motiv da l’examinatur, che la persuna che dumonda vesa, sch’ina dumonda na vegn betg approvada.", + "Members of these groups": "Commembers da questas gruppas", + "Groups that may create projects": "Gruppas che dastgan crear projects", + "The group {group} no longer exists. Save to remove it.": "La gruppa {group} n’exista betg pli. Memorisai per l’allontanar.", + "Review project request": "Examinar la dumonda da project", + "Requested by": "Dumandà da", + "Why it is needed": "Pertge ch’el è necessari", + "Desired start date": "Data da cumenzament giavischada", + "Why is it not approved?": "Pertge n’è el betg approvà?", + "Give a reason. The requester sees it.": "Inditgai in motiv. La persuna che dumonda al vesa.", + "Approve": "Approvar", + "Reject": "Refusar", + "Reject request": "Refusar la dumonda", + "The review was not saved. Try again.": "L’examinaziun n’è betg vegnida memorisada. Empruvai anc ina giada.", + "This project is waiting for review": "Quest project spetga l’examinaziun", + "This request was not approved": "Questa dumonda n’è betg vegnida approvada", + "Reason: {note}": "Motiv: {note}", + "Review request": "Examinar la dumonda", + "Request a project": "Dumandar in project", + "Step {step} of 2": "Pass {step} da 2", + "Why is this project needed?": "Pertge è quest project necessari?", + "Give a reason. The reviewer reads it.": "Inditgai in motiv. L’examinatur al legia.", + "Back": "Enavos", + "Next": "Vinavant", + "Send request": "Trametter la dumonda", + "The request was not sent. Try again.": "La dumonda n’è betg vegnida tramessa. Empruvai anc ina giada.", + "Requested": "Dumandà", + "Not approved": "Betg approvà", + "Your request was sent": "Vossa dumonda è vegnida tramessa", + "Let everyone else request a project": "Laschar dumandar tut ils auters in project", + "Add a task": "Agiuntar in pensum", + "Delete task": "Stizzar il pensum", + "Edit task": "Modifitgar il pensum", + "Write": "Scriver", + "Preview": "Prevista", + "Markdown works here: headings, lists and links.": "Qua funcziuna Markdown: titels, glistas e colliaziuns.", + "Could not save the task. Please try again.": "Il pensum n'ha betg pudì vegnir memorisà. Emprova anc ina giada.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Sin \"{title}\" è temp registrà, perquai na po el betg vegnir stizzà. Ti pos al annullar enstagl: las registraziuns da temp restan.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Stizzar \"{title}\"? Sias colliaziuns cun auters pensums vegnan era allontanadas. Quai na po betg vegnir revocà.", + "Keep task": "Tegnair il pensum", + "Cancel task": "Annullar il pensum", + "Only the reporter, the project owner or an admin can delete this task.": "Mo la persuna che l'ha annunzià, il possessur dal project u in administratur po stizzar quest pensum.", + "Could not delete the task. Please try again.": "Il pensum n'ha betg pudì vegnir stizzà. Emprova anc ina giada.", + "Could not cancel the task. Please try again.": "Il pensum n'ha betg pudì vegnir annullà. Emprova anc ina giada.", + "Responsible": "Responsabel", + "Also working on this": "Lavuran era vi", + "Labels": "Etichettas", + "Could not change the priority. Please try again.": "La prioritad n'ha betg pudì vegnir midada. Emprova anc ina giada.", + "Other project members who work on this task alongside the person responsible.": "Auters commembers dal project che lavuran vi da quest pensum ensemen cun la persuna responsabla.", + "Duplicate": "Duplitgar", + "Could not copy the task. Please try again.": "Il pensum n'ha betg pudì vegnir copià. Emprova anc ina giada.", + "Subtasks": "Sutpensums", + "{done} of {total} done": "{done} da {total} terminads", + "Add a subtask": "Agiuntar in sutpensum", + "Checklist": "Glista da controlla", + "Checklist item actions": "Acziuns per l'element da la glista", + "Add a checklist item": "Agiuntar in element a la glista", + "Subtasks: {estimate} estimated, {logged} logged": "Sutpensums: {estimate} stimà, {logged} registrà", + "Total estimate: {total}": "Stima totala: {total}", + "Part of {title}": "Part da {title}", + "Checklist: {count} done": "Glista da controlla: {count} terminads", + "This task has subtasks: {count}.": "Quest pensum ha sutpensums: {count}.", + "Keep subtasks as separate tasks": "Tegnair ils sutpensums sco pensums separads", + "Delete subtasks too": "Stizzar era ils sutpensums", + "Copy of {title}": "Copia da {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Il pensum è vegnì copià, ma betg tut ils sutpensums. Controllescha la copia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Pass pitschens entaifer il pensum. Mintga element ha in id, in text e sch'el è terminà.", + "Open work per person and per project.": "Lavur avert per persuna e per project.", + "View": "Vista", + "By person": "Tenor persuna", + "By project": "Tenor project", + "Hours left": "Uras restantas", + "Tasks without an estimate": "Incumbensas senza stima", + "Due in 14 days": "Scadent en 14 dis", + "Shared": "Cundividì", + "Unassigned": "Betg attribuì", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Igl è mussà la lavur en ils projects che ti vesas. Las uras dumbran per la persuna responsabla; incumbensas cundivididas dumbran senza uras.", + "No open work in these projects.": "Nagina lavur averta en quests projects.", + "Open work": "Lavur averta", + "{count} open tasks": "{count} incumbensas avertas", + "Create a project to see capacity here.": "Creescha in project per vesair qua la capacitad.", + "My tasks": "Mias incumbensas", + "Show all my tasks": "Mussar tut mias incumbensas", + "No tasks assigned to you": "Ti n'has nagina incumbensa attribuida", + "Browse projects": "Tschertgar projects", + "Later": "Pli tard", + "Due {date}": "Scadenza {date}", + "Could not change the status. Please try again.": "Il status n'ha betg pudì vegnir midà. Emprova anc ina giada.", + "Completed today": "Terminà oz", + "My open tasks": "Mias incumbensas avertas", + "My overdue tasks": "Mias incumbensas en retard", + "My tasks in progress": "Mias incumbensas en lavur", + "Pin to the top": "Fixar sisum", + "Unpin": "Distatgar", + "Pinned": "Fixà", + "Actions for {title}": "Acziuns per {title}", + "Could not save your project order. Please try again.": "L'urden da tes projects n'ha betg pudì vegnir memorisà. Emprova anc ina giada.", + "No boards yet": "Anc naginas tavlas", + "Create a project to get a board.": "Creescha in project per survegnir ina tavla.", + "Use the Projects page to create and manage your projects and tasks.": "Dovra la pagina Projects per crear ed administrar tes projects e tias incumbensas.", + "Go to projects": "Ir als projects", + "You are not a member of any projects yet.": "Ti n'es anc commember da nagin project.", + "Could not search for users. Please try again.": "Betg pussaivel da tschertgar utilisaders. Emprova anc ina giada.", + "Project creation is restricted to administrators.": "Mo administraturs pon crear projects.", + "Only the project owner or an administrator can delete this project.": "Mo il possessur dal project u in administratur po stizzar quest project.", + "No projects are available to you yet. Ask an administrator to create one.": "I n'ha anc nagins projects disponibels per tai. Dumonda in administratur da crear in.", + "Due: {date}": "Scadenza: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Incumbensas cun ina data da cumenzament u da scadenza cumparan sin la lingia da temp. Agiunta datas per las vesair qua.", + "You do not have access to this project.": "Ti n'has nagin access a quest project.", + "Zoom level": "Nivel da zoom", + "Unscheduled": "Betg planisà", + "Start: {date}": "Cumenzament: {date}", + "Today": "Oz", + "No scheduled tasks": "Naginas incumbensas planisadas", + "An unexpected error occurred.": "I è capità ina errur nunspetgada.", + "Column {number} name": "Num da la colonna {number}", + "Failed to save creation policy": "La regla da crear n'ha betg pudì vegnir memorisada", + "All authenticated users": "Tut ils utilisaders annunziads", + "Control who may create new projects": "Fixescha tgi che dastga crear novs projects", + "Administrators only": "Mo administraturs", + "Project creation": "Crear projects", + "Allow project creation": "Permetter da crear projects", + "Creation policy saved successfully": "Regla da crear memorisada", + "Initializing…": "Aviar…", + "e.g. 2h 30m, 90m, 1.5h": "p.ex. 2h 30m, 90m, 1.5h", + "Log time": "Registrar temp", + "Save estimate": "Memorisar la stima", + "Logged: {logged}": "Registrà: {logged}", + "over by {amount}": "{amount} surpassà", + "Time tracking": "Registraziun dal temp", + "Estimate": "Stima", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Endatescha ina stima valida (p.ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Endatescha ina durada valida (p.ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "L'inscripziun da temp n'ha betg pudì vegnir memorisada. Emprova anc ina giada.", + "Edit time entry": "Modifitgar l'inscripziun da temp", + "Duration": "Durada", + "Date range": "Perioda", + "Last week": "L'emna passada", + "No time logged": "Nagin temp registrà", + "Log time on a task to see it here.": "Registrescha temp sin ina incumbensa per al vesair qua.", + "To date": "Fin la data", + "This week": "Quest'emna", + "Total: {total}": "Total: {total}", + "From date": "Da la data", + "Custom range": "Perioda individuala", + "All time": "Tut il temp", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Ina incumbensa n'ha betg pudì vegnir stizzada, uschia pon restar datas. Stizza il project anc ina giada.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Ina inscripziun da temp n'ha betg pudì vegnir stizzada, uschia pon restar datas. Stizza il project anc ina giada.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Ina colonna n'ha betg pudì vegnir stizzada, uschia pon restar datas. Stizza il project anc ina giada.", + "Could not delete the project. Please try again.": "Il project n'ha betg pudì vegnir stizzà. Emprova anc ina giada.", + "Notification settings": "Parameters da las notificaziuns", + "Configure when due-date reminders are sent": "Fixescha cura che las regurdientschas da scadenza vegnan tramessas", + "Due-date reminder lead time (hours)": "Temp ordavant da la regurdientscha (uras)", + "Lead time must be between 1 and 336 hours": "Il temp sto esser tranter 1 e 336 uras", + "Reminder lead time saved successfully": "Temp da la regurdientscha memorisà", + "Failed to save reminder lead time": "Betg pussaivel da memorisar il temp da la regurdientscha", + "Notifications": "Notificaziuns", + "Notify me 1 day before a task's due date": "Ma notifitgar 1 di avant la scadenza d'ina incumbensa", + "Draft": "Sboz", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Sche la lecziun è in sboz che mo ses magister vesa, ha lieu u è annullada.", + "New release": "Nova versiun", + "Roadmap chart. The same releases and epics are listed below.": "Diagram dal plan da svilup. Las medemas versiuns ed epics èn enumeradas sutvart.", + "Nothing on the roadmap yet": "Anc nagut sin il plan da svilup", + "Releases with a target date and epics with dated tasks appear here.": "Qua cumparan las versiuns cun ina data da mira ed ils epics cun incumbensas datadas.", + "Releases": "Versiuns", + "No releases yet": "Anc naginas versiuns", + "Target date: {date}": "Data da mira: {date}", + "No target date": "Nagina data da mira", + "Edit {name}": "Modifitgar {name}", + "Mark {name} as released": "Marcar {name} sco publitgada", + "Mark as released": "Marcar sco publitgada", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Anc nagins epics. Avri ina incumbensa per far in epic ord ella.", + "Not scheduled yet": "Anc betg planisà", + "Planned": "Planisada", + "Released": "Publitgada", + "Edit release": "Modifitgar la versiun", + "Target date": "Data da mira", + "Could not save the release. Please try again.": "Betg reussì da memorisar la versiun. Emprova anc ina giada.", + "Every task of this release is done or cancelled.": "Mintga incumbensa da questa versiun è fatga u annullada.", + "Not finished yet: {count}": "Anc betg terminadas: {count}", + "What happens to these tasks?": "Tge capita cun questas incumbensas?", + "Move to {name}": "Spustar en {name}", + "Remove the release": "Allontanar la versiun", + "Keep it on {name}": "Las laschar en {name}", + "Could not mark the release as released. Please try again.": "Betg reussì da marcar la versiun sco publitgada. Emprova anc ina giada.", + "Roadmap": "Plan da svilup", + "Tasks or roadmap": "Incumbensas u plan da svilup", + "Release": "Versiun", + "Epic": "Epic", + "This task is an epic": "Questa incumbensa è in epic", + "A named, dated delivery of a project that its tasks are planned against.": "Ina furniziun d'in project cun num e data, tenor la quala ses incumbensas vegnan planisadas.", + "Name of the release": "Num da la versiun", + "The project this release belongs to": "Il project al qual questa versiun appartegna", + "What this release delivers": "Tge che questa versiun furnescha", + "When work on the release starts": "Cura che la lavur vi da la versiun cumenza", + "The date the release is due": "La data, fin cura che la versiun sto esser pronta", + "Whether the release is planned, released or archived": "Sche la versiun è planisada, publitgada u archivada", + "Released on": "Publitgada ils", + "When the release was marked as released": "Cura che la versiun è vegnida marcada sco publitgada", + "The release this task is planned for": "La versiun per la quala questa incumbensa è planisada", + "Board view options": "Opziuns da la vista da la tavla", + "Colour cards": "Colurar las cartas", + "No colour": "Nagina colur", + "By label": "Tenor etichetta", + "Swimlanes": "Lingias", + "No swimlanes": "Naginas lingias", + "By assignee": "Tenor persuna responsabla", + "By epic": "Tenor epic", + "No assignee": "Betg attribuì", + "No epic": "Nagin epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Las cartas restan en la lingia da lur epic. Midai l'epic sin la pagina da la lavur.", + "Hand over to": "Surdar a", + "Could not save your board view. It applies until you reload.": "Vossa vista da la tavla n'è betg vegnida memorisada. Ella vala fin che Vus chargiais da nov.", + "Timetable wish": "Giavisch d'urari", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "In giavisch che il generatur resguarda. In giavisch dir resguarda el adina, in giavisch flexibel nua ch'i va.", + "Whether the wish is about a teacher, a group, a room or one activity": "Sch'il giavisch pertutga in magister, ina gruppa, ina stanza u ina activitad", + "Teacher": "Magister", + "Group": "Gruppa", + "Reference": "Referenza", + "The user, group, room or activity the wish is about": "L'utilisader, la gruppa, la stanza u l'activitad dal giavisch", + "What the wish asks for": "Tge ch'il giavisch dumonda", + "Not on these periods": "Betg en questas uras", + "Preferably not on these periods": "Plitost betg en questas uras", + "At most a number of lessons a day": "Maximalmain in dumber d'uras per di", + "No free periods between lessons": "Naginas uras libras tranter las lecziuns", + "Always the same room": "Adina la medema stanza", + "Periods": "Uras", + "The periods of the week the wish is about, such as wed-5": "Las uras da l'emna dal giavisch, per exempel wed-5", + "Limit": "Limita", + "The most lessons a day, for a wish of that kind": "Il dumber maximal d'uras per di, per in giavisch da quella sort", + "Strength": "Fermezza", + "Whether the generator must keep the wish or should keep it": "Sch'il generatur sto u duess resguardar il giavisch", + "Hard": "Dir", + "Soft": "Flexibel", + "Weight": "Paisa", + "How much a soft wish counts, from 1 to 3": "Quant ch'in giavisch flexibel quinta, da 1 fin 3", + "Why the wish exists": "Pertge ch'il giavisch exista", + "Timetable scenario": "Scenari d'urari", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "In model d'emna, fatg dal generatur u prendì da l'urari actual. El tegna sias datas d'entrada e quant bain ch'el resguarda ils giavischs.", + "The name timetablers know the scenario by": "Il num sut il qual ils planisaders enconuschan il scenari", + "Whether the generator made it or it came from the current timetable": "Sch'il generatur l'ha fatg u sch'el deriva da l'urari actual", + "Generated": "Generà", + "From the current timetable": "Da l'urari actual", + "Week of": "Emna dals", + "The Monday of the first week of the window": "Il glindesdi da l'emprima emna da la perioda", + "Window start": "Entschatta da la perioda", + "The first day the week pattern applies to": "L'emprim di che il model d'emna vala", + "Window end": "Fin da la perioda", + "The last day the week pattern applies to": "L'ultim di che il model d'emna vala", + "Waiting, generating, done, failed, or published as draft lessons": "En spetga, vegn generà, finì, fallì u publitgà sco lecziuns sbozz", + "Waiting": "En spetga", + "Generating": "Vegn generà", + "Failed": "Fallì", + "Published": "Publitgà", + "Seed": "Grauna", + "The number the generator starts from, so a run can be repeated": "Il dumber cun il qual il generatur cumenza, per che in currer possia vegnir repetì", + "Input": "Entrada", + "The periods, rooms, lessons and wishes the scenario was made from": "Las uras, stanzas, lecziuns e giavischs dals quals il scenari è nà", + "Placements": "Plazzaments", + "Each lesson with the period and room it was given": "Mintga lecziun cun l'ura e la stanza ch'ella ha survegnì", + "Unplaced lessons": "Lecziuns betg plazzadas", + "Lessons without a place, each with the hard wish that blocked it": "Lecziuns senza plazza, mintgina cun il giavisch dir che l'ha bloccada", + "Broken wishes": "Giavischs violads", + "The wishes this scenario breaks, with the lessons that break them": "Ils giavischs che quest scenari violescha, cun las lecziuns pertutgadas", + "Measures": "Mesiras", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Lecziuns plazzadas, giavischs violads, uras libras dals magisters, lecziuns per di e utilisaziun da las stanzas", + "Reason": "Motiv", + "Why the run failed": "Pertge ch'il currer è fallì", + "Published at": "Publitgà ils", + "When the scenario was written out as draft lessons": "Cura ch'il scenari è vegnì scrit sco lecziuns sbozz", + "Edit wish": "Modifitgar il giavisch", + "New wish": "Nov giavisch", + "Hard: the generator always keeps it": "Obligatoric: il generatur al resguarda adina", + "Soft: the generator keeps it where it can": "Flexibel: il generatur al resguarda nua ch'el po", + "Weight (1 to 3)": "Paisa (1 fin 3)", + "Most lessons a day": "Il pli bler lecziuns per di", + "Period": "Ura", + "{day} period {number}": "{day} ura {number}", + "Teacher (user name)": "Magister (num d'utilisader)", + "Activity (group:subject)": "Activitad (gruppa:rom)", + "Say who or what the wish is about.": "Inditgai per tgi u tge ch'il giavisch vala.", + "Choose at least one period.": "Tscherni almain ina ura.", + "The limit is a whole number of 1 or more.": "La limita è in dumber entir da 1 u dapli.", + "Timetable": "Plan d'uras", + "Wishes": "Giavischs", + "Timetable wishes": "Giavischs per il plan d'uras", + "Generator run": "Lantschada dal generatur", + "Generator progress": "Progress dal generatur", + "The run failed: {reason}": "La lantschada n'è betg reussida: {reason}", + "{placed} of {lessons} lessons placed": "{placed} da {lessons} lecziuns plazzadas", + "Generate again": "Generar danovamain", + "Generate": "Generar", + "Every lesson has a place.": "Mintga lecziun ha in plaz.", + "Lesson": "Lecziun", + "No free period and room": "Nagina ura e nagina stanza libra", + "Broken soft wishes": "Giavischs flexibels violads", + "Every soft wish is kept.": "Mintga giavisch flexibel vegn resguardà.", + "Wish": "Giavisch", + "Lessons": "Lecziuns", + "Generating: {percent}% of the time budget used": "Generescha: {percent}% dal temp duvrà", + "Waiting to start": "Spetga sin il cumenzament", + "Published as draft lessons": "Publitgà sco sbozs da lecziuns", + "Could not read the scenario.": "Il scenari n'ha betg pudì vegnir legì.", + "Could not start the run.": "La lantschada n'ha betg pudì vegnir cumenzada.", + "Scenarios": "Scenaris", + "Timetable scenarios": "Scenaris dal plan d'uras", + "Scenario": "Scenari", + "Take the current timetable": "Surpigliar l'urari actual", + "Could not take the current timetable.": "Impussibel da surpigliar l'urari actual.", + "Broken hard wishes": "Giavischs obligatorics violads", + "Not on a period of the week grid": "Betg sin ina lecziun da la grilla da l'emna", + "Compare scenarios": "Cumparegliar scenaris", + "Scenarios to compare": "Scenaris da cumparegliar", + "Choose two or three scenarios to compare them.": "Tscherni dus u trais scenaris per als cumparegliar.", + "Measure": "Mesira", + "Best": "Il meglier", + "Lessons that differ": "Lecziuns che sa distinguan", + "No lesson differs.": "Nagina lecziun na sa distingua.", + "Not placed": "Betg plazzà", + "{period} in {room}": "{period} en {room}", + "Lessons placed": "Lecziuns plazzadas", + "Lessons without a place": "Lecziuns senza plaz", + "Clashes": "Conflicts", + "Hard wishes broken": "Giavischs obligatorics violads", + "Soft wishes broken": "Giavischs flexibels violads", + "Soft wishes broken, weighted": "Giavischs flexibels violads, ponderads", + "Free periods between lessons, all teachers": "Uras libras, tut ils magisters", + "Most free periods of one teacher": "Il pli bler uras libras d'in magister", + "Most lessons of one group on a day": "Il pli bler lecziuns d'ina gruppa en in di", + "Room use": "Utilisaziun da las stanzas", + "Publish as draft lessons": "Publitgar sco lecziuns sbozs", + "Draft lessons written: {count}": "Lecziuns sbozs scrittas: {count}", + "Could not publish the scenario.": "Impussibel da publitgar il scenari.", + "Rules": "Reglas", + "Rules for {column}": "Reglas per {column}", + "When a card enters this column": "Cura che ina carta entra en questa colonna", + "Action": "Acziun", + "Set the priority": "Fixar la prioritad", + "Assign to": "Attribuir a", + "Assign the person who moved the card": "Attribuir a la persuna che ha spustà la carta", + "Remove the assignee": "Allontanar la persuna responsabla", + "Add a label": "Agiuntar ina etichetta", + "No longer a project member": "Betg pli commember dal project", + "This label no longer exists": "Questa etichetta n'exista betg pli", + "Add rule": "Agiuntar ina regla", + "Remove rule": "Allontanar la regla", + "No rules yet. Add one to change a card when it enters this column.": "Anc naginas reglas. Agiuntai ina per midar ina carta cura ch'ella entra en questa colonna.", + "Could not save the rules. Please try again.": "Las reglas n'han betg pudì vegnir memorisadas. Empruvai anc ina giada.", + "1 rule runs when a card enters this column": "1 regla vegn exequida cura che ina carta entra en questa colonna", + "{count} rules run when a card enters this column": "{count} reglas vegnan exequidas cura che ina carta entra en questa colonna", + "Rules applied: {changes}": "Reglas applitgadas: {changes}", + "assigned to {name}": "attribuì a {name}", + "assignee removed": "persuna responsabla allontanada", + "priority {priority}": "prioritad {priority}", + "label {label}": "etichetta {label}", + "What happens to a card when it enters this column, applied in list order.": "Tge che capita cun ina carta cura ch'ella entra en questa colonna, en la successiun da la glista.", + "Value": "Valur", + "What the rule does to the card.": "Tge che la regla fa cun la carta.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "La prioritad, l'id da l'utilisader u l'id da l'etichetta che l'acziun dovra; vid per acziuns senza valur.", + "is not": "n'è betg", + "{dimension} is not": "{dimension} n'è betg", + "Saved filters": "Filters memorisads", + "No saved filters yet": "Anc nagins filters memorisads", + "Save filter": "Memorisar il filter", + "Rename \"{name}\"": "Renumnar «{name}»", + "Delete \"{name}\"": "Stizzar «{name}»", + "Clear filters": "Stizzar ils filters", + "Showing {shown} of {total} tasks": "Mussa {shown} da {total} lavurs", + "Me": "Jau", + "No date": "Nagina data", + "Rename saved filter": "Renumnar il filter memorisà", + "Share with the project": "Parter cun il project", + "Give the filter a name": "Dai in num al filter", + "Could not save the filter. Please try again.": "Il filter n'ha betg pudì vegnir memorisà. Empruvai anc ina giada.", + "Some labels in \"{name}\" no longer exist and were left out.": "Intginas etichettas en «{name}» n'existan betg pli e èn vegnidas laschadas davent.", + "Could not delete the filter. Please try again.": "Il filter n'ha betg pudì vegnir stizzà. Empruvai anc ina giada.", + "Saved filter": "Filter memorisà", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "In filter da tavla cun num d'in project, privat per la persuna che l'ha memorisà, nun ch'el vegnia partì cun il project.", + "The project whose board the filter applies to": "Il project sin la tavla dal qual il filter vala", + "The name the filter is listed under": "Il num sut il qual il filter è en la glista", + "Saved by": "Memorisà da", + "Nextcloud user id of the person who saved the filter": "Id d'utilisader Nextcloud da la persuna che ha memorisà il filter", + "Shared with the project": "Partì cun il project", + "Whether every project member sees and applies the filter": "Sch'ils commembers dal project vesan il filter e pon applitgar el", + "Criteria": "Criteris", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Il filter: persuna responsabla, etichetta, prioritad e termin, mintgin cun è u n'è betg e sias valurs", + "Cross-project view": "Vista tranter projects", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Ina selecziun memorisada da projects, dals quals las incumbensas vegnan mussadas ensemen en colonnas da status, cundividida cun las persunas numnadas.", + "Shared with": "Cundividì cun", + "The name the view is listed under": "Il num sut il qual la vista è enumerada", + "Nextcloud user id of the person who saved the view": "ID d'utilisader Nextcloud da la persuna che ha memorisà la vista", + "Nextcloud user ids of the people the view is shared with": "IDs d'utilisaders Nextcloud da las persunas cun las qualas la vista è cundividida", + "The projects whose tasks the view shows, at most twenty": "Ils projects, da quals la vista mussa las incumbensas, maximalmain ventg", + "1 project in this view is hidden from you.": "1 project en questa vista è zuppà per tai.", + "{count} projects in this view are hidden from you.": "{count} projects en questa vista èn zuppads per tai.", + "{project} has no column for {status}.": "{project} n'ha nagina colonna per {status}.", + "This view does not exist or is not shared with you.": "Questa vista n'exista betg u n'è betg cundividida cun tai.", + "\"{task}\" moved to {status}.": "\"{task}\" spustà en {status}.", + "Project: {title}": "Project: {title}", + "Cross-project views": "Vistas tranter projects", + "New view": "Nova vista", + "Edit view": "Modifitgar la vista", + "Delete view": "Stizzar la vista", + "Give the view a name": "Dà in num a la vista", + "Pick at least one project": "Tscherna almain in project", + "A view shows at most {max} projects": "Ina vista mussa maximalmain {max} projects", + "Could not save the view. Please try again.": "Impussibel da memorisar la vista. Emprova anc ina giada.", + "Could not delete the view. Please try again.": "Impussibel da stizzar la vista. Emprova anc ina giada.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Stizzar \"{title}\"? Ils projects e lur incumbensas restan sco ch'els èn.", + "People see the tasks of the projects they are in, never more.": "Mintgin vesa mo las incumbensas dals projects nua ch'el è.", + "No views yet. A view shows the tasks of several of your projects together.": "Anc naginas vistas. Ina vista mussa ensemen las incumbensas da plirs da tes projects.", + "Projects in view: {count}": "Projects en la vista: {count}", + "Notify me when a task is assigned to me": "Ma avisar cura ch'ina incumbensa ma vegn attribuida", + "Also send these to me by email": "Ma trametter quai era per e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Agiunta ina adressa dad e-mail en tes parameters persunals da Nextcloud per retschaiver e-mails.", + "Code link": "Colliaziun da code", + "A commit, branch, merge request or issue in a code forge that works on a task.": "In commit, in rom, ina dumonda da fusiun u in problem sin ina plattafurma da code che lavura vi d'ina incumbensa.", + "The task the link belongs to": "L'incumbensa a la quala la colliaziun tutga", + "The project of the task": "Il project da l'incumbensa", + "Task key": "Clav da l'incumbensa", + "The task key the forge text named, such as VC-12": "La clav da l'incumbensa numnada en il text da la plattafurma, p.ex. VC-12", + "What the link points at": "Nua che la colliaziun mussa", + "Link": "Colliaziun", + "The address of the item in the forge": "L'adressa da l'element sin la plattafurma da code", + "The commit message, branch name or merge request title": "Il messadi dal commit, il num dal rom u il titel da la dumonda da fusiun", + "Repository": "Repositori", + "The repository, such as acme/portal": "Il repositori, p.ex. acme/portal", + "Forge id": "Id sin la plattafurma", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "L'agen id da l'element sin la plattafurma da code, p.ex. github:acme/portal#42 u in hash da commit", + "State": "Stadi", + "The state of a merge request or issue": "Il stadi d'ina dumonda da fusiun u d'in problem", + "Who made the commit or opened the merge request": "Tgi che ha fatg il commit u avert la dumonda da fusiun", + "When the commit was made or the merge request last changed": "Cura ch'il commit è vegnì fatg u la dumonda da fusiun è sa midada l'ultima giada", + "Added by": "Agiuntà da", + "Whether a person added the link or the integration wrote it": "Sch'ina persuna ha agiuntà la colliaziun u sche l'integraziun l'ha scritta", + "Nextcloud user UIDs of project members": "IDs d'utilisaders Nextcloud dals commembers dal project", + "Add link": "Agiuntar ina colliaziun", + "Added by hand": "Agiuntà a maun", + "Branch": "Rom", + "Code": "Code", + "Commit": "Commit", + "From the integration": "Da l'integraziun", + "Link to a commit, branch or merge request": "Colliaziun ad in commit, rom u dumonda da fusiun", + "Merge request": "Dumonda da fusiun", + "Merged": "Fusiunà", + "No code linked yet. Name {key} in a commit message or paste a link.": "Anc nagin code collià. Numna {key} en in messadi da commit u encollescha ina colliaziun.", + "No code linked yet. Paste a link to a commit or merge request.": "Anc nagin code collià. Encollescha ina colliaziun ad in commit u ina dumonda da fusiun.", + "Paste a web address that starts with https://.": "Encollescha ina adressa web che cumenza cun https://.", + "Remove link {title}": "Allontanar la colliaziun {title}", + "The link could not be added.": "La colliaziun n'ha betg pudì vegnir agiuntada.", + "The link could not be removed.": "La colliaziun n'ha betg pudì vegnir allontanada.", + "This link is already on the task.": "Questa colliaziun è gia tar l'incumbensa.", + "Code forges": "Plattafurmas da code", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Colliai commits e pull requests da GitHub cun incumbensas. Integriq retschaiva ils eveniments; planninq na clama mai GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Chargiai giu la configuraziun ed importai ella en Integriq. Inscrivi lura in secret en la regla \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Agiuntai en GitHub al repositori in webhook cun questa adressa ed il medem secret. Tschernai il tip da cuntegn application/json ed ils eveniments push e pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Numnai la clav da l'incumbensa, p.ex. VC-12, en in messadi da commit, in num da rom u il titel d'in pull request. La colliaziun cumpara lura tar quella incumbensa.", + "Without Integriq, project members can still paste a link on the task page.": "Senza Integriq pon ils commembers dal project anc adina encollar ina colliaziun sin la pagina da l'incumbensa.", + "Download the Integriq configuration": "Chargiar giu la configuraziun d'Integriq", + "Calendar": "Chalender", + "Previous": "Precedent", + "Calendar view": "Vista dal chalender", + "Starts:": "Cumenza:", + "No tasks with a date in this month.": "Naginas incumbensas cun data quest mais.", + "Week of {start} to {end}": "Emna da {start} fin {end}", + "My calendar": "Mes chalender", + "Show as list": "Mussar sco glista", + "Show as calendar": "Mussar sco chalender", + "Open my calendar": "Avrir mes chalender", + "Nextcloud Tasks": "Incumbensas Nextcloud", + "Show my tasks in Nextcloud Tasks": "Mussar mias incumbensas en Incumbensas Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Las incumbensas attribuidas a tai u partidas cun tai cumparan en ina glista \"Planninq\" en Incumbensas e Chalender da Nextcloud. Midadas fatgas là vegnan remplazzadas da la proxima midada en Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Quest server na po betg scriver en Incumbensas Nextcloud, perquai n'è l'export betg disponibel.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Administrà da Planninq. Midadas fatgas qua vegnan remplazzadas da la proxima midada en Planninq.", + "Working days and holidays": "Dis da lavur e dis da festa", + "Dates set on the timeline skip the days that are not working days.": "Datas fixadas sin la lingia da temp sursiglian ils dis che n'èn betg dis da lavur.", + "Working weekdays": "Dis da lavur da l'emna", + "Non-working days": "Dis libers", + "No non-working days yet.": "Anc nagins dis libers.", + "Add day": "Agiuntar in di", + "Year": "Onn", + "Add Dutch national holidays": "Agiuntar ils dis da festa naziunals ollandais", + "Save working days": "Memorisar ils dis da lavur", + "Choose at least one working weekday.": "Tscherna almain in di da lavur.", + "Working days saved.": "Dis da lavur memorisads.", + "Could not save the working days.": "Ils dis da lavur n'han betg pudì vegnir memorisads.", + "New Year's Day": "Bumaun", + "Easter Sunday": "Dumengia da Pasca", + "Easter Monday": "Glindesdi da Pasca", + "King's Day": "Di dal retg", + "Liberation Day": "Di da la liberaziun", + "Ascension Day": "Ascensiun", + "Whit Sunday": "Dumengia da Tschuncaisma", + "Whit Monday": "Glindesdi da Tschuncaisma", + "Christmas Day": "Nadal", + "Boxing Day": "Segund di da Nadal", + "Dates of {title}": "Datas da {title}", + "The due date cannot be before the start date.": "Il termin na po betg esser avant la data da cumenzament.", + "{title}, from {start} to {end}": "{title}, dals {start} fin ils {end}", + "The dates could not be saved.": "Las datas n'han betg pudì vegnir memorisadas.", + "{title} now runs from {start} to {end}": "{title} dura ussa dals {start} fin ils {end}", + "Auto-scheduling": "Planisaziun automatica", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Sche activà, porscha in termin pli tard sin la lingia da temp da spustar er las incumbensas ch'el blochescha.", + "Move blocked tasks along when a task slips": "Spustar incumbensas blocadas cur ch'ina incumbensa sa retarda", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Sin la lingia da temp porscha in termin pli tard da spustar las incumbensas blocadas. Mo colliaziuns \"blochescha\" quintan, e las incumbensas vegnan mo spustadas pli tard.", + "Move the tasks that wait for {title}?": "Spustar las incumbensas che spetgan {title}?", + "These tasks wait for it and would start after its new due date:": "Questas incumbensas spetgan sin quella e cumenzassan suenter il nov termin:", + "{count} tasks would move; the first {limit} are listed.": "{count} incumbensas vegnissan spustadas; las emprimas {limit} èn enumeradas.", + "Now": "Uss", + "After the move": "Suenter il spustament", + "Only this task": "Mo questa incumbensa", + "Move all": "Spustar tut", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Fermà tar {title}: las datas n'han betg pudì vegnir memorisadas. Las incumbensas avant èn vegnidas spustadas.", + "Cumulative flow": "Flux cumulativ", + "Show as chart": "Mussar sco diagram", + "Show as table": "Mussar sco tabella", + "Tasks per column per day": "Incumbensas per colonna per di", + "Tasks without recorded history in this period: {count}": "Incumbensas senza istorgia registrada en questa perioda: {count}", + "Lead and cycle time": "Temp da furniziun e temp da ciclus", + "No tasks were finished in this period.": "En questa perioda n'è nagina incumbensa vegnida terminada.", + "Finished tasks": "Incumbensas terminadas", + "Cycle time, average": "Temp da ciclus, media", + "Cycle time, 85th percentile": "Temp da ciclus, 85avel percentil", + "Lead time, average": "Temp da furniziun, media", + "Tasks whose finish time was estimated from their history: {count}": "Incumbensas, da las qualas il temp da fin è vegnì stimà da l'istorgia: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Temp da ciclus da mintga incumbensa terminada, cun la media ed il 85avel percentil", + "Slowest tasks": "Las incumbensas las pli plaunas", + "cycle {cycle}, lead {lead}": "ciclus {cycle}, furniziun {lead}", + "{days} days": "{days} dis", + "Could not load the flow of this project.": "Betg pussaivel da chargiar il flux da quest project.", + "Last {days} days": "Ultims {days} dis", + "Portfolio flow": "Flux dal portfolio", + "An admin adds portfolios under Projects, Portfolios.": "In administratur agiunta portfolios sut Projects, Portfolios.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projects betg mussads, perquai ch'i vegnan mussads maximalmain 50 a la giada: {count}", + "Could not load the flow of this portfolio.": "Betg pussaivel da chargiar il flux da quest portfolio.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flux cumulativ e temp da ciclus sur ils projects d'in portfolio.", + "Edit report": "Modifitgar il rapport", + "Only tasks where": "Mo incumbensas, nua che", + "Group by": "Gruppar tenor", + "Display": "Visualisaziun", + "Share with everyone who can read its projects": "Parter cun tuts che pon leger ses projects", + "The report could not be saved.": "Il rapport n'ha betg pudì vegnir memorisà.", + "Number of tasks": "Dumber d'incumbensas", + "Bar": "Travs", + "Donut": "Anè", + "Table": "Tabella", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} da {total} projects en quest rapport n'èn betg visibels per tai", + "No tasks match this report.": "Nagina incumbensa na correspunda a quest rapport.", + "None": "Nagin", + "Could not load this report.": "Betg pussaivel da chargiar quest rapport.", + "Report": "Rapport", + "Your reports": "Tes rapports", + "My reports": "Mes rapports", + "Shared reports": "Rapports partids", + "You have not built a report yet.": "Ti n'has anc betg fatg in rapport.", + "Nobody has shared a report with you yet.": "Nagin n'ha anc partì in rapport cun tai.", + "Reports you built over tasks, and the ones shared with you.": "Rapports che ti has fatg davart incumbensas, e quels ch'èn vegnids partids cun tai.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Ina dumonda memorisada davart incumbensas: tge projects, tge filters, gruppà tenor tge, dumbrà u summà, e mussà sco tabella u diagram.", + "The name the report is listed under": "Il num sut il qual il rapport è enumerà", + "What the report shows and who it is for": "Tge ch'il rapport mussa e per tgi ch'el è", + "Nextcloud user id of the person who saved the report": "ID d'utilisader da Nextcloud da la persuna che ha memorisà il rapport", + "Who can open the report": "Tgi che po avrir il rapport", + "Only me": "Mo jau", + "Everyone who can read its projects": "Tuts che pon leger ses projects", + "The projects the report covers, at most fifty": "Ils projects ch'il rapport cumpiglia, maximalmain tschuncanta", + "Filters": "Filters", + "Task fields and the value each must equal": "Champs da l'incumbensa e la valur a la quala mintgin sto esser egual", + "The task field the report groups on": "Il champ da l'incumbensa tenor il qual il rapport gruppescha", + "Count the tasks, or add up a number on them": "Dumbrar las incumbensas u summar in dumber sin ellas", + "Sum": "Summa", + "Sum of": "Summa da", + "The number added up when the measure is a sum": "Il dumber che vegn summà, sch'la mesira è ina summa", + "Story points": "Puncts d'istorgia", + "Estimated duration": "Durada stimada", + "How the report is shown": "Co ch'il rapport vegn mussà", + "Issue type": "Tip da dumonda", + "Task fields and the value each must equal; empty when the report covers every task": "Champs da la lavur e la valur che mintga champ sto avair; vid sch'il rapport cumpiglia tut las lavurs", + "The status a task must have": "Il status che ina lavur sto avair", + "The priority a task must have": "La prioritad che ina lavur sto avair", + "The user a task must be assigned to": "L'utilisader al qual ina lavur sto esser attribuida", + "A label a task must carry": "Ina etichetta che ina lavur sto purtar", + "The board column a task must be in": "La colonna da la tavla en la quala ina lavur sto esser", + "The issue type a task must have": "Il tip da dumonda che ina lavur sto avair", + "Manager groups": "Gruppas da manaschers", + "Member groups": "Gruppas da commembers", + "Viewer groups": "Gruppas da lecturs", + "Viewers": "Lecturs", + "Owning group": "Gruppa da possessur", + "Nextcloud groups whose members manage the project": "Gruppas Nextcloud dals quals ils commembers mainan il project", + "Nextcloud groups whose members work on the project": "Gruppas Nextcloud dals quals ils commembers lavuran vi dal project", + "Nextcloud groups whose members may read the project": "Gruppas Nextcloud dals quals ils commembers dastgan leger il project", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utilisaders Nextcloud che mainan il project: parameters, commembers e lavur", + "Nextcloud user ids who may read the project and its work but not change it": "Utilisaders Nextcloud che dastgan leger il project e sia lavur, ma betg midar", + "The Nextcloud group that owns the project with its creator, at most one": "La gruppa Nextcloud che possede il project ensemen cun ses creader, maximalmain ina", + "Nextcloud user ids who may read this through the project": "Utilisaders Nextcloud che dastgan leger quai tras il project", + "Nextcloud groups whose members may change this through the project": "Gruppas Nextcloud dals quals ils commembers dastgan midar quai tras il project", + "Nextcloud groups whose members may read this through the project": "Gruppas Nextcloud dals quals ils commembers dastgan leger quai tras il project", + "Search for a person or a group…": "Tschertgar ina persuna u ina gruppa…", + "No one found. Your admin's sharing settings decide who you can find.": "Nagin chattà. Las configuraziuns da cundivisiun da tes administratur decidan tgi che ti pos chattar.", + "Type at least two characters": "Endatescha almain dus caracters", + "Everyone in this group": "Tuts en questa gruppa", + "Could not search for people. Please try again.": "Betg reussì da tschertgar persunas. Emprova anc ina giada.", + "Could not remove the group": "Betg reussì dad allontanar la gruppa", + "Only the owner and managers change who is on this project.": "Mo il possessur ed ils administraturs midan tgi che è en quest project.", + "Role of {name}": "Rolla da {name}", + "Manager": "Administratur", + "Member": "Commember", + "Viewer": "Lectur", + "Could not change the role": "Betg reussì da midar la rolla", + "Owned by group: {name}": "En possess da la gruppa: {name}", + "No group owns this project.": "Nagina gruppa n'è possessura da quest project.", + "Owned by group": "En possess da la gruppa", + "Search for a group…": "Tschertgar ina gruppa…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Chattà nagina gruppa. Las configuraziuns da cundivisiun da tes administratur decidan tge gruppas che ti pos chattar.", + "No owning group": "Nagina gruppa possessura", + "Could not search for groups. Please try again.": "Impussibel da tschertgar gruppas. Emprova anc ina giada.", + "Could not change the owning group": "Impussibel da midar la gruppa possessura", + "You can read this project. Only its members change it.": "Ti pos leger quest project. Mo ses commembers al midan.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Il curs che vegn instruì en questa lecziun, per exempel ina materia facultativa, sche l'app d'emprender da la scola al enconuscha.", + "Online meeting link": "Link a la lecziun online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Nua che las scolaras ed ils scolars sa participeschan online a questa lecziun. Il buttun Participar cumpara mo per in link https." }, "plurals": null } diff --git a/l10n/ro.js b/l10n/ro.js index 694b8342..8f25e103 100644 --- a/l10n/ro.js +++ b/l10n/ro.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Proiecte active", + "Archived projects": "Proiecte arhivate", + "Boards": "Panouri", + "My projects": "Proiectele mele", + "Portfolio": "Portofoliu", + "Project board": "Panoul proiectului", + "Projects I am in": "Proiecte la care particip", + "Timeline": "Cronologie", + "Timesheet": "Fișă de pontaj", + "Features & roadmap": "Funcții și foaie de parcurs", + "Flow": "Flux", + "Flows": "Fluxuri", + "Reports": "Rapoarte", + "Pick a report to open it.": "Alegeți un raport pentru a-l deschide.", + "In progress": "În curs", + "Date": "Dată", + "Due": "Scadență", + "Assignee": "Atribuit lui", + "Who": "Cine", + "What": "Ce", + "Minutes": "Minute", + "Entries": "Intrări", + "Most recent": "Cele mai recente", + "Per person": "Per persoană", + "By status": "După stare", + "By priority": "După prioritate", + "Task status": "Starea sarcinilor", + "Time spent": "Timp petrecut", + "Capacity": "Capacitate", + "Due soonest": "Cu termen apropiat", + "Minutes logged": "Minute înregistrate", + "Nothing is due": "Nu este nimic scadent", + "Nothing logged yet": "Încă nu s-a înregistrat nimic", + "What is open, what is blocked, and what is overdue.": "Ce este deschis, ce este blocat și ce a depășit termenul.", + "How allocation is spread across the people working on projects.": "Cum este distribuită alocarea între persoanele care lucrează la proiecte.", + "Hours logged, and the projects they went to.": "Orele înregistrate și proiectele către care au mers.", + "Billable": "Facturabil", + "Budget: {amount}": "Buget: {amount}", + "Loading projects": "Se încarcă proiectele", + "No projects for this client yet": "Încă nu există proiecte pentru acest client", + "Open in Planninq": "Deschide în Planninq", + "This project could not be found": "Acest proiect nu a fost găsit", + "Untitled project": "Proiect fără titlu", + "and {count} more": "și încă {count}", + "Store": "Magazin", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instalați registre, scheme și fluxuri publicate de alte organizații.", + "Work Date": "Data lucrării", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Acțiuni coloană", + "Columns": "Coloane", + "Could not remove the column. Please try again.": "Coloana nu a putut fi eliminată. Încercați din nou.", + "Could not save the column. Please try again.": "Coloana nu a putut fi salvată. Încercați din nou.", + "Done column": "Coloană finalizate", + "Edit column": "Editează coloana", + "Keep the card's status": "Păstrează starea cardului", + "Move its cards to": "Mută cardurile sale în", + "Move left": "Mută la stânga", + "Move right": "Mută la dreapta", + "Status of cards moved here": "Starea cardurilor mutate aici", + "The last done column cannot be removed.": "Ultima coloană finalizate nu poate fi eliminată.", + "WIP limit": "Limită WIP", + "over limit": "peste limită", + "The status a card gets when it is moved into this column.": "Starea pe care o primește un card când este mutat în această coloană.", + "All priorities": "Toate prioritățile", + "Could not create the task. Please try again.": "Sarcina nu a putut fi creată. Încercați din nou.", + "Created": "Creată", + "Move to backlog": "În backlog", + "Move to board": "Pe tablă", + "New task": "Sarcină nouă", + "Nothing in the backlog": "Nimic în backlog", + "Rank": "Rang", + "Sort by": "Sortează după", + "Sort by rank to reorder": "Sortați după rang pentru a reordona", + "Task actions": "Acțiuni sarcină", + "All labels": "Toate etichetele", + "Filter tasks by label": "Filtrează sarcinile după etichetă", + "View timeline": "Vezi cronologia", + "Board": "Tablă", + "List": "Listă", + "Column": "Coloană", + "Board or list": "Tablă sau listă", + "Log": "Jurnal", + "Add entry": "Adaugă o intrare", + "Show": "Afișează", + "No actions yet": "Încă nu există acțiuni", + "Closed": "Închis", + "Entry actions": "Acțiuni pentru intrare", + "Add action": "Adaugă o acțiune", + "by {author}": "de {author}", + "saved {time}": "salvat {time}", + "Attendees: {names}": "Participanți: {names}", + "Add the first entry": "Adaugă prima intrare", + "Issues": "Probleme", + "Lessons learned": "Lecții învățate", + "Meetings": "Întâlniri", + "Decisions": "Decizii", + "Actions": "Acțiuni", + "Issue": "Problemă", + "Lesson learned": "Lecție învățată", + "Meeting": "Întâlnire", + "Decision": "Decizie", + "About this project": "Despre acest proiect", + "No description yet": "Încă nu există descriere", + "Start date": "Data de început", + "Not set": "Nesetat", + "End date": "Data de sfârșit", + "Progress": "Progres", + "No tasks yet": "Încă nu există sarcini", + "Open the board": "Deschide tabla", + "People": "Persoane", + "Owner": "Proprietar", + "Latest log entries": "Cele mai recente intrări", + "Open the log": "Deschide jurnalul", + "{done} of {total} tasks done": "{done} din {total} sarcini finalizate", + "Edit entry": "Editează intrarea", + "Type": "Tip", + "Attendees": "Participanți", + "Issue is closed": "Problema este închisă", + "Could not save the entry. Please try again.": "Intrarea nu a putut fi salvată. Încercați din nou.", + "From: {title}": "Din: {title}", + "What needs to happen": "Ce trebuie să se întâmple", + "Could not create the action. Please try again.": "Acțiunea nu a putut fi creată. Încercați din nou.", + "The action was created but could not be linked to the entry.": "Acțiunea a fost creată, dar nu a putut fi legată de intrare.", + "Project pages": "Paginile proiectului", + "Overview": "Prezentare generală", + "Risks": "Riscuri", + "Log entry": "Intrare în jurnal", + "A short name for the entry": "Un nume scurt pentru intrare", + "Project": "Proiect", + "The project this entry belongs to": "Proiectul căruia îi aparține această intrare", + "What kind of entry this is": "Ce tip de intrare este", + "When it happened": "Când s-a întâmplat", + "What happened, in Markdown": "Ce s-a întâmplat, în Markdown", + "Whether an issue is still open": "Dacă o problemă este încă deschisă", + "The people at a meeting": "Persoanele de la o întâlnire", + "Tasks that came out of this entry": "Sarcini rezultate din această intrare", + "Add risk": "Adaugă un risc", + "Risk": "Risc", + "Score": "Scor", + "Response": "Răspuns", + "Review date": "Data revizuirii", + "no longer on the project": "nu mai face parte din proiect", + "Edit {title}": "Editează {title}", + "No risks recorded yet": "Încă nu există riscuri înregistrate", + "Add the first risk": "Adaugă primul risc", + "Medium": "Mediu", + "Mitigating": "În atenuare", + "Occurred": "S-a produs", + "Avoid": "Evitare", + "Reduce": "Reducere", + "Transfer": "Transfer", + "Accept": "Acceptare", + "Highest open risks": "Cele mai mari riscuri deschise", + "No open risks": "Niciun risc deschis", + "Open the risk register": "Deschide registrul de riscuri", + "Edit risk": "Editează riscul", + "What could go wrong": "Ce ar putea merge prost", + "Likelihood": "Probabilitate", + "Impact": "Impact", + "Score {score}": "Scor {score}", + "Countermeasures": "Contramăsuri", + "Could not save the risk. Please try again.": "Riscul nu a putut fi salvat. Încercați din nou.", + "Risks by likelihood and impact": "Riscuri după probabilitate și impact", + "Risk scale": "Scala de risc", + "The levels every project scores its risks on, and where low turns into medium and high": "Nivelurile pe care fiecare proiect își punctează riscurile și unde scăzut trece în mediu și ridicat", + "Number of levels": "Numărul de niveluri", + "Likelihood labels": "Etichete pentru probabilitate", + "Impact labels": "Etichete pentru impact", + "Level {level}": "Nivelul {level}", + "Medium from score": "Mediu de la scorul", + "High from score": "Ridicat de la scorul", + "Risk scale saved": "Scala de risc a fost salvată", + "1 risk uses level {level}. Change it first.": "1 risc folosește nivelul {level}. Modificați-l mai întâi.", + "{count} risks use level {level}. Change them first.": "{count} riscuri folosesc nivelul {level}. Modificați-le mai întâi.", + "Every level needs a label, and high must start above medium.": "Fiecare nivel are nevoie de o etichetă, iar ridicat trebuie să înceapă peste mediu.", + "The project this risk belongs to": "Proiectul căruia îi aparține acest risc", + "The cause and the effect, in Markdown": "Cauza și efectul, în Markdown", + "Category": "Categorie", + "A free grouping, such as planning, budget or supplier": "O grupare liberă, cum ar fi planificare, buget sau furnizor", + "How likely it is, on the admin's risk scale": "Cât de probabil este, pe scala de risc a administratorului", + "How hard it would hit, on the admin's risk scale": "Cât de tare ar lovi, pe scala de risc a administratorului", + "Likelihood times impact, calculated by the server": "Probabilitate ori impact, calculat de server", + "Where the risk stands": "Unde se află riscul", + "The person who watches this risk": "Persoana care urmărește acest risc", + "How the project answers the risk": "Cum răspunde proiectul la risc", + "What is done to prevent it or soften it, in Markdown": "Ce se face pentru a-l preveni sau atenua, în Markdown", + "When to look at this risk again": "Când se revizuiește din nou acest risc", + "Very low": "Foarte scăzut", + "Very high": "Foarte ridicat", + "All projects": "Toate proiectele", + "Project status report": "Raport de stare a proiectului", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Un raport datat despre cum stă un proiect la bani, organizare, timp, informare, calitate și risc (aspectele GROTIK), fiecare cu o notă.", + "The project this report is about": "Proiectul la care se referă raportul", + "Report date": "Data raportului", + "The day the report describes": "Ziua pe care o descrie raportul", + "Money": "Bani", + "How the project stands on this aspect": "Cum stă proiectul la acest aspect", + "On track": "Pe drumul cel bun", + "At risk": "În pericol", + "Off track": "Deviat", + "Money note": "Notă despre bani", + "A short explanation of this status": "O scurtă explicație a acestei stări", + "Organisation": "Organizare", + "Organisation note": "Notă despre organizare", + "Time": "Timp", + "Time note": "Notă despre timp", + "Information": "Informare", + "Information note": "Notă despre informare", + "Quality": "Calitate", + "Quality note": "Notă despre calitate", + "Risk note": "Notă despre risc", + "Overall": "General", + "The worst of the six statuses, calculated by the server": "Cea mai proastă dintre cele șase stări, calculată de server", + "Health: money": "Sănătate: bani", + "Copied from the newest status report": "Copiat din cel mai recent raport de stare", + "Health: organisation": "Sănătate: organizare", + "Health: time": "Sănătate: timp", + "Health: information": "Sănătate: informare", + "Health: quality": "Sănătate: calitate", + "Health: risk": "Sănătate: risc", + "Health: overall": "Sănătate: general", + "Health: report date": "Sănătate: data raportului", + "The date of the newest status report": "Data celui mai recent raport de stare", + "New report": "Raport nou", + "Only the project owner writes status reports.": "Doar proprietarul proiectului scrie rapoarte de stare.", + "Latest report, {date}": "Ultimul raport, {date}", + "Aspect": "Aspect", + "Note": "Notă", + "Report history": "Istoricul rapoartelor", + "Author": "Autor", + "No status reports yet": "Încă nu există rapoarte de stare", + "Write the first report": "Scrieți primul raport", + "Choose a status for every aspect to save the report.": "Alegeți o stare pentru fiecare aspect pentru a salva raportul.", + "Suggested: on track.": "Sugestie: pe drumul cel bun.", + "Suggested: at risk.": "Sugestie: în pericol.", + "Suggested: off track.": "Sugestie: deviat.", + "1 task is past its due date.": "1 sarcină a depășit termenul.", + "{count} tasks are past their due date.": "Sarcini care au depășit termenul: {count}.", + "The end date has passed with 1 open task.": "Data de final a trecut cu 1 sarcină deschisă.", + "The end date has passed with {count} open tasks.": "Data de final a trecut, sarcini deschise: {count}.", + "No open task is past its due date.": "Nicio sarcină deschisă nu a depășit termenul.", + "The highest open risk, \"{title}\", scores {score}.": "Cel mai mare risc deschis, „{title}”, are scorul {score}.", + "There are no open risks.": "Nu există riscuri deschise.", + "Costs are at {percent}% of the budget.": "Costurile sunt la {percent}% din buget.", + "No suggestion: the project has no budget.": "Nicio sugestie: proiectul nu are buget.", + "No suggestion: no costs are recorded for this project yet.": "Nicio sugestie: nu există încă costuri înregistrate pentru acest proiect.", + "The report was not saved. Only the project owner can write status reports.": "Raportul nu a fost salvat. Doar proprietarul proiectului poate scrie rapoarte de stare.", + "No report": "Niciun raport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Un grup de proiecte conduse de aceleași persoane, cum ar fi un departament sau un program. Responsabilii lui citesc fiecare proiect din el.", + "The name of the portfolio": "Numele portofoliului", + "What the portfolio holds and who runs it": "Ce conține portofoliul și cine îl conduce", + "A colour for the portfolio's section in project lists": "O culoare pentru secțiunea portofoliului în listele de proiecte", + "Managers": "Responsabili", + "Nextcloud user UIDs of the people who run the portfolio": "ID-urile de utilizator Nextcloud ale persoanelor care conduc portofoliul", + "Order": "Ordine", + "Where the portfolio comes in project lists, lowest first": "Locul portofoliului în listele de proiecte, cel mai mic primul", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Scala de risc proprie a acestui portofoliu în JSON, în aceeași formă ca scala întregii aplicații. Gol înseamnă scala aplicației.", + "Portfolio readers": "Cititorii portofoliului", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID-urile de utilizator Nextcloud ale responsabililor portofoliului proiectului", + "The portfolio this project belongs to": "Portofoliul din care face parte proiectul", + "No portfolio": "Fără portofoliu", + "All portfolios": "Toate portofoliile", + "You read this project as a manager of its portfolio. Only its members change it.": "Citiți acest proiect ca responsabil al portofoliului său. Doar membrii îl modifică.", + "Portfolios": "Portofolii", + "Portfolio status": "Starea portofoliului", + "No portfolios yet": "Încă nu există portofolii", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Un administrator adaugă portofolii în Proiecte, Portofolii. Proiectele unui portofoliu sunt listate aici cu starea lor.", + "Roll-up": "Rezumat", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} pe drumul bun, {atRisk} în risc, {offTrack} deviate, {noReport} fără raport", + "No project in this portfolio that you can read.": "Niciun proiect din acest portofoliu pe care îl poți citi.", + "Start": "Început", + "End": "Sfârșit", + "Budget": "Buget", + "Last report": "Ultimul raport", + "Out of date": "Învechit", + "Portfolio timeline": "Cronologia portofoliului", + "Zoom": "Zoom", + "Could not load the timeline": "Cronologia nu a putut fi încărcată", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Un administrator adaugă portofolii în Proiecte, Portofolii. Proiectele unui portofoliu sunt afișate aici pe o singură cronologie.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Deschide un proiect pentru a-i vedea fazele și sarcinile. Cronologia este doar pentru citire.", + "Phase: {title}": "Fază: {title}", + "Left out because you cannot read them: {count} projects": "Omise pentru că nu le poți citi: {count} proiecte", + "Week": "Săptămână", + "Day": "Zi", + "Month": "Lună", + "Please try again later.": "Încearcă din nou mai târziu.", + "Status reports": "Rapoarte de stare", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "După câte zile ultimul raport de stare al unui proiect este marcat ca învechit în prezentarea portofoliului", + "Reporting period (days)": "Perioada de raportare (zile)", + "The reporting period is a whole number of days from 1 to 365.": "Perioada de raportare este un număr întreg de zile de la 1 la 365.", + "Reporting period saved": "Perioada de raportare a fost salvată", + "The reporting period was not saved. Please try again.": "Perioada de raportare nu a fost salvată. Încearcă din nou.", + "Every project of a portfolio with its status per aspect, rolled up.": "Fiecare proiect al unui portofoliu cu starea pe aspecte, rezumat.", + "The projects of a portfolio on one timeline.": "Proiectele unui portofoliu pe o singură cronologie.", + "Phases": "Faze", + "Add phase": "Adaugă fază", + "No phases yet": "Încă nu există faze", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Împarte proiectul în faze, precum inițiere, definire și realizare. O fază se închide când documentul ei de încheiere este încărcat.", + "{hours} hours": "{hours} ore", + "Concluding document: {title}": "Document de încheiere: {title}", + "Concluding document missing": "Lipsește documentul de încheiere", + "Move {title} up": "Mută {title} în sus", + "Move {title} down": "Mută {title} în jos", + "Close phase": "Închide faza", + "Phase": "Fază", + "Files": "Fișiere", + "Notes": "Note", + "Audit trail": "Jurnal de audit", + "Edit phase": "Editează faza", + "Name": "Nume", + "Budget hours": "Ore bugetate", + "Could not save the phase. Please try again.": "Faza nu a putut fi salvată. Încearcă din nou.", + "Close phase {title}": "Închide faza {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "O fază se închide cu documentul ei de încheiere: încarcă-l aici sau alege unul dintre fișierele fazei.", + "Concluding document": "Document de încheiere", + "This phase has no files yet.": "Această fază nu are încă fișiere.", + "Upload a document": "Încarcă un document", + "The document was not uploaded. Please try again.": "Documentul nu a fost încărcat. Încearcă din nou.", + "Upload the concluding document before you close this phase.": "Încarcă documentul de încheiere înainte să închizi această fază.", + "This phase cannot be closed from its current status.": "Această fază nu poate fi închisă din starea ei actuală.", + "The phase was not closed. Please try again.": "Faza nu a fost închisă. Încearcă din nou.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Id-ul fișierului acestei faze care o încheie. Faza poate fi finalizată doar când este completat și fișierul este atașat.", + "Import from Microsoft Project": "Importă din Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Alegeți un plan salvat din Microsoft Project în format XML. Nimic nu se importă până nu confirmați.", + "Plan file": "Fișierul planului", + "What the import creates": "Ce creează importul", + "Tasks": "Sarcini", + "Sub-tasks": "Subsarcini", + "Milestones": "Jaloane", + "Links": "Legături", + "Already imported, updated in place: {count}": "Deja importate, actualizate pe loc: {count}", + "What does not carry over": "Ce nu se preia", + "Tasks with resources, which are not imported: {count}": "Sarcini cu resurse, care nu se importă: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Sarcini mai adânci decât nivelul 3, puse sub sarcina lor de nivel 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Legături altele decât sfârșit-început, importate ca legături asociate: {count}", + "Link lags, which are dropped: {count}": "Decalaje ale legăturilor, care se renunță: {count}", + "Links to a summary task, which are not imported: {count}": "Legături către o sarcină rezumat, care nu se importă: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Legături către sarcini din afara acestui plan, care nu se importă: {count}", + "No longer in the plan": "Nu mai este în plan", + "These stay in the project; remove them yourself if they are no longer needed.": "Rămân în proiect; eliminați-le singur dacă nu mai sunt necesare.", + "Import": "Importă", + "Close": "Închide", + "The plan is imported: {created} created, {updated} updated.": "Planul este importat: {created} create, {updated} actualizate.", + "Links that would close a loop were left out: {count}": "Legăturile care ar închide o buclă au fost omise: {count}", + "The import stopped part-way. Run it again to finish it.": "Importul s-a oprit la jumătate. Rulați-l din nou pentru a-l termina.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Salvați planul în Microsoft Project cu Fișier, Salvare ca, format XML, și importați acel fișier.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Acest fișier declară un DOCTYPE sau entități, care nu sunt acceptate.", + "The file is larger than 10 MB.": "Fișierul depășește 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Planul are peste 2.000 de sarcini, mai multe decât acceptă un import.", + "This file is not a Microsoft Project plan in XML format.": "Acest fișier nu este un plan Microsoft Project în format XML.", + "Choose a file to import.": "Alegeți un fișier de importat.", + "Only the project owner can import a plan.": "Doar proprietarul proiectului poate importa un plan.", + "The plan could not be read. Please try again.": "Planul nu a putut fi citit. Încercați din nou.", + "Linked case: {title}": "Dosar asociat: {title}", + "Linked to a case": "Asociat unui dosar", + "Hand over to case": "Predă dosarului", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copiază neschimbat fiecare fișier al proiectului și al sarcinilor sale, plus un fișier care descrie proiectul, în dosarul asociat.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Fișiere copiate: {count}", + "Files that failed: {names}": "Fișiere eșuate: {names}", + "The handover failed. Please try again.": "Predarea a eșuat. Încercați din nou.", + "The linked case could not be found, or you cannot open it.": "Dosarul asociat nu a fost găsit sau nu îl puteți deschide.", + "Case handovers": "Predări către dosar", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Fiecare predare a fișierelor și metadatelor proiectului către dosarul său: când, de cine, către ce dosar, fiecare fișier copiat cu SHA-256 al său și fișierele eșuate.", + "Finance": "Finanțe", + "Add cost line": "Adaugă o linie de cost", + "Delivery terms": "Condiții de livrare", + "Billing model": "Model de facturare", + "Budget in euro": "Buget în euro", + "Budget in hours": "Buget în ore", + "Hourly rate in euro": "Tarif orar în euro", + "Planned start": "Început planificat", + "Planned end": "Sfârșit planificat", + "Planned dates": "Date planificate", + "Budget {amount}": "Buget {amount}", + "No budget agreed": "Niciun buget convenit", + "Hours": "Ore", + "Only the project owner and the portfolio managers see the amounts.": "Doar proprietarul proiectului și managerii portofoliului văd sumele.", + "Budget against cost per category": "Buget față de costuri pe categorie", + "Labour (booked time)": "Muncă (timp înregistrat)", + "No category": "Fără categorie", + "Hours are not available": "Orele nu sunt disponibile", + "Not yet assigned to a category": "Încă nealocat unei categorii", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} cheltuiți, {remaining} rămași", + "Budget against cost per phase": "Buget față de costuri pe fază", + "No phase": "Fără fază", + "Cost lines": "Linii de cost", + "From the finance system": "Din sistemul financiar", + "Edit cost line {amount}": "Editează linia de cost {amount}", + "No cost lines yet": "Încă nu există linii de cost", + "Commitments": "Angajamente", + "Actual cost": "Cost real", + "Forecast": "Prognoză", + "Remaining": "Rămas", + "Not planned yet": "Încă neplanificat", + "{start} to {end}": "{start} până la {end}", + "The terms were not saved. Please try again.": "Condițiile nu au fost salvate. Încearcă din nou.", + "Terms saved": "Condiții salvate", + "Fixed price": "Preț fix", + "Hourly": "Pe oră", + "Not billed": "Nefacturat", + "Commitment": "Angajament", + "Edit cost line": "Editează linia de cost", + "Kind": "Tip", + "Amount in euro": "Sumă în euro", + "Remove": "Elimină", + "Could not save the cost line. Only the project owner changes the money of a project.": "Linia de cost nu a putut fi salvată. Doar proprietarul proiectului schimbă banii unui proiect.", + "Could not remove the cost line. Please try again.": "Linia de cost nu a putut fi eliminată. Încearcă din nou.", + "{amount} over budget": "{amount} peste buget", + "Cost categories": "Categorii de cost", + "The categories every project splits its budget and costs into, one per line": "Categoriile în care fiecare proiect își împarte bugetul și costurile, câte una pe rând", + "Categories": "Categorii", + "Give at least one category, each name once.": "Indică cel puțin o categorie, fiecare nume o singură dată.", + "Cost categories saved": "Categorii de cost salvate", + "The cost categories were not saved. Please try again.": "Categoriile de cost nu au fost salvate. Încearcă din nou.", + "Finance line": "Linie financiară", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "O sumă de bani a unui proiect: buget, angajament, cost real sau prognoză, într-o categorie de cost și opțional într-o fază. Introdusă de proprietarul proiectului sau trimisă de sistemul financiar prin aplicația de integrare.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Proiectul căruia îi aparține suma. Gol pentru o linie din sistemul financiar al cărei număr de proiect nu se potrivește cu niciun proiect.", + "The phase this amount belongs to, if any": "Faza căreia îi aparține suma, dacă există", + "The cost category, one of the categories the admin set up": "Categoria de cost, una dintre categoriile configurate de administrator", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Dacă suma este buget, angajament, cost real sau prognoză", + "Amount": "Sumă", + "The amount in the reporting currency (euro)": "Suma în moneda de raportare (euro)", + "The date the amount was booked or is expected": "Data la care suma a fost înregistrată sau este așteptată", + "What the amount is for": "Pentru ce este suma", + "Whether a person entered the line or the finance system sent it": "Dacă o persoană a introdus linia sau a trimis-o sistemul financiar", + "Entered by hand": "Introdusă manual", + "Finance line id": "Id-ul liniei financiare", + "The finance system's own id of this line. One imported line per id.": "Id-ul propriu al acestei linii în sistemul financiar. O linie importată per id.", + "Project number": "Număr de proiect", + "The project number the finance system sent, matched against the project key": "Numărul de proiect trimis de sistemul financiar, comparat cu cheia proiectului", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portofoliul proiectului liniei, copiat din proiect ca totalurile portofoliului să aibă nevoie de un singur filtru", + "Finance readers": "Cititori financiari", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-urile utilizatorilor Nextcloud care pot vedea suma: proprietarul proiectului și managerii portofoliului său", + "Project owner": "Proprietarul proiectului", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID-ul utilizatorului Nextcloud al proprietarului proiectului, care poate modifica și elimina liniile manuale", + "How the client pays: not billed, a fixed price, or by the hour.": "Cum plătește clientul: nefacturat, preț fix sau pe oră.", + "Portfolio finance": "Finanțele portofoliului", + "You cannot see the money of any project in this portfolio": "Nu poți vedea banii niciunui proiect din acest portofoliu", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serverul a returnat linii de cost ale unor proiecte din afara acestui portofoliu, deci aceste totaluri pot fi greșite.", + "Projects left out because you cannot see their money: {count}": "Proiecte omise pentru că nu le poți vedea banii: {count}", + "Unmatched finance lines": "Linii financiare neasociate", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Buget, angajamente, cost real și prognoză însumate pe un portofoliu.", + "Subprojects": "Subproiecte", + "{done} of {total}": "{done} din {total}", + "{done} of {total} tasks done, including subprojects": "{done} din {total} sarcini gata, inclusiv subproiectele", + "Show the subprojects of {title}": "Arată subproiectele lui {title}", + "Hide the subprojects of {title}": "Ascunde subproiectele lui {title}", + "Part of": "Face parte din", + "No parent project": "Fără proiect părinte", + "A project cannot sit under one of its own subprojects.": "Un proiect nu poate sta sub unul dintre propriile subproiecte.", + "Projects nest three levels deep at most: programme, project and subproject.": "Proiectele se imbrică pe cel mult trei niveluri: program, proiect și subproiect.", + "Parent project": "Proiect părinte", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Proiectul sub care stă acest proiect, de exemplu un program. Proiectele se imbrică pe cel mult trei niveluri.", + "Yes": "Da", + "No": "Nu", + "{label} (required)": "{label} (obligatoriu)", + "{label} is required": "{label} este obligatoriu", + "Project field": "Câmp de proiect", + "A field an admin adds to every project, such as a policy area or a contract value.": "Un câmp pe care un administrator îl adaugă fiecărui proiect, de exemplu un domeniu de politică sau o valoare de contract.", + "Key": "Cheie", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Numele fix sub care se salvează valoarea, în lower camel case. Păstrează-l odată ce proiectele îl folosesc.", + "Label": "Etichetă", + "The name people see next to the field": "Numele pe care oamenii îl văd lângă câmp", + "What the field holds": "Ce conține câmpul", + "Text": "Text", + "Number": "Număr", + "Choice": "Alegere", + "Person": "Persoană", + "Yes or no": "Da sau nu", + "Options": "Opțiuni", + "The choices of a choice field": "Opțiunile unui câmp de alegere", + "Required": "Obligatoriu", + "Whether a project must fill in the field": "Dacă un proiect trebuie să completeze câmpul", + "Where the field appears, lowest first": "Unde apare câmpul, cel mai mic primul", + "Applies to": "Se aplică la", + "What the field is added to": "La ce se adaugă câmpul", + "Custom fields": "Câmpuri proprii", + "The values of the project fields an admin defined, keyed by the field's key.": "Valorile câmpurilor de proiect definite de un administrator, după cheia câmpului.", + "Project fields": "Câmpuri de proiect", + "Related": "Asociate", + "Remove link": "Elimină legătura", + "Link type": "Tipul legăturii", + "Relates to": "Se leagă de", + "Duplicates": "Dublează", + "Project key": "Cheia proiectului", + "Every task number starts with it, such as VERG-42.": "Fiecare număr de sarcină începe cu ea, de exemplu VERG-42.", + "This key is already used by another project.": "Această cheie este deja folosită de alt proiect.", + "Use 2 to 10 letters and digits, starting with a letter.": "Folosiți între 2 și 10 litere și cifre, începând cu o literă.", + "The key cannot change once tasks carry it.": "Cheia nu se mai poate schimba după ce sarcinile o poartă.", + "Project saved. The existing tasks get their numbers in the background.": "Proiect salvat. Sarcinile existente își primesc numerele în fundal.", + "Next task number": "Numărul următoarei sarcini", + "The number the next task of this project gets in its key. Only the system writes it.": "Numărul pe care următoarea sarcină a acestui proiect îl primește în cheia sa. Doar sistemul îl scrie.", + "Restore {title}": "Restaurează {title}", + "Restore": "Restaurează", + "Project restored": "Proiect restaurat", + "Could not restore the project": "Proiectul nu a putut fi restaurat", + "Bring this project back to the active list.": "Readuceți acest proiect în lista proiectelor active.", + "Restore project": "Restaurează proiectul", + "Request reason": "Motivul cererii", + "Why the requester needs this project. Filled in when the project is requested.": "De ce are nevoie solicitantul de acest proiect. Se completează la cerere.", + "Reviewed by": "Analizat de", + "The user who approved or rejected the request.": "Utilizatorul care a aprobat sau a respins cererea.", + "Reviewed at": "Analizat la", + "When the request was approved or rejected.": "Când a fost aprobată sau respinsă cererea.", + "Review note": "Nota evaluatorului", + "The reviewer's reason, shown to the requester when a request is not approved.": "Motivul evaluatorului, afișat solicitantului când o cerere nu este aprobată.", + "Members of these groups": "Membrii acestor grupuri", + "Groups that may create projects": "Grupuri care pot crea proiecte", + "The group {group} no longer exists. Save to remove it.": "Grupul {group} nu mai există. Salvați pentru a-l elimina.", + "Review project request": "Analizează cererea de proiect", + "Requested by": "Solicitat de", + "Why it is needed": "De ce este necesar", + "Desired start date": "Data de început dorită", + "Why is it not approved?": "De ce nu este aprobat?", + "Give a reason. The requester sees it.": "Dați un motiv. Solicitantul îl va vedea.", + "Approve": "Aprobă", + "Reject": "Respinge", + "Reject request": "Respinge cererea", + "The review was not saved. Try again.": "Analiza nu a fost salvată. Încercați din nou.", + "This project is waiting for review": "Acest proiect așteaptă analiza", + "This request was not approved": "Această cerere nu a fost aprobată", + "Reason: {note}": "Motiv: {note}", + "Review request": "Analizează cererea", + "Request a project": "Solicită un proiect", + "Step {step} of 2": "Pasul {step} din 2", + "Why is this project needed?": "De ce este necesar acest proiect?", + "Give a reason. The reviewer reads it.": "Dați un motiv. Evaluatorul îl va citi.", + "Back": "Înapoi", + "Next": "Înainte", + "Send request": "Trimite cererea", + "The request was not sent. Try again.": "Cererea nu a fost trimisă. Încercați din nou.", + "Requested": "Solicitat", + "Not approved": "Neaprobat", + "Your request was sent": "Cererea dvs. a fost trimisă", + "Let everyone else request a project": "Permiteți tuturor celorlalți să solicite un proiect", + "Add a task": "Adaugă o sarcină", + "Delete task": "Șterge sarcina", + "Edit task": "Editează sarcina", + "Write": "Scrie", + "Preview": "Previzualizare", + "Markdown works here: headings, lists and links.": "Aici funcționează Markdown: titluri, liste și linkuri.", + "Could not save the task. Please try again.": "Sarcina nu a putut fi salvată. Încercați din nou.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Pe \"{title}\" s-a înregistrat timp, deci nu poate fi ștearsă. În schimb o puteți anula: înregistrările de timp rămân.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Ștergeți \"{title}\"? Se elimină și legăturile ei cu alte sarcini. Acțiunea nu poate fi anulată.", + "Keep task": "Păstrează sarcina", + "Cancel task": "Anulează sarcina", + "Only the reporter, the project owner or an admin can delete this task.": "Doar cel care a raportat-o, proprietarul proiectului sau un administrator poate șterge această sarcină.", + "Could not delete the task. Please try again.": "Sarcina nu a putut fi ștearsă. Încercați din nou.", + "Could not cancel the task. Please try again.": "Sarcina nu a putut fi anulată. Încercați din nou.", + "Responsible": "Responsabil", + "Also working on this": "Mai lucrează la asta", + "Labels": "Etichete", + "Could not change the priority. Please try again.": "Prioritatea nu a putut fi schimbată. Încercați din nou.", + "Other project members who work on this task alongside the person responsible.": "Alți membri ai proiectului care lucrează la această sarcină împreună cu responsabilul.", + "Duplicate": "Duplică", + "Could not copy the task. Please try again.": "Sarcina nu a putut fi copiată. Încercați din nou.", + "Subtasks": "Subsarcini", + "{done} of {total} done": "{done} din {total} finalizate", + "Add a subtask": "Adaugă o subsarcină", + "Checklist": "Listă de verificare", + "Checklist item actions": "Acțiuni pentru elementul listei", + "Add a checklist item": "Adaugă un element în listă", + "Subtasks: {estimate} estimated, {logged} logged": "Subsarcini: {estimate} estimat, {logged} înregistrat", + "Total estimate: {total}": "Estimare totală: {total}", + "Part of {title}": "Parte din {title}", + "Checklist: {count} done": "Listă de verificare: {count} finalizate", + "This task has subtasks: {count}.": "Această sarcină are subsarcini: {count}.", + "Keep subtasks as separate tasks": "Păstrează subsarcinile ca sarcini separate", + "Delete subtasks too": "Șterge și subsarcinile", + "Copy of {title}": "Copie a {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Sarcina a fost copiată, dar nu toate subsarcinile ei. Verificați copia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Pași mici în cadrul sarcinii. Fiecare element are un id, un text și dacă este finalizat.", + "Open work per person and per project.": "Muncă deschisă pe persoană și pe proiect.", + "View": "Vizualizare", + "By person": "Pe persoană", + "By project": "Pe proiect", + "Hours left": "Ore rămase", + "Tasks without an estimate": "Sarcini fără estimare", + "Due in 14 days": "Scadente în 14 zile", + "Shared": "Partajate", + "Unassigned": "Neatribuite", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Se afișează munca din proiectele pe care le puteți vedea. Orele se socotesc pentru persoana responsabilă; sarcinile partajate se socotesc fără ore.", + "No open work in these projects.": "Nu există muncă deschisă în aceste proiecte.", + "Open work": "Muncă deschisă", + "{count} open tasks": "{count} sarcini deschise", + "Create a project to see capacity here.": "Creați un proiect pentru a vedea aici capacitatea.", + "My tasks": "Sarcinile mele", + "Show all my tasks": "Arată toate sarcinile mele", + "No tasks assigned to you": "Nu aveți sarcini atribuite", + "Browse projects": "Răsfoiți proiectele", + "Later": "Mai târziu", + "Due {date}": "Scadent {date}", + "Could not change the status. Please try again.": "Starea nu a putut fi schimbată. Încercați din nou.", + "Completed today": "Finalizate azi", + "My open tasks": "Sarcinile mele deschise", + "My overdue tasks": "Sarcinile mele întârziate", + "My tasks in progress": "Sarcinile mele în lucru", + "Pin to the top": "Fixează sus", + "Unpin": "Anulează fixarea", + "Pinned": "Fixat", + "Actions for {title}": "Acțiuni pentru {title}", + "Could not save your project order. Please try again.": "Ordinea proiectelor nu a putut fi salvată. Încercați din nou.", + "No boards yet": "Încă nu există panouri", + "Create a project to get a board.": "Creați un proiect pentru a avea un panou.", + "Use the Projects page to create and manage your projects and tasks.": "Folosiți pagina Proiecte pentru a crea și gestiona proiectele și sarcinile.", + "Go to projects": "Mergeți la proiecte", + "You are not a member of any projects yet.": "Încă nu sunteți membru al niciunui proiect.", + "Could not search for users. Please try again.": "Utilizatorii nu au putut fi căutați. Încercați din nou.", + "Project creation is restricted to administrators.": "Doar administratorii pot crea proiecte.", + "Only the project owner or an administrator can delete this project.": "Doar proprietarul proiectului sau un administrator poate șterge acest proiect.", + "No projects are available to you yet. Ask an administrator to create one.": "Încă nu aveți proiecte disponibile. Cereți unui administrator să creeze unul.", + "Due: {date}": "Scadent: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Sarcinile cu dată de început sau scadență apar pe cronologie. Adăugați date pentru a le vedea aici.", + "You do not have access to this project.": "Nu aveți acces la acest proiect.", + "Zoom level": "Nivel de zoom", + "Unscheduled": "Neplanificate", + "Start: {date}": "Început: {date}", + "Today": "Astăzi", + "No scheduled tasks": "Nicio sarcină planificată", + "An unexpected error occurred.": "A apărut o eroare neașteptată.", + "Column {number} name": "Numele coloanei {number}", + "Failed to save creation policy": "Regula de creare nu a putut fi salvată", + "All authenticated users": "Toți utilizatorii autentificați", + "Control who may create new projects": "Stabiliți cine poate crea proiecte noi", + "Administrators only": "Doar administratori", + "Project creation": "Crearea proiectelor", + "Allow project creation": "Permiteți crearea proiectelor", + "Creation policy saved successfully": "Regula de creare a fost salvată", + "Initializing…": "Se pornește…", + "e.g. 2h 30m, 90m, 1.5h": "ex. 2h 30m, 90m, 1.5h", + "Log time": "Înregistrați timp", + "Save estimate": "Salvați estimarea", + "Logged: {logged}": "Înregistrat: {logged}", + "over by {amount}": "depășit cu {amount}", + "Time tracking": "Pontaj", + "Estimate": "Estimare", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Introduceți o estimare validă (ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Introduceți o durată validă (ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Înregistrarea de timp nu a putut fi salvată. Încercați din nou.", + "Edit time entry": "Editați înregistrarea de timp", + "Duration": "Durată", + "Date range": "Interval", + "Last week": "Săptămâna trecută", + "No time logged": "Niciun timp înregistrat", + "Log time on a task to see it here.": "Înregistrați timp pe o sarcină pentru a-l vedea aici.", + "To date": "Până la data", + "This week": "Săptămâna aceasta", + "Total: {total}": "Total: {total}", + "From date": "De la data", + "Custom range": "Interval personalizat", + "All time": "Tot timpul", + "Could not delete a task, so some data may remain. Try deleting the project again.": "O sarcină nu a putut fi ștearsă, deci pot rămâne date. Ștergeți proiectul din nou.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "O înregistrare de timp nu a putut fi ștearsă, deci pot rămâne date. Ștergeți proiectul din nou.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "O coloană nu a putut fi ștearsă, deci pot rămâne date. Ștergeți proiectul din nou.", + "Could not delete the project. Please try again.": "Proiectul nu a putut fi șters. Încercați din nou.", + "Notification settings": "Setări pentru notificări", + "Configure when due-date reminders are sent": "Stabiliți când se trimit mementourile de scadență", + "Due-date reminder lead time (hours)": "Timp de avertizare înainte de scadență (ore)", + "Lead time must be between 1 and 336 hours": "Timpul trebuie să fie între 1 și 336 de ore", + "Reminder lead time saved successfully": "Timpul de avertizare a fost salvat", + "Failed to save reminder lead time": "Timpul de avertizare nu a putut fi salvat", + "Notifications": "Notificări", + "Notify me 1 day before a task's due date": "Anunță-mă cu 1 zi înainte de scadența unei sarcini", + "Draft": "Ciornă", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Dacă ora este o ciornă pe care o vede doar profesorul ei, are loc sau este anulată.", + "New release": "Versiune nouă", + "Roadmap chart. The same releases and epics are listed below.": "Graficul foii de parcurs. Aceleași versiuni și epopei sunt listate mai jos.", + "Nothing on the roadmap yet": "Încă nimic pe foaia de parcurs", + "Releases with a target date and epics with dated tasks appear here.": "Aici apar versiunile cu dată țintă și epopeile cu sarcini datate.", + "Releases": "Versiuni", + "No releases yet": "Încă nu există versiuni", + "Target date: {date}": "Dată țintă: {date}", + "No target date": "Fără dată țintă", + "Edit {name}": "Editează {name}", + "Mark {name} as released": "Marchează {name} ca lansată", + "Mark as released": "Marchează ca lansată", + "Epics": "Epopei", + "No epics yet. Open a task to make it an epic.": "Încă nu există epopei. Deschideți o sarcină pentru a o face epopee.", + "Not scheduled yet": "Încă neprogramat", + "Planned": "Planificată", + "Released": "Lansată", + "Edit release": "Editează versiunea", + "Target date": "Dată țintă", + "Could not save the release. Please try again.": "Versiunea nu a putut fi salvată. Încercați din nou.", + "Every task of this release is done or cancelled.": "Fiecare sarcină a acestei versiuni este finalizată sau anulată.", + "Not finished yet: {count}": "Încă nefinalizate: {count}", + "What happens to these tasks?": "Ce se întâmplă cu aceste sarcini?", + "Move to {name}": "Mută în {name}", + "Remove the release": "Elimină versiunea", + "Keep it on {name}": "Păstrează-le în {name}", + "Could not mark the release as released. Please try again.": "Versiunea nu a putut fi marcată ca lansată. Încercați din nou.", + "Roadmap": "Foaie de parcurs", + "Tasks or roadmap": "Sarcini sau foaie de parcurs", + "Release": "Versiune", + "Epic": "Epopee", + "This task is an epic": "Această sarcină este o epopee", + "A named, dated delivery of a project that its tasks are planned against.": "O livrare denumită și datată a unui proiect, față de care se planifică sarcinile sale.", + "Name of the release": "Numele versiunii", + "The project this release belongs to": "Proiectul căruia îi aparține această versiune", + "What this release delivers": "Ce livrează această versiune", + "When work on the release starts": "Când începe lucrul la versiune", + "The date the release is due": "Data la care versiunea trebuie să fie gata", + "Whether the release is planned, released or archived": "Dacă versiunea este planificată, lansată sau arhivată", + "Released on": "Lansată la", + "When the release was marked as released": "Când versiunea a fost marcată ca lansată", + "The release this task is planned for": "Versiunea pentru care este planificată această sarcină", + "Board view options": "Opțiuni de afișare a tablei", + "Colour cards": "Colorează cardurile", + "No colour": "Fără culoare", + "By label": "După etichetă", + "Swimlanes": "Benzi", + "No swimlanes": "Fără benzi", + "By assignee": "După responsabil", + "By epic": "După epic", + "No assignee": "Neatribuit", + "No epic": "Fără epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Cardurile rămân pe rândul epicului lor. Schimbați epicul pe pagina sarcinii.", + "Hand over to": "Predă către", + "Could not save your board view. It applies until you reload.": "Afișarea tablei nu a fost salvată. Se aplică până la reîncărcare.", + "Timetable wish": "Dorință de orar", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "O dorință pe care generatorul o ia în calcul. Respectă mereu o dorință strictă, iar una flexibilă când poate.", + "Whether the wish is about a teacher, a group, a room or one activity": "Dacă dorința privește un profesor, o grupă, o sală sau o activitate", + "Teacher": "Profesor", + "Group": "Grupă", + "Reference": "Referință", + "The user, group, room or activity the wish is about": "Utilizatorul, grupa, sala sau activitatea la care se referă dorința", + "What the wish asks for": "Ce cere dorința", + "Not on these periods": "Nu în aceste ore", + "Preferably not on these periods": "De preferință nu în aceste ore", + "At most a number of lessons a day": "Cel mult un număr de ore pe zi", + "No free periods between lessons": "Fără ferestre între ore", + "Always the same room": "Mereu aceeași sală", + "Periods": "Ore", + "The periods of the week the wish is about, such as wed-5": "Orele din săptămână la care se referă dorința, de exemplu wed-5", + "Limit": "Limită", + "The most lessons a day, for a wish of that kind": "Numărul maxim de ore pe zi, pentru o dorință de acest fel", + "Strength": "Tărie", + "Whether the generator must keep the wish or should keep it": "Dacă generatorul trebuie sau ar trebui să respecte dorința", + "Hard": "Strictă", + "Soft": "Flexibilă", + "Weight": "Pondere", + "How much a soft wish counts, from 1 to 3": "Cât contează o dorință flexibilă, de la 1 la 3", + "Why the wish exists": "De ce există dorința", + "Timetable scenario": "Scenariu de orar", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Un model săptămânal, făcut de generator sau preluat din orarul actual. Își păstrează datele de intrare și cât de bine respectă dorințele.", + "The name timetablers know the scenario by": "Numele sub care cei care fac orarul cunosc scenariul", + "Whether the generator made it or it came from the current timetable": "Dacă l-a făcut generatorul sau vine din orarul actual", + "Generated": "Generat", + "From the current timetable": "Din orarul actual", + "Week of": "Săptămâna din", + "The Monday of the first week of the window": "Lunea primei săptămâni a perioadei", + "Window start": "Începutul perioadei", + "The first day the week pattern applies to": "Prima zi în care se aplică modelul săptămânal", + "Window end": "Sfârșitul perioadei", + "The last day the week pattern applies to": "Ultima zi în care se aplică modelul săptămânal", + "Waiting, generating, done, failed, or published as draft lessons": "În așteptare, în generare, gata, eșuat sau publicat ca ore ciornă", + "Waiting": "În așteptare", + "Generating": "În generare", + "Failed": "Eșuat", + "Published": "Publicat", + "Seed": "Sămânță", + "The number the generator starts from, so a run can be repeated": "Numărul de la care pornește generatorul, ca o rulare să poată fi repetată", + "Input": "Date de intrare", + "The periods, rooms, lessons and wishes the scenario was made from": "Orele, sălile, lecțiile și dorințele din care a rezultat scenariul", + "Placements": "Plasări", + "Each lesson with the period and room it was given": "Fiecare lecție cu ora și sala primite", + "Unplaced lessons": "Lecții neplasate", + "Lessons without a place, each with the hard wish that blocked it": "Lecții fără loc, fiecare cu dorința strictă care a blocat-o", + "Broken wishes": "Dorințe încălcate", + "The wishes this scenario breaks, with the lessons that break them": "Dorințele pe care acest scenariu le încalcă, cu lecțiile implicate", + "Measures": "Indicatori", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Lecții plasate, dorințe încălcate, ferestre ale profesorilor, ore pe zi și folosirea sălilor", + "Reason": "Motiv", + "Why the run failed": "De ce a eșuat rularea", + "Published at": "Publicat la", + "When the scenario was written out as draft lessons": "Când a fost scris scenariul ca ore ciornă", + "Edit wish": "Editează dorința", + "New wish": "Dorință nouă", + "Hard: the generator always keeps it": "Strictă: generatorul o respectă mereu", + "Soft: the generator keeps it where it can": "Flexibilă: generatorul o respectă unde poate", + "Weight (1 to 3)": "Pondere (de la 1 la 3)", + "Most lessons a day": "Cel mult ore pe zi", + "Period": "Oră", + "{day} period {number}": "{day} ora {number}", + "Teacher (user name)": "Profesor (nume de utilizator)", + "Activity (group:subject)": "Activitate (grupă:materie)", + "Say who or what the wish is about.": "Indicați la cine sau la ce se referă dorința.", + "Choose at least one period.": "Alegeți cel puțin o oră.", + "The limit is a whole number of 1 or more.": "Limita este un număr întreg de cel puțin 1.", + "Timetable": "Orar", + "Wishes": "Dorințe", + "Timetable wishes": "Dorințe pentru orar", + "Generator run": "Rularea generatorului", + "Generator progress": "Progresul generatorului", + "The run failed: {reason}": "Rularea a eșuat: {reason}", + "{placed} of {lessons} lessons placed": "{placed} din {lessons} ore plasate", + "Generate again": "Generează din nou", + "Generate": "Generează", + "Every lesson has a place.": "Fiecare oră are un loc.", + "Lesson": "Oră", + "No free period and room": "Nicio oră și sală liberă", + "Broken soft wishes": "Dorințe flexibile încălcate", + "Every soft wish is kept.": "Fiecare dorință flexibilă este respectată.", + "Wish": "Dorință", + "Lessons": "Ore", + "Generating: {percent}% of the time budget used": "Se generează: {percent}% din timp folosit", + "Waiting to start": "Așteaptă pornirea", + "Published as draft lessons": "Publicat ca ore ciornă", + "Could not read the scenario.": "Scenariul nu a putut fi citit.", + "Could not start the run.": "Rularea nu a putut porni.", + "Scenarios": "Scenarii", + "Timetable scenarios": "Scenarii de orar", + "Scenario": "Scenariu", + "Take the current timetable": "Preia orarul actual", + "Could not take the current timetable.": "Nu s-a putut prelua orarul actual.", + "Broken hard wishes": "Dorințe obligatorii încălcate", + "Not on a period of the week grid": "Nu este pe o oră din grila săptămânală", + "Compare scenarios": "Compară scenarii", + "Scenarios to compare": "Scenarii de comparat", + "Choose two or three scenarios to compare them.": "Alegeți două sau trei scenarii pentru a le compara.", + "Measure": "Măsură", + "Best": "Cel mai bun", + "Lessons that differ": "Ore care diferă", + "No lesson differs.": "Nicio oră nu diferă.", + "Not placed": "Neplasată", + "{period} in {room}": "{period} în {room}", + "Lessons placed": "Ore plasate", + "Lessons without a place": "Ore fără loc", + "Clashes": "Conflicte", + "Hard wishes broken": "Dorințe stricte încălcate", + "Soft wishes broken": "Dorințe flexibile încălcate", + "Soft wishes broken, weighted": "Dorințe flexibile încălcate, ponderate", + "Free periods between lessons, all teachers": "Ferestre, toți profesorii", + "Most free periods of one teacher": "Cele mai multe ferestre ale unui profesor", + "Most lessons of one group on a day": "Cele mai multe ore ale unei grupe într-o zi", + "Room use": "Utilizarea sălilor", + "Publish as draft lessons": "Publică drept ore ciornă", + "Draft lessons written: {count}": "Ore ciornă scrise: {count}", + "Could not publish the scenario.": "Scenariul nu a putut fi publicat.", + "Rules": "Reguli", + "Rules for {column}": "Reguli pentru {column}", + "When a card enters this column": "Când un card intră în această coloană", + "Action": "Acțiune", + "Set the priority": "Setează prioritatea", + "Assign to": "Atribuie lui", + "Assign the person who moved the card": "Atribuie persoanei care a mutat cardul", + "Remove the assignee": "Elimină responsabilul", + "Add a label": "Adaugă o etichetă", + "No longer a project member": "Nu mai este membru al proiectului", + "This label no longer exists": "Această etichetă nu mai există", + "Add rule": "Adaugă regulă", + "Remove rule": "Elimină regula", + "No rules yet. Add one to change a card when it enters this column.": "Încă nu există reguli. Adăugați una pentru a schimba un card când intră în această coloană.", + "Could not save the rules. Please try again.": "Regulile nu au putut fi salvate. Încercați din nou.", + "1 rule runs when a card enters this column": "1 regulă rulează când un card intră în această coloană", + "{count} rules run when a card enters this column": "Reguli care rulează când un card intră în această coloană: {count}", + "Rules applied: {changes}": "Reguli aplicate: {changes}", + "assigned to {name}": "atribuit lui {name}", + "assignee removed": "responsabil eliminat", + "priority {priority}": "prioritate {priority}", + "label {label}": "etichetă {label}", + "What happens to a card when it enters this column, applied in list order.": "Ce se întâmplă cu un card când intră în această coloană, în ordinea listei.", + "Value": "Valoare", + "What the rule does to the card.": "Ce face regula cu cardul.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioritatea, id-ul utilizatorului sau id-ul etichetei folosite de acțiune; gol pentru acțiunile fără valoare.", + "is not": "nu este", + "{dimension} is not": "{dimension} nu este", + "Saved filters": "Filtre salvate", + "No saved filters yet": "Încă nu există filtre salvate", + "Save filter": "Salvează filtrul", + "Rename \"{name}\"": "Redenumește „{name}”", + "Delete \"{name}\"": "Șterge „{name}”", + "Clear filters": "Golește filtrele", + "Showing {shown} of {total} tasks": "Se afișează {shown} din {total} sarcini", + "Me": "Eu", + "No date": "Fără dată", + "Rename saved filter": "Redenumește filtrul salvat", + "Share with the project": "Partajează cu proiectul", + "Give the filter a name": "Dați un nume filtrului", + "Could not save the filter. Please try again.": "Filtrul nu a putut fi salvat. Încercați din nou.", + "Some labels in \"{name}\" no longer exist and were left out.": "Unele etichete din „{name}” nu mai există și au fost omise.", + "Could not delete the filter. Please try again.": "Filtrul nu a putut fi șters. Încercați din nou.", + "Saved filter": "Filtru salvat", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Un filtru de tablă cu nume al unui proiect, privat pentru cine l-a salvat, dacă nu este partajat cu proiectul.", + "The project whose board the filter applies to": "Proiectul pe a cărui tablă se aplică filtrul", + "The name the filter is listed under": "Numele sub care apare filtrul în listă", + "Saved by": "Salvat de", + "Nextcloud user id of the person who saved the filter": "Id-ul de utilizator Nextcloud al celui care a salvat filtrul", + "Shared with the project": "Partajat cu proiectul", + "Whether every project member sees and applies the filter": "Dacă fiecare membru al proiectului vede și poate aplica filtrul", + "Criteria": "Criterii", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtrul: responsabil, etichetă, prioritate și termen, fiecare cu este sau nu este și valorile sale", + "Cross-project view": "Vizualizare între proiecte", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "O selecție salvată de proiecte ale căror sarcini sunt afișate împreună pe coloane de stare, partajată cu persoanele pe care le numește.", + "Shared with": "Partajată cu", + "The name the view is listed under": "Numele sub care este listată vizualizarea", + "Nextcloud user id of the person who saved the view": "Id-ul de utilizator Nextcloud al persoanei care a salvat vizualizarea", + "Nextcloud user ids of the people the view is shared with": "Id-urile de utilizator Nextcloud ale persoanelor cu care este partajată vizualizarea", + "The projects whose tasks the view shows, at most twenty": "Proiectele ale căror sarcini le arată vizualizarea, cel mult douăzeci", + "1 project in this view is hidden from you.": "1 proiect din această vizualizare îți este ascuns.", + "{count} projects in this view are hidden from you.": "{count} proiecte din această vizualizare îți sunt ascunse.", + "{project} has no column for {status}.": "{project} nu are o coloană pentru {status}.", + "This view does not exist or is not shared with you.": "Această vizualizare nu există sau nu este partajată cu tine.", + "\"{task}\" moved to {status}.": "\"{task}\" a fost mutată în {status}.", + "Project: {title}": "Proiect: {title}", + "Cross-project views": "Vizualizări între proiecte", + "New view": "Vizualizare nouă", + "Edit view": "Editează vizualizarea", + "Delete view": "Șterge vizualizarea", + "Give the view a name": "Dă-i un nume vizualizării", + "Pick at least one project": "Alege cel puțin un proiect", + "A view shows at most {max} projects": "O vizualizare arată cel mult {max} proiecte", + "Could not save the view. Please try again.": "Vizualizarea nu a putut fi salvată. Încearcă din nou.", + "Could not delete the view. Please try again.": "Vizualizarea nu a putut fi ștearsă. Încearcă din nou.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Ștergi „{title}”? Proiectele și sarcinile lor rămân neschimbate.", + "People see the tasks of the projects they are in, never more.": "Fiecare vede doar sarcinile proiectelor din care face parte.", + "No views yet. A view shows the tasks of several of your projects together.": "Încă nu există vizualizări. O vizualizare arată împreună sarcinile mai multor proiecte ale tale.", + "Projects in view: {count}": "Proiecte în vizualizare: {count}", + "Notify me when a task is assigned to me": "Anunță-mă când mi se atribuie o sarcină", + "Also send these to me by email": "Trimite-mi-le și prin e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Adaugă o adresă de e-mail în setările personale Nextcloud pentru a primi e-mailuri.", + "Code link": "Legătură de cod", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Un commit, o ramură, o cerere de îmbinare sau o problemă pe o platformă de cod care privește o sarcină.", + "The task the link belongs to": "Sarcina căreia îi aparține legătura", + "The project of the task": "Proiectul sarcinii", + "Task key": "Cheia sarcinii", + "The task key the forge text named, such as VC-12": "Cheia sarcinii numită în textul platformei, de exemplu VC-12", + "What the link points at": "Spre ce arată legătura", + "Link": "Legătură", + "The address of the item in the forge": "Adresa elementului pe platforma de cod", + "The commit message, branch name or merge request title": "Mesajul commit-ului, numele ramurii sau titlul cererii de îmbinare", + "Repository": "Depozit", + "The repository, such as acme/portal": "Depozitul, de exemplu acme/portal", + "Forge id": "Id pe platformă", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Id-ul propriu al elementului pe platforma de cod, de exemplu github:acme/portal#42 sau un hash de commit", + "State": "Stare", + "The state of a merge request or issue": "Starea unei cereri de îmbinare sau a unei probleme", + "Who made the commit or opened the merge request": "Cine a făcut commit-ul sau a deschis cererea de îmbinare", + "When the commit was made or the merge request last changed": "Când s-a făcut commit-ul sau s-a schimbat ultima dată cererea de îmbinare", + "Added by": "Adăugat de", + "Whether a person added the link or the integration wrote it": "Dacă o persoană a adăugat legătura sau a scris-o integrarea", + "Nextcloud user UIDs of project members": "ID-urile de utilizator Nextcloud ale membrilor proiectului", + "Add link": "Adaugă legătură", + "Added by hand": "Adăugat manual", + "Branch": "Ramură", + "Code": "Cod", + "Commit": "Commit", + "From the integration": "Din integrare", + "Link to a commit, branch or merge request": "Legătură către un commit, o ramură sau o cerere de îmbinare", + "Merge request": "Cerere de îmbinare", + "Merged": "Îmbinată", + "No code linked yet. Name {key} in a commit message or paste a link.": "Încă nu există cod legat. Menționează {key} într-un mesaj de commit sau lipește o legătură.", + "No code linked yet. Paste a link to a commit or merge request.": "Încă nu există cod legat. Lipește o legătură către un commit sau o cerere de îmbinare.", + "Paste a web address that starts with https://.": "Lipește o adresă web care începe cu https://.", + "Remove link {title}": "Elimină legătura {title}", + "The link could not be added.": "Legătura nu a putut fi adăugată.", + "The link could not be removed.": "Legătura nu a putut fi eliminată.", + "This link is already on the task.": "Această legătură este deja la sarcină.", + "Code forges": "Platforme de cod", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Leagă commit-urile și pull request-urile din GitHub de sarcini. Integriq primește evenimentele; planninq nu apelează niciodată GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Descarcă configurația și import-o în Integriq. Apoi completează un secret în regula \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "În GitHub, adaugă depozitului un webhook cu această adresă și același secret. Alege tipul de conținut application/json și evenimentele push și pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Menționează cheia sarcinii, de exemplu VC-12, într-un mesaj de commit, un nume de ramură sau titlul unui pull request. Legătura apare apoi la acea sarcină.", + "Without Integriq, project members can still paste a link on the task page.": "Fără Integriq, membrii proiectului pot lipi în continuare o legătură pe pagina sarcinii.", + "Download the Integriq configuration": "Descarcă configurația Integriq", + "Calendar": "Calendar", + "Previous": "Anterior", + "Calendar view": "Vizualizare calendar", + "Starts:": "Începe:", + "No tasks with a date in this month.": "Nicio sarcină cu dată în această lună.", + "Week of {start} to {end}": "Săptămâna {start} – {end}", + "My calendar": "Calendarul meu", + "Show as list": "Afișează ca listă", + "Show as calendar": "Afișează în calendar", + "Open my calendar": "Deschide calendarul meu", + "Nextcloud Tasks": "Sarcini Nextcloud", + "Show my tasks in Nextcloud Tasks": "Afișează sarcinile mele în Sarcini Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Sarcinile atribuite ție sau partajate cu tine apar într-o listă \"Planninq\" în Sarcini și Calendar Nextcloud. Modificările făcute acolo sunt înlocuite la următoarea modificare în Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Acest server nu poate scrie în Sarcini Nextcloud, așa că exportul nu este disponibil.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Gestionat de Planninq. Modificările făcute aici sunt înlocuite la următoarea modificare în Planninq.", + "Working days and holidays": "Zile lucrătoare și sărbători", + "Dates set on the timeline skip the days that are not working days.": "Datele stabilite pe cronologie sar peste zilele care nu sunt lucrătoare.", + "Working weekdays": "Zilele lucrătoare ale săptămânii", + "Non-working days": "Zile nelucrătoare", + "No non-working days yet.": "Încă nu există zile nelucrătoare.", + "Add day": "Adaugă zi", + "Year": "An", + "Add Dutch national holidays": "Adaugă sărbătorile naționale olandeze", + "Save working days": "Salvează zilele lucrătoare", + "Choose at least one working weekday.": "Alege cel puțin o zi lucrătoare.", + "Working days saved.": "Zilele lucrătoare au fost salvate.", + "Could not save the working days.": "Zilele lucrătoare nu au putut fi salvate.", + "New Year's Day": "Anul Nou", + "Easter Sunday": "Duminica Paștelui", + "Easter Monday": "Lunea Paștelui", + "King's Day": "Ziua Regelui", + "Liberation Day": "Ziua Eliberării", + "Ascension Day": "Înălțarea Domnului", + "Whit Sunday": "Rusaliile", + "Whit Monday": "A doua zi de Rusalii", + "Christmas Day": "Crăciunul", + "Boxing Day": "A doua zi de Crăciun", + "Dates of {title}": "Datele pentru {title}", + "The due date cannot be before the start date.": "Termenul nu poate fi înainte de data de început.", + "{title}, from {start} to {end}": "{title}, de la {start} la {end}", + "The dates could not be saved.": "Datele nu au putut fi salvate.", + "{title} now runs from {start} to {end}": "{title} se desfășoară acum de la {start} la {end}", + "Auto-scheduling": "Planificare automată", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Când este activă, mutarea unui termen mai târziu pe cronologie propune mutarea și a sarcinilor pe care le blochează.", + "Move blocked tasks along when a task slips": "Mută sarcinile blocate când o sarcină întârzie", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Pe cronologie, un termen mai târziu propune mutarea sarcinilor blocate. Contează doar legăturile \"blochează\", iar sarcinile se mută doar mai târziu.", + "Move the tasks that wait for {title}?": "Muți sarcinile care așteaptă {title}?", + "These tasks wait for it and would start after its new due date:": "Aceste sarcini o așteaptă și ar începe după noul termen:", + "{count} tasks would move; the first {limit} are listed.": "S-ar muta {count} sarcini; sunt listate primele {limit}.", + "Now": "Acum", + "After the move": "După mutare", + "Only this task": "Doar această sarcină", + "Move all": "Mută toate", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Oprit la {title}: datele nu au putut fi salvate. Sarcinile dinaintea ei au fost mutate.", + "Cumulative flow": "Flux cumulativ", + "Show as chart": "Afișează ca grafic", + "Show as table": "Afișează ca tabel", + "Tasks per column per day": "Sarcini pe coloană pe zi", + "Tasks without recorded history in this period: {count}": "Sarcini fără istoric înregistrat în această perioadă: {count}", + "Lead and cycle time": "Timp de livrare și timp de ciclu", + "No tasks were finished in this period.": "Nicio sarcină nu a fost finalizată în această perioadă.", + "Finished tasks": "Sarcini finalizate", + "Cycle time, average": "Timp de ciclu, medie", + "Cycle time, 85th percentile": "Timp de ciclu, percentila 85", + "Lead time, average": "Timp de livrare, medie", + "Tasks whose finish time was estimated from their history: {count}": "Sarcini a căror oră de finalizare a fost estimată din istoric: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Timpul de ciclu al fiecărei sarcini finalizate, cu media și percentila 85", + "Slowest tasks": "Cele mai lente sarcini", + "cycle {cycle}, lead {lead}": "ciclu {cycle}, livrare {lead}", + "{days} days": "{days} zile", + "Could not load the flow of this project.": "Fluxul acestui proiect nu a putut fi încărcat.", + "Last {days} days": "Ultimele {days} zile", + "Portfolio flow": "Fluxul portofoliului", + "An admin adds portfolios under Projects, Portfolios.": "Un administrator adaugă portofolii în Proiecte, Portofolii.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Proiecte neafișate, deoarece se afișează cel mult 50 deodată: {count}", + "Could not load the flow of this portfolio.": "Fluxul acestui portofoliu nu a putut fi încărcat.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flux cumulativ și timp de ciclu pe proiectele unui portofoliu.", + "Edit report": "Editează raportul", + "Only tasks where": "Doar sarcinile la care", + "Group by": "Grupează după", + "Display": "Afișare", + "Share with everyone who can read its projects": "Partajează cu toți cei care îi pot citi proiectele", + "The report could not be saved.": "Raportul nu a putut fi salvat.", + "Number of tasks": "Număr de sarcini", + "Bar": "Bare", + "Donut": "Inel", + "Table": "Tabel", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} din {total} proiecte din acest raport nu îți sunt vizibile", + "No tasks match this report.": "Nicio sarcină nu se potrivește acestui raport.", + "None": "Niciunul", + "Could not load this report.": "Acest raport nu a putut fi încărcat.", + "Report": "Raport", + "Your reports": "Rapoartele tale", + "My reports": "Rapoartele mele", + "Shared reports": "Rapoarte partajate", + "You have not built a report yet.": "Nu ai creat încă niciun raport.", + "Nobody has shared a report with you yet.": "Nimeni nu a partajat încă un raport cu tine.", + "Reports you built over tasks, and the ones shared with you.": "Rapoartele pe care le-ai creat despre sarcini, și cele partajate cu tine.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "O interogare salvată despre sarcini: ce proiecte, ce filtre, grupată după ce, numărată sau însumată, și afișată ca tabel sau grafic.", + "The name the report is listed under": "Numele sub care apare raportul în listă", + "What the report shows and who it is for": "Ce arată raportul și pentru cine este", + "Nextcloud user id of the person who saved the report": "Id-ul de utilizator Nextcloud al persoanei care a salvat raportul", + "Who can open the report": "Cine poate deschide raportul", + "Only me": "Doar eu", + "Everyone who can read its projects": "Toți cei care îi pot citi proiectele", + "The projects the report covers, at most fifty": "Proiectele pe care le acoperă raportul, cel mult cincizeci", + "Filters": "Filtre", + "Task fields and the value each must equal": "Câmpurile sarcinii și valoarea cu care fiecare trebuie să fie egal", + "The task field the report groups on": "Câmpul sarcinii după care grupează raportul", + "Count the tasks, or add up a number on them": "Numără sarcinile sau adună un număr din ele", + "Sum": "Sumă", + "Sum of": "Suma câmpului", + "The number added up when the measure is a sum": "Numărul adunat când măsura este o sumă", + "Story points": "Puncte de poveste", + "Estimated duration": "Durată estimată", + "How the report is shown": "Cum este afișat raportul", + "Issue type": "Tip de tichet", + "Task fields and the value each must equal; empty when the report covers every task": "Câmpurile sarcinii și valoarea pe care trebuie să o aibă fiecare; gol când raportul cuprinde toate sarcinile", + "The status a task must have": "Starea pe care trebuie să o aibă o sarcină", + "The priority a task must have": "Prioritatea pe care trebuie să o aibă o sarcină", + "The user a task must be assigned to": "Utilizatorul căruia trebuie să îi fie atribuită o sarcină", + "A label a task must carry": "O etichetă pe care trebuie să o aibă o sarcină", + "The board column a task must be in": "Coloana tablei în care trebuie să fie o sarcină", + "The issue type a task must have": "Tipul de tichet pe care trebuie să îl aibă o sarcină", + "Manager groups": "Grupuri de manageri", + "Member groups": "Grupuri de membri", + "Viewer groups": "Grupuri de cititori", + "Viewers": "Cititori", + "Owning group": "Grup proprietar", + "Nextcloud groups whose members manage the project": "Grupuri Nextcloud ai căror membri gestionează proiectul", + "Nextcloud groups whose members work on the project": "Grupuri Nextcloud ai căror membri lucrează la proiect", + "Nextcloud groups whose members may read the project": "Grupuri Nextcloud ai căror membri pot citi proiectul", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utilizatori Nextcloud care gestionează proiectul: setări, membri și lucru", + "Nextcloud user ids who may read the project and its work but not change it": "Utilizatori Nextcloud care pot citi proiectul și lucrul lui, dar nu îl pot schimba", + "The Nextcloud group that owns the project with its creator, at most one": "Grupul Nextcloud care deține proiectul împreună cu creatorul lui, cel mult unul", + "Nextcloud user ids who may read this through the project": "Utilizatori Nextcloud care pot citi asta prin proiect", + "Nextcloud groups whose members may change this through the project": "Grupuri Nextcloud ai căror membri pot schimba asta prin proiect", + "Nextcloud groups whose members may read this through the project": "Grupuri Nextcloud ai căror membri pot citi asta prin proiect", + "Search for a person or a group…": "Caută o persoană sau un grup…", + "No one found. Your admin's sharing settings decide who you can find.": "Nu a fost găsit nimeni. Setările de partajare ale administratorului decid pe cine poți găsi.", + "Type at least two characters": "Tastează cel puțin două caractere", + "Everyone in this group": "Toată lumea din acest grup", + "Could not search for people. Please try again.": "Căutarea persoanelor a eșuat. Încearcă din nou.", + "Could not remove the group": "Grupul nu a putut fi eliminat", + "Only the owner and managers change who is on this project.": "Doar proprietarul și managerii schimbă cine face parte din acest proiect.", + "Role of {name}": "Rolul lui {name}", + "Manager": "Manager", + "Member": "Membru", + "Viewer": "Cititor", + "Could not change the role": "Rolul nu a putut fi schimbat", + "Owned by group: {name}": "Deținut de grupul: {name}", + "No group owns this project.": "Niciun grup nu deține acest proiect.", + "Owned by group": "Deținut de grup", + "Search for a group…": "Caută un grup…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Niciun grup găsit. Setările de partajare ale administratorului decid ce grupuri poți găsi.", + "No owning group": "Fără grup proprietar", + "Could not search for groups. Please try again.": "Nu s-au putut căuta grupuri. Încearcă din nou.", + "Could not change the owning group": "Grupul proprietar nu a putut fi schimbat", + "You can read this project. Only its members change it.": "Poți citi acest proiect. Doar membrii lui îl modifică.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Cursul predat în această lecție, de exemplu o opțională, când aplicația de învățare a școlii îl cunoaște.", + "Online meeting link": "Linkul lecției online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Unde se alătură elevii acestei lecții online. Butonul Alătură-te apare doar pentru un link https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ro.json b/l10n/ro.json index 0f827a37..182d49db 100644 --- a/l10n/ro.json +++ b/l10n/ro.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Proiecte active", + "Archived projects": "Proiecte arhivate", + "Boards": "Panouri", + "My projects": "Proiectele mele", + "Portfolio": "Portofoliu", + "Project board": "Panoul proiectului", + "Projects I am in": "Proiecte la care particip", + "Timeline": "Cronologie", + "Timesheet": "Fișă de pontaj", + "Features & roadmap": "Funcții și foaie de parcurs", + "Flow": "Flux", + "Flows": "Fluxuri", + "Reports": "Rapoarte", + "Pick a report to open it.": "Alegeți un raport pentru a-l deschide.", + "In progress": "În curs", + "Date": "Dată", + "Due": "Scadență", + "Assignee": "Atribuit lui", + "Who": "Cine", + "What": "Ce", + "Minutes": "Minute", + "Entries": "Intrări", + "Most recent": "Cele mai recente", + "Per person": "Per persoană", + "By status": "După stare", + "By priority": "După prioritate", + "Task status": "Starea sarcinilor", + "Time spent": "Timp petrecut", + "Capacity": "Capacitate", + "Due soonest": "Cu termen apropiat", + "Minutes logged": "Minute înregistrate", + "Nothing is due": "Nu este nimic scadent", + "Nothing logged yet": "Încă nu s-a înregistrat nimic", + "What is open, what is blocked, and what is overdue.": "Ce este deschis, ce este blocat și ce a depășit termenul.", + "How allocation is spread across the people working on projects.": "Cum este distribuită alocarea între persoanele care lucrează la proiecte.", + "Hours logged, and the projects they went to.": "Orele înregistrate și proiectele către care au mers.", + "Billable": "Facturabil", + "Budget: {amount}": "Buget: {amount}", + "Loading projects": "Se încarcă proiectele", + "No projects for this client yet": "Încă nu există proiecte pentru acest client", + "Open in Planninq": "Deschide în Planninq", + "This project could not be found": "Acest proiect nu a fost găsit", + "Untitled project": "Proiect fără titlu", + "and {count} more": "și încă {count}", + "Store": "Magazin", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instalați registre, scheme și fluxuri publicate de alte organizații.", + "Work Date": "Data lucrării", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Acțiuni coloană", + "Columns": "Coloane", + "Could not remove the column. Please try again.": "Coloana nu a putut fi eliminată. Încercați din nou.", + "Could not save the column. Please try again.": "Coloana nu a putut fi salvată. Încercați din nou.", + "Done column": "Coloană finalizate", + "Edit column": "Editează coloana", + "Keep the card's status": "Păstrează starea cardului", + "Move its cards to": "Mută cardurile sale în", + "Move left": "Mută la stânga", + "Move right": "Mută la dreapta", + "Status of cards moved here": "Starea cardurilor mutate aici", + "The last done column cannot be removed.": "Ultima coloană finalizate nu poate fi eliminată.", + "WIP limit": "Limită WIP", + "over limit": "peste limită", + "The status a card gets when it is moved into this column.": "Starea pe care o primește un card când este mutat în această coloană.", + "All priorities": "Toate prioritățile", + "Could not create the task. Please try again.": "Sarcina nu a putut fi creată. Încercați din nou.", + "Created": "Creată", + "Move to backlog": "În backlog", + "Move to board": "Pe tablă", + "New task": "Sarcină nouă", + "Nothing in the backlog": "Nimic în backlog", + "Rank": "Rang", + "Sort by": "Sortează după", + "Sort by rank to reorder": "Sortați după rang pentru a reordona", + "Task actions": "Acțiuni sarcină", + "All labels": "Toate etichetele", + "Filter tasks by label": "Filtrează sarcinile după etichetă", + "View timeline": "Vezi cronologia", + "Board": "Tablă", + "List": "Listă", + "Column": "Coloană", + "Board or list": "Tablă sau listă", + "Log": "Jurnal", + "Add entry": "Adaugă o intrare", + "Show": "Afișează", + "No actions yet": "Încă nu există acțiuni", + "Closed": "Închis", + "Entry actions": "Acțiuni pentru intrare", + "Add action": "Adaugă o acțiune", + "by {author}": "de {author}", + "saved {time}": "salvat {time}", + "Attendees: {names}": "Participanți: {names}", + "Add the first entry": "Adaugă prima intrare", + "Issues": "Probleme", + "Lessons learned": "Lecții învățate", + "Meetings": "Întâlniri", + "Decisions": "Decizii", + "Actions": "Acțiuni", + "Issue": "Problemă", + "Lesson learned": "Lecție învățată", + "Meeting": "Întâlnire", + "Decision": "Decizie", + "About this project": "Despre acest proiect", + "No description yet": "Încă nu există descriere", + "Start date": "Data de început", + "Not set": "Nesetat", + "End date": "Data de sfârșit", + "Progress": "Progres", + "No tasks yet": "Încă nu există sarcini", + "Open the board": "Deschide tabla", + "People": "Persoane", + "Owner": "Proprietar", + "Latest log entries": "Cele mai recente intrări", + "Open the log": "Deschide jurnalul", + "{done} of {total} tasks done": "{done} din {total} sarcini finalizate", + "Edit entry": "Editează intrarea", + "Type": "Tip", + "Attendees": "Participanți", + "Issue is closed": "Problema este închisă", + "Could not save the entry. Please try again.": "Intrarea nu a putut fi salvată. Încercați din nou.", + "From: {title}": "Din: {title}", + "What needs to happen": "Ce trebuie să se întâmple", + "Could not create the action. Please try again.": "Acțiunea nu a putut fi creată. Încercați din nou.", + "The action was created but could not be linked to the entry.": "Acțiunea a fost creată, dar nu a putut fi legată de intrare.", + "Project pages": "Paginile proiectului", + "Overview": "Prezentare generală", + "Risks": "Riscuri", + "Log entry": "Intrare în jurnal", + "A short name for the entry": "Un nume scurt pentru intrare", + "Project": "Proiect", + "The project this entry belongs to": "Proiectul căruia îi aparține această intrare", + "What kind of entry this is": "Ce tip de intrare este", + "When it happened": "Când s-a întâmplat", + "What happened, in Markdown": "Ce s-a întâmplat, în Markdown", + "Whether an issue is still open": "Dacă o problemă este încă deschisă", + "The people at a meeting": "Persoanele de la o întâlnire", + "Tasks that came out of this entry": "Sarcini rezultate din această intrare", + "Add risk": "Adaugă un risc", + "Risk": "Risc", + "Score": "Scor", + "Response": "Răspuns", + "Review date": "Data revizuirii", + "no longer on the project": "nu mai face parte din proiect", + "Edit {title}": "Editează {title}", + "No risks recorded yet": "Încă nu există riscuri înregistrate", + "Add the first risk": "Adaugă primul risc", + "Medium": "Mediu", + "Mitigating": "În atenuare", + "Occurred": "S-a produs", + "Avoid": "Evitare", + "Reduce": "Reducere", + "Transfer": "Transfer", + "Accept": "Acceptare", + "Highest open risks": "Cele mai mari riscuri deschise", + "No open risks": "Niciun risc deschis", + "Open the risk register": "Deschide registrul de riscuri", + "Edit risk": "Editează riscul", + "What could go wrong": "Ce ar putea merge prost", + "Likelihood": "Probabilitate", + "Impact": "Impact", + "Score {score}": "Scor {score}", + "Countermeasures": "Contramăsuri", + "Could not save the risk. Please try again.": "Riscul nu a putut fi salvat. Încercați din nou.", + "Risks by likelihood and impact": "Riscuri după probabilitate și impact", + "Risk scale": "Scala de risc", + "The levels every project scores its risks on, and where low turns into medium and high": "Nivelurile pe care fiecare proiect își punctează riscurile și unde scăzut trece în mediu și ridicat", + "Number of levels": "Numărul de niveluri", + "Likelihood labels": "Etichete pentru probabilitate", + "Impact labels": "Etichete pentru impact", + "Level {level}": "Nivelul {level}", + "Medium from score": "Mediu de la scorul", + "High from score": "Ridicat de la scorul", + "Risk scale saved": "Scala de risc a fost salvată", + "1 risk uses level {level}. Change it first.": "1 risc folosește nivelul {level}. Modificați-l mai întâi.", + "{count} risks use level {level}. Change them first.": "{count} riscuri folosesc nivelul {level}. Modificați-le mai întâi.", + "Every level needs a label, and high must start above medium.": "Fiecare nivel are nevoie de o etichetă, iar ridicat trebuie să înceapă peste mediu.", + "The project this risk belongs to": "Proiectul căruia îi aparține acest risc", + "The cause and the effect, in Markdown": "Cauza și efectul, în Markdown", + "Category": "Categorie", + "A free grouping, such as planning, budget or supplier": "O grupare liberă, cum ar fi planificare, buget sau furnizor", + "How likely it is, on the admin's risk scale": "Cât de probabil este, pe scala de risc a administratorului", + "How hard it would hit, on the admin's risk scale": "Cât de tare ar lovi, pe scala de risc a administratorului", + "Likelihood times impact, calculated by the server": "Probabilitate ori impact, calculat de server", + "Where the risk stands": "Unde se află riscul", + "The person who watches this risk": "Persoana care urmărește acest risc", + "How the project answers the risk": "Cum răspunde proiectul la risc", + "What is done to prevent it or soften it, in Markdown": "Ce se face pentru a-l preveni sau atenua, în Markdown", + "When to look at this risk again": "Când se revizuiește din nou acest risc", + "Very low": "Foarte scăzut", + "Very high": "Foarte ridicat", + "All projects": "Toate proiectele", + "Project status report": "Raport de stare a proiectului", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Un raport datat despre cum stă un proiect la bani, organizare, timp, informare, calitate și risc (aspectele GROTIK), fiecare cu o notă.", + "The project this report is about": "Proiectul la care se referă raportul", + "Report date": "Data raportului", + "The day the report describes": "Ziua pe care o descrie raportul", + "Money": "Bani", + "How the project stands on this aspect": "Cum stă proiectul la acest aspect", + "On track": "Pe drumul cel bun", + "At risk": "În pericol", + "Off track": "Deviat", + "Money note": "Notă despre bani", + "A short explanation of this status": "O scurtă explicație a acestei stări", + "Organisation": "Organizare", + "Organisation note": "Notă despre organizare", + "Time": "Timp", + "Time note": "Notă despre timp", + "Information": "Informare", + "Information note": "Notă despre informare", + "Quality": "Calitate", + "Quality note": "Notă despre calitate", + "Risk note": "Notă despre risc", + "Overall": "General", + "The worst of the six statuses, calculated by the server": "Cea mai proastă dintre cele șase stări, calculată de server", + "Health: money": "Sănătate: bani", + "Copied from the newest status report": "Copiat din cel mai recent raport de stare", + "Health: organisation": "Sănătate: organizare", + "Health: time": "Sănătate: timp", + "Health: information": "Sănătate: informare", + "Health: quality": "Sănătate: calitate", + "Health: risk": "Sănătate: risc", + "Health: overall": "Sănătate: general", + "Health: report date": "Sănătate: data raportului", + "The date of the newest status report": "Data celui mai recent raport de stare", + "New report": "Raport nou", + "Only the project owner writes status reports.": "Doar proprietarul proiectului scrie rapoarte de stare.", + "Latest report, {date}": "Ultimul raport, {date}", + "Aspect": "Aspect", + "Note": "Notă", + "Report history": "Istoricul rapoartelor", + "Author": "Autor", + "No status reports yet": "Încă nu există rapoarte de stare", + "Write the first report": "Scrieți primul raport", + "Choose a status for every aspect to save the report.": "Alegeți o stare pentru fiecare aspect pentru a salva raportul.", + "Suggested: on track.": "Sugestie: pe drumul cel bun.", + "Suggested: at risk.": "Sugestie: în pericol.", + "Suggested: off track.": "Sugestie: deviat.", + "1 task is past its due date.": "1 sarcină a depășit termenul.", + "{count} tasks are past their due date.": "Sarcini care au depășit termenul: {count}.", + "The end date has passed with 1 open task.": "Data de final a trecut cu 1 sarcină deschisă.", + "The end date has passed with {count} open tasks.": "Data de final a trecut, sarcini deschise: {count}.", + "No open task is past its due date.": "Nicio sarcină deschisă nu a depășit termenul.", + "The highest open risk, \"{title}\", scores {score}.": "Cel mai mare risc deschis, „{title}”, are scorul {score}.", + "There are no open risks.": "Nu există riscuri deschise.", + "Costs are at {percent}% of the budget.": "Costurile sunt la {percent}% din buget.", + "No suggestion: the project has no budget.": "Nicio sugestie: proiectul nu are buget.", + "No suggestion: no costs are recorded for this project yet.": "Nicio sugestie: nu există încă costuri înregistrate pentru acest proiect.", + "The report was not saved. Only the project owner can write status reports.": "Raportul nu a fost salvat. Doar proprietarul proiectului poate scrie rapoarte de stare.", + "No report": "Niciun raport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Un grup de proiecte conduse de aceleași persoane, cum ar fi un departament sau un program. Responsabilii lui citesc fiecare proiect din el.", + "The name of the portfolio": "Numele portofoliului", + "What the portfolio holds and who runs it": "Ce conține portofoliul și cine îl conduce", + "A colour for the portfolio's section in project lists": "O culoare pentru secțiunea portofoliului în listele de proiecte", + "Managers": "Responsabili", + "Nextcloud user UIDs of the people who run the portfolio": "ID-urile de utilizator Nextcloud ale persoanelor care conduc portofoliul", + "Order": "Ordine", + "Where the portfolio comes in project lists, lowest first": "Locul portofoliului în listele de proiecte, cel mai mic primul", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Scala de risc proprie a acestui portofoliu în JSON, în aceeași formă ca scala întregii aplicații. Gol înseamnă scala aplicației.", + "Portfolio readers": "Cititorii portofoliului", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID-urile de utilizator Nextcloud ale responsabililor portofoliului proiectului", + "The portfolio this project belongs to": "Portofoliul din care face parte proiectul", + "No portfolio": "Fără portofoliu", + "All portfolios": "Toate portofoliile", + "You read this project as a manager of its portfolio. Only its members change it.": "Citiți acest proiect ca responsabil al portofoliului său. Doar membrii îl modifică.", + "Portfolios": "Portofolii", + "Portfolio status": "Starea portofoliului", + "No portfolios yet": "Încă nu există portofolii", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Un administrator adaugă portofolii în Proiecte, Portofolii. Proiectele unui portofoliu sunt listate aici cu starea lor.", + "Roll-up": "Rezumat", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} pe drumul bun, {atRisk} în risc, {offTrack} deviate, {noReport} fără raport", + "No project in this portfolio that you can read.": "Niciun proiect din acest portofoliu pe care îl poți citi.", + "Start": "Început", + "End": "Sfârșit", + "Budget": "Buget", + "Last report": "Ultimul raport", + "Out of date": "Învechit", + "Portfolio timeline": "Cronologia portofoliului", + "Zoom": "Zoom", + "Could not load the timeline": "Cronologia nu a putut fi încărcată", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Un administrator adaugă portofolii în Proiecte, Portofolii. Proiectele unui portofoliu sunt afișate aici pe o singură cronologie.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Deschide un proiect pentru a-i vedea fazele și sarcinile. Cronologia este doar pentru citire.", + "Phase: {title}": "Fază: {title}", + "Left out because you cannot read them: {count} projects": "Omise pentru că nu le poți citi: {count} proiecte", + "Week": "Săptămână", + "Day": "Zi", + "Month": "Lună", + "Please try again later.": "Încearcă din nou mai târziu.", + "Status reports": "Rapoarte de stare", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "După câte zile ultimul raport de stare al unui proiect este marcat ca învechit în prezentarea portofoliului", + "Reporting period (days)": "Perioada de raportare (zile)", + "The reporting period is a whole number of days from 1 to 365.": "Perioada de raportare este un număr întreg de zile de la 1 la 365.", + "Reporting period saved": "Perioada de raportare a fost salvată", + "The reporting period was not saved. Please try again.": "Perioada de raportare nu a fost salvată. Încearcă din nou.", + "Every project of a portfolio with its status per aspect, rolled up.": "Fiecare proiect al unui portofoliu cu starea pe aspecte, rezumat.", + "The projects of a portfolio on one timeline.": "Proiectele unui portofoliu pe o singură cronologie.", + "Phases": "Faze", + "Add phase": "Adaugă fază", + "No phases yet": "Încă nu există faze", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Împarte proiectul în faze, precum inițiere, definire și realizare. O fază se închide când documentul ei de încheiere este încărcat.", + "{hours} hours": "{hours} ore", + "Concluding document: {title}": "Document de încheiere: {title}", + "Concluding document missing": "Lipsește documentul de încheiere", + "Move {title} up": "Mută {title} în sus", + "Move {title} down": "Mută {title} în jos", + "Close phase": "Închide faza", + "Phase": "Fază", + "Files": "Fișiere", + "Notes": "Note", + "Audit trail": "Jurnal de audit", + "Edit phase": "Editează faza", + "Name": "Nume", + "Budget hours": "Ore bugetate", + "Could not save the phase. Please try again.": "Faza nu a putut fi salvată. Încearcă din nou.", + "Close phase {title}": "Închide faza {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "O fază se închide cu documentul ei de încheiere: încarcă-l aici sau alege unul dintre fișierele fazei.", + "Concluding document": "Document de încheiere", + "This phase has no files yet.": "Această fază nu are încă fișiere.", + "Upload a document": "Încarcă un document", + "The document was not uploaded. Please try again.": "Documentul nu a fost încărcat. Încearcă din nou.", + "Upload the concluding document before you close this phase.": "Încarcă documentul de încheiere înainte să închizi această fază.", + "This phase cannot be closed from its current status.": "Această fază nu poate fi închisă din starea ei actuală.", + "The phase was not closed. Please try again.": "Faza nu a fost închisă. Încearcă din nou.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Id-ul fișierului acestei faze care o încheie. Faza poate fi finalizată doar când este completat și fișierul este atașat.", + "Import from Microsoft Project": "Importă din Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Alegeți un plan salvat din Microsoft Project în format XML. Nimic nu se importă până nu confirmați.", + "Plan file": "Fișierul planului", + "What the import creates": "Ce creează importul", + "Tasks": "Sarcini", + "Sub-tasks": "Subsarcini", + "Milestones": "Jaloane", + "Links": "Legături", + "Already imported, updated in place: {count}": "Deja importate, actualizate pe loc: {count}", + "What does not carry over": "Ce nu se preia", + "Tasks with resources, which are not imported: {count}": "Sarcini cu resurse, care nu se importă: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Sarcini mai adânci decât nivelul 3, puse sub sarcina lor de nivel 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Legături altele decât sfârșit-început, importate ca legături asociate: {count}", + "Link lags, which are dropped: {count}": "Decalaje ale legăturilor, care se renunță: {count}", + "Links to a summary task, which are not imported: {count}": "Legături către o sarcină rezumat, care nu se importă: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Legături către sarcini din afara acestui plan, care nu se importă: {count}", + "No longer in the plan": "Nu mai este în plan", + "These stay in the project; remove them yourself if they are no longer needed.": "Rămân în proiect; eliminați-le singur dacă nu mai sunt necesare.", + "Import": "Importă", + "Close": "Închide", + "The plan is imported: {created} created, {updated} updated.": "Planul este importat: {created} create, {updated} actualizate.", + "Links that would close a loop were left out: {count}": "Legăturile care ar închide o buclă au fost omise: {count}", + "The import stopped part-way. Run it again to finish it.": "Importul s-a oprit la jumătate. Rulați-l din nou pentru a-l termina.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Salvați planul în Microsoft Project cu Fișier, Salvare ca, format XML, și importați acel fișier.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Acest fișier declară un DOCTYPE sau entități, care nu sunt acceptate.", + "The file is larger than 10 MB.": "Fișierul depășește 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Planul are peste 2.000 de sarcini, mai multe decât acceptă un import.", + "This file is not a Microsoft Project plan in XML format.": "Acest fișier nu este un plan Microsoft Project în format XML.", + "Choose a file to import.": "Alegeți un fișier de importat.", + "Only the project owner can import a plan.": "Doar proprietarul proiectului poate importa un plan.", + "The plan could not be read. Please try again.": "Planul nu a putut fi citit. Încercați din nou.", + "Linked case: {title}": "Dosar asociat: {title}", + "Linked to a case": "Asociat unui dosar", + "Hand over to case": "Predă dosarului", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Copiază neschimbat fiecare fișier al proiectului și al sarcinilor sale, plus un fișier care descrie proiectul, în dosarul asociat.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Fișiere copiate: {count}", + "Files that failed: {names}": "Fișiere eșuate: {names}", + "The handover failed. Please try again.": "Predarea a eșuat. Încercați din nou.", + "The linked case could not be found, or you cannot open it.": "Dosarul asociat nu a fost găsit sau nu îl puteți deschide.", + "Case handovers": "Predări către dosar", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Fiecare predare a fișierelor și metadatelor proiectului către dosarul său: când, de cine, către ce dosar, fiecare fișier copiat cu SHA-256 al său și fișierele eșuate.", + "Finance": "Finanțe", + "Add cost line": "Adaugă o linie de cost", + "Delivery terms": "Condiții de livrare", + "Billing model": "Model de facturare", + "Budget in euro": "Buget în euro", + "Budget in hours": "Buget în ore", + "Hourly rate in euro": "Tarif orar în euro", + "Planned start": "Început planificat", + "Planned end": "Sfârșit planificat", + "Planned dates": "Date planificate", + "Budget {amount}": "Buget {amount}", + "No budget agreed": "Niciun buget convenit", + "Hours": "Ore", + "Only the project owner and the portfolio managers see the amounts.": "Doar proprietarul proiectului și managerii portofoliului văd sumele.", + "Budget against cost per category": "Buget față de costuri pe categorie", + "Labour (booked time)": "Muncă (timp înregistrat)", + "No category": "Fără categorie", + "Hours are not available": "Orele nu sunt disponibile", + "Not yet assigned to a category": "Încă nealocat unei categorii", + "Total": "Total", + "{spent} spent, {remaining} remaining": "{spent} cheltuiți, {remaining} rămași", + "Budget against cost per phase": "Buget față de costuri pe fază", + "No phase": "Fără fază", + "Cost lines": "Linii de cost", + "From the finance system": "Din sistemul financiar", + "Edit cost line {amount}": "Editează linia de cost {amount}", + "No cost lines yet": "Încă nu există linii de cost", + "Commitments": "Angajamente", + "Actual cost": "Cost real", + "Forecast": "Prognoză", + "Remaining": "Rămas", + "Not planned yet": "Încă neplanificat", + "{start} to {end}": "{start} până la {end}", + "The terms were not saved. Please try again.": "Condițiile nu au fost salvate. Încearcă din nou.", + "Terms saved": "Condiții salvate", + "Fixed price": "Preț fix", + "Hourly": "Pe oră", + "Not billed": "Nefacturat", + "Commitment": "Angajament", + "Edit cost line": "Editează linia de cost", + "Kind": "Tip", + "Amount in euro": "Sumă în euro", + "Remove": "Elimină", + "Could not save the cost line. Only the project owner changes the money of a project.": "Linia de cost nu a putut fi salvată. Doar proprietarul proiectului schimbă banii unui proiect.", + "Could not remove the cost line. Please try again.": "Linia de cost nu a putut fi eliminată. Încearcă din nou.", + "{amount} over budget": "{amount} peste buget", + "Cost categories": "Categorii de cost", + "The categories every project splits its budget and costs into, one per line": "Categoriile în care fiecare proiect își împarte bugetul și costurile, câte una pe rând", + "Categories": "Categorii", + "Give at least one category, each name once.": "Indică cel puțin o categorie, fiecare nume o singură dată.", + "Cost categories saved": "Categorii de cost salvate", + "The cost categories were not saved. Please try again.": "Categoriile de cost nu au fost salvate. Încearcă din nou.", + "Finance line": "Linie financiară", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "O sumă de bani a unui proiect: buget, angajament, cost real sau prognoză, într-o categorie de cost și opțional într-o fază. Introdusă de proprietarul proiectului sau trimisă de sistemul financiar prin aplicația de integrare.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Proiectul căruia îi aparține suma. Gol pentru o linie din sistemul financiar al cărei număr de proiect nu se potrivește cu niciun proiect.", + "The phase this amount belongs to, if any": "Faza căreia îi aparține suma, dacă există", + "The cost category, one of the categories the admin set up": "Categoria de cost, una dintre categoriile configurate de administrator", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Dacă suma este buget, angajament, cost real sau prognoză", + "Amount": "Sumă", + "The amount in the reporting currency (euro)": "Suma în moneda de raportare (euro)", + "The date the amount was booked or is expected": "Data la care suma a fost înregistrată sau este așteptată", + "What the amount is for": "Pentru ce este suma", + "Whether a person entered the line or the finance system sent it": "Dacă o persoană a introdus linia sau a trimis-o sistemul financiar", + "Entered by hand": "Introdusă manual", + "Finance line id": "Id-ul liniei financiare", + "The finance system's own id of this line. One imported line per id.": "Id-ul propriu al acestei linii în sistemul financiar. O linie importată per id.", + "Project number": "Număr de proiect", + "The project number the finance system sent, matched against the project key": "Numărul de proiect trimis de sistemul financiar, comparat cu cheia proiectului", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portofoliul proiectului liniei, copiat din proiect ca totalurile portofoliului să aibă nevoie de un singur filtru", + "Finance readers": "Cititori financiari", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-urile utilizatorilor Nextcloud care pot vedea suma: proprietarul proiectului și managerii portofoliului său", + "Project owner": "Proprietarul proiectului", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID-ul utilizatorului Nextcloud al proprietarului proiectului, care poate modifica și elimina liniile manuale", + "How the client pays: not billed, a fixed price, or by the hour.": "Cum plătește clientul: nefacturat, preț fix sau pe oră.", + "Portfolio finance": "Finanțele portofoliului", + "You cannot see the money of any project in this portfolio": "Nu poți vedea banii niciunui proiect din acest portofoliu", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serverul a returnat linii de cost ale unor proiecte din afara acestui portofoliu, deci aceste totaluri pot fi greșite.", + "Projects left out because you cannot see their money: {count}": "Proiecte omise pentru că nu le poți vedea banii: {count}", + "Unmatched finance lines": "Linii financiare neasociate", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Buget, angajamente, cost real și prognoză însumate pe un portofoliu.", + "Subprojects": "Subproiecte", + "{done} of {total}": "{done} din {total}", + "{done} of {total} tasks done, including subprojects": "{done} din {total} sarcini gata, inclusiv subproiectele", + "Show the subprojects of {title}": "Arată subproiectele lui {title}", + "Hide the subprojects of {title}": "Ascunde subproiectele lui {title}", + "Part of": "Face parte din", + "No parent project": "Fără proiect părinte", + "A project cannot sit under one of its own subprojects.": "Un proiect nu poate sta sub unul dintre propriile subproiecte.", + "Projects nest three levels deep at most: programme, project and subproject.": "Proiectele se imbrică pe cel mult trei niveluri: program, proiect și subproiect.", + "Parent project": "Proiect părinte", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Proiectul sub care stă acest proiect, de exemplu un program. Proiectele se imbrică pe cel mult trei niveluri.", + "Yes": "Da", + "No": "Nu", + "{label} (required)": "{label} (obligatoriu)", + "{label} is required": "{label} este obligatoriu", + "Project field": "Câmp de proiect", + "A field an admin adds to every project, such as a policy area or a contract value.": "Un câmp pe care un administrator îl adaugă fiecărui proiect, de exemplu un domeniu de politică sau o valoare de contract.", + "Key": "Cheie", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Numele fix sub care se salvează valoarea, în lower camel case. Păstrează-l odată ce proiectele îl folosesc.", + "Label": "Etichetă", + "The name people see next to the field": "Numele pe care oamenii îl văd lângă câmp", + "What the field holds": "Ce conține câmpul", + "Text": "Text", + "Number": "Număr", + "Choice": "Alegere", + "Person": "Persoană", + "Yes or no": "Da sau nu", + "Options": "Opțiuni", + "The choices of a choice field": "Opțiunile unui câmp de alegere", + "Required": "Obligatoriu", + "Whether a project must fill in the field": "Dacă un proiect trebuie să completeze câmpul", + "Where the field appears, lowest first": "Unde apare câmpul, cel mai mic primul", + "Applies to": "Se aplică la", + "What the field is added to": "La ce se adaugă câmpul", + "Custom fields": "Câmpuri proprii", + "The values of the project fields an admin defined, keyed by the field's key.": "Valorile câmpurilor de proiect definite de un administrator, după cheia câmpului.", + "Project fields": "Câmpuri de proiect", + "Related": "Asociate", + "Remove link": "Elimină legătura", + "Link type": "Tipul legăturii", + "Relates to": "Se leagă de", + "Duplicates": "Dublează", + "Project key": "Cheia proiectului", + "Every task number starts with it, such as VERG-42.": "Fiecare număr de sarcină începe cu ea, de exemplu VERG-42.", + "This key is already used by another project.": "Această cheie este deja folosită de alt proiect.", + "Use 2 to 10 letters and digits, starting with a letter.": "Folosiți între 2 și 10 litere și cifre, începând cu o literă.", + "The key cannot change once tasks carry it.": "Cheia nu se mai poate schimba după ce sarcinile o poartă.", + "Project saved. The existing tasks get their numbers in the background.": "Proiect salvat. Sarcinile existente își primesc numerele în fundal.", + "Next task number": "Numărul următoarei sarcini", + "The number the next task of this project gets in its key. Only the system writes it.": "Numărul pe care următoarea sarcină a acestui proiect îl primește în cheia sa. Doar sistemul îl scrie.", + "Restore {title}": "Restaurează {title}", + "Restore": "Restaurează", + "Project restored": "Proiect restaurat", + "Could not restore the project": "Proiectul nu a putut fi restaurat", + "Bring this project back to the active list.": "Readuceți acest proiect în lista proiectelor active.", + "Restore project": "Restaurează proiectul", + "Request reason": "Motivul cererii", + "Why the requester needs this project. Filled in when the project is requested.": "De ce are nevoie solicitantul de acest proiect. Se completează la cerere.", + "Reviewed by": "Analizat de", + "The user who approved or rejected the request.": "Utilizatorul care a aprobat sau a respins cererea.", + "Reviewed at": "Analizat la", + "When the request was approved or rejected.": "Când a fost aprobată sau respinsă cererea.", + "Review note": "Nota evaluatorului", + "The reviewer's reason, shown to the requester when a request is not approved.": "Motivul evaluatorului, afișat solicitantului când o cerere nu este aprobată.", + "Members of these groups": "Membrii acestor grupuri", + "Groups that may create projects": "Grupuri care pot crea proiecte", + "The group {group} no longer exists. Save to remove it.": "Grupul {group} nu mai există. Salvați pentru a-l elimina.", + "Review project request": "Analizează cererea de proiect", + "Requested by": "Solicitat de", + "Why it is needed": "De ce este necesar", + "Desired start date": "Data de început dorită", + "Why is it not approved?": "De ce nu este aprobat?", + "Give a reason. The requester sees it.": "Dați un motiv. Solicitantul îl va vedea.", + "Approve": "Aprobă", + "Reject": "Respinge", + "Reject request": "Respinge cererea", + "The review was not saved. Try again.": "Analiza nu a fost salvată. Încercați din nou.", + "This project is waiting for review": "Acest proiect așteaptă analiza", + "This request was not approved": "Această cerere nu a fost aprobată", + "Reason: {note}": "Motiv: {note}", + "Review request": "Analizează cererea", + "Request a project": "Solicită un proiect", + "Step {step} of 2": "Pasul {step} din 2", + "Why is this project needed?": "De ce este necesar acest proiect?", + "Give a reason. The reviewer reads it.": "Dați un motiv. Evaluatorul îl va citi.", + "Back": "Înapoi", + "Next": "Înainte", + "Send request": "Trimite cererea", + "The request was not sent. Try again.": "Cererea nu a fost trimisă. Încercați din nou.", + "Requested": "Solicitat", + "Not approved": "Neaprobat", + "Your request was sent": "Cererea dvs. a fost trimisă", + "Let everyone else request a project": "Permiteți tuturor celorlalți să solicite un proiect", + "Add a task": "Adaugă o sarcină", + "Delete task": "Șterge sarcina", + "Edit task": "Editează sarcina", + "Write": "Scrie", + "Preview": "Previzualizare", + "Markdown works here: headings, lists and links.": "Aici funcționează Markdown: titluri, liste și linkuri.", + "Could not save the task. Please try again.": "Sarcina nu a putut fi salvată. Încercați din nou.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Pe \"{title}\" s-a înregistrat timp, deci nu poate fi ștearsă. În schimb o puteți anula: înregistrările de timp rămân.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Ștergeți \"{title}\"? Se elimină și legăturile ei cu alte sarcini. Acțiunea nu poate fi anulată.", + "Keep task": "Păstrează sarcina", + "Cancel task": "Anulează sarcina", + "Only the reporter, the project owner or an admin can delete this task.": "Doar cel care a raportat-o, proprietarul proiectului sau un administrator poate șterge această sarcină.", + "Could not delete the task. Please try again.": "Sarcina nu a putut fi ștearsă. Încercați din nou.", + "Could not cancel the task. Please try again.": "Sarcina nu a putut fi anulată. Încercați din nou.", + "Responsible": "Responsabil", + "Also working on this": "Mai lucrează la asta", + "Labels": "Etichete", + "Could not change the priority. Please try again.": "Prioritatea nu a putut fi schimbată. Încercați din nou.", + "Other project members who work on this task alongside the person responsible.": "Alți membri ai proiectului care lucrează la această sarcină împreună cu responsabilul.", + "Duplicate": "Duplică", + "Could not copy the task. Please try again.": "Sarcina nu a putut fi copiată. Încercați din nou.", + "Subtasks": "Subsarcini", + "{done} of {total} done": "{done} din {total} finalizate", + "Add a subtask": "Adaugă o subsarcină", + "Checklist": "Listă de verificare", + "Checklist item actions": "Acțiuni pentru elementul listei", + "Add a checklist item": "Adaugă un element în listă", + "Subtasks: {estimate} estimated, {logged} logged": "Subsarcini: {estimate} estimat, {logged} înregistrat", + "Total estimate: {total}": "Estimare totală: {total}", + "Part of {title}": "Parte din {title}", + "Checklist: {count} done": "Listă de verificare: {count} finalizate", + "This task has subtasks: {count}.": "Această sarcină are subsarcini: {count}.", + "Keep subtasks as separate tasks": "Păstrează subsarcinile ca sarcini separate", + "Delete subtasks too": "Șterge și subsarcinile", + "Copy of {title}": "Copie a {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Sarcina a fost copiată, dar nu toate subsarcinile ei. Verificați copia.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Pași mici în cadrul sarcinii. Fiecare element are un id, un text și dacă este finalizat.", + "Open work per person and per project.": "Muncă deschisă pe persoană și pe proiect.", + "View": "Vizualizare", + "By person": "Pe persoană", + "By project": "Pe proiect", + "Hours left": "Ore rămase", + "Tasks without an estimate": "Sarcini fără estimare", + "Due in 14 days": "Scadente în 14 zile", + "Shared": "Partajate", + "Unassigned": "Neatribuite", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Se afișează munca din proiectele pe care le puteți vedea. Orele se socotesc pentru persoana responsabilă; sarcinile partajate se socotesc fără ore.", + "No open work in these projects.": "Nu există muncă deschisă în aceste proiecte.", + "Open work": "Muncă deschisă", + "{count} open tasks": "{count} sarcini deschise", + "Create a project to see capacity here.": "Creați un proiect pentru a vedea aici capacitatea.", + "My tasks": "Sarcinile mele", + "Show all my tasks": "Arată toate sarcinile mele", + "No tasks assigned to you": "Nu aveți sarcini atribuite", + "Browse projects": "Răsfoiți proiectele", + "Later": "Mai târziu", + "Due {date}": "Scadent {date}", + "Could not change the status. Please try again.": "Starea nu a putut fi schimbată. Încercați din nou.", + "Completed today": "Finalizate azi", + "My open tasks": "Sarcinile mele deschise", + "My overdue tasks": "Sarcinile mele întârziate", + "My tasks in progress": "Sarcinile mele în lucru", + "Pin to the top": "Fixează sus", + "Unpin": "Anulează fixarea", + "Pinned": "Fixat", + "Actions for {title}": "Acțiuni pentru {title}", + "Could not save your project order. Please try again.": "Ordinea proiectelor nu a putut fi salvată. Încercați din nou.", + "No boards yet": "Încă nu există panouri", + "Create a project to get a board.": "Creați un proiect pentru a avea un panou.", + "Use the Projects page to create and manage your projects and tasks.": "Folosiți pagina Proiecte pentru a crea și gestiona proiectele și sarcinile.", + "Go to projects": "Mergeți la proiecte", + "You are not a member of any projects yet.": "Încă nu sunteți membru al niciunui proiect.", + "Could not search for users. Please try again.": "Utilizatorii nu au putut fi căutați. Încercați din nou.", + "Project creation is restricted to administrators.": "Doar administratorii pot crea proiecte.", + "Only the project owner or an administrator can delete this project.": "Doar proprietarul proiectului sau un administrator poate șterge acest proiect.", + "No projects are available to you yet. Ask an administrator to create one.": "Încă nu aveți proiecte disponibile. Cereți unui administrator să creeze unul.", + "Due: {date}": "Scadent: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Sarcinile cu dată de început sau scadență apar pe cronologie. Adăugați date pentru a le vedea aici.", + "You do not have access to this project.": "Nu aveți acces la acest proiect.", + "Zoom level": "Nivel de zoom", + "Unscheduled": "Neplanificate", + "Start: {date}": "Început: {date}", + "Today": "Astăzi", + "No scheduled tasks": "Nicio sarcină planificată", + "An unexpected error occurred.": "A apărut o eroare neașteptată.", + "Column {number} name": "Numele coloanei {number}", + "Failed to save creation policy": "Regula de creare nu a putut fi salvată", + "All authenticated users": "Toți utilizatorii autentificați", + "Control who may create new projects": "Stabiliți cine poate crea proiecte noi", + "Administrators only": "Doar administratori", + "Project creation": "Crearea proiectelor", + "Allow project creation": "Permiteți crearea proiectelor", + "Creation policy saved successfully": "Regula de creare a fost salvată", + "Initializing…": "Se pornește…", + "e.g. 2h 30m, 90m, 1.5h": "ex. 2h 30m, 90m, 1.5h", + "Log time": "Înregistrați timp", + "Save estimate": "Salvați estimarea", + "Logged: {logged}": "Înregistrat: {logged}", + "over by {amount}": "depășit cu {amount}", + "Time tracking": "Pontaj", + "Estimate": "Estimare", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Introduceți o estimare validă (ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Introduceți o durată validă (ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Înregistrarea de timp nu a putut fi salvată. Încercați din nou.", + "Edit time entry": "Editați înregistrarea de timp", + "Duration": "Durată", + "Date range": "Interval", + "Last week": "Săptămâna trecută", + "No time logged": "Niciun timp înregistrat", + "Log time on a task to see it here.": "Înregistrați timp pe o sarcină pentru a-l vedea aici.", + "To date": "Până la data", + "This week": "Săptămâna aceasta", + "Total: {total}": "Total: {total}", + "From date": "De la data", + "Custom range": "Interval personalizat", + "All time": "Tot timpul", + "Could not delete a task, so some data may remain. Try deleting the project again.": "O sarcină nu a putut fi ștearsă, deci pot rămâne date. Ștergeți proiectul din nou.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "O înregistrare de timp nu a putut fi ștearsă, deci pot rămâne date. Ștergeți proiectul din nou.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "O coloană nu a putut fi ștearsă, deci pot rămâne date. Ștergeți proiectul din nou.", + "Could not delete the project. Please try again.": "Proiectul nu a putut fi șters. Încercați din nou.", + "Notification settings": "Setări pentru notificări", + "Configure when due-date reminders are sent": "Stabiliți când se trimit mementourile de scadență", + "Due-date reminder lead time (hours)": "Timp de avertizare înainte de scadență (ore)", + "Lead time must be between 1 and 336 hours": "Timpul trebuie să fie între 1 și 336 de ore", + "Reminder lead time saved successfully": "Timpul de avertizare a fost salvat", + "Failed to save reminder lead time": "Timpul de avertizare nu a putut fi salvat", + "Notifications": "Notificări", + "Notify me 1 day before a task's due date": "Anunță-mă cu 1 zi înainte de scadența unei sarcini", + "Draft": "Ciornă", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Dacă ora este o ciornă pe care o vede doar profesorul ei, are loc sau este anulată.", + "New release": "Versiune nouă", + "Roadmap chart. The same releases and epics are listed below.": "Graficul foii de parcurs. Aceleași versiuni și epopei sunt listate mai jos.", + "Nothing on the roadmap yet": "Încă nimic pe foaia de parcurs", + "Releases with a target date and epics with dated tasks appear here.": "Aici apar versiunile cu dată țintă și epopeile cu sarcini datate.", + "Releases": "Versiuni", + "No releases yet": "Încă nu există versiuni", + "Target date: {date}": "Dată țintă: {date}", + "No target date": "Fără dată țintă", + "Edit {name}": "Editează {name}", + "Mark {name} as released": "Marchează {name} ca lansată", + "Mark as released": "Marchează ca lansată", + "Epics": "Epopei", + "No epics yet. Open a task to make it an epic.": "Încă nu există epopei. Deschideți o sarcină pentru a o face epopee.", + "Not scheduled yet": "Încă neprogramat", + "Planned": "Planificată", + "Released": "Lansată", + "Edit release": "Editează versiunea", + "Target date": "Dată țintă", + "Could not save the release. Please try again.": "Versiunea nu a putut fi salvată. Încercați din nou.", + "Every task of this release is done or cancelled.": "Fiecare sarcină a acestei versiuni este finalizată sau anulată.", + "Not finished yet: {count}": "Încă nefinalizate: {count}", + "What happens to these tasks?": "Ce se întâmplă cu aceste sarcini?", + "Move to {name}": "Mută în {name}", + "Remove the release": "Elimină versiunea", + "Keep it on {name}": "Păstrează-le în {name}", + "Could not mark the release as released. Please try again.": "Versiunea nu a putut fi marcată ca lansată. Încercați din nou.", + "Roadmap": "Foaie de parcurs", + "Tasks or roadmap": "Sarcini sau foaie de parcurs", + "Release": "Versiune", + "Epic": "Epopee", + "This task is an epic": "Această sarcină este o epopee", + "A named, dated delivery of a project that its tasks are planned against.": "O livrare denumită și datată a unui proiect, față de care se planifică sarcinile sale.", + "Name of the release": "Numele versiunii", + "The project this release belongs to": "Proiectul căruia îi aparține această versiune", + "What this release delivers": "Ce livrează această versiune", + "When work on the release starts": "Când începe lucrul la versiune", + "The date the release is due": "Data la care versiunea trebuie să fie gata", + "Whether the release is planned, released or archived": "Dacă versiunea este planificată, lansată sau arhivată", + "Released on": "Lansată la", + "When the release was marked as released": "Când versiunea a fost marcată ca lansată", + "The release this task is planned for": "Versiunea pentru care este planificată această sarcină", + "Board view options": "Opțiuni de afișare a tablei", + "Colour cards": "Colorează cardurile", + "No colour": "Fără culoare", + "By label": "După etichetă", + "Swimlanes": "Benzi", + "No swimlanes": "Fără benzi", + "By assignee": "După responsabil", + "By epic": "După epic", + "No assignee": "Neatribuit", + "No epic": "Fără epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Cardurile rămân pe rândul epicului lor. Schimbați epicul pe pagina sarcinii.", + "Hand over to": "Predă către", + "Could not save your board view. It applies until you reload.": "Afișarea tablei nu a fost salvată. Se aplică până la reîncărcare.", + "Timetable wish": "Dorință de orar", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "O dorință pe care generatorul o ia în calcul. Respectă mereu o dorință strictă, iar una flexibilă când poate.", + "Whether the wish is about a teacher, a group, a room or one activity": "Dacă dorința privește un profesor, o grupă, o sală sau o activitate", + "Teacher": "Profesor", + "Group": "Grupă", + "Reference": "Referință", + "The user, group, room or activity the wish is about": "Utilizatorul, grupa, sala sau activitatea la care se referă dorința", + "What the wish asks for": "Ce cere dorința", + "Not on these periods": "Nu în aceste ore", + "Preferably not on these periods": "De preferință nu în aceste ore", + "At most a number of lessons a day": "Cel mult un număr de ore pe zi", + "No free periods between lessons": "Fără ferestre între ore", + "Always the same room": "Mereu aceeași sală", + "Periods": "Ore", + "The periods of the week the wish is about, such as wed-5": "Orele din săptămână la care se referă dorința, de exemplu wed-5", + "Limit": "Limită", + "The most lessons a day, for a wish of that kind": "Numărul maxim de ore pe zi, pentru o dorință de acest fel", + "Strength": "Tărie", + "Whether the generator must keep the wish or should keep it": "Dacă generatorul trebuie sau ar trebui să respecte dorința", + "Hard": "Strictă", + "Soft": "Flexibilă", + "Weight": "Pondere", + "How much a soft wish counts, from 1 to 3": "Cât contează o dorință flexibilă, de la 1 la 3", + "Why the wish exists": "De ce există dorința", + "Timetable scenario": "Scenariu de orar", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Un model săptămânal, făcut de generator sau preluat din orarul actual. Își păstrează datele de intrare și cât de bine respectă dorințele.", + "The name timetablers know the scenario by": "Numele sub care cei care fac orarul cunosc scenariul", + "Whether the generator made it or it came from the current timetable": "Dacă l-a făcut generatorul sau vine din orarul actual", + "Generated": "Generat", + "From the current timetable": "Din orarul actual", + "Week of": "Săptămâna din", + "The Monday of the first week of the window": "Lunea primei săptămâni a perioadei", + "Window start": "Începutul perioadei", + "The first day the week pattern applies to": "Prima zi în care se aplică modelul săptămânal", + "Window end": "Sfârșitul perioadei", + "The last day the week pattern applies to": "Ultima zi în care se aplică modelul săptămânal", + "Waiting, generating, done, failed, or published as draft lessons": "În așteptare, în generare, gata, eșuat sau publicat ca ore ciornă", + "Waiting": "În așteptare", + "Generating": "În generare", + "Failed": "Eșuat", + "Published": "Publicat", + "Seed": "Sămânță", + "The number the generator starts from, so a run can be repeated": "Numărul de la care pornește generatorul, ca o rulare să poată fi repetată", + "Input": "Date de intrare", + "The periods, rooms, lessons and wishes the scenario was made from": "Orele, sălile, lecțiile și dorințele din care a rezultat scenariul", + "Placements": "Plasări", + "Each lesson with the period and room it was given": "Fiecare lecție cu ora și sala primite", + "Unplaced lessons": "Lecții neplasate", + "Lessons without a place, each with the hard wish that blocked it": "Lecții fără loc, fiecare cu dorința strictă care a blocat-o", + "Broken wishes": "Dorințe încălcate", + "The wishes this scenario breaks, with the lessons that break them": "Dorințele pe care acest scenariu le încalcă, cu lecțiile implicate", + "Measures": "Indicatori", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Lecții plasate, dorințe încălcate, ferestre ale profesorilor, ore pe zi și folosirea sălilor", + "Reason": "Motiv", + "Why the run failed": "De ce a eșuat rularea", + "Published at": "Publicat la", + "When the scenario was written out as draft lessons": "Când a fost scris scenariul ca ore ciornă", + "Edit wish": "Editează dorința", + "New wish": "Dorință nouă", + "Hard: the generator always keeps it": "Strictă: generatorul o respectă mereu", + "Soft: the generator keeps it where it can": "Flexibilă: generatorul o respectă unde poate", + "Weight (1 to 3)": "Pondere (de la 1 la 3)", + "Most lessons a day": "Cel mult ore pe zi", + "Period": "Oră", + "{day} period {number}": "{day} ora {number}", + "Teacher (user name)": "Profesor (nume de utilizator)", + "Activity (group:subject)": "Activitate (grupă:materie)", + "Say who or what the wish is about.": "Indicați la cine sau la ce se referă dorința.", + "Choose at least one period.": "Alegeți cel puțin o oră.", + "The limit is a whole number of 1 or more.": "Limita este un număr întreg de cel puțin 1.", + "Timetable": "Orar", + "Wishes": "Dorințe", + "Timetable wishes": "Dorințe pentru orar", + "Generator run": "Rularea generatorului", + "Generator progress": "Progresul generatorului", + "The run failed: {reason}": "Rularea a eșuat: {reason}", + "{placed} of {lessons} lessons placed": "{placed} din {lessons} ore plasate", + "Generate again": "Generează din nou", + "Generate": "Generează", + "Every lesson has a place.": "Fiecare oră are un loc.", + "Lesson": "Oră", + "No free period and room": "Nicio oră și sală liberă", + "Broken soft wishes": "Dorințe flexibile încălcate", + "Every soft wish is kept.": "Fiecare dorință flexibilă este respectată.", + "Wish": "Dorință", + "Lessons": "Ore", + "Generating: {percent}% of the time budget used": "Se generează: {percent}% din timp folosit", + "Waiting to start": "Așteaptă pornirea", + "Published as draft lessons": "Publicat ca ore ciornă", + "Could not read the scenario.": "Scenariul nu a putut fi citit.", + "Could not start the run.": "Rularea nu a putut porni.", + "Scenarios": "Scenarii", + "Timetable scenarios": "Scenarii de orar", + "Scenario": "Scenariu", + "Take the current timetable": "Preia orarul actual", + "Could not take the current timetable.": "Nu s-a putut prelua orarul actual.", + "Broken hard wishes": "Dorințe obligatorii încălcate", + "Not on a period of the week grid": "Nu este pe o oră din grila săptămânală", + "Compare scenarios": "Compară scenarii", + "Scenarios to compare": "Scenarii de comparat", + "Choose two or three scenarios to compare them.": "Alegeți două sau trei scenarii pentru a le compara.", + "Measure": "Măsură", + "Best": "Cel mai bun", + "Lessons that differ": "Ore care diferă", + "No lesson differs.": "Nicio oră nu diferă.", + "Not placed": "Neplasată", + "{period} in {room}": "{period} în {room}", + "Lessons placed": "Ore plasate", + "Lessons without a place": "Ore fără loc", + "Clashes": "Conflicte", + "Hard wishes broken": "Dorințe stricte încălcate", + "Soft wishes broken": "Dorințe flexibile încălcate", + "Soft wishes broken, weighted": "Dorințe flexibile încălcate, ponderate", + "Free periods between lessons, all teachers": "Ferestre, toți profesorii", + "Most free periods of one teacher": "Cele mai multe ferestre ale unui profesor", + "Most lessons of one group on a day": "Cele mai multe ore ale unei grupe într-o zi", + "Room use": "Utilizarea sălilor", + "Publish as draft lessons": "Publică drept ore ciornă", + "Draft lessons written: {count}": "Ore ciornă scrise: {count}", + "Could not publish the scenario.": "Scenariul nu a putut fi publicat.", + "Rules": "Reguli", + "Rules for {column}": "Reguli pentru {column}", + "When a card enters this column": "Când un card intră în această coloană", + "Action": "Acțiune", + "Set the priority": "Setează prioritatea", + "Assign to": "Atribuie lui", + "Assign the person who moved the card": "Atribuie persoanei care a mutat cardul", + "Remove the assignee": "Elimină responsabilul", + "Add a label": "Adaugă o etichetă", + "No longer a project member": "Nu mai este membru al proiectului", + "This label no longer exists": "Această etichetă nu mai există", + "Add rule": "Adaugă regulă", + "Remove rule": "Elimină regula", + "No rules yet. Add one to change a card when it enters this column.": "Încă nu există reguli. Adăugați una pentru a schimba un card când intră în această coloană.", + "Could not save the rules. Please try again.": "Regulile nu au putut fi salvate. Încercați din nou.", + "1 rule runs when a card enters this column": "1 regulă rulează când un card intră în această coloană", + "{count} rules run when a card enters this column": "Reguli care rulează când un card intră în această coloană: {count}", + "Rules applied: {changes}": "Reguli aplicate: {changes}", + "assigned to {name}": "atribuit lui {name}", + "assignee removed": "responsabil eliminat", + "priority {priority}": "prioritate {priority}", + "label {label}": "etichetă {label}", + "What happens to a card when it enters this column, applied in list order.": "Ce se întâmplă cu un card când intră în această coloană, în ordinea listei.", + "Value": "Valoare", + "What the rule does to the card.": "Ce face regula cu cardul.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioritatea, id-ul utilizatorului sau id-ul etichetei folosite de acțiune; gol pentru acțiunile fără valoare.", + "is not": "nu este", + "{dimension} is not": "{dimension} nu este", + "Saved filters": "Filtre salvate", + "No saved filters yet": "Încă nu există filtre salvate", + "Save filter": "Salvează filtrul", + "Rename \"{name}\"": "Redenumește „{name}”", + "Delete \"{name}\"": "Șterge „{name}”", + "Clear filters": "Golește filtrele", + "Showing {shown} of {total} tasks": "Se afișează {shown} din {total} sarcini", + "Me": "Eu", + "No date": "Fără dată", + "Rename saved filter": "Redenumește filtrul salvat", + "Share with the project": "Partajează cu proiectul", + "Give the filter a name": "Dați un nume filtrului", + "Could not save the filter. Please try again.": "Filtrul nu a putut fi salvat. Încercați din nou.", + "Some labels in \"{name}\" no longer exist and were left out.": "Unele etichete din „{name}” nu mai există și au fost omise.", + "Could not delete the filter. Please try again.": "Filtrul nu a putut fi șters. Încercați din nou.", + "Saved filter": "Filtru salvat", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Un filtru de tablă cu nume al unui proiect, privat pentru cine l-a salvat, dacă nu este partajat cu proiectul.", + "The project whose board the filter applies to": "Proiectul pe a cărui tablă se aplică filtrul", + "The name the filter is listed under": "Numele sub care apare filtrul în listă", + "Saved by": "Salvat de", + "Nextcloud user id of the person who saved the filter": "Id-ul de utilizator Nextcloud al celui care a salvat filtrul", + "Shared with the project": "Partajat cu proiectul", + "Whether every project member sees and applies the filter": "Dacă fiecare membru al proiectului vede și poate aplica filtrul", + "Criteria": "Criterii", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtrul: responsabil, etichetă, prioritate și termen, fiecare cu este sau nu este și valorile sale", + "Cross-project view": "Vizualizare între proiecte", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "O selecție salvată de proiecte ale căror sarcini sunt afișate împreună pe coloane de stare, partajată cu persoanele pe care le numește.", + "Shared with": "Partajată cu", + "The name the view is listed under": "Numele sub care este listată vizualizarea", + "Nextcloud user id of the person who saved the view": "Id-ul de utilizator Nextcloud al persoanei care a salvat vizualizarea", + "Nextcloud user ids of the people the view is shared with": "Id-urile de utilizator Nextcloud ale persoanelor cu care este partajată vizualizarea", + "The projects whose tasks the view shows, at most twenty": "Proiectele ale căror sarcini le arată vizualizarea, cel mult douăzeci", + "1 project in this view is hidden from you.": "1 proiect din această vizualizare îți este ascuns.", + "{count} projects in this view are hidden from you.": "{count} proiecte din această vizualizare îți sunt ascunse.", + "{project} has no column for {status}.": "{project} nu are o coloană pentru {status}.", + "This view does not exist or is not shared with you.": "Această vizualizare nu există sau nu este partajată cu tine.", + "\"{task}\" moved to {status}.": "\"{task}\" a fost mutată în {status}.", + "Project: {title}": "Proiect: {title}", + "Cross-project views": "Vizualizări între proiecte", + "New view": "Vizualizare nouă", + "Edit view": "Editează vizualizarea", + "Delete view": "Șterge vizualizarea", + "Give the view a name": "Dă-i un nume vizualizării", + "Pick at least one project": "Alege cel puțin un proiect", + "A view shows at most {max} projects": "O vizualizare arată cel mult {max} proiecte", + "Could not save the view. Please try again.": "Vizualizarea nu a putut fi salvată. Încearcă din nou.", + "Could not delete the view. Please try again.": "Vizualizarea nu a putut fi ștearsă. Încearcă din nou.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Ștergi „{title}”? Proiectele și sarcinile lor rămân neschimbate.", + "People see the tasks of the projects they are in, never more.": "Fiecare vede doar sarcinile proiectelor din care face parte.", + "No views yet. A view shows the tasks of several of your projects together.": "Încă nu există vizualizări. O vizualizare arată împreună sarcinile mai multor proiecte ale tale.", + "Projects in view: {count}": "Proiecte în vizualizare: {count}", + "Notify me when a task is assigned to me": "Anunță-mă când mi se atribuie o sarcină", + "Also send these to me by email": "Trimite-mi-le și prin e-mail", + "Add an email address in your Nextcloud personal settings to get mail.": "Adaugă o adresă de e-mail în setările personale Nextcloud pentru a primi e-mailuri.", + "Code link": "Legătură de cod", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Un commit, o ramură, o cerere de îmbinare sau o problemă pe o platformă de cod care privește o sarcină.", + "The task the link belongs to": "Sarcina căreia îi aparține legătura", + "The project of the task": "Proiectul sarcinii", + "Task key": "Cheia sarcinii", + "The task key the forge text named, such as VC-12": "Cheia sarcinii numită în textul platformei, de exemplu VC-12", + "What the link points at": "Spre ce arată legătura", + "Link": "Legătură", + "The address of the item in the forge": "Adresa elementului pe platforma de cod", + "The commit message, branch name or merge request title": "Mesajul commit-ului, numele ramurii sau titlul cererii de îmbinare", + "Repository": "Depozit", + "The repository, such as acme/portal": "Depozitul, de exemplu acme/portal", + "Forge id": "Id pe platformă", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Id-ul propriu al elementului pe platforma de cod, de exemplu github:acme/portal#42 sau un hash de commit", + "State": "Stare", + "The state of a merge request or issue": "Starea unei cereri de îmbinare sau a unei probleme", + "Who made the commit or opened the merge request": "Cine a făcut commit-ul sau a deschis cererea de îmbinare", + "When the commit was made or the merge request last changed": "Când s-a făcut commit-ul sau s-a schimbat ultima dată cererea de îmbinare", + "Added by": "Adăugat de", + "Whether a person added the link or the integration wrote it": "Dacă o persoană a adăugat legătura sau a scris-o integrarea", + "Nextcloud user UIDs of project members": "ID-urile de utilizator Nextcloud ale membrilor proiectului", + "Add link": "Adaugă legătură", + "Added by hand": "Adăugat manual", + "Branch": "Ramură", + "Code": "Cod", + "Commit": "Commit", + "From the integration": "Din integrare", + "Link to a commit, branch or merge request": "Legătură către un commit, o ramură sau o cerere de îmbinare", + "Merge request": "Cerere de îmbinare", + "Merged": "Îmbinată", + "No code linked yet. Name {key} in a commit message or paste a link.": "Încă nu există cod legat. Menționează {key} într-un mesaj de commit sau lipește o legătură.", + "No code linked yet. Paste a link to a commit or merge request.": "Încă nu există cod legat. Lipește o legătură către un commit sau o cerere de îmbinare.", + "Paste a web address that starts with https://.": "Lipește o adresă web care începe cu https://.", + "Remove link {title}": "Elimină legătura {title}", + "The link could not be added.": "Legătura nu a putut fi adăugată.", + "The link could not be removed.": "Legătura nu a putut fi eliminată.", + "This link is already on the task.": "Această legătură este deja la sarcină.", + "Code forges": "Platforme de cod", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Leagă commit-urile și pull request-urile din GitHub de sarcini. Integriq primește evenimentele; planninq nu apelează niciodată GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Descarcă configurația și import-o în Integriq. Apoi completează un secret în regula \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "În GitHub, adaugă depozitului un webhook cu această adresă și același secret. Alege tipul de conținut application/json și evenimentele push și pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Menționează cheia sarcinii, de exemplu VC-12, într-un mesaj de commit, un nume de ramură sau titlul unui pull request. Legătura apare apoi la acea sarcină.", + "Without Integriq, project members can still paste a link on the task page.": "Fără Integriq, membrii proiectului pot lipi în continuare o legătură pe pagina sarcinii.", + "Download the Integriq configuration": "Descarcă configurația Integriq", + "Calendar": "Calendar", + "Previous": "Anterior", + "Calendar view": "Vizualizare calendar", + "Starts:": "Începe:", + "No tasks with a date in this month.": "Nicio sarcină cu dată în această lună.", + "Week of {start} to {end}": "Săptămâna {start} – {end}", + "My calendar": "Calendarul meu", + "Show as list": "Afișează ca listă", + "Show as calendar": "Afișează în calendar", + "Open my calendar": "Deschide calendarul meu", + "Nextcloud Tasks": "Sarcini Nextcloud", + "Show my tasks in Nextcloud Tasks": "Afișează sarcinile mele în Sarcini Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Sarcinile atribuite ție sau partajate cu tine apar într-o listă \"Planninq\" în Sarcini și Calendar Nextcloud. Modificările făcute acolo sunt înlocuite la următoarea modificare în Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Acest server nu poate scrie în Sarcini Nextcloud, așa că exportul nu este disponibil.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Gestionat de Planninq. Modificările făcute aici sunt înlocuite la următoarea modificare în Planninq.", + "Working days and holidays": "Zile lucrătoare și sărbători", + "Dates set on the timeline skip the days that are not working days.": "Datele stabilite pe cronologie sar peste zilele care nu sunt lucrătoare.", + "Working weekdays": "Zilele lucrătoare ale săptămânii", + "Non-working days": "Zile nelucrătoare", + "No non-working days yet.": "Încă nu există zile nelucrătoare.", + "Add day": "Adaugă zi", + "Year": "An", + "Add Dutch national holidays": "Adaugă sărbătorile naționale olandeze", + "Save working days": "Salvează zilele lucrătoare", + "Choose at least one working weekday.": "Alege cel puțin o zi lucrătoare.", + "Working days saved.": "Zilele lucrătoare au fost salvate.", + "Could not save the working days.": "Zilele lucrătoare nu au putut fi salvate.", + "New Year's Day": "Anul Nou", + "Easter Sunday": "Duminica Paștelui", + "Easter Monday": "Lunea Paștelui", + "King's Day": "Ziua Regelui", + "Liberation Day": "Ziua Eliberării", + "Ascension Day": "Înălțarea Domnului", + "Whit Sunday": "Rusaliile", + "Whit Monday": "A doua zi de Rusalii", + "Christmas Day": "Crăciunul", + "Boxing Day": "A doua zi de Crăciun", + "Dates of {title}": "Datele pentru {title}", + "The due date cannot be before the start date.": "Termenul nu poate fi înainte de data de început.", + "{title}, from {start} to {end}": "{title}, de la {start} la {end}", + "The dates could not be saved.": "Datele nu au putut fi salvate.", + "{title} now runs from {start} to {end}": "{title} se desfășoară acum de la {start} la {end}", + "Auto-scheduling": "Planificare automată", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Când este activă, mutarea unui termen mai târziu pe cronologie propune mutarea și a sarcinilor pe care le blochează.", + "Move blocked tasks along when a task slips": "Mută sarcinile blocate când o sarcină întârzie", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Pe cronologie, un termen mai târziu propune mutarea sarcinilor blocate. Contează doar legăturile \"blochează\", iar sarcinile se mută doar mai târziu.", + "Move the tasks that wait for {title}?": "Muți sarcinile care așteaptă {title}?", + "These tasks wait for it and would start after its new due date:": "Aceste sarcini o așteaptă și ar începe după noul termen:", + "{count} tasks would move; the first {limit} are listed.": "S-ar muta {count} sarcini; sunt listate primele {limit}.", + "Now": "Acum", + "After the move": "După mutare", + "Only this task": "Doar această sarcină", + "Move all": "Mută toate", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Oprit la {title}: datele nu au putut fi salvate. Sarcinile dinaintea ei au fost mutate.", + "Cumulative flow": "Flux cumulativ", + "Show as chart": "Afișează ca grafic", + "Show as table": "Afișează ca tabel", + "Tasks per column per day": "Sarcini pe coloană pe zi", + "Tasks without recorded history in this period: {count}": "Sarcini fără istoric înregistrat în această perioadă: {count}", + "Lead and cycle time": "Timp de livrare și timp de ciclu", + "No tasks were finished in this period.": "Nicio sarcină nu a fost finalizată în această perioadă.", + "Finished tasks": "Sarcini finalizate", + "Cycle time, average": "Timp de ciclu, medie", + "Cycle time, 85th percentile": "Timp de ciclu, percentila 85", + "Lead time, average": "Timp de livrare, medie", + "Tasks whose finish time was estimated from their history: {count}": "Sarcini a căror oră de finalizare a fost estimată din istoric: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Timpul de ciclu al fiecărei sarcini finalizate, cu media și percentila 85", + "Slowest tasks": "Cele mai lente sarcini", + "cycle {cycle}, lead {lead}": "ciclu {cycle}, livrare {lead}", + "{days} days": "{days} zile", + "Could not load the flow of this project.": "Fluxul acestui proiect nu a putut fi încărcat.", + "Last {days} days": "Ultimele {days} zile", + "Portfolio flow": "Fluxul portofoliului", + "An admin adds portfolios under Projects, Portfolios.": "Un administrator adaugă portofolii în Proiecte, Portofolii.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Proiecte neafișate, deoarece se afișează cel mult 50 deodată: {count}", + "Could not load the flow of this portfolio.": "Fluxul acestui portofoliu nu a putut fi încărcat.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Flux cumulativ și timp de ciclu pe proiectele unui portofoliu.", + "Edit report": "Editează raportul", + "Only tasks where": "Doar sarcinile la care", + "Group by": "Grupează după", + "Display": "Afișare", + "Share with everyone who can read its projects": "Partajează cu toți cei care îi pot citi proiectele", + "The report could not be saved.": "Raportul nu a putut fi salvat.", + "Number of tasks": "Număr de sarcini", + "Bar": "Bare", + "Donut": "Inel", + "Table": "Tabel", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} din {total} proiecte din acest raport nu îți sunt vizibile", + "No tasks match this report.": "Nicio sarcină nu se potrivește acestui raport.", + "None": "Niciunul", + "Could not load this report.": "Acest raport nu a putut fi încărcat.", + "Report": "Raport", + "Your reports": "Rapoartele tale", + "My reports": "Rapoartele mele", + "Shared reports": "Rapoarte partajate", + "You have not built a report yet.": "Nu ai creat încă niciun raport.", + "Nobody has shared a report with you yet.": "Nimeni nu a partajat încă un raport cu tine.", + "Reports you built over tasks, and the ones shared with you.": "Rapoartele pe care le-ai creat despre sarcini, și cele partajate cu tine.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "O interogare salvată despre sarcini: ce proiecte, ce filtre, grupată după ce, numărată sau însumată, și afișată ca tabel sau grafic.", + "The name the report is listed under": "Numele sub care apare raportul în listă", + "What the report shows and who it is for": "Ce arată raportul și pentru cine este", + "Nextcloud user id of the person who saved the report": "Id-ul de utilizator Nextcloud al persoanei care a salvat raportul", + "Who can open the report": "Cine poate deschide raportul", + "Only me": "Doar eu", + "Everyone who can read its projects": "Toți cei care îi pot citi proiectele", + "The projects the report covers, at most fifty": "Proiectele pe care le acoperă raportul, cel mult cincizeci", + "Filters": "Filtre", + "Task fields and the value each must equal": "Câmpurile sarcinii și valoarea cu care fiecare trebuie să fie egal", + "The task field the report groups on": "Câmpul sarcinii după care grupează raportul", + "Count the tasks, or add up a number on them": "Numără sarcinile sau adună un număr din ele", + "Sum": "Sumă", + "Sum of": "Suma câmpului", + "The number added up when the measure is a sum": "Numărul adunat când măsura este o sumă", + "Story points": "Puncte de poveste", + "Estimated duration": "Durată estimată", + "How the report is shown": "Cum este afișat raportul", + "Issue type": "Tip de tichet", + "Task fields and the value each must equal; empty when the report covers every task": "Câmpurile sarcinii și valoarea pe care trebuie să o aibă fiecare; gol când raportul cuprinde toate sarcinile", + "The status a task must have": "Starea pe care trebuie să o aibă o sarcină", + "The priority a task must have": "Prioritatea pe care trebuie să o aibă o sarcină", + "The user a task must be assigned to": "Utilizatorul căruia trebuie să îi fie atribuită o sarcină", + "A label a task must carry": "O etichetă pe care trebuie să o aibă o sarcină", + "The board column a task must be in": "Coloana tablei în care trebuie să fie o sarcină", + "The issue type a task must have": "Tipul de tichet pe care trebuie să îl aibă o sarcină", + "Manager groups": "Grupuri de manageri", + "Member groups": "Grupuri de membri", + "Viewer groups": "Grupuri de cititori", + "Viewers": "Cititori", + "Owning group": "Grup proprietar", + "Nextcloud groups whose members manage the project": "Grupuri Nextcloud ai căror membri gestionează proiectul", + "Nextcloud groups whose members work on the project": "Grupuri Nextcloud ai căror membri lucrează la proiect", + "Nextcloud groups whose members may read the project": "Grupuri Nextcloud ai căror membri pot citi proiectul", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Utilizatori Nextcloud care gestionează proiectul: setări, membri și lucru", + "Nextcloud user ids who may read the project and its work but not change it": "Utilizatori Nextcloud care pot citi proiectul și lucrul lui, dar nu îl pot schimba", + "The Nextcloud group that owns the project with its creator, at most one": "Grupul Nextcloud care deține proiectul împreună cu creatorul lui, cel mult unul", + "Nextcloud user ids who may read this through the project": "Utilizatori Nextcloud care pot citi asta prin proiect", + "Nextcloud groups whose members may change this through the project": "Grupuri Nextcloud ai căror membri pot schimba asta prin proiect", + "Nextcloud groups whose members may read this through the project": "Grupuri Nextcloud ai căror membri pot citi asta prin proiect", + "Search for a person or a group…": "Caută o persoană sau un grup…", + "No one found. Your admin's sharing settings decide who you can find.": "Nu a fost găsit nimeni. Setările de partajare ale administratorului decid pe cine poți găsi.", + "Type at least two characters": "Tastează cel puțin două caractere", + "Everyone in this group": "Toată lumea din acest grup", + "Could not search for people. Please try again.": "Căutarea persoanelor a eșuat. Încearcă din nou.", + "Could not remove the group": "Grupul nu a putut fi eliminat", + "Only the owner and managers change who is on this project.": "Doar proprietarul și managerii schimbă cine face parte din acest proiect.", + "Role of {name}": "Rolul lui {name}", + "Manager": "Manager", + "Member": "Membru", + "Viewer": "Cititor", + "Could not change the role": "Rolul nu a putut fi schimbat", + "Owned by group: {name}": "Deținut de grupul: {name}", + "No group owns this project.": "Niciun grup nu deține acest proiect.", + "Owned by group": "Deținut de grup", + "Search for a group…": "Caută un grup…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Niciun grup găsit. Setările de partajare ale administratorului decid ce grupuri poți găsi.", + "No owning group": "Fără grup proprietar", + "Could not search for groups. Please try again.": "Nu s-au putut căuta grupuri. Încearcă din nou.", + "Could not change the owning group": "Grupul proprietar nu a putut fi schimbat", + "You can read this project. Only its members change it.": "Poți citi acest proiect. Doar membrii lui îl modifică.", + "Course": "Curs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Cursul predat în această lecție, de exemplu o opțională, când aplicația de învățare a școlii îl cunoaște.", + "Online meeting link": "Linkul lecției online", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Unde se alătură elevii acestei lecții online. Butonul Alătură-te apare doar pentru un link https." }, "plurals": {} } diff --git a/l10n/ru.js b/l10n/ru.js index 951402a0..c20403fc 100644 --- a/l10n/ru.js +++ b/l10n/ru.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Активные проекты", + "Archived projects": "Архивные проекты", + "Boards": "Доски", + "My projects": "Мои проекты", + "Portfolio": "Портфель", + "Project board": "Доска проекта", + "Projects I am in": "Проекты, в которых я участвую", + "Timeline": "Временная шкала", + "Timesheet": "Учёт времени", + "Features & roadmap": "Функции и дорожная карта", + "Flow": "Поток", + "Flows": "Потоки", + "Reports": "Отчёты", + "Pick a report to open it.": "Выберите отчёт, чтобы открыть его.", + "In progress": "В работе", + "Date": "Дата", + "Due": "Срок", + "Assignee": "Назначено", + "Who": "Кто", + "What": "Что", + "Minutes": "Минуты", + "Entries": "Записи", + "Most recent": "Самые новые", + "Per person": "На человека", + "By status": "По статусу", + "By priority": "По приоритету", + "Task status": "Статус задач", + "Time spent": "Затраченное время", + "Capacity": "Ёмкость", + "Due soonest": "Ближайший срок", + "Minutes logged": "Записанные минуты", + "Nothing is due": "Ничего не запланировано", + "Nothing logged yet": "Пока ничего не записано", + "What is open, what is blocked, and what is overdue.": "Что открыто, что заблокировано и что просрочено.", + "How allocation is spread across the people working on projects.": "Как распределена нагрузка между людьми, работающими над проектами.", + "Hours logged, and the projects they went to.": "Записанные часы и проекты, на которые они ушли.", + "Billable": "Оплачиваемое", + "Budget: {amount}": "Бюджет: {amount}", + "Loading projects": "Загрузка проектов", + "No projects for this client yet": "Для этого клиента пока нет проектов", + "Open in Planninq": "Открыть в Planninq", + "This project could not be found": "Этот проект не найден", + "Untitled project": "Проект без названия", + "and {count} more": "и ещё {count}", + "Store": "Магазин", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Установите реестры, схемы и потоки, опубликованные другими организациями.", + "Work Date": "Дата работы", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Действия со столбцом", + "Columns": "Столбцы", + "Could not remove the column. Please try again.": "Не удалось удалить столбец. Попробуйте ещё раз.", + "Could not save the column. Please try again.": "Не удалось сохранить столбец. Попробуйте ещё раз.", + "Done column": "Столбец выполненных", + "Edit column": "Изменить столбец", + "Keep the card's status": "Сохранить статус карточки", + "Move its cards to": "Переместить его карточки в", + "Move left": "Переместить влево", + "Move right": "Переместить вправо", + "Status of cards moved here": "Статус карточек, перемещённых сюда", + "The last done column cannot be removed.": "Последний столбец выполненных нельзя удалить.", + "WIP limit": "Лимит WIP", + "over limit": "выше лимита", + "The status a card gets when it is moved into this column.": "Статус, который получает карточка при перемещении в этот столбец.", + "All priorities": "Все приоритеты", + "Could not create the task. Please try again.": "Не удалось создать задачу. Попробуйте ещё раз.", + "Created": "Создано", + "Move to backlog": "В бэклог", + "Move to board": "На доску", + "New task": "Новая задача", + "Nothing in the backlog": "В бэклоге ничего нет", + "Rank": "Ранг", + "Sort by": "Сортировать по", + "Sort by rank to reorder": "Сортируйте по рангу, чтобы изменить порядок", + "Task actions": "Действия с задачей", + "All labels": "Все метки", + "Filter tasks by label": "Фильтровать задачи по метке", + "View timeline": "Показать временную шкалу", + "Board": "Доска", + "List": "Список", + "Column": "Столбец", + "Board or list": "Доска или список", + "Log": "Журнал", + "Add entry": "Добавить запись", + "Show": "Показать", + "No actions yet": "Действий пока нет", + "Closed": "Закрыто", + "Entry actions": "Действия с записью", + "Add action": "Добавить действие", + "by {author}": "автор {author}", + "saved {time}": "сохранено {time}", + "Attendees: {names}": "Присутствующие: {names}", + "Add the first entry": "Добавить первую запись", + "Issues": "Проблемы", + "Lessons learned": "Извлечённые уроки", + "Meetings": "Встречи", + "Decisions": "Решения", + "Actions": "Действия", + "Issue": "Проблема", + "Lesson learned": "Извлечённый урок", + "Meeting": "Встреча", + "Decision": "Решение", + "About this project": "Об этом проекте", + "No description yet": "Описания пока нет", + "Start date": "Дата начала", + "Not set": "Не задано", + "End date": "Дата окончания", + "Progress": "Ход работ", + "No tasks yet": "Задач пока нет", + "Open the board": "Открыть доску", + "People": "Люди", + "Owner": "Владелец", + "Latest log entries": "Последние записи", + "Open the log": "Открыть журнал", + "{done} of {total} tasks done": "Выполнено {done} из {total} задач", + "Edit entry": "Редактировать запись", + "Type": "Вид", + "Attendees": "Присутствующие", + "Issue is closed": "Проблема закрыта", + "Could not save the entry. Please try again.": "Не удалось сохранить запись. Попробуйте ещё раз.", + "From: {title}": "Из: {title}", + "What needs to happen": "Что нужно сделать", + "Could not create the action. Please try again.": "Не удалось создать действие. Попробуйте ещё раз.", + "The action was created but could not be linked to the entry.": "Действие создано, но его не удалось связать с записью.", + "Project pages": "Страницы проекта", + "Overview": "Обзор", + "Risks": "Риски", + "Log entry": "Запись журнала", + "A short name for the entry": "Краткое название записи", + "Project": "Проект", + "The project this entry belongs to": "Проект, к которому относится эта запись", + "What kind of entry this is": "Какой это вид записи", + "When it happened": "Когда это произошло", + "What happened, in Markdown": "Что произошло, в Markdown", + "Whether an issue is still open": "Открыта ли ещё проблема", + "The people at a meeting": "Люди на встрече", + "Tasks that came out of this entry": "Задачи, возникшие из этой записи", + "Add risk": "Добавить риск", + "Risk": "Риск", + "Score": "Оценка", + "Response": "Реагирование", + "Review date": "Дата пересмотра", + "no longer on the project": "больше не в проекте", + "Edit {title}": "Редактировать {title}", + "No risks recorded yet": "Рисков пока не записано", + "Add the first risk": "Добавить первый риск", + "Medium": "Средний", + "Mitigating": "Смягчается", + "Occurred": "Наступил", + "Avoid": "Избежать", + "Reduce": "Снизить", + "Transfer": "Передать", + "Accept": "Принять", + "Highest open risks": "Самые высокие открытые риски", + "No open risks": "Нет открытых рисков", + "Open the risk register": "Открыть реестр рисков", + "Edit risk": "Редактировать риск", + "What could go wrong": "Что может пойти не так", + "Likelihood": "Вероятность", + "Impact": "Влияние", + "Score {score}": "Оценка {score}", + "Countermeasures": "Контрмеры", + "Could not save the risk. Please try again.": "Не удалось сохранить риск. Попробуйте ещё раз.", + "Risks by likelihood and impact": "Риски по вероятности и влиянию", + "Risk scale": "Шкала рисков", + "The levels every project scores its risks on, and where low turns into medium and high": "Уровни, по которым каждый проект оценивает свои риски, и где низкий переходит в средний и высокий", + "Number of levels": "Число уровней", + "Likelihood labels": "Названия вероятности", + "Impact labels": "Названия влияния", + "Level {level}": "Уровень {level}", + "Medium from score": "Средний от оценки", + "High from score": "Высокий от оценки", + "Risk scale saved": "Шкала рисков сохранена", + "1 risk uses level {level}. Change it first.": "1 риск использует уровень {level}. Сначала измените его.", + "{count} risks use level {level}. Change them first.": "Рисков на уровне {level}: {count}. Сначала измените их.", + "Every level needs a label, and high must start above medium.": "Каждому уровню нужно название, а высокий должен начинаться выше среднего.", + "The project this risk belongs to": "Проект, к которому относится этот риск", + "The cause and the effect, in Markdown": "Причина и следствие, в Markdown", + "Category": "Категория", + "A free grouping, such as planning, budget or supplier": "Свободная группировка, например планирование, бюджет или поставщик", + "How likely it is, on the admin's risk scale": "Насколько это вероятно, по шкале рисков администратора", + "How hard it would hit, on the admin's risk scale": "Насколько сильно это ударит, по шкале рисков администратора", + "Likelihood times impact, calculated by the server": "Вероятность, умноженная на влияние, считает сервер", + "Where the risk stands": "На каком этапе риск", + "The person who watches this risk": "Человек, который следит за этим риском", + "How the project answers the risk": "Как проект реагирует на риск", + "What is done to prevent it or soften it, in Markdown": "Что делается, чтобы его предотвратить или смягчить, в Markdown", + "When to look at this risk again": "Когда снова пересмотреть этот риск", + "Very low": "Очень низкий", + "Very high": "Очень высокий", + "All projects": "Все проекты", + "Project status report": "Отчёт о состоянии проекта", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датированный отчёт о том, как проект обстоит с деньгами, организацией, временем, информацией, качеством и риском (аспекты GROTIK), каждый с заметкой.", + "The project this report is about": "Проект, к которому относится отчёт", + "Report date": "Дата отчёта", + "The day the report describes": "День, который описывает отчёт", + "Money": "Деньги", + "How the project stands on this aspect": "Как проект обстоит с этим аспектом", + "On track": "По плану", + "At risk": "Под угрозой", + "Off track": "Вне плана", + "Money note": "Заметка о деньгах", + "A short explanation of this status": "Краткое пояснение к этому состоянию", + "Organisation": "Организация", + "Organisation note": "Заметка об организации", + "Time": "Время", + "Time note": "Заметка о времени", + "Information": "Информация", + "Information note": "Заметка об информации", + "Quality": "Качество", + "Quality note": "Заметка о качестве", + "Risk note": "Заметка о риске", + "Overall": "Итого", + "The worst of the six statuses, calculated by the server": "Худшее из шести состояний, вычисляется сервером", + "Health: money": "Состояние: деньги", + "Copied from the newest status report": "Скопировано из последнего отчёта о состоянии", + "Health: organisation": "Состояние: организация", + "Health: time": "Состояние: время", + "Health: information": "Состояние: информация", + "Health: quality": "Состояние: качество", + "Health: risk": "Состояние: риск", + "Health: overall": "Состояние: итого", + "Health: report date": "Состояние: дата отчёта", + "The date of the newest status report": "Дата последнего отчёта о состоянии", + "New report": "Новый отчёт", + "Only the project owner writes status reports.": "Отчёты о состоянии пишет только владелец проекта.", + "Latest report, {date}": "Последний отчёт, {date}", + "Aspect": "Аспект", + "Note": "Заметка", + "Report history": "История отчётов", + "Author": "Автор", + "No status reports yet": "Отчётов о состоянии пока нет", + "Write the first report": "Написать первый отчёт", + "Choose a status for every aspect to save the report.": "Выберите состояние для каждого аспекта, чтобы сохранить отчёт.", + "Suggested: on track.": "Предложение: по плану.", + "Suggested: at risk.": "Предложение: под угрозой.", + "Suggested: off track.": "Предложение: вне плана.", + "1 task is past its due date.": "1 задача просрочена.", + "{count} tasks are past their due date.": "Просроченных задач: {count}.", + "The end date has passed with 1 open task.": "Дата окончания прошла, открыта 1 задача.", + "The end date has passed with {count} open tasks.": "Дата окончания прошла, открытых задач: {count}.", + "No open task is past its due date.": "Ни одна открытая задача не просрочена.", + "The highest open risk, \"{title}\", scores {score}.": "Наибольший открытый риск, «{title}», имеет оценку {score}.", + "There are no open risks.": "Открытых рисков нет.", + "Costs are at {percent}% of the budget.": "Затраты составляют {percent}% бюджета.", + "No suggestion: the project has no budget.": "Нет предложения: у проекта нет бюджета.", + "No suggestion: no costs are recorded for this project yet.": "Нет предложения: по этому проекту ещё не учтены затраты.", + "The report was not saved. Only the project owner can write status reports.": "Отчёт не сохранён. Отчёты о состоянии может писать только владелец проекта.", + "No report": "Нет отчёта", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Группа проектов, которыми руководят одни и те же люди, например отдел или программа. Её руководители читают каждый проект в ней.", + "The name of the portfolio": "Название портфеля", + "What the portfolio holds and who runs it": "Что входит в портфель и кто им руководит", + "A colour for the portfolio's section in project lists": "Цвет раздела портфеля в списках проектов", + "Managers": "Руководители", + "Nextcloud user UIDs of the people who run the portfolio": "Идентификаторы пользователей Nextcloud, которые руководят портфелем", + "Order": "Порядок", + "Where the portfolio comes in project lists, lowest first": "Место портфеля в списках проектов, сначала наименьший", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Собственная шкала рисков этого портфеля в формате JSON, в той же форме, что и шкала всего приложения. Пусто означает шкалу приложения.", + "Portfolio readers": "Читатели портфеля", + "Nextcloud user UIDs of the managers of the project's portfolio": "Идентификаторы пользователей Nextcloud руководителей портфеля проекта", + "The portfolio this project belongs to": "Портфель, к которому относится проект", + "No portfolio": "Без портфеля", + "All portfolios": "Все портфели", + "You read this project as a manager of its portfolio. Only its members change it.": "Вы читаете этот проект как руководитель его портфеля. Изменяют его только участники.", + "Portfolios": "Портфели", + "Portfolio status": "Состояние портфеля", + "No portfolios yet": "Портфелей пока нет", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Администратор добавляет портфели в разделе Проекты, Портфели. Проекты портфеля перечислены здесь с их состоянием.", + "Roll-up": "Сводка", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} по плану, {atRisk} под угрозой, {offTrack} вне плана, {noReport} без отчёта", + "No project in this portfolio that you can read.": "В этом портфеле нет проекта, который вы можете читать.", + "Start": "Начало", + "End": "Конец", + "Budget": "Бюджет", + "Last report": "Последний отчёт", + "Out of date": "Устарел", + "Portfolio timeline": "Временная шкала портфеля", + "Zoom": "Масштаб", + "Could not load the timeline": "Не удалось загрузить временную шкалу", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Администратор добавляет портфели в разделе Проекты, Портфели. Проекты портфеля показаны здесь на одной временной шкале.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Откройте проект, чтобы увидеть его фазы и задачи. Временная шкала только для чтения.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Пропущены, так как вы не можете их читать: {count} проектов", + "Week": "Неделя", + "Day": "День", + "Month": "Месяц", + "Please try again later.": "Повторите попытку позже.", + "Status reports": "Отчёты о состоянии", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Через сколько дней последний отчёт о состоянии проекта помечается как устаревший в обзоре портфеля", + "Reporting period (days)": "Отчётный период (дни)", + "The reporting period is a whole number of days from 1 to 365.": "Отчётный период — целое число дней от 1 до 365.", + "Reporting period saved": "Отчётный период сохранён", + "The reporting period was not saved. Please try again.": "Отчётный период не сохранён. Повторите попытку.", + "Every project of a portfolio with its status per aspect, rolled up.": "Каждый проект портфеля с состоянием по аспектам, сводно.", + "The projects of a portfolio on one timeline.": "Проекты портфеля на одной временной шкале.", + "Phases": "Фазы", + "Add phase": "Добавить фазу", + "No phases yet": "Фаз пока нет", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Разделите проект на фазы, например инициация, определение и реализация. Фаза закрывается, когда загружен её итоговый документ.", + "{hours} hours": "{hours} ч", + "Concluding document: {title}": "Итоговый документ: {title}", + "Concluding document missing": "Нет итогового документа", + "Move {title} up": "Переместить {title} вверх", + "Move {title} down": "Переместить {title} вниз", + "Close phase": "Закрыть фазу", + "Phase": "Фаза", + "Files": "Файлы", + "Notes": "Заметки", + "Audit trail": "Журнал аудита", + "Edit phase": "Изменить фазу", + "Name": "Название", + "Budget hours": "Часы по бюджету", + "Could not save the phase. Please try again.": "Не удалось сохранить фазу. Повторите попытку.", + "Close phase {title}": "Закрыть фазу {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фаза закрывается итоговым документом: загрузите его здесь или выберите один из файлов фазы.", + "Concluding document": "Итоговый документ", + "This phase has no files yet.": "У этой фазы пока нет файлов.", + "Upload a document": "Загрузить документ", + "The document was not uploaded. Please try again.": "Документ не загружен. Повторите попытку.", + "Upload the concluding document before you close this phase.": "Загрузите итоговый документ, прежде чем закрыть эту фазу.", + "This phase cannot be closed from its current status.": "Эту фазу нельзя закрыть из её текущего статуса.", + "The phase was not closed. Please try again.": "Фаза не закрыта. Повторите попытку.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID файла этой фазы, который её закрывает. Фазу можно завершить, только когда он указан и файл прикреплён.", + "Import from Microsoft Project": "Импорт из Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Выберите план, сохранённый из Microsoft Project в формате XML. Ничего не импортируется, пока вы не подтвердите.", + "Plan file": "Файл плана", + "What the import creates": "Что создаст импорт", + "Tasks": "Задачи", + "Sub-tasks": "Подзадачи", + "Milestones": "Вехи", + "Links": "Связи", + "Already imported, updated in place: {count}": "Уже импортированы, обновлены на месте: {count}", + "What does not carry over": "Что не переносится", + "Tasks with resources, which are not imported: {count}": "Задачи с ресурсами, которые не импортируются: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Задачи глубже уровня 3, помещённые под свою задачу уровня 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Связи, отличные от окончание-начало, импортированы как связанные: {count}", + "Link lags, which are dropped: {count}": "Задержки связей, которые отбрасываются: {count}", + "Links to a summary task, which are not imported: {count}": "Связи с суммарной задачей, которые не импортируются: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Связи с задачами вне этого плана, которые не импортируются: {count}", + "No longer in the plan": "Больше нет в плане", + "These stay in the project; remove them yourself if they are no longer needed.": "Они остаются в проекте; удалите их сами, если они больше не нужны.", + "Import": "Импортировать", + "Close": "Закрыть", + "The plan is imported: {created} created, {updated} updated.": "План импортирован: создано {created}, обновлено {updated}.", + "Links that would close a loop were left out: {count}": "Связи, которые замкнули бы цикл, пропущены: {count}", + "The import stopped part-way. Run it again to finish it.": "Импорт остановился на полпути. Запустите его снова, чтобы завершить.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Сохраните план в Microsoft Project через Файл, Сохранить как, формат XML, и импортируйте этот файл.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Этот файл объявляет DOCTYPE или сущности, которые не принимаются.", + "The file is larger than 10 MB.": "Файл больше 10 МБ.", + "The plan has more than 2,000 tasks, more than one import takes.": "В плане больше 2000 задач, больше, чем принимает один импорт.", + "This file is not a Microsoft Project plan in XML format.": "Этот файл не является планом Microsoft Project в формате XML.", + "Choose a file to import.": "Выберите файл для импорта.", + "Only the project owner can import a plan.": "Только владелец проекта может импортировать план.", + "The plan could not be read. Please try again.": "Не удалось прочитать план. Попробуйте ещё раз.", + "Linked case: {title}": "Связанное дело: {title}", + "Linked to a case": "Связано с делом", + "Hand over to case": "Передать в дело", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Копирует без изменений каждый файл проекта и его задач, а также файл с описанием проекта, в связанное дело.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Скопировано файлов: {count}", + "Files that failed: {names}": "Файлы с ошибкой: {names}", + "The handover failed. Please try again.": "Передача не удалась. Попробуйте ещё раз.", + "The linked case could not be found, or you cannot open it.": "Связанное дело не найдено, или у вас нет доступа к нему.", + "Case handovers": "Передачи в дело", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Каждая передача файлов и метаданных проекта в его дело: когда, кем, в какое дело, каждый скопированный файл с его SHA-256 и файлы с ошибкой.", + "Finance": "Финансы", + "Add cost line": "Добавить строку затрат", + "Delivery terms": "Условия поставки", + "Billing model": "Модель оплаты", + "Budget in euro": "Бюджет в евро", + "Budget in hours": "Бюджет в часах", + "Hourly rate in euro": "Почасовая ставка в евро", + "Planned start": "Плановое начало", + "Planned end": "Плановое окончание", + "Planned dates": "Плановые даты", + "Budget {amount}": "Бюджет {amount}", + "No budget agreed": "Бюджет не согласован", + "Hours": "Часы", + "Only the project owner and the portfolio managers see the amounts.": "Суммы видят только владелец проекта и менеджеры портфеля.", + "Budget against cost per category": "Бюджет и затраты по категориям", + "Labour (booked time)": "Труд (учтённое время)", + "No category": "Без категории", + "Hours are not available": "Часы недоступны", + "Not yet assigned to a category": "Ещё не отнесено к категории", + "Total": "Итого", + "{spent} spent, {remaining} remaining": "{spent} потрачено, {remaining} осталось", + "Budget against cost per phase": "Бюджет и затраты по фазам", + "No phase": "Без фазы", + "Cost lines": "Строки затрат", + "From the finance system": "Из финансовой системы", + "Edit cost line {amount}": "Изменить строку затрат {amount}", + "No cost lines yet": "Строк затрат пока нет", + "Commitments": "Обязательства", + "Actual cost": "Фактические затраты", + "Forecast": "Прогноз", + "Remaining": "Осталось", + "Not planned yet": "Ещё не запланировано", + "{start} to {end}": "с {start} по {end}", + "The terms were not saved. Please try again.": "Условия не сохранены. Попробуйте ещё раз.", + "Terms saved": "Условия сохранены", + "Fixed price": "Фиксированная цена", + "Hourly": "Почасово", + "Not billed": "Без выставления счёта", + "Commitment": "Обязательство", + "Edit cost line": "Изменить строку затрат", + "Kind": "Вид", + "Amount in euro": "Сумма в евро", + "Remove": "Удалить", + "Could not save the cost line. Only the project owner changes the money of a project.": "Не удалось сохранить строку затрат. Деньги проекта меняет только владелец проекта.", + "Could not remove the cost line. Please try again.": "Не удалось удалить строку затрат. Попробуйте ещё раз.", + "{amount} over budget": "{amount} сверх бюджета", + "Cost categories": "Категории затрат", + "The categories every project splits its budget and costs into, one per line": "Категории, на которые каждый проект делит свой бюджет и затраты, по одной в строке", + "Categories": "Категории", + "Give at least one category, each name once.": "Укажите хотя бы одну категорию, каждое название один раз.", + "Cost categories saved": "Категории затрат сохранены", + "The cost categories were not saved. Please try again.": "Категории затрат не сохранены. Попробуйте ещё раз.", + "Finance line": "Финансовая строка", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Одна денежная сумма проекта: бюджет, обязательство, фактические затраты или прогноз, в категории затрат и при необходимости в фазе. Вводится владельцем проекта или передаётся финансовой системой через приложение интеграции.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Проект, к которому относится сумма. Пусто для строки из финансовой системы, номер проекта которой не совпадает ни с одним проектом.", + "The phase this amount belongs to, if any": "Фаза, к которой относится сумма, если есть", + "The cost category, one of the categories the admin set up": "Категория затрат, одна из категорий, заданных администратором", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Является ли сумма бюджетом, обязательством, фактическими затратами или прогнозом", + "Amount": "Сумма", + "The amount in the reporting currency (euro)": "Сумма в валюте отчётности (евро)", + "The date the amount was booked or is expected": "Дата, когда сумма проведена или ожидается", + "What the amount is for": "На что эта сумма", + "Whether a person entered the line or the finance system sent it": "Ввёл ли строку человек или её прислала финансовая система", + "Entered by hand": "Введено вручную", + "Finance line id": "Идентификатор финансовой строки", + "The finance system's own id of this line. One imported line per id.": "Собственный идентификатор строки в финансовой системе. Одна импортированная строка на идентификатор.", + "Project number": "Номер проекта", + "The project number the finance system sent, matched against the project key": "Номер проекта из финансовой системы, сверяемый с ключом проекта", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Портфель проекта строки, скопированный из проекта, чтобы итогам портфеля хватало одного фильтра", + "Finance readers": "Читатели финансов", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID пользователей Nextcloud, которым разрешено видеть сумму: владелец проекта и менеджеры его портфеля", + "Project owner": "Владелец проекта", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID пользователя Nextcloud, владельца проекта, который может изменять и удалять ручные строки", + "How the client pays: not billed, a fixed price, or by the hour.": "Как платит клиент: без выставления счёта, фиксированная цена или почасово.", + "Portfolio finance": "Финансы портфеля", + "You cannot see the money of any project in this portfolio": "Вы не видите денег ни одного проекта в этом портфеле", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Сервер вернул строки затрат проектов вне этого портфеля, поэтому итоги могут быть неверны.", + "Projects left out because you cannot see their money: {count}": "Пропущено проектов, чьи деньги вам не видны: {count}", + "Unmatched finance lines": "Несопоставленные финансовые строки", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Бюджет, обязательства, фактические затраты и прогноз в сумме по портфелю.", + "Subprojects": "Подпроекты", + "{done} of {total}": "{done} из {total}", + "{done} of {total} tasks done, including subprojects": "Выполнено {done} из {total} задач, включая подпроекты", + "Show the subprojects of {title}": "Показать подпроекты {title}", + "Hide the subprojects of {title}": "Скрыть подпроекты {title}", + "Part of": "Входит в", + "No parent project": "Без родительского проекта", + "A project cannot sit under one of its own subprojects.": "Проект не может находиться под одним из своих подпроектов.", + "Projects nest three levels deep at most: programme, project and subproject.": "Проекты вкладываются не глубже трёх уровней: программа, проект и подпроект.", + "Parent project": "Родительский проект", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Проект, под которым находится этот проект, например программа. Проекты вкладываются не глубже трёх уровней.", + "Yes": "Да", + "No": "Нет", + "{label} (required)": "{label} (обязательно)", + "{label} is required": "Поле «{label}» обязательно", + "Project field": "Поле проекта", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поле, которое администратор добавляет в каждый проект, например сфера политики или стоимость договора.", + "Key": "Ключ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Постоянное имя, под которым хранится значение, в lower camel case. Не меняйте его, когда проекты его используют.", + "Label": "Подпись", + "The name people see next to the field": "Название рядом с полем", + "What the field holds": "Что содержит поле", + "Text": "Текст", + "Number": "Число", + "Choice": "Выбор", + "Person": "Человек", + "Yes or no": "Да или нет", + "Options": "Варианты", + "The choices of a choice field": "Варианты поля выбора", + "Required": "Обязательное", + "Whether a project must fill in the field": "Должен ли проект заполнить поле", + "Where the field appears, lowest first": "Где появляется поле, меньшее первым", + "Applies to": "Относится к", + "What the field is added to": "К чему добавляется поле", + "Custom fields": "Свои поля", + "The values of the project fields an admin defined, keyed by the field's key.": "Значения полей проекта, заданных администратором, по ключу поля.", + "Project fields": "Поля проекта", + "Related": "Связанные", + "Remove link": "Удалить связь", + "Link type": "Тип связи", + "Relates to": "Связана с", + "Duplicates": "Дублирует", + "Project key": "Ключ проекта", + "Every task number starts with it, such as VERG-42.": "С него начинается каждый номер задачи, например VERG-42.", + "This key is already used by another project.": "Этот ключ уже используется другим проектом.", + "Use 2 to 10 letters and digits, starting with a letter.": "Используйте от 2 до 10 букв и цифр, начиная с буквы.", + "The key cannot change once tasks carry it.": "Ключ нельзя изменить, когда задачи его уже носят.", + "Project saved. The existing tasks get their numbers in the background.": "Проект сохранён. Существующие задачи получают номера в фоновом режиме.", + "Next task number": "Номер следующей задачи", + "The number the next task of this project gets in its key. Only the system writes it.": "Номер, который следующая задача этого проекта получает в своём ключе. Его записывает только система.", + "Restore {title}": "Восстановить {title}", + "Restore": "Восстановить", + "Project restored": "Проект восстановлен", + "Could not restore the project": "Не удалось восстановить проект", + "Bring this project back to the active list.": "Вернуть этот проект в список активных проектов.", + "Restore project": "Восстановить проект", + "Request reason": "Причина запроса", + "Why the requester needs this project. Filled in when the project is requested.": "Зачем заявителю нужен этот проект. Заполняется при запросе.", + "Reviewed by": "Рассмотрено", + "The user who approved or rejected the request.": "Пользователь, который одобрил или отклонил запрос.", + "Reviewed at": "Дата рассмотрения", + "When the request was approved or rejected.": "Когда запрос был одобрен или отклонён.", + "Review note": "Комментарий рецензента", + "The reviewer's reason, shown to the requester when a request is not approved.": "Причина рецензента, которую видит заявитель, если запрос не одобрен.", + "Members of these groups": "Участники этих групп", + "Groups that may create projects": "Группы, которым можно создавать проекты", + "The group {group} no longer exists. Save to remove it.": "Группа {group} больше не существует. Сохраните, чтобы убрать её.", + "Review project request": "Рассмотреть запрос проекта", + "Requested by": "Запросил", + "Why it is needed": "Зачем он нужен", + "Desired start date": "Желаемая дата начала", + "Why is it not approved?": "Почему не одобрено?", + "Give a reason. The requester sees it.": "Укажите причину. Заявитель её увидит.", + "Approve": "Одобрить", + "Reject": "Отклонить", + "Reject request": "Отклонить запрос", + "The review was not saved. Try again.": "Решение не сохранено. Попробуйте снова.", + "This project is waiting for review": "Этот проект ожидает рассмотрения", + "This request was not approved": "Этот запрос не одобрен", + "Reason: {note}": "Причина: {note}", + "Review request": "Рассмотреть запрос", + "Request a project": "Запросить проект", + "Step {step} of 2": "Шаг {step} из 2", + "Why is this project needed?": "Зачем нужен этот проект?", + "Give a reason. The reviewer reads it.": "Укажите причину. Рецензент её прочитает.", + "Back": "Назад", + "Next": "Далее", + "Send request": "Отправить запрос", + "The request was not sent. Try again.": "Запрос не отправлен. Попробуйте снова.", + "Requested": "Запрошен", + "Not approved": "Не одобрен", + "Your request was sent": "Ваш запрос отправлен", + "Let everyone else request a project": "Разрешить всем остальным запрашивать проект", + "Add a task": "Добавить задачу", + "Delete task": "Удалить задачу", + "Edit task": "Изменить задачу", + "Write": "Написать", + "Preview": "Предпросмотр", + "Markdown works here: headings, lists and links.": "Здесь работает Markdown: заголовки, списки и ссылки.", + "Could not save the task. Please try again.": "Не удалось сохранить задачу. Попробуйте ещё раз.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "По задаче \"{title}\" учтено время, поэтому её нельзя удалить. Вместо этого её можно отменить: записи времени сохранятся.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Удалить \"{title}\"? Её связи с другими задачами тоже будут удалены. Это действие нельзя отменить.", + "Keep task": "Оставить задачу", + "Cancel task": "Отменить задачу", + "Only the reporter, the project owner or an admin can delete this task.": "Удалить эту задачу может только автор, владелец проекта или администратор.", + "Could not delete the task. Please try again.": "Не удалось удалить задачу. Попробуйте ещё раз.", + "Could not cancel the task. Please try again.": "Не удалось отменить задачу. Попробуйте ещё раз.", + "Responsible": "Ответственный", + "Also working on this": "Также работают над этим", + "Labels": "Метки", + "Could not change the priority. Please try again.": "Не удалось изменить приоритет. Попробуйте ещё раз.", + "Other project members who work on this task alongside the person responsible.": "Другие участники проекта, которые работают над задачей вместе с ответственным.", + "Duplicate": "Дублировать", + "Could not copy the task. Please try again.": "Не удалось скопировать задачу. Попробуйте ещё раз.", + "Subtasks": "Подзадачи", + "{done} of {total} done": "Выполнено {done} из {total}", + "Add a subtask": "Добавить подзадачу", + "Checklist": "Чек-лист", + "Checklist item actions": "Действия с пунктом чек-листа", + "Add a checklist item": "Добавить пункт чек-листа", + "Subtasks: {estimate} estimated, {logged} logged": "Подзадачи: оценка {estimate}, учтено {logged}", + "Total estimate: {total}": "Общая оценка: {total}", + "Part of {title}": "Часть задачи {title}", + "Checklist: {count} done": "Чек-лист: выполнено {count}", + "This task has subtasks: {count}.": "У этой задачи есть подзадачи: {count}.", + "Keep subtasks as separate tasks": "Оставить подзадачи отдельными задачами", + "Delete subtasks too": "Удалить и подзадачи", + "Copy of {title}": "Копия: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Задача скопирована, но не все её подзадачи. Проверьте копию.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Небольшие шаги внутри задачи. У каждого пункта есть id, текст и отметка о выполнении.", + "Open work per person and per project.": "Открытая работа по людям и по проектам.", + "View": "Вид", + "By person": "По людям", + "By project": "По проектам", + "Hours left": "Осталось часов", + "Tasks without an estimate": "Задачи без оценки", + "Due in 14 days": "Срок в течение 14 дней", + "Shared": "Общие", + "Unassigned": "Не назначены", + "{hours} h": "{hours} ч", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Показана работа в проектах, которые вы можете видеть. Часы учитываются для ответственного; общие задачи учитываются без часов.", + "No open work in these projects.": "В этих проектах нет открытой работы.", + "Open work": "Открытая работа", + "{count} open tasks": "Открытых задач: {count}", + "Create a project to see capacity here.": "Создайте проект, чтобы увидеть здесь загрузку.", + "My tasks": "Мои задачи", + "Show all my tasks": "Показать все мои задачи", + "No tasks assigned to you": "Вам не назначено ни одной задачи", + "Browse projects": "Просмотреть проекты", + "Later": "Позже", + "Due {date}": "Срок {date}", + "Could not change the status. Please try again.": "Не удалось изменить статус. Попробуйте ещё раз.", + "Completed today": "Завершено сегодня", + "My open tasks": "Мои открытые задачи", + "My overdue tasks": "Мои просроченные задачи", + "My tasks in progress": "Мои задачи в работе", + "Pin to the top": "Закрепить наверху", + "Unpin": "Открепить", + "Pinned": "Закреплено", + "Actions for {title}": "Действия для {title}", + "Could not save your project order. Please try again.": "Не удалось сохранить порядок ваших проектов. Попробуйте ещё раз.", + "No boards yet": "Досок пока нет", + "Create a project to get a board.": "Создайте проект, чтобы получить доску.", + "Use the Projects page to create and manage your projects and tasks.": "Создавайте проекты и задачи и управляйте ими на странице «Проекты».", + "Go to projects": "К проектам", + "You are not a member of any projects yet.": "Вы пока не участник ни одного проекта.", + "Could not search for users. Please try again.": "Не удалось найти пользователей. Попробуйте ещё раз.", + "Project creation is restricted to administrators.": "Создавать проекты могут только администраторы.", + "Only the project owner or an administrator can delete this project.": "Удалить этот проект может только владелец проекта или администратор.", + "No projects are available to you yet. Ask an administrator to create one.": "Вам пока не доступен ни один проект. Попросите администратора создать проект.", + "Due: {date}": "Срок: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Задачи с датой начала или сроком отображаются на временной шкале. Добавьте даты, чтобы увидеть их здесь.", + "You do not have access to this project.": "У вас нет доступа к этому проекту.", + "Zoom level": "Масштаб", + "Unscheduled": "Не запланированы", + "Start: {date}": "Начало: {date}", + "Today": "Сегодня", + "No scheduled tasks": "Нет запланированных задач", + "An unexpected error occurred.": "Произошла непредвиденная ошибка.", + "Column {number} name": "Название столбца {number}", + "Failed to save creation policy": "Не удалось сохранить правило создания", + "All authenticated users": "Все вошедшие пользователи", + "Control who may create new projects": "Определите, кто может создавать новые проекты", + "Administrators only": "Только администраторы", + "Project creation": "Создание проектов", + "Allow project creation": "Разрешить создание проектов", + "Creation policy saved successfully": "Правило создания сохранено", + "Initializing…": "Запуск…", + "e.g. 2h 30m, 90m, 1.5h": "напр. 2h 30m, 90m, 1.5h", + "Log time": "Учесть время", + "Save estimate": "Сохранить оценку", + "Logged: {logged}": "Учтено: {logged}", + "over by {amount}": "превышено на {amount}", + "Time tracking": "Учёт времени", + "Estimate": "Оценка", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Введите корректную оценку (напр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Введите корректную длительность (напр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Не удалось сохранить запись времени. Попробуйте ещё раз.", + "Edit time entry": "Изменить запись времени", + "Duration": "Длительность", + "Date range": "Период", + "Last week": "Прошлая неделя", + "No time logged": "Время не учтено", + "Log time on a task to see it here.": "Учтите время по задаче, чтобы увидеть его здесь.", + "To date": "По дату", + "This week": "Эта неделя", + "Total: {total}": "Итого: {total}", + "From date": "С даты", + "Custom range": "Свой период", + "All time": "За всё время", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Не удалось удалить задачу, поэтому данные могли остаться. Удалите проект ещё раз.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Не удалось удалить запись времени, поэтому данные могли остаться. Удалите проект ещё раз.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Не удалось удалить столбец, поэтому данные могли остаться. Удалите проект ещё раз.", + "Could not delete the project. Please try again.": "Не удалось удалить проект. Попробуйте ещё раз.", + "Notification settings": "Настройки уведомлений", + "Configure when due-date reminders are sent": "Укажите, когда отправляются напоминания о сроках", + "Due-date reminder lead time (hours)": "Заблаговременность напоминания (часы)", + "Lead time must be between 1 and 336 hours": "Заблаговременность должна быть от 1 до 336 часов", + "Reminder lead time saved successfully": "Заблаговременность напоминания сохранена", + "Failed to save reminder lead time": "Не удалось сохранить заблаговременность напоминания", + "Notifications": "Уведомления", + "Notify me 1 day before a task's due date": "Уведомлять меня за 1 день до срока задачи", + "Draft": "Черновик", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Является ли урок черновиком, который видит только его учитель, состоится ли он или отменён.", + "New release": "Новый выпуск", + "Roadmap chart. The same releases and epics are listed below.": "Диаграмма дорожной карты. Те же выпуски и эпики перечислены ниже.", + "Nothing on the roadmap yet": "На дорожной карте пока ничего нет", + "Releases with a target date and epics with dated tasks appear here.": "Здесь появляются выпуски с целевой датой и эпики с задачами, у которых есть дата.", + "Releases": "Выпуски", + "No releases yet": "Пока нет выпусков", + "Target date: {date}": "Целевая дата: {date}", + "No target date": "Без целевой даты", + "Edit {name}": "Изменить {name}", + "Mark {name} as released": "Отметить {name} как выпущенный", + "Mark as released": "Отметить как выпущенный", + "Epics": "Эпики", + "No epics yet. Open a task to make it an epic.": "Пока нет эпиков. Откройте задачу, чтобы сделать её эпиком.", + "Not scheduled yet": "Пока не запланировано", + "Planned": "Запланирован", + "Released": "Выпущен", + "Edit release": "Изменить выпуск", + "Target date": "Целевая дата", + "Could not save the release. Please try again.": "Не удалось сохранить выпуск. Попробуйте ещё раз.", + "Every task of this release is done or cancelled.": "Каждая задача этого выпуска выполнена или отменена.", + "Not finished yet: {count}": "Ещё не завершено: {count}", + "What happens to these tasks?": "Что будет с этими задачами?", + "Move to {name}": "Переместить в {name}", + "Remove the release": "Убрать выпуск", + "Keep it on {name}": "Оставить их в {name}", + "Could not mark the release as released. Please try again.": "Не удалось отметить выпуск как выпущенный. Попробуйте ещё раз.", + "Roadmap": "Дорожная карта", + "Tasks or roadmap": "Задачи или дорожная карта", + "Release": "Выпуск", + "Epic": "Эпик", + "This task is an epic": "Эта задача является эпиком", + "A named, dated delivery of a project that its tasks are planned against.": "Именованная поставка проекта с датой, под которую планируются его задачи.", + "Name of the release": "Название выпуска", + "The project this release belongs to": "Проект, к которому относится этот выпуск", + "What this release delivers": "Что поставляет этот выпуск", + "When work on the release starts": "Когда начинается работа над выпуском", + "The date the release is due": "Дата, к которой выпуск должен быть готов", + "Whether the release is planned, released or archived": "Запланирован ли выпуск, выпущен или заархивирован", + "Released on": "Выпущен", + "When the release was marked as released": "Когда выпуск отметили как выпущенный", + "The release this task is planned for": "Выпуск, на который запланирована эта задача", + "Board view options": "Параметры вида доски", + "Colour cards": "Раскрасить карточки", + "No colour": "Без цвета", + "By label": "По метке", + "Swimlanes": "Дорожки", + "No swimlanes": "Без дорожек", + "By assignee": "По исполнителю", + "By epic": "По эпику", + "No assignee": "Не назначено", + "No epic": "Без эпика", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Карточки остаются в строке своего эпика. Измените эпик на странице задачи.", + "Hand over to": "Передать", + "Could not save your board view. It applies until you reload.": "Вид доски не сохранён. Он действует до перезагрузки.", + "Timetable wish": "Пожелание к расписанию", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Пожелание, которое учитывает генератор. Жёсткое пожелание он соблюдает всегда, мягкое, где может.", + "Whether the wish is about a teacher, a group, a room or one activity": "Касается ли пожелание учителя, группы, помещения или одного занятия", + "Teacher": "Учитель", + "Group": "Группа", + "Reference": "Ссылка", + "The user, group, room or activity the wish is about": "Пользователь, группа, помещение или занятие, к которым относится пожелание", + "What the wish asks for": "Чего просит пожелание", + "Not on these periods": "Не в эти уроки", + "Preferably not on these periods": "Лучше не в эти уроки", + "At most a number of lessons a day": "Не больше определённого числа уроков в день", + "No free periods between lessons": "Без окон между уроками", + "Always the same room": "Всегда одно и то же помещение", + "Periods": "Уроки", + "The periods of the week the wish is about, such as wed-5": "Уроки недели, к которым относится пожелание, например wed-5", + "Limit": "Предел", + "The most lessons a day, for a wish of that kind": "Наибольшее число уроков в день для пожелания такого вида", + "Strength": "Сила", + "Whether the generator must keep the wish or should keep it": "Должен ли генератор соблюсти пожелание или желательно", + "Hard": "Жёсткое", + "Soft": "Мягкое", + "Weight": "Вес", + "How much a soft wish counts, from 1 to 3": "Сколько весит мягкое пожелание, от 1 до 3", + "Why the wish exists": "Зачем нужно пожелание", + "Timetable scenario": "Сценарий расписания", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Один недельный шаблон, созданный генератором или взятый из текущего расписания. Он хранит свои входные данные и то, как хорошо соблюдает пожелания.", + "The name timetablers know the scenario by": "Название, под которым составители знают сценарий", + "Whether the generator made it or it came from the current timetable": "Создал ли его генератор или он взят из текущего расписания", + "Generated": "Сгенерирован", + "From the current timetable": "Из текущего расписания", + "Week of": "Неделя с", + "The Monday of the first week of the window": "Понедельник первой недели периода", + "Window start": "Начало периода", + "The first day the week pattern applies to": "Первый день, к которому применяется недельный шаблон", + "Window end": "Конец периода", + "The last day the week pattern applies to": "Последний день, к которому применяется недельный шаблон", + "Waiting, generating, done, failed, or published as draft lessons": "Ожидает, создаётся, готов, не удался или опубликован как черновые уроки", + "Waiting": "Ожидает", + "Generating": "Создаётся", + "Failed": "Не удался", + "Published": "Опубликован", + "Seed": "Начальное число", + "The number the generator starts from, so a run can be repeated": "Число, с которого начинает генератор, чтобы запуск можно было повторить", + "Input": "Входные данные", + "The periods, rooms, lessons and wishes the scenario was made from": "Уроки, помещения, занятия и пожелания, из которых сделан сценарий", + "Placements": "Размещения", + "Each lesson with the period and room it was given": "Каждое занятие с полученными уроком и помещением", + "Unplaced lessons": "Неразмещённые занятия", + "Lessons without a place, each with the hard wish that blocked it": "Занятия без места, каждое с жёстким пожеланием, которое его остановило", + "Broken wishes": "Нарушенные пожелания", + "The wishes this scenario breaks, with the lessons that break them": "Пожелания, которые нарушает этот сценарий, с нарушающими их занятиями", + "Measures": "Показатели", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Размещённые занятия, нарушенные пожелания, окна учителей, уроки в день и использование помещений", + "Reason": "Причина", + "Why the run failed": "Почему запуск не удался", + "Published at": "Опубликован", + "When the scenario was written out as draft lessons": "Когда сценарий записан как черновые уроки", + "Edit wish": "Изменить пожелание", + "New wish": "Новое пожелание", + "Hard: the generator always keeps it": "Обязательное: генератор всегда его соблюдает", + "Soft: the generator keeps it where it can": "Гибкое: генератор соблюдает его, где может", + "Weight (1 to 3)": "Вес (от 1 до 3)", + "Most lessons a day": "Не больше уроков в день", + "Period": "Урок", + "{day} period {number}": "{day} урок {number}", + "Teacher (user name)": "Учитель (имя пользователя)", + "Activity (group:subject)": "Занятие (группа:предмет)", + "Say who or what the wish is about.": "Укажите, кого или что касается пожелание.", + "Choose at least one period.": "Выберите хотя бы один урок.", + "The limit is a whole number of 1 or more.": "Лимит: целое число от 1.", + "Timetable": "Расписание", + "Wishes": "Пожелания", + "Timetable wishes": "Пожелания к расписанию", + "Generator run": "Запуск генератора", + "Generator progress": "Ход генератора", + "The run failed: {reason}": "Запуск не удался: {reason}", + "{placed} of {lessons} lessons placed": "Размещено {placed} из {lessons} уроков", + "Generate again": "Сгенерировать снова", + "Generate": "Сгенерировать", + "Every lesson has a place.": "У каждого урока есть место.", + "Lesson": "Урок", + "No free period and room": "Нет свободного урока и кабинета", + "Broken soft wishes": "Нарушенные гибкие пожелания", + "Every soft wish is kept.": "Каждое гибкое пожелание соблюдено.", + "Wish": "Пожелание", + "Lessons": "Уроки", + "Generating: {percent}% of the time budget used": "Генерация: использовано {percent}% времени", + "Waiting to start": "Ожидает запуска", + "Published as draft lessons": "Опубликовано как черновики уроков", + "Could not read the scenario.": "Не удалось прочитать сценарий.", + "Could not start the run.": "Не удалось начать запуск.", + "Scenarios": "Сценарии", + "Timetable scenarios": "Сценарии расписания", + "Scenario": "Сценарий", + "Take the current timetable": "Взять текущее расписание", + "Could not take the current timetable.": "Не удалось взять текущее расписание.", + "Broken hard wishes": "Нарушенные обязательные пожелания", + "Not on a period of the week grid": "Не на уроке недельной сетки", + "Compare scenarios": "Сравнить сценарии", + "Scenarios to compare": "Сценарии для сравнения", + "Choose two or three scenarios to compare them.": "Выберите два или три сценария, чтобы сравнить их.", + "Measure": "Показатель", + "Best": "Лучший", + "Lessons that differ": "Уроки, которые отличаются", + "No lesson differs.": "Ни один урок не отличается.", + "Not placed": "Не размещён", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Размещённые уроки", + "Lessons without a place": "Уроки без места", + "Clashes": "Конфликты", + "Hard wishes broken": "Нарушенные обязательные пожелания", + "Soft wishes broken": "Нарушенные гибкие пожелания", + "Soft wishes broken, weighted": "Нарушенные гибкие пожелания, взвешенные", + "Free periods between lessons, all teachers": "Окна, все учителя", + "Most free periods of one teacher": "Больше всего окон у одного учителя", + "Most lessons of one group on a day": "Больше всего уроков одной группы за день", + "Room use": "Использование кабинетов", + "Publish as draft lessons": "Опубликовать как черновики уроков", + "Draft lessons written: {count}": "Записано черновиков уроков: {count}", + "Could not publish the scenario.": "Не удалось опубликовать сценарий.", + "Rules": "Правила", + "Rules for {column}": "Правила для {column}", + "When a card enters this column": "Когда карточка попадает в эту колонку", + "Action": "Действие", + "Set the priority": "Задать приоритет", + "Assign to": "Назначить", + "Assign the person who moved the card": "Назначить того, кто переместил карточку", + "Remove the assignee": "Снять исполнителя", + "Add a label": "Добавить метку", + "No longer a project member": "Больше не участник проекта", + "This label no longer exists": "Этой метки больше нет", + "Add rule": "Добавить правило", + "Remove rule": "Удалить правило", + "No rules yet. Add one to change a card when it enters this column.": "Правил пока нет. Добавьте правило, чтобы менять карточку, когда она попадает в эту колонку.", + "Could not save the rules. Please try again.": "Не удалось сохранить правила. Попробуйте ещё раз.", + "1 rule runs when a card enters this column": "1 правило срабатывает, когда карточка попадает в эту колонку", + "{count} rules run when a card enters this column": "Число правил, срабатывающих, когда карточка попадает в эту колонку: {count}", + "Rules applied: {changes}": "Применённые правила: {changes}", + "assigned to {name}": "назначено: {name}", + "assignee removed": "исполнитель снят", + "priority {priority}": "приоритет {priority}", + "label {label}": "метка {label}", + "What happens to a card when it enters this column, applied in list order.": "Что происходит с карточкой, когда она попадает в эту колонку, в порядке списка.", + "Value": "Значение", + "What the rule does to the card.": "Что правило делает с карточкой.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Приоритет, id пользователя или id метки, которые использует действие; пусто для действий без значения.", + "is not": "не", + "{dimension} is not": "{dimension} не", + "Saved filters": "Сохранённые фильтры", + "No saved filters yet": "Сохранённых фильтров пока нет", + "Save filter": "Сохранить фильтр", + "Rename \"{name}\"": "Переименовать «{name}»", + "Delete \"{name}\"": "Удалить «{name}»", + "Clear filters": "Сбросить фильтры", + "Showing {shown} of {total} tasks": "Показано {shown} из {total} задач", + "Me": "Я", + "No date": "Без даты", + "Rename saved filter": "Переименовать сохранённый фильтр", + "Share with the project": "Поделиться с проектом", + "Give the filter a name": "Дайте фильтру название", + "Could not save the filter. Please try again.": "Не удалось сохранить фильтр. Попробуйте ещё раз.", + "Some labels in \"{name}\" no longer exist and were left out.": "Некоторых меток из «{name}» больше нет, они пропущены.", + "Could not delete the filter. Please try again.": "Не удалось удалить фильтр. Попробуйте ещё раз.", + "Saved filter": "Сохранённый фильтр", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Именованный фильтр доски одного проекта, личный для того, кто его сохранил, если он не открыт проекту.", + "The project whose board the filter applies to": "Проект, к доске которого относится фильтр", + "The name the filter is listed under": "Название, под которым фильтр показан в списке", + "Saved by": "Сохранил(а)", + "Nextcloud user id of the person who saved the filter": "Id пользователя Nextcloud того, кто сохранил фильтр", + "Shared with the project": "Открыт проекту", + "Whether every project member sees and applies the filter": "Видит ли каждый участник проекта фильтр и может ли его применить", + "Criteria": "Критерии", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Фильтр: исполнитель, метка, приоритет и срок, каждый с есть или не и значениями", + "Cross-project view": "Межпроектное представление", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Сохранённый набор проектов, задачи которых показываются вместе в колонках по статусу, с доступом для указанных людей.", + "Shared with": "Доступно для", + "The name the view is listed under": "Название, под которым представление указано в списке", + "Nextcloud user id of the person who saved the view": "Идентификатор пользователя Nextcloud того, кто сохранил представление", + "Nextcloud user ids of the people the view is shared with": "Идентификаторы пользователей Nextcloud тех, кому открыто представление", + "The projects whose tasks the view shows, at most twenty": "Проекты, задачи которых показывает представление, не более двадцати", + "1 project in this view is hidden from you.": "1 проект в этом представлении скрыт от вас.", + "{count} projects in this view are hidden from you.": "Проекты в этом представлении, скрытые от вас: {count}.", + "{project} has no column for {status}.": "У проекта {project} нет колонки для статуса {status}.", + "This view does not exist or is not shared with you.": "Это представление не существует или недоступно вам.", + "\"{task}\" moved to {status}.": "\"{task}\" перемещена в {status}.", + "Project: {title}": "Проект: {title}", + "Cross-project views": "Межпроектные представления", + "New view": "Новое представление", + "Edit view": "Изменить представление", + "Delete view": "Удалить представление", + "Give the view a name": "Дайте представлению название", + "Pick at least one project": "Выберите хотя бы один проект", + "A view shows at most {max} projects": "Представление показывает не более {max} проектов", + "Could not save the view. Please try again.": "Не удалось сохранить представление. Попробуйте ещё раз.", + "Could not delete the view. Please try again.": "Не удалось удалить представление. Попробуйте ещё раз.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Удалить «{title}»? Проекты и их задачи останутся без изменений.", + "People see the tasks of the projects they are in, never more.": "Каждый видит только задачи проектов, в которых участвует.", + "No views yet. A view shows the tasks of several of your projects together.": "Представлений пока нет. Представление показывает задачи нескольких ваших проектов вместе.", + "Projects in view: {count}": "Проектов в представлении: {count}", + "Notify me when a task is assigned to me": "Уведомлять меня, когда мне назначают задачу", + "Also send these to me by email": "Также присылать их мне по почте", + "Add an email address in your Nextcloud personal settings to get mail.": "Добавьте адрес электронной почты в личных настройках Nextcloud, чтобы получать письма.", + "Code link": "Ссылка на код", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Коммит, ветка, запрос на слияние или задача в сервисе кода, связанные с задачей.", + "The task the link belongs to": "Задача, к которой относится ссылка", + "The project of the task": "Проект задачи", + "Task key": "Ключ задачи", + "The task key the forge text named, such as VC-12": "Ключ задачи, указанный в тексте сервиса кода, например VC-12", + "What the link points at": "На что указывает ссылка", + "Link": "Ссылка", + "The address of the item in the forge": "Адрес элемента в сервисе кода", + "The commit message, branch name or merge request title": "Сообщение коммита, имя ветки или заголовок запроса на слияние", + "Repository": "Репозиторий", + "The repository, such as acme/portal": "Репозиторий, например acme/portal", + "Forge id": "Id в сервисе", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Собственный id элемента в сервисе кода, например github:acme/portal#42 или хеш коммита", + "State": "Состояние", + "The state of a merge request or issue": "Состояние запроса на слияние или задачи", + "Who made the commit or opened the merge request": "Кто сделал коммит или открыл запрос на слияние", + "When the commit was made or the merge request last changed": "Когда сделан коммит или последний раз изменился запрос на слияние", + "Added by": "Кем добавлено", + "Whether a person added the link or the integration wrote it": "Добавил ли ссылку человек или её записала интеграция", + "Nextcloud user UIDs of project members": "ID пользователей Nextcloud участников проекта", + "Add link": "Добавить ссылку", + "Added by hand": "Добавлено вручную", + "Branch": "Ветка", + "Code": "Код", + "Commit": "Коммит", + "From the integration": "Из интеграции", + "Link to a commit, branch or merge request": "Ссылка на коммит, ветку или запрос на слияние", + "Merge request": "Запрос на слияние", + "Merged": "Слит", + "No code linked yet. Name {key} in a commit message or paste a link.": "Код пока не привязан. Укажите {key} в сообщении коммита или вставьте ссылку.", + "No code linked yet. Paste a link to a commit or merge request.": "Код пока не привязан. Вставьте ссылку на коммит или запрос на слияние.", + "Paste a web address that starts with https://.": "Вставьте веб-адрес, начинающийся с https://.", + "Remove link {title}": "Удалить ссылку {title}", + "The link could not be added.": "Не удалось добавить ссылку.", + "The link could not be removed.": "Не удалось удалить ссылку.", + "This link is already on the task.": "Эта ссылка уже есть у задачи.", + "Code forges": "Сервисы кода", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Связывайте коммиты и pull request из GitHub с задачами. Integriq получает события; planninq никогда не обращается к GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Скачайте конфигурацию и импортируйте её в Integriq. Затем укажите секрет в правиле \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "В GitHub добавьте к репозиторию webhook с этим адресом и тем же секретом. Выберите тип содержимого application/json и события push и pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Укажите ключ задачи, например VC-12, в сообщении коммита, имени ветки или заголовке pull request. Ссылка тогда появится у этой задачи.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq участники проекта всё равно могут вставить ссылку на странице задачи.", + "Download the Integriq configuration": "Скачать конфигурацию Integriq", + "Calendar": "Календарь", + "Previous": "Назад", + "Calendar view": "Вид календаря", + "Starts:": "Начало:", + "No tasks with a date in this month.": "В этом месяце нет задач с датой.", + "Week of {start} to {end}": "Неделя с {start} по {end}", + "My calendar": "Мой календарь", + "Show as list": "Показать списком", + "Show as calendar": "Показать в календаре", + "Open my calendar": "Открыть мой календарь", + "Nextcloud Tasks": "Задачи Nextcloud", + "Show my tasks in Nextcloud Tasks": "Показывать мои задачи в Задачах Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Задачи, назначенные вам или открытые вам, появляются в списке \"Planninq\" в Задачах и Календаре Nextcloud. Изменения, сделанные там, заменяются при следующем изменении в Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Этот сервер не может записывать в Задачи Nextcloud, поэтому экспорт недоступен.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Управляется Planninq. Изменения, сделанные здесь, заменяются при следующем изменении в Planninq.", + "Working days and holidays": "Рабочие и праздничные дни", + "Dates set on the timeline skip the days that are not working days.": "Даты, заданные на временной шкале, пропускают нерабочие дни.", + "Working weekdays": "Рабочие дни недели", + "Non-working days": "Нерабочие дни", + "No non-working days yet.": "Нерабочих дней пока нет.", + "Add day": "Добавить день", + "Year": "Год", + "Add Dutch national holidays": "Добавить государственные праздники Нидерландов", + "Save working days": "Сохранить рабочие дни", + "Choose at least one working weekday.": "Выберите хотя бы один рабочий день.", + "Working days saved.": "Рабочие дни сохранены.", + "Could not save the working days.": "Не удалось сохранить рабочие дни.", + "New Year's Day": "Новый год", + "Easter Sunday": "Пасха", + "Easter Monday": "Пасхальный понедельник", + "King's Day": "День короля", + "Liberation Day": "День освобождения", + "Ascension Day": "Вознесение", + "Whit Sunday": "Троица", + "Whit Monday": "Духов день", + "Christmas Day": "Рождество", + "Boxing Day": "Второй день Рождества", + "Dates of {title}": "Даты задачи {title}", + "The due date cannot be before the start date.": "Срок не может быть раньше даты начала.", + "{title}, from {start} to {end}": "{title}, с {start} по {end}", + "The dates could not be saved.": "Не удалось сохранить даты.", + "{title} now runs from {start} to {end}": "{title} теперь идёт с {start} по {end}", + "Auto-scheduling": "Автоматическое планирование", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Если включено, перенос срока на временной шкале на более позднюю дату предлагает сдвинуть и блокируемые задачи.", + "Move blocked tasks along when a task slips": "Сдвигать заблокированные задачи, когда задача задерживается", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На временной шкале более поздний срок предлагает сдвинуть блокируемые задачи. Учитываются только связи \"блокирует\", и задачи сдвигаются только позже.", + "Move the tasks that wait for {title}?": "Сдвинуть задачи, которые ждут {title}?", + "These tasks wait for it and would start after its new due date:": "Эти задачи ждут её и начнутся после нового срока:", + "{count} tasks would move; the first {limit} are listed.": "Будет сдвинуто задач: {count}; показаны первые {limit}.", + "Now": "Сейчас", + "After the move": "После сдвига", + "Only this task": "Только эта задача", + "Move all": "Сдвинуть все", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Остановлено на {title}: не удалось сохранить даты. Задачи перед ней сдвинуты.", + "Cumulative flow": "Накопительный поток", + "Show as chart": "Показать как диаграмму", + "Show as table": "Показать как таблицу", + "Tasks per column per day": "Задачи по столбцам по дням", + "Tasks without recorded history in this period: {count}": "Задачи без записанной истории за этот период: {count}", + "Lead and cycle time": "Время выполнения и время цикла", + "No tasks were finished in this period.": "За этот период не завершено ни одной задачи.", + "Finished tasks": "Завершённые задачи", + "Cycle time, average": "Время цикла, среднее", + "Cycle time, 85th percentile": "Время цикла, 85-й процентиль", + "Lead time, average": "Время выполнения, среднее", + "Tasks whose finish time was estimated from their history: {count}": "Задачи, время завершения которых оценено по истории: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Время цикла каждой завершённой задачи со средним и 85-м процентилем", + "Slowest tasks": "Самые медленные задачи", + "cycle {cycle}, lead {lead}": "цикл {cycle}, выполнение {lead}", + "{days} days": "{days} дн.", + "Could not load the flow of this project.": "Не удалось загрузить поток этого проекта.", + "Last {days} days": "Последние {days} дн.", + "Portfolio flow": "Поток портфеля", + "An admin adds portfolios under Projects, Portfolios.": "Администратор добавляет портфели в разделе Проекты, Портфели.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Не показанные проекты, так как одновременно показывается не более 50: {count}", + "Could not load the flow of this portfolio.": "Не удалось загрузить поток этого портфеля.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Накопительный поток и время цикла по проектам портфеля.", + "Edit report": "Изменить отчёт", + "Only tasks where": "Только задачи, где", + "Group by": "Группировать по", + "Display": "Вид", + "Share with everyone who can read its projects": "Поделиться со всеми, кто может читать его проекты", + "The report could not be saved.": "Не удалось сохранить отчёт.", + "Number of tasks": "Количество задач", + "Bar": "Столбцы", + "Donut": "Кольцо", + "Table": "Таблица", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} из {total} проектов в этом отчёте вам не видны", + "No tasks match this report.": "Ни одна задача не подходит под этот отчёт.", + "None": "Нет", + "Could not load this report.": "Не удалось загрузить этот отчёт.", + "Report": "Отчёт", + "Your reports": "Ваши отчёты", + "My reports": "Мои отчёты", + "Shared reports": "Общие отчёты", + "You have not built a report yet.": "Вы ещё не создали ни одного отчёта.", + "Nobody has shared a report with you yet.": "С вами ещё никто не поделился отчётом.", + "Reports you built over tasks, and the ones shared with you.": "Отчёты, которые вы создали по задачам, и те, которыми поделились с вами.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Сохранённый запрос по задачам: какие проекты, какие фильтры, группировка по чему, количество или сумма, в виде таблицы или диаграммы.", + "The name the report is listed under": "Название, под которым отчёт показан в списке", + "What the report shows and who it is for": "Что показывает отчёт и для кого он", + "Nextcloud user id of the person who saved the report": "Идентификатор пользователя Nextcloud, сохранившего отчёт", + "Who can open the report": "Кто может открыть отчёт", + "Only me": "Только я", + "Everyone who can read its projects": "Все, кто может читать его проекты", + "The projects the report covers, at most fifty": "Проекты, которые охватывает отчёт, не более пятидесяти", + "Filters": "Фильтры", + "Task fields and the value each must equal": "Поля задачи и значение, которому должно быть равно каждое", + "The task field the report groups on": "Поле задачи, по которому группирует отчёт", + "Count the tasks, or add up a number on them": "Посчитать задачи или сложить число по ним", + "Sum": "Сумма", + "Sum of": "Сумма по", + "The number added up when the measure is a sum": "Число, которое складывается, если мера это сумма", + "Story points": "Очки историй", + "Estimated duration": "Оценочная длительность", + "How the report is shown": "Как показывается отчёт", + "Issue type": "Тип задачи", + "Task fields and the value each must equal; empty when the report covers every task": "Поля задачи и значение, которому должно соответствовать каждое; пусто, если отчёт охватывает все задачи", + "The status a task must have": "Статус, который должна иметь задача", + "The priority a task must have": "Приоритет, который должна иметь задача", + "The user a task must be assigned to": "Пользователь, которому должна быть назначена задача", + "A label a task must carry": "Метка, которую должна иметь задача", + "The board column a task must be in": "Колонка доски, в которой должна быть задача", + "The issue type a task must have": "Тип задачи, который она должна иметь", + "Manager groups": "Группы руководителей", + "Member groups": "Группы участников", + "Viewer groups": "Группы читателей", + "Viewers": "Читатели", + "Owning group": "Группа-владелец", + "Nextcloud groups whose members manage the project": "Группы Nextcloud, участники которых управляют проектом", + "Nextcloud groups whose members work on the project": "Группы Nextcloud, участники которых работают над проектом", + "Nextcloud groups whose members may read the project": "Группы Nextcloud, участники которых могут читать проект", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Пользователи Nextcloud, управляющие проектом: настройками, участниками и работой", + "Nextcloud user ids who may read the project and its work but not change it": "Пользователи Nextcloud, которые могут читать проект и его работу, но не менять их", + "The Nextcloud group that owns the project with its creator, at most one": "Группа Nextcloud, владеющая проектом вместе с его автором, не более одной", + "Nextcloud user ids who may read this through the project": "Пользователи Nextcloud, которые могут читать это через проект", + "Nextcloud groups whose members may change this through the project": "Группы Nextcloud, участники которых могут менять это через проект", + "Nextcloud groups whose members may read this through the project": "Группы Nextcloud, участники которых могут читать это через проект", + "Search for a person or a group…": "Найти человека или группу…", + "No one found. Your admin's sharing settings decide who you can find.": "Никого не найдено. Кого вы можете найти, определяют настройки общего доступа вашего администратора.", + "Type at least two characters": "Введите не менее двух символов", + "Everyone in this group": "Все в этой группе", + "Could not search for people. Please try again.": "Не удалось найти людей. Попробуйте ещё раз.", + "Could not remove the group": "Не удалось удалить группу", + "Only the owner and managers change who is on this project.": "Только владелец и руководители меняют состав этого проекта.", + "Role of {name}": "Роль: {name}", + "Manager": "Руководитель", + "Member": "Участник", + "Viewer": "Читатель", + "Could not change the role": "Не удалось изменить роль", + "Owned by group: {name}": "Принадлежит группе: {name}", + "No group owns this project.": "Этот проект не принадлежит ни одной группе.", + "Owned by group": "Принадлежит группе", + "Search for a group…": "Найти группу…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Группа не найдена. Настройки общего доступа вашего администратора определяют, какие группы вы можете найти.", + "No owning group": "Без группы-владельца", + "Could not search for groups. Please try again.": "Не удалось найти группы. Попробуйте ещё раз.", + "Could not change the owning group": "Не удалось изменить группу-владельца", + "You can read this project. Only its members change it.": "Вы можете читать этот проект. Изменяют его только его участники.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, который преподаётся на этом уроке, например факультатив, если школьное учебное приложение его знает.", + "Online meeting link": "Ссылка на онлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Где ученики подключаются к этому уроку онлайн. Кнопка «Присоединиться» появляется только для ссылки https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/ru.json b/l10n/ru.json index 5850e83a..e797a3c6 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Активные проекты", + "Archived projects": "Архивные проекты", + "Boards": "Доски", + "My projects": "Мои проекты", + "Portfolio": "Портфель", + "Project board": "Доска проекта", + "Projects I am in": "Проекты, в которых я участвую", + "Timeline": "Временная шкала", + "Timesheet": "Учёт времени", + "Features & roadmap": "Функции и дорожная карта", + "Flow": "Поток", + "Flows": "Потоки", + "Reports": "Отчёты", + "Pick a report to open it.": "Выберите отчёт, чтобы открыть его.", + "In progress": "В работе", + "Date": "Дата", + "Due": "Срок", + "Assignee": "Назначено", + "Who": "Кто", + "What": "Что", + "Minutes": "Минуты", + "Entries": "Записи", + "Most recent": "Самые новые", + "Per person": "На человека", + "By status": "По статусу", + "By priority": "По приоритету", + "Task status": "Статус задач", + "Time spent": "Затраченное время", + "Capacity": "Ёмкость", + "Due soonest": "Ближайший срок", + "Minutes logged": "Записанные минуты", + "Nothing is due": "Ничего не запланировано", + "Nothing logged yet": "Пока ничего не записано", + "What is open, what is blocked, and what is overdue.": "Что открыто, что заблокировано и что просрочено.", + "How allocation is spread across the people working on projects.": "Как распределена нагрузка между людьми, работающими над проектами.", + "Hours logged, and the projects they went to.": "Записанные часы и проекты, на которые они ушли.", + "Billable": "Оплачиваемое", + "Budget: {amount}": "Бюджет: {amount}", + "Loading projects": "Загрузка проектов", + "No projects for this client yet": "Для этого клиента пока нет проектов", + "Open in Planninq": "Открыть в Planninq", + "This project could not be found": "Этот проект не найден", + "Untitled project": "Проект без названия", + "and {count} more": "и ещё {count}", + "Store": "Магазин", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Установите реестры, схемы и потоки, опубликованные другими организациями.", + "Work Date": "Дата работы", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Действия со столбцом", + "Columns": "Столбцы", + "Could not remove the column. Please try again.": "Не удалось удалить столбец. Попробуйте ещё раз.", + "Could not save the column. Please try again.": "Не удалось сохранить столбец. Попробуйте ещё раз.", + "Done column": "Столбец выполненных", + "Edit column": "Изменить столбец", + "Keep the card's status": "Сохранить статус карточки", + "Move its cards to": "Переместить его карточки в", + "Move left": "Переместить влево", + "Move right": "Переместить вправо", + "Status of cards moved here": "Статус карточек, перемещённых сюда", + "The last done column cannot be removed.": "Последний столбец выполненных нельзя удалить.", + "WIP limit": "Лимит WIP", + "over limit": "выше лимита", + "The status a card gets when it is moved into this column.": "Статус, который получает карточка при перемещении в этот столбец.", + "All priorities": "Все приоритеты", + "Could not create the task. Please try again.": "Не удалось создать задачу. Попробуйте ещё раз.", + "Created": "Создано", + "Move to backlog": "В бэклог", + "Move to board": "На доску", + "New task": "Новая задача", + "Nothing in the backlog": "В бэклоге ничего нет", + "Rank": "Ранг", + "Sort by": "Сортировать по", + "Sort by rank to reorder": "Сортируйте по рангу, чтобы изменить порядок", + "Task actions": "Действия с задачей", + "All labels": "Все метки", + "Filter tasks by label": "Фильтровать задачи по метке", + "View timeline": "Показать временную шкалу", + "Board": "Доска", + "List": "Список", + "Column": "Столбец", + "Board or list": "Доска или список", + "Log": "Журнал", + "Add entry": "Добавить запись", + "Show": "Показать", + "No actions yet": "Действий пока нет", + "Closed": "Закрыто", + "Entry actions": "Действия с записью", + "Add action": "Добавить действие", + "by {author}": "автор {author}", + "saved {time}": "сохранено {time}", + "Attendees: {names}": "Присутствующие: {names}", + "Add the first entry": "Добавить первую запись", + "Issues": "Проблемы", + "Lessons learned": "Извлечённые уроки", + "Meetings": "Встречи", + "Decisions": "Решения", + "Actions": "Действия", + "Issue": "Проблема", + "Lesson learned": "Извлечённый урок", + "Meeting": "Встреча", + "Decision": "Решение", + "About this project": "Об этом проекте", + "No description yet": "Описания пока нет", + "Start date": "Дата начала", + "Not set": "Не задано", + "End date": "Дата окончания", + "Progress": "Ход работ", + "No tasks yet": "Задач пока нет", + "Open the board": "Открыть доску", + "People": "Люди", + "Owner": "Владелец", + "Latest log entries": "Последние записи", + "Open the log": "Открыть журнал", + "{done} of {total} tasks done": "Выполнено {done} из {total} задач", + "Edit entry": "Редактировать запись", + "Type": "Вид", + "Attendees": "Присутствующие", + "Issue is closed": "Проблема закрыта", + "Could not save the entry. Please try again.": "Не удалось сохранить запись. Попробуйте ещё раз.", + "From: {title}": "Из: {title}", + "What needs to happen": "Что нужно сделать", + "Could not create the action. Please try again.": "Не удалось создать действие. Попробуйте ещё раз.", + "The action was created but could not be linked to the entry.": "Действие создано, но его не удалось связать с записью.", + "Project pages": "Страницы проекта", + "Overview": "Обзор", + "Risks": "Риски", + "Log entry": "Запись журнала", + "A short name for the entry": "Краткое название записи", + "Project": "Проект", + "The project this entry belongs to": "Проект, к которому относится эта запись", + "What kind of entry this is": "Какой это вид записи", + "When it happened": "Когда это произошло", + "What happened, in Markdown": "Что произошло, в Markdown", + "Whether an issue is still open": "Открыта ли ещё проблема", + "The people at a meeting": "Люди на встрече", + "Tasks that came out of this entry": "Задачи, возникшие из этой записи", + "Add risk": "Добавить риск", + "Risk": "Риск", + "Score": "Оценка", + "Response": "Реагирование", + "Review date": "Дата пересмотра", + "no longer on the project": "больше не в проекте", + "Edit {title}": "Редактировать {title}", + "No risks recorded yet": "Рисков пока не записано", + "Add the first risk": "Добавить первый риск", + "Medium": "Средний", + "Mitigating": "Смягчается", + "Occurred": "Наступил", + "Avoid": "Избежать", + "Reduce": "Снизить", + "Transfer": "Передать", + "Accept": "Принять", + "Highest open risks": "Самые высокие открытые риски", + "No open risks": "Нет открытых рисков", + "Open the risk register": "Открыть реестр рисков", + "Edit risk": "Редактировать риск", + "What could go wrong": "Что может пойти не так", + "Likelihood": "Вероятность", + "Impact": "Влияние", + "Score {score}": "Оценка {score}", + "Countermeasures": "Контрмеры", + "Could not save the risk. Please try again.": "Не удалось сохранить риск. Попробуйте ещё раз.", + "Risks by likelihood and impact": "Риски по вероятности и влиянию", + "Risk scale": "Шкала рисков", + "The levels every project scores its risks on, and where low turns into medium and high": "Уровни, по которым каждый проект оценивает свои риски, и где низкий переходит в средний и высокий", + "Number of levels": "Число уровней", + "Likelihood labels": "Названия вероятности", + "Impact labels": "Названия влияния", + "Level {level}": "Уровень {level}", + "Medium from score": "Средний от оценки", + "High from score": "Высокий от оценки", + "Risk scale saved": "Шкала рисков сохранена", + "1 risk uses level {level}. Change it first.": "1 риск использует уровень {level}. Сначала измените его.", + "{count} risks use level {level}. Change them first.": "Рисков на уровне {level}: {count}. Сначала измените их.", + "Every level needs a label, and high must start above medium.": "Каждому уровню нужно название, а высокий должен начинаться выше среднего.", + "The project this risk belongs to": "Проект, к которому относится этот риск", + "The cause and the effect, in Markdown": "Причина и следствие, в Markdown", + "Category": "Категория", + "A free grouping, such as planning, budget or supplier": "Свободная группировка, например планирование, бюджет или поставщик", + "How likely it is, on the admin's risk scale": "Насколько это вероятно, по шкале рисков администратора", + "How hard it would hit, on the admin's risk scale": "Насколько сильно это ударит, по шкале рисков администратора", + "Likelihood times impact, calculated by the server": "Вероятность, умноженная на влияние, считает сервер", + "Where the risk stands": "На каком этапе риск", + "The person who watches this risk": "Человек, который следит за этим риском", + "How the project answers the risk": "Как проект реагирует на риск", + "What is done to prevent it or soften it, in Markdown": "Что делается, чтобы его предотвратить или смягчить, в Markdown", + "When to look at this risk again": "Когда снова пересмотреть этот риск", + "Very low": "Очень низкий", + "Very high": "Очень высокий", + "All projects": "Все проекты", + "Project status report": "Отчёт о состоянии проекта", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датированный отчёт о том, как проект обстоит с деньгами, организацией, временем, информацией, качеством и риском (аспекты GROTIK), каждый с заметкой.", + "The project this report is about": "Проект, к которому относится отчёт", + "Report date": "Дата отчёта", + "The day the report describes": "День, который описывает отчёт", + "Money": "Деньги", + "How the project stands on this aspect": "Как проект обстоит с этим аспектом", + "On track": "По плану", + "At risk": "Под угрозой", + "Off track": "Вне плана", + "Money note": "Заметка о деньгах", + "A short explanation of this status": "Краткое пояснение к этому состоянию", + "Organisation": "Организация", + "Organisation note": "Заметка об организации", + "Time": "Время", + "Time note": "Заметка о времени", + "Information": "Информация", + "Information note": "Заметка об информации", + "Quality": "Качество", + "Quality note": "Заметка о качестве", + "Risk note": "Заметка о риске", + "Overall": "Итого", + "The worst of the six statuses, calculated by the server": "Худшее из шести состояний, вычисляется сервером", + "Health: money": "Состояние: деньги", + "Copied from the newest status report": "Скопировано из последнего отчёта о состоянии", + "Health: organisation": "Состояние: организация", + "Health: time": "Состояние: время", + "Health: information": "Состояние: информация", + "Health: quality": "Состояние: качество", + "Health: risk": "Состояние: риск", + "Health: overall": "Состояние: итого", + "Health: report date": "Состояние: дата отчёта", + "The date of the newest status report": "Дата последнего отчёта о состоянии", + "New report": "Новый отчёт", + "Only the project owner writes status reports.": "Отчёты о состоянии пишет только владелец проекта.", + "Latest report, {date}": "Последний отчёт, {date}", + "Aspect": "Аспект", + "Note": "Заметка", + "Report history": "История отчётов", + "Author": "Автор", + "No status reports yet": "Отчётов о состоянии пока нет", + "Write the first report": "Написать первый отчёт", + "Choose a status for every aspect to save the report.": "Выберите состояние для каждого аспекта, чтобы сохранить отчёт.", + "Suggested: on track.": "Предложение: по плану.", + "Suggested: at risk.": "Предложение: под угрозой.", + "Suggested: off track.": "Предложение: вне плана.", + "1 task is past its due date.": "1 задача просрочена.", + "{count} tasks are past their due date.": "Просроченных задач: {count}.", + "The end date has passed with 1 open task.": "Дата окончания прошла, открыта 1 задача.", + "The end date has passed with {count} open tasks.": "Дата окончания прошла, открытых задач: {count}.", + "No open task is past its due date.": "Ни одна открытая задача не просрочена.", + "The highest open risk, \"{title}\", scores {score}.": "Наибольший открытый риск, «{title}», имеет оценку {score}.", + "There are no open risks.": "Открытых рисков нет.", + "Costs are at {percent}% of the budget.": "Затраты составляют {percent}% бюджета.", + "No suggestion: the project has no budget.": "Нет предложения: у проекта нет бюджета.", + "No suggestion: no costs are recorded for this project yet.": "Нет предложения: по этому проекту ещё не учтены затраты.", + "The report was not saved. Only the project owner can write status reports.": "Отчёт не сохранён. Отчёты о состоянии может писать только владелец проекта.", + "No report": "Нет отчёта", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Группа проектов, которыми руководят одни и те же люди, например отдел или программа. Её руководители читают каждый проект в ней.", + "The name of the portfolio": "Название портфеля", + "What the portfolio holds and who runs it": "Что входит в портфель и кто им руководит", + "A colour for the portfolio's section in project lists": "Цвет раздела портфеля в списках проектов", + "Managers": "Руководители", + "Nextcloud user UIDs of the people who run the portfolio": "Идентификаторы пользователей Nextcloud, которые руководят портфелем", + "Order": "Порядок", + "Where the portfolio comes in project lists, lowest first": "Место портфеля в списках проектов, сначала наименьший", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Собственная шкала рисков этого портфеля в формате JSON, в той же форме, что и шкала всего приложения. Пусто означает шкалу приложения.", + "Portfolio readers": "Читатели портфеля", + "Nextcloud user UIDs of the managers of the project's portfolio": "Идентификаторы пользователей Nextcloud руководителей портфеля проекта", + "The portfolio this project belongs to": "Портфель, к которому относится проект", + "No portfolio": "Без портфеля", + "All portfolios": "Все портфели", + "You read this project as a manager of its portfolio. Only its members change it.": "Вы читаете этот проект как руководитель его портфеля. Изменяют его только участники.", + "Portfolios": "Портфели", + "Portfolio status": "Состояние портфеля", + "No portfolios yet": "Портфелей пока нет", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Администратор добавляет портфели в разделе Проекты, Портфели. Проекты портфеля перечислены здесь с их состоянием.", + "Roll-up": "Сводка", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} по плану, {atRisk} под угрозой, {offTrack} вне плана, {noReport} без отчёта", + "No project in this portfolio that you can read.": "В этом портфеле нет проекта, который вы можете читать.", + "Start": "Начало", + "End": "Конец", + "Budget": "Бюджет", + "Last report": "Последний отчёт", + "Out of date": "Устарел", + "Portfolio timeline": "Временная шкала портфеля", + "Zoom": "Масштаб", + "Could not load the timeline": "Не удалось загрузить временную шкалу", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Администратор добавляет портфели в разделе Проекты, Портфели. Проекты портфеля показаны здесь на одной временной шкале.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Откройте проект, чтобы увидеть его фазы и задачи. Временная шкала только для чтения.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Пропущены, так как вы не можете их читать: {count} проектов", + "Week": "Неделя", + "Day": "День", + "Month": "Месяц", + "Please try again later.": "Повторите попытку позже.", + "Status reports": "Отчёты о состоянии", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Через сколько дней последний отчёт о состоянии проекта помечается как устаревший в обзоре портфеля", + "Reporting period (days)": "Отчётный период (дни)", + "The reporting period is a whole number of days from 1 to 365.": "Отчётный период — целое число дней от 1 до 365.", + "Reporting period saved": "Отчётный период сохранён", + "The reporting period was not saved. Please try again.": "Отчётный период не сохранён. Повторите попытку.", + "Every project of a portfolio with its status per aspect, rolled up.": "Каждый проект портфеля с состоянием по аспектам, сводно.", + "The projects of a portfolio on one timeline.": "Проекты портфеля на одной временной шкале.", + "Phases": "Фазы", + "Add phase": "Добавить фазу", + "No phases yet": "Фаз пока нет", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Разделите проект на фазы, например инициация, определение и реализация. Фаза закрывается, когда загружен её итоговый документ.", + "{hours} hours": "{hours} ч", + "Concluding document: {title}": "Итоговый документ: {title}", + "Concluding document missing": "Нет итогового документа", + "Move {title} up": "Переместить {title} вверх", + "Move {title} down": "Переместить {title} вниз", + "Close phase": "Закрыть фазу", + "Phase": "Фаза", + "Files": "Файлы", + "Notes": "Заметки", + "Audit trail": "Журнал аудита", + "Edit phase": "Изменить фазу", + "Name": "Название", + "Budget hours": "Часы по бюджету", + "Could not save the phase. Please try again.": "Не удалось сохранить фазу. Повторите попытку.", + "Close phase {title}": "Закрыть фазу {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фаза закрывается итоговым документом: загрузите его здесь или выберите один из файлов фазы.", + "Concluding document": "Итоговый документ", + "This phase has no files yet.": "У этой фазы пока нет файлов.", + "Upload a document": "Загрузить документ", + "The document was not uploaded. Please try again.": "Документ не загружен. Повторите попытку.", + "Upload the concluding document before you close this phase.": "Загрузите итоговый документ, прежде чем закрыть эту фазу.", + "This phase cannot be closed from its current status.": "Эту фазу нельзя закрыть из её текущего статуса.", + "The phase was not closed. Please try again.": "Фаза не закрыта. Повторите попытку.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID файла этой фазы, который её закрывает. Фазу можно завершить, только когда он указан и файл прикреплён.", + "Import from Microsoft Project": "Импорт из Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Выберите план, сохранённый из Microsoft Project в формате XML. Ничего не импортируется, пока вы не подтвердите.", + "Plan file": "Файл плана", + "What the import creates": "Что создаст импорт", + "Tasks": "Задачи", + "Sub-tasks": "Подзадачи", + "Milestones": "Вехи", + "Links": "Связи", + "Already imported, updated in place: {count}": "Уже импортированы, обновлены на месте: {count}", + "What does not carry over": "Что не переносится", + "Tasks with resources, which are not imported: {count}": "Задачи с ресурсами, которые не импортируются: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Задачи глубже уровня 3, помещённые под свою задачу уровня 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Связи, отличные от окончание-начало, импортированы как связанные: {count}", + "Link lags, which are dropped: {count}": "Задержки связей, которые отбрасываются: {count}", + "Links to a summary task, which are not imported: {count}": "Связи с суммарной задачей, которые не импортируются: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Связи с задачами вне этого плана, которые не импортируются: {count}", + "No longer in the plan": "Больше нет в плане", + "These stay in the project; remove them yourself if they are no longer needed.": "Они остаются в проекте; удалите их сами, если они больше не нужны.", + "Import": "Импортировать", + "Close": "Закрыть", + "The plan is imported: {created} created, {updated} updated.": "План импортирован: создано {created}, обновлено {updated}.", + "Links that would close a loop were left out: {count}": "Связи, которые замкнули бы цикл, пропущены: {count}", + "The import stopped part-way. Run it again to finish it.": "Импорт остановился на полпути. Запустите его снова, чтобы завершить.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Сохраните план в Microsoft Project через Файл, Сохранить как, формат XML, и импортируйте этот файл.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Этот файл объявляет DOCTYPE или сущности, которые не принимаются.", + "The file is larger than 10 MB.": "Файл больше 10 МБ.", + "The plan has more than 2,000 tasks, more than one import takes.": "В плане больше 2000 задач, больше, чем принимает один импорт.", + "This file is not a Microsoft Project plan in XML format.": "Этот файл не является планом Microsoft Project в формате XML.", + "Choose a file to import.": "Выберите файл для импорта.", + "Only the project owner can import a plan.": "Только владелец проекта может импортировать план.", + "The plan could not be read. Please try again.": "Не удалось прочитать план. Попробуйте ещё раз.", + "Linked case: {title}": "Связанное дело: {title}", + "Linked to a case": "Связано с делом", + "Hand over to case": "Передать в дело", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Копирует без изменений каждый файл проекта и его задач, а также файл с описанием проекта, в связанное дело.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Скопировано файлов: {count}", + "Files that failed: {names}": "Файлы с ошибкой: {names}", + "The handover failed. Please try again.": "Передача не удалась. Попробуйте ещё раз.", + "The linked case could not be found, or you cannot open it.": "Связанное дело не найдено, или у вас нет доступа к нему.", + "Case handovers": "Передачи в дело", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Каждая передача файлов и метаданных проекта в его дело: когда, кем, в какое дело, каждый скопированный файл с его SHA-256 и файлы с ошибкой.", + "Finance": "Финансы", + "Add cost line": "Добавить строку затрат", + "Delivery terms": "Условия поставки", + "Billing model": "Модель оплаты", + "Budget in euro": "Бюджет в евро", + "Budget in hours": "Бюджет в часах", + "Hourly rate in euro": "Почасовая ставка в евро", + "Planned start": "Плановое начало", + "Planned end": "Плановое окончание", + "Planned dates": "Плановые даты", + "Budget {amount}": "Бюджет {amount}", + "No budget agreed": "Бюджет не согласован", + "Hours": "Часы", + "Only the project owner and the portfolio managers see the amounts.": "Суммы видят только владелец проекта и менеджеры портфеля.", + "Budget against cost per category": "Бюджет и затраты по категориям", + "Labour (booked time)": "Труд (учтённое время)", + "No category": "Без категории", + "Hours are not available": "Часы недоступны", + "Not yet assigned to a category": "Ещё не отнесено к категории", + "Total": "Итого", + "{spent} spent, {remaining} remaining": "{spent} потрачено, {remaining} осталось", + "Budget against cost per phase": "Бюджет и затраты по фазам", + "No phase": "Без фазы", + "Cost lines": "Строки затрат", + "From the finance system": "Из финансовой системы", + "Edit cost line {amount}": "Изменить строку затрат {amount}", + "No cost lines yet": "Строк затрат пока нет", + "Commitments": "Обязательства", + "Actual cost": "Фактические затраты", + "Forecast": "Прогноз", + "Remaining": "Осталось", + "Not planned yet": "Ещё не запланировано", + "{start} to {end}": "с {start} по {end}", + "The terms were not saved. Please try again.": "Условия не сохранены. Попробуйте ещё раз.", + "Terms saved": "Условия сохранены", + "Fixed price": "Фиксированная цена", + "Hourly": "Почасово", + "Not billed": "Без выставления счёта", + "Commitment": "Обязательство", + "Edit cost line": "Изменить строку затрат", + "Kind": "Вид", + "Amount in euro": "Сумма в евро", + "Remove": "Удалить", + "Could not save the cost line. Only the project owner changes the money of a project.": "Не удалось сохранить строку затрат. Деньги проекта меняет только владелец проекта.", + "Could not remove the cost line. Please try again.": "Не удалось удалить строку затрат. Попробуйте ещё раз.", + "{amount} over budget": "{amount} сверх бюджета", + "Cost categories": "Категории затрат", + "The categories every project splits its budget and costs into, one per line": "Категории, на которые каждый проект делит свой бюджет и затраты, по одной в строке", + "Categories": "Категории", + "Give at least one category, each name once.": "Укажите хотя бы одну категорию, каждое название один раз.", + "Cost categories saved": "Категории затрат сохранены", + "The cost categories were not saved. Please try again.": "Категории затрат не сохранены. Попробуйте ещё раз.", + "Finance line": "Финансовая строка", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Одна денежная сумма проекта: бюджет, обязательство, фактические затраты или прогноз, в категории затрат и при необходимости в фазе. Вводится владельцем проекта или передаётся финансовой системой через приложение интеграции.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Проект, к которому относится сумма. Пусто для строки из финансовой системы, номер проекта которой не совпадает ни с одним проектом.", + "The phase this amount belongs to, if any": "Фаза, к которой относится сумма, если есть", + "The cost category, one of the categories the admin set up": "Категория затрат, одна из категорий, заданных администратором", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Является ли сумма бюджетом, обязательством, фактическими затратами или прогнозом", + "Amount": "Сумма", + "The amount in the reporting currency (euro)": "Сумма в валюте отчётности (евро)", + "The date the amount was booked or is expected": "Дата, когда сумма проведена или ожидается", + "What the amount is for": "На что эта сумма", + "Whether a person entered the line or the finance system sent it": "Ввёл ли строку человек или её прислала финансовая система", + "Entered by hand": "Введено вручную", + "Finance line id": "Идентификатор финансовой строки", + "The finance system's own id of this line. One imported line per id.": "Собственный идентификатор строки в финансовой системе. Одна импортированная строка на идентификатор.", + "Project number": "Номер проекта", + "The project number the finance system sent, matched against the project key": "Номер проекта из финансовой системы, сверяемый с ключом проекта", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Портфель проекта строки, скопированный из проекта, чтобы итогам портфеля хватало одного фильтра", + "Finance readers": "Читатели финансов", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID пользователей Nextcloud, которым разрешено видеть сумму: владелец проекта и менеджеры его портфеля", + "Project owner": "Владелец проекта", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID пользователя Nextcloud, владельца проекта, который может изменять и удалять ручные строки", + "How the client pays: not billed, a fixed price, or by the hour.": "Как платит клиент: без выставления счёта, фиксированная цена или почасово.", + "Portfolio finance": "Финансы портфеля", + "You cannot see the money of any project in this portfolio": "Вы не видите денег ни одного проекта в этом портфеле", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Сервер вернул строки затрат проектов вне этого портфеля, поэтому итоги могут быть неверны.", + "Projects left out because you cannot see their money: {count}": "Пропущено проектов, чьи деньги вам не видны: {count}", + "Unmatched finance lines": "Несопоставленные финансовые строки", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Бюджет, обязательства, фактические затраты и прогноз в сумме по портфелю.", + "Subprojects": "Подпроекты", + "{done} of {total}": "{done} из {total}", + "{done} of {total} tasks done, including subprojects": "Выполнено {done} из {total} задач, включая подпроекты", + "Show the subprojects of {title}": "Показать подпроекты {title}", + "Hide the subprojects of {title}": "Скрыть подпроекты {title}", + "Part of": "Входит в", + "No parent project": "Без родительского проекта", + "A project cannot sit under one of its own subprojects.": "Проект не может находиться под одним из своих подпроектов.", + "Projects nest three levels deep at most: programme, project and subproject.": "Проекты вкладываются не глубже трёх уровней: программа, проект и подпроект.", + "Parent project": "Родительский проект", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Проект, под которым находится этот проект, например программа. Проекты вкладываются не глубже трёх уровней.", + "Yes": "Да", + "No": "Нет", + "{label} (required)": "{label} (обязательно)", + "{label} is required": "Поле «{label}» обязательно", + "Project field": "Поле проекта", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поле, которое администратор добавляет в каждый проект, например сфера политики или стоимость договора.", + "Key": "Ключ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Постоянное имя, под которым хранится значение, в lower camel case. Не меняйте его, когда проекты его используют.", + "Label": "Подпись", + "The name people see next to the field": "Название рядом с полем", + "What the field holds": "Что содержит поле", + "Text": "Текст", + "Number": "Число", + "Choice": "Выбор", + "Person": "Человек", + "Yes or no": "Да или нет", + "Options": "Варианты", + "The choices of a choice field": "Варианты поля выбора", + "Required": "Обязательное", + "Whether a project must fill in the field": "Должен ли проект заполнить поле", + "Where the field appears, lowest first": "Где появляется поле, меньшее первым", + "Applies to": "Относится к", + "What the field is added to": "К чему добавляется поле", + "Custom fields": "Свои поля", + "The values of the project fields an admin defined, keyed by the field's key.": "Значения полей проекта, заданных администратором, по ключу поля.", + "Project fields": "Поля проекта", + "Related": "Связанные", + "Remove link": "Удалить связь", + "Link type": "Тип связи", + "Relates to": "Связана с", + "Duplicates": "Дублирует", + "Project key": "Ключ проекта", + "Every task number starts with it, such as VERG-42.": "С него начинается каждый номер задачи, например VERG-42.", + "This key is already used by another project.": "Этот ключ уже используется другим проектом.", + "Use 2 to 10 letters and digits, starting with a letter.": "Используйте от 2 до 10 букв и цифр, начиная с буквы.", + "The key cannot change once tasks carry it.": "Ключ нельзя изменить, когда задачи его уже носят.", + "Project saved. The existing tasks get their numbers in the background.": "Проект сохранён. Существующие задачи получают номера в фоновом режиме.", + "Next task number": "Номер следующей задачи", + "The number the next task of this project gets in its key. Only the system writes it.": "Номер, который следующая задача этого проекта получает в своём ключе. Его записывает только система.", + "Restore {title}": "Восстановить {title}", + "Restore": "Восстановить", + "Project restored": "Проект восстановлен", + "Could not restore the project": "Не удалось восстановить проект", + "Bring this project back to the active list.": "Вернуть этот проект в список активных проектов.", + "Restore project": "Восстановить проект", + "Request reason": "Причина запроса", + "Why the requester needs this project. Filled in when the project is requested.": "Зачем заявителю нужен этот проект. Заполняется при запросе.", + "Reviewed by": "Рассмотрено", + "The user who approved or rejected the request.": "Пользователь, который одобрил или отклонил запрос.", + "Reviewed at": "Дата рассмотрения", + "When the request was approved or rejected.": "Когда запрос был одобрен или отклонён.", + "Review note": "Комментарий рецензента", + "The reviewer's reason, shown to the requester when a request is not approved.": "Причина рецензента, которую видит заявитель, если запрос не одобрен.", + "Members of these groups": "Участники этих групп", + "Groups that may create projects": "Группы, которым можно создавать проекты", + "The group {group} no longer exists. Save to remove it.": "Группа {group} больше не существует. Сохраните, чтобы убрать её.", + "Review project request": "Рассмотреть запрос проекта", + "Requested by": "Запросил", + "Why it is needed": "Зачем он нужен", + "Desired start date": "Желаемая дата начала", + "Why is it not approved?": "Почему не одобрено?", + "Give a reason. The requester sees it.": "Укажите причину. Заявитель её увидит.", + "Approve": "Одобрить", + "Reject": "Отклонить", + "Reject request": "Отклонить запрос", + "The review was not saved. Try again.": "Решение не сохранено. Попробуйте снова.", + "This project is waiting for review": "Этот проект ожидает рассмотрения", + "This request was not approved": "Этот запрос не одобрен", + "Reason: {note}": "Причина: {note}", + "Review request": "Рассмотреть запрос", + "Request a project": "Запросить проект", + "Step {step} of 2": "Шаг {step} из 2", + "Why is this project needed?": "Зачем нужен этот проект?", + "Give a reason. The reviewer reads it.": "Укажите причину. Рецензент её прочитает.", + "Back": "Назад", + "Next": "Далее", + "Send request": "Отправить запрос", + "The request was not sent. Try again.": "Запрос не отправлен. Попробуйте снова.", + "Requested": "Запрошен", + "Not approved": "Не одобрен", + "Your request was sent": "Ваш запрос отправлен", + "Let everyone else request a project": "Разрешить всем остальным запрашивать проект", + "Add a task": "Добавить задачу", + "Delete task": "Удалить задачу", + "Edit task": "Изменить задачу", + "Write": "Написать", + "Preview": "Предпросмотр", + "Markdown works here: headings, lists and links.": "Здесь работает Markdown: заголовки, списки и ссылки.", + "Could not save the task. Please try again.": "Не удалось сохранить задачу. Попробуйте ещё раз.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "По задаче \"{title}\" учтено время, поэтому её нельзя удалить. Вместо этого её можно отменить: записи времени сохранятся.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Удалить \"{title}\"? Её связи с другими задачами тоже будут удалены. Это действие нельзя отменить.", + "Keep task": "Оставить задачу", + "Cancel task": "Отменить задачу", + "Only the reporter, the project owner or an admin can delete this task.": "Удалить эту задачу может только автор, владелец проекта или администратор.", + "Could not delete the task. Please try again.": "Не удалось удалить задачу. Попробуйте ещё раз.", + "Could not cancel the task. Please try again.": "Не удалось отменить задачу. Попробуйте ещё раз.", + "Responsible": "Ответственный", + "Also working on this": "Также работают над этим", + "Labels": "Метки", + "Could not change the priority. Please try again.": "Не удалось изменить приоритет. Попробуйте ещё раз.", + "Other project members who work on this task alongside the person responsible.": "Другие участники проекта, которые работают над задачей вместе с ответственным.", + "Duplicate": "Дублировать", + "Could not copy the task. Please try again.": "Не удалось скопировать задачу. Попробуйте ещё раз.", + "Subtasks": "Подзадачи", + "{done} of {total} done": "Выполнено {done} из {total}", + "Add a subtask": "Добавить подзадачу", + "Checklist": "Чек-лист", + "Checklist item actions": "Действия с пунктом чек-листа", + "Add a checklist item": "Добавить пункт чек-листа", + "Subtasks: {estimate} estimated, {logged} logged": "Подзадачи: оценка {estimate}, учтено {logged}", + "Total estimate: {total}": "Общая оценка: {total}", + "Part of {title}": "Часть задачи {title}", + "Checklist: {count} done": "Чек-лист: выполнено {count}", + "This task has subtasks: {count}.": "У этой задачи есть подзадачи: {count}.", + "Keep subtasks as separate tasks": "Оставить подзадачи отдельными задачами", + "Delete subtasks too": "Удалить и подзадачи", + "Copy of {title}": "Копия: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Задача скопирована, но не все её подзадачи. Проверьте копию.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Небольшие шаги внутри задачи. У каждого пункта есть id, текст и отметка о выполнении.", + "Open work per person and per project.": "Открытая работа по людям и по проектам.", + "View": "Вид", + "By person": "По людям", + "By project": "По проектам", + "Hours left": "Осталось часов", + "Tasks without an estimate": "Задачи без оценки", + "Due in 14 days": "Срок в течение 14 дней", + "Shared": "Общие", + "Unassigned": "Не назначены", + "{hours} h": "{hours} ч", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Показана работа в проектах, которые вы можете видеть. Часы учитываются для ответственного; общие задачи учитываются без часов.", + "No open work in these projects.": "В этих проектах нет открытой работы.", + "Open work": "Открытая работа", + "{count} open tasks": "Открытых задач: {count}", + "Create a project to see capacity here.": "Создайте проект, чтобы увидеть здесь загрузку.", + "My tasks": "Мои задачи", + "Show all my tasks": "Показать все мои задачи", + "No tasks assigned to you": "Вам не назначено ни одной задачи", + "Browse projects": "Просмотреть проекты", + "Later": "Позже", + "Due {date}": "Срок {date}", + "Could not change the status. Please try again.": "Не удалось изменить статус. Попробуйте ещё раз.", + "Completed today": "Завершено сегодня", + "My open tasks": "Мои открытые задачи", + "My overdue tasks": "Мои просроченные задачи", + "My tasks in progress": "Мои задачи в работе", + "Pin to the top": "Закрепить наверху", + "Unpin": "Открепить", + "Pinned": "Закреплено", + "Actions for {title}": "Действия для {title}", + "Could not save your project order. Please try again.": "Не удалось сохранить порядок ваших проектов. Попробуйте ещё раз.", + "No boards yet": "Досок пока нет", + "Create a project to get a board.": "Создайте проект, чтобы получить доску.", + "Use the Projects page to create and manage your projects and tasks.": "Создавайте проекты и задачи и управляйте ими на странице «Проекты».", + "Go to projects": "К проектам", + "You are not a member of any projects yet.": "Вы пока не участник ни одного проекта.", + "Could not search for users. Please try again.": "Не удалось найти пользователей. Попробуйте ещё раз.", + "Project creation is restricted to administrators.": "Создавать проекты могут только администраторы.", + "Only the project owner or an administrator can delete this project.": "Удалить этот проект может только владелец проекта или администратор.", + "No projects are available to you yet. Ask an administrator to create one.": "Вам пока не доступен ни один проект. Попросите администратора создать проект.", + "Due: {date}": "Срок: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Задачи с датой начала или сроком отображаются на временной шкале. Добавьте даты, чтобы увидеть их здесь.", + "You do not have access to this project.": "У вас нет доступа к этому проекту.", + "Zoom level": "Масштаб", + "Unscheduled": "Не запланированы", + "Start: {date}": "Начало: {date}", + "Today": "Сегодня", + "No scheduled tasks": "Нет запланированных задач", + "An unexpected error occurred.": "Произошла непредвиденная ошибка.", + "Column {number} name": "Название столбца {number}", + "Failed to save creation policy": "Не удалось сохранить правило создания", + "All authenticated users": "Все вошедшие пользователи", + "Control who may create new projects": "Определите, кто может создавать новые проекты", + "Administrators only": "Только администраторы", + "Project creation": "Создание проектов", + "Allow project creation": "Разрешить создание проектов", + "Creation policy saved successfully": "Правило создания сохранено", + "Initializing…": "Запуск…", + "e.g. 2h 30m, 90m, 1.5h": "напр. 2h 30m, 90m, 1.5h", + "Log time": "Учесть время", + "Save estimate": "Сохранить оценку", + "Logged: {logged}": "Учтено: {logged}", + "over by {amount}": "превышено на {amount}", + "Time tracking": "Учёт времени", + "Estimate": "Оценка", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Введите корректную оценку (напр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Введите корректную длительность (напр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Не удалось сохранить запись времени. Попробуйте ещё раз.", + "Edit time entry": "Изменить запись времени", + "Duration": "Длительность", + "Date range": "Период", + "Last week": "Прошлая неделя", + "No time logged": "Время не учтено", + "Log time on a task to see it here.": "Учтите время по задаче, чтобы увидеть его здесь.", + "To date": "По дату", + "This week": "Эта неделя", + "Total: {total}": "Итого: {total}", + "From date": "С даты", + "Custom range": "Свой период", + "All time": "За всё время", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Не удалось удалить задачу, поэтому данные могли остаться. Удалите проект ещё раз.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Не удалось удалить запись времени, поэтому данные могли остаться. Удалите проект ещё раз.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Не удалось удалить столбец, поэтому данные могли остаться. Удалите проект ещё раз.", + "Could not delete the project. Please try again.": "Не удалось удалить проект. Попробуйте ещё раз.", + "Notification settings": "Настройки уведомлений", + "Configure when due-date reminders are sent": "Укажите, когда отправляются напоминания о сроках", + "Due-date reminder lead time (hours)": "Заблаговременность напоминания (часы)", + "Lead time must be between 1 and 336 hours": "Заблаговременность должна быть от 1 до 336 часов", + "Reminder lead time saved successfully": "Заблаговременность напоминания сохранена", + "Failed to save reminder lead time": "Не удалось сохранить заблаговременность напоминания", + "Notifications": "Уведомления", + "Notify me 1 day before a task's due date": "Уведомлять меня за 1 день до срока задачи", + "Draft": "Черновик", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Является ли урок черновиком, который видит только его учитель, состоится ли он или отменён.", + "New release": "Новый выпуск", + "Roadmap chart. The same releases and epics are listed below.": "Диаграмма дорожной карты. Те же выпуски и эпики перечислены ниже.", + "Nothing on the roadmap yet": "На дорожной карте пока ничего нет", + "Releases with a target date and epics with dated tasks appear here.": "Здесь появляются выпуски с целевой датой и эпики с задачами, у которых есть дата.", + "Releases": "Выпуски", + "No releases yet": "Пока нет выпусков", + "Target date: {date}": "Целевая дата: {date}", + "No target date": "Без целевой даты", + "Edit {name}": "Изменить {name}", + "Mark {name} as released": "Отметить {name} как выпущенный", + "Mark as released": "Отметить как выпущенный", + "Epics": "Эпики", + "No epics yet. Open a task to make it an epic.": "Пока нет эпиков. Откройте задачу, чтобы сделать её эпиком.", + "Not scheduled yet": "Пока не запланировано", + "Planned": "Запланирован", + "Released": "Выпущен", + "Edit release": "Изменить выпуск", + "Target date": "Целевая дата", + "Could not save the release. Please try again.": "Не удалось сохранить выпуск. Попробуйте ещё раз.", + "Every task of this release is done or cancelled.": "Каждая задача этого выпуска выполнена или отменена.", + "Not finished yet: {count}": "Ещё не завершено: {count}", + "What happens to these tasks?": "Что будет с этими задачами?", + "Move to {name}": "Переместить в {name}", + "Remove the release": "Убрать выпуск", + "Keep it on {name}": "Оставить их в {name}", + "Could not mark the release as released. Please try again.": "Не удалось отметить выпуск как выпущенный. Попробуйте ещё раз.", + "Roadmap": "Дорожная карта", + "Tasks or roadmap": "Задачи или дорожная карта", + "Release": "Выпуск", + "Epic": "Эпик", + "This task is an epic": "Эта задача является эпиком", + "A named, dated delivery of a project that its tasks are planned against.": "Именованная поставка проекта с датой, под которую планируются его задачи.", + "Name of the release": "Название выпуска", + "The project this release belongs to": "Проект, к которому относится этот выпуск", + "What this release delivers": "Что поставляет этот выпуск", + "When work on the release starts": "Когда начинается работа над выпуском", + "The date the release is due": "Дата, к которой выпуск должен быть готов", + "Whether the release is planned, released or archived": "Запланирован ли выпуск, выпущен или заархивирован", + "Released on": "Выпущен", + "When the release was marked as released": "Когда выпуск отметили как выпущенный", + "The release this task is planned for": "Выпуск, на который запланирована эта задача", + "Board view options": "Параметры вида доски", + "Colour cards": "Раскрасить карточки", + "No colour": "Без цвета", + "By label": "По метке", + "Swimlanes": "Дорожки", + "No swimlanes": "Без дорожек", + "By assignee": "По исполнителю", + "By epic": "По эпику", + "No assignee": "Не назначено", + "No epic": "Без эпика", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Карточки остаются в строке своего эпика. Измените эпик на странице задачи.", + "Hand over to": "Передать", + "Could not save your board view. It applies until you reload.": "Вид доски не сохранён. Он действует до перезагрузки.", + "Timetable wish": "Пожелание к расписанию", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Пожелание, которое учитывает генератор. Жёсткое пожелание он соблюдает всегда, мягкое, где может.", + "Whether the wish is about a teacher, a group, a room or one activity": "Касается ли пожелание учителя, группы, помещения или одного занятия", + "Teacher": "Учитель", + "Group": "Группа", + "Reference": "Ссылка", + "The user, group, room or activity the wish is about": "Пользователь, группа, помещение или занятие, к которым относится пожелание", + "What the wish asks for": "Чего просит пожелание", + "Not on these periods": "Не в эти уроки", + "Preferably not on these periods": "Лучше не в эти уроки", + "At most a number of lessons a day": "Не больше определённого числа уроков в день", + "No free periods between lessons": "Без окон между уроками", + "Always the same room": "Всегда одно и то же помещение", + "Periods": "Уроки", + "The periods of the week the wish is about, such as wed-5": "Уроки недели, к которым относится пожелание, например wed-5", + "Limit": "Предел", + "The most lessons a day, for a wish of that kind": "Наибольшее число уроков в день для пожелания такого вида", + "Strength": "Сила", + "Whether the generator must keep the wish or should keep it": "Должен ли генератор соблюсти пожелание или желательно", + "Hard": "Жёсткое", + "Soft": "Мягкое", + "Weight": "Вес", + "How much a soft wish counts, from 1 to 3": "Сколько весит мягкое пожелание, от 1 до 3", + "Why the wish exists": "Зачем нужно пожелание", + "Timetable scenario": "Сценарий расписания", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Один недельный шаблон, созданный генератором или взятый из текущего расписания. Он хранит свои входные данные и то, как хорошо соблюдает пожелания.", + "The name timetablers know the scenario by": "Название, под которым составители знают сценарий", + "Whether the generator made it or it came from the current timetable": "Создал ли его генератор или он взят из текущего расписания", + "Generated": "Сгенерирован", + "From the current timetable": "Из текущего расписания", + "Week of": "Неделя с", + "The Monday of the first week of the window": "Понедельник первой недели периода", + "Window start": "Начало периода", + "The first day the week pattern applies to": "Первый день, к которому применяется недельный шаблон", + "Window end": "Конец периода", + "The last day the week pattern applies to": "Последний день, к которому применяется недельный шаблон", + "Waiting, generating, done, failed, or published as draft lessons": "Ожидает, создаётся, готов, не удался или опубликован как черновые уроки", + "Waiting": "Ожидает", + "Generating": "Создаётся", + "Failed": "Не удался", + "Published": "Опубликован", + "Seed": "Начальное число", + "The number the generator starts from, so a run can be repeated": "Число, с которого начинает генератор, чтобы запуск можно было повторить", + "Input": "Входные данные", + "The periods, rooms, lessons and wishes the scenario was made from": "Уроки, помещения, занятия и пожелания, из которых сделан сценарий", + "Placements": "Размещения", + "Each lesson with the period and room it was given": "Каждое занятие с полученными уроком и помещением", + "Unplaced lessons": "Неразмещённые занятия", + "Lessons without a place, each with the hard wish that blocked it": "Занятия без места, каждое с жёстким пожеланием, которое его остановило", + "Broken wishes": "Нарушенные пожелания", + "The wishes this scenario breaks, with the lessons that break them": "Пожелания, которые нарушает этот сценарий, с нарушающими их занятиями", + "Measures": "Показатели", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Размещённые занятия, нарушенные пожелания, окна учителей, уроки в день и использование помещений", + "Reason": "Причина", + "Why the run failed": "Почему запуск не удался", + "Published at": "Опубликован", + "When the scenario was written out as draft lessons": "Когда сценарий записан как черновые уроки", + "Edit wish": "Изменить пожелание", + "New wish": "Новое пожелание", + "Hard: the generator always keeps it": "Обязательное: генератор всегда его соблюдает", + "Soft: the generator keeps it where it can": "Гибкое: генератор соблюдает его, где может", + "Weight (1 to 3)": "Вес (от 1 до 3)", + "Most lessons a day": "Не больше уроков в день", + "Period": "Урок", + "{day} period {number}": "{day} урок {number}", + "Teacher (user name)": "Учитель (имя пользователя)", + "Activity (group:subject)": "Занятие (группа:предмет)", + "Say who or what the wish is about.": "Укажите, кого или что касается пожелание.", + "Choose at least one period.": "Выберите хотя бы один урок.", + "The limit is a whole number of 1 or more.": "Лимит: целое число от 1.", + "Timetable": "Расписание", + "Wishes": "Пожелания", + "Timetable wishes": "Пожелания к расписанию", + "Generator run": "Запуск генератора", + "Generator progress": "Ход генератора", + "The run failed: {reason}": "Запуск не удался: {reason}", + "{placed} of {lessons} lessons placed": "Размещено {placed} из {lessons} уроков", + "Generate again": "Сгенерировать снова", + "Generate": "Сгенерировать", + "Every lesson has a place.": "У каждого урока есть место.", + "Lesson": "Урок", + "No free period and room": "Нет свободного урока и кабинета", + "Broken soft wishes": "Нарушенные гибкие пожелания", + "Every soft wish is kept.": "Каждое гибкое пожелание соблюдено.", + "Wish": "Пожелание", + "Lessons": "Уроки", + "Generating: {percent}% of the time budget used": "Генерация: использовано {percent}% времени", + "Waiting to start": "Ожидает запуска", + "Published as draft lessons": "Опубликовано как черновики уроков", + "Could not read the scenario.": "Не удалось прочитать сценарий.", + "Could not start the run.": "Не удалось начать запуск.", + "Scenarios": "Сценарии", + "Timetable scenarios": "Сценарии расписания", + "Scenario": "Сценарий", + "Take the current timetable": "Взять текущее расписание", + "Could not take the current timetable.": "Не удалось взять текущее расписание.", + "Broken hard wishes": "Нарушенные обязательные пожелания", + "Not on a period of the week grid": "Не на уроке недельной сетки", + "Compare scenarios": "Сравнить сценарии", + "Scenarios to compare": "Сценарии для сравнения", + "Choose two or three scenarios to compare them.": "Выберите два или три сценария, чтобы сравнить их.", + "Measure": "Показатель", + "Best": "Лучший", + "Lessons that differ": "Уроки, которые отличаются", + "No lesson differs.": "Ни один урок не отличается.", + "Not placed": "Не размещён", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Размещённые уроки", + "Lessons without a place": "Уроки без места", + "Clashes": "Конфликты", + "Hard wishes broken": "Нарушенные обязательные пожелания", + "Soft wishes broken": "Нарушенные гибкие пожелания", + "Soft wishes broken, weighted": "Нарушенные гибкие пожелания, взвешенные", + "Free periods between lessons, all teachers": "Окна, все учителя", + "Most free periods of one teacher": "Больше всего окон у одного учителя", + "Most lessons of one group on a day": "Больше всего уроков одной группы за день", + "Room use": "Использование кабинетов", + "Publish as draft lessons": "Опубликовать как черновики уроков", + "Draft lessons written: {count}": "Записано черновиков уроков: {count}", + "Could not publish the scenario.": "Не удалось опубликовать сценарий.", + "Rules": "Правила", + "Rules for {column}": "Правила для {column}", + "When a card enters this column": "Когда карточка попадает в эту колонку", + "Action": "Действие", + "Set the priority": "Задать приоритет", + "Assign to": "Назначить", + "Assign the person who moved the card": "Назначить того, кто переместил карточку", + "Remove the assignee": "Снять исполнителя", + "Add a label": "Добавить метку", + "No longer a project member": "Больше не участник проекта", + "This label no longer exists": "Этой метки больше нет", + "Add rule": "Добавить правило", + "Remove rule": "Удалить правило", + "No rules yet. Add one to change a card when it enters this column.": "Правил пока нет. Добавьте правило, чтобы менять карточку, когда она попадает в эту колонку.", + "Could not save the rules. Please try again.": "Не удалось сохранить правила. Попробуйте ещё раз.", + "1 rule runs when a card enters this column": "1 правило срабатывает, когда карточка попадает в эту колонку", + "{count} rules run when a card enters this column": "Число правил, срабатывающих, когда карточка попадает в эту колонку: {count}", + "Rules applied: {changes}": "Применённые правила: {changes}", + "assigned to {name}": "назначено: {name}", + "assignee removed": "исполнитель снят", + "priority {priority}": "приоритет {priority}", + "label {label}": "метка {label}", + "What happens to a card when it enters this column, applied in list order.": "Что происходит с карточкой, когда она попадает в эту колонку, в порядке списка.", + "Value": "Значение", + "What the rule does to the card.": "Что правило делает с карточкой.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Приоритет, id пользователя или id метки, которые использует действие; пусто для действий без значения.", + "is not": "не", + "{dimension} is not": "{dimension} не", + "Saved filters": "Сохранённые фильтры", + "No saved filters yet": "Сохранённых фильтров пока нет", + "Save filter": "Сохранить фильтр", + "Rename \"{name}\"": "Переименовать «{name}»", + "Delete \"{name}\"": "Удалить «{name}»", + "Clear filters": "Сбросить фильтры", + "Showing {shown} of {total} tasks": "Показано {shown} из {total} задач", + "Me": "Я", + "No date": "Без даты", + "Rename saved filter": "Переименовать сохранённый фильтр", + "Share with the project": "Поделиться с проектом", + "Give the filter a name": "Дайте фильтру название", + "Could not save the filter. Please try again.": "Не удалось сохранить фильтр. Попробуйте ещё раз.", + "Some labels in \"{name}\" no longer exist and were left out.": "Некоторых меток из «{name}» больше нет, они пропущены.", + "Could not delete the filter. Please try again.": "Не удалось удалить фильтр. Попробуйте ещё раз.", + "Saved filter": "Сохранённый фильтр", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Именованный фильтр доски одного проекта, личный для того, кто его сохранил, если он не открыт проекту.", + "The project whose board the filter applies to": "Проект, к доске которого относится фильтр", + "The name the filter is listed under": "Название, под которым фильтр показан в списке", + "Saved by": "Сохранил(а)", + "Nextcloud user id of the person who saved the filter": "Id пользователя Nextcloud того, кто сохранил фильтр", + "Shared with the project": "Открыт проекту", + "Whether every project member sees and applies the filter": "Видит ли каждый участник проекта фильтр и может ли его применить", + "Criteria": "Критерии", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Фильтр: исполнитель, метка, приоритет и срок, каждый с есть или не и значениями", + "Cross-project view": "Межпроектное представление", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Сохранённый набор проектов, задачи которых показываются вместе в колонках по статусу, с доступом для указанных людей.", + "Shared with": "Доступно для", + "The name the view is listed under": "Название, под которым представление указано в списке", + "Nextcloud user id of the person who saved the view": "Идентификатор пользователя Nextcloud того, кто сохранил представление", + "Nextcloud user ids of the people the view is shared with": "Идентификаторы пользователей Nextcloud тех, кому открыто представление", + "The projects whose tasks the view shows, at most twenty": "Проекты, задачи которых показывает представление, не более двадцати", + "1 project in this view is hidden from you.": "1 проект в этом представлении скрыт от вас.", + "{count} projects in this view are hidden from you.": "Проекты в этом представлении, скрытые от вас: {count}.", + "{project} has no column for {status}.": "У проекта {project} нет колонки для статуса {status}.", + "This view does not exist or is not shared with you.": "Это представление не существует или недоступно вам.", + "\"{task}\" moved to {status}.": "\"{task}\" перемещена в {status}.", + "Project: {title}": "Проект: {title}", + "Cross-project views": "Межпроектные представления", + "New view": "Новое представление", + "Edit view": "Изменить представление", + "Delete view": "Удалить представление", + "Give the view a name": "Дайте представлению название", + "Pick at least one project": "Выберите хотя бы один проект", + "A view shows at most {max} projects": "Представление показывает не более {max} проектов", + "Could not save the view. Please try again.": "Не удалось сохранить представление. Попробуйте ещё раз.", + "Could not delete the view. Please try again.": "Не удалось удалить представление. Попробуйте ещё раз.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Удалить «{title}»? Проекты и их задачи останутся без изменений.", + "People see the tasks of the projects they are in, never more.": "Каждый видит только задачи проектов, в которых участвует.", + "No views yet. A view shows the tasks of several of your projects together.": "Представлений пока нет. Представление показывает задачи нескольких ваших проектов вместе.", + "Projects in view: {count}": "Проектов в представлении: {count}", + "Notify me when a task is assigned to me": "Уведомлять меня, когда мне назначают задачу", + "Also send these to me by email": "Также присылать их мне по почте", + "Add an email address in your Nextcloud personal settings to get mail.": "Добавьте адрес электронной почты в личных настройках Nextcloud, чтобы получать письма.", + "Code link": "Ссылка на код", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Коммит, ветка, запрос на слияние или задача в сервисе кода, связанные с задачей.", + "The task the link belongs to": "Задача, к которой относится ссылка", + "The project of the task": "Проект задачи", + "Task key": "Ключ задачи", + "The task key the forge text named, such as VC-12": "Ключ задачи, указанный в тексте сервиса кода, например VC-12", + "What the link points at": "На что указывает ссылка", + "Link": "Ссылка", + "The address of the item in the forge": "Адрес элемента в сервисе кода", + "The commit message, branch name or merge request title": "Сообщение коммита, имя ветки или заголовок запроса на слияние", + "Repository": "Репозиторий", + "The repository, such as acme/portal": "Репозиторий, например acme/portal", + "Forge id": "Id в сервисе", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Собственный id элемента в сервисе кода, например github:acme/portal#42 или хеш коммита", + "State": "Состояние", + "The state of a merge request or issue": "Состояние запроса на слияние или задачи", + "Who made the commit or opened the merge request": "Кто сделал коммит или открыл запрос на слияние", + "When the commit was made or the merge request last changed": "Когда сделан коммит или последний раз изменился запрос на слияние", + "Added by": "Кем добавлено", + "Whether a person added the link or the integration wrote it": "Добавил ли ссылку человек или её записала интеграция", + "Nextcloud user UIDs of project members": "ID пользователей Nextcloud участников проекта", + "Add link": "Добавить ссылку", + "Added by hand": "Добавлено вручную", + "Branch": "Ветка", + "Code": "Код", + "Commit": "Коммит", + "From the integration": "Из интеграции", + "Link to a commit, branch or merge request": "Ссылка на коммит, ветку или запрос на слияние", + "Merge request": "Запрос на слияние", + "Merged": "Слит", + "No code linked yet. Name {key} in a commit message or paste a link.": "Код пока не привязан. Укажите {key} в сообщении коммита или вставьте ссылку.", + "No code linked yet. Paste a link to a commit or merge request.": "Код пока не привязан. Вставьте ссылку на коммит или запрос на слияние.", + "Paste a web address that starts with https://.": "Вставьте веб-адрес, начинающийся с https://.", + "Remove link {title}": "Удалить ссылку {title}", + "The link could not be added.": "Не удалось добавить ссылку.", + "The link could not be removed.": "Не удалось удалить ссылку.", + "This link is already on the task.": "Эта ссылка уже есть у задачи.", + "Code forges": "Сервисы кода", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Связывайте коммиты и pull request из GitHub с задачами. Integriq получает события; planninq никогда не обращается к GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Скачайте конфигурацию и импортируйте её в Integriq. Затем укажите секрет в правиле \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "В GitHub добавьте к репозиторию webhook с этим адресом и тем же секретом. Выберите тип содержимого application/json и события push и pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Укажите ключ задачи, например VC-12, в сообщении коммита, имени ветки или заголовке pull request. Ссылка тогда появится у этой задачи.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq участники проекта всё равно могут вставить ссылку на странице задачи.", + "Download the Integriq configuration": "Скачать конфигурацию Integriq", + "Calendar": "Календарь", + "Previous": "Назад", + "Calendar view": "Вид календаря", + "Starts:": "Начало:", + "No tasks with a date in this month.": "В этом месяце нет задач с датой.", + "Week of {start} to {end}": "Неделя с {start} по {end}", + "My calendar": "Мой календарь", + "Show as list": "Показать списком", + "Show as calendar": "Показать в календаре", + "Open my calendar": "Открыть мой календарь", + "Nextcloud Tasks": "Задачи Nextcloud", + "Show my tasks in Nextcloud Tasks": "Показывать мои задачи в Задачах Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Задачи, назначенные вам или открытые вам, появляются в списке \"Planninq\" в Задачах и Календаре Nextcloud. Изменения, сделанные там, заменяются при следующем изменении в Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Этот сервер не может записывать в Задачи Nextcloud, поэтому экспорт недоступен.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Управляется Planninq. Изменения, сделанные здесь, заменяются при следующем изменении в Planninq.", + "Working days and holidays": "Рабочие и праздничные дни", + "Dates set on the timeline skip the days that are not working days.": "Даты, заданные на временной шкале, пропускают нерабочие дни.", + "Working weekdays": "Рабочие дни недели", + "Non-working days": "Нерабочие дни", + "No non-working days yet.": "Нерабочих дней пока нет.", + "Add day": "Добавить день", + "Year": "Год", + "Add Dutch national holidays": "Добавить государственные праздники Нидерландов", + "Save working days": "Сохранить рабочие дни", + "Choose at least one working weekday.": "Выберите хотя бы один рабочий день.", + "Working days saved.": "Рабочие дни сохранены.", + "Could not save the working days.": "Не удалось сохранить рабочие дни.", + "New Year's Day": "Новый год", + "Easter Sunday": "Пасха", + "Easter Monday": "Пасхальный понедельник", + "King's Day": "День короля", + "Liberation Day": "День освобождения", + "Ascension Day": "Вознесение", + "Whit Sunday": "Троица", + "Whit Monday": "Духов день", + "Christmas Day": "Рождество", + "Boxing Day": "Второй день Рождества", + "Dates of {title}": "Даты задачи {title}", + "The due date cannot be before the start date.": "Срок не может быть раньше даты начала.", + "{title}, from {start} to {end}": "{title}, с {start} по {end}", + "The dates could not be saved.": "Не удалось сохранить даты.", + "{title} now runs from {start} to {end}": "{title} теперь идёт с {start} по {end}", + "Auto-scheduling": "Автоматическое планирование", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Если включено, перенос срока на временной шкале на более позднюю дату предлагает сдвинуть и блокируемые задачи.", + "Move blocked tasks along when a task slips": "Сдвигать заблокированные задачи, когда задача задерживается", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На временной шкале более поздний срок предлагает сдвинуть блокируемые задачи. Учитываются только связи \"блокирует\", и задачи сдвигаются только позже.", + "Move the tasks that wait for {title}?": "Сдвинуть задачи, которые ждут {title}?", + "These tasks wait for it and would start after its new due date:": "Эти задачи ждут её и начнутся после нового срока:", + "{count} tasks would move; the first {limit} are listed.": "Будет сдвинуто задач: {count}; показаны первые {limit}.", + "Now": "Сейчас", + "After the move": "После сдвига", + "Only this task": "Только эта задача", + "Move all": "Сдвинуть все", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Остановлено на {title}: не удалось сохранить даты. Задачи перед ней сдвинуты.", + "Cumulative flow": "Накопительный поток", + "Show as chart": "Показать как диаграмму", + "Show as table": "Показать как таблицу", + "Tasks per column per day": "Задачи по столбцам по дням", + "Tasks without recorded history in this period: {count}": "Задачи без записанной истории за этот период: {count}", + "Lead and cycle time": "Время выполнения и время цикла", + "No tasks were finished in this period.": "За этот период не завершено ни одной задачи.", + "Finished tasks": "Завершённые задачи", + "Cycle time, average": "Время цикла, среднее", + "Cycle time, 85th percentile": "Время цикла, 85-й процентиль", + "Lead time, average": "Время выполнения, среднее", + "Tasks whose finish time was estimated from their history: {count}": "Задачи, время завершения которых оценено по истории: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Время цикла каждой завершённой задачи со средним и 85-м процентилем", + "Slowest tasks": "Самые медленные задачи", + "cycle {cycle}, lead {lead}": "цикл {cycle}, выполнение {lead}", + "{days} days": "{days} дн.", + "Could not load the flow of this project.": "Не удалось загрузить поток этого проекта.", + "Last {days} days": "Последние {days} дн.", + "Portfolio flow": "Поток портфеля", + "An admin adds portfolios under Projects, Portfolios.": "Администратор добавляет портфели в разделе Проекты, Портфели.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Не показанные проекты, так как одновременно показывается не более 50: {count}", + "Could not load the flow of this portfolio.": "Не удалось загрузить поток этого портфеля.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Накопительный поток и время цикла по проектам портфеля.", + "Edit report": "Изменить отчёт", + "Only tasks where": "Только задачи, где", + "Group by": "Группировать по", + "Display": "Вид", + "Share with everyone who can read its projects": "Поделиться со всеми, кто может читать его проекты", + "The report could not be saved.": "Не удалось сохранить отчёт.", + "Number of tasks": "Количество задач", + "Bar": "Столбцы", + "Donut": "Кольцо", + "Table": "Таблица", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} из {total} проектов в этом отчёте вам не видны", + "No tasks match this report.": "Ни одна задача не подходит под этот отчёт.", + "None": "Нет", + "Could not load this report.": "Не удалось загрузить этот отчёт.", + "Report": "Отчёт", + "Your reports": "Ваши отчёты", + "My reports": "Мои отчёты", + "Shared reports": "Общие отчёты", + "You have not built a report yet.": "Вы ещё не создали ни одного отчёта.", + "Nobody has shared a report with you yet.": "С вами ещё никто не поделился отчётом.", + "Reports you built over tasks, and the ones shared with you.": "Отчёты, которые вы создали по задачам, и те, которыми поделились с вами.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Сохранённый запрос по задачам: какие проекты, какие фильтры, группировка по чему, количество или сумма, в виде таблицы или диаграммы.", + "The name the report is listed under": "Название, под которым отчёт показан в списке", + "What the report shows and who it is for": "Что показывает отчёт и для кого он", + "Nextcloud user id of the person who saved the report": "Идентификатор пользователя Nextcloud, сохранившего отчёт", + "Who can open the report": "Кто может открыть отчёт", + "Only me": "Только я", + "Everyone who can read its projects": "Все, кто может читать его проекты", + "The projects the report covers, at most fifty": "Проекты, которые охватывает отчёт, не более пятидесяти", + "Filters": "Фильтры", + "Task fields and the value each must equal": "Поля задачи и значение, которому должно быть равно каждое", + "The task field the report groups on": "Поле задачи, по которому группирует отчёт", + "Count the tasks, or add up a number on them": "Посчитать задачи или сложить число по ним", + "Sum": "Сумма", + "Sum of": "Сумма по", + "The number added up when the measure is a sum": "Число, которое складывается, если мера это сумма", + "Story points": "Очки историй", + "Estimated duration": "Оценочная длительность", + "How the report is shown": "Как показывается отчёт", + "Issue type": "Тип задачи", + "Task fields and the value each must equal; empty when the report covers every task": "Поля задачи и значение, которому должно соответствовать каждое; пусто, если отчёт охватывает все задачи", + "The status a task must have": "Статус, который должна иметь задача", + "The priority a task must have": "Приоритет, который должна иметь задача", + "The user a task must be assigned to": "Пользователь, которому должна быть назначена задача", + "A label a task must carry": "Метка, которую должна иметь задача", + "The board column a task must be in": "Колонка доски, в которой должна быть задача", + "The issue type a task must have": "Тип задачи, который она должна иметь", + "Manager groups": "Группы руководителей", + "Member groups": "Группы участников", + "Viewer groups": "Группы читателей", + "Viewers": "Читатели", + "Owning group": "Группа-владелец", + "Nextcloud groups whose members manage the project": "Группы Nextcloud, участники которых управляют проектом", + "Nextcloud groups whose members work on the project": "Группы Nextcloud, участники которых работают над проектом", + "Nextcloud groups whose members may read the project": "Группы Nextcloud, участники которых могут читать проект", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Пользователи Nextcloud, управляющие проектом: настройками, участниками и работой", + "Nextcloud user ids who may read the project and its work but not change it": "Пользователи Nextcloud, которые могут читать проект и его работу, но не менять их", + "The Nextcloud group that owns the project with its creator, at most one": "Группа Nextcloud, владеющая проектом вместе с его автором, не более одной", + "Nextcloud user ids who may read this through the project": "Пользователи Nextcloud, которые могут читать это через проект", + "Nextcloud groups whose members may change this through the project": "Группы Nextcloud, участники которых могут менять это через проект", + "Nextcloud groups whose members may read this through the project": "Группы Nextcloud, участники которых могут читать это через проект", + "Search for a person or a group…": "Найти человека или группу…", + "No one found. Your admin's sharing settings decide who you can find.": "Никого не найдено. Кого вы можете найти, определяют настройки общего доступа вашего администратора.", + "Type at least two characters": "Введите не менее двух символов", + "Everyone in this group": "Все в этой группе", + "Could not search for people. Please try again.": "Не удалось найти людей. Попробуйте ещё раз.", + "Could not remove the group": "Не удалось удалить группу", + "Only the owner and managers change who is on this project.": "Только владелец и руководители меняют состав этого проекта.", + "Role of {name}": "Роль: {name}", + "Manager": "Руководитель", + "Member": "Участник", + "Viewer": "Читатель", + "Could not change the role": "Не удалось изменить роль", + "Owned by group: {name}": "Принадлежит группе: {name}", + "No group owns this project.": "Этот проект не принадлежит ни одной группе.", + "Owned by group": "Принадлежит группе", + "Search for a group…": "Найти группу…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Группа не найдена. Настройки общего доступа вашего администратора определяют, какие группы вы можете найти.", + "No owning group": "Без группы-владельца", + "Could not search for groups. Please try again.": "Не удалось найти группы. Попробуйте ещё раз.", + "Could not change the owning group": "Не удалось изменить группу-владельца", + "You can read this project. Only its members change it.": "Вы можете читать этот проект. Изменяют его только его участники.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, который преподаётся на этом уроке, например факультатив, если школьное учебное приложение его знает.", + "Online meeting link": "Ссылка на онлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Где ученики подключаются к этому уроку онлайн. Кнопка «Присоединиться» появляется только для ссылки https." }, "plurals": {} } diff --git a/l10n/sk.js b/l10n/sk.js index b6d358e8..263b559b 100644 --- a/l10n/sk.js +++ b/l10n/sk.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktívne projekty", + "Archived projects": "Archivované projekty", + "Boards": "Nástenky", + "My projects": "Moje projekty", + "Portfolio": "Portfólio", + "Project board": "Nástenka projektu", + "Projects I am in": "Projekty, na ktorých sa podieľam", + "Timeline": "Časová os", + "Timesheet": "Výkaz práce", + "Features & roadmap": "Funkcie a plán vývoja", + "Flow": "Tok", + "Flows": "Toky", + "Reports": "Zostavy", + "Pick a report to open it.": "Vyberte zostavu, ktorú chcete otvoriť.", + "In progress": "Prebieha", + "Date": "Dátum", + "Due": "Termín", + "Assignee": "Priradené", + "Who": "Kto", + "What": "Čo", + "Minutes": "Minúty", + "Entries": "Záznamy", + "Most recent": "Najnovšie", + "Per person": "Na osobu", + "By status": "Podľa stavu", + "By priority": "Podľa priority", + "Task status": "Stav úloh", + "Time spent": "Strávený čas", + "Capacity": "Kapacita", + "Due soonest": "Najskôr splatné", + "Minutes logged": "Zaznamenané minúty", + "Nothing is due": "Nič nie je splatné", + "Nothing logged yet": "Zatiaľ nič nezaznamenané", + "What is open, what is blocked, and what is overdue.": "Čo je otvorené, čo blokované a čo po termíne.", + "How allocation is spread across the people working on projects.": "Ako je vyťaženie rozložené medzi ľudí pracujúcich na projektoch.", + "Hours logged, and the projects they went to.": "Zaznamenané hodiny a projekty, do ktorých šli.", + "Billable": "Fakturovateľné", + "Budget: {amount}": "Rozpočet: {amount}", + "Loading projects": "Načítavajú sa projekty", + "No projects for this client yet": "Pre tohto klienta zatiaľ nie sú žiadne projekty", + "Open in Planninq": "Otvoriť v Planninq", + "This project could not be found": "Tento projekt sa nenašiel", + "Untitled project": "Projekt bez názvu", + "and {count} more": "a ďalšie {count}", + "Store": "Obchod", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Nainštalujte registre, schémy a toky zverejnené inými organizáciami.", + "Work Date": "Dátum práce", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Akcie stĺpca", + "Columns": "Stĺpce", + "Could not remove the column. Please try again.": "Stĺpec sa nepodarilo odstrániť. Skúste to znova.", + "Could not save the column. Please try again.": "Stĺpec sa nepodarilo uložiť. Skúste to znova.", + "Done column": "Stĺpec hotovo", + "Edit column": "Upraviť stĺpec", + "Keep the card's status": "Zachovať stav karty", + "Move its cards to": "Presunúť jeho karty do", + "Move left": "Posunúť doľava", + "Move right": "Posunúť doprava", + "Status of cards moved here": "Stav kariet presunutých sem", + "The last done column cannot be removed.": "Posledný stĺpec hotovo nemožno odstrániť.", + "WIP limit": "Limit WIP", + "over limit": "nad limitom", + "The status a card gets when it is moved into this column.": "Stav, ktorý karta získa po presunutí do tohto stĺpca.", + "All priorities": "Všetky priority", + "Could not create the task. Please try again.": "Úlohu sa nepodarilo vytvoriť. Skúste to znova.", + "Created": "Vytvorené", + "Move to backlog": "Do backlogu", + "Move to board": "Na nástenku", + "New task": "Nová úloha", + "Nothing in the backlog": "Backlog je prázdny", + "Rank": "Poradie", + "Sort by": "Zoradiť podľa", + "Sort by rank to reorder": "Na zmenu poradia zoraďte podľa poradia", + "Task actions": "Akcie úlohy", + "All labels": "Všetky štítky", + "Filter tasks by label": "Filtrovať úlohy podľa štítka", + "View timeline": "Zobraziť časovú os", + "Board": "Nástenka", + "List": "Zoznam", + "Column": "Stĺpec", + "Board or list": "Nástenka alebo zoznam", + "Log": "Denník", + "Add entry": "Pridať záznam", + "Show": "Zobraziť", + "No actions yet": "Zatiaľ žiadne akcie", + "Closed": "Uzavreté", + "Entry actions": "Akcie záznamu", + "Add action": "Pridať akciu", + "by {author}": "autor {author}", + "saved {time}": "uložené {time}", + "Attendees: {names}": "Účastníci: {names}", + "Add the first entry": "Pridať prvý záznam", + "Issues": "Problémy", + "Lessons learned": "Poučenia", + "Meetings": "Stretnutia", + "Decisions": "Rozhodnutia", + "Actions": "Akcie", + "Issue": "Problém", + "Lesson learned": "Poučenie", + "Meeting": "Stretnutie", + "Decision": "Rozhodnutie", + "About this project": "O tomto projekte", + "No description yet": "Zatiaľ bez popisu", + "Start date": "Dátum začiatku", + "Not set": "Nenastavené", + "End date": "Dátum ukončenia", + "Progress": "Postup", + "No tasks yet": "Zatiaľ žiadne úlohy", + "Open the board": "Otvoriť nástenku", + "People": "Ľudia", + "Owner": "Vlastník", + "Latest log entries": "Najnovšie záznamy", + "Open the log": "Otvoriť denník", + "{done} of {total} tasks done": "Hotovo {done} z {total} úloh", + "Edit entry": "Upraviť záznam", + "Type": "Druh", + "Attendees": "Účastníci", + "Issue is closed": "Problém je uzavretý", + "Could not save the entry. Please try again.": "Záznam sa nepodarilo uložiť. Skúste to znova.", + "From: {title}": "Z: {title}", + "What needs to happen": "Čo treba urobiť", + "Could not create the action. Please try again.": "Akciu sa nepodarilo vytvoriť. Skúste to znova.", + "The action was created but could not be linked to the entry.": "Akcia bola vytvorená, ale nepodarilo sa ju prepojiť so záznamom.", + "Project pages": "Stránky projektu", + "Overview": "Prehľad", + "Risks": "Riziká", + "Log entry": "Záznam denníka", + "A short name for the entry": "Krátky názov záznamu", + "Project": "Projekt", + "The project this entry belongs to": "Projekt, ku ktorému záznam patrí", + "What kind of entry this is": "Aký je to druh záznamu", + "When it happened": "Kedy sa to stalo", + "What happened, in Markdown": "Čo sa stalo, v Markdowne", + "Whether an issue is still open": "Či je problém stále otvorený", + "The people at a meeting": "Ľudia na stretnutí", + "Tasks that came out of this entry": "Úlohy, ktoré vzišli z tohto záznamu", + "Add risk": "Pridať riziko", + "Risk": "Riziko", + "Score": "Skóre", + "Response": "Reakcia", + "Review date": "Dátum revízie", + "no longer on the project": "už nie je v projekte", + "Edit {title}": "Upraviť {title}", + "No risks recorded yet": "Zatiaľ žiadne zaznamenané riziká", + "Add the first risk": "Pridať prvé riziko", + "Medium": "Stredné", + "Mitigating": "Zmierňuje sa", + "Occurred": "Nastalo", + "Avoid": "Vyhnúť sa", + "Reduce": "Znížiť", + "Transfer": "Preniesť", + "Accept": "Prijať", + "Highest open risks": "Najvyššie otvorené riziká", + "No open risks": "Žiadne otvorené riziká", + "Open the risk register": "Otvoriť register rizík", + "Edit risk": "Upraviť riziko", + "What could go wrong": "Čo sa môže pokaziť", + "Likelihood": "Pravdepodobnosť", + "Impact": "Dopad", + "Score {score}": "Skóre {score}", + "Countermeasures": "Protiopatrenia", + "Could not save the risk. Please try again.": "Riziko sa nepodarilo uložiť. Skúste to znova.", + "Risks by likelihood and impact": "Riziká podľa pravdepodobnosti a dopadu", + "Risk scale": "Škála rizík", + "The levels every project scores its risks on, and where low turns into medium and high": "Úrovne, na ktorých každý projekt hodnotí svoje riziká, a kde nízke prechádza do stredného a vysokého", + "Number of levels": "Počet úrovní", + "Likelihood labels": "Označenia pravdepodobnosti", + "Impact labels": "Označenia dopadu", + "Level {level}": "Úroveň {level}", + "Medium from score": "Stredné od skóre", + "High from score": "Vysoké od skóre", + "Risk scale saved": "Škála rizík uložená", + "1 risk uses level {level}. Change it first.": "1 riziko používa úroveň {level}. Najprv ho zmeňte.", + "{count} risks use level {level}. Change them first.": "{count} rizík používa úroveň {level}. Najprv ich zmeňte.", + "Every level needs a label, and high must start above medium.": "Každá úroveň potrebuje označenie a vysoké musí začínať nad stredným.", + "The project this risk belongs to": "Projekt, ku ktorému riziko patrí", + "The cause and the effect, in Markdown": "Príčina a následok, v Markdowne", + "Category": "Kategória", + "A free grouping, such as planning, budget or supplier": "Voľné zoskupenie, napr. plánovanie, rozpočet alebo dodávateľ", + "How likely it is, on the admin's risk scale": "Aké je pravdepodobné, na škále rizík správcu", + "How hard it would hit, on the admin's risk scale": "Ako tvrdo by zasiahlo, na škále rizík správcu", + "Likelihood times impact, calculated by the server": "Pravdepodobnosť krát dopad, vypočítané serverom", + "Where the risk stands": "Ako je na tom riziko", + "The person who watches this risk": "Osoba, ktorá riziko sleduje", + "How the project answers the risk": "Ako projekt na riziko reaguje", + "What is done to prevent it or soften it, in Markdown": "Čo sa robí na jeho prevenciu alebo zmiernenie, v Markdowne", + "When to look at this risk again": "Kedy riziko znova posúdiť", + "Very low": "Veľmi nízke", + "Very high": "Veľmi vysoké", + "All projects": "Všetky projekty", + "Project status report": "Správa o stave projektu", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datovaná správa o tom, ako si projekt stojí v peniazoch, organizácii, čase, informáciách, kvalite a riziku (aspekty GROTIK), každý s poznámkou.", + "The project this report is about": "Projekt, ktorého sa správa týka", + "Report date": "Dátum správy", + "The day the report describes": "Deň, ktorý správa opisuje", + "Money": "Peniaze", + "How the project stands on this aspect": "Ako si projekt stojí v tomto aspekte", + "On track": "Podľa plánu", + "At risk": "Ohrozené", + "Off track": "Mimo plánu", + "Money note": "Poznámka k peniazom", + "A short explanation of this status": "Krátke vysvetlenie tohto stavu", + "Organisation": "Organizácia", + "Organisation note": "Poznámka k organizácii", + "Time": "Čas", + "Time note": "Poznámka k času", + "Information": "Informácie", + "Information note": "Poznámka k informáciám", + "Quality": "Kvalita", + "Quality note": "Poznámka ku kvalite", + "Risk note": "Poznámka k riziku", + "Overall": "Celkovo", + "The worst of the six statuses, calculated by the server": "Najhorší zo šiestich stavov, vypočítaný serverom", + "Health: money": "Stav: peniaze", + "Copied from the newest status report": "Prevzaté z najnovšej správy o stave", + "Health: organisation": "Stav: organizácia", + "Health: time": "Stav: čas", + "Health: information": "Stav: informácie", + "Health: quality": "Stav: kvalita", + "Health: risk": "Stav: riziko", + "Health: overall": "Stav: celkovo", + "Health: report date": "Stav: dátum správy", + "The date of the newest status report": "Dátum najnovšej správy o stave", + "New report": "Nová správa", + "Only the project owner writes status reports.": "Správy o stave píše iba vlastník projektu.", + "Latest report, {date}": "Posledná správa, {date}", + "Aspect": "Aspekt", + "Note": "Poznámka", + "Report history": "História správ", + "Author": "Autor", + "No status reports yet": "Zatiaľ žiadne správy o stave", + "Write the first report": "Napísať prvú správu", + "Choose a status for every aspect to save the report.": "Na uloženie správy zvoľte stav pri každom aspekte.", + "Suggested: on track.": "Návrh: podľa plánu.", + "Suggested: at risk.": "Návrh: ohrozené.", + "Suggested: off track.": "Návrh: mimo plánu.", + "1 task is past its due date.": "1 úloha je po termíne.", + "{count} tasks are past their due date.": "Úlohy po termíne: {count}.", + "The end date has passed with 1 open task.": "Dátum konca uplynul s 1 otvorenou úlohou.", + "The end date has passed with {count} open tasks.": "Dátum konca uplynul, otvorené úlohy: {count}.", + "No open task is past its due date.": "Žiadna otvorená úloha nie je po termíne.", + "The highest open risk, \"{title}\", scores {score}.": "Najvyššie otvorené riziko, \"{title}\", má skóre {score}.", + "There are no open risks.": "Nie sú žiadne otvorené riziká.", + "Costs are at {percent}% of the budget.": "Náklady sú na {percent}% rozpočtu.", + "No suggestion: the project has no budget.": "Bez návrhu: projekt nemá rozpočet.", + "No suggestion: no costs are recorded for this project yet.": "Bez návrhu: pre tento projekt zatiaľ nie sú zaznamenané žiadne náklady.", + "The report was not saved. Only the project owner can write status reports.": "Správa nebola uložená. Správy o stave môže písať iba vlastník projektu.", + "No report": "Žiadna správa", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Skupina projektov vedených tými istými ľuďmi, napríklad oddelenie alebo program. Jej správcovia čítajú každý projekt v nej.", + "The name of the portfolio": "Názov portfólia", + "What the portfolio holds and who runs it": "Čo portfólio obsahuje a kto ho vedie", + "A colour for the portfolio's section in project lists": "Farba sekcie portfólia v zoznamoch projektov", + "Managers": "Správcovia", + "Nextcloud user UIDs of the people who run the portfolio": "ID používateľov Nextcloud ľudí, ktorí portfólio vedú", + "Order": "Poradie", + "Where the portfolio comes in project lists, lowest first": "Kde je portfólio v zoznamoch projektov, od najnižšieho", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Vlastná škála rizík tohto portfólia ako JSON, v rovnakom tvare ako škála celej aplikácie. Prázdne znamená škálu aplikácie.", + "Portfolio readers": "Čitatelia portfólia", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID používateľov Nextcloud správcov portfólia projektu", + "The portfolio this project belongs to": "Portfólio, do ktorého projekt patrí", + "No portfolio": "Bez portfólia", + "All portfolios": "Všetky portfóliá", + "You read this project as a manager of its portfolio. Only its members change it.": "Tento projekt čítate ako správca jeho portfólia. Menia ho iba jeho členovia.", + "Portfolios": "Portfóliá", + "Portfolio status": "Stav portfólia", + "No portfolios yet": "Zatiaľ žiadne portfóliá", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Správca pridáva portfóliá v Projekty, Portfóliá. Projekty v portfóliu sú tu uvedené so svojím stavom.", + "Roll-up": "Súhrn", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} podľa plánu, {atRisk} ohrozené, {offTrack} mimo plánu, {noReport} bez správy", + "No project in this portfolio that you can read.": "V tomto portfóliu nie je projekt, ktorý môžete čítať.", + "Start": "Začiatok", + "End": "Koniec", + "Budget": "Rozpočet", + "Last report": "Posledná správa", + "Out of date": "Zastarané", + "Portfolio timeline": "Časová os portfólia", + "Zoom": "Priblíženie", + "Could not load the timeline": "Časovú os sa nepodarilo načítať", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Správca pridáva portfóliá v Projekty, Portfóliá. Projekty v portfóliu sú tu na jednej časovej osi.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Otvorte projekt a uvidíte jeho fázy a úlohy. Časová os je len na čítanie.", + "Phase: {title}": "Fáza: {title}", + "Left out because you cannot read them: {count} projects": "Vynechané, lebo ich nemôžete čítať: {count} projektov", + "Week": "Týždeň", + "Day": "Deň", + "Month": "Mesiac", + "Please try again later.": "Skúste to neskôr.", + "Status reports": "Správy o stave", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Po koľkých dňoch sa posledná správa o stave projektu označí v prehľade portfólia ako zastaraná", + "Reporting period (days)": "Obdobie vykazovania (dni)", + "The reporting period is a whole number of days from 1 to 365.": "Obdobie vykazovania je celý počet dní od 1 do 365.", + "Reporting period saved": "Obdobie vykazovania uložené", + "The reporting period was not saved. Please try again.": "Obdobie vykazovania sa neuložilo. Skúste to znova.", + "Every project of a portfolio with its status per aspect, rolled up.": "Každý projekt portfólia so stavom podľa aspektov, zhrnutý.", + "The projects of a portfolio on one timeline.": "Projekty portfólia na jednej časovej osi.", + "Phases": "Fázy", + "Add phase": "Pridať fázu", + "No phases yet": "Zatiaľ žiadne fázy", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Rozdeľte projekt do fáz, napríklad iniciácia, definícia a realizácia. Fáza sa uzavrie, keď je nahraný jej záverečný dokument.", + "{hours} hours": "{hours} hodín", + "Concluding document: {title}": "Záverečný dokument: {title}", + "Concluding document missing": "Chýba záverečný dokument", + "Move {title} up": "Posunúť {title} nahor", + "Move {title} down": "Posunúť {title} nadol", + "Close phase": "Uzavrieť fázu", + "Phase": "Fáza", + "Files": "Súbory", + "Notes": "Poznámky", + "Audit trail": "Auditný záznam", + "Edit phase": "Upraviť fázu", + "Name": "Názov", + "Budget hours": "Rozpočtované hodiny", + "Could not save the phase. Please try again.": "Fázu sa nepodarilo uložiť. Skúste to znova.", + "Close phase {title}": "Uzavrieť fázu {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Fáza sa uzatvára záverečným dokumentom: nahrajte ho sem alebo vyberte jeden zo súborov fázy.", + "Concluding document": "Záverečný dokument", + "This phase has no files yet.": "Táto fáza zatiaľ nemá súbory.", + "Upload a document": "Nahrať dokument", + "The document was not uploaded. Please try again.": "Dokument sa nenahral. Skúste to znova.", + "Upload the concluding document before you close this phase.": "Pred uzavretím tejto fázy nahrajte záverečný dokument.", + "This phase cannot be closed from its current status.": "Túto fázu nemožno uzavrieť z jej aktuálneho stavu.", + "The phase was not closed. Please try again.": "Fáza nebola uzavretá. Skúste to znova.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID súboru tejto fázy, ktorý ju uzatvára. Fázu možno dokončiť, až keď je vyplnené a súbor je priložený.", + "Import from Microsoft Project": "Importovať z Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Vyberte plán uložený z Microsoft Project vo formáte XML. Nič sa neimportuje, kým nepotvrdíte.", + "Plan file": "Súbor plánu", + "What the import creates": "Čo import vytvorí", + "Tasks": "Úlohy", + "Sub-tasks": "Podúlohy", + "Milestones": "Míľniky", + "Links": "Prepojenia", + "Already imported, updated in place: {count}": "Už importované, aktualizované na mieste: {count}", + "What does not carry over": "Čo sa neprenesie", + "Tasks with resources, which are not imported: {count}": "Úlohy so zdrojmi, ktoré sa neimportujú: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Úlohy hlbšie ako úroveň 3, umiestnené pod svoju úlohu úrovne 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Prepojenia iné ako koniec-začiatok, importované ako súvisiace prepojenia: {count}", + "Link lags, which are dropped: {count}": "Oneskorenia prepojení, ktoré sa vypúšťajú: {count}", + "Links to a summary task, which are not imported: {count}": "Prepojenia na súhrnnú úlohu, ktoré sa neimportujú: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Prepojenia na úlohy mimo tohto plánu, ktoré sa neimportujú: {count}", + "No longer in the plan": "Už nie je v pláne", + "These stay in the project; remove them yourself if they are no longer needed.": "Zostávajú v projekte; odstráňte ich sami, ak už nie sú potrebné.", + "Import": "Importovať", + "Close": "Zavrieť", + "The plan is imported: {created} created, {updated} updated.": "Plán je importovaný: vytvorené {created}, aktualizované {updated}.", + "Links that would close a loop were left out: {count}": "Prepojenia, ktoré by uzavreli slučku, boli vynechané: {count}", + "The import stopped part-way. Run it again to finish it.": "Import sa zastavil v polovici. Spustite ho znova, aby ste ho dokončili.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Uložte plán v Microsoft Project cez Súbor, Uložiť ako, formát XML, a importujte tento súbor.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Tento súbor deklaruje DOCTYPE alebo entity, ktoré sa neprijímajú.", + "The file is larger than 10 MB.": "Súbor je väčší ako 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plán má viac ako 2 000 úloh, viac, ako prijme jeden import.", + "This file is not a Microsoft Project plan in XML format.": "Tento súbor nie je plán Microsoft Project vo formáte XML.", + "Choose a file to import.": "Vyberte súbor na import.", + "Only the project owner can import a plan.": "Plán môže importovať iba vlastník projektu.", + "The plan could not be read. Please try again.": "Plán sa nepodarilo prečítať. Skúste to znova.", + "Linked case: {title}": "Prepojený spis: {title}", + "Linked to a case": "Prepojené so spisom", + "Hand over to case": "Odovzdať do spisu", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Bez zmeny skopíruje každý súbor projektu a jeho úloh a súbor opisujúci projekt do prepojeného spisu.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Skopírované súbory: {count}", + "Files that failed: {names}": "Neúspešné súbory: {names}", + "The handover failed. Please try again.": "Odovzdanie zlyhalo. Skúste to znova.", + "The linked case could not be found, or you cannot open it.": "Prepojený spis sa nenašiel, alebo ho nemôžete otvoriť.", + "Case handovers": "Odovzdania do spisu", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Každé odovzdanie súborov a metadát projektu do jeho spisu: kedy, kým, do ktorého spisu, každý skopírovaný súbor s jeho SHA-256 a neúspešné súbory.", + "Finance": "Financie", + "Add cost line": "Pridať nákladovú položku", + "Delivery terms": "Dodacie podmienky", + "Billing model": "Model fakturácie", + "Budget in euro": "Rozpočet v eurách", + "Budget in hours": "Rozpočet v hodinách", + "Hourly rate in euro": "Hodinová sadzba v eurách", + "Planned start": "Plánovaný začiatok", + "Planned end": "Plánovaný koniec", + "Planned dates": "Plánované dátumy", + "Budget {amount}": "Rozpočet {amount}", + "No budget agreed": "Rozpočet nebol dohodnutý", + "Hours": "Hodiny", + "Only the project owner and the portfolio managers see the amounts.": "Sumy vidí len vlastník projektu a správcovia portfólia.", + "Budget against cost per category": "Rozpočet oproti nákladom podľa kategórie", + "Labour (booked time)": "Práca (vykázaný čas)", + "No category": "Bez kategórie", + "Hours are not available": "Hodiny nie sú k dispozícii", + "Not yet assigned to a category": "Zatiaľ nepriradené ku kategórii", + "Total": "Spolu", + "{spent} spent, {remaining} remaining": "{spent} minuté, {remaining} zostáva", + "Budget against cost per phase": "Rozpočet oproti nákladom podľa fázy", + "No phase": "Bez fázy", + "Cost lines": "Nákladové položky", + "From the finance system": "Z finančného systému", + "Edit cost line {amount}": "Upraviť nákladovú položku {amount}", + "No cost lines yet": "Zatiaľ žiadne nákladové položky", + "Commitments": "Záväzky", + "Actual cost": "Skutočné náklady", + "Forecast": "Prognóza", + "Remaining": "Zostáva", + "Not planned yet": "Zatiaľ nenaplánované", + "{start} to {end}": "{start} až {end}", + "The terms were not saved. Please try again.": "Podmienky sa neuložili. Skúste to znova.", + "Terms saved": "Podmienky uložené", + "Fixed price": "Pevná cena", + "Hourly": "Hodinovo", + "Not billed": "Nefakturované", + "Commitment": "Záväzok", + "Edit cost line": "Upraviť nákladovú položku", + "Kind": "Druh", + "Amount in euro": "Suma v eurách", + "Remove": "Odstrániť", + "Could not save the cost line. Only the project owner changes the money of a project.": "Nákladovú položku nemožno uložiť. Peniaze projektu mení len vlastník projektu.", + "Could not remove the cost line. Please try again.": "Nákladovú položku nemožno odstrániť. Skúste to znova.", + "{amount} over budget": "{amount} nad rozpočet", + "Cost categories": "Kategórie nákladov", + "The categories every project splits its budget and costs into, one per line": "Kategórie, do ktorých každý projekt delí svoj rozpočet a náklady, jedna na riadok", + "Categories": "Kategórie", + "Give at least one category, each name once.": "Zadajte aspoň jednu kategóriu, každý názov raz.", + "Cost categories saved": "Kategórie nákladov uložené", + "The cost categories were not saved. Please try again.": "Kategórie nákladov sa neuložili. Skúste to znova.", + "Finance line": "Finančná položka", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Jedna suma peňazí v projekte: rozpočet, záväzok, skutočný náklad alebo prognóza, v kategórii nákladov a prípadne vo fáze. Zadaná vlastníkom projektu alebo finančným systémom cez integračnú aplikáciu.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt, ku ktorému suma patrí. Prázdne pri položke z finančného systému, ktorej číslo projektu nezodpovedá žiadnemu projektu.", + "The phase this amount belongs to, if any": "Fáza, ku ktorej suma patrí, ak existuje", + "The cost category, one of the categories the admin set up": "Kategória nákladov, jedna z kategórií nastavených správcom", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Či je suma rozpočet, záväzok, skutočný náklad alebo prognóza", + "Amount": "Suma", + "The amount in the reporting currency (euro)": "Suma v mene výkazníctva (euro)", + "The date the amount was booked or is expected": "Dátum, keď bola suma zaúčtovaná alebo sa očakáva", + "What the amount is for": "Na čo je suma", + "Whether a person entered the line or the finance system sent it": "Či položku zadal človek, alebo ju poslal finančný systém", + "Entered by hand": "Zadané ručne", + "Finance line id": "Id finančnej položky", + "The finance system's own id of this line. One imported line per id.": "Vlastné id tejto položky vo finančnom systéme. Jedna importovaná položka na id.", + "Project number": "Číslo projektu", + "The project number the finance system sent, matched against the project key": "Číslo projektu zaslané finančným systémom, porovnané s kľúčom projektu", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfólio projektu položky, prevzaté z projektu, aby súčty portfólia potrebovali jeden filter", + "Finance readers": "Čitatelia financií", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID používateľov Nextcloud, ktorí smú vidieť túto sumu: vlastník projektu a správcovia jeho portfólia", + "Project owner": "Vlastník projektu", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID používateľa Nextcloud vlastníka projektu, ktorý smie meniť a odstraňovať ručné položky", + "How the client pays: not billed, a fixed price, or by the hour.": "Ako klient platí: nefakturované, pevná cena alebo hodinovo.", + "Portfolio finance": "Financie portfólia", + "You cannot see the money of any project in this portfolio": "Nevidíte peniaze žiadneho projektu v tomto portfóliu", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Server vrátil nákladové položky projektov mimo tohto portfólia, takže tieto súčty môžu byť nesprávne.", + "Projects left out because you cannot see their money: {count}": "Vynechané projekty, pretože nevidíte ich peniaze: {count}", + "Unmatched finance lines": "Nepriradené finančné položky", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Rozpočet, záväzky, skutočné náklady a prognóza spočítané za portfólio.", + "Subprojects": "Podprojekty", + "{done} of {total}": "{done} z {total}", + "{done} of {total} tasks done, including subprojects": "{done} z {total} úloh hotových, vrátane podprojektov", + "Show the subprojects of {title}": "Zobraziť podprojekty {title}", + "Hide the subprojects of {title}": "Skryť podprojekty {title}", + "Part of": "Súčasť", + "No parent project": "Bez nadradeného projektu", + "A project cannot sit under one of its own subprojects.": "Projekt nemôže ležať pod jedným zo svojich vlastných podprojektov.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekty sa vnárajú najviac do troch úrovní: program, projekt a podprojekt.", + "Parent project": "Nadradený projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt, pod ktorým tento projekt leží, napríklad program. Projekty sa vnárajú najviac do troch úrovní.", + "Yes": "Áno", + "No": "Nie", + "{label} (required)": "{label} (povinné)", + "{label} is required": "{label} je povinné", + "Project field": "Pole projektu", + "A field an admin adds to every project, such as a policy area or a contract value.": "Pole, ktoré správca pridá ku každému projektu, napríklad oblasť politiky alebo hodnotu zákazky.", + "Key": "Kľúč", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stály názov, pod ktorým sa hodnota ukladá, v lower camel case. Nemeňte ho, keď ho projekty používajú.", + "Label": "Popis", + "The name people see next to the field": "Názov, ktorý ľudia vidia pri poli", + "What the field holds": "Čo pole obsahuje", + "Text": "Text", + "Number": "Číslo", + "Choice": "Voľba", + "Person": "Osoba", + "Yes or no": "Áno alebo nie", + "Options": "Možnosti", + "The choices of a choice field": "Možnosti výberového poľa", + "Required": "Povinné", + "Whether a project must fill in the field": "Či projekt musí pole vyplniť", + "Where the field appears, lowest first": "Kde sa pole zobrazí, najnižšie prvé", + "Applies to": "Platí pre", + "What the field is added to": "K čomu sa pole pridáva", + "Custom fields": "Vlastné polia", + "The values of the project fields an admin defined, keyed by the field's key.": "Hodnoty polí projektu, ktoré definoval správca, podľa kľúča poľa.", + "Project fields": "Polia projektu", + "Related": "Súvisiace", + "Remove link": "Odstrániť odkaz", + "Link type": "Typ odkazu", + "Relates to": "Súvisí s", + "Duplicates": "Duplikuje", + "Project key": "Kľúč projektu", + "Every task number starts with it, such as VERG-42.": "Každé číslo úlohy ním začína, napríklad VERG-42.", + "This key is already used by another project.": "Tento kľúč už používa iný projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Použite 2 až 10 písmen a číslic, začínajúc písmenom.", + "The key cannot change once tasks carry it.": "Kľúč sa nemôže zmeniť, keď ho nesú úlohy.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt uložený. Existujúce úlohy dostanú svoje čísla na pozadí.", + "Next task number": "Číslo ďalšej úlohy", + "The number the next task of this project gets in its key. Only the system writes it.": "Číslo, ktoré ďalšia úloha tohto projektu dostane vo svojom kľúči. Zapisuje ho iba systém.", + "Restore {title}": "Obnoviť {title}", + "Restore": "Obnoviť", + "Project restored": "Projekt obnovený", + "Could not restore the project": "Projekt sa nepodarilo obnoviť", + "Bring this project back to the active list.": "Vrátiť projekt do zoznamu aktívnych projektov.", + "Restore project": "Obnoviť projekt", + "Request reason": "Dôvod žiadosti", + "Why the requester needs this project. Filled in when the project is requested.": "Prečo žiadateľ potrebuje tento projekt. Vypĺňa sa pri žiadosti.", + "Reviewed by": "Posúdil", + "The user who approved or rejected the request.": "Používateľ, ktorý žiadosť schválil alebo zamietol.", + "Reviewed at": "Posúdené", + "When the request was approved or rejected.": "Kedy bola žiadosť schválená alebo zamietnutá.", + "Review note": "Poznámka k posúdeniu", + "The reviewer's reason, shown to the requester when a request is not approved.": "Dôvod posudzovateľa, ktorý žiadateľ uvidí, keď žiadosť nie je schválená.", + "Members of these groups": "Členovia týchto skupín", + "Groups that may create projects": "Skupiny, ktoré môžu zakladať projekty", + "The group {group} no longer exists. Save to remove it.": "Skupina {group} už neexistuje. Uložením ju odstránite.", + "Review project request": "Posúdiť žiadosť o projekt", + "Requested by": "Požiadal", + "Why it is needed": "Prečo je potrebný", + "Desired start date": "Požadovaný dátum začiatku", + "Why is it not approved?": "Prečo nie je schválený?", + "Give a reason. The requester sees it.": "Uveďte dôvod. Žiadateľ ho uvidí.", + "Approve": "Schváliť", + "Reject": "Zamietnuť", + "Reject request": "Zamietnuť žiadosť", + "The review was not saved. Try again.": "Posúdenie sa neuložilo. Skúste to znova.", + "This project is waiting for review": "Tento projekt čaká na posúdenie", + "This request was not approved": "Táto žiadosť nebola schválená", + "Reason: {note}": "Dôvod: {note}", + "Review request": "Posúdiť žiadosť", + "Request a project": "Požiadať o projekt", + "Step {step} of 2": "Krok {step} z 2", + "Why is this project needed?": "Prečo je tento projekt potrebný?", + "Give a reason. The reviewer reads it.": "Uveďte dôvod. Posudzovateľ ho prečíta.", + "Back": "Späť", + "Next": "Ďalej", + "Send request": "Odoslať žiadosť", + "The request was not sent. Try again.": "Žiadosť sa neodoslala. Skúste to znova.", + "Requested": "Požadované", + "Not approved": "Neschválené", + "Your request was sent": "Vaša žiadosť bola odoslaná", + "Let everyone else request a project": "Umožniť všetkým ostatným požiadať o projekt", + "Add a task": "Pridať úlohu", + "Delete task": "Odstrániť úlohu", + "Edit task": "Upraviť úlohu", + "Write": "Písať", + "Preview": "Náhľad", + "Markdown works here: headings, lists and links.": "Tu funguje Markdown: nadpisy, zoznamy a odkazy.", + "Could not save the task. Please try again.": "Úlohu sa nepodarilo uložiť. Skúste to znova.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Na úlohe \"{title}\" je zaznamenaný čas, preto ju nemožno odstrániť. Namiesto toho ju môžete zrušiť: záznamy času zostanú.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Odstrániť \"{title}\"? Odstránia sa aj jej prepojenia na iné úlohy. Túto akciu nemožno vrátiť späť.", + "Keep task": "Ponechať úlohu", + "Cancel task": "Zrušiť úlohu", + "Only the reporter, the project owner or an admin can delete this task.": "Túto úlohu môže odstrániť iba ten, kto ju nahlásil, vlastník projektu alebo správca.", + "Could not delete the task. Please try again.": "Úlohu sa nepodarilo odstrániť. Skúste to znova.", + "Could not cancel the task. Please try again.": "Úlohu sa nepodarilo zrušiť. Skúste to znova.", + "Responsible": "Zodpovedná osoba", + "Also working on this": "Pracujú na tom aj", + "Labels": "Štítky", + "Could not change the priority. Please try again.": "Prioritu sa nepodarilo zmeniť. Skúste to znova.", + "Other project members who work on this task alongside the person responsible.": "Ďalší členovia projektu, ktorí na úlohe pracujú spolu so zodpovednou osobou.", + "Duplicate": "Duplikovať", + "Could not copy the task. Please try again.": "Úlohu sa nepodarilo skopírovať. Skúste to znova.", + "Subtasks": "Podúlohy", + "{done} of {total} done": "Hotové {done} z {total}", + "Add a subtask": "Pridať podúlohu", + "Checklist": "Kontrolný zoznam", + "Checklist item actions": "Akcie položky zoznamu", + "Add a checklist item": "Pridať položku zoznamu", + "Subtasks: {estimate} estimated, {logged} logged": "Podúlohy: odhad {estimate}, zaznamenané {logged}", + "Total estimate: {total}": "Celkový odhad: {total}", + "Part of {title}": "Súčasť úlohy {title}", + "Checklist: {count} done": "Kontrolný zoznam: hotové {count}", + "This task has subtasks: {count}.": "Táto úloha má podúlohy: {count}.", + "Keep subtasks as separate tasks": "Ponechať podúlohy ako samostatné úlohy", + "Delete subtasks too": "Odstrániť aj podúlohy", + "Copy of {title}": "Kópia: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Úloha bola skopírovaná, ale nie všetky jej podúlohy. Skontrolujte kópiu.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Malé kroky v rámci úlohy. Každá položka má id, text a informáciu, či je hotová.", + "Open work per person and per project.": "Otvorená práca podľa osôb a projektov.", + "View": "Zobrazenie", + "By person": "Podľa osoby", + "By project": "Podľa projektu", + "Hours left": "Zostávajúce hodiny", + "Tasks without an estimate": "Úlohy bez odhadu", + "Due in 14 days": "Termín do 14 dní", + "Shared": "Zdieľané", + "Unassigned": "Nepriradené", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Zobrazuje sa práca v projektoch, ktoré vidíte. Hodiny sa počítajú zodpovednej osobe; zdieľané úlohy sa počítajú bez hodín.", + "No open work in these projects.": "V týchto projektoch nie je žiadna otvorená práca.", + "Open work": "Otvorená práca", + "{count} open tasks": "{count} otvorených úloh", + "Create a project to see capacity here.": "Vytvorte projekt, aby ste tu videli kapacitu.", + "My tasks": "Moje úlohy", + "Show all my tasks": "Zobraziť všetky moje úlohy", + "No tasks assigned to you": "Nemáte priradené žiadne úlohy", + "Browse projects": "Prehliadať projekty", + "Later": "Neskôr", + "Due {date}": "Termín {date}", + "Could not change the status. Please try again.": "Stav sa nepodarilo zmeniť. Skúste to znova.", + "Completed today": "Dokončené dnes", + "My open tasks": "Moje otvorené úlohy", + "My overdue tasks": "Moje úlohy po termíne", + "My tasks in progress": "Moje rozpracované úlohy", + "Pin to the top": "Pripnúť hore", + "Unpin": "Odopnúť", + "Pinned": "Pripnuté", + "Actions for {title}": "Akcie pre {title}", + "Could not save your project order. Please try again.": "Poradie projektov sa nepodarilo uložiť. Skúste to znova.", + "No boards yet": "Zatiaľ žiadne tabule", + "Create a project to get a board.": "Vytvorte projekt, aby ste mali tabuľu.", + "Use the Projects page to create and manage your projects and tasks.": "Na stránke Projekty vytvárajte a spravujte svoje projekty a úlohy.", + "Go to projects": "Prejsť na projekty", + "You are not a member of any projects yet.": "Zatiaľ nie ste členom žiadneho projektu.", + "Could not search for users. Please try again.": "Používateľov sa nepodarilo vyhľadať. Skúste to znova.", + "Project creation is restricted to administrators.": "Projekty môžu vytvárať iba správcovia.", + "Only the project owner or an administrator can delete this project.": "Tento projekt môže odstrániť iba vlastník projektu alebo správca.", + "No projects are available to you yet. Ask an administrator to create one.": "Zatiaľ pre vás nie sú dostupné žiadne projekty. Požiadajte správcu o vytvorenie.", + "Due: {date}": "Termín: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Úlohy s dátumom začiatku alebo termínom sa zobrazujú na časovej osi. Pridajte dátumy, aby ste ich tu videli.", + "You do not have access to this project.": "K tomuto projektu nemáte prístup.", + "Zoom level": "Úroveň priblíženia", + "Unscheduled": "Nenaplánované", + "Start: {date}": "Začiatok: {date}", + "Today": "Dnes", + "No scheduled tasks": "Žiadne naplánované úlohy", + "An unexpected error occurred.": "Vyskytla sa neočakávaná chyba.", + "Column {number} name": "Názov stĺpca {number}", + "Failed to save creation policy": "Pravidlo na vytváranie sa nepodarilo uložiť", + "All authenticated users": "Všetci prihlásení používatelia", + "Control who may create new projects": "Určte, kto smie vytvárať nové projekty", + "Administrators only": "Iba správcovia", + "Project creation": "Vytváranie projektov", + "Allow project creation": "Povoliť vytváranie projektov", + "Creation policy saved successfully": "Pravidlo na vytváranie uložené", + "Initializing…": "Spúšťa sa…", + "e.g. 2h 30m, 90m, 1.5h": "napr. 2h 30m, 90m, 1.5h", + "Log time": "Zapísať čas", + "Save estimate": "Uložiť odhad", + "Logged: {logged}": "Zapísané: {logged}", + "over by {amount}": "prekročené o {amount}", + "Time tracking": "Evidencia času", + "Estimate": "Odhad", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Zadajte platný odhad (napr. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Zadajte platné trvanie (napr. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Záznam času sa nepodarilo uložiť. Skúste to znova.", + "Edit time entry": "Upraviť záznam času", + "Duration": "Trvanie", + "Date range": "Obdobie", + "Last week": "Minulý týždeň", + "No time logged": "Žiadny zapísaný čas", + "Log time on a task to see it here.": "Zapíšte čas k úlohe, aby ste ho tu videli.", + "To date": "Do dátumu", + "This week": "Tento týždeň", + "Total: {total}": "Spolu: {total}", + "From date": "Od dátumu", + "Custom range": "Vlastné obdobie", + "All time": "Celé obdobie", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Úlohu sa nepodarilo odstrániť, takže môžu zostať údaje. Odstráňte projekt znova.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Záznam času sa nepodarilo odstrániť, takže môžu zostať údaje. Odstráňte projekt znova.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Stĺpec sa nepodarilo odstrániť, takže môžu zostať údaje. Odstráňte projekt znova.", + "Could not delete the project. Please try again.": "Projekt sa nepodarilo odstrániť. Skúste to znova.", + "Notification settings": "Nastavenia upozornení", + "Configure when due-date reminders are sent": "Nastavte, kedy sa posielajú pripomienky termínov", + "Due-date reminder lead time (hours)": "Predstih pripomienky termínu (hodiny)", + "Lead time must be between 1 and 336 hours": "Predstih musí byť medzi 1 a 336 hodinami", + "Reminder lead time saved successfully": "Predstih pripomienky uložený", + "Failed to save reminder lead time": "Predstih pripomienky sa nepodarilo uložiť", + "Notifications": "Upozornenia", + "Notify me 1 day before a task's due date": "Upozorniť ma 1 deň pred termínom úlohy", + "Draft": "Koncept", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Či je hodina koncept, ktorý vidí len jej učiteľ, koná sa, alebo je zrušená.", + "New release": "Nové vydanie", + "Roadmap chart. The same releases and epics are listed below.": "Graf plánu. Rovnaké vydania a eposy sú uvedené nižšie.", + "Nothing on the roadmap yet": "Na pláne zatiaľ nič nie je", + "Releases with a target date and epics with dated tasks appear here.": "Tu sa zobrazujú vydania s cieľovým dátumom a eposy s úlohami, ktoré majú dátum.", + "Releases": "Vydania", + "No releases yet": "Zatiaľ žiadne vydania", + "Target date: {date}": "Cieľový dátum: {date}", + "No target date": "Bez cieľového dátumu", + "Edit {name}": "Upraviť {name}", + "Mark {name} as released": "Označiť {name} ako vydané", + "Mark as released": "Označiť ako vydané", + "Epics": "Eposy", + "No epics yet. Open a task to make it an epic.": "Zatiaľ žiadne eposy. Otvorte úlohu a urobte z nej epos.", + "Not scheduled yet": "Zatiaľ nenaplánované", + "Planned": "Plánované", + "Released": "Vydané", + "Edit release": "Upraviť vydanie", + "Target date": "Cieľový dátum", + "Could not save the release. Please try again.": "Vydanie sa nepodarilo uložiť. Skúste to znova.", + "Every task of this release is done or cancelled.": "Každá úloha tohto vydania je hotová alebo zrušená.", + "Not finished yet: {count}": "Zatiaľ nedokončené: {count}", + "What happens to these tasks?": "Čo sa stane s týmito úlohami?", + "Move to {name}": "Presunúť do {name}", + "Remove the release": "Odstrániť vydanie", + "Keep it on {name}": "Ponechať ich v {name}", + "Could not mark the release as released. Please try again.": "Vydanie sa nepodarilo označiť ako vydané. Skúste to znova.", + "Roadmap": "Plán", + "Tasks or roadmap": "Úlohy alebo plán", + "Release": "Vydanie", + "Epic": "Epos", + "This task is an epic": "Táto úloha je epos", + "A named, dated delivery of a project that its tasks are planned against.": "Pomenovaná dodávka projektu s dátumom, na ktorú sa plánujú jeho úlohy.", + "Name of the release": "Názov vydania", + "The project this release belongs to": "Projekt, ku ktorému toto vydanie patrí", + "What this release delivers": "Čo toto vydanie dodáva", + "When work on the release starts": "Kedy sa začína práca na vydaní", + "The date the release is due": "Dátum, kedy má byť vydanie hotové", + "Whether the release is planned, released or archived": "Či je vydanie plánované, vydané alebo archivované", + "Released on": "Vydané dňa", + "When the release was marked as released": "Kedy bolo vydanie označené ako vydané", + "The release this task is planned for": "Vydanie, pre ktoré je táto úloha naplánovaná", + "Board view options": "Možnosti zobrazenia nástenky", + "Colour cards": "Zafarbiť karty", + "No colour": "Bez farby", + "By label": "Podľa štítka", + "Swimlanes": "Plavecké dráhy", + "No swimlanes": "Bez plaveckých dráh", + "By assignee": "Podľa riešiteľa", + "By epic": "Podľa eposu", + "No assignee": "Nepriradené", + "No epic": "Bez eposu", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Karty zostávajú v riadku svojho eposu. Epos zmeňte na stránke úlohy.", + "Hand over to": "Odovzdať", + "Could not save your board view. It applies until you reload.": "Zobrazenie nástenky sa nepodarilo uložiť. Platí do opätovného načítania.", + "Timetable wish": "Želanie k rozvrhu", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Želanie, ktoré generátor zohľadňuje. Pevné želanie dodrží vždy, mäkké tam, kde môže.", + "Whether the wish is about a teacher, a group, a room or one activity": "Či sa želanie týka učiteľa, skupiny, miestnosti alebo jednej činnosti", + "Teacher": "Učiteľ", + "Group": "Skupina", + "Reference": "Odkaz", + "The user, group, room or activity the wish is about": "Používateľ, skupina, miestnosť alebo činnosť, ktorej sa želanie týka", + "What the wish asks for": "Čo želanie žiada", + "Not on these periods": "Nie v týchto hodinách", + "Preferably not on these periods": "Radšej nie v týchto hodinách", + "At most a number of lessons a day": "Najviac určitý počet hodín denne", + "No free periods between lessons": "Žiadne voľné hodiny medzi hodinami", + "Always the same room": "Vždy tá istá miestnosť", + "Periods": "Hodiny", + "The periods of the week the wish is about, such as wed-5": "Hodiny týždňa, ktorých sa želanie týka, napr. wed-5", + "Limit": "Limit", + "The most lessons a day, for a wish of that kind": "Najviac hodín denne, pre želanie tohto druhu", + "Strength": "Sila", + "Whether the generator must keep the wish or should keep it": "Či generátor musí, alebo by mal želanie dodržať", + "Hard": "Pevné", + "Soft": "Mäkké", + "Weight": "Váha", + "How much a soft wish counts, from 1 to 3": "Ako veľmi mäkké želanie váži, od 1 do 3", + "Why the wish exists": "Prečo želanie existuje", + "Timetable scenario": "Scenár rozvrhu", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jeden týždenný vzor, vytvorený generátorom alebo prevzatý zo súčasného rozvrhu. Uchováva svoj vstup a ako dobre dodržiava želania.", + "The name timetablers know the scenario by": "Názov, pod ktorým tvorcovia rozvrhu scenár poznajú", + "Whether the generator made it or it came from the current timetable": "Či ho vytvoril generátor, alebo pochádza zo súčasného rozvrhu", + "Generated": "Vygenerované", + "From the current timetable": "Zo súčasného rozvrhu", + "Week of": "Týždeň od", + "The Monday of the first week of the window": "Pondelok prvého týždňa obdobia", + "Window start": "Začiatok obdobia", + "The first day the week pattern applies to": "Prvý deň, pre ktorý týždenný vzor platí", + "Window end": "Koniec obdobia", + "The last day the week pattern applies to": "Posledný deň, pre ktorý týždenný vzor platí", + "Waiting, generating, done, failed, or published as draft lessons": "Čaká, generuje sa, hotovo, zlyhalo alebo zverejnené ako koncepty hodín", + "Waiting": "Čaká", + "Generating": "Generuje sa", + "Failed": "Zlyhalo", + "Published": "Zverejnené", + "Seed": "Semienko", + "The number the generator starts from, so a run can be repeated": "Číslo, od ktorého generátor začína, aby sa beh dal zopakovať", + "Input": "Vstup", + "The periods, rooms, lessons and wishes the scenario was made from": "Hodiny, miestnosti, vyučovacie hodiny a želania, z ktorých scenár vznikol", + "Placements": "Umiestnenia", + "Each lesson with the period and room it was given": "Každá vyučovacia hodina s hodinou a miestnosťou, ktoré dostala", + "Unplaced lessons": "Neumiestnené hodiny", + "Lessons without a place, each with the hard wish that blocked it": "Hodiny bez miesta, každá s pevným želaním, ktoré ju zablokovalo", + "Broken wishes": "Porušené želania", + "The wishes this scenario breaks, with the lessons that break them": "Želania, ktoré tento scenár porušuje, s hodinami, ktoré ich porušujú", + "Measures": "Ukazovatele", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Umiestnené hodiny, porušené želania, voľné hodiny učiteľov, hodiny denne a využitie miestností", + "Reason": "Dôvod", + "Why the run failed": "Prečo beh zlyhal", + "Published at": "Zverejnené", + "When the scenario was written out as draft lessons": "Kedy bol scenár zapísaný ako koncepty hodín", + "Edit wish": "Upraviť želanie", + "New wish": "Nové želanie", + "Hard: the generator always keeps it": "Pevné: generátor ho vždy dodrží", + "Soft: the generator keeps it where it can": "Mäkké: generátor ho dodrží, kde sa dá", + "Weight (1 to 3)": "Váha (1 až 3)", + "Most lessons a day": "Najviac hodín denne", + "Period": "Hodina", + "{day} period {number}": "{day} hodina {number}", + "Teacher (user name)": "Učiteľ (používateľské meno)", + "Activity (group:subject)": "Aktivita (skupina:predmet)", + "Say who or what the wish is about.": "Uveďte, koho alebo čoho sa želanie týka.", + "Choose at least one period.": "Vyberte aspoň jednu hodinu.", + "The limit is a whole number of 1 or more.": "Limit je celé číslo 1 alebo viac.", + "Timetable": "Rozvrh", + "Wishes": "Želania", + "Timetable wishes": "Želania k rozvrhu", + "Generator run": "Beh generátora", + "Generator progress": "Priebeh generátora", + "The run failed: {reason}": "Beh zlyhal: {reason}", + "{placed} of {lessons} lessons placed": "Umiestnených {placed} z {lessons} hodín", + "Generate again": "Generovať znova", + "Generate": "Generovať", + "Every lesson has a place.": "Každá hodina má miesto.", + "Lesson": "Hodina", + "No free period and room": "Žiadna voľná hodina a učebňa", + "Broken soft wishes": "Porušené mäkké želania", + "Every soft wish is kept.": "Každé mäkké želanie je dodržané.", + "Wish": "Želanie", + "Lessons": "Hodiny", + "Generating: {percent}% of the time budget used": "Generovanie: využitých {percent} % času", + "Waiting to start": "Čaká na spustenie", + "Published as draft lessons": "Zverejnené ako koncepty hodín", + "Could not read the scenario.": "Scenár sa nepodarilo načítať.", + "Could not start the run.": "Beh sa nepodarilo spustiť.", + "Scenarios": "Scenáre", + "Timetable scenarios": "Scenáre rozvrhu", + "Scenario": "Scenár", + "Take the current timetable": "Prevziať aktuálny rozvrh", + "Could not take the current timetable.": "Aktuálny rozvrh sa nepodarilo prevziať.", + "Broken hard wishes": "Porušené záväzné priania", + "Not on a period of the week grid": "Nie je na hodine týždennej mriežky", + "Compare scenarios": "Porovnať scenáre", + "Scenarios to compare": "Scenáre na porovnanie", + "Choose two or three scenarios to compare them.": "Vyberte dva alebo tri scenáre na porovnanie.", + "Measure": "Ukazovateľ", + "Best": "Najlepšie", + "Lessons that differ": "Hodiny, ktoré sa líšia", + "No lesson differs.": "Žiadna hodina sa nelíši.", + "Not placed": "Neumiestnené", + "{period} in {room}": "{period} v {room}", + "Lessons placed": "Umiestnené hodiny", + "Lessons without a place": "Hodiny bez miesta", + "Clashes": "Kolízie", + "Hard wishes broken": "Porušené pevné želania", + "Soft wishes broken": "Porušené mäkké želania", + "Soft wishes broken, weighted": "Porušené mäkké želania, vážené", + "Free periods between lessons, all teachers": "Voľné hodiny, všetci učitelia", + "Most free periods of one teacher": "Najviac voľných hodín jedného učiteľa", + "Most lessons of one group on a day": "Najviac hodín jednej skupiny za deň", + "Room use": "Využitie učební", + "Publish as draft lessons": "Zverejniť ako koncepty hodín", + "Draft lessons written: {count}": "Zapísané koncepty hodín: {count}", + "Could not publish the scenario.": "Scenár sa nepodarilo zverejniť.", + "Rules": "Pravidlá", + "Rules for {column}": "Pravidlá pre {column}", + "When a card enters this column": "Keď karta vstúpi do tohto stĺpca", + "Action": "Akcia", + "Set the priority": "Nastaviť prioritu", + "Assign to": "Priradiť", + "Assign the person who moved the card": "Priradiť osobe, ktorá kartu presunula", + "Remove the assignee": "Odobrať riešiteľa", + "Add a label": "Pridať štítok", + "No longer a project member": "Už nie je členom projektu", + "This label no longer exists": "Tento štítok už neexistuje", + "Add rule": "Pridať pravidlo", + "Remove rule": "Odobrať pravidlo", + "No rules yet. Add one to change a card when it enters this column.": "Zatiaľ žiadne pravidlá. Pridajte pravidlo, ktoré zmení kartu, keď vstúpi do tohto stĺpca.", + "Could not save the rules. Please try again.": "Pravidlá sa nepodarilo uložiť. Skúste to znova.", + "1 rule runs when a card enters this column": "1 pravidlo sa spustí, keď karta vstúpi do tohto stĺpca", + "{count} rules run when a card enters this column": "Počet pravidiel, ktoré sa spustia, keď karta vstúpi do tohto stĺpca: {count}", + "Rules applied: {changes}": "Použité pravidlá: {changes}", + "assigned to {name}": "priradené: {name}", + "assignee removed": "riešiteľ odobratý", + "priority {priority}": "priorita {priority}", + "label {label}": "štítok {label}", + "What happens to a card when it enters this column, applied in list order.": "Čo sa stane s kartou, keď vstúpi do tohto stĺpca, v poradí zoznamu.", + "Value": "Hodnota", + "What the rule does to the card.": "Čo pravidlo urobí s kartou.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Priorita, ID používateľa alebo ID štítka, ktoré akcia používa; prázdne pri akciách bez hodnoty.", + "is not": "nie je", + "{dimension} is not": "{dimension} nie je", + "Saved filters": "Uložené filtre", + "No saved filters yet": "Zatiaľ žiadne uložené filtre", + "Save filter": "Uložiť filter", + "Rename \"{name}\"": "Premenovať „{name}“", + "Delete \"{name}\"": "Odstrániť „{name}“", + "Clear filters": "Zrušiť filtre", + "Showing {shown} of {total} tasks": "Zobrazené {shown} z {total} úloh", + "Me": "Ja", + "No date": "Bez dátumu", + "Rename saved filter": "Premenovať uložený filter", + "Share with the project": "Zdieľať s projektom", + "Give the filter a name": "Pomenujte filter", + "Could not save the filter. Please try again.": "Filter sa nepodarilo uložiť. Skúste to znova.", + "Some labels in \"{name}\" no longer exist and were left out.": "Niektoré štítky vo „{name}“ už neexistujú a boli vynechané.", + "Could not delete the filter. Please try again.": "Filter sa nepodarilo odstrániť. Skúste to znova.", + "Saved filter": "Uložený filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Pomenovaný filter nástenky jedného projektu, súkromný pre toho, kto ho uložil, ak nie je zdieľaný s projektom.", + "The project whose board the filter applies to": "Projekt, na ktorého nástenku sa filter vzťahuje", + "The name the filter is listed under": "Názov, pod ktorým je filter v zozname", + "Saved by": "Uložil(a)", + "Nextcloud user id of the person who saved the filter": "ID používateľa Nextcloud, ktorý filter uložil", + "Shared with the project": "Zdieľané s projektom", + "Whether every project member sees and applies the filter": "Či každý člen projektu filter vidí a môže ho použiť", + "Criteria": "Kritériá", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filter: riešiteľ, štítok, priorita a termín, každý s je alebo nie je a hodnotami", + "Cross-project view": "Medziprojektové zobrazenie", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Uložený výber projektov, ktorých úlohy sa zobrazujú spolu v stĺpcoch podľa stavu, zdieľaný s uvedenými ľuďmi.", + "Shared with": "Zdieľané s", + "The name the view is listed under": "Názov, pod ktorým je zobrazenie uvedené", + "Nextcloud user id of the person who saved the view": "ID používateľa Nextcloud osoby, ktorá zobrazenie uložila", + "Nextcloud user ids of the people the view is shared with": "ID používateľov Nextcloud osôb, s ktorými je zobrazenie zdieľané", + "The projects whose tasks the view shows, at most twenty": "Projekty, ktorých úlohy zobrazenie ukazuje, najviac dvadsať", + "1 project in this view is hidden from you.": "1 projekt v tomto zobrazení je pred vami skrytý.", + "{count} projects in this view are hidden from you.": "Projekty v tomto zobrazení skryté pred vami: {count}.", + "{project} has no column for {status}.": "Projekt {project} nemá stĺpec pre stav {status}.", + "This view does not exist or is not shared with you.": "Toto zobrazenie neexistuje alebo s vami nie je zdieľané.", + "\"{task}\" moved to {status}.": "\"{task}\" presunuté do {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Medziprojektové zobrazenia", + "New view": "Nové zobrazenie", + "Edit view": "Upraviť zobrazenie", + "Delete view": "Odstrániť zobrazenie", + "Give the view a name": "Pomenujte zobrazenie", + "Pick at least one project": "Vyberte aspoň jeden projekt", + "A view shows at most {max} projects": "Zobrazenie ukazuje najviac {max} projektov", + "Could not save the view. Please try again.": "Zobrazenie sa nepodarilo uložiť. Skúste to znova.", + "Could not delete the view. Please try again.": "Zobrazenie sa nepodarilo odstrániť. Skúste to znova.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Odstrániť „{title}“? Projekty a ich úlohy zostanú bez zmeny.", + "People see the tasks of the projects they are in, never more.": "Každý vidí iba úlohy projektov, v ktorých je.", + "No views yet. A view shows the tasks of several of your projects together.": "Zatiaľ žiadne zobrazenia. Zobrazenie ukazuje úlohy viacerých vašich projektov spolu.", + "Projects in view: {count}": "Projekty v zobrazení: {count}", + "Notify me when a task is assigned to me": "Upozorniť ma, keď mi bude pridelená úloha", + "Also send these to me by email": "Posielať mi ich aj e-mailom", + "Add an email address in your Nextcloud personal settings to get mail.": "Ak chcete dostávať e-maily, pridajte e-mailovú adresu v osobných nastaveniach Nextcloud.", + "Code link": "Odkaz na kód", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, vetva, žiadosť o zlúčenie alebo úloha na platforme pre kód, ktorá sa týka úlohy.", + "The task the link belongs to": "Úloha, ku ktorej odkaz patrí", + "The project of the task": "Projekt úlohy", + "Task key": "Kľúč úlohy", + "The task key the forge text named, such as VC-12": "Kľúč úlohy uvedený v texte platformy, napríklad VC-12", + "What the link points at": "Kam odkaz vedie", + "Link": "Odkaz", + "The address of the item in the forge": "Adresa položky na platforme pre kód", + "The commit message, branch name or merge request title": "Správa commitu, názov vetvy alebo názov žiadosti o zlúčenie", + "Repository": "Repozitár", + "The repository, such as acme/portal": "Repozitár, napríklad acme/portal", + "Forge id": "Id na platforme", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Vlastné id položky na platforme pre kód, napríklad github:acme/portal#42 alebo hash commitu", + "State": "Stav", + "The state of a merge request or issue": "Stav žiadosti o zlúčenie alebo úlohy", + "Who made the commit or opened the merge request": "Kto vytvoril commit alebo otvoril žiadosť o zlúčenie", + "When the commit was made or the merge request last changed": "Kedy bol commit vytvorený alebo sa žiadosť o zlúčenie naposledy zmenila", + "Added by": "Pridal", + "Whether a person added the link or the integration wrote it": "Či odkaz pridala osoba, alebo ho zapísala integrácia", + "Nextcloud user UIDs of project members": "ID používateľov Nextcloud členov projektu", + "Add link": "Pridať odkaz", + "Added by hand": "Pridané ručne", + "Branch": "Vetva", + "Code": "Kód", + "Commit": "Commit", + "From the integration": "Z integrácie", + "Link to a commit, branch or merge request": "Odkaz na commit, vetvu alebo žiadosť o zlúčenie", + "Merge request": "Žiadosť o zlúčenie", + "Merged": "Zlúčené", + "No code linked yet. Name {key} in a commit message or paste a link.": "Zatiaľ nie je prepojený žiadny kód. Uveďte {key} v správe commitu alebo vložte odkaz.", + "No code linked yet. Paste a link to a commit or merge request.": "Zatiaľ nie je prepojený žiadny kód. Vložte odkaz na commit alebo žiadosť o zlúčenie.", + "Paste a web address that starts with https://.": "Vložte webovú adresu, ktorá začína https://.", + "Remove link {title}": "Odstrániť odkaz {title}", + "The link could not be added.": "Odkaz sa nepodarilo pridať.", + "The link could not be removed.": "Odkaz sa nepodarilo odstrániť.", + "This link is already on the task.": "Tento odkaz už pri úlohe je.", + "Code forges": "Platformy pre kód", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Prepojte commity a pull requesty z GitHubu s úlohami. Integriq prijíma udalosti; planninq GitHub nikdy nevolá.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Stiahnite konfiguráciu a importujte ju do Integriq. Potom vyplňte tajomstvo v pravidle \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "V GitHube pridajte do repozitára webhook s touto adresou a rovnakým tajomstvom. Zvoľte typ obsahu application/json a udalosti push a pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Uveďte kľúč úlohy, napríklad VC-12, v správe commitu, názve vetvy alebo názve pull requestu. Odkaz sa potom zobrazí pri tejto úlohe.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriq môžu členovia projektu stále vložiť odkaz na stránke úlohy.", + "Download the Integriq configuration": "Stiahnuť konfiguráciu Integriq", + "Calendar": "Kalendár", + "Previous": "Predchádzajúci", + "Calendar view": "Zobrazenie kalendára", + "Starts:": "Začína:", + "No tasks with a date in this month.": "V tomto mesiaci nie sú žiadne úlohy s dátumom.", + "Week of {start} to {end}": "Týždeň od {start} do {end}", + "My calendar": "Môj kalendár", + "Show as list": "Zobraziť ako zoznam", + "Show as calendar": "Zobraziť ako kalendár", + "Open my calendar": "Otvoriť môj kalendár", + "Nextcloud Tasks": "Úlohy Nextcloud", + "Show my tasks in Nextcloud Tasks": "Zobraziť moje úlohy v Úlohách Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Úlohy pridelené vám alebo s vami zdieľané sa zobrazia v zozname \"Planninq\" v Úlohách a Kalendári Nextcloud. Zmeny urobené tam sa nahradia pri ďalšej zmene v Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Tento server nemôže zapisovať do Úloh Nextcloud, preto export nie je dostupný.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Spravované aplikáciou Planninq. Zmeny urobené tu sa nahradia pri ďalšej zmene v Planninq.", + "Working days and holidays": "Pracovné dni a sviatky", + "Dates set on the timeline skip the days that are not working days.": "Dátumy nastavené na časovej osi preskakujú dni, ktoré nie sú pracovné.", + "Working weekdays": "Pracovné dni v týždni", + "Non-working days": "Nepracovné dni", + "No non-working days yet.": "Zatiaľ žiadne nepracovné dni.", + "Add day": "Pridať deň", + "Year": "Rok", + "Add Dutch national holidays": "Pridať holandské štátne sviatky", + "Save working days": "Uložiť pracovné dni", + "Choose at least one working weekday.": "Vyberte aspoň jeden pracovný deň.", + "Working days saved.": "Pracovné dni uložené.", + "Could not save the working days.": "Pracovné dni sa nepodarilo uložiť.", + "New Year's Day": "Nový rok", + "Easter Sunday": "Veľkonočná nedeľa", + "Easter Monday": "Veľkonočný pondelok", + "King's Day": "Deň kráľa", + "Liberation Day": "Deň oslobodenia", + "Ascension Day": "Nanebovstúpenie Pána", + "Whit Sunday": "Turíce", + "Whit Monday": "Svätodušný pondelok", + "Christmas Day": "1. sviatok vianočný", + "Boxing Day": "2. sviatok vianočný", + "Dates of {title}": "Dátumy úlohy {title}", + "The due date cannot be before the start date.": "Termín nemôže byť pred dátumom začiatku.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Dátumy sa nepodarilo uložiť.", + "{title} now runs from {start} to {end}": "{title} teraz prebieha od {start} do {end}", + "Auto-scheduling": "Automatické plánovanie", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Ak je zapnuté, posunutie termínu na časovej osi ponúkne posunúť aj úlohy, ktoré blokuje.", + "Move blocked tasks along when a task slips": "Posúvať blokované úlohy, keď sa úloha oneskorí", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na časovej osi neskorší termín ponúkne posunúť blokované úlohy. Počítajú sa len väzby \"blokuje\" a úlohy sa posúvajú len neskôr.", + "Move the tasks that wait for {title}?": "Posunúť úlohy, ktoré čakajú na {title}?", + "These tasks wait for it and would start after its new due date:": "Tieto úlohy naň čakajú a začali by sa po novom termíne:", + "{count} tasks would move; the first {limit} are listed.": "Posunulo by sa {count} úloh; zobrazených je prvých {limit}.", + "Now": "Teraz", + "After the move": "Po posunutí", + "Only this task": "Len táto úloha", + "Move all": "Posunúť všetky", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Zastavené pri {title}: dátumy sa nepodarilo uložiť. Úlohy pred ním boli posunuté.", + "Cumulative flow": "Kumulatívny tok", + "Show as chart": "Zobraziť ako graf", + "Show as table": "Zobraziť ako tabuľku", + "Tasks per column per day": "Úlohy v stĺpci za deň", + "Tasks without recorded history in this period: {count}": "Úlohy bez zaznamenanej histórie v tomto období: {count}", + "Lead and cycle time": "Čas dodania a čas cyklu", + "No tasks were finished in this period.": "V tomto období nebola dokončená žiadna úloha.", + "Finished tasks": "Dokončené úlohy", + "Cycle time, average": "Čas cyklu, priemer", + "Cycle time, 85th percentile": "Čas cyklu, 85. percentil", + "Lead time, average": "Čas dodania, priemer", + "Tasks whose finish time was estimated from their history: {count}": "Úlohy, ktorých čas dokončenia bol odhadnutý z histórie: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Čas cyklu každej dokončenej úlohy s priemerom a 85. percentilom", + "Slowest tasks": "Najpomalšie úlohy", + "cycle {cycle}, lead {lead}": "cyklus {cycle}, dodanie {lead}", + "{days} days": "{days} dní", + "Could not load the flow of this project.": "Tok tohto projektu sa nepodarilo načítať.", + "Last {days} days": "Posledných {days} dní", + "Portfolio flow": "Tok portfólia", + "An admin adds portfolios under Projects, Portfolios.": "Správca pridáva portfóliá v Projekty, Portfóliá.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Nezobrazené projekty, pretože naraz sa zobrazuje najviac 50: {count}", + "Could not load the flow of this portfolio.": "Tok tohto portfólia sa nepodarilo načítať.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulatívny tok a čas cyklu naprieč projektmi portfólia.", + "Edit report": "Upraviť prehľad", + "Only tasks where": "Len úlohy, kde", + "Group by": "Zoskupiť podľa", + "Display": "Zobrazenie", + "Share with everyone who can read its projects": "Zdieľať so všetkými, ktorí môžu čítať jeho projekty", + "The report could not be saved.": "Prehľad sa nepodarilo uložiť.", + "Number of tasks": "Počet úloh", + "Bar": "Stĺpce", + "Donut": "Prstenec", + "Table": "Tabuľka", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} z {total} projektov v tomto prehľade pre vás nie je viditeľných", + "No tasks match this report.": "Tomuto prehľadu nezodpovedá žiadna úloha.", + "None": "Žiadne", + "Could not load this report.": "Tento prehľad sa nepodarilo načítať.", + "Report": "Prehľad", + "Your reports": "Vaše prehľady", + "My reports": "Moje prehľady", + "Shared reports": "Zdieľané prehľady", + "You have not built a report yet.": "Zatiaľ ste nevytvorili žiadny prehľad.", + "Nobody has shared a report with you yet.": "Zatiaľ s vami nikto nezdieľal prehľad.", + "Reports you built over tasks, and the ones shared with you.": "Prehľady, ktoré ste vytvorili nad úlohami, a tie, ktoré s vami zdieľali.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Uložený dopyt nad úlohami: ktoré projekty, ktoré filtre, zoskupenie podľa čoho, počet alebo súčet, zobrazený ako tabuľka alebo graf.", + "The name the report is listed under": "Názov, pod ktorým je prehľad uvedený", + "What the report shows and who it is for": "Čo prehľad ukazuje a pre koho je", + "Nextcloud user id of the person who saved the report": "ID používateľa Nextcloud, ktorý prehľad uložil", + "Who can open the report": "Kto môže prehľad otvoriť", + "Only me": "Len ja", + "Everyone who can read its projects": "Všetci, ktorí môžu čítať jeho projekty", + "The projects the report covers, at most fifty": "Projekty, ktoré prehľad zahŕňa, najviac päťdesiat", + "Filters": "Filtre", + "Task fields and the value each must equal": "Polia úlohy a hodnota, ktorej sa každé musí rovnať", + "The task field the report groups on": "Pole úlohy, podľa ktorého prehľad zoskupuje", + "Count the tasks, or add up a number on them": "Spočítať úlohy, alebo sčítať číslo na nich", + "Sum": "Súčet", + "Sum of": "Súčet poľa", + "The number added up when the measure is a sum": "Číslo, ktoré sa sčíta, keď je miera súčet", + "Story points": "Body príbehu", + "Estimated duration": "Odhadovaná doba", + "How the report is shown": "Ako sa prehľad zobrazuje", + "Issue type": "Typ požiadavky", + "Task fields and the value each must equal; empty when the report covers every task": "Polia úlohy a hodnota, ktorú musí každé mať; prázdne, keď prehľad zahŕňa všetky úlohy", + "The status a task must have": "Stav, ktorý musí úloha mať", + "The priority a task must have": "Priorita, ktorú musí úloha mať", + "The user a task must be assigned to": "Používateľ, ktorému musí byť úloha pridelená", + "A label a task must carry": "Štítok, ktorý musí úloha mať", + "The board column a task must be in": "Stĺpec tabule, v ktorom musí úloha byť", + "The issue type a task must have": "Typ požiadavky, ktorý musí úloha mať", + "Manager groups": "Skupiny správcov", + "Member groups": "Skupiny členov", + "Viewer groups": "Skupiny čitateľov", + "Viewers": "Čitatelia", + "Owning group": "Vlastnícka skupina", + "Nextcloud groups whose members manage the project": "Skupiny Nextcloud, ktorých členovia spravujú projekt", + "Nextcloud groups whose members work on the project": "Skupiny Nextcloud, ktorých členovia na projekte pracujú", + "Nextcloud groups whose members may read the project": "Skupiny Nextcloud, ktorých členovia môžu projekt čítať", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Používatelia Nextcloud, ktorí spravujú projekt: nastavenia, členov a prácu", + "Nextcloud user ids who may read the project and its work but not change it": "Používatelia Nextcloud, ktorí môžu čítať projekt a jeho prácu, ale nie meniť", + "The Nextcloud group that owns the project with its creator, at most one": "Skupina Nextcloud, ktorá vlastní projekt spolu s jeho tvorcom, najviac jedna", + "Nextcloud user ids who may read this through the project": "Používatelia Nextcloud, ktorí to môžu čítať cez projekt", + "Nextcloud groups whose members may change this through the project": "Skupiny Nextcloud, ktorých členovia to môžu meniť cez projekt", + "Nextcloud groups whose members may read this through the project": "Skupiny Nextcloud, ktorých členovia to môžu čítať cez projekt", + "Search for a person or a group…": "Hľadať osobu alebo skupinu…", + "No one found. Your admin's sharing settings decide who you can find.": "Nikto sa nenašiel. Nastavenia zdieľania vášho správcu určujú, koho môžete nájsť.", + "Type at least two characters": "Zadajte aspoň dva znaky", + "Everyone in this group": "Všetci v tejto skupine", + "Could not search for people. Please try again.": "Vyhľadávanie osôb zlyhalo. Skúste to znova.", + "Could not remove the group": "Skupinu sa nepodarilo odstrániť", + "Only the owner and managers change who is on this project.": "Kto je v tomto projekte, mení len vlastník a správcovia.", + "Role of {name}": "Rola: {name}", + "Manager": "Správca", + "Member": "Člen", + "Viewer": "Čitateľ", + "Could not change the role": "Rolu sa nepodarilo zmeniť", + "Owned by group: {name}": "Vo vlastníctve skupiny: {name}", + "No group owns this project.": "Tento projekt nevlastní žiadna skupina.", + "Owned by group": "Vo vlastníctve skupiny", + "Search for a group…": "Hľadať skupinu…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nenašla sa žiadna skupina. Nastavenia zdieľania vášho správcu určujú, ktoré skupiny môžete nájsť.", + "No owning group": "Žiadna vlastnícka skupina", + "Could not search for groups. Please try again.": "Skupiny sa nepodarilo vyhľadať. Skúste to znova.", + "Could not change the owning group": "Vlastnícku skupinu sa nepodarilo zmeniť", + "You can read this project. Only its members change it.": "Tento projekt môžete čítať. Meniť ho môžu len jeho členovia.", + "Course": "Kurz", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurz, ktorý sa na tejto hodine vyučuje, napríklad voliteľný predmet, ak ho školská výučbová aplikácia pozná.", + "Online meeting link": "Odkaz na online hodinu", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kde sa žiaci k tejto hodine pripoja online. Tlačidlo Pripojiť sa zobrazí len pri odkaze https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sk.json b/l10n/sk.json index 21dcabfa..f9aaad7f 100644 --- a/l10n/sk.json +++ b/l10n/sk.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktívne projekty", + "Archived projects": "Archivované projekty", + "Boards": "Nástenky", + "My projects": "Moje projekty", + "Portfolio": "Portfólio", + "Project board": "Nástenka projektu", + "Projects I am in": "Projekty, na ktorých sa podieľam", + "Timeline": "Časová os", + "Timesheet": "Výkaz práce", + "Features & roadmap": "Funkcie a plán vývoja", + "Flow": "Tok", + "Flows": "Toky", + "Reports": "Zostavy", + "Pick a report to open it.": "Vyberte zostavu, ktorú chcete otvoriť.", + "In progress": "Prebieha", + "Date": "Dátum", + "Due": "Termín", + "Assignee": "Priradené", + "Who": "Kto", + "What": "Čo", + "Minutes": "Minúty", + "Entries": "Záznamy", + "Most recent": "Najnovšie", + "Per person": "Na osobu", + "By status": "Podľa stavu", + "By priority": "Podľa priority", + "Task status": "Stav úloh", + "Time spent": "Strávený čas", + "Capacity": "Kapacita", + "Due soonest": "Najskôr splatné", + "Minutes logged": "Zaznamenané minúty", + "Nothing is due": "Nič nie je splatné", + "Nothing logged yet": "Zatiaľ nič nezaznamenané", + "What is open, what is blocked, and what is overdue.": "Čo je otvorené, čo blokované a čo po termíne.", + "How allocation is spread across the people working on projects.": "Ako je vyťaženie rozložené medzi ľudí pracujúcich na projektoch.", + "Hours logged, and the projects they went to.": "Zaznamenané hodiny a projekty, do ktorých šli.", + "Billable": "Fakturovateľné", + "Budget: {amount}": "Rozpočet: {amount}", + "Loading projects": "Načítavajú sa projekty", + "No projects for this client yet": "Pre tohto klienta zatiaľ nie sú žiadne projekty", + "Open in Planninq": "Otvoriť v Planninq", + "This project could not be found": "Tento projekt sa nenašiel", + "Untitled project": "Projekt bez názvu", + "and {count} more": "a ďalšie {count}", + "Store": "Obchod", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Nainštalujte registre, schémy a toky zverejnené inými organizáciami.", + "Work Date": "Dátum práce", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Akcie stĺpca", + "Columns": "Stĺpce", + "Could not remove the column. Please try again.": "Stĺpec sa nepodarilo odstrániť. Skúste to znova.", + "Could not save the column. Please try again.": "Stĺpec sa nepodarilo uložiť. Skúste to znova.", + "Done column": "Stĺpec hotovo", + "Edit column": "Upraviť stĺpec", + "Keep the card's status": "Zachovať stav karty", + "Move its cards to": "Presunúť jeho karty do", + "Move left": "Posunúť doľava", + "Move right": "Posunúť doprava", + "Status of cards moved here": "Stav kariet presunutých sem", + "The last done column cannot be removed.": "Posledný stĺpec hotovo nemožno odstrániť.", + "WIP limit": "Limit WIP", + "over limit": "nad limitom", + "The status a card gets when it is moved into this column.": "Stav, ktorý karta získa po presunutí do tohto stĺpca.", + "All priorities": "Všetky priority", + "Could not create the task. Please try again.": "Úlohu sa nepodarilo vytvoriť. Skúste to znova.", + "Created": "Vytvorené", + "Move to backlog": "Do backlogu", + "Move to board": "Na nástenku", + "New task": "Nová úloha", + "Nothing in the backlog": "Backlog je prázdny", + "Rank": "Poradie", + "Sort by": "Zoradiť podľa", + "Sort by rank to reorder": "Na zmenu poradia zoraďte podľa poradia", + "Task actions": "Akcie úlohy", + "All labels": "Všetky štítky", + "Filter tasks by label": "Filtrovať úlohy podľa štítka", + "View timeline": "Zobraziť časovú os", + "Board": "Nástenka", + "List": "Zoznam", + "Column": "Stĺpec", + "Board or list": "Nástenka alebo zoznam", + "Log": "Denník", + "Add entry": "Pridať záznam", + "Show": "Zobraziť", + "No actions yet": "Zatiaľ žiadne akcie", + "Closed": "Uzavreté", + "Entry actions": "Akcie záznamu", + "Add action": "Pridať akciu", + "by {author}": "autor {author}", + "saved {time}": "uložené {time}", + "Attendees: {names}": "Účastníci: {names}", + "Add the first entry": "Pridať prvý záznam", + "Issues": "Problémy", + "Lessons learned": "Poučenia", + "Meetings": "Stretnutia", + "Decisions": "Rozhodnutia", + "Actions": "Akcie", + "Issue": "Problém", + "Lesson learned": "Poučenie", + "Meeting": "Stretnutie", + "Decision": "Rozhodnutie", + "About this project": "O tomto projekte", + "No description yet": "Zatiaľ bez popisu", + "Start date": "Dátum začiatku", + "Not set": "Nenastavené", + "End date": "Dátum ukončenia", + "Progress": "Postup", + "No tasks yet": "Zatiaľ žiadne úlohy", + "Open the board": "Otvoriť nástenku", + "People": "Ľudia", + "Owner": "Vlastník", + "Latest log entries": "Najnovšie záznamy", + "Open the log": "Otvoriť denník", + "{done} of {total} tasks done": "Hotovo {done} z {total} úloh", + "Edit entry": "Upraviť záznam", + "Type": "Druh", + "Attendees": "Účastníci", + "Issue is closed": "Problém je uzavretý", + "Could not save the entry. Please try again.": "Záznam sa nepodarilo uložiť. Skúste to znova.", + "From: {title}": "Z: {title}", + "What needs to happen": "Čo treba urobiť", + "Could not create the action. Please try again.": "Akciu sa nepodarilo vytvoriť. Skúste to znova.", + "The action was created but could not be linked to the entry.": "Akcia bola vytvorená, ale nepodarilo sa ju prepojiť so záznamom.", + "Project pages": "Stránky projektu", + "Overview": "Prehľad", + "Risks": "Riziká", + "Log entry": "Záznam denníka", + "A short name for the entry": "Krátky názov záznamu", + "Project": "Projekt", + "The project this entry belongs to": "Projekt, ku ktorému záznam patrí", + "What kind of entry this is": "Aký je to druh záznamu", + "When it happened": "Kedy sa to stalo", + "What happened, in Markdown": "Čo sa stalo, v Markdowne", + "Whether an issue is still open": "Či je problém stále otvorený", + "The people at a meeting": "Ľudia na stretnutí", + "Tasks that came out of this entry": "Úlohy, ktoré vzišli z tohto záznamu", + "Add risk": "Pridať riziko", + "Risk": "Riziko", + "Score": "Skóre", + "Response": "Reakcia", + "Review date": "Dátum revízie", + "no longer on the project": "už nie je v projekte", + "Edit {title}": "Upraviť {title}", + "No risks recorded yet": "Zatiaľ žiadne zaznamenané riziká", + "Add the first risk": "Pridať prvé riziko", + "Medium": "Stredné", + "Mitigating": "Zmierňuje sa", + "Occurred": "Nastalo", + "Avoid": "Vyhnúť sa", + "Reduce": "Znížiť", + "Transfer": "Preniesť", + "Accept": "Prijať", + "Highest open risks": "Najvyššie otvorené riziká", + "No open risks": "Žiadne otvorené riziká", + "Open the risk register": "Otvoriť register rizík", + "Edit risk": "Upraviť riziko", + "What could go wrong": "Čo sa môže pokaziť", + "Likelihood": "Pravdepodobnosť", + "Impact": "Dopad", + "Score {score}": "Skóre {score}", + "Countermeasures": "Protiopatrenia", + "Could not save the risk. Please try again.": "Riziko sa nepodarilo uložiť. Skúste to znova.", + "Risks by likelihood and impact": "Riziká podľa pravdepodobnosti a dopadu", + "Risk scale": "Škála rizík", + "The levels every project scores its risks on, and where low turns into medium and high": "Úrovne, na ktorých každý projekt hodnotí svoje riziká, a kde nízke prechádza do stredného a vysokého", + "Number of levels": "Počet úrovní", + "Likelihood labels": "Označenia pravdepodobnosti", + "Impact labels": "Označenia dopadu", + "Level {level}": "Úroveň {level}", + "Medium from score": "Stredné od skóre", + "High from score": "Vysoké od skóre", + "Risk scale saved": "Škála rizík uložená", + "1 risk uses level {level}. Change it first.": "1 riziko používa úroveň {level}. Najprv ho zmeňte.", + "{count} risks use level {level}. Change them first.": "{count} rizík používa úroveň {level}. Najprv ich zmeňte.", + "Every level needs a label, and high must start above medium.": "Každá úroveň potrebuje označenie a vysoké musí začínať nad stredným.", + "The project this risk belongs to": "Projekt, ku ktorému riziko patrí", + "The cause and the effect, in Markdown": "Príčina a následok, v Markdowne", + "Category": "Kategória", + "A free grouping, such as planning, budget or supplier": "Voľné zoskupenie, napr. plánovanie, rozpočet alebo dodávateľ", + "How likely it is, on the admin's risk scale": "Aké je pravdepodobné, na škále rizík správcu", + "How hard it would hit, on the admin's risk scale": "Ako tvrdo by zasiahlo, na škále rizík správcu", + "Likelihood times impact, calculated by the server": "Pravdepodobnosť krát dopad, vypočítané serverom", + "Where the risk stands": "Ako je na tom riziko", + "The person who watches this risk": "Osoba, ktorá riziko sleduje", + "How the project answers the risk": "Ako projekt na riziko reaguje", + "What is done to prevent it or soften it, in Markdown": "Čo sa robí na jeho prevenciu alebo zmiernenie, v Markdowne", + "When to look at this risk again": "Kedy riziko znova posúdiť", + "Very low": "Veľmi nízke", + "Very high": "Veľmi vysoké", + "All projects": "Všetky projekty", + "Project status report": "Správa o stave projektu", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datovaná správa o tom, ako si projekt stojí v peniazoch, organizácii, čase, informáciách, kvalite a riziku (aspekty GROTIK), každý s poznámkou.", + "The project this report is about": "Projekt, ktorého sa správa týka", + "Report date": "Dátum správy", + "The day the report describes": "Deň, ktorý správa opisuje", + "Money": "Peniaze", + "How the project stands on this aspect": "Ako si projekt stojí v tomto aspekte", + "On track": "Podľa plánu", + "At risk": "Ohrozené", + "Off track": "Mimo plánu", + "Money note": "Poznámka k peniazom", + "A short explanation of this status": "Krátke vysvetlenie tohto stavu", + "Organisation": "Organizácia", + "Organisation note": "Poznámka k organizácii", + "Time": "Čas", + "Time note": "Poznámka k času", + "Information": "Informácie", + "Information note": "Poznámka k informáciám", + "Quality": "Kvalita", + "Quality note": "Poznámka ku kvalite", + "Risk note": "Poznámka k riziku", + "Overall": "Celkovo", + "The worst of the six statuses, calculated by the server": "Najhorší zo šiestich stavov, vypočítaný serverom", + "Health: money": "Stav: peniaze", + "Copied from the newest status report": "Prevzaté z najnovšej správy o stave", + "Health: organisation": "Stav: organizácia", + "Health: time": "Stav: čas", + "Health: information": "Stav: informácie", + "Health: quality": "Stav: kvalita", + "Health: risk": "Stav: riziko", + "Health: overall": "Stav: celkovo", + "Health: report date": "Stav: dátum správy", + "The date of the newest status report": "Dátum najnovšej správy o stave", + "New report": "Nová správa", + "Only the project owner writes status reports.": "Správy o stave píše iba vlastník projektu.", + "Latest report, {date}": "Posledná správa, {date}", + "Aspect": "Aspekt", + "Note": "Poznámka", + "Report history": "História správ", + "Author": "Autor", + "No status reports yet": "Zatiaľ žiadne správy o stave", + "Write the first report": "Napísať prvú správu", + "Choose a status for every aspect to save the report.": "Na uloženie správy zvoľte stav pri každom aspekte.", + "Suggested: on track.": "Návrh: podľa plánu.", + "Suggested: at risk.": "Návrh: ohrozené.", + "Suggested: off track.": "Návrh: mimo plánu.", + "1 task is past its due date.": "1 úloha je po termíne.", + "{count} tasks are past their due date.": "Úlohy po termíne: {count}.", + "The end date has passed with 1 open task.": "Dátum konca uplynul s 1 otvorenou úlohou.", + "The end date has passed with {count} open tasks.": "Dátum konca uplynul, otvorené úlohy: {count}.", + "No open task is past its due date.": "Žiadna otvorená úloha nie je po termíne.", + "The highest open risk, \"{title}\", scores {score}.": "Najvyššie otvorené riziko, \"{title}\", má skóre {score}.", + "There are no open risks.": "Nie sú žiadne otvorené riziká.", + "Costs are at {percent}% of the budget.": "Náklady sú na {percent}% rozpočtu.", + "No suggestion: the project has no budget.": "Bez návrhu: projekt nemá rozpočet.", + "No suggestion: no costs are recorded for this project yet.": "Bez návrhu: pre tento projekt zatiaľ nie sú zaznamenané žiadne náklady.", + "The report was not saved. Only the project owner can write status reports.": "Správa nebola uložená. Správy o stave môže písať iba vlastník projektu.", + "No report": "Žiadna správa", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Skupina projektov vedených tými istými ľuďmi, napríklad oddelenie alebo program. Jej správcovia čítajú každý projekt v nej.", + "The name of the portfolio": "Názov portfólia", + "What the portfolio holds and who runs it": "Čo portfólio obsahuje a kto ho vedie", + "A colour for the portfolio's section in project lists": "Farba sekcie portfólia v zoznamoch projektov", + "Managers": "Správcovia", + "Nextcloud user UIDs of the people who run the portfolio": "ID používateľov Nextcloud ľudí, ktorí portfólio vedú", + "Order": "Poradie", + "Where the portfolio comes in project lists, lowest first": "Kde je portfólio v zoznamoch projektov, od najnižšieho", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Vlastná škála rizík tohto portfólia ako JSON, v rovnakom tvare ako škála celej aplikácie. Prázdne znamená škálu aplikácie.", + "Portfolio readers": "Čitatelia portfólia", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID používateľov Nextcloud správcov portfólia projektu", + "The portfolio this project belongs to": "Portfólio, do ktorého projekt patrí", + "No portfolio": "Bez portfólia", + "All portfolios": "Všetky portfóliá", + "You read this project as a manager of its portfolio. Only its members change it.": "Tento projekt čítate ako správca jeho portfólia. Menia ho iba jeho členovia.", + "Portfolios": "Portfóliá", + "Portfolio status": "Stav portfólia", + "No portfolios yet": "Zatiaľ žiadne portfóliá", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Správca pridáva portfóliá v Projekty, Portfóliá. Projekty v portfóliu sú tu uvedené so svojím stavom.", + "Roll-up": "Súhrn", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} podľa plánu, {atRisk} ohrozené, {offTrack} mimo plánu, {noReport} bez správy", + "No project in this portfolio that you can read.": "V tomto portfóliu nie je projekt, ktorý môžete čítať.", + "Start": "Začiatok", + "End": "Koniec", + "Budget": "Rozpočet", + "Last report": "Posledná správa", + "Out of date": "Zastarané", + "Portfolio timeline": "Časová os portfólia", + "Zoom": "Priblíženie", + "Could not load the timeline": "Časovú os sa nepodarilo načítať", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Správca pridáva portfóliá v Projekty, Portfóliá. Projekty v portfóliu sú tu na jednej časovej osi.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Otvorte projekt a uvidíte jeho fázy a úlohy. Časová os je len na čítanie.", + "Phase: {title}": "Fáza: {title}", + "Left out because you cannot read them: {count} projects": "Vynechané, lebo ich nemôžete čítať: {count} projektov", + "Week": "Týždeň", + "Day": "Deň", + "Month": "Mesiac", + "Please try again later.": "Skúste to neskôr.", + "Status reports": "Správy o stave", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Po koľkých dňoch sa posledná správa o stave projektu označí v prehľade portfólia ako zastaraná", + "Reporting period (days)": "Obdobie vykazovania (dni)", + "The reporting period is a whole number of days from 1 to 365.": "Obdobie vykazovania je celý počet dní od 1 do 365.", + "Reporting period saved": "Obdobie vykazovania uložené", + "The reporting period was not saved. Please try again.": "Obdobie vykazovania sa neuložilo. Skúste to znova.", + "Every project of a portfolio with its status per aspect, rolled up.": "Každý projekt portfólia so stavom podľa aspektov, zhrnutý.", + "The projects of a portfolio on one timeline.": "Projekty portfólia na jednej časovej osi.", + "Phases": "Fázy", + "Add phase": "Pridať fázu", + "No phases yet": "Zatiaľ žiadne fázy", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Rozdeľte projekt do fáz, napríklad iniciácia, definícia a realizácia. Fáza sa uzavrie, keď je nahraný jej záverečný dokument.", + "{hours} hours": "{hours} hodín", + "Concluding document: {title}": "Záverečný dokument: {title}", + "Concluding document missing": "Chýba záverečný dokument", + "Move {title} up": "Posunúť {title} nahor", + "Move {title} down": "Posunúť {title} nadol", + "Close phase": "Uzavrieť fázu", + "Phase": "Fáza", + "Files": "Súbory", + "Notes": "Poznámky", + "Audit trail": "Auditný záznam", + "Edit phase": "Upraviť fázu", + "Name": "Názov", + "Budget hours": "Rozpočtované hodiny", + "Could not save the phase. Please try again.": "Fázu sa nepodarilo uložiť. Skúste to znova.", + "Close phase {title}": "Uzavrieť fázu {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Fáza sa uzatvára záverečným dokumentom: nahrajte ho sem alebo vyberte jeden zo súborov fázy.", + "Concluding document": "Záverečný dokument", + "This phase has no files yet.": "Táto fáza zatiaľ nemá súbory.", + "Upload a document": "Nahrať dokument", + "The document was not uploaded. Please try again.": "Dokument sa nenahral. Skúste to znova.", + "Upload the concluding document before you close this phase.": "Pred uzavretím tejto fázy nahrajte záverečný dokument.", + "This phase cannot be closed from its current status.": "Túto fázu nemožno uzavrieť z jej aktuálneho stavu.", + "The phase was not closed. Please try again.": "Fáza nebola uzavretá. Skúste to znova.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID súboru tejto fázy, ktorý ju uzatvára. Fázu možno dokončiť, až keď je vyplnené a súbor je priložený.", + "Import from Microsoft Project": "Importovať z Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Vyberte plán uložený z Microsoft Project vo formáte XML. Nič sa neimportuje, kým nepotvrdíte.", + "Plan file": "Súbor plánu", + "What the import creates": "Čo import vytvorí", + "Tasks": "Úlohy", + "Sub-tasks": "Podúlohy", + "Milestones": "Míľniky", + "Links": "Prepojenia", + "Already imported, updated in place: {count}": "Už importované, aktualizované na mieste: {count}", + "What does not carry over": "Čo sa neprenesie", + "Tasks with resources, which are not imported: {count}": "Úlohy so zdrojmi, ktoré sa neimportujú: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Úlohy hlbšie ako úroveň 3, umiestnené pod svoju úlohu úrovne 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Prepojenia iné ako koniec-začiatok, importované ako súvisiace prepojenia: {count}", + "Link lags, which are dropped: {count}": "Oneskorenia prepojení, ktoré sa vypúšťajú: {count}", + "Links to a summary task, which are not imported: {count}": "Prepojenia na súhrnnú úlohu, ktoré sa neimportujú: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Prepojenia na úlohy mimo tohto plánu, ktoré sa neimportujú: {count}", + "No longer in the plan": "Už nie je v pláne", + "These stay in the project; remove them yourself if they are no longer needed.": "Zostávajú v projekte; odstráňte ich sami, ak už nie sú potrebné.", + "Import": "Importovať", + "Close": "Zavrieť", + "The plan is imported: {created} created, {updated} updated.": "Plán je importovaný: vytvorené {created}, aktualizované {updated}.", + "Links that would close a loop were left out: {count}": "Prepojenia, ktoré by uzavreli slučku, boli vynechané: {count}", + "The import stopped part-way. Run it again to finish it.": "Import sa zastavil v polovici. Spustite ho znova, aby ste ho dokončili.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Uložte plán v Microsoft Project cez Súbor, Uložiť ako, formát XML, a importujte tento súbor.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Tento súbor deklaruje DOCTYPE alebo entity, ktoré sa neprijímajú.", + "The file is larger than 10 MB.": "Súbor je väčší ako 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plán má viac ako 2 000 úloh, viac, ako prijme jeden import.", + "This file is not a Microsoft Project plan in XML format.": "Tento súbor nie je plán Microsoft Project vo formáte XML.", + "Choose a file to import.": "Vyberte súbor na import.", + "Only the project owner can import a plan.": "Plán môže importovať iba vlastník projektu.", + "The plan could not be read. Please try again.": "Plán sa nepodarilo prečítať. Skúste to znova.", + "Linked case: {title}": "Prepojený spis: {title}", + "Linked to a case": "Prepojené so spisom", + "Hand over to case": "Odovzdať do spisu", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Bez zmeny skopíruje každý súbor projektu a jeho úloh a súbor opisujúci projekt do prepojeného spisu.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Skopírované súbory: {count}", + "Files that failed: {names}": "Neúspešné súbory: {names}", + "The handover failed. Please try again.": "Odovzdanie zlyhalo. Skúste to znova.", + "The linked case could not be found, or you cannot open it.": "Prepojený spis sa nenašiel, alebo ho nemôžete otvoriť.", + "Case handovers": "Odovzdania do spisu", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Každé odovzdanie súborov a metadát projektu do jeho spisu: kedy, kým, do ktorého spisu, každý skopírovaný súbor s jeho SHA-256 a neúspešné súbory.", + "Finance": "Financie", + "Add cost line": "Pridať nákladovú položku", + "Delivery terms": "Dodacie podmienky", + "Billing model": "Model fakturácie", + "Budget in euro": "Rozpočet v eurách", + "Budget in hours": "Rozpočet v hodinách", + "Hourly rate in euro": "Hodinová sadzba v eurách", + "Planned start": "Plánovaný začiatok", + "Planned end": "Plánovaný koniec", + "Planned dates": "Plánované dátumy", + "Budget {amount}": "Rozpočet {amount}", + "No budget agreed": "Rozpočet nebol dohodnutý", + "Hours": "Hodiny", + "Only the project owner and the portfolio managers see the amounts.": "Sumy vidí len vlastník projektu a správcovia portfólia.", + "Budget against cost per category": "Rozpočet oproti nákladom podľa kategórie", + "Labour (booked time)": "Práca (vykázaný čas)", + "No category": "Bez kategórie", + "Hours are not available": "Hodiny nie sú k dispozícii", + "Not yet assigned to a category": "Zatiaľ nepriradené ku kategórii", + "Total": "Spolu", + "{spent} spent, {remaining} remaining": "{spent} minuté, {remaining} zostáva", + "Budget against cost per phase": "Rozpočet oproti nákladom podľa fázy", + "No phase": "Bez fázy", + "Cost lines": "Nákladové položky", + "From the finance system": "Z finančného systému", + "Edit cost line {amount}": "Upraviť nákladovú položku {amount}", + "No cost lines yet": "Zatiaľ žiadne nákladové položky", + "Commitments": "Záväzky", + "Actual cost": "Skutočné náklady", + "Forecast": "Prognóza", + "Remaining": "Zostáva", + "Not planned yet": "Zatiaľ nenaplánované", + "{start} to {end}": "{start} až {end}", + "The terms were not saved. Please try again.": "Podmienky sa neuložili. Skúste to znova.", + "Terms saved": "Podmienky uložené", + "Fixed price": "Pevná cena", + "Hourly": "Hodinovo", + "Not billed": "Nefakturované", + "Commitment": "Záväzok", + "Edit cost line": "Upraviť nákladovú položku", + "Kind": "Druh", + "Amount in euro": "Suma v eurách", + "Remove": "Odstrániť", + "Could not save the cost line. Only the project owner changes the money of a project.": "Nákladovú položku nemožno uložiť. Peniaze projektu mení len vlastník projektu.", + "Could not remove the cost line. Please try again.": "Nákladovú položku nemožno odstrániť. Skúste to znova.", + "{amount} over budget": "{amount} nad rozpočet", + "Cost categories": "Kategórie nákladov", + "The categories every project splits its budget and costs into, one per line": "Kategórie, do ktorých každý projekt delí svoj rozpočet a náklady, jedna na riadok", + "Categories": "Kategórie", + "Give at least one category, each name once.": "Zadajte aspoň jednu kategóriu, každý názov raz.", + "Cost categories saved": "Kategórie nákladov uložené", + "The cost categories were not saved. Please try again.": "Kategórie nákladov sa neuložili. Skúste to znova.", + "Finance line": "Finančná položka", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Jedna suma peňazí v projekte: rozpočet, záväzok, skutočný náklad alebo prognóza, v kategórii nákladov a prípadne vo fáze. Zadaná vlastníkom projektu alebo finančným systémom cez integračnú aplikáciu.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt, ku ktorému suma patrí. Prázdne pri položke z finančného systému, ktorej číslo projektu nezodpovedá žiadnemu projektu.", + "The phase this amount belongs to, if any": "Fáza, ku ktorej suma patrí, ak existuje", + "The cost category, one of the categories the admin set up": "Kategória nákladov, jedna z kategórií nastavených správcom", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Či je suma rozpočet, záväzok, skutočný náklad alebo prognóza", + "Amount": "Suma", + "The amount in the reporting currency (euro)": "Suma v mene výkazníctva (euro)", + "The date the amount was booked or is expected": "Dátum, keď bola suma zaúčtovaná alebo sa očakáva", + "What the amount is for": "Na čo je suma", + "Whether a person entered the line or the finance system sent it": "Či položku zadal človek, alebo ju poslal finančný systém", + "Entered by hand": "Zadané ručne", + "Finance line id": "Id finančnej položky", + "The finance system's own id of this line. One imported line per id.": "Vlastné id tejto položky vo finančnom systéme. Jedna importovaná položka na id.", + "Project number": "Číslo projektu", + "The project number the finance system sent, matched against the project key": "Číslo projektu zaslané finančným systémom, porovnané s kľúčom projektu", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfólio projektu položky, prevzaté z projektu, aby súčty portfólia potrebovali jeden filter", + "Finance readers": "Čitatelia financií", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID používateľov Nextcloud, ktorí smú vidieť túto sumu: vlastník projektu a správcovia jeho portfólia", + "Project owner": "Vlastník projektu", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID používateľa Nextcloud vlastníka projektu, ktorý smie meniť a odstraňovať ručné položky", + "How the client pays: not billed, a fixed price, or by the hour.": "Ako klient platí: nefakturované, pevná cena alebo hodinovo.", + "Portfolio finance": "Financie portfólia", + "You cannot see the money of any project in this portfolio": "Nevidíte peniaze žiadneho projektu v tomto portfóliu", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Server vrátil nákladové položky projektov mimo tohto portfólia, takže tieto súčty môžu byť nesprávne.", + "Projects left out because you cannot see their money: {count}": "Vynechané projekty, pretože nevidíte ich peniaze: {count}", + "Unmatched finance lines": "Nepriradené finančné položky", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Rozpočet, záväzky, skutočné náklady a prognóza spočítané za portfólio.", + "Subprojects": "Podprojekty", + "{done} of {total}": "{done} z {total}", + "{done} of {total} tasks done, including subprojects": "{done} z {total} úloh hotových, vrátane podprojektov", + "Show the subprojects of {title}": "Zobraziť podprojekty {title}", + "Hide the subprojects of {title}": "Skryť podprojekty {title}", + "Part of": "Súčasť", + "No parent project": "Bez nadradeného projektu", + "A project cannot sit under one of its own subprojects.": "Projekt nemôže ležať pod jedným zo svojich vlastných podprojektov.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekty sa vnárajú najviac do troch úrovní: program, projekt a podprojekt.", + "Parent project": "Nadradený projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt, pod ktorým tento projekt leží, napríklad program. Projekty sa vnárajú najviac do troch úrovní.", + "Yes": "Áno", + "No": "Nie", + "{label} (required)": "{label} (povinné)", + "{label} is required": "{label} je povinné", + "Project field": "Pole projektu", + "A field an admin adds to every project, such as a policy area or a contract value.": "Pole, ktoré správca pridá ku každému projektu, napríklad oblasť politiky alebo hodnotu zákazky.", + "Key": "Kľúč", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stály názov, pod ktorým sa hodnota ukladá, v lower camel case. Nemeňte ho, keď ho projekty používajú.", + "Label": "Popis", + "The name people see next to the field": "Názov, ktorý ľudia vidia pri poli", + "What the field holds": "Čo pole obsahuje", + "Text": "Text", + "Number": "Číslo", + "Choice": "Voľba", + "Person": "Osoba", + "Yes or no": "Áno alebo nie", + "Options": "Možnosti", + "The choices of a choice field": "Možnosti výberového poľa", + "Required": "Povinné", + "Whether a project must fill in the field": "Či projekt musí pole vyplniť", + "Where the field appears, lowest first": "Kde sa pole zobrazí, najnižšie prvé", + "Applies to": "Platí pre", + "What the field is added to": "K čomu sa pole pridáva", + "Custom fields": "Vlastné polia", + "The values of the project fields an admin defined, keyed by the field's key.": "Hodnoty polí projektu, ktoré definoval správca, podľa kľúča poľa.", + "Project fields": "Polia projektu", + "Related": "Súvisiace", + "Remove link": "Odstrániť odkaz", + "Link type": "Typ odkazu", + "Relates to": "Súvisí s", + "Duplicates": "Duplikuje", + "Project key": "Kľúč projektu", + "Every task number starts with it, such as VERG-42.": "Každé číslo úlohy ním začína, napríklad VERG-42.", + "This key is already used by another project.": "Tento kľúč už používa iný projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Použite 2 až 10 písmen a číslic, začínajúc písmenom.", + "The key cannot change once tasks carry it.": "Kľúč sa nemôže zmeniť, keď ho nesú úlohy.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt uložený. Existujúce úlohy dostanú svoje čísla na pozadí.", + "Next task number": "Číslo ďalšej úlohy", + "The number the next task of this project gets in its key. Only the system writes it.": "Číslo, ktoré ďalšia úloha tohto projektu dostane vo svojom kľúči. Zapisuje ho iba systém.", + "Restore {title}": "Obnoviť {title}", + "Restore": "Obnoviť", + "Project restored": "Projekt obnovený", + "Could not restore the project": "Projekt sa nepodarilo obnoviť", + "Bring this project back to the active list.": "Vrátiť projekt do zoznamu aktívnych projektov.", + "Restore project": "Obnoviť projekt", + "Request reason": "Dôvod žiadosti", + "Why the requester needs this project. Filled in when the project is requested.": "Prečo žiadateľ potrebuje tento projekt. Vypĺňa sa pri žiadosti.", + "Reviewed by": "Posúdil", + "The user who approved or rejected the request.": "Používateľ, ktorý žiadosť schválil alebo zamietol.", + "Reviewed at": "Posúdené", + "When the request was approved or rejected.": "Kedy bola žiadosť schválená alebo zamietnutá.", + "Review note": "Poznámka k posúdeniu", + "The reviewer's reason, shown to the requester when a request is not approved.": "Dôvod posudzovateľa, ktorý žiadateľ uvidí, keď žiadosť nie je schválená.", + "Members of these groups": "Členovia týchto skupín", + "Groups that may create projects": "Skupiny, ktoré môžu zakladať projekty", + "The group {group} no longer exists. Save to remove it.": "Skupina {group} už neexistuje. Uložením ju odstránite.", + "Review project request": "Posúdiť žiadosť o projekt", + "Requested by": "Požiadal", + "Why it is needed": "Prečo je potrebný", + "Desired start date": "Požadovaný dátum začiatku", + "Why is it not approved?": "Prečo nie je schválený?", + "Give a reason. The requester sees it.": "Uveďte dôvod. Žiadateľ ho uvidí.", + "Approve": "Schváliť", + "Reject": "Zamietnuť", + "Reject request": "Zamietnuť žiadosť", + "The review was not saved. Try again.": "Posúdenie sa neuložilo. Skúste to znova.", + "This project is waiting for review": "Tento projekt čaká na posúdenie", + "This request was not approved": "Táto žiadosť nebola schválená", + "Reason: {note}": "Dôvod: {note}", + "Review request": "Posúdiť žiadosť", + "Request a project": "Požiadať o projekt", + "Step {step} of 2": "Krok {step} z 2", + "Why is this project needed?": "Prečo je tento projekt potrebný?", + "Give a reason. The reviewer reads it.": "Uveďte dôvod. Posudzovateľ ho prečíta.", + "Back": "Späť", + "Next": "Ďalej", + "Send request": "Odoslať žiadosť", + "The request was not sent. Try again.": "Žiadosť sa neodoslala. Skúste to znova.", + "Requested": "Požadované", + "Not approved": "Neschválené", + "Your request was sent": "Vaša žiadosť bola odoslaná", + "Let everyone else request a project": "Umožniť všetkým ostatným požiadať o projekt", + "Add a task": "Pridať úlohu", + "Delete task": "Odstrániť úlohu", + "Edit task": "Upraviť úlohu", + "Write": "Písať", + "Preview": "Náhľad", + "Markdown works here: headings, lists and links.": "Tu funguje Markdown: nadpisy, zoznamy a odkazy.", + "Could not save the task. Please try again.": "Úlohu sa nepodarilo uložiť. Skúste to znova.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Na úlohe \"{title}\" je zaznamenaný čas, preto ju nemožno odstrániť. Namiesto toho ju môžete zrušiť: záznamy času zostanú.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Odstrániť \"{title}\"? Odstránia sa aj jej prepojenia na iné úlohy. Túto akciu nemožno vrátiť späť.", + "Keep task": "Ponechať úlohu", + "Cancel task": "Zrušiť úlohu", + "Only the reporter, the project owner or an admin can delete this task.": "Túto úlohu môže odstrániť iba ten, kto ju nahlásil, vlastník projektu alebo správca.", + "Could not delete the task. Please try again.": "Úlohu sa nepodarilo odstrániť. Skúste to znova.", + "Could not cancel the task. Please try again.": "Úlohu sa nepodarilo zrušiť. Skúste to znova.", + "Responsible": "Zodpovedná osoba", + "Also working on this": "Pracujú na tom aj", + "Labels": "Štítky", + "Could not change the priority. Please try again.": "Prioritu sa nepodarilo zmeniť. Skúste to znova.", + "Other project members who work on this task alongside the person responsible.": "Ďalší členovia projektu, ktorí na úlohe pracujú spolu so zodpovednou osobou.", + "Duplicate": "Duplikovať", + "Could not copy the task. Please try again.": "Úlohu sa nepodarilo skopírovať. Skúste to znova.", + "Subtasks": "Podúlohy", + "{done} of {total} done": "Hotové {done} z {total}", + "Add a subtask": "Pridať podúlohu", + "Checklist": "Kontrolný zoznam", + "Checklist item actions": "Akcie položky zoznamu", + "Add a checklist item": "Pridať položku zoznamu", + "Subtasks: {estimate} estimated, {logged} logged": "Podúlohy: odhad {estimate}, zaznamenané {logged}", + "Total estimate: {total}": "Celkový odhad: {total}", + "Part of {title}": "Súčasť úlohy {title}", + "Checklist: {count} done": "Kontrolný zoznam: hotové {count}", + "This task has subtasks: {count}.": "Táto úloha má podúlohy: {count}.", + "Keep subtasks as separate tasks": "Ponechať podúlohy ako samostatné úlohy", + "Delete subtasks too": "Odstrániť aj podúlohy", + "Copy of {title}": "Kópia: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Úloha bola skopírovaná, ale nie všetky jej podúlohy. Skontrolujte kópiu.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Malé kroky v rámci úlohy. Každá položka má id, text a informáciu, či je hotová.", + "Open work per person and per project.": "Otvorená práca podľa osôb a projektov.", + "View": "Zobrazenie", + "By person": "Podľa osoby", + "By project": "Podľa projektu", + "Hours left": "Zostávajúce hodiny", + "Tasks without an estimate": "Úlohy bez odhadu", + "Due in 14 days": "Termín do 14 dní", + "Shared": "Zdieľané", + "Unassigned": "Nepriradené", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Zobrazuje sa práca v projektoch, ktoré vidíte. Hodiny sa počítajú zodpovednej osobe; zdieľané úlohy sa počítajú bez hodín.", + "No open work in these projects.": "V týchto projektoch nie je žiadna otvorená práca.", + "Open work": "Otvorená práca", + "{count} open tasks": "{count} otvorených úloh", + "Create a project to see capacity here.": "Vytvorte projekt, aby ste tu videli kapacitu.", + "My tasks": "Moje úlohy", + "Show all my tasks": "Zobraziť všetky moje úlohy", + "No tasks assigned to you": "Nemáte priradené žiadne úlohy", + "Browse projects": "Prehliadať projekty", + "Later": "Neskôr", + "Due {date}": "Termín {date}", + "Could not change the status. Please try again.": "Stav sa nepodarilo zmeniť. Skúste to znova.", + "Completed today": "Dokončené dnes", + "My open tasks": "Moje otvorené úlohy", + "My overdue tasks": "Moje úlohy po termíne", + "My tasks in progress": "Moje rozpracované úlohy", + "Pin to the top": "Pripnúť hore", + "Unpin": "Odopnúť", + "Pinned": "Pripnuté", + "Actions for {title}": "Akcie pre {title}", + "Could not save your project order. Please try again.": "Poradie projektov sa nepodarilo uložiť. Skúste to znova.", + "No boards yet": "Zatiaľ žiadne tabule", + "Create a project to get a board.": "Vytvorte projekt, aby ste mali tabuľu.", + "Use the Projects page to create and manage your projects and tasks.": "Na stránke Projekty vytvárajte a spravujte svoje projekty a úlohy.", + "Go to projects": "Prejsť na projekty", + "You are not a member of any projects yet.": "Zatiaľ nie ste členom žiadneho projektu.", + "Could not search for users. Please try again.": "Používateľov sa nepodarilo vyhľadať. Skúste to znova.", + "Project creation is restricted to administrators.": "Projekty môžu vytvárať iba správcovia.", + "Only the project owner or an administrator can delete this project.": "Tento projekt môže odstrániť iba vlastník projektu alebo správca.", + "No projects are available to you yet. Ask an administrator to create one.": "Zatiaľ pre vás nie sú dostupné žiadne projekty. Požiadajte správcu o vytvorenie.", + "Due: {date}": "Termín: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Úlohy s dátumom začiatku alebo termínom sa zobrazujú na časovej osi. Pridajte dátumy, aby ste ich tu videli.", + "You do not have access to this project.": "K tomuto projektu nemáte prístup.", + "Zoom level": "Úroveň priblíženia", + "Unscheduled": "Nenaplánované", + "Start: {date}": "Začiatok: {date}", + "Today": "Dnes", + "No scheduled tasks": "Žiadne naplánované úlohy", + "An unexpected error occurred.": "Vyskytla sa neočakávaná chyba.", + "Column {number} name": "Názov stĺpca {number}", + "Failed to save creation policy": "Pravidlo na vytváranie sa nepodarilo uložiť", + "All authenticated users": "Všetci prihlásení používatelia", + "Control who may create new projects": "Určte, kto smie vytvárať nové projekty", + "Administrators only": "Iba správcovia", + "Project creation": "Vytváranie projektov", + "Allow project creation": "Povoliť vytváranie projektov", + "Creation policy saved successfully": "Pravidlo na vytváranie uložené", + "Initializing…": "Spúšťa sa…", + "e.g. 2h 30m, 90m, 1.5h": "napr. 2h 30m, 90m, 1.5h", + "Log time": "Zapísať čas", + "Save estimate": "Uložiť odhad", + "Logged: {logged}": "Zapísané: {logged}", + "over by {amount}": "prekročené o {amount}", + "Time tracking": "Evidencia času", + "Estimate": "Odhad", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Zadajte platný odhad (napr. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Zadajte platné trvanie (napr. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Záznam času sa nepodarilo uložiť. Skúste to znova.", + "Edit time entry": "Upraviť záznam času", + "Duration": "Trvanie", + "Date range": "Obdobie", + "Last week": "Minulý týždeň", + "No time logged": "Žiadny zapísaný čas", + "Log time on a task to see it here.": "Zapíšte čas k úlohe, aby ste ho tu videli.", + "To date": "Do dátumu", + "This week": "Tento týždeň", + "Total: {total}": "Spolu: {total}", + "From date": "Od dátumu", + "Custom range": "Vlastné obdobie", + "All time": "Celé obdobie", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Úlohu sa nepodarilo odstrániť, takže môžu zostať údaje. Odstráňte projekt znova.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Záznam času sa nepodarilo odstrániť, takže môžu zostať údaje. Odstráňte projekt znova.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Stĺpec sa nepodarilo odstrániť, takže môžu zostať údaje. Odstráňte projekt znova.", + "Could not delete the project. Please try again.": "Projekt sa nepodarilo odstrániť. Skúste to znova.", + "Notification settings": "Nastavenia upozornení", + "Configure when due-date reminders are sent": "Nastavte, kedy sa posielajú pripomienky termínov", + "Due-date reminder lead time (hours)": "Predstih pripomienky termínu (hodiny)", + "Lead time must be between 1 and 336 hours": "Predstih musí byť medzi 1 a 336 hodinami", + "Reminder lead time saved successfully": "Predstih pripomienky uložený", + "Failed to save reminder lead time": "Predstih pripomienky sa nepodarilo uložiť", + "Notifications": "Upozornenia", + "Notify me 1 day before a task's due date": "Upozorniť ma 1 deň pred termínom úlohy", + "Draft": "Koncept", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Či je hodina koncept, ktorý vidí len jej učiteľ, koná sa, alebo je zrušená.", + "New release": "Nové vydanie", + "Roadmap chart. The same releases and epics are listed below.": "Graf plánu. Rovnaké vydania a eposy sú uvedené nižšie.", + "Nothing on the roadmap yet": "Na pláne zatiaľ nič nie je", + "Releases with a target date and epics with dated tasks appear here.": "Tu sa zobrazujú vydania s cieľovým dátumom a eposy s úlohami, ktoré majú dátum.", + "Releases": "Vydania", + "No releases yet": "Zatiaľ žiadne vydania", + "Target date: {date}": "Cieľový dátum: {date}", + "No target date": "Bez cieľového dátumu", + "Edit {name}": "Upraviť {name}", + "Mark {name} as released": "Označiť {name} ako vydané", + "Mark as released": "Označiť ako vydané", + "Epics": "Eposy", + "No epics yet. Open a task to make it an epic.": "Zatiaľ žiadne eposy. Otvorte úlohu a urobte z nej epos.", + "Not scheduled yet": "Zatiaľ nenaplánované", + "Planned": "Plánované", + "Released": "Vydané", + "Edit release": "Upraviť vydanie", + "Target date": "Cieľový dátum", + "Could not save the release. Please try again.": "Vydanie sa nepodarilo uložiť. Skúste to znova.", + "Every task of this release is done or cancelled.": "Každá úloha tohto vydania je hotová alebo zrušená.", + "Not finished yet: {count}": "Zatiaľ nedokončené: {count}", + "What happens to these tasks?": "Čo sa stane s týmito úlohami?", + "Move to {name}": "Presunúť do {name}", + "Remove the release": "Odstrániť vydanie", + "Keep it on {name}": "Ponechať ich v {name}", + "Could not mark the release as released. Please try again.": "Vydanie sa nepodarilo označiť ako vydané. Skúste to znova.", + "Roadmap": "Plán", + "Tasks or roadmap": "Úlohy alebo plán", + "Release": "Vydanie", + "Epic": "Epos", + "This task is an epic": "Táto úloha je epos", + "A named, dated delivery of a project that its tasks are planned against.": "Pomenovaná dodávka projektu s dátumom, na ktorú sa plánujú jeho úlohy.", + "Name of the release": "Názov vydania", + "The project this release belongs to": "Projekt, ku ktorému toto vydanie patrí", + "What this release delivers": "Čo toto vydanie dodáva", + "When work on the release starts": "Kedy sa začína práca na vydaní", + "The date the release is due": "Dátum, kedy má byť vydanie hotové", + "Whether the release is planned, released or archived": "Či je vydanie plánované, vydané alebo archivované", + "Released on": "Vydané dňa", + "When the release was marked as released": "Kedy bolo vydanie označené ako vydané", + "The release this task is planned for": "Vydanie, pre ktoré je táto úloha naplánovaná", + "Board view options": "Možnosti zobrazenia nástenky", + "Colour cards": "Zafarbiť karty", + "No colour": "Bez farby", + "By label": "Podľa štítka", + "Swimlanes": "Plavecké dráhy", + "No swimlanes": "Bez plaveckých dráh", + "By assignee": "Podľa riešiteľa", + "By epic": "Podľa eposu", + "No assignee": "Nepriradené", + "No epic": "Bez eposu", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Karty zostávajú v riadku svojho eposu. Epos zmeňte na stránke úlohy.", + "Hand over to": "Odovzdať", + "Could not save your board view. It applies until you reload.": "Zobrazenie nástenky sa nepodarilo uložiť. Platí do opätovného načítania.", + "Timetable wish": "Želanie k rozvrhu", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Želanie, ktoré generátor zohľadňuje. Pevné želanie dodrží vždy, mäkké tam, kde môže.", + "Whether the wish is about a teacher, a group, a room or one activity": "Či sa želanie týka učiteľa, skupiny, miestnosti alebo jednej činnosti", + "Teacher": "Učiteľ", + "Group": "Skupina", + "Reference": "Odkaz", + "The user, group, room or activity the wish is about": "Používateľ, skupina, miestnosť alebo činnosť, ktorej sa želanie týka", + "What the wish asks for": "Čo želanie žiada", + "Not on these periods": "Nie v týchto hodinách", + "Preferably not on these periods": "Radšej nie v týchto hodinách", + "At most a number of lessons a day": "Najviac určitý počet hodín denne", + "No free periods between lessons": "Žiadne voľné hodiny medzi hodinami", + "Always the same room": "Vždy tá istá miestnosť", + "Periods": "Hodiny", + "The periods of the week the wish is about, such as wed-5": "Hodiny týždňa, ktorých sa želanie týka, napr. wed-5", + "Limit": "Limit", + "The most lessons a day, for a wish of that kind": "Najviac hodín denne, pre želanie tohto druhu", + "Strength": "Sila", + "Whether the generator must keep the wish or should keep it": "Či generátor musí, alebo by mal želanie dodržať", + "Hard": "Pevné", + "Soft": "Mäkké", + "Weight": "Váha", + "How much a soft wish counts, from 1 to 3": "Ako veľmi mäkké želanie váži, od 1 do 3", + "Why the wish exists": "Prečo želanie existuje", + "Timetable scenario": "Scenár rozvrhu", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jeden týždenný vzor, vytvorený generátorom alebo prevzatý zo súčasného rozvrhu. Uchováva svoj vstup a ako dobre dodržiava želania.", + "The name timetablers know the scenario by": "Názov, pod ktorým tvorcovia rozvrhu scenár poznajú", + "Whether the generator made it or it came from the current timetable": "Či ho vytvoril generátor, alebo pochádza zo súčasného rozvrhu", + "Generated": "Vygenerované", + "From the current timetable": "Zo súčasného rozvrhu", + "Week of": "Týždeň od", + "The Monday of the first week of the window": "Pondelok prvého týždňa obdobia", + "Window start": "Začiatok obdobia", + "The first day the week pattern applies to": "Prvý deň, pre ktorý týždenný vzor platí", + "Window end": "Koniec obdobia", + "The last day the week pattern applies to": "Posledný deň, pre ktorý týždenný vzor platí", + "Waiting, generating, done, failed, or published as draft lessons": "Čaká, generuje sa, hotovo, zlyhalo alebo zverejnené ako koncepty hodín", + "Waiting": "Čaká", + "Generating": "Generuje sa", + "Failed": "Zlyhalo", + "Published": "Zverejnené", + "Seed": "Semienko", + "The number the generator starts from, so a run can be repeated": "Číslo, od ktorého generátor začína, aby sa beh dal zopakovať", + "Input": "Vstup", + "The periods, rooms, lessons and wishes the scenario was made from": "Hodiny, miestnosti, vyučovacie hodiny a želania, z ktorých scenár vznikol", + "Placements": "Umiestnenia", + "Each lesson with the period and room it was given": "Každá vyučovacia hodina s hodinou a miestnosťou, ktoré dostala", + "Unplaced lessons": "Neumiestnené hodiny", + "Lessons without a place, each with the hard wish that blocked it": "Hodiny bez miesta, každá s pevným želaním, ktoré ju zablokovalo", + "Broken wishes": "Porušené želania", + "The wishes this scenario breaks, with the lessons that break them": "Želania, ktoré tento scenár porušuje, s hodinami, ktoré ich porušujú", + "Measures": "Ukazovatele", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Umiestnené hodiny, porušené želania, voľné hodiny učiteľov, hodiny denne a využitie miestností", + "Reason": "Dôvod", + "Why the run failed": "Prečo beh zlyhal", + "Published at": "Zverejnené", + "When the scenario was written out as draft lessons": "Kedy bol scenár zapísaný ako koncepty hodín", + "Edit wish": "Upraviť želanie", + "New wish": "Nové želanie", + "Hard: the generator always keeps it": "Pevné: generátor ho vždy dodrží", + "Soft: the generator keeps it where it can": "Mäkké: generátor ho dodrží, kde sa dá", + "Weight (1 to 3)": "Váha (1 až 3)", + "Most lessons a day": "Najviac hodín denne", + "Period": "Hodina", + "{day} period {number}": "{day} hodina {number}", + "Teacher (user name)": "Učiteľ (používateľské meno)", + "Activity (group:subject)": "Aktivita (skupina:predmet)", + "Say who or what the wish is about.": "Uveďte, koho alebo čoho sa želanie týka.", + "Choose at least one period.": "Vyberte aspoň jednu hodinu.", + "The limit is a whole number of 1 or more.": "Limit je celé číslo 1 alebo viac.", + "Timetable": "Rozvrh", + "Wishes": "Želania", + "Timetable wishes": "Želania k rozvrhu", + "Generator run": "Beh generátora", + "Generator progress": "Priebeh generátora", + "The run failed: {reason}": "Beh zlyhal: {reason}", + "{placed} of {lessons} lessons placed": "Umiestnených {placed} z {lessons} hodín", + "Generate again": "Generovať znova", + "Generate": "Generovať", + "Every lesson has a place.": "Každá hodina má miesto.", + "Lesson": "Hodina", + "No free period and room": "Žiadna voľná hodina a učebňa", + "Broken soft wishes": "Porušené mäkké želania", + "Every soft wish is kept.": "Každé mäkké želanie je dodržané.", + "Wish": "Želanie", + "Lessons": "Hodiny", + "Generating: {percent}% of the time budget used": "Generovanie: využitých {percent} % času", + "Waiting to start": "Čaká na spustenie", + "Published as draft lessons": "Zverejnené ako koncepty hodín", + "Could not read the scenario.": "Scenár sa nepodarilo načítať.", + "Could not start the run.": "Beh sa nepodarilo spustiť.", + "Scenarios": "Scenáre", + "Timetable scenarios": "Scenáre rozvrhu", + "Scenario": "Scenár", + "Take the current timetable": "Prevziať aktuálny rozvrh", + "Could not take the current timetable.": "Aktuálny rozvrh sa nepodarilo prevziať.", + "Broken hard wishes": "Porušené záväzné priania", + "Not on a period of the week grid": "Nie je na hodine týždennej mriežky", + "Compare scenarios": "Porovnať scenáre", + "Scenarios to compare": "Scenáre na porovnanie", + "Choose two or three scenarios to compare them.": "Vyberte dva alebo tri scenáre na porovnanie.", + "Measure": "Ukazovateľ", + "Best": "Najlepšie", + "Lessons that differ": "Hodiny, ktoré sa líšia", + "No lesson differs.": "Žiadna hodina sa nelíši.", + "Not placed": "Neumiestnené", + "{period} in {room}": "{period} v {room}", + "Lessons placed": "Umiestnené hodiny", + "Lessons without a place": "Hodiny bez miesta", + "Clashes": "Kolízie", + "Hard wishes broken": "Porušené pevné želania", + "Soft wishes broken": "Porušené mäkké želania", + "Soft wishes broken, weighted": "Porušené mäkké želania, vážené", + "Free periods between lessons, all teachers": "Voľné hodiny, všetci učitelia", + "Most free periods of one teacher": "Najviac voľných hodín jedného učiteľa", + "Most lessons of one group on a day": "Najviac hodín jednej skupiny za deň", + "Room use": "Využitie učební", + "Publish as draft lessons": "Zverejniť ako koncepty hodín", + "Draft lessons written: {count}": "Zapísané koncepty hodín: {count}", + "Could not publish the scenario.": "Scenár sa nepodarilo zverejniť.", + "Rules": "Pravidlá", + "Rules for {column}": "Pravidlá pre {column}", + "When a card enters this column": "Keď karta vstúpi do tohto stĺpca", + "Action": "Akcia", + "Set the priority": "Nastaviť prioritu", + "Assign to": "Priradiť", + "Assign the person who moved the card": "Priradiť osobe, ktorá kartu presunula", + "Remove the assignee": "Odobrať riešiteľa", + "Add a label": "Pridať štítok", + "No longer a project member": "Už nie je členom projektu", + "This label no longer exists": "Tento štítok už neexistuje", + "Add rule": "Pridať pravidlo", + "Remove rule": "Odobrať pravidlo", + "No rules yet. Add one to change a card when it enters this column.": "Zatiaľ žiadne pravidlá. Pridajte pravidlo, ktoré zmení kartu, keď vstúpi do tohto stĺpca.", + "Could not save the rules. Please try again.": "Pravidlá sa nepodarilo uložiť. Skúste to znova.", + "1 rule runs when a card enters this column": "1 pravidlo sa spustí, keď karta vstúpi do tohto stĺpca", + "{count} rules run when a card enters this column": "Počet pravidiel, ktoré sa spustia, keď karta vstúpi do tohto stĺpca: {count}", + "Rules applied: {changes}": "Použité pravidlá: {changes}", + "assigned to {name}": "priradené: {name}", + "assignee removed": "riešiteľ odobratý", + "priority {priority}": "priorita {priority}", + "label {label}": "štítok {label}", + "What happens to a card when it enters this column, applied in list order.": "Čo sa stane s kartou, keď vstúpi do tohto stĺpca, v poradí zoznamu.", + "Value": "Hodnota", + "What the rule does to the card.": "Čo pravidlo urobí s kartou.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Priorita, ID používateľa alebo ID štítka, ktoré akcia používa; prázdne pri akciách bez hodnoty.", + "is not": "nie je", + "{dimension} is not": "{dimension} nie je", + "Saved filters": "Uložené filtre", + "No saved filters yet": "Zatiaľ žiadne uložené filtre", + "Save filter": "Uložiť filter", + "Rename \"{name}\"": "Premenovať „{name}“", + "Delete \"{name}\"": "Odstrániť „{name}“", + "Clear filters": "Zrušiť filtre", + "Showing {shown} of {total} tasks": "Zobrazené {shown} z {total} úloh", + "Me": "Ja", + "No date": "Bez dátumu", + "Rename saved filter": "Premenovať uložený filter", + "Share with the project": "Zdieľať s projektom", + "Give the filter a name": "Pomenujte filter", + "Could not save the filter. Please try again.": "Filter sa nepodarilo uložiť. Skúste to znova.", + "Some labels in \"{name}\" no longer exist and were left out.": "Niektoré štítky vo „{name}“ už neexistujú a boli vynechané.", + "Could not delete the filter. Please try again.": "Filter sa nepodarilo odstrániť. Skúste to znova.", + "Saved filter": "Uložený filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Pomenovaný filter nástenky jedného projektu, súkromný pre toho, kto ho uložil, ak nie je zdieľaný s projektom.", + "The project whose board the filter applies to": "Projekt, na ktorého nástenku sa filter vzťahuje", + "The name the filter is listed under": "Názov, pod ktorým je filter v zozname", + "Saved by": "Uložil(a)", + "Nextcloud user id of the person who saved the filter": "ID používateľa Nextcloud, ktorý filter uložil", + "Shared with the project": "Zdieľané s projektom", + "Whether every project member sees and applies the filter": "Či každý člen projektu filter vidí a môže ho použiť", + "Criteria": "Kritériá", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filter: riešiteľ, štítok, priorita a termín, každý s je alebo nie je a hodnotami", + "Cross-project view": "Medziprojektové zobrazenie", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Uložený výber projektov, ktorých úlohy sa zobrazujú spolu v stĺpcoch podľa stavu, zdieľaný s uvedenými ľuďmi.", + "Shared with": "Zdieľané s", + "The name the view is listed under": "Názov, pod ktorým je zobrazenie uvedené", + "Nextcloud user id of the person who saved the view": "ID používateľa Nextcloud osoby, ktorá zobrazenie uložila", + "Nextcloud user ids of the people the view is shared with": "ID používateľov Nextcloud osôb, s ktorými je zobrazenie zdieľané", + "The projects whose tasks the view shows, at most twenty": "Projekty, ktorých úlohy zobrazenie ukazuje, najviac dvadsať", + "1 project in this view is hidden from you.": "1 projekt v tomto zobrazení je pred vami skrytý.", + "{count} projects in this view are hidden from you.": "Projekty v tomto zobrazení skryté pred vami: {count}.", + "{project} has no column for {status}.": "Projekt {project} nemá stĺpec pre stav {status}.", + "This view does not exist or is not shared with you.": "Toto zobrazenie neexistuje alebo s vami nie je zdieľané.", + "\"{task}\" moved to {status}.": "\"{task}\" presunuté do {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Medziprojektové zobrazenia", + "New view": "Nové zobrazenie", + "Edit view": "Upraviť zobrazenie", + "Delete view": "Odstrániť zobrazenie", + "Give the view a name": "Pomenujte zobrazenie", + "Pick at least one project": "Vyberte aspoň jeden projekt", + "A view shows at most {max} projects": "Zobrazenie ukazuje najviac {max} projektov", + "Could not save the view. Please try again.": "Zobrazenie sa nepodarilo uložiť. Skúste to znova.", + "Could not delete the view. Please try again.": "Zobrazenie sa nepodarilo odstrániť. Skúste to znova.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Odstrániť „{title}“? Projekty a ich úlohy zostanú bez zmeny.", + "People see the tasks of the projects they are in, never more.": "Každý vidí iba úlohy projektov, v ktorých je.", + "No views yet. A view shows the tasks of several of your projects together.": "Zatiaľ žiadne zobrazenia. Zobrazenie ukazuje úlohy viacerých vašich projektov spolu.", + "Projects in view: {count}": "Projekty v zobrazení: {count}", + "Notify me when a task is assigned to me": "Upozorniť ma, keď mi bude pridelená úloha", + "Also send these to me by email": "Posielať mi ich aj e-mailom", + "Add an email address in your Nextcloud personal settings to get mail.": "Ak chcete dostávať e-maily, pridajte e-mailovú adresu v osobných nastaveniach Nextcloud.", + "Code link": "Odkaz na kód", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, vetva, žiadosť o zlúčenie alebo úloha na platforme pre kód, ktorá sa týka úlohy.", + "The task the link belongs to": "Úloha, ku ktorej odkaz patrí", + "The project of the task": "Projekt úlohy", + "Task key": "Kľúč úlohy", + "The task key the forge text named, such as VC-12": "Kľúč úlohy uvedený v texte platformy, napríklad VC-12", + "What the link points at": "Kam odkaz vedie", + "Link": "Odkaz", + "The address of the item in the forge": "Adresa položky na platforme pre kód", + "The commit message, branch name or merge request title": "Správa commitu, názov vetvy alebo názov žiadosti o zlúčenie", + "Repository": "Repozitár", + "The repository, such as acme/portal": "Repozitár, napríklad acme/portal", + "Forge id": "Id na platforme", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Vlastné id položky na platforme pre kód, napríklad github:acme/portal#42 alebo hash commitu", + "State": "Stav", + "The state of a merge request or issue": "Stav žiadosti o zlúčenie alebo úlohy", + "Who made the commit or opened the merge request": "Kto vytvoril commit alebo otvoril žiadosť o zlúčenie", + "When the commit was made or the merge request last changed": "Kedy bol commit vytvorený alebo sa žiadosť o zlúčenie naposledy zmenila", + "Added by": "Pridal", + "Whether a person added the link or the integration wrote it": "Či odkaz pridala osoba, alebo ho zapísala integrácia", + "Nextcloud user UIDs of project members": "ID používateľov Nextcloud členov projektu", + "Add link": "Pridať odkaz", + "Added by hand": "Pridané ručne", + "Branch": "Vetva", + "Code": "Kód", + "Commit": "Commit", + "From the integration": "Z integrácie", + "Link to a commit, branch or merge request": "Odkaz na commit, vetvu alebo žiadosť o zlúčenie", + "Merge request": "Žiadosť o zlúčenie", + "Merged": "Zlúčené", + "No code linked yet. Name {key} in a commit message or paste a link.": "Zatiaľ nie je prepojený žiadny kód. Uveďte {key} v správe commitu alebo vložte odkaz.", + "No code linked yet. Paste a link to a commit or merge request.": "Zatiaľ nie je prepojený žiadny kód. Vložte odkaz na commit alebo žiadosť o zlúčenie.", + "Paste a web address that starts with https://.": "Vložte webovú adresu, ktorá začína https://.", + "Remove link {title}": "Odstrániť odkaz {title}", + "The link could not be added.": "Odkaz sa nepodarilo pridať.", + "The link could not be removed.": "Odkaz sa nepodarilo odstrániť.", + "This link is already on the task.": "Tento odkaz už pri úlohe je.", + "Code forges": "Platformy pre kód", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Prepojte commity a pull requesty z GitHubu s úlohami. Integriq prijíma udalosti; planninq GitHub nikdy nevolá.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Stiahnite konfiguráciu a importujte ju do Integriq. Potom vyplňte tajomstvo v pravidle \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "V GitHube pridajte do repozitára webhook s touto adresou a rovnakým tajomstvom. Zvoľte typ obsahu application/json a udalosti push a pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Uveďte kľúč úlohy, napríklad VC-12, v správe commitu, názve vetvy alebo názve pull requestu. Odkaz sa potom zobrazí pri tejto úlohe.", + "Without Integriq, project members can still paste a link on the task page.": "Bez Integriq môžu členovia projektu stále vložiť odkaz na stránke úlohy.", + "Download the Integriq configuration": "Stiahnuť konfiguráciu Integriq", + "Calendar": "Kalendár", + "Previous": "Predchádzajúci", + "Calendar view": "Zobrazenie kalendára", + "Starts:": "Začína:", + "No tasks with a date in this month.": "V tomto mesiaci nie sú žiadne úlohy s dátumom.", + "Week of {start} to {end}": "Týždeň od {start} do {end}", + "My calendar": "Môj kalendár", + "Show as list": "Zobraziť ako zoznam", + "Show as calendar": "Zobraziť ako kalendár", + "Open my calendar": "Otvoriť môj kalendár", + "Nextcloud Tasks": "Úlohy Nextcloud", + "Show my tasks in Nextcloud Tasks": "Zobraziť moje úlohy v Úlohách Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Úlohy pridelené vám alebo s vami zdieľané sa zobrazia v zozname \"Planninq\" v Úlohách a Kalendári Nextcloud. Zmeny urobené tam sa nahradia pri ďalšej zmene v Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Tento server nemôže zapisovať do Úloh Nextcloud, preto export nie je dostupný.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Spravované aplikáciou Planninq. Zmeny urobené tu sa nahradia pri ďalšej zmene v Planninq.", + "Working days and holidays": "Pracovné dni a sviatky", + "Dates set on the timeline skip the days that are not working days.": "Dátumy nastavené na časovej osi preskakujú dni, ktoré nie sú pracovné.", + "Working weekdays": "Pracovné dni v týždni", + "Non-working days": "Nepracovné dni", + "No non-working days yet.": "Zatiaľ žiadne nepracovné dni.", + "Add day": "Pridať deň", + "Year": "Rok", + "Add Dutch national holidays": "Pridať holandské štátne sviatky", + "Save working days": "Uložiť pracovné dni", + "Choose at least one working weekday.": "Vyberte aspoň jeden pracovný deň.", + "Working days saved.": "Pracovné dni uložené.", + "Could not save the working days.": "Pracovné dni sa nepodarilo uložiť.", + "New Year's Day": "Nový rok", + "Easter Sunday": "Veľkonočná nedeľa", + "Easter Monday": "Veľkonočný pondelok", + "King's Day": "Deň kráľa", + "Liberation Day": "Deň oslobodenia", + "Ascension Day": "Nanebovstúpenie Pána", + "Whit Sunday": "Turíce", + "Whit Monday": "Svätodušný pondelok", + "Christmas Day": "1. sviatok vianočný", + "Boxing Day": "2. sviatok vianočný", + "Dates of {title}": "Dátumy úlohy {title}", + "The due date cannot be before the start date.": "Termín nemôže byť pred dátumom začiatku.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Dátumy sa nepodarilo uložiť.", + "{title} now runs from {start} to {end}": "{title} teraz prebieha od {start} do {end}", + "Auto-scheduling": "Automatické plánovanie", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Ak je zapnuté, posunutie termínu na časovej osi ponúkne posunúť aj úlohy, ktoré blokuje.", + "Move blocked tasks along when a task slips": "Posúvať blokované úlohy, keď sa úloha oneskorí", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na časovej osi neskorší termín ponúkne posunúť blokované úlohy. Počítajú sa len väzby \"blokuje\" a úlohy sa posúvajú len neskôr.", + "Move the tasks that wait for {title}?": "Posunúť úlohy, ktoré čakajú na {title}?", + "These tasks wait for it and would start after its new due date:": "Tieto úlohy naň čakajú a začali by sa po novom termíne:", + "{count} tasks would move; the first {limit} are listed.": "Posunulo by sa {count} úloh; zobrazených je prvých {limit}.", + "Now": "Teraz", + "After the move": "Po posunutí", + "Only this task": "Len táto úloha", + "Move all": "Posunúť všetky", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Zastavené pri {title}: dátumy sa nepodarilo uložiť. Úlohy pred ním boli posunuté.", + "Cumulative flow": "Kumulatívny tok", + "Show as chart": "Zobraziť ako graf", + "Show as table": "Zobraziť ako tabuľku", + "Tasks per column per day": "Úlohy v stĺpci za deň", + "Tasks without recorded history in this period: {count}": "Úlohy bez zaznamenanej histórie v tomto období: {count}", + "Lead and cycle time": "Čas dodania a čas cyklu", + "No tasks were finished in this period.": "V tomto období nebola dokončená žiadna úloha.", + "Finished tasks": "Dokončené úlohy", + "Cycle time, average": "Čas cyklu, priemer", + "Cycle time, 85th percentile": "Čas cyklu, 85. percentil", + "Lead time, average": "Čas dodania, priemer", + "Tasks whose finish time was estimated from their history: {count}": "Úlohy, ktorých čas dokončenia bol odhadnutý z histórie: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Čas cyklu každej dokončenej úlohy s priemerom a 85. percentilom", + "Slowest tasks": "Najpomalšie úlohy", + "cycle {cycle}, lead {lead}": "cyklus {cycle}, dodanie {lead}", + "{days} days": "{days} dní", + "Could not load the flow of this project.": "Tok tohto projektu sa nepodarilo načítať.", + "Last {days} days": "Posledných {days} dní", + "Portfolio flow": "Tok portfólia", + "An admin adds portfolios under Projects, Portfolios.": "Správca pridáva portfóliá v Projekty, Portfóliá.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Nezobrazené projekty, pretože naraz sa zobrazuje najviac 50: {count}", + "Could not load the flow of this portfolio.": "Tok tohto portfólia sa nepodarilo načítať.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulatívny tok a čas cyklu naprieč projektmi portfólia.", + "Edit report": "Upraviť prehľad", + "Only tasks where": "Len úlohy, kde", + "Group by": "Zoskupiť podľa", + "Display": "Zobrazenie", + "Share with everyone who can read its projects": "Zdieľať so všetkými, ktorí môžu čítať jeho projekty", + "The report could not be saved.": "Prehľad sa nepodarilo uložiť.", + "Number of tasks": "Počet úloh", + "Bar": "Stĺpce", + "Donut": "Prstenec", + "Table": "Tabuľka", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} z {total} projektov v tomto prehľade pre vás nie je viditeľných", + "No tasks match this report.": "Tomuto prehľadu nezodpovedá žiadna úloha.", + "None": "Žiadne", + "Could not load this report.": "Tento prehľad sa nepodarilo načítať.", + "Report": "Prehľad", + "Your reports": "Vaše prehľady", + "My reports": "Moje prehľady", + "Shared reports": "Zdieľané prehľady", + "You have not built a report yet.": "Zatiaľ ste nevytvorili žiadny prehľad.", + "Nobody has shared a report with you yet.": "Zatiaľ s vami nikto nezdieľal prehľad.", + "Reports you built over tasks, and the ones shared with you.": "Prehľady, ktoré ste vytvorili nad úlohami, a tie, ktoré s vami zdieľali.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Uložený dopyt nad úlohami: ktoré projekty, ktoré filtre, zoskupenie podľa čoho, počet alebo súčet, zobrazený ako tabuľka alebo graf.", + "The name the report is listed under": "Názov, pod ktorým je prehľad uvedený", + "What the report shows and who it is for": "Čo prehľad ukazuje a pre koho je", + "Nextcloud user id of the person who saved the report": "ID používateľa Nextcloud, ktorý prehľad uložil", + "Who can open the report": "Kto môže prehľad otvoriť", + "Only me": "Len ja", + "Everyone who can read its projects": "Všetci, ktorí môžu čítať jeho projekty", + "The projects the report covers, at most fifty": "Projekty, ktoré prehľad zahŕňa, najviac päťdesiat", + "Filters": "Filtre", + "Task fields and the value each must equal": "Polia úlohy a hodnota, ktorej sa každé musí rovnať", + "The task field the report groups on": "Pole úlohy, podľa ktorého prehľad zoskupuje", + "Count the tasks, or add up a number on them": "Spočítať úlohy, alebo sčítať číslo na nich", + "Sum": "Súčet", + "Sum of": "Súčet poľa", + "The number added up when the measure is a sum": "Číslo, ktoré sa sčíta, keď je miera súčet", + "Story points": "Body príbehu", + "Estimated duration": "Odhadovaná doba", + "How the report is shown": "Ako sa prehľad zobrazuje", + "Issue type": "Typ požiadavky", + "Task fields and the value each must equal; empty when the report covers every task": "Polia úlohy a hodnota, ktorú musí každé mať; prázdne, keď prehľad zahŕňa všetky úlohy", + "The status a task must have": "Stav, ktorý musí úloha mať", + "The priority a task must have": "Priorita, ktorú musí úloha mať", + "The user a task must be assigned to": "Používateľ, ktorému musí byť úloha pridelená", + "A label a task must carry": "Štítok, ktorý musí úloha mať", + "The board column a task must be in": "Stĺpec tabule, v ktorom musí úloha byť", + "The issue type a task must have": "Typ požiadavky, ktorý musí úloha mať", + "Manager groups": "Skupiny správcov", + "Member groups": "Skupiny členov", + "Viewer groups": "Skupiny čitateľov", + "Viewers": "Čitatelia", + "Owning group": "Vlastnícka skupina", + "Nextcloud groups whose members manage the project": "Skupiny Nextcloud, ktorých členovia spravujú projekt", + "Nextcloud groups whose members work on the project": "Skupiny Nextcloud, ktorých členovia na projekte pracujú", + "Nextcloud groups whose members may read the project": "Skupiny Nextcloud, ktorých členovia môžu projekt čítať", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Používatelia Nextcloud, ktorí spravujú projekt: nastavenia, členov a prácu", + "Nextcloud user ids who may read the project and its work but not change it": "Používatelia Nextcloud, ktorí môžu čítať projekt a jeho prácu, ale nie meniť", + "The Nextcloud group that owns the project with its creator, at most one": "Skupina Nextcloud, ktorá vlastní projekt spolu s jeho tvorcom, najviac jedna", + "Nextcloud user ids who may read this through the project": "Používatelia Nextcloud, ktorí to môžu čítať cez projekt", + "Nextcloud groups whose members may change this through the project": "Skupiny Nextcloud, ktorých členovia to môžu meniť cez projekt", + "Nextcloud groups whose members may read this through the project": "Skupiny Nextcloud, ktorých členovia to môžu čítať cez projekt", + "Search for a person or a group…": "Hľadať osobu alebo skupinu…", + "No one found. Your admin's sharing settings decide who you can find.": "Nikto sa nenašiel. Nastavenia zdieľania vášho správcu určujú, koho môžete nájsť.", + "Type at least two characters": "Zadajte aspoň dva znaky", + "Everyone in this group": "Všetci v tejto skupine", + "Could not search for people. Please try again.": "Vyhľadávanie osôb zlyhalo. Skúste to znova.", + "Could not remove the group": "Skupinu sa nepodarilo odstrániť", + "Only the owner and managers change who is on this project.": "Kto je v tomto projekte, mení len vlastník a správcovia.", + "Role of {name}": "Rola: {name}", + "Manager": "Správca", + "Member": "Člen", + "Viewer": "Čitateľ", + "Could not change the role": "Rolu sa nepodarilo zmeniť", + "Owned by group: {name}": "Vo vlastníctve skupiny: {name}", + "No group owns this project.": "Tento projekt nevlastní žiadna skupina.", + "Owned by group": "Vo vlastníctve skupiny", + "Search for a group…": "Hľadať skupinu…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nenašla sa žiadna skupina. Nastavenia zdieľania vášho správcu určujú, ktoré skupiny môžete nájsť.", + "No owning group": "Žiadna vlastnícka skupina", + "Could not search for groups. Please try again.": "Skupiny sa nepodarilo vyhľadať. Skúste to znova.", + "Could not change the owning group": "Vlastnícku skupinu sa nepodarilo zmeniť", + "You can read this project. Only its members change it.": "Tento projekt môžete čítať. Meniť ho môžu len jeho členovia.", + "Course": "Kurz", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kurz, ktorý sa na tejto hodine vyučuje, napríklad voliteľný predmet, ak ho školská výučbová aplikácia pozná.", + "Online meeting link": "Odkaz na online hodinu", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kde sa žiaci k tejto hodine pripoja online. Tlačidlo Pripojiť sa zobrazí len pri odkaze https." }, "plurals": null } diff --git a/l10n/sl.js b/l10n/sl.js index 534881bb..5c023b55 100644 --- a/l10n/sl.js +++ b/l10n/sl.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktivni projekti", + "Archived projects": "Arhivirani projekti", + "Boards": "Table", + "My projects": "Moji projekti", + "Portfolio": "Portfelj", + "Project board": "Tabla projekta", + "Projects I am in": "Projekti, v katerih sodelujem", + "Timeline": "Časovnica", + "Timesheet": "Evidenca časa", + "Features & roadmap": "Funkcije in načrt razvoja", + "Flow": "Tok", + "Flows": "Tokovi", + "Reports": "Poročila", + "Pick a report to open it.": "Izberite poročilo, da ga odprete.", + "In progress": "V teku", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodeljeno", + "Who": "Kdo", + "What": "Kaj", + "Minutes": "Minute", + "Entries": "Vnosi", + "Most recent": "Najnovejše", + "Per person": "Na osebo", + "By status": "Po stanju", + "By priority": "Po prednosti", + "Task status": "Stanje nalog", + "Time spent": "Porabljen čas", + "Capacity": "Zmogljivost", + "Due soonest": "Najprej zapadle", + "Minutes logged": "Zabeležene minute", + "Nothing is due": "Nič ni zapadlo", + "Nothing logged yet": "Še ni nič zabeleženo", + "What is open, what is blocked, and what is overdue.": "Kaj je odprto, kaj blokirano in kaj zamuja.", + "How allocation is spread across the people working on projects.": "Kako je obremenitev razporejena med ljudi, ki delajo na projektih.", + "Hours logged, and the projects they went to.": "Zabeležene ure in projekti, na katere so šle.", + "Billable": "Zaračunljivo", + "Budget: {amount}": "Proračun: {amount}", + "Loading projects": "Nalaganje projektov", + "No projects for this client yet": "Za to stranko še ni projektov", + "Open in Planninq": "Odpri v Planninq", + "This project could not be found": "Tega projekta ni bilo mogoče najti", + "Untitled project": "Projekt brez naslova", + "and {count} more": "in še {count}", + "Store": "Trgovina", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Namestite registre, sheme in tokove, ki so jih objavile druge organizacije.", + "Work Date": "Datum dela", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Dejanja stolpca", + "Columns": "Stolpci", + "Could not remove the column. Please try again.": "Stolpca ni bilo mogoče odstraniti. Poskusite znova.", + "Could not save the column. Please try again.": "Stolpca ni bilo mogoče shraniti. Poskusite znova.", + "Done column": "Stolpec opravljenih", + "Edit column": "Uredi stolpec", + "Keep the card's status": "Ohrani stanje kartice", + "Move its cards to": "Premakni njegove kartice v", + "Move left": "Premakni levo", + "Move right": "Premakni desno", + "Status of cards moved here": "Stanje kartic, premaknjenih sem", + "The last done column cannot be removed.": "Zadnjega stolpca opravljenih ni mogoče odstraniti.", + "WIP limit": "Omejitev WIP", + "over limit": "nad omejitvijo", + "The status a card gets when it is moved into this column.": "Stanje, ki ga kartica dobi, ko je premaknjena v ta stolpec.", + "All priorities": "Vse prioritete", + "Could not create the task. Please try again.": "Opravila ni bilo mogoče ustvariti. Poskusite znova.", + "Created": "Ustvarjeno", + "Move to backlog": "V zaostanek", + "Move to board": "Na tablo", + "New task": "Novo opravilo", + "Nothing in the backlog": "V zaostanku ni ničesar", + "Rank": "Rang", + "Sort by": "Razvrsti po", + "Sort by rank to reorder": "Za spremembo vrstnega reda razvrstite po rangu", + "Task actions": "Dejanja opravila", + "All labels": "Vse oznake", + "Filter tasks by label": "Filtriraj opravila po oznaki", + "View timeline": "Prikaži časovnico", + "Board": "Tabla", + "List": "Seznam", + "Column": "Stolpec", + "Board or list": "Tabla ali seznam", + "Log": "Dnevnik", + "Add entry": "Dodaj vnos", + "Show": "Prikaži", + "No actions yet": "Še ni dejanj", + "Closed": "Zaprto", + "Entry actions": "Dejanja vnosa", + "Add action": "Dodaj dejanje", + "by {author}": "avtor {author}", + "saved {time}": "shranjeno {time}", + "Attendees: {names}": "Prisotni: {names}", + "Add the first entry": "Dodaj prvi vnos", + "Issues": "Težave", + "Lessons learned": "Naučene lekcije", + "Meetings": "Sestanki", + "Decisions": "Odločitve", + "Actions": "Dejanja", + "Issue": "Težava", + "Lesson learned": "Naučena lekcija", + "Meeting": "Sestanek", + "Decision": "Odločitev", + "About this project": "O tem projektu", + "No description yet": "Še ni opisa", + "Start date": "Datum začetka", + "Not set": "Ni nastavljeno", + "End date": "Datum konca", + "Progress": "Napredek", + "No tasks yet": "Še ni opravil", + "Open the board": "Odpri tablo", + "People": "Ljudje", + "Owner": "Lastnik", + "Latest log entries": "Najnovejši vnosi", + "Open the log": "Odpri dnevnik", + "{done} of {total} tasks done": "Končanih {done} od {total} opravil", + "Edit entry": "Uredi vnos", + "Type": "Vrsta", + "Attendees": "Prisotni", + "Issue is closed": "Težava je zaprta", + "Could not save the entry. Please try again.": "Vnosa ni bilo mogoče shraniti. Poskusite znova.", + "From: {title}": "Iz: {title}", + "What needs to happen": "Kaj je treba narediti", + "Could not create the action. Please try again.": "Dejanja ni bilo mogoče ustvariti. Poskusite znova.", + "The action was created but could not be linked to the entry.": "Dejanje je ustvarjeno, vendar ga ni bilo mogoče povezati z vnosom.", + "Project pages": "Strani projekta", + "Overview": "Pregled", + "Risks": "Tveganja", + "Log entry": "Vnos v dnevnik", + "A short name for the entry": "Kratko ime vnosa", + "Project": "Projekt", + "The project this entry belongs to": "Projekt, ki mu vnos pripada", + "What kind of entry this is": "Kakšne vrste je vnos", + "When it happened": "Kdaj se je zgodilo", + "What happened, in Markdown": "Kaj se je zgodilo, v Markdownu", + "Whether an issue is still open": "Ali je težava še odprta", + "The people at a meeting": "Ljudje na sestanku", + "Tasks that came out of this entry": "Opravila, ki izhajajo iz tega vnosa", + "Add risk": "Dodaj tveganje", + "Risk": "Tveganje", + "Score": "Ocena", + "Response": "Odziv", + "Review date": "Datum pregleda", + "no longer on the project": "ni več na projektu", + "Edit {title}": "Uredi {title}", + "No risks recorded yet": "Še ni zabeleženih tveganj", + "Add the first risk": "Dodaj prvo tveganje", + "Medium": "Srednje", + "Mitigating": "V blaženju", + "Occurred": "Nastopilo", + "Avoid": "Izogniti se", + "Reduce": "Zmanjšati", + "Transfer": "Prenesti", + "Accept": "Sprejeti", + "Highest open risks": "Najvišja odprta tveganja", + "No open risks": "Ni odprtih tveganj", + "Open the risk register": "Odpri register tveganj", + "Edit risk": "Uredi tveganje", + "What could go wrong": "Kaj lahko gre narobe", + "Likelihood": "Verjetnost", + "Impact": "Vpliv", + "Score {score}": "Ocena {score}", + "Countermeasures": "Protiukrepi", + "Could not save the risk. Please try again.": "Tveganja ni bilo mogoče shraniti. Poskusite znova.", + "Risks by likelihood and impact": "Tveganja po verjetnosti in vplivu", + "Risk scale": "Lestvica tveganj", + "The levels every project scores its risks on, and where low turns into medium and high": "Ravni, na katerih vsak projekt ocenjuje svoja tveganja, in kje nizko preide v srednje in visoko", + "Number of levels": "Število ravni", + "Likelihood labels": "Oznake verjetnosti", + "Impact labels": "Oznake vpliva", + "Level {level}": "Raven {level}", + "Medium from score": "Srednje od ocene", + "High from score": "Visoko od ocene", + "Risk scale saved": "Lestvica tveganj je shranjena", + "1 risk uses level {level}. Change it first.": "1 tveganje uporablja raven {level}. Najprej ga spremenite.", + "{count} risks use level {level}. Change them first.": "Tveganja z ravnjo {level}: {count}. Najprej jih spremenite.", + "Every level needs a label, and high must start above medium.": "Vsaka raven potrebuje oznako, visoko pa se mora začeti nad srednjim.", + "The project this risk belongs to": "Projekt, ki mu tveganje pripada", + "The cause and the effect, in Markdown": "Vzrok in posledica, v Markdownu", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Prosto združevanje, npr. načrtovanje, proračun ali dobavitelj", + "How likely it is, on the admin's risk scale": "Kako verjetno je, na lestvici tveganj skrbnika", + "How hard it would hit, on the admin's risk scale": "Kako močno bi prizadelo, na lestvici tveganj skrbnika", + "Likelihood times impact, calculated by the server": "Verjetnost krat vpliv, izračuna strežnik", + "Where the risk stands": "Kje je tveganje", + "The person who watches this risk": "Oseba, ki spremlja to tveganje", + "How the project answers the risk": "Kako se projekt odziva na tveganje", + "What is done to prevent it or soften it, in Markdown": "Kaj se naredi, da se prepreči ali omili, v Markdownu", + "When to look at this risk again": "Kdaj tveganje znova pregledati", + "Very low": "Zelo nizko", + "Very high": "Zelo visoko", + "All projects": "Vsi projekti", + "Project status report": "Poročilo o stanju projekta", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datirano poročilo o tem, kako projekt stoji pri denarju, organizaciji, času, informacijah, kakovosti in tveganju (vidiki GROTIK), vsak z opombo.", + "The project this report is about": "Projekt, na katerega se poročilo nanaša", + "Report date": "Datum poročila", + "The day the report describes": "Dan, ki ga poročilo opisuje", + "Money": "Denar", + "How the project stands on this aspect": "Kako projekt stoji pri tem vidiku", + "On track": "Po načrtu", + "At risk": "Ogroženo", + "Off track": "Izven načrta", + "Money note": "Opomba o denarju", + "A short explanation of this status": "Kratka razlaga tega stanja", + "Organisation": "Organizacija", + "Organisation note": "Opomba o organizaciji", + "Time": "Čas", + "Time note": "Opomba o času", + "Information": "Informacije", + "Information note": "Opomba o informacijah", + "Quality": "Kakovost", + "Quality note": "Opomba o kakovosti", + "Risk note": "Opomba o tveganju", + "Overall": "Skupno", + "The worst of the six statuses, calculated by the server": "Najslabše od šestih stanj, izračuna ga strežnik", + "Health: money": "Stanje: denar", + "Copied from the newest status report": "Prevzeto iz najnovejšega poročila o stanju", + "Health: organisation": "Stanje: organizacija", + "Health: time": "Stanje: čas", + "Health: information": "Stanje: informacije", + "Health: quality": "Stanje: kakovost", + "Health: risk": "Stanje: tveganje", + "Health: overall": "Stanje: skupno", + "Health: report date": "Stanje: datum poročila", + "The date of the newest status report": "Datum najnovejšega poročila o stanju", + "New report": "Novo poročilo", + "Only the project owner writes status reports.": "Poročila o stanju piše samo lastnik projekta.", + "Latest report, {date}": "Zadnje poročilo, {date}", + "Aspect": "Vidik", + "Note": "Opomba", + "Report history": "Zgodovina poročil", + "Author": "Avtor", + "No status reports yet": "Še ni poročil o stanju", + "Write the first report": "Napiši prvo poročilo", + "Choose a status for every aspect to save the report.": "Za shranjevanje poročila izberite stanje za vsak vidik.", + "Suggested: on track.": "Predlog: po načrtu.", + "Suggested: at risk.": "Predlog: ogroženo.", + "Suggested: off track.": "Predlog: izven načrta.", + "1 task is past its due date.": "1 opravilo je čez rok.", + "{count} tasks are past their due date.": "Opravila čez rok: {count}.", + "The end date has passed with 1 open task.": "Končni datum je minil z 1 odprtim opravilom.", + "The end date has passed with {count} open tasks.": "Končni datum je minil, odprta opravila: {count}.", + "No open task is past its due date.": "Nobeno odprto opravilo ni čez rok.", + "The highest open risk, \"{title}\", scores {score}.": "Najvišje odprto tveganje, \"{title}\", ima oceno {score}.", + "There are no open risks.": "Ni odprtih tveganj.", + "Costs are at {percent}% of the budget.": "Stroški so pri {percent}% proračuna.", + "No suggestion: the project has no budget.": "Brez predloga: projekt nima proračuna.", + "No suggestion: no costs are recorded for this project yet.": "Brez predloga: za ta projekt še ni zabeleženih stroškov.", + "The report was not saved. Only the project owner can write status reports.": "Poročilo ni bilo shranjeno. Poročila o stanju lahko piše samo lastnik projekta.", + "No report": "Ni poročila", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Skupina projektov, ki jih vodijo isti ljudje, na primer oddelek ali program. Njeni upravitelji berejo vsak projekt v njej.", + "The name of the portfolio": "Ime portfelja", + "What the portfolio holds and who runs it": "Kaj portfelj vsebuje in kdo ga vodi", + "A colour for the portfolio's section in project lists": "Barva razdelka portfelja v seznamih projektov", + "Managers": "Upravitelji", + "Nextcloud user UIDs of the people who run the portfolio": "Uporabniški ID-ji Nextcloud ljudi, ki vodijo portfelj", + "Order": "Vrstni red", + "Where the portfolio comes in project lists, lowest first": "Kje je portfelj v seznamih projektov, najnižji najprej", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Lastna lestvica tveganj tega portfelja v obliki JSON, v enaki obliki kot lestvica celotne aplikacije. Prazno pomeni lestvico aplikacije.", + "Portfolio readers": "Bralci portfelja", + "Nextcloud user UIDs of the managers of the project's portfolio": "Uporabniški ID-ji Nextcloud upraviteljev portfelja projekta", + "The portfolio this project belongs to": "Portfelj, kateremu projekt pripada", + "No portfolio": "Brez portfelja", + "All portfolios": "Vsi portfelji", + "You read this project as a manager of its portfolio. Only its members change it.": "Ta projekt berete kot upravitelj njegovega portfelja. Spreminjajo ga le njegovi člani.", + "Portfolios": "Portfelji", + "Portfolio status": "Stanje portfelja", + "No portfolios yet": "Še ni portfeljev", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Skrbnik doda portfelje v Projekti, Portfelji. Projekti v portfelju so tukaj navedeni s svojim stanjem.", + "Roll-up": "Povzetek", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} po načrtu, {atRisk} ogroženih, {offTrack} izven načrta, {noReport} brez poročila", + "No project in this portfolio that you can read.": "V tem portfelju ni projekta, ki ga lahko berete.", + "Start": "Začetek", + "End": "Konec", + "Budget": "Proračun", + "Last report": "Zadnje poročilo", + "Out of date": "Zastarelo", + "Portfolio timeline": "Časovnica portfelja", + "Zoom": "Povečava", + "Could not load the timeline": "Časovnice ni bilo mogoče naložiti", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Skrbnik doda portfelje v Projekti, Portfelji. Projekti v portfelju so tukaj na eni časovnici.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Odprite projekt, da vidite njegove faze in naloge. Časovnica je samo za branje.", + "Phase: {title}": "Faza: {title}", + "Left out because you cannot read them: {count} projects": "Izpuščeno, ker jih ne morete brati: {count} projektov", + "Week": "Teden", + "Day": "Dan", + "Month": "Mesec", + "Please try again later.": "Poskusite znova pozneje.", + "Status reports": "Poročila o stanju", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Po koliko dneh je zadnje poročilo o stanju projekta v pregledu portfelja označeno kot zastarelo", + "Reporting period (days)": "Obdobje poročanja (dni)", + "The reporting period is a whole number of days from 1 to 365.": "Obdobje poročanja je celo število dni od 1 do 365.", + "Reporting period saved": "Obdobje poročanja shranjeno", + "The reporting period was not saved. Please try again.": "Obdobje poročanja ni bilo shranjeno. Poskusite znova.", + "Every project of a portfolio with its status per aspect, rolled up.": "Vsak projekt portfelja s stanjem po vidikih, povzeto.", + "The projects of a portfolio on one timeline.": "Projekti portfelja na eni časovnici.", + "Phases": "Faze", + "Add phase": "Dodaj fazo", + "No phases yet": "Še ni faz", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Razdelite projekt na faze, na primer zagon, opredelitev in izvedbo. Faza se zaključi, ko je naložen njen zaključni dokument.", + "{hours} hours": "{hours} ur", + "Concluding document: {title}": "Zaključni dokument: {title}", + "Concluding document missing": "Zaključni dokument manjka", + "Move {title} up": "Premakni {title} gor", + "Move {title} down": "Premakni {title} dol", + "Close phase": "Zaključi fazo", + "Phase": "Faza", + "Files": "Datoteke", + "Notes": "Opombe", + "Audit trail": "Revizijska sled", + "Edit phase": "Uredi fazo", + "Name": "Ime", + "Budget hours": "Načrtovane ure", + "Could not save the phase. Please try again.": "Faze ni bilo mogoče shraniti. Poskusite znova.", + "Close phase {title}": "Zaključi fazo {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Faza se zaključi z zaključnim dokumentom: naložite ga tukaj ali izberite eno od datotek faze.", + "Concluding document": "Zaključni dokument", + "This phase has no files yet.": "Ta faza še nima datotek.", + "Upload a document": "Naloži dokument", + "The document was not uploaded. Please try again.": "Dokument ni bil naložen. Poskusite znova.", + "Upload the concluding document before you close this phase.": "Preden zaključite to fazo, naložite zaključni dokument.", + "This phase cannot be closed from its current status.": "Te faze ni mogoče zaključiti iz njenega trenutnega stanja.", + "The phase was not closed. Please try again.": "Faza ni bila zaključena. Poskusite znova.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID datoteke te faze, ki jo zaključi. Fazo je mogoče dokončati šele, ko je nastavljen in je datoteka priložena.", + "Import from Microsoft Project": "Uvozi iz Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Izberite načrt, shranjen iz Microsoft Project v obliki XML. Nič se ne uvozi, dokler ne potrdite.", + "Plan file": "Datoteka načrta", + "What the import creates": "Kaj uvoz ustvari", + "Tasks": "Opravila", + "Sub-tasks": "Podopravila", + "Milestones": "Mejniki", + "Links": "Povezave", + "Already imported, updated in place: {count}": "Že uvoženo, posodobljeno na mestu: {count}", + "What does not carry over": "Kaj se ne prenese", + "Tasks with resources, which are not imported: {count}": "Opravila z viri, ki se ne uvozijo: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Opravila globlje od ravni 3, postavljena pod njihovo opravilo ravni 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Povezave, ki niso konec-začetek, uvožene kot sorodne povezave: {count}", + "Link lags, which are dropped: {count}": "Zamiki povezav, ki se opustijo: {count}", + "Links to a summary task, which are not imported: {count}": "Povezave na povzetek opravil, ki se ne uvozijo: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Povezave na opravila zunaj tega načrta, ki se ne uvozijo: {count}", + "No longer in the plan": "Ni več v načrtu", + "These stay in the project; remove them yourself if they are no longer needed.": "Ostanejo v projektu; odstranite jih sami, če jih ne potrebujete več.", + "Import": "Uvozi", + "Close": "Zapri", + "The plan is imported: {created} created, {updated} updated.": "Načrt je uvožen: ustvarjeno {created}, posodobljeno {updated}.", + "Links that would close a loop were left out: {count}": "Povezave, ki bi zaprle zanko, so izpuščene: {count}", + "The import stopped part-way. Run it again to finish it.": "Uvoz se je ustavil na pol poti. Zaženite ga znova, da ga dokončate.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Shranite načrt v Microsoft Project z Datoteka, Shrani kot, oblika XML, in uvozite to datoteko.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ta datoteka deklarira DOCTYPE ali entitete, ki niso sprejete.", + "The file is larger than 10 MB.": "Datoteka je večja od 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Načrt ima več kot 2000 opravil, več, kot jih sprejme en uvoz.", + "This file is not a Microsoft Project plan in XML format.": "Ta datoteka ni načrt Microsoft Project v obliki XML.", + "Choose a file to import.": "Izberite datoteko za uvoz.", + "Only the project owner can import a plan.": "Načrt lahko uvozi samo lastnik projekta.", + "The plan could not be read. Please try again.": "Načrta ni bilo mogoče prebrati. Poskusite znova.", + "Linked case: {title}": "Povezana zadeva: {title}", + "Linked to a case": "Povezano z zadevo", + "Hand over to case": "Predaj zadevi", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Nespremenjeno kopira vsako datoteko projekta in njegovih opravil ter datoteko, ki opisuje projekt, v povezano zadevo.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopirane datoteke: {count}", + "Files that failed: {names}": "Neuspele datoteke: {names}", + "The handover failed. Please try again.": "Predaja ni uspela. Poskusite znova.", + "The linked case could not be found, or you cannot open it.": "Povezane zadeve ni mogoče najti ali je ne morete odpreti.", + "Case handovers": "Predaje zadevi", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Vsakokratna predaja datotek in metapodatkov projekta njegovi zadevi: kdaj, kdo, kateri zadevi, vsaka kopirana datoteka z njenim SHA-256 in neuspele datoteke.", + "Finance": "Finance", + "Add cost line": "Dodaj stroškovno postavko", + "Delivery terms": "Pogoji dobave", + "Billing model": "Model obračunavanja", + "Budget in euro": "Proračun v evrih", + "Budget in hours": "Proračun v urah", + "Hourly rate in euro": "Urna postavka v evrih", + "Planned start": "Načrtovani začetek", + "Planned end": "Načrtovani konec", + "Planned dates": "Načrtovani datumi", + "Budget {amount}": "Proračun {amount}", + "No budget agreed": "Proračun ni dogovorjen", + "Hours": "Ure", + "Only the project owner and the portfolio managers see the amounts.": "Zneske vidijo samo lastnik projekta in upravitelji portfelja.", + "Budget against cost per category": "Proračun v primerjavi s stroški po kategorijah", + "Labour (booked time)": "Delo (vpisane ure)", + "No category": "Brez kategorije", + "Hours are not available": "Ure niso na voljo", + "Not yet assigned to a category": "Še ni dodeljeno kategoriji", + "Total": "Skupaj", + "{spent} spent, {remaining} remaining": "{spent} porabljeno, {remaining} preostane", + "Budget against cost per phase": "Proračun v primerjavi s stroški po fazah", + "No phase": "Brez faze", + "Cost lines": "Stroškovne postavke", + "From the finance system": "Iz finančnega sistema", + "Edit cost line {amount}": "Uredi stroškovno postavko {amount}", + "No cost lines yet": "Še ni stroškovnih postavk", + "Commitments": "Obveznosti", + "Actual cost": "Dejanski stroški", + "Forecast": "Napoved", + "Remaining": "Preostane", + "Not planned yet": "Še ni načrtovano", + "{start} to {end}": "{start} do {end}", + "The terms were not saved. Please try again.": "Pogoji niso bili shranjeni. Poskusite znova.", + "Terms saved": "Pogoji shranjeni", + "Fixed price": "Fiksna cena", + "Hourly": "Na uro", + "Not billed": "Ni obračunano", + "Commitment": "Obveznost", + "Edit cost line": "Uredi stroškovno postavko", + "Kind": "Vrsta", + "Amount in euro": "Znesek v evrih", + "Remove": "Odstrani", + "Could not save the cost line. Only the project owner changes the money of a project.": "Stroškovne postavke ni bilo mogoče shraniti. Denar projekta spreminja samo lastnik projekta.", + "Could not remove the cost line. Please try again.": "Stroškovne postavke ni bilo mogoče odstraniti. Poskusite znova.", + "{amount} over budget": "{amount} nad proračunom", + "Cost categories": "Kategorije stroškov", + "The categories every project splits its budget and costs into, one per line": "Kategorije, na katere vsak projekt razdeli svoj proračun in stroške, ena na vrstico", + "Categories": "Kategorije", + "Give at least one category, each name once.": "Navedite vsaj eno kategorijo, vsako ime enkrat.", + "Cost categories saved": "Kategorije stroškov shranjene", + "The cost categories were not saved. Please try again.": "Kategorije stroškov niso bile shranjene. Poskusite znova.", + "Finance line": "Finančna postavka", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "En denarni znesek projekta: proračun, obveznost, dejanski strošek ali napoved, v kategoriji stroškov in po želji v fazi. Vnese jo lastnik projekta ali finančni sistem prek integracijske aplikacije.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt, ki mu znesek pripada. Prazno za postavko iz finančnega sistema, katere številka projekta se ne ujema z nobenim projektom.", + "The phase this amount belongs to, if any": "Faza, ki ji znesek pripada, če obstaja", + "The cost category, one of the categories the admin set up": "Kategorija stroškov, ena od kategorij, ki jih je nastavil skrbnik", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Ali je znesek proračun, obveznost, dejanski strošek ali napoved", + "Amount": "Znesek", + "The amount in the reporting currency (euro)": "Znesek v valuti poročanja (evro)", + "The date the amount was booked or is expected": "Datum, ko je bil znesek knjižen ali se pričakuje", + "What the amount is for": "Za kaj je znesek", + "Whether a person entered the line or the finance system sent it": "Ali je postavko vnesla oseba ali jo je poslal finančni sistem", + "Entered by hand": "Vneseno ročno", + "Finance line id": "Id finančne postavke", + "The finance system's own id of this line. One imported line per id.": "Lasten id te postavke v finančnem sistemu. Ena uvožena postavka na id.", + "Project number": "Številka projekta", + "The project number the finance system sent, matched against the project key": "Številka projekta, ki jo je poslal finančni sistem, primerjana s ključem projekta", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfelj projekta postavke, prepisan iz projekta, da seštevki portfelja potrebujejo en filter", + "Finance readers": "Bralci financ", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-ji uporabnikov Nextcloud, ki smejo videti ta znesek: lastnik projekta in upravitelji njegovega portfelja", + "Project owner": "Lastnik projekta", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID uporabnika Nextcloud lastnika projekta, ki sme spreminjati in odstranjevati ročne postavke", + "How the client pays: not billed, a fixed price, or by the hour.": "Kako stranka plača: ni obračunano, fiksna cena ali na uro.", + "Portfolio finance": "Finance portfelja", + "You cannot see the money of any project in this portfolio": "Ne vidite denarja nobenega projekta v tem portfelju", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Strežnik je vrnil stroškovne postavke projektov zunaj tega portfelja, zato so seštevki morda napačni.", + "Projects left out because you cannot see their money: {count}": "Izpuščeni projekti, ker ne vidite njihovega denarja: {count}", + "Unmatched finance lines": "Nepovezane finančne postavke", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Proračun, obveznosti, dejanski stroški in napoved, sešteti za portfelj.", + "Subprojects": "Podprojekti", + "{done} of {total}": "{done} od {total}", + "{done} of {total} tasks done, including subprojects": "{done} od {total} opravil končanih, vključno s podprojekti", + "Show the subprojects of {title}": "Pokaži podprojekte {title}", + "Hide the subprojects of {title}": "Skrij podprojekte {title}", + "Part of": "Del", + "No parent project": "Brez nadrejenega projekta", + "A project cannot sit under one of its own subprojects.": "Projekt ne more biti pod enim od svojih podprojektov.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekti se gnezdijo največ tri ravni globoko: program, projekt in podprojekt.", + "Parent project": "Nadrejeni projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt, pod katerim je ta projekt, na primer program. Projekti se gnezdijo največ tri ravni globoko.", + "Yes": "Da", + "No": "Ne", + "{label} (required)": "{label} (obvezno)", + "{label} is required": "{label} je obvezno", + "Project field": "Polje projekta", + "A field an admin adds to every project, such as a policy area or a contract value.": "Polje, ki ga skrbnik doda vsakemu projektu, na primer področje politike ali vrednost pogodbe.", + "Key": "Ključ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stalno ime, pod katerim se vrednost shrani, v lower camel case. Ohranite ga, ko ga projekti uporabljajo.", + "Label": "Oznaka", + "The name people see next to the field": "Ime, ki ga ljudje vidijo ob polju", + "What the field holds": "Kaj polje vsebuje", + "Text": "Besedilo", + "Number": "Število", + "Choice": "Izbira", + "Person": "Oseba", + "Yes or no": "Da ali ne", + "Options": "Možnosti", + "The choices of a choice field": "Možnosti izbirnega polja", + "Required": "Obvezno", + "Whether a project must fill in the field": "Ali mora projekt izpolniti polje", + "Where the field appears, lowest first": "Kje se polje pojavi, najnižje najprej", + "Applies to": "Velja za", + "What the field is added to": "Čemu se polje doda", + "Custom fields": "Lastna polja", + "The values of the project fields an admin defined, keyed by the field's key.": "Vrednosti polj projekta, ki jih je določil skrbnik, po ključu polja.", + "Project fields": "Polja projekta", + "Related": "Povezano", + "Remove link": "Odstrani povezavo", + "Link type": "Vrsta povezave", + "Relates to": "Povezano z", + "Duplicates": "Podvaja", + "Project key": "Ključ projekta", + "Every task number starts with it, such as VERG-42.": "Vsaka številka naloge se začne z njim, na primer VERG-42.", + "This key is already used by another project.": "Ta ključ že uporablja drug projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Uporabite od 2 do 10 črk in števk, ki se začnejo s črko.", + "The key cannot change once tasks carry it.": "Ključa ni mogoče spremeniti, ko ga nosijo naloge.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt je shranjen. Obstoječe naloge dobijo številke v ozadju.", + "Next task number": "Številka naslednje naloge", + "The number the next task of this project gets in its key. Only the system writes it.": "Številka, ki jo naslednja naloga tega projekta dobi v svojem ključu. Piše jo samo sistem.", + "Restore {title}": "Obnovi {title}", + "Restore": "Obnovi", + "Project restored": "Projekt je obnovljen", + "Could not restore the project": "Projekta ni bilo mogoče obnoviti", + "Bring this project back to the active list.": "Vrni ta projekt na seznam aktivnih projektov.", + "Restore project": "Obnovi projekt", + "Request reason": "Razlog za zahtevo", + "Why the requester needs this project. Filled in when the project is requested.": "Zakaj vlagatelj potrebuje ta projekt. Izpolni se ob zahtevi.", + "Reviewed by": "Pregledal", + "The user who approved or rejected the request.": "Uporabnik, ki je zahtevo odobril ali zavrnil.", + "Reviewed at": "Pregledano", + "When the request was approved or rejected.": "Kdaj je bila zahteva odobrena ali zavrnjena.", + "Review note": "Opomba pregledovalca", + "The reviewer's reason, shown to the requester when a request is not approved.": "Razlog pregledovalca, ki ga vlagatelj vidi, ko zahteva ni odobrena.", + "Members of these groups": "Člani teh skupin", + "Groups that may create projects": "Skupine, ki lahko ustvarjajo projekte", + "The group {group} no longer exists. Save to remove it.": "Skupina {group} ne obstaja več. Shranite, da jo odstranite.", + "Review project request": "Preglej zahtevo za projekt", + "Requested by": "Zahteval", + "Why it is needed": "Zakaj je potreben", + "Desired start date": "Želeni datum začetka", + "Why is it not approved?": "Zakaj ni odobren?", + "Give a reason. The requester sees it.": "Navedite razlog. Vlagatelj ga bo videl.", + "Approve": "Odobri", + "Reject": "Zavrni", + "Reject request": "Zavrni zahtevo", + "The review was not saved. Try again.": "Pregled ni bil shranjen. Poskusite znova.", + "This project is waiting for review": "Ta projekt čaka na pregled", + "This request was not approved": "Ta zahteva ni bila odobrena", + "Reason: {note}": "Razlog: {note}", + "Review request": "Preglej zahtevo", + "Request a project": "Zahtevaj projekt", + "Step {step} of 2": "Korak {step} od 2", + "Why is this project needed?": "Zakaj je ta projekt potreben?", + "Give a reason. The reviewer reads it.": "Navedite razlog. Pregledovalec ga bo prebral.", + "Back": "Nazaj", + "Next": "Naprej", + "Send request": "Pošlji zahtevo", + "The request was not sent. Try again.": "Zahteva ni bila poslana. Poskusite znova.", + "Requested": "Zahtevano", + "Not approved": "Ni odobreno", + "Your request was sent": "Vaša zahteva je bila poslana", + "Let everyone else request a project": "Dovoli vsem drugim, da zahtevajo projekt", + "Add a task": "Dodaj nalogo", + "Delete task": "Izbriši nalogo", + "Edit task": "Uredi nalogo", + "Write": "Piši", + "Preview": "Predogled", + "Markdown works here: headings, lists and links.": "Tu deluje Markdown: naslovi, seznami in povezave.", + "Could not save the task. Please try again.": "Naloge ni bilo mogoče shraniti. Poskusite znova.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Na nalogi \"{title}\" je zabeležen čas, zato je ni mogoče izbrisati. Namesto tega jo lahko prekličete: vnosi časa ostanejo.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Izbrišem \"{title}\"? Odstranjene bodo tudi njene povezave z drugimi nalogami. Tega ni mogoče razveljaviti.", + "Keep task": "Obdrži nalogo", + "Cancel task": "Prekliči nalogo", + "Only the reporter, the project owner or an admin can delete this task.": "To nalogo lahko izbriše le prijavitelj, lastnik projekta ali skrbnik.", + "Could not delete the task. Please try again.": "Naloge ni bilo mogoče izbrisati. Poskusite znova.", + "Could not cancel the task. Please try again.": "Naloge ni bilo mogoče preklicati. Poskusite znova.", + "Responsible": "Odgovorna oseba", + "Also working on this": "Pri tem sodelujejo tudi", + "Labels": "Oznake", + "Could not change the priority. Please try again.": "Prioritete ni bilo mogoče spremeniti. Poskusite znova.", + "Other project members who work on this task alongside the person responsible.": "Drugi člani projekta, ki pri tej nalogi sodelujejo z odgovorno osebo.", + "Duplicate": "Podvoji", + "Could not copy the task. Please try again.": "Naloge ni bilo mogoče kopirati. Poskusite znova.", + "Subtasks": "Podnaloge", + "{done} of {total} done": "Končano {done} od {total}", + "Add a subtask": "Dodaj podnalogo", + "Checklist": "Kontrolni seznam", + "Checklist item actions": "Dejanja elementa seznama", + "Add a checklist item": "Dodaj element seznama", + "Subtasks: {estimate} estimated, {logged} logged": "Podnaloge: ocena {estimate}, zabeleženo {logged}", + "Total estimate: {total}": "Skupna ocena: {total}", + "Part of {title}": "Del naloge {title}", + "Checklist: {count} done": "Kontrolni seznam: končano {count}", + "This task has subtasks: {count}.": "Ta naloga ima podnaloge: {count}.", + "Keep subtasks as separate tasks": "Obdrži podnaloge kot ločene naloge", + "Delete subtasks too": "Izbriši tudi podnaloge", + "Copy of {title}": "Kopija: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Naloga je bila kopirana, a ne vse njene podnaloge. Preverite kopijo.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Majhni koraki znotraj naloge. Vsak element ima id, besedilo in podatek, ali je končan.", + "Open work per person and per project.": "Odprto delo po osebah in projektih.", + "View": "Pogled", + "By person": "Po osebi", + "By project": "Po projektu", + "Hours left": "Preostale ure", + "Tasks without an estimate": "Naloge brez ocene", + "Due in 14 days": "Rok v 14 dneh", + "Shared": "Deljeno", + "Unassigned": "Nedodeljeno", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Prikazano je delo v projektih, ki jih lahko vidite. Ure štejejo za odgovorno osebo; deljene naloge se štejejo brez ur.", + "No open work in these projects.": "V teh projektih ni odprtega dela.", + "Open work": "Odprto delo", + "{count} open tasks": "{count} odprtih nalog", + "Create a project to see capacity here.": "Ustvarite projekt, da tukaj vidite zmogljivost.", + "My tasks": "Moje naloge", + "Show all my tasks": "Pokaži vse moje naloge", + "No tasks assigned to you": "Nimate dodeljenih nalog", + "Browse projects": "Prebrskaj projekte", + "Later": "Kasneje", + "Due {date}": "Rok {date}", + "Could not change the status. Please try again.": "Stanja ni bilo mogoče spremeniti. Poskusite znova.", + "Completed today": "Končano danes", + "My open tasks": "Moje odprte naloge", + "My overdue tasks": "Moje zamujene naloge", + "My tasks in progress": "Moje naloge v teku", + "Pin to the top": "Pripni na vrh", + "Unpin": "Odpni", + "Pinned": "Pripeto", + "Actions for {title}": "Dejanja za {title}", + "Could not save your project order. Please try again.": "Vrstnega reda projektov ni bilo mogoče shraniti. Poskusite znova.", + "No boards yet": "Še ni tabel", + "Create a project to get a board.": "Ustvarite projekt, da dobite tablo.", + "Use the Projects page to create and manage your projects and tasks.": "Na strani Projekti ustvarjajte in upravljajte svoje projekte in naloge.", + "Go to projects": "Pojdi na projekte", + "You are not a member of any projects yet.": "Niste še član nobenega projekta.", + "Could not search for users. Please try again.": "Uporabnikov ni bilo mogoče poiskati. Poskusite znova.", + "Project creation is restricted to administrators.": "Projekte lahko ustvarjajo samo skrbniki.", + "Only the project owner or an administrator can delete this project.": "Ta projekt lahko izbriše samo lastnik projekta ali skrbnik.", + "No projects are available to you yet. Ask an administrator to create one.": "Na voljo še nimate nobenega projekta. Prosite skrbnika, naj ga ustvari.", + "Due: {date}": "Rok: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Naloge z datumom začetka ali rokom so prikazane na časovnici. Dodajte datume, da jih vidite tukaj.", + "You do not have access to this project.": "Nimate dostopa do tega projekta.", + "Zoom level": "Raven povečave", + "Unscheduled": "Nenačrtovano", + "Start: {date}": "Začetek: {date}", + "Today": "Danes", + "No scheduled tasks": "Ni načrtovanih nalog", + "An unexpected error occurred.": "Prišlo je do nepričakovane napake.", + "Column {number} name": "Ime stolpca {number}", + "Failed to save creation policy": "Pravila za ustvarjanje ni bilo mogoče shraniti", + "All authenticated users": "Vsi prijavljeni uporabniki", + "Control who may create new projects": "Določite, kdo sme ustvarjati nove projekte", + "Administrators only": "Samo skrbniki", + "Project creation": "Ustvarjanje projektov", + "Allow project creation": "Dovoli ustvarjanje projektov", + "Creation policy saved successfully": "Pravilo za ustvarjanje je shranjeno", + "Initializing…": "Zaganjanje…", + "e.g. 2h 30m, 90m, 1.5h": "npr. 2h 30m, 90m, 1.5h", + "Log time": "Zabeleži čas", + "Save estimate": "Shrani oceno", + "Logged: {logged}": "Zabeleženo: {logged}", + "over by {amount}": "preseženo za {amount}", + "Time tracking": "Beleženje časa", + "Estimate": "Ocena", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Vnesite veljavno oceno (npr. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Vnesite veljavno trajanje (npr. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Vnosa časa ni bilo mogoče shraniti. Poskusite znova.", + "Edit time entry": "Uredi vnos časa", + "Duration": "Trajanje", + "Date range": "Obdobje", + "Last week": "Prejšnji teden", + "No time logged": "Ni zabeleženega časa", + "Log time on a task to see it here.": "Zabeležite čas na nalogi, da ga vidite tukaj.", + "To date": "Do datuma", + "This week": "Ta teden", + "Total: {total}": "Skupaj: {total}", + "From date": "Od datuma", + "Custom range": "Obdobje po meri", + "All time": "Ves čas", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Naloge ni bilo mogoče izbrisati, zato lahko ostanejo podatki. Znova izbrišite projekt.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Vnosa časa ni bilo mogoče izbrisati, zato lahko ostanejo podatki. Znova izbrišite projekt.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Stolpca ni bilo mogoče izbrisati, zato lahko ostanejo podatki. Znova izbrišite projekt.", + "Could not delete the project. Please try again.": "Projekta ni bilo mogoče izbrisati. Poskusite znova.", + "Notification settings": "Nastavitve obvestil", + "Configure when due-date reminders are sent": "Nastavite, kdaj se pošiljajo opomniki za roke", + "Due-date reminder lead time (hours)": "Vnaprejšnji čas opomnika za rok (ure)", + "Lead time must be between 1 and 336 hours": "Vnaprejšnji čas mora biti med 1 in 336 urami", + "Reminder lead time saved successfully": "Vnaprejšnji čas opomnika je shranjen", + "Failed to save reminder lead time": "Vnaprejšnjega časa opomnika ni bilo mogoče shraniti", + "Notifications": "Obvestila", + "Notify me 1 day before a task's due date": "Obvesti me 1 dan pred rokom naloge", + "Draft": "Osnutek", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Ali je ura osnutek, ki ga vidi samo njen učitelj, poteka ali je odpovedana.", + "New release": "Nova izdaja", + "Roadmap chart. The same releases and epics are listed below.": "Grafikon načrta razvoja. Iste izdaje in epi so navedeni spodaj.", + "Nothing on the roadmap yet": "Na načrtu razvoja še ni ničesar", + "Releases with a target date and epics with dated tasks appear here.": "Tu se prikažejo izdaje s ciljnim datumom in epi z nalogami, ki imajo datum.", + "Releases": "Izdaje", + "No releases yet": "Še ni izdaj", + "Target date: {date}": "Ciljni datum: {date}", + "No target date": "Brez ciljnega datuma", + "Edit {name}": "Uredi {name}", + "Mark {name} as released": "Označi {name} kot izdano", + "Mark as released": "Označi kot izdano", + "Epics": "Epi", + "No epics yet. Open a task to make it an epic.": "Še ni epov. Odprite nalogo, da jo spremenite v ep.", + "Not scheduled yet": "Še ni načrtovano", + "Planned": "Načrtovano", + "Released": "Izdano", + "Edit release": "Uredi izdajo", + "Target date": "Ciljni datum", + "Could not save the release. Please try again.": "Izdaje ni bilo mogoče shraniti. Poskusite znova.", + "Every task of this release is done or cancelled.": "Vsaka naloga te izdaje je opravljena ali preklicana.", + "Not finished yet: {count}": "Še ni končano: {count}", + "What happens to these tasks?": "Kaj se zgodi s temi nalogami?", + "Move to {name}": "Premakni v {name}", + "Remove the release": "Odstrani izdajo", + "Keep it on {name}": "Pusti jih v {name}", + "Could not mark the release as released. Please try again.": "Izdaje ni bilo mogoče označiti kot izdane. Poskusite znova.", + "Roadmap": "Načrt razvoja", + "Tasks or roadmap": "Naloge ali načrt razvoja", + "Release": "Izdaja", + "Epic": "Ep", + "This task is an epic": "Ta naloga je ep", + "A named, dated delivery of a project that its tasks are planned against.": "Poimenovana in datirana dobava projekta, glede na katero se načrtujejo njegove naloge.", + "Name of the release": "Ime izdaje", + "The project this release belongs to": "Projekt, ki mu pripada ta izdaja", + "What this release delivers": "Kaj ta izdaja dobavi", + "When work on the release starts": "Kdaj se začne delo na izdaji", + "The date the release is due": "Datum, do katerega mora biti izdaja pripravljena", + "Whether the release is planned, released or archived": "Ali je izdaja načrtovana, izdana ali arhivirana", + "Released on": "Izdano", + "When the release was marked as released": "Kdaj je bila izdaja označena kot izdana", + "The release this task is planned for": "Izdaja, za katero je ta naloga načrtovana", + "Board view options": "Možnosti pogleda table", + "Colour cards": "Obarvaj kartice", + "No colour": "Brez barve", + "By label": "Po oznaki", + "Swimlanes": "Plavalne steze", + "No swimlanes": "Brez plavalnih stez", + "By assignee": "Po izvajalcu", + "By epic": "Po epu", + "No assignee": "Ni dodeljeno", + "No epic": "Brez epa", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartice ostanejo v vrstici svojega epa. Ep spremenite na strani naloge.", + "Hand over to": "Predaj", + "Could not save your board view. It applies until you reload.": "Pogleda table ni bilo mogoče shraniti. Velja do ponovnega nalaganja.", + "Timetable wish": "Želja za urnik", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Želja, ki jo generator upošteva. Trdo željo vedno spoštuje, mehko, kjer lahko.", + "Whether the wish is about a teacher, a group, a room or one activity": "Ali se želja nanaša na učitelja, skupino, prostor ali eno dejavnost", + "Teacher": "Učitelj", + "Group": "Skupina", + "Reference": "Sklic", + "The user, group, room or activity the wish is about": "Uporabnik, skupina, prostor ali dejavnost, na katero se želja nanaša", + "What the wish asks for": "Kaj želja zahteva", + "Not on these periods": "Ne v teh urah", + "Preferably not on these periods": "Raje ne v teh urah", + "At most a number of lessons a day": "Največ določeno število ur na dan", + "No free periods between lessons": "Brez prostih ur med urami", + "Always the same room": "Vedno isti prostor", + "Periods": "Ure", + "The periods of the week the wish is about, such as wed-5": "Ure v tednu, na katere se želja nanaša, npr. wed-5", + "Limit": "Meja", + "The most lessons a day, for a wish of that kind": "Največ ur na dan, za željo te vrste", + "Strength": "Moč", + "Whether the generator must keep the wish or should keep it": "Ali mora ali naj bi generator spoštoval željo", + "Hard": "Trda", + "Soft": "Mehka", + "Weight": "Utež", + "How much a soft wish counts, from 1 to 3": "Koliko šteje mehka želja, od 1 do 3", + "Why the wish exists": "Zakaj želja obstaja", + "Timetable scenario": "Scenarij urnika", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "En tedenski vzorec, ki ga je naredil generator ali je vzet iz trenutnega urnika. Hrani svoj vhod in kako dobro spoštuje želje.", + "The name timetablers know the scenario by": "Ime, pod katerim sestavljavci urnika poznajo scenarij", + "Whether the generator made it or it came from the current timetable": "Ali ga je naredil generator ali prihaja iz trenutnega urnika", + "Generated": "Ustvarjen", + "From the current timetable": "Iz trenutnega urnika", + "Week of": "Teden od", + "The Monday of the first week of the window": "Ponedeljek prvega tedna obdobja", + "Window start": "Začetek obdobja", + "The first day the week pattern applies to": "Prvi dan, za katerega velja tedenski vzorec", + "Window end": "Konec obdobja", + "The last day the week pattern applies to": "Zadnji dan, za katerega velja tedenski vzorec", + "Waiting, generating, done, failed, or published as draft lessons": "Čaka, se ustvarja, končan, ni uspel ali objavljen kot osnutki ur", + "Waiting": "Čaka", + "Generating": "Se ustvarja", + "Failed": "Ni uspel", + "Published": "Objavljen", + "Seed": "Seme", + "The number the generator starts from, so a run can be repeated": "Število, s katerim generator začne, da je zagon mogoče ponoviti", + "Input": "Vhod", + "The periods, rooms, lessons and wishes the scenario was made from": "Ure, prostori, učne ure in želje, iz katerih je nastal scenarij", + "Placements": "Umestitve", + "Each lesson with the period and room it was given": "Vsaka učna ura z uro in prostorom, ki ju je dobila", + "Unplaced lessons": "Neumeščene ure", + "Lessons without a place, each with the hard wish that blocked it": "Ure brez mesta, vsaka s trdo željo, ki jo je ustavila", + "Broken wishes": "Kršene želje", + "The wishes this scenario breaks, with the lessons that break them": "Želje, ki jih ta scenarij krši, z urami, ki jih kršijo", + "Measures": "Merila", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Umeščene ure, kršene želje, proste ure učiteljev, ure na dan in raba prostorov", + "Reason": "Razlog", + "Why the run failed": "Zakaj zagon ni uspel", + "Published at": "Objavljeno", + "When the scenario was written out as draft lessons": "Kdaj je bil scenarij zapisan kot osnutki ur", + "Edit wish": "Uredi željo", + "New wish": "Nova želja", + "Hard: the generator always keeps it": "Obvezna: generator jo vedno upošteva", + "Soft: the generator keeps it where it can": "Prožna: generator jo upošteva, kjer lahko", + "Weight (1 to 3)": "Utež (od 1 do 3)", + "Most lessons a day": "Največ ur na dan", + "Period": "Ura", + "{day} period {number}": "{day} ura {number}", + "Teacher (user name)": "Učitelj (uporabniško ime)", + "Activity (group:subject)": "Dejavnost (skupina:predmet)", + "Say who or what the wish is about.": "Navedite, na koga ali kaj se želja nanaša.", + "Choose at least one period.": "Izberite vsaj eno uro.", + "The limit is a whole number of 1 or more.": "Omejitev je celo število 1 ali več.", + "Timetable": "Urnik", + "Wishes": "Želje", + "Timetable wishes": "Želje za urnik", + "Generator run": "Zagon generatorja", + "Generator progress": "Napredek generatorja", + "The run failed: {reason}": "Zagon ni uspel: {reason}", + "{placed} of {lessons} lessons placed": "Umeščenih {placed} od {lessons} ur", + "Generate again": "Ustvari znova", + "Generate": "Ustvari", + "Every lesson has a place.": "Vsaka ura ima mesto.", + "Lesson": "Ura", + "No free period and room": "Ni proste ure in učilnice", + "Broken soft wishes": "Kršene prožne želje", + "Every soft wish is kept.": "Vsaka prožna želja je upoštevana.", + "Wish": "Želja", + "Lessons": "Ure", + "Generating: {percent}% of the time budget used": "Ustvarjanje: porabljenih {percent} % časa", + "Waiting to start": "Čaka na začetek", + "Published as draft lessons": "Objavljeno kot osnutki ur", + "Could not read the scenario.": "Scenarija ni bilo mogoče prebrati.", + "Could not start the run.": "Zagona ni bilo mogoče začeti.", + "Scenarios": "Scenariji", + "Timetable scenarios": "Scenariji urnika", + "Scenario": "Scenarij", + "Take the current timetable": "Prevzemi trenutni urnik", + "Could not take the current timetable.": "Trenutnega urnika ni bilo mogoče prevzeti.", + "Broken hard wishes": "Kršene obvezne želje", + "Not on a period of the week grid": "Ni na uri tedenske mreže", + "Compare scenarios": "Primerjaj scenarije", + "Scenarios to compare": "Scenariji za primerjavo", + "Choose two or three scenarios to compare them.": "Izberite dva ali tri scenarije za primerjavo.", + "Measure": "Merilo", + "Best": "Najboljše", + "Lessons that differ": "Ure, ki se razlikujejo", + "No lesson differs.": "Nobena ura se ne razlikuje.", + "Not placed": "Ni umeščeno", + "{period} in {room}": "{period} v {room}", + "Lessons placed": "Umeščene ure", + "Lessons without a place": "Ure brez mesta", + "Clashes": "Spori", + "Hard wishes broken": "Kršene obvezne želje", + "Soft wishes broken": "Kršene prožne želje", + "Soft wishes broken, weighted": "Kršene prožne želje, utežene", + "Free periods between lessons, all teachers": "Proste ure, vsi učitelji", + "Most free periods of one teacher": "Največ prostih ur enega učitelja", + "Most lessons of one group on a day": "Največ ur ene skupine na dan", + "Room use": "Raba učilnic", + "Publish as draft lessons": "Objavi kot osnutke ur", + "Draft lessons written: {count}": "Zapisani osnutki ur: {count}", + "Could not publish the scenario.": "Scenarija ni bilo mogoče objaviti.", + "Rules": "Pravila", + "Rules for {column}": "Pravila za {column}", + "When a card enters this column": "Ko kartica vstopi v ta stolpec", + "Action": "Dejanje", + "Set the priority": "Nastavi prednost", + "Assign to": "Dodeli", + "Assign the person who moved the card": "Dodeli osebi, ki je premaknila kartico", + "Remove the assignee": "Odstrani izvajalca", + "Add a label": "Dodaj oznako", + "No longer a project member": "Ni več član projekta", + "This label no longer exists": "Ta oznaka ne obstaja več", + "Add rule": "Dodaj pravilo", + "Remove rule": "Odstrani pravilo", + "No rules yet. Add one to change a card when it enters this column.": "Pravil še ni. Dodajte pravilo, ki spremeni kartico, ko vstopi v ta stolpec.", + "Could not save the rules. Please try again.": "Pravil ni bilo mogoče shraniti. Poskusite znova.", + "1 rule runs when a card enters this column": "1 pravilo se izvede, ko kartica vstopi v ta stolpec", + "{count} rules run when a card enters this column": "Število pravil, ki se izvedejo, ko kartica vstopi v ta stolpec: {count}", + "Rules applied: {changes}": "Uporabljena pravila: {changes}", + "assigned to {name}": "dodeljeno: {name}", + "assignee removed": "izvajalec odstranjen", + "priority {priority}": "prednost {priority}", + "label {label}": "oznaka {label}", + "What happens to a card when it enters this column, applied in list order.": "Kaj se zgodi s kartico, ko vstopi v ta stolpec, po vrstnem redu seznama.", + "Value": "Vrednost", + "What the rule does to the card.": "Kaj pravilo naredi s kartico.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prednost, ID uporabnika ali ID oznake, ki ga uporablja dejanje; prazno za dejanja brez vrednosti.", + "is not": "ni", + "{dimension} is not": "{dimension} ni", + "Saved filters": "Shranjeni filtri", + "No saved filters yet": "Shranjenih filtrov še ni", + "Save filter": "Shrani filter", + "Rename \"{name}\"": "Preimenuj »{name}«", + "Delete \"{name}\"": "Izbriši »{name}«", + "Clear filters": "Počisti filtre", + "Showing {shown} of {total} tasks": "Prikazanih {shown} od {total} nalog", + "Me": "Jaz", + "No date": "Brez datuma", + "Rename saved filter": "Preimenuj shranjeni filter", + "Share with the project": "Deli s projektom", + "Give the filter a name": "Poimenujte filter", + "Could not save the filter. Please try again.": "Filtra ni bilo mogoče shraniti. Poskusite znova.", + "Some labels in \"{name}\" no longer exist and were left out.": "Nekatere oznake v »{name}« ne obstajajo več in so bile izpuščene.", + "Could not delete the filter. Please try again.": "Filtra ni bilo mogoče izbrisati. Poskusite znova.", + "Saved filter": "Shranjeni filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Poimenovan filter table enega projekta, zaseben za osebo, ki ga je shranila, razen če je deljen s projektom.", + "The project whose board the filter applies to": "Projekt, za katerega tablo velja filter", + "The name the filter is listed under": "Ime, pod katerim je filter na seznamu", + "Saved by": "Shranil/a", + "Nextcloud user id of the person who saved the filter": "ID uporabnika Nextcloud, ki je shranil filter", + "Shared with the project": "Deljeno s projektom", + "Whether every project member sees and applies the filter": "Ali vsak član projekta vidi filter in ga lahko uporabi", + "Criteria": "Merila", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filter: izvajalec, oznaka, prednost in rok, vsak z je ali ni in vrednostmi", + "Cross-project view": "Medprojektni pogled", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Shranjen izbor projektov, katerih naloge so prikazane skupaj v stolpcih stanj, deljen z navedenimi ljudmi.", + "Shared with": "V skupni rabi z", + "The name the view is listed under": "Ime, pod katerim je pogled naveden", + "Nextcloud user id of the person who saved the view": "ID uporabnika Nextcloud osebe, ki je shranila pogled", + "Nextcloud user ids of the people the view is shared with": "ID-ji uporabnikov Nextcloud oseb, s katerimi je pogled v skupni rabi", + "The projects whose tasks the view shows, at most twenty": "Projekti, katerih naloge pogled prikazuje, največ dvajset", + "1 project in this view is hidden from you.": "1 projekt v tem pogledu je pred vami skrit.", + "{count} projects in this view are hidden from you.": "Projekti v tem pogledu, skriti pred vami: {count}.", + "{project} has no column for {status}.": "Projekt {project} nima stolpca za stanje {status}.", + "This view does not exist or is not shared with you.": "Ta pogled ne obstaja ali ni v skupni rabi z vami.", + "\"{task}\" moved to {status}.": "\"{task}\" premaknjeno v {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Medprojektni pogledi", + "New view": "Nov pogled", + "Edit view": "Uredi pogled", + "Delete view": "Izbriši pogled", + "Give the view a name": "Poimenujte pogled", + "Pick at least one project": "Izberite vsaj en projekt", + "A view shows at most {max} projects": "Pogled prikaže največ {max} projektov", + "Could not save the view. Please try again.": "Pogleda ni bilo mogoče shraniti. Poskusite znova.", + "Could not delete the view. Please try again.": "Pogleda ni bilo mogoče izbrisati. Poskusite znova.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Izbrišem »{title}«? Projekti in njihove naloge ostanejo, kot so.", + "People see the tasks of the projects they are in, never more.": "Vsak vidi le naloge projektov, v katerih je.", + "No views yet. A view shows the tasks of several of your projects together.": "Pogledov še ni. Pogled prikaže naloge več vaših projektov skupaj.", + "Projects in view: {count}": "Projekti v pogledu: {count}", + "Notify me when a task is assigned to me": "Obvesti me, ko mi je dodeljena naloga", + "Also send these to me by email": "Pošlji mi jih tudi po e-pošti", + "Add an email address in your Nextcloud personal settings to get mail.": "Za prejemanje e-pošte dodajte e-poštni naslov v osebnih nastavitvah Nextcloud.", + "Code link": "Povezava do kode", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, veja, zahteva za združitev ali zadeva na platformi za kodo, ki se nanaša na nalogo.", + "The task the link belongs to": "Naloga, ki ji povezava pripada", + "The project of the task": "Projekt naloge", + "Task key": "Ključ naloge", + "The task key the forge text named, such as VC-12": "Ključ naloge, ki ga je navedlo besedilo platforme, na primer VC-12", + "What the link points at": "Kam kaže povezava", + "Link": "Povezava", + "The address of the item in the forge": "Naslov elementa na platformi za kodo", + "The commit message, branch name or merge request title": "Sporočilo commita, ime veje ali naslov zahteve za združitev", + "Repository": "Repozitorij", + "The repository, such as acme/portal": "Repozitorij, na primer acme/portal", + "Forge id": "Id na platformi", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Lastni id elementa na platformi za kodo, na primer github:acme/portal#42 ali zgoščena vrednost commita", + "State": "Stanje", + "The state of a merge request or issue": "Stanje zahteve za združitev ali zadeve", + "Who made the commit or opened the merge request": "Kdo je naredil commit ali odprl zahtevo za združitev", + "When the commit was made or the merge request last changed": "Kdaj je bil commit narejen ali se je zahteva za združitev nazadnje spremenila", + "Added by": "Dodal", + "Whether a person added the link or the integration wrote it": "Ali je povezavo dodala oseba ali jo je zapisala integracija", + "Nextcloud user UIDs of project members": "ID-ji uporabnikov Nextcloud članov projekta", + "Add link": "Dodaj povezavo", + "Added by hand": "Dodano ročno", + "Branch": "Veja", + "Code": "Koda", + "Commit": "Commit", + "From the integration": "Iz integracije", + "Link to a commit, branch or merge request": "Povezava do commita, veje ali zahteve za združitev", + "Merge request": "Zahteva za združitev", + "Merged": "Združeno", + "No code linked yet. Name {key} in a commit message or paste a link.": "Koda še ni povezana. Navedite {key} v sporočilu commita ali prilepite povezavo.", + "No code linked yet. Paste a link to a commit or merge request.": "Koda še ni povezana. Prilepite povezavo do commita ali zahteve za združitev.", + "Paste a web address that starts with https://.": "Prilepite spletni naslov, ki se začne s https://.", + "Remove link {title}": "Odstrani povezavo {title}", + "The link could not be added.": "Povezave ni bilo mogoče dodati.", + "The link could not be removed.": "Povezave ni bilo mogoče odstraniti.", + "This link is already on the task.": "Ta povezava je že pri nalogi.", + "Code forges": "Platforme za kodo", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Povežite commite in pull requeste iz GitHuba z nalogami. Integriq prejema dogodke; planninq GitHuba nikoli ne kliče.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Prenesite konfiguracijo in jo uvozite v Integriq. Nato vpišite skrivnost v pravilo \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "V GitHubu repozitoriju dodajte webhook s tem naslovom in isto skrivnostjo. Izberite vrsto vsebine application/json ter dogodka push in pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Navedite ključ naloge, na primer VC-12, v sporočilu commita, imenu veje ali naslovu pull requesta. Povezava se nato prikaže pri tej nalogi.", + "Without Integriq, project members can still paste a link on the task page.": "Brez Integriqa lahko člani projekta še vedno prilepijo povezavo na strani naloge.", + "Download the Integriq configuration": "Prenesi konfiguracijo Integriq", + "Calendar": "Koledar", + "Previous": "Prejšnji", + "Calendar view": "Pogled koledarja", + "Starts:": "Začetek:", + "No tasks with a date in this month.": "Ta mesec ni nalog z datumom.", + "Week of {start} to {end}": "Teden od {start} do {end}", + "My calendar": "Moj koledar", + "Show as list": "Prikaži kot seznam", + "Show as calendar": "Prikaži kot koledar", + "Open my calendar": "Odpri moj koledar", + "Nextcloud Tasks": "Naloge Nextcloud", + "Show my tasks in Nextcloud Tasks": "Prikaži moje naloge v Nalogah Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Naloge, dodeljene vam ali deljene z vami, se prikažejo na seznamu \"Planninq\" v Nalogah in Koledarju Nextcloud. Spremembe, narejene tam, se zamenjajo ob naslednji spremembi v Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ta strežnik ne more pisati v Naloge Nextcloud, zato izvoz ni na voljo.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Upravlja Planninq. Spremembe, narejene tukaj, se zamenjajo ob naslednji spremembi v Planninq.", + "Working days and holidays": "Delovni dnevi in prazniki", + "Dates set on the timeline skip the days that are not working days.": "Datumi, nastavljeni na časovnici, preskočijo dneve, ki niso delovni.", + "Working weekdays": "Delovni dnevi v tednu", + "Non-working days": "Dela prosti dnevi", + "No non-working days yet.": "Še ni dela prostih dni.", + "Add day": "Dodaj dan", + "Year": "Leto", + "Add Dutch national holidays": "Dodaj nizozemske državne praznike", + "Save working days": "Shrani delovne dni", + "Choose at least one working weekday.": "Izberite vsaj en delovni dan.", + "Working days saved.": "Delovni dnevi so shranjeni.", + "Could not save the working days.": "Delovnih dni ni bilo mogoče shraniti.", + "New Year's Day": "Novo leto", + "Easter Sunday": "Velikonočna nedelja", + "Easter Monday": "Velikonočni ponedeljek", + "King's Day": "Kraljev dan", + "Liberation Day": "Dan osvoboditve", + "Ascension Day": "Vnebohod", + "Whit Sunday": "Binkoštna nedelja", + "Whit Monday": "Binkoštni ponedeljek", + "Christmas Day": "Božič", + "Boxing Day": "Štefanovo", + "Dates of {title}": "Datumi za {title}", + "The due date cannot be before the start date.": "Rok ne more biti pred datumom začetka.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Datumov ni bilo mogoče shraniti.", + "{title} now runs from {start} to {end}": "{title} zdaj poteka od {start} do {end}", + "Auto-scheduling": "Samodejno načrtovanje", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Ko je vklopljeno, poznejši rok na časovnici ponudi premik nalog, ki jih blokira.", + "Move blocked tasks along when a task slips": "Premakni blokirane naloge, ko naloga zamuja", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na časovnici poznejši rok ponudi premik blokiranih nalog. Štejejo samo povezave \"blokira\", naloge pa se premikajo samo pozneje.", + "Move the tasks that wait for {title}?": "Premaknem naloge, ki čakajo na {title}?", + "These tasks wait for it and would start after its new due date:": "Te naloge čakajo nanjo in bi se začele po novem roku:", + "{count} tasks would move; the first {limit} are listed.": "Premaknilo bi se {count} nalog; prikazanih je prvih {limit}.", + "Now": "Zdaj", + "After the move": "Po premiku", + "Only this task": "Samo ta naloga", + "Move all": "Premakni vse", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Ustavljeno pri {title}: datumov ni bilo mogoče shraniti. Naloge pred njo so bile premaknjene.", + "Cumulative flow": "Kumulativni tok", + "Show as chart": "Prikaži kot graf", + "Show as table": "Prikaži kot tabelo", + "Tasks per column per day": "Opravila po stolpcih na dan", + "Tasks without recorded history in this period: {count}": "Opravila brez zabeležene zgodovine v tem obdobju: {count}", + "Lead and cycle time": "Čas izvedbe in čas cikla", + "No tasks were finished in this period.": "V tem obdobju ni bilo dokončano nobeno opravilo.", + "Finished tasks": "Dokončana opravila", + "Cycle time, average": "Čas cikla, povprečje", + "Cycle time, 85th percentile": "Čas cikla, 85. percentil", + "Lead time, average": "Čas izvedbe, povprečje", + "Tasks whose finish time was estimated from their history: {count}": "Opravila, katerih čas dokončanja je ocenjen iz zgodovine: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Čas cikla vsakega dokončanega opravila s povprečjem in 85. percentilom", + "Slowest tasks": "Najpočasnejša opravila", + "cycle {cycle}, lead {lead}": "cikel {cycle}, izvedba {lead}", + "{days} days": "{days} dni", + "Could not load the flow of this project.": "Toka tega projekta ni bilo mogoče naložiti.", + "Last {days} days": "Zadnjih {days} dni", + "Portfolio flow": "Tok portfelja", + "An admin adds portfolios under Projects, Portfolios.": "Skrbnik doda portfelje pod Projekti, Portfelji.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Neprikazani projekti, ker je naenkrat prikazanih največ 50: {count}", + "Could not load the flow of this portfolio.": "Toka tega portfelja ni bilo mogoče naložiti.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativni tok in čas cikla prek projektov portfelja.", + "Edit report": "Uredi poročilo", + "Only tasks where": "Samo opravila, kjer", + "Group by": "Združi po", + "Display": "Prikaz", + "Share with everyone who can read its projects": "Deli z vsemi, ki lahko berejo njegove projekte", + "The report could not be saved.": "Poročila ni bilo mogoče shraniti.", + "Number of tasks": "Število opravil", + "Bar": "Stolpci", + "Donut": "Obroč", + "Table": "Tabela", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} od {total} projektov v tem poročilu ni vidnih za vas", + "No tasks match this report.": "Nobeno opravilo ne ustreza temu poročilu.", + "None": "Brez", + "Could not load this report.": "Tega poročila ni bilo mogoče naložiti.", + "Report": "Poročilo", + "Your reports": "Vaša poročila", + "My reports": "Moja poročila", + "Shared reports": "Deljena poročila", + "You have not built a report yet.": "Še niste ustvarili poročila.", + "Nobody has shared a report with you yet.": "Nihče še ni delil poročila z vami.", + "Reports you built over tasks, and the ones shared with you.": "Poročila, ki ste jih ustvarili nad opravili, in tista, ki so bila deljena z vami.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Shranjena poizvedba nad opravili: kateri projekti, kateri filtri, združeno po čem, prešteto ali seštevek, prikazano kot tabela ali graf.", + "The name the report is listed under": "Ime, pod katerim je poročilo navedeno", + "What the report shows and who it is for": "Kaj poročilo prikazuje in za koga je", + "Nextcloud user id of the person who saved the report": "ID uporabnika Nextcloud, ki je poročilo shranil", + "Who can open the report": "Kdo lahko odpre poročilo", + "Only me": "Samo jaz", + "Everyone who can read its projects": "Vsi, ki lahko berejo njegove projekte", + "The projects the report covers, at most fifty": "Projekti, ki jih poročilo zajema, največ petdeset", + "Filters": "Filtri", + "Task fields and the value each must equal": "Polja opravila in vrednost, ki ji mora biti vsako enako", + "The task field the report groups on": "Polje opravila, po katerem poročilo združuje", + "Count the tasks, or add up a number on them": "Preštej opravila ali seštej število na njih", + "Sum": "Vsota", + "Sum of": "Vsota polja", + "The number added up when the measure is a sum": "Število, ki se sešteje, ko je mera vsota", + "Story points": "Točke zgodbe", + "Estimated duration": "Ocenjeno trajanje", + "How the report is shown": "Kako je poročilo prikazano", + "Issue type": "Vrsta zahtevka", + "Task fields and the value each must equal; empty when the report covers every task": "Polja opravila in vrednost, ki jo mora imeti vsako; prazno, ko poročilo zajema vsa opravila", + "The status a task must have": "Stanje, ki ga mora imeti opravilo", + "The priority a task must have": "Prednost, ki jo mora imeti opravilo", + "The user a task must be assigned to": "Uporabnik, ki mu mora biti opravilo dodeljeno", + "A label a task must carry": "Oznaka, ki jo mora imeti opravilo", + "The board column a task must be in": "Stolpec table, v katerem mora biti opravilo", + "The issue type a task must have": "Vrsta zahtevka, ki jo mora imeti opravilo", + "Manager groups": "Skupine upraviteljev", + "Member groups": "Skupine članov", + "Viewer groups": "Skupine bralcev", + "Viewers": "Bralci", + "Owning group": "Lastniška skupina", + "Nextcloud groups whose members manage the project": "Skupine Nextcloud, katerih člani upravljajo projekt", + "Nextcloud groups whose members work on the project": "Skupine Nextcloud, katerih člani delajo na projektu", + "Nextcloud groups whose members may read the project": "Skupine Nextcloud, katerih člani lahko berejo projekt", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Uporabniki Nextcloud, ki upravljajo projekt: nastavitve, člane in delo", + "Nextcloud user ids who may read the project and its work but not change it": "Uporabniki Nextcloud, ki lahko berejo projekt in njegovo delo, ne morejo pa ga spreminjati", + "The Nextcloud group that owns the project with its creator, at most one": "Skupina Nextcloud, ki ima projekt v lasti skupaj z ustvarjalcem, največ ena", + "Nextcloud user ids who may read this through the project": "Uporabniki Nextcloud, ki lahko to berejo prek projekta", + "Nextcloud groups whose members may change this through the project": "Skupine Nextcloud, katerih člani lahko to spreminjajo prek projekta", + "Nextcloud groups whose members may read this through the project": "Skupine Nextcloud, katerih člani lahko to berejo prek projekta", + "Search for a person or a group…": "Poišči osebo ali skupino…", + "No one found. Your admin's sharing settings decide who you can find.": "Nihče ni bil najden. Nastavitve deljenja vašega skrbnika določajo, koga lahko najdete.", + "Type at least two characters": "Vnesite vsaj dva znaka", + "Everyone in this group": "Vsi v tej skupini", + "Could not search for people. Please try again.": "Iskanje oseb ni uspelo. Poskusite znova.", + "Could not remove the group": "Skupine ni bilo mogoče odstraniti", + "Only the owner and managers change who is on this project.": "Kdo je v tem projektu, spreminjata samo lastnik in upravitelji.", + "Role of {name}": "Vloga: {name}", + "Manager": "Upravitelj", + "Member": "Član", + "Viewer": "Bralec", + "Could not change the role": "Vloge ni bilo mogoče spremeniti", + "Owned by group: {name}": "V lasti skupine: {name}", + "No group owns this project.": "Nobena skupina ni lastnica tega projekta.", + "Owned by group": "V lasti skupine", + "Search for a group…": "Poišči skupino…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ni najdene skupine. Nastavitve deljenja vašega skrbnika določajo, katere skupine lahko najdete.", + "No owning group": "Brez lastniške skupine", + "Could not search for groups. Please try again.": "Skupin ni bilo mogoče poiskati. Poskusite znova.", + "Could not change the owning group": "Lastniške skupine ni bilo mogoče spremeniti", + "You can read this project. Only its members change it.": "Ta projekt lahko berete. Spreminjajo ga le njegovi člani.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet, ki se poučuje pri tej uri, na primer izbirni predmet, ko ga šolska učna aplikacija pozna.", + "Online meeting link": "Povezava do spletne ure", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kje se učenci pridružijo tej uri na spletu. Gumb Pridruži se se prikaže le pri povezavi https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sl.json b/l10n/sl.json index 33a8fb90..cf805c95 100644 --- a/l10n/sl.json +++ b/l10n/sl.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktivni projekti", + "Archived projects": "Arhivirani projekti", + "Boards": "Table", + "My projects": "Moji projekti", + "Portfolio": "Portfelj", + "Project board": "Tabla projekta", + "Projects I am in": "Projekti, v katerih sodelujem", + "Timeline": "Časovnica", + "Timesheet": "Evidenca časa", + "Features & roadmap": "Funkcije in načrt razvoja", + "Flow": "Tok", + "Flows": "Tokovi", + "Reports": "Poročila", + "Pick a report to open it.": "Izberite poročilo, da ga odprete.", + "In progress": "V teku", + "Date": "Datum", + "Due": "Rok", + "Assignee": "Dodeljeno", + "Who": "Kdo", + "What": "Kaj", + "Minutes": "Minute", + "Entries": "Vnosi", + "Most recent": "Najnovejše", + "Per person": "Na osebo", + "By status": "Po stanju", + "By priority": "Po prednosti", + "Task status": "Stanje nalog", + "Time spent": "Porabljen čas", + "Capacity": "Zmogljivost", + "Due soonest": "Najprej zapadle", + "Minutes logged": "Zabeležene minute", + "Nothing is due": "Nič ni zapadlo", + "Nothing logged yet": "Še ni nič zabeleženo", + "What is open, what is blocked, and what is overdue.": "Kaj je odprto, kaj blokirano in kaj zamuja.", + "How allocation is spread across the people working on projects.": "Kako je obremenitev razporejena med ljudi, ki delajo na projektih.", + "Hours logged, and the projects they went to.": "Zabeležene ure in projekti, na katere so šle.", + "Billable": "Zaračunljivo", + "Budget: {amount}": "Proračun: {amount}", + "Loading projects": "Nalaganje projektov", + "No projects for this client yet": "Za to stranko še ni projektov", + "Open in Planninq": "Odpri v Planninq", + "This project could not be found": "Tega projekta ni bilo mogoče najti", + "Untitled project": "Projekt brez naslova", + "and {count} more": "in še {count}", + "Store": "Trgovina", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Namestite registre, sheme in tokove, ki so jih objavile druge organizacije.", + "Work Date": "Datum dela", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Dejanja stolpca", + "Columns": "Stolpci", + "Could not remove the column. Please try again.": "Stolpca ni bilo mogoče odstraniti. Poskusite znova.", + "Could not save the column. Please try again.": "Stolpca ni bilo mogoče shraniti. Poskusite znova.", + "Done column": "Stolpec opravljenih", + "Edit column": "Uredi stolpec", + "Keep the card's status": "Ohrani stanje kartice", + "Move its cards to": "Premakni njegove kartice v", + "Move left": "Premakni levo", + "Move right": "Premakni desno", + "Status of cards moved here": "Stanje kartic, premaknjenih sem", + "The last done column cannot be removed.": "Zadnjega stolpca opravljenih ni mogoče odstraniti.", + "WIP limit": "Omejitev WIP", + "over limit": "nad omejitvijo", + "The status a card gets when it is moved into this column.": "Stanje, ki ga kartica dobi, ko je premaknjena v ta stolpec.", + "All priorities": "Vse prioritete", + "Could not create the task. Please try again.": "Opravila ni bilo mogoče ustvariti. Poskusite znova.", + "Created": "Ustvarjeno", + "Move to backlog": "V zaostanek", + "Move to board": "Na tablo", + "New task": "Novo opravilo", + "Nothing in the backlog": "V zaostanku ni ničesar", + "Rank": "Rang", + "Sort by": "Razvrsti po", + "Sort by rank to reorder": "Za spremembo vrstnega reda razvrstite po rangu", + "Task actions": "Dejanja opravila", + "All labels": "Vse oznake", + "Filter tasks by label": "Filtriraj opravila po oznaki", + "View timeline": "Prikaži časovnico", + "Board": "Tabla", + "List": "Seznam", + "Column": "Stolpec", + "Board or list": "Tabla ali seznam", + "Log": "Dnevnik", + "Add entry": "Dodaj vnos", + "Show": "Prikaži", + "No actions yet": "Še ni dejanj", + "Closed": "Zaprto", + "Entry actions": "Dejanja vnosa", + "Add action": "Dodaj dejanje", + "by {author}": "avtor {author}", + "saved {time}": "shranjeno {time}", + "Attendees: {names}": "Prisotni: {names}", + "Add the first entry": "Dodaj prvi vnos", + "Issues": "Težave", + "Lessons learned": "Naučene lekcije", + "Meetings": "Sestanki", + "Decisions": "Odločitve", + "Actions": "Dejanja", + "Issue": "Težava", + "Lesson learned": "Naučena lekcija", + "Meeting": "Sestanek", + "Decision": "Odločitev", + "About this project": "O tem projektu", + "No description yet": "Še ni opisa", + "Start date": "Datum začetka", + "Not set": "Ni nastavljeno", + "End date": "Datum konca", + "Progress": "Napredek", + "No tasks yet": "Še ni opravil", + "Open the board": "Odpri tablo", + "People": "Ljudje", + "Owner": "Lastnik", + "Latest log entries": "Najnovejši vnosi", + "Open the log": "Odpri dnevnik", + "{done} of {total} tasks done": "Končanih {done} od {total} opravil", + "Edit entry": "Uredi vnos", + "Type": "Vrsta", + "Attendees": "Prisotni", + "Issue is closed": "Težava je zaprta", + "Could not save the entry. Please try again.": "Vnosa ni bilo mogoče shraniti. Poskusite znova.", + "From: {title}": "Iz: {title}", + "What needs to happen": "Kaj je treba narediti", + "Could not create the action. Please try again.": "Dejanja ni bilo mogoče ustvariti. Poskusite znova.", + "The action was created but could not be linked to the entry.": "Dejanje je ustvarjeno, vendar ga ni bilo mogoče povezati z vnosom.", + "Project pages": "Strani projekta", + "Overview": "Pregled", + "Risks": "Tveganja", + "Log entry": "Vnos v dnevnik", + "A short name for the entry": "Kratko ime vnosa", + "Project": "Projekt", + "The project this entry belongs to": "Projekt, ki mu vnos pripada", + "What kind of entry this is": "Kakšne vrste je vnos", + "When it happened": "Kdaj se je zgodilo", + "What happened, in Markdown": "Kaj se je zgodilo, v Markdownu", + "Whether an issue is still open": "Ali je težava še odprta", + "The people at a meeting": "Ljudje na sestanku", + "Tasks that came out of this entry": "Opravila, ki izhajajo iz tega vnosa", + "Add risk": "Dodaj tveganje", + "Risk": "Tveganje", + "Score": "Ocena", + "Response": "Odziv", + "Review date": "Datum pregleda", + "no longer on the project": "ni več na projektu", + "Edit {title}": "Uredi {title}", + "No risks recorded yet": "Še ni zabeleženih tveganj", + "Add the first risk": "Dodaj prvo tveganje", + "Medium": "Srednje", + "Mitigating": "V blaženju", + "Occurred": "Nastopilo", + "Avoid": "Izogniti se", + "Reduce": "Zmanjšati", + "Transfer": "Prenesti", + "Accept": "Sprejeti", + "Highest open risks": "Najvišja odprta tveganja", + "No open risks": "Ni odprtih tveganj", + "Open the risk register": "Odpri register tveganj", + "Edit risk": "Uredi tveganje", + "What could go wrong": "Kaj lahko gre narobe", + "Likelihood": "Verjetnost", + "Impact": "Vpliv", + "Score {score}": "Ocena {score}", + "Countermeasures": "Protiukrepi", + "Could not save the risk. Please try again.": "Tveganja ni bilo mogoče shraniti. Poskusite znova.", + "Risks by likelihood and impact": "Tveganja po verjetnosti in vplivu", + "Risk scale": "Lestvica tveganj", + "The levels every project scores its risks on, and where low turns into medium and high": "Ravni, na katerih vsak projekt ocenjuje svoja tveganja, in kje nizko preide v srednje in visoko", + "Number of levels": "Število ravni", + "Likelihood labels": "Oznake verjetnosti", + "Impact labels": "Oznake vpliva", + "Level {level}": "Raven {level}", + "Medium from score": "Srednje od ocene", + "High from score": "Visoko od ocene", + "Risk scale saved": "Lestvica tveganj je shranjena", + "1 risk uses level {level}. Change it first.": "1 tveganje uporablja raven {level}. Najprej ga spremenite.", + "{count} risks use level {level}. Change them first.": "Tveganja z ravnjo {level}: {count}. Najprej jih spremenite.", + "Every level needs a label, and high must start above medium.": "Vsaka raven potrebuje oznako, visoko pa se mora začeti nad srednjim.", + "The project this risk belongs to": "Projekt, ki mu tveganje pripada", + "The cause and the effect, in Markdown": "Vzrok in posledica, v Markdownu", + "Category": "Kategorija", + "A free grouping, such as planning, budget or supplier": "Prosto združevanje, npr. načrtovanje, proračun ali dobavitelj", + "How likely it is, on the admin's risk scale": "Kako verjetno je, na lestvici tveganj skrbnika", + "How hard it would hit, on the admin's risk scale": "Kako močno bi prizadelo, na lestvici tveganj skrbnika", + "Likelihood times impact, calculated by the server": "Verjetnost krat vpliv, izračuna strežnik", + "Where the risk stands": "Kje je tveganje", + "The person who watches this risk": "Oseba, ki spremlja to tveganje", + "How the project answers the risk": "Kako se projekt odziva na tveganje", + "What is done to prevent it or soften it, in Markdown": "Kaj se naredi, da se prepreči ali omili, v Markdownu", + "When to look at this risk again": "Kdaj tveganje znova pregledati", + "Very low": "Zelo nizko", + "Very high": "Zelo visoko", + "All projects": "Vsi projekti", + "Project status report": "Poročilo o stanju projekta", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Datirano poročilo o tem, kako projekt stoji pri denarju, organizaciji, času, informacijah, kakovosti in tveganju (vidiki GROTIK), vsak z opombo.", + "The project this report is about": "Projekt, na katerega se poročilo nanaša", + "Report date": "Datum poročila", + "The day the report describes": "Dan, ki ga poročilo opisuje", + "Money": "Denar", + "How the project stands on this aspect": "Kako projekt stoji pri tem vidiku", + "On track": "Po načrtu", + "At risk": "Ogroženo", + "Off track": "Izven načrta", + "Money note": "Opomba o denarju", + "A short explanation of this status": "Kratka razlaga tega stanja", + "Organisation": "Organizacija", + "Organisation note": "Opomba o organizaciji", + "Time": "Čas", + "Time note": "Opomba o času", + "Information": "Informacije", + "Information note": "Opomba o informacijah", + "Quality": "Kakovost", + "Quality note": "Opomba o kakovosti", + "Risk note": "Opomba o tveganju", + "Overall": "Skupno", + "The worst of the six statuses, calculated by the server": "Najslabše od šestih stanj, izračuna ga strežnik", + "Health: money": "Stanje: denar", + "Copied from the newest status report": "Prevzeto iz najnovejšega poročila o stanju", + "Health: organisation": "Stanje: organizacija", + "Health: time": "Stanje: čas", + "Health: information": "Stanje: informacije", + "Health: quality": "Stanje: kakovost", + "Health: risk": "Stanje: tveganje", + "Health: overall": "Stanje: skupno", + "Health: report date": "Stanje: datum poročila", + "The date of the newest status report": "Datum najnovejšega poročila o stanju", + "New report": "Novo poročilo", + "Only the project owner writes status reports.": "Poročila o stanju piše samo lastnik projekta.", + "Latest report, {date}": "Zadnje poročilo, {date}", + "Aspect": "Vidik", + "Note": "Opomba", + "Report history": "Zgodovina poročil", + "Author": "Avtor", + "No status reports yet": "Še ni poročil o stanju", + "Write the first report": "Napiši prvo poročilo", + "Choose a status for every aspect to save the report.": "Za shranjevanje poročila izberite stanje za vsak vidik.", + "Suggested: on track.": "Predlog: po načrtu.", + "Suggested: at risk.": "Predlog: ogroženo.", + "Suggested: off track.": "Predlog: izven načrta.", + "1 task is past its due date.": "1 opravilo je čez rok.", + "{count} tasks are past their due date.": "Opravila čez rok: {count}.", + "The end date has passed with 1 open task.": "Končni datum je minil z 1 odprtim opravilom.", + "The end date has passed with {count} open tasks.": "Končni datum je minil, odprta opravila: {count}.", + "No open task is past its due date.": "Nobeno odprto opravilo ni čez rok.", + "The highest open risk, \"{title}\", scores {score}.": "Najvišje odprto tveganje, \"{title}\", ima oceno {score}.", + "There are no open risks.": "Ni odprtih tveganj.", + "Costs are at {percent}% of the budget.": "Stroški so pri {percent}% proračuna.", + "No suggestion: the project has no budget.": "Brez predloga: projekt nima proračuna.", + "No suggestion: no costs are recorded for this project yet.": "Brez predloga: za ta projekt še ni zabeleženih stroškov.", + "The report was not saved. Only the project owner can write status reports.": "Poročilo ni bilo shranjeno. Poročila o stanju lahko piše samo lastnik projekta.", + "No report": "Ni poročila", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Skupina projektov, ki jih vodijo isti ljudje, na primer oddelek ali program. Njeni upravitelji berejo vsak projekt v njej.", + "The name of the portfolio": "Ime portfelja", + "What the portfolio holds and who runs it": "Kaj portfelj vsebuje in kdo ga vodi", + "A colour for the portfolio's section in project lists": "Barva razdelka portfelja v seznamih projektov", + "Managers": "Upravitelji", + "Nextcloud user UIDs of the people who run the portfolio": "Uporabniški ID-ji Nextcloud ljudi, ki vodijo portfelj", + "Order": "Vrstni red", + "Where the portfolio comes in project lists, lowest first": "Kje je portfelj v seznamih projektov, najnižji najprej", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Lastna lestvica tveganj tega portfelja v obliki JSON, v enaki obliki kot lestvica celotne aplikacije. Prazno pomeni lestvico aplikacije.", + "Portfolio readers": "Bralci portfelja", + "Nextcloud user UIDs of the managers of the project's portfolio": "Uporabniški ID-ji Nextcloud upraviteljev portfelja projekta", + "The portfolio this project belongs to": "Portfelj, kateremu projekt pripada", + "No portfolio": "Brez portfelja", + "All portfolios": "Vsi portfelji", + "You read this project as a manager of its portfolio. Only its members change it.": "Ta projekt berete kot upravitelj njegovega portfelja. Spreminjajo ga le njegovi člani.", + "Portfolios": "Portfelji", + "Portfolio status": "Stanje portfelja", + "No portfolios yet": "Še ni portfeljev", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Skrbnik doda portfelje v Projekti, Portfelji. Projekti v portfelju so tukaj navedeni s svojim stanjem.", + "Roll-up": "Povzetek", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} po načrtu, {atRisk} ogroženih, {offTrack} izven načrta, {noReport} brez poročila", + "No project in this portfolio that you can read.": "V tem portfelju ni projekta, ki ga lahko berete.", + "Start": "Začetek", + "End": "Konec", + "Budget": "Proračun", + "Last report": "Zadnje poročilo", + "Out of date": "Zastarelo", + "Portfolio timeline": "Časovnica portfelja", + "Zoom": "Povečava", + "Could not load the timeline": "Časovnice ni bilo mogoče naložiti", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Skrbnik doda portfelje v Projekti, Portfelji. Projekti v portfelju so tukaj na eni časovnici.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Odprite projekt, da vidite njegove faze in naloge. Časovnica je samo za branje.", + "Phase: {title}": "Faza: {title}", + "Left out because you cannot read them: {count} projects": "Izpuščeno, ker jih ne morete brati: {count} projektov", + "Week": "Teden", + "Day": "Dan", + "Month": "Mesec", + "Please try again later.": "Poskusite znova pozneje.", + "Status reports": "Poročila o stanju", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Po koliko dneh je zadnje poročilo o stanju projekta v pregledu portfelja označeno kot zastarelo", + "Reporting period (days)": "Obdobje poročanja (dni)", + "The reporting period is a whole number of days from 1 to 365.": "Obdobje poročanja je celo število dni od 1 do 365.", + "Reporting period saved": "Obdobje poročanja shranjeno", + "The reporting period was not saved. Please try again.": "Obdobje poročanja ni bilo shranjeno. Poskusite znova.", + "Every project of a portfolio with its status per aspect, rolled up.": "Vsak projekt portfelja s stanjem po vidikih, povzeto.", + "The projects of a portfolio on one timeline.": "Projekti portfelja na eni časovnici.", + "Phases": "Faze", + "Add phase": "Dodaj fazo", + "No phases yet": "Še ni faz", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Razdelite projekt na faze, na primer zagon, opredelitev in izvedbo. Faza se zaključi, ko je naložen njen zaključni dokument.", + "{hours} hours": "{hours} ur", + "Concluding document: {title}": "Zaključni dokument: {title}", + "Concluding document missing": "Zaključni dokument manjka", + "Move {title} up": "Premakni {title} gor", + "Move {title} down": "Premakni {title} dol", + "Close phase": "Zaključi fazo", + "Phase": "Faza", + "Files": "Datoteke", + "Notes": "Opombe", + "Audit trail": "Revizijska sled", + "Edit phase": "Uredi fazo", + "Name": "Ime", + "Budget hours": "Načrtovane ure", + "Could not save the phase. Please try again.": "Faze ni bilo mogoče shraniti. Poskusite znova.", + "Close phase {title}": "Zaključi fazo {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Faza se zaključi z zaključnim dokumentom: naložite ga tukaj ali izberite eno od datotek faze.", + "Concluding document": "Zaključni dokument", + "This phase has no files yet.": "Ta faza še nima datotek.", + "Upload a document": "Naloži dokument", + "The document was not uploaded. Please try again.": "Dokument ni bil naložen. Poskusite znova.", + "Upload the concluding document before you close this phase.": "Preden zaključite to fazo, naložite zaključni dokument.", + "This phase cannot be closed from its current status.": "Te faze ni mogoče zaključiti iz njenega trenutnega stanja.", + "The phase was not closed. Please try again.": "Faza ni bila zaključena. Poskusite znova.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID datoteke te faze, ki jo zaključi. Fazo je mogoče dokončati šele, ko je nastavljen in je datoteka priložena.", + "Import from Microsoft Project": "Uvozi iz Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Izberite načrt, shranjen iz Microsoft Project v obliki XML. Nič se ne uvozi, dokler ne potrdite.", + "Plan file": "Datoteka načrta", + "What the import creates": "Kaj uvoz ustvari", + "Tasks": "Opravila", + "Sub-tasks": "Podopravila", + "Milestones": "Mejniki", + "Links": "Povezave", + "Already imported, updated in place: {count}": "Že uvoženo, posodobljeno na mestu: {count}", + "What does not carry over": "Kaj se ne prenese", + "Tasks with resources, which are not imported: {count}": "Opravila z viri, ki se ne uvozijo: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Opravila globlje od ravni 3, postavljena pod njihovo opravilo ravni 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Povezave, ki niso konec-začetek, uvožene kot sorodne povezave: {count}", + "Link lags, which are dropped: {count}": "Zamiki povezav, ki se opustijo: {count}", + "Links to a summary task, which are not imported: {count}": "Povezave na povzetek opravil, ki se ne uvozijo: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Povezave na opravila zunaj tega načrta, ki se ne uvozijo: {count}", + "No longer in the plan": "Ni več v načrtu", + "These stay in the project; remove them yourself if they are no longer needed.": "Ostanejo v projektu; odstranite jih sami, če jih ne potrebujete več.", + "Import": "Uvozi", + "Close": "Zapri", + "The plan is imported: {created} created, {updated} updated.": "Načrt je uvožen: ustvarjeno {created}, posodobljeno {updated}.", + "Links that would close a loop were left out: {count}": "Povezave, ki bi zaprle zanko, so izpuščene: {count}", + "The import stopped part-way. Run it again to finish it.": "Uvoz se je ustavil na pol poti. Zaženite ga znova, da ga dokončate.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Shranite načrt v Microsoft Project z Datoteka, Shrani kot, oblika XML, in uvozite to datoteko.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ta datoteka deklarira DOCTYPE ali entitete, ki niso sprejete.", + "The file is larger than 10 MB.": "Datoteka je večja od 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Načrt ima več kot 2000 opravil, več, kot jih sprejme en uvoz.", + "This file is not a Microsoft Project plan in XML format.": "Ta datoteka ni načrt Microsoft Project v obliki XML.", + "Choose a file to import.": "Izberite datoteko za uvoz.", + "Only the project owner can import a plan.": "Načrt lahko uvozi samo lastnik projekta.", + "The plan could not be read. Please try again.": "Načrta ni bilo mogoče prebrati. Poskusite znova.", + "Linked case: {title}": "Povezana zadeva: {title}", + "Linked to a case": "Povezano z zadevo", + "Hand over to case": "Predaj zadevi", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Nespremenjeno kopira vsako datoteko projekta in njegovih opravil ter datoteko, ki opisuje projekt, v povezano zadevo.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopirane datoteke: {count}", + "Files that failed: {names}": "Neuspele datoteke: {names}", + "The handover failed. Please try again.": "Predaja ni uspela. Poskusite znova.", + "The linked case could not be found, or you cannot open it.": "Povezane zadeve ni mogoče najti ali je ne morete odpreti.", + "Case handovers": "Predaje zadevi", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Vsakokratna predaja datotek in metapodatkov projekta njegovi zadevi: kdaj, kdo, kateri zadevi, vsaka kopirana datoteka z njenim SHA-256 in neuspele datoteke.", + "Finance": "Finance", + "Add cost line": "Dodaj stroškovno postavko", + "Delivery terms": "Pogoji dobave", + "Billing model": "Model obračunavanja", + "Budget in euro": "Proračun v evrih", + "Budget in hours": "Proračun v urah", + "Hourly rate in euro": "Urna postavka v evrih", + "Planned start": "Načrtovani začetek", + "Planned end": "Načrtovani konec", + "Planned dates": "Načrtovani datumi", + "Budget {amount}": "Proračun {amount}", + "No budget agreed": "Proračun ni dogovorjen", + "Hours": "Ure", + "Only the project owner and the portfolio managers see the amounts.": "Zneske vidijo samo lastnik projekta in upravitelji portfelja.", + "Budget against cost per category": "Proračun v primerjavi s stroški po kategorijah", + "Labour (booked time)": "Delo (vpisane ure)", + "No category": "Brez kategorije", + "Hours are not available": "Ure niso na voljo", + "Not yet assigned to a category": "Še ni dodeljeno kategoriji", + "Total": "Skupaj", + "{spent} spent, {remaining} remaining": "{spent} porabljeno, {remaining} preostane", + "Budget against cost per phase": "Proračun v primerjavi s stroški po fazah", + "No phase": "Brez faze", + "Cost lines": "Stroškovne postavke", + "From the finance system": "Iz finančnega sistema", + "Edit cost line {amount}": "Uredi stroškovno postavko {amount}", + "No cost lines yet": "Še ni stroškovnih postavk", + "Commitments": "Obveznosti", + "Actual cost": "Dejanski stroški", + "Forecast": "Napoved", + "Remaining": "Preostane", + "Not planned yet": "Še ni načrtovano", + "{start} to {end}": "{start} do {end}", + "The terms were not saved. Please try again.": "Pogoji niso bili shranjeni. Poskusite znova.", + "Terms saved": "Pogoji shranjeni", + "Fixed price": "Fiksna cena", + "Hourly": "Na uro", + "Not billed": "Ni obračunano", + "Commitment": "Obveznost", + "Edit cost line": "Uredi stroškovno postavko", + "Kind": "Vrsta", + "Amount in euro": "Znesek v evrih", + "Remove": "Odstrani", + "Could not save the cost line. Only the project owner changes the money of a project.": "Stroškovne postavke ni bilo mogoče shraniti. Denar projekta spreminja samo lastnik projekta.", + "Could not remove the cost line. Please try again.": "Stroškovne postavke ni bilo mogoče odstraniti. Poskusite znova.", + "{amount} over budget": "{amount} nad proračunom", + "Cost categories": "Kategorije stroškov", + "The categories every project splits its budget and costs into, one per line": "Kategorije, na katere vsak projekt razdeli svoj proračun in stroške, ena na vrstico", + "Categories": "Kategorije", + "Give at least one category, each name once.": "Navedite vsaj eno kategorijo, vsako ime enkrat.", + "Cost categories saved": "Kategorije stroškov shranjene", + "The cost categories were not saved. Please try again.": "Kategorije stroškov niso bile shranjene. Poskusite znova.", + "Finance line": "Finančna postavka", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "En denarni znesek projekta: proračun, obveznost, dejanski strošek ali napoved, v kategoriji stroškov in po želji v fazi. Vnese jo lastnik projekta ali finančni sistem prek integracijske aplikacije.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekt, ki mu znesek pripada. Prazno za postavko iz finančnega sistema, katere številka projekta se ne ujema z nobenim projektom.", + "The phase this amount belongs to, if any": "Faza, ki ji znesek pripada, če obstaja", + "The cost category, one of the categories the admin set up": "Kategorija stroškov, ena od kategorij, ki jih je nastavil skrbnik", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Ali je znesek proračun, obveznost, dejanski strošek ali napoved", + "Amount": "Znesek", + "The amount in the reporting currency (euro)": "Znesek v valuti poročanja (evro)", + "The date the amount was booked or is expected": "Datum, ko je bil znesek knjižen ali se pričakuje", + "What the amount is for": "Za kaj je znesek", + "Whether a person entered the line or the finance system sent it": "Ali je postavko vnesla oseba ali jo je poslal finančni sistem", + "Entered by hand": "Vneseno ročno", + "Finance line id": "Id finančne postavke", + "The finance system's own id of this line. One imported line per id.": "Lasten id te postavke v finančnem sistemu. Ena uvožena postavka na id.", + "Project number": "Številka projekta", + "The project number the finance system sent, matched against the project key": "Številka projekta, ki jo je poslal finančni sistem, primerjana s ključem projekta", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portfelj projekta postavke, prepisan iz projekta, da seštevki portfelja potrebujejo en filter", + "Finance readers": "Bralci financ", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-ji uporabnikov Nextcloud, ki smejo videti ta znesek: lastnik projekta in upravitelji njegovega portfelja", + "Project owner": "Lastnik projekta", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID uporabnika Nextcloud lastnika projekta, ki sme spreminjati in odstranjevati ročne postavke", + "How the client pays: not billed, a fixed price, or by the hour.": "Kako stranka plača: ni obračunano, fiksna cena ali na uro.", + "Portfolio finance": "Finance portfelja", + "You cannot see the money of any project in this portfolio": "Ne vidite denarja nobenega projekta v tem portfelju", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Strežnik je vrnil stroškovne postavke projektov zunaj tega portfelja, zato so seštevki morda napačni.", + "Projects left out because you cannot see their money: {count}": "Izpuščeni projekti, ker ne vidite njihovega denarja: {count}", + "Unmatched finance lines": "Nepovezane finančne postavke", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Proračun, obveznosti, dejanski stroški in napoved, sešteti za portfelj.", + "Subprojects": "Podprojekti", + "{done} of {total}": "{done} od {total}", + "{done} of {total} tasks done, including subprojects": "{done} od {total} opravil končanih, vključno s podprojekti", + "Show the subprojects of {title}": "Pokaži podprojekte {title}", + "Hide the subprojects of {title}": "Skrij podprojekte {title}", + "Part of": "Del", + "No parent project": "Brez nadrejenega projekta", + "A project cannot sit under one of its own subprojects.": "Projekt ne more biti pod enim od svojih podprojektov.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekti se gnezdijo največ tri ravni globoko: program, projekt in podprojekt.", + "Parent project": "Nadrejeni projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekt, pod katerim je ta projekt, na primer program. Projekti se gnezdijo največ tri ravni globoko.", + "Yes": "Da", + "No": "Ne", + "{label} (required)": "{label} (obvezno)", + "{label} is required": "{label} je obvezno", + "Project field": "Polje projekta", + "A field an admin adds to every project, such as a policy area or a contract value.": "Polje, ki ga skrbnik doda vsakemu projektu, na primer področje politike ali vrednost pogodbe.", + "Key": "Ključ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Stalno ime, pod katerim se vrednost shrani, v lower camel case. Ohranite ga, ko ga projekti uporabljajo.", + "Label": "Oznaka", + "The name people see next to the field": "Ime, ki ga ljudje vidijo ob polju", + "What the field holds": "Kaj polje vsebuje", + "Text": "Besedilo", + "Number": "Število", + "Choice": "Izbira", + "Person": "Oseba", + "Yes or no": "Da ali ne", + "Options": "Možnosti", + "The choices of a choice field": "Možnosti izbirnega polja", + "Required": "Obvezno", + "Whether a project must fill in the field": "Ali mora projekt izpolniti polje", + "Where the field appears, lowest first": "Kje se polje pojavi, najnižje najprej", + "Applies to": "Velja za", + "What the field is added to": "Čemu se polje doda", + "Custom fields": "Lastna polja", + "The values of the project fields an admin defined, keyed by the field's key.": "Vrednosti polj projekta, ki jih je določil skrbnik, po ključu polja.", + "Project fields": "Polja projekta", + "Related": "Povezano", + "Remove link": "Odstrani povezavo", + "Link type": "Vrsta povezave", + "Relates to": "Povezano z", + "Duplicates": "Podvaja", + "Project key": "Ključ projekta", + "Every task number starts with it, such as VERG-42.": "Vsaka številka naloge se začne z njim, na primer VERG-42.", + "This key is already used by another project.": "Ta ključ že uporablja drug projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Uporabite od 2 do 10 črk in števk, ki se začnejo s črko.", + "The key cannot change once tasks carry it.": "Ključa ni mogoče spremeniti, ko ga nosijo naloge.", + "Project saved. The existing tasks get their numbers in the background.": "Projekt je shranjen. Obstoječe naloge dobijo številke v ozadju.", + "Next task number": "Številka naslednje naloge", + "The number the next task of this project gets in its key. Only the system writes it.": "Številka, ki jo naslednja naloga tega projekta dobi v svojem ključu. Piše jo samo sistem.", + "Restore {title}": "Obnovi {title}", + "Restore": "Obnovi", + "Project restored": "Projekt je obnovljen", + "Could not restore the project": "Projekta ni bilo mogoče obnoviti", + "Bring this project back to the active list.": "Vrni ta projekt na seznam aktivnih projektov.", + "Restore project": "Obnovi projekt", + "Request reason": "Razlog za zahtevo", + "Why the requester needs this project. Filled in when the project is requested.": "Zakaj vlagatelj potrebuje ta projekt. Izpolni se ob zahtevi.", + "Reviewed by": "Pregledal", + "The user who approved or rejected the request.": "Uporabnik, ki je zahtevo odobril ali zavrnil.", + "Reviewed at": "Pregledano", + "When the request was approved or rejected.": "Kdaj je bila zahteva odobrena ali zavrnjena.", + "Review note": "Opomba pregledovalca", + "The reviewer's reason, shown to the requester when a request is not approved.": "Razlog pregledovalca, ki ga vlagatelj vidi, ko zahteva ni odobrena.", + "Members of these groups": "Člani teh skupin", + "Groups that may create projects": "Skupine, ki lahko ustvarjajo projekte", + "The group {group} no longer exists. Save to remove it.": "Skupina {group} ne obstaja več. Shranite, da jo odstranite.", + "Review project request": "Preglej zahtevo za projekt", + "Requested by": "Zahteval", + "Why it is needed": "Zakaj je potreben", + "Desired start date": "Želeni datum začetka", + "Why is it not approved?": "Zakaj ni odobren?", + "Give a reason. The requester sees it.": "Navedite razlog. Vlagatelj ga bo videl.", + "Approve": "Odobri", + "Reject": "Zavrni", + "Reject request": "Zavrni zahtevo", + "The review was not saved. Try again.": "Pregled ni bil shranjen. Poskusite znova.", + "This project is waiting for review": "Ta projekt čaka na pregled", + "This request was not approved": "Ta zahteva ni bila odobrena", + "Reason: {note}": "Razlog: {note}", + "Review request": "Preglej zahtevo", + "Request a project": "Zahtevaj projekt", + "Step {step} of 2": "Korak {step} od 2", + "Why is this project needed?": "Zakaj je ta projekt potreben?", + "Give a reason. The reviewer reads it.": "Navedite razlog. Pregledovalec ga bo prebral.", + "Back": "Nazaj", + "Next": "Naprej", + "Send request": "Pošlji zahtevo", + "The request was not sent. Try again.": "Zahteva ni bila poslana. Poskusite znova.", + "Requested": "Zahtevano", + "Not approved": "Ni odobreno", + "Your request was sent": "Vaša zahteva je bila poslana", + "Let everyone else request a project": "Dovoli vsem drugim, da zahtevajo projekt", + "Add a task": "Dodaj nalogo", + "Delete task": "Izbriši nalogo", + "Edit task": "Uredi nalogo", + "Write": "Piši", + "Preview": "Predogled", + "Markdown works here: headings, lists and links.": "Tu deluje Markdown: naslovi, seznami in povezave.", + "Could not save the task. Please try again.": "Naloge ni bilo mogoče shraniti. Poskusite znova.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Na nalogi \"{title}\" je zabeležen čas, zato je ni mogoče izbrisati. Namesto tega jo lahko prekličete: vnosi časa ostanejo.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Izbrišem \"{title}\"? Odstranjene bodo tudi njene povezave z drugimi nalogami. Tega ni mogoče razveljaviti.", + "Keep task": "Obdrži nalogo", + "Cancel task": "Prekliči nalogo", + "Only the reporter, the project owner or an admin can delete this task.": "To nalogo lahko izbriše le prijavitelj, lastnik projekta ali skrbnik.", + "Could not delete the task. Please try again.": "Naloge ni bilo mogoče izbrisati. Poskusite znova.", + "Could not cancel the task. Please try again.": "Naloge ni bilo mogoče preklicati. Poskusite znova.", + "Responsible": "Odgovorna oseba", + "Also working on this": "Pri tem sodelujejo tudi", + "Labels": "Oznake", + "Could not change the priority. Please try again.": "Prioritete ni bilo mogoče spremeniti. Poskusite znova.", + "Other project members who work on this task alongside the person responsible.": "Drugi člani projekta, ki pri tej nalogi sodelujejo z odgovorno osebo.", + "Duplicate": "Podvoji", + "Could not copy the task. Please try again.": "Naloge ni bilo mogoče kopirati. Poskusite znova.", + "Subtasks": "Podnaloge", + "{done} of {total} done": "Končano {done} od {total}", + "Add a subtask": "Dodaj podnalogo", + "Checklist": "Kontrolni seznam", + "Checklist item actions": "Dejanja elementa seznama", + "Add a checklist item": "Dodaj element seznama", + "Subtasks: {estimate} estimated, {logged} logged": "Podnaloge: ocena {estimate}, zabeleženo {logged}", + "Total estimate: {total}": "Skupna ocena: {total}", + "Part of {title}": "Del naloge {title}", + "Checklist: {count} done": "Kontrolni seznam: končano {count}", + "This task has subtasks: {count}.": "Ta naloga ima podnaloge: {count}.", + "Keep subtasks as separate tasks": "Obdrži podnaloge kot ločene naloge", + "Delete subtasks too": "Izbriši tudi podnaloge", + "Copy of {title}": "Kopija: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Naloga je bila kopirana, a ne vse njene podnaloge. Preverite kopijo.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Majhni koraki znotraj naloge. Vsak element ima id, besedilo in podatek, ali je končan.", + "Open work per person and per project.": "Odprto delo po osebah in projektih.", + "View": "Pogled", + "By person": "Po osebi", + "By project": "Po projektu", + "Hours left": "Preostale ure", + "Tasks without an estimate": "Naloge brez ocene", + "Due in 14 days": "Rok v 14 dneh", + "Shared": "Deljeno", + "Unassigned": "Nedodeljeno", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Prikazano je delo v projektih, ki jih lahko vidite. Ure štejejo za odgovorno osebo; deljene naloge se štejejo brez ur.", + "No open work in these projects.": "V teh projektih ni odprtega dela.", + "Open work": "Odprto delo", + "{count} open tasks": "{count} odprtih nalog", + "Create a project to see capacity here.": "Ustvarite projekt, da tukaj vidite zmogljivost.", + "My tasks": "Moje naloge", + "Show all my tasks": "Pokaži vse moje naloge", + "No tasks assigned to you": "Nimate dodeljenih nalog", + "Browse projects": "Prebrskaj projekte", + "Later": "Kasneje", + "Due {date}": "Rok {date}", + "Could not change the status. Please try again.": "Stanja ni bilo mogoče spremeniti. Poskusite znova.", + "Completed today": "Končano danes", + "My open tasks": "Moje odprte naloge", + "My overdue tasks": "Moje zamujene naloge", + "My tasks in progress": "Moje naloge v teku", + "Pin to the top": "Pripni na vrh", + "Unpin": "Odpni", + "Pinned": "Pripeto", + "Actions for {title}": "Dejanja za {title}", + "Could not save your project order. Please try again.": "Vrstnega reda projektov ni bilo mogoče shraniti. Poskusite znova.", + "No boards yet": "Še ni tabel", + "Create a project to get a board.": "Ustvarite projekt, da dobite tablo.", + "Use the Projects page to create and manage your projects and tasks.": "Na strani Projekti ustvarjajte in upravljajte svoje projekte in naloge.", + "Go to projects": "Pojdi na projekte", + "You are not a member of any projects yet.": "Niste še član nobenega projekta.", + "Could not search for users. Please try again.": "Uporabnikov ni bilo mogoče poiskati. Poskusite znova.", + "Project creation is restricted to administrators.": "Projekte lahko ustvarjajo samo skrbniki.", + "Only the project owner or an administrator can delete this project.": "Ta projekt lahko izbriše samo lastnik projekta ali skrbnik.", + "No projects are available to you yet. Ask an administrator to create one.": "Na voljo še nimate nobenega projekta. Prosite skrbnika, naj ga ustvari.", + "Due: {date}": "Rok: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Naloge z datumom začetka ali rokom so prikazane na časovnici. Dodajte datume, da jih vidite tukaj.", + "You do not have access to this project.": "Nimate dostopa do tega projekta.", + "Zoom level": "Raven povečave", + "Unscheduled": "Nenačrtovano", + "Start: {date}": "Začetek: {date}", + "Today": "Danes", + "No scheduled tasks": "Ni načrtovanih nalog", + "An unexpected error occurred.": "Prišlo je do nepričakovane napake.", + "Column {number} name": "Ime stolpca {number}", + "Failed to save creation policy": "Pravila za ustvarjanje ni bilo mogoče shraniti", + "All authenticated users": "Vsi prijavljeni uporabniki", + "Control who may create new projects": "Določite, kdo sme ustvarjati nove projekte", + "Administrators only": "Samo skrbniki", + "Project creation": "Ustvarjanje projektov", + "Allow project creation": "Dovoli ustvarjanje projektov", + "Creation policy saved successfully": "Pravilo za ustvarjanje je shranjeno", + "Initializing…": "Zaganjanje…", + "e.g. 2h 30m, 90m, 1.5h": "npr. 2h 30m, 90m, 1.5h", + "Log time": "Zabeleži čas", + "Save estimate": "Shrani oceno", + "Logged: {logged}": "Zabeleženo: {logged}", + "over by {amount}": "preseženo za {amount}", + "Time tracking": "Beleženje časa", + "Estimate": "Ocena", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Vnesite veljavno oceno (npr. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Vnesite veljavno trajanje (npr. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Vnosa časa ni bilo mogoče shraniti. Poskusite znova.", + "Edit time entry": "Uredi vnos časa", + "Duration": "Trajanje", + "Date range": "Obdobje", + "Last week": "Prejšnji teden", + "No time logged": "Ni zabeleženega časa", + "Log time on a task to see it here.": "Zabeležite čas na nalogi, da ga vidite tukaj.", + "To date": "Do datuma", + "This week": "Ta teden", + "Total: {total}": "Skupaj: {total}", + "From date": "Od datuma", + "Custom range": "Obdobje po meri", + "All time": "Ves čas", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Naloge ni bilo mogoče izbrisati, zato lahko ostanejo podatki. Znova izbrišite projekt.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Vnosa časa ni bilo mogoče izbrisati, zato lahko ostanejo podatki. Znova izbrišite projekt.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Stolpca ni bilo mogoče izbrisati, zato lahko ostanejo podatki. Znova izbrišite projekt.", + "Could not delete the project. Please try again.": "Projekta ni bilo mogoče izbrisati. Poskusite znova.", + "Notification settings": "Nastavitve obvestil", + "Configure when due-date reminders are sent": "Nastavite, kdaj se pošiljajo opomniki za roke", + "Due-date reminder lead time (hours)": "Vnaprejšnji čas opomnika za rok (ure)", + "Lead time must be between 1 and 336 hours": "Vnaprejšnji čas mora biti med 1 in 336 urami", + "Reminder lead time saved successfully": "Vnaprejšnji čas opomnika je shranjen", + "Failed to save reminder lead time": "Vnaprejšnjega časa opomnika ni bilo mogoče shraniti", + "Notifications": "Obvestila", + "Notify me 1 day before a task's due date": "Obvesti me 1 dan pred rokom naloge", + "Draft": "Osnutek", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Ali je ura osnutek, ki ga vidi samo njen učitelj, poteka ali je odpovedana.", + "New release": "Nova izdaja", + "Roadmap chart. The same releases and epics are listed below.": "Grafikon načrta razvoja. Iste izdaje in epi so navedeni spodaj.", + "Nothing on the roadmap yet": "Na načrtu razvoja še ni ničesar", + "Releases with a target date and epics with dated tasks appear here.": "Tu se prikažejo izdaje s ciljnim datumom in epi z nalogami, ki imajo datum.", + "Releases": "Izdaje", + "No releases yet": "Še ni izdaj", + "Target date: {date}": "Ciljni datum: {date}", + "No target date": "Brez ciljnega datuma", + "Edit {name}": "Uredi {name}", + "Mark {name} as released": "Označi {name} kot izdano", + "Mark as released": "Označi kot izdano", + "Epics": "Epi", + "No epics yet. Open a task to make it an epic.": "Še ni epov. Odprite nalogo, da jo spremenite v ep.", + "Not scheduled yet": "Še ni načrtovano", + "Planned": "Načrtovano", + "Released": "Izdano", + "Edit release": "Uredi izdajo", + "Target date": "Ciljni datum", + "Could not save the release. Please try again.": "Izdaje ni bilo mogoče shraniti. Poskusite znova.", + "Every task of this release is done or cancelled.": "Vsaka naloga te izdaje je opravljena ali preklicana.", + "Not finished yet: {count}": "Še ni končano: {count}", + "What happens to these tasks?": "Kaj se zgodi s temi nalogami?", + "Move to {name}": "Premakni v {name}", + "Remove the release": "Odstrani izdajo", + "Keep it on {name}": "Pusti jih v {name}", + "Could not mark the release as released. Please try again.": "Izdaje ni bilo mogoče označiti kot izdane. Poskusite znova.", + "Roadmap": "Načrt razvoja", + "Tasks or roadmap": "Naloge ali načrt razvoja", + "Release": "Izdaja", + "Epic": "Ep", + "This task is an epic": "Ta naloga je ep", + "A named, dated delivery of a project that its tasks are planned against.": "Poimenovana in datirana dobava projekta, glede na katero se načrtujejo njegove naloge.", + "Name of the release": "Ime izdaje", + "The project this release belongs to": "Projekt, ki mu pripada ta izdaja", + "What this release delivers": "Kaj ta izdaja dobavi", + "When work on the release starts": "Kdaj se začne delo na izdaji", + "The date the release is due": "Datum, do katerega mora biti izdaja pripravljena", + "Whether the release is planned, released or archived": "Ali je izdaja načrtovana, izdana ali arhivirana", + "Released on": "Izdano", + "When the release was marked as released": "Kdaj je bila izdaja označena kot izdana", + "The release this task is planned for": "Izdaja, za katero je ta naloga načrtovana", + "Board view options": "Možnosti pogleda table", + "Colour cards": "Obarvaj kartice", + "No colour": "Brez barve", + "By label": "Po oznaki", + "Swimlanes": "Plavalne steze", + "No swimlanes": "Brez plavalnih stez", + "By assignee": "Po izvajalcu", + "By epic": "Po epu", + "No assignee": "Ni dodeljeno", + "No epic": "Brez epa", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartice ostanejo v vrstici svojega epa. Ep spremenite na strani naloge.", + "Hand over to": "Predaj", + "Could not save your board view. It applies until you reload.": "Pogleda table ni bilo mogoče shraniti. Velja do ponovnega nalaganja.", + "Timetable wish": "Želja za urnik", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Želja, ki jo generator upošteva. Trdo željo vedno spoštuje, mehko, kjer lahko.", + "Whether the wish is about a teacher, a group, a room or one activity": "Ali se želja nanaša na učitelja, skupino, prostor ali eno dejavnost", + "Teacher": "Učitelj", + "Group": "Skupina", + "Reference": "Sklic", + "The user, group, room or activity the wish is about": "Uporabnik, skupina, prostor ali dejavnost, na katero se želja nanaša", + "What the wish asks for": "Kaj želja zahteva", + "Not on these periods": "Ne v teh urah", + "Preferably not on these periods": "Raje ne v teh urah", + "At most a number of lessons a day": "Največ določeno število ur na dan", + "No free periods between lessons": "Brez prostih ur med urami", + "Always the same room": "Vedno isti prostor", + "Periods": "Ure", + "The periods of the week the wish is about, such as wed-5": "Ure v tednu, na katere se želja nanaša, npr. wed-5", + "Limit": "Meja", + "The most lessons a day, for a wish of that kind": "Največ ur na dan, za željo te vrste", + "Strength": "Moč", + "Whether the generator must keep the wish or should keep it": "Ali mora ali naj bi generator spoštoval željo", + "Hard": "Trda", + "Soft": "Mehka", + "Weight": "Utež", + "How much a soft wish counts, from 1 to 3": "Koliko šteje mehka želja, od 1 do 3", + "Why the wish exists": "Zakaj želja obstaja", + "Timetable scenario": "Scenarij urnika", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "En tedenski vzorec, ki ga je naredil generator ali je vzet iz trenutnega urnika. Hrani svoj vhod in kako dobro spoštuje želje.", + "The name timetablers know the scenario by": "Ime, pod katerim sestavljavci urnika poznajo scenarij", + "Whether the generator made it or it came from the current timetable": "Ali ga je naredil generator ali prihaja iz trenutnega urnika", + "Generated": "Ustvarjen", + "From the current timetable": "Iz trenutnega urnika", + "Week of": "Teden od", + "The Monday of the first week of the window": "Ponedeljek prvega tedna obdobja", + "Window start": "Začetek obdobja", + "The first day the week pattern applies to": "Prvi dan, za katerega velja tedenski vzorec", + "Window end": "Konec obdobja", + "The last day the week pattern applies to": "Zadnji dan, za katerega velja tedenski vzorec", + "Waiting, generating, done, failed, or published as draft lessons": "Čaka, se ustvarja, končan, ni uspel ali objavljen kot osnutki ur", + "Waiting": "Čaka", + "Generating": "Se ustvarja", + "Failed": "Ni uspel", + "Published": "Objavljen", + "Seed": "Seme", + "The number the generator starts from, so a run can be repeated": "Število, s katerim generator začne, da je zagon mogoče ponoviti", + "Input": "Vhod", + "The periods, rooms, lessons and wishes the scenario was made from": "Ure, prostori, učne ure in želje, iz katerih je nastal scenarij", + "Placements": "Umestitve", + "Each lesson with the period and room it was given": "Vsaka učna ura z uro in prostorom, ki ju je dobila", + "Unplaced lessons": "Neumeščene ure", + "Lessons without a place, each with the hard wish that blocked it": "Ure brez mesta, vsaka s trdo željo, ki jo je ustavila", + "Broken wishes": "Kršene želje", + "The wishes this scenario breaks, with the lessons that break them": "Želje, ki jih ta scenarij krši, z urami, ki jih kršijo", + "Measures": "Merila", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Umeščene ure, kršene želje, proste ure učiteljev, ure na dan in raba prostorov", + "Reason": "Razlog", + "Why the run failed": "Zakaj zagon ni uspel", + "Published at": "Objavljeno", + "When the scenario was written out as draft lessons": "Kdaj je bil scenarij zapisan kot osnutki ur", + "Edit wish": "Uredi željo", + "New wish": "Nova želja", + "Hard: the generator always keeps it": "Obvezna: generator jo vedno upošteva", + "Soft: the generator keeps it where it can": "Prožna: generator jo upošteva, kjer lahko", + "Weight (1 to 3)": "Utež (od 1 do 3)", + "Most lessons a day": "Največ ur na dan", + "Period": "Ura", + "{day} period {number}": "{day} ura {number}", + "Teacher (user name)": "Učitelj (uporabniško ime)", + "Activity (group:subject)": "Dejavnost (skupina:predmet)", + "Say who or what the wish is about.": "Navedite, na koga ali kaj se želja nanaša.", + "Choose at least one period.": "Izberite vsaj eno uro.", + "The limit is a whole number of 1 or more.": "Omejitev je celo število 1 ali več.", + "Timetable": "Urnik", + "Wishes": "Želje", + "Timetable wishes": "Želje za urnik", + "Generator run": "Zagon generatorja", + "Generator progress": "Napredek generatorja", + "The run failed: {reason}": "Zagon ni uspel: {reason}", + "{placed} of {lessons} lessons placed": "Umeščenih {placed} od {lessons} ur", + "Generate again": "Ustvari znova", + "Generate": "Ustvari", + "Every lesson has a place.": "Vsaka ura ima mesto.", + "Lesson": "Ura", + "No free period and room": "Ni proste ure in učilnice", + "Broken soft wishes": "Kršene prožne želje", + "Every soft wish is kept.": "Vsaka prožna želja je upoštevana.", + "Wish": "Želja", + "Lessons": "Ure", + "Generating: {percent}% of the time budget used": "Ustvarjanje: porabljenih {percent} % časa", + "Waiting to start": "Čaka na začetek", + "Published as draft lessons": "Objavljeno kot osnutki ur", + "Could not read the scenario.": "Scenarija ni bilo mogoče prebrati.", + "Could not start the run.": "Zagona ni bilo mogoče začeti.", + "Scenarios": "Scenariji", + "Timetable scenarios": "Scenariji urnika", + "Scenario": "Scenarij", + "Take the current timetable": "Prevzemi trenutni urnik", + "Could not take the current timetable.": "Trenutnega urnika ni bilo mogoče prevzeti.", + "Broken hard wishes": "Kršene obvezne želje", + "Not on a period of the week grid": "Ni na uri tedenske mreže", + "Compare scenarios": "Primerjaj scenarije", + "Scenarios to compare": "Scenariji za primerjavo", + "Choose two or three scenarios to compare them.": "Izberite dva ali tri scenarije za primerjavo.", + "Measure": "Merilo", + "Best": "Najboljše", + "Lessons that differ": "Ure, ki se razlikujejo", + "No lesson differs.": "Nobena ura se ne razlikuje.", + "Not placed": "Ni umeščeno", + "{period} in {room}": "{period} v {room}", + "Lessons placed": "Umeščene ure", + "Lessons without a place": "Ure brez mesta", + "Clashes": "Spori", + "Hard wishes broken": "Kršene obvezne želje", + "Soft wishes broken": "Kršene prožne želje", + "Soft wishes broken, weighted": "Kršene prožne želje, utežene", + "Free periods between lessons, all teachers": "Proste ure, vsi učitelji", + "Most free periods of one teacher": "Največ prostih ur enega učitelja", + "Most lessons of one group on a day": "Največ ur ene skupine na dan", + "Room use": "Raba učilnic", + "Publish as draft lessons": "Objavi kot osnutke ur", + "Draft lessons written: {count}": "Zapisani osnutki ur: {count}", + "Could not publish the scenario.": "Scenarija ni bilo mogoče objaviti.", + "Rules": "Pravila", + "Rules for {column}": "Pravila za {column}", + "When a card enters this column": "Ko kartica vstopi v ta stolpec", + "Action": "Dejanje", + "Set the priority": "Nastavi prednost", + "Assign to": "Dodeli", + "Assign the person who moved the card": "Dodeli osebi, ki je premaknila kartico", + "Remove the assignee": "Odstrani izvajalca", + "Add a label": "Dodaj oznako", + "No longer a project member": "Ni več član projekta", + "This label no longer exists": "Ta oznaka ne obstaja več", + "Add rule": "Dodaj pravilo", + "Remove rule": "Odstrani pravilo", + "No rules yet. Add one to change a card when it enters this column.": "Pravil še ni. Dodajte pravilo, ki spremeni kartico, ko vstopi v ta stolpec.", + "Could not save the rules. Please try again.": "Pravil ni bilo mogoče shraniti. Poskusite znova.", + "1 rule runs when a card enters this column": "1 pravilo se izvede, ko kartica vstopi v ta stolpec", + "{count} rules run when a card enters this column": "Število pravil, ki se izvedejo, ko kartica vstopi v ta stolpec: {count}", + "Rules applied: {changes}": "Uporabljena pravila: {changes}", + "assigned to {name}": "dodeljeno: {name}", + "assignee removed": "izvajalec odstranjen", + "priority {priority}": "prednost {priority}", + "label {label}": "oznaka {label}", + "What happens to a card when it enters this column, applied in list order.": "Kaj se zgodi s kartico, ko vstopi v ta stolpec, po vrstnem redu seznama.", + "Value": "Vrednost", + "What the rule does to the card.": "Kaj pravilo naredi s kartico.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prednost, ID uporabnika ali ID oznake, ki ga uporablja dejanje; prazno za dejanja brez vrednosti.", + "is not": "ni", + "{dimension} is not": "{dimension} ni", + "Saved filters": "Shranjeni filtri", + "No saved filters yet": "Shranjenih filtrov še ni", + "Save filter": "Shrani filter", + "Rename \"{name}\"": "Preimenuj »{name}«", + "Delete \"{name}\"": "Izbriši »{name}«", + "Clear filters": "Počisti filtre", + "Showing {shown} of {total} tasks": "Prikazanih {shown} od {total} nalog", + "Me": "Jaz", + "No date": "Brez datuma", + "Rename saved filter": "Preimenuj shranjeni filter", + "Share with the project": "Deli s projektom", + "Give the filter a name": "Poimenujte filter", + "Could not save the filter. Please try again.": "Filtra ni bilo mogoče shraniti. Poskusite znova.", + "Some labels in \"{name}\" no longer exist and were left out.": "Nekatere oznake v »{name}« ne obstajajo več in so bile izpuščene.", + "Could not delete the filter. Please try again.": "Filtra ni bilo mogoče izbrisati. Poskusite znova.", + "Saved filter": "Shranjeni filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Poimenovan filter table enega projekta, zaseben za osebo, ki ga je shranila, razen če je deljen s projektom.", + "The project whose board the filter applies to": "Projekt, za katerega tablo velja filter", + "The name the filter is listed under": "Ime, pod katerim je filter na seznamu", + "Saved by": "Shranil/a", + "Nextcloud user id of the person who saved the filter": "ID uporabnika Nextcloud, ki je shranil filter", + "Shared with the project": "Deljeno s projektom", + "Whether every project member sees and applies the filter": "Ali vsak član projekta vidi filter in ga lahko uporabi", + "Criteria": "Merila", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filter: izvajalec, oznaka, prednost in rok, vsak z je ali ni in vrednostmi", + "Cross-project view": "Medprojektni pogled", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Shranjen izbor projektov, katerih naloge so prikazane skupaj v stolpcih stanj, deljen z navedenimi ljudmi.", + "Shared with": "V skupni rabi z", + "The name the view is listed under": "Ime, pod katerim je pogled naveden", + "Nextcloud user id of the person who saved the view": "ID uporabnika Nextcloud osebe, ki je shranila pogled", + "Nextcloud user ids of the people the view is shared with": "ID-ji uporabnikov Nextcloud oseb, s katerimi je pogled v skupni rabi", + "The projects whose tasks the view shows, at most twenty": "Projekti, katerih naloge pogled prikazuje, največ dvajset", + "1 project in this view is hidden from you.": "1 projekt v tem pogledu je pred vami skrit.", + "{count} projects in this view are hidden from you.": "Projekti v tem pogledu, skriti pred vami: {count}.", + "{project} has no column for {status}.": "Projekt {project} nima stolpca za stanje {status}.", + "This view does not exist or is not shared with you.": "Ta pogled ne obstaja ali ni v skupni rabi z vami.", + "\"{task}\" moved to {status}.": "\"{task}\" premaknjeno v {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Medprojektni pogledi", + "New view": "Nov pogled", + "Edit view": "Uredi pogled", + "Delete view": "Izbriši pogled", + "Give the view a name": "Poimenujte pogled", + "Pick at least one project": "Izberite vsaj en projekt", + "A view shows at most {max} projects": "Pogled prikaže največ {max} projektov", + "Could not save the view. Please try again.": "Pogleda ni bilo mogoče shraniti. Poskusite znova.", + "Could not delete the view. Please try again.": "Pogleda ni bilo mogoče izbrisati. Poskusite znova.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Izbrišem »{title}«? Projekti in njihove naloge ostanejo, kot so.", + "People see the tasks of the projects they are in, never more.": "Vsak vidi le naloge projektov, v katerih je.", + "No views yet. A view shows the tasks of several of your projects together.": "Pogledov še ni. Pogled prikaže naloge več vaših projektov skupaj.", + "Projects in view: {count}": "Projekti v pogledu: {count}", + "Notify me when a task is assigned to me": "Obvesti me, ko mi je dodeljena naloga", + "Also send these to me by email": "Pošlji mi jih tudi po e-pošti", + "Add an email address in your Nextcloud personal settings to get mail.": "Za prejemanje e-pošte dodajte e-poštni naslov v osebnih nastavitvah Nextcloud.", + "Code link": "Povezava do kode", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, veja, zahteva za združitev ali zadeva na platformi za kodo, ki se nanaša na nalogo.", + "The task the link belongs to": "Naloga, ki ji povezava pripada", + "The project of the task": "Projekt naloge", + "Task key": "Ključ naloge", + "The task key the forge text named, such as VC-12": "Ključ naloge, ki ga je navedlo besedilo platforme, na primer VC-12", + "What the link points at": "Kam kaže povezava", + "Link": "Povezava", + "The address of the item in the forge": "Naslov elementa na platformi za kodo", + "The commit message, branch name or merge request title": "Sporočilo commita, ime veje ali naslov zahteve za združitev", + "Repository": "Repozitorij", + "The repository, such as acme/portal": "Repozitorij, na primer acme/portal", + "Forge id": "Id na platformi", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Lastni id elementa na platformi za kodo, na primer github:acme/portal#42 ali zgoščena vrednost commita", + "State": "Stanje", + "The state of a merge request or issue": "Stanje zahteve za združitev ali zadeve", + "Who made the commit or opened the merge request": "Kdo je naredil commit ali odprl zahtevo za združitev", + "When the commit was made or the merge request last changed": "Kdaj je bil commit narejen ali se je zahteva za združitev nazadnje spremenila", + "Added by": "Dodal", + "Whether a person added the link or the integration wrote it": "Ali je povezavo dodala oseba ali jo je zapisala integracija", + "Nextcloud user UIDs of project members": "ID-ji uporabnikov Nextcloud članov projekta", + "Add link": "Dodaj povezavo", + "Added by hand": "Dodano ročno", + "Branch": "Veja", + "Code": "Koda", + "Commit": "Commit", + "From the integration": "Iz integracije", + "Link to a commit, branch or merge request": "Povezava do commita, veje ali zahteve za združitev", + "Merge request": "Zahteva za združitev", + "Merged": "Združeno", + "No code linked yet. Name {key} in a commit message or paste a link.": "Koda še ni povezana. Navedite {key} v sporočilu commita ali prilepite povezavo.", + "No code linked yet. Paste a link to a commit or merge request.": "Koda še ni povezana. Prilepite povezavo do commita ali zahteve za združitev.", + "Paste a web address that starts with https://.": "Prilepite spletni naslov, ki se začne s https://.", + "Remove link {title}": "Odstrani povezavo {title}", + "The link could not be added.": "Povezave ni bilo mogoče dodati.", + "The link could not be removed.": "Povezave ni bilo mogoče odstraniti.", + "This link is already on the task.": "Ta povezava je že pri nalogi.", + "Code forges": "Platforme za kodo", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Povežite commite in pull requeste iz GitHuba z nalogami. Integriq prejema dogodke; planninq GitHuba nikoli ne kliče.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Prenesite konfiguracijo in jo uvozite v Integriq. Nato vpišite skrivnost v pravilo \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "V GitHubu repozitoriju dodajte webhook s tem naslovom in isto skrivnostjo. Izberite vrsto vsebine application/json ter dogodka push in pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Navedite ključ naloge, na primer VC-12, v sporočilu commita, imenu veje ali naslovu pull requesta. Povezava se nato prikaže pri tej nalogi.", + "Without Integriq, project members can still paste a link on the task page.": "Brez Integriqa lahko člani projekta še vedno prilepijo povezavo na strani naloge.", + "Download the Integriq configuration": "Prenesi konfiguracijo Integriq", + "Calendar": "Koledar", + "Previous": "Prejšnji", + "Calendar view": "Pogled koledarja", + "Starts:": "Začetek:", + "No tasks with a date in this month.": "Ta mesec ni nalog z datumom.", + "Week of {start} to {end}": "Teden od {start} do {end}", + "My calendar": "Moj koledar", + "Show as list": "Prikaži kot seznam", + "Show as calendar": "Prikaži kot koledar", + "Open my calendar": "Odpri moj koledar", + "Nextcloud Tasks": "Naloge Nextcloud", + "Show my tasks in Nextcloud Tasks": "Prikaži moje naloge v Nalogah Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Naloge, dodeljene vam ali deljene z vami, se prikažejo na seznamu \"Planninq\" v Nalogah in Koledarju Nextcloud. Spremembe, narejene tam, se zamenjajo ob naslednji spremembi v Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ta strežnik ne more pisati v Naloge Nextcloud, zato izvoz ni na voljo.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Upravlja Planninq. Spremembe, narejene tukaj, se zamenjajo ob naslednji spremembi v Planninq.", + "Working days and holidays": "Delovni dnevi in prazniki", + "Dates set on the timeline skip the days that are not working days.": "Datumi, nastavljeni na časovnici, preskočijo dneve, ki niso delovni.", + "Working weekdays": "Delovni dnevi v tednu", + "Non-working days": "Dela prosti dnevi", + "No non-working days yet.": "Še ni dela prostih dni.", + "Add day": "Dodaj dan", + "Year": "Leto", + "Add Dutch national holidays": "Dodaj nizozemske državne praznike", + "Save working days": "Shrani delovne dni", + "Choose at least one working weekday.": "Izberite vsaj en delovni dan.", + "Working days saved.": "Delovni dnevi so shranjeni.", + "Could not save the working days.": "Delovnih dni ni bilo mogoče shraniti.", + "New Year's Day": "Novo leto", + "Easter Sunday": "Velikonočna nedelja", + "Easter Monday": "Velikonočni ponedeljek", + "King's Day": "Kraljev dan", + "Liberation Day": "Dan osvoboditve", + "Ascension Day": "Vnebohod", + "Whit Sunday": "Binkoštna nedelja", + "Whit Monday": "Binkoštni ponedeljek", + "Christmas Day": "Božič", + "Boxing Day": "Štefanovo", + "Dates of {title}": "Datumi za {title}", + "The due date cannot be before the start date.": "Rok ne more biti pred datumom začetka.", + "{title}, from {start} to {end}": "{title}, od {start} do {end}", + "The dates could not be saved.": "Datumov ni bilo mogoče shraniti.", + "{title} now runs from {start} to {end}": "{title} zdaj poteka od {start} do {end}", + "Auto-scheduling": "Samodejno načrtovanje", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Ko je vklopljeno, poznejši rok na časovnici ponudi premik nalog, ki jih blokira.", + "Move blocked tasks along when a task slips": "Premakni blokirane naloge, ko naloga zamuja", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Na časovnici poznejši rok ponudi premik blokiranih nalog. Štejejo samo povezave \"blokira\", naloge pa se premikajo samo pozneje.", + "Move the tasks that wait for {title}?": "Premaknem naloge, ki čakajo na {title}?", + "These tasks wait for it and would start after its new due date:": "Te naloge čakajo nanjo in bi se začele po novem roku:", + "{count} tasks would move; the first {limit} are listed.": "Premaknilo bi se {count} nalog; prikazanih je prvih {limit}.", + "Now": "Zdaj", + "After the move": "Po premiku", + "Only this task": "Samo ta naloga", + "Move all": "Premakni vse", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Ustavljeno pri {title}: datumov ni bilo mogoče shraniti. Naloge pred njo so bile premaknjene.", + "Cumulative flow": "Kumulativni tok", + "Show as chart": "Prikaži kot graf", + "Show as table": "Prikaži kot tabelo", + "Tasks per column per day": "Opravila po stolpcih na dan", + "Tasks without recorded history in this period: {count}": "Opravila brez zabeležene zgodovine v tem obdobju: {count}", + "Lead and cycle time": "Čas izvedbe in čas cikla", + "No tasks were finished in this period.": "V tem obdobju ni bilo dokončano nobeno opravilo.", + "Finished tasks": "Dokončana opravila", + "Cycle time, average": "Čas cikla, povprečje", + "Cycle time, 85th percentile": "Čas cikla, 85. percentil", + "Lead time, average": "Čas izvedbe, povprečje", + "Tasks whose finish time was estimated from their history: {count}": "Opravila, katerih čas dokončanja je ocenjen iz zgodovine: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Čas cikla vsakega dokončanega opravila s povprečjem in 85. percentilom", + "Slowest tasks": "Najpočasnejša opravila", + "cycle {cycle}, lead {lead}": "cikel {cycle}, izvedba {lead}", + "{days} days": "{days} dni", + "Could not load the flow of this project.": "Toka tega projekta ni bilo mogoče naložiti.", + "Last {days} days": "Zadnjih {days} dni", + "Portfolio flow": "Tok portfelja", + "An admin adds portfolios under Projects, Portfolios.": "Skrbnik doda portfelje pod Projekti, Portfelji.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Neprikazani projekti, ker je naenkrat prikazanih največ 50: {count}", + "Could not load the flow of this portfolio.": "Toka tega portfelja ni bilo mogoče naložiti.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativni tok in čas cikla prek projektov portfelja.", + "Edit report": "Uredi poročilo", + "Only tasks where": "Samo opravila, kjer", + "Group by": "Združi po", + "Display": "Prikaz", + "Share with everyone who can read its projects": "Deli z vsemi, ki lahko berejo njegove projekte", + "The report could not be saved.": "Poročila ni bilo mogoče shraniti.", + "Number of tasks": "Število opravil", + "Bar": "Stolpci", + "Donut": "Obroč", + "Table": "Tabela", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} od {total} projektov v tem poročilu ni vidnih za vas", + "No tasks match this report.": "Nobeno opravilo ne ustreza temu poročilu.", + "None": "Brez", + "Could not load this report.": "Tega poročila ni bilo mogoče naložiti.", + "Report": "Poročilo", + "Your reports": "Vaša poročila", + "My reports": "Moja poročila", + "Shared reports": "Deljena poročila", + "You have not built a report yet.": "Še niste ustvarili poročila.", + "Nobody has shared a report with you yet.": "Nihče še ni delil poročila z vami.", + "Reports you built over tasks, and the ones shared with you.": "Poročila, ki ste jih ustvarili nad opravili, in tista, ki so bila deljena z vami.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Shranjena poizvedba nad opravili: kateri projekti, kateri filtri, združeno po čem, prešteto ali seštevek, prikazano kot tabela ali graf.", + "The name the report is listed under": "Ime, pod katerim je poročilo navedeno", + "What the report shows and who it is for": "Kaj poročilo prikazuje in za koga je", + "Nextcloud user id of the person who saved the report": "ID uporabnika Nextcloud, ki je poročilo shranil", + "Who can open the report": "Kdo lahko odpre poročilo", + "Only me": "Samo jaz", + "Everyone who can read its projects": "Vsi, ki lahko berejo njegove projekte", + "The projects the report covers, at most fifty": "Projekti, ki jih poročilo zajema, največ petdeset", + "Filters": "Filtri", + "Task fields and the value each must equal": "Polja opravila in vrednost, ki ji mora biti vsako enako", + "The task field the report groups on": "Polje opravila, po katerem poročilo združuje", + "Count the tasks, or add up a number on them": "Preštej opravila ali seštej število na njih", + "Sum": "Vsota", + "Sum of": "Vsota polja", + "The number added up when the measure is a sum": "Število, ki se sešteje, ko je mera vsota", + "Story points": "Točke zgodbe", + "Estimated duration": "Ocenjeno trajanje", + "How the report is shown": "Kako je poročilo prikazano", + "Issue type": "Vrsta zahtevka", + "Task fields and the value each must equal; empty when the report covers every task": "Polja opravila in vrednost, ki jo mora imeti vsako; prazno, ko poročilo zajema vsa opravila", + "The status a task must have": "Stanje, ki ga mora imeti opravilo", + "The priority a task must have": "Prednost, ki jo mora imeti opravilo", + "The user a task must be assigned to": "Uporabnik, ki mu mora biti opravilo dodeljeno", + "A label a task must carry": "Oznaka, ki jo mora imeti opravilo", + "The board column a task must be in": "Stolpec table, v katerem mora biti opravilo", + "The issue type a task must have": "Vrsta zahtevka, ki jo mora imeti opravilo", + "Manager groups": "Skupine upraviteljev", + "Member groups": "Skupine članov", + "Viewer groups": "Skupine bralcev", + "Viewers": "Bralci", + "Owning group": "Lastniška skupina", + "Nextcloud groups whose members manage the project": "Skupine Nextcloud, katerih člani upravljajo projekt", + "Nextcloud groups whose members work on the project": "Skupine Nextcloud, katerih člani delajo na projektu", + "Nextcloud groups whose members may read the project": "Skupine Nextcloud, katerih člani lahko berejo projekt", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Uporabniki Nextcloud, ki upravljajo projekt: nastavitve, člane in delo", + "Nextcloud user ids who may read the project and its work but not change it": "Uporabniki Nextcloud, ki lahko berejo projekt in njegovo delo, ne morejo pa ga spreminjati", + "The Nextcloud group that owns the project with its creator, at most one": "Skupina Nextcloud, ki ima projekt v lasti skupaj z ustvarjalcem, največ ena", + "Nextcloud user ids who may read this through the project": "Uporabniki Nextcloud, ki lahko to berejo prek projekta", + "Nextcloud groups whose members may change this through the project": "Skupine Nextcloud, katerih člani lahko to spreminjajo prek projekta", + "Nextcloud groups whose members may read this through the project": "Skupine Nextcloud, katerih člani lahko to berejo prek projekta", + "Search for a person or a group…": "Poišči osebo ali skupino…", + "No one found. Your admin's sharing settings decide who you can find.": "Nihče ni bil najden. Nastavitve deljenja vašega skrbnika določajo, koga lahko najdete.", + "Type at least two characters": "Vnesite vsaj dva znaka", + "Everyone in this group": "Vsi v tej skupini", + "Could not search for people. Please try again.": "Iskanje oseb ni uspelo. Poskusite znova.", + "Could not remove the group": "Skupine ni bilo mogoče odstraniti", + "Only the owner and managers change who is on this project.": "Kdo je v tem projektu, spreminjata samo lastnik in upravitelji.", + "Role of {name}": "Vloga: {name}", + "Manager": "Upravitelj", + "Member": "Član", + "Viewer": "Bralec", + "Could not change the role": "Vloge ni bilo mogoče spremeniti", + "Owned by group: {name}": "V lasti skupine: {name}", + "No group owns this project.": "Nobena skupina ni lastnica tega projekta.", + "Owned by group": "V lasti skupine", + "Search for a group…": "Poišči skupino…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ni najdene skupine. Nastavitve deljenja vašega skrbnika določajo, katere skupine lahko najdete.", + "No owning group": "Brez lastniške skupine", + "Could not search for groups. Please try again.": "Skupin ni bilo mogoče poiskati. Poskusite znova.", + "Could not change the owning group": "Lastniške skupine ni bilo mogoče spremeniti", + "You can read this project. Only its members change it.": "Ta projekt lahko berete. Spreminjajo ga le njegovi člani.", + "Course": "Predmet", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Predmet, ki se poučuje pri tej uri, na primer izbirni predmet, ko ga šolska učna aplikacija pozna.", + "Online meeting link": "Povezava do spletne ure", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Kje se učenci pridružijo tej uri na spletu. Gumb Pridruži se se prikaže le pri povezavi https." }, "plurals": null } diff --git a/l10n/sq.js b/l10n/sq.js index 0dfab88f..e99a424e 100644 --- a/l10n/sq.js +++ b/l10n/sq.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Projekte aktive", + "Archived projects": "Projekte të arkivuara", + "Boards": "Tabela", + "My projects": "Projektet e mia", + "Portfolio": "Portofol", + "Project board": "Tabela e projektit", + "Projects I am in": "Projekte në të cilat marr pjesë", + "Timeline": "Vija kohore", + "Timesheet": "Fletë orësh", + "Features & roadmap": "Veçoritë dhe plani i zhvillimit", + "Flow": "Rrjedhë", + "Flows": "Rrjedha", + "Reports": "Raportet", + "Pick a report to open it.": "Zgjidhni një raport për ta hapur.", + "In progress": "Në vazhdim", + "Date": "Data", + "Due": "Afati", + "Assignee": "Caktuar për", + "Who": "Kush", + "What": "Çfarë", + "Minutes": "Minuta", + "Entries": "Regjistrime", + "Most recent": "Më të fundit", + "Per person": "Për person", + "By status": "Sipas statusit", + "By priority": "Sipas përparësisë", + "Task status": "Statusi i detyrave", + "Time spent": "Koha e shpenzuar", + "Capacity": "Kapaciteti", + "Due soonest": "Skadojnë më parë", + "Minutes logged": "Minuta të regjistruara", + "Nothing is due": "Asgjë nuk skadon", + "Nothing logged yet": "Ende asgjë e regjistruar", + "What is open, what is blocked, and what is overdue.": "Çfarë është e hapur, çfarë është bllokuar dhe çfarë ka vonesë.", + "How allocation is spread across the people working on projects.": "Si shpërndahet ngarkesa mes njerëzve që punojnë në projekte.", + "Hours logged, and the projects they went to.": "Orët e regjistruara dhe projektet ku shkuan.", + "Billable": "I faturueshëm", + "Budget: {amount}": "Buxheti: {amount}", + "Loading projects": "Po ngarkohen projektet", + "No projects for this client yet": "Ende nuk ka projekte për këtë klient", + "Open in Planninq": "Hape në Planninq", + "This project could not be found": "Ky projekt nuk u gjet", + "Untitled project": "Projekt pa titull", + "and {count} more": "dhe {count} të tjera", + "Store": "Dyqani", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instaloni regjistra, skema dhe rrjedha të publikuara nga organizata të tjera.", + "Work Date": "Data e punës", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Veprimet e kolonës", + "Columns": "Kolonat", + "Could not remove the column. Please try again.": "Kolona nuk u hoq dot. Provoni përsëri.", + "Could not save the column. Please try again.": "Kolona nuk u ruajt dot. Provoni përsëri.", + "Done column": "Kolona e përfunduarave", + "Edit column": "Ndrysho kolonën", + "Keep the card's status": "Mbaj gjendjen e kartës", + "Move its cards to": "Zhvendos kartat e saj te", + "Move left": "Zhvendos majtas", + "Move right": "Zhvendos djathtas", + "Status of cards moved here": "Gjendja e kartave të zhvendosura këtu", + "The last done column cannot be removed.": "Kolona e fundit e përfunduarave nuk mund të hiqet.", + "WIP limit": "Kufiri WIP", + "over limit": "mbi kufirin", + "The status a card gets when it is moved into this column.": "Gjendja që merr një kartë kur zhvendoset në këtë kolonë.", + "All priorities": "Të gjitha prioritetet", + "Could not create the task. Please try again.": "Detyra nuk u krijua dot. Provoni përsëri.", + "Created": "Krijuar", + "Move to backlog": "Te lista e pritjes", + "Move to board": "Te tabela", + "New task": "Detyrë e re", + "Nothing in the backlog": "Asgjë në listën e pritjes", + "Rank": "Renditja", + "Sort by": "Rendit sipas", + "Sort by rank to reorder": "Rendit sipas renditjes për ta ndryshuar radhën", + "Task actions": "Veprimet e detyrës", + "All labels": "Të gjitha etiketat", + "Filter tasks by label": "Filtro detyrat sipas etiketës", + "View timeline": "Shiko kronologjinë", + "Board": "Tabela", + "List": "Lista", + "Column": "Kolona", + "Board or list": "Tabela ose lista", + "Log": "Regjistri", + "Add entry": "Shto hyrje", + "Show": "Shfaq", + "No actions yet": "Ende nuk ka veprime", + "Closed": "Mbyllur", + "Entry actions": "Veprimet e hyrjes", + "Add action": "Shto veprim", + "by {author}": "nga {author}", + "saved {time}": "ruajtur {time}", + "Attendees: {names}": "Të pranishëm: {names}", + "Add the first entry": "Shto hyrjen e parë", + "Issues": "Çështje", + "Lessons learned": "Mësime të nxjerra", + "Meetings": "Takime", + "Decisions": "Vendime", + "Actions": "Veprime", + "Issue": "Çështje", + "Lesson learned": "Mësim i nxjerrë", + "Meeting": "Takim", + "Decision": "Vendim", + "About this project": "Rreth këtij projekti", + "No description yet": "Ende pa përshkrim", + "Start date": "Data e fillimit", + "Not set": "E pacaktuar", + "End date": "Data e mbarimit", + "Progress": "Ecuria", + "No tasks yet": "Ende nuk ka detyra", + "Open the board": "Hap tabelën", + "People": "Njerëz", + "Owner": "Pronari", + "Latest log entries": "Hyrjet më të fundit", + "Open the log": "Hap regjistrin", + "{done} of {total} tasks done": "{done} nga {total} detyra të kryera", + "Edit entry": "Ndrysho hyrjen", + "Type": "Lloji", + "Attendees": "Të pranishëm", + "Issue is closed": "Çështja është mbyllur", + "Could not save the entry. Please try again.": "Hyrja nuk u ruajt dot. Provoni përsëri.", + "From: {title}": "Nga: {title}", + "What needs to happen": "Çfarë duhet bërë", + "Could not create the action. Please try again.": "Veprimi nuk u krijua dot. Provoni përsëri.", + "The action was created but could not be linked to the entry.": "Veprimi u krijua, por nuk u lidh dot me hyrjen.", + "Project pages": "Faqet e projektit", + "Overview": "Përmbledhje", + "Risks": "Rreziqe", + "Log entry": "Hyrje regjistri", + "A short name for the entry": "Një emër i shkurtër për hyrjen", + "Project": "Projekt", + "The project this entry belongs to": "Projekti të cilit i përket kjo hyrje", + "What kind of entry this is": "Çfarë lloj hyrjeje është", + "When it happened": "Kur ndodhi", + "What happened, in Markdown": "Çfarë ndodhi, në Markdown", + "Whether an issue is still open": "Nëse një çështje është ende e hapur", + "The people at a meeting": "Njerëzit në një takim", + "Tasks that came out of this entry": "Detyrat që dolën nga kjo hyrje", + "Add risk": "Shto rrezik", + "Risk": "Rrezik", + "Score": "Pikët", + "Response": "Përgjigjja", + "Review date": "Data e rishikimit", + "no longer on the project": "nuk është më në projekt", + "Edit {title}": "Ndrysho {title}", + "No risks recorded yet": "Ende nuk ka rreziqe të regjistruara", + "Add the first risk": "Shto rrezikun e parë", + "Medium": "Mesatar", + "Mitigating": "Në zbutje", + "Occurred": "Ndodhi", + "Avoid": "Shmang", + "Reduce": "Ul", + "Transfer": "Transfero", + "Accept": "Prano", + "Highest open risks": "Rreziqet e hapura më të larta", + "No open risks": "Nuk ka rreziqe të hapura", + "Open the risk register": "Hap regjistrin e rreziqeve", + "Edit risk": "Ndrysho rrezikun", + "What could go wrong": "Çfarë mund të shkojë keq", + "Likelihood": "Gjasat", + "Impact": "Ndikimi", + "Score {score}": "Pikët {score}", + "Countermeasures": "Kundërmasat", + "Could not save the risk. Please try again.": "Rreziku nuk u ruajt dot. Provoni përsëri.", + "Risks by likelihood and impact": "Rreziqet sipas gjasave dhe ndikimit", + "Risk scale": "Shkalla e rrezikut", + "The levels every project scores its risks on, and where low turns into medium and high": "Nivelet mbi të cilat çdo projekt pikëzon rreziqet e veta, dhe ku i ulëti kalon në mesatar dhe të lartë", + "Number of levels": "Numri i niveleve", + "Likelihood labels": "Etiketat e gjasave", + "Impact labels": "Etiketat e ndikimit", + "Level {level}": "Niveli {level}", + "Medium from score": "Mesatar nga pikët", + "High from score": "I lartë nga pikët", + "Risk scale saved": "Shkalla e rrezikut u ruajt", + "1 risk uses level {level}. Change it first.": "1 rrezik përdor nivelin {level}. Ndryshojeni më parë.", + "{count} risks use level {level}. Change them first.": "{count} rreziqe përdorin nivelin {level}. Ndryshojini më parë.", + "Every level needs a label, and high must start above medium.": "Çdo nivel ka nevojë për etiketë, dhe i larti duhet të fillojë mbi mesataren.", + "The project this risk belongs to": "Projekti të cilit i përket ky rrezik", + "The cause and the effect, in Markdown": "Shkaku dhe pasoja, në Markdown", + "Category": "Kategoria", + "A free grouping, such as planning, budget or supplier": "Një grupim i lirë, si planifikim, buxhet ose furnizues", + "How likely it is, on the admin's risk scale": "Sa i mundshëm është, në shkallën e rrezikut të administratorit", + "How hard it would hit, on the admin's risk scale": "Sa rëndë do të godiste, në shkallën e rrezikut të administratorit", + "Likelihood times impact, calculated by the server": "Gjasat herë ndikimin, llogaritur nga serveri", + "Where the risk stands": "Ku ndodhet rreziku", + "The person who watches this risk": "Personi që ndjek këtë rrezik", + "How the project answers the risk": "Si i përgjigjet projekti rrezikut", + "What is done to prevent it or soften it, in Markdown": "Çfarë bëhet për ta parandaluar ose zbutur, në Markdown", + "When to look at this risk again": "Kur të rishikohet përsëri ky rrezik", + "Very low": "Shumë i ulët", + "Very high": "Shumë i lartë", + "All projects": "Të gjitha projektet", + "Project status report": "Raport gjendjeje i projektit", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Një raport me datë se si qëndron një projekt për para, organizim, kohë, informacion, cilësi dhe rrezik (aspektet GROTIK), secili me një shënim.", + "The project this report is about": "Projekti për të cilin është raporti", + "Report date": "Data e raportit", + "The day the report describes": "Dita që përshkruan raporti", + "Money": "Para", + "How the project stands on this aspect": "Si qëndron projekti në këtë aspekt", + "On track": "Sipas planit", + "At risk": "Në rrezik", + "Off track": "Jashtë planit", + "Money note": "Shënim për paratë", + "A short explanation of this status": "Një shpjegim i shkurtër i kësaj gjendjeje", + "Organisation": "Organizim", + "Organisation note": "Shënim për organizimin", + "Time": "Kohë", + "Time note": "Shënim për kohën", + "Information": "Informacion", + "Information note": "Shënim për informacionin", + "Quality": "Cilësi", + "Quality note": "Shënim për cilësinë", + "Risk note": "Shënim për rrezikun", + "Overall": "Gjithsej", + "The worst of the six statuses, calculated by the server": "Më e keqja nga gjashtë gjendjet, e llogaritur nga serveri", + "Health: money": "Shëndeti: para", + "Copied from the newest status report": "Kopjuar nga raporti më i ri i gjendjes", + "Health: organisation": "Shëndeti: organizim", + "Health: time": "Shëndeti: kohë", + "Health: information": "Shëndeti: informacion", + "Health: quality": "Shëndeti: cilësi", + "Health: risk": "Shëndeti: rrezik", + "Health: overall": "Shëndeti: gjithsej", + "Health: report date": "Shëndeti: data e raportit", + "The date of the newest status report": "Data e raportit më të ri të gjendjes", + "New report": "Raport i ri", + "Only the project owner writes status reports.": "Vetëm pronari i projektit shkruan raporte gjendjeje.", + "Latest report, {date}": "Raporti i fundit, {date}", + "Aspect": "Aspekt", + "Note": "Shënim", + "Report history": "Historiku i raporteve", + "Author": "Autor", + "No status reports yet": "Ende nuk ka raporte gjendjeje", + "Write the first report": "Shkruaj raportin e parë", + "Choose a status for every aspect to save the report.": "Zgjidhni një gjendje për çdo aspekt për ta ruajtur raportin.", + "Suggested: on track.": "Sugjerim: sipas planit.", + "Suggested: at risk.": "Sugjerim: në rrezik.", + "Suggested: off track.": "Sugjerim: jashtë planit.", + "1 task is past its due date.": "1 detyrë e ka kaluar afatin.", + "{count} tasks are past their due date.": "Detyra që e kanë kaluar afatin: {count}.", + "The end date has passed with 1 open task.": "Data e mbarimit ka kaluar me 1 detyrë të hapur.", + "The end date has passed with {count} open tasks.": "Data e mbarimit ka kaluar, detyra të hapura: {count}.", + "No open task is past its due date.": "Asnjë detyrë e hapur nuk e ka kaluar afatin.", + "The highest open risk, \"{title}\", scores {score}.": "Rreziku më i lartë i hapur, \"{title}\", ka pikë {score}.", + "There are no open risks.": "Nuk ka rreziqe të hapura.", + "Costs are at {percent}% of the budget.": "Kostot janë në {percent}% të buxhetit.", + "No suggestion: the project has no budget.": "Asnjë sugjerim: projekti nuk ka buxhet.", + "No suggestion: no costs are recorded for this project yet.": "Asnjë sugjerim: ende nuk janë regjistruar kosto për këtë projekt.", + "The report was not saved. Only the project owner can write status reports.": "Raporti nuk u ruajt. Vetëm pronari i projektit mund të shkruajë raporte gjendjeje.", + "No report": "Asnjë raport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Një grup projektesh që drejtohen nga të njëjtët njerëz, si një departament ose një program. Drejtuesit e tij lexojnë çdo projekt në të.", + "The name of the portfolio": "Emri i portofolit", + "What the portfolio holds and who runs it": "Çfarë përmban portofoli dhe kush e drejton", + "A colour for the portfolio's section in project lists": "Një ngjyrë për seksionin e portofolit në listat e projekteve", + "Managers": "Drejtues", + "Nextcloud user UIDs of the people who run the portfolio": "ID-të e përdoruesve Nextcloud të njerëzve që drejtojnë portofolin", + "Order": "Renditja", + "Where the portfolio comes in project lists, lowest first": "Vendi i portofolit në listat e projekteve, më i ulëti i pari", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Shkalla e vet e rrezikut e këtij portofoli si JSON, në të njëjtën formë si ajo e gjithë aplikacionit. Bosh do të thotë shkalla e aplikacionit.", + "Portfolio readers": "Lexuesit e portofolit", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID-të e përdoruesve Nextcloud të drejtuesve të portofolit të projektit", + "The portfolio this project belongs to": "Portofoli të cilit i përket ky projekt", + "No portfolio": "Pa portofol", + "All portfolios": "Të gjithë portofolet", + "You read this project as a manager of its portfolio. Only its members change it.": "E lexoni këtë projekt si drejtues i portofolit të tij. Vetëm anëtarët e tij e ndryshojnë.", + "Portfolios": "Portofole", + "Portfolio status": "Gjendja e portofolit", + "No portfolios yet": "Ende nuk ka portofole", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Një administrator shton portofole te Projektet, Portofolet. Projektet e një portofoli renditen këtu me gjendjen e tyre.", + "Roll-up": "Përmbledhje", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} sipas planit, {atRisk} në rrezik, {offTrack} jashtë planit, {noReport} pa raport", + "No project in this portfolio that you can read.": "Asnjë projekt në këtë portofol që mund ta lexoni.", + "Start": "Fillimi", + "End": "Fundi", + "Budget": "Buxheti", + "Last report": "Raporti i fundit", + "Out of date": "I vjetruar", + "Portfolio timeline": "Afati kohor i portofolit", + "Zoom": "Zmadhimi", + "Could not load the timeline": "Afati kohor nuk u ngarkua dot", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Një administrator shton portofole te Projektet, Portofolet. Projektet e një portofoli shfaqen këtu në një afat kohor të vetëm.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Hapni një projekt për të parë fazat dhe detyrat e tij. Afati kohor është vetëm për lexim.", + "Phase: {title}": "Faza: {title}", + "Left out because you cannot read them: {count} projects": "Lënë jashtë sepse nuk mund t'i lexoni: {count} projekte", + "Week": "Java", + "Day": "Dita", + "Month": "Muaji", + "Please try again later.": "Provoni përsëri më vonë.", + "Status reports": "Raportet e gjendjes", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Pas sa ditësh raporti i fundit i gjendjes së një projekti shënohet si i vjetruar në pasqyrën e portofolit", + "Reporting period (days)": "Periudha e raportimit (ditë)", + "The reporting period is a whole number of days from 1 to 365.": "Periudha e raportimit është një numër i plotë ditësh nga 1 deri në 365.", + "Reporting period saved": "Periudha e raportimit u ruajt", + "The reporting period was not saved. Please try again.": "Periudha e raportimit nuk u ruajt. Provoni përsëri.", + "Every project of a portfolio with its status per aspect, rolled up.": "Çdo projekt i një portofoli me gjendjen sipas aspekteve, i përmbledhur.", + "The projects of a portfolio on one timeline.": "Projektet e një portofoli në një afat kohor të vetëm.", + "Phases": "Fazat", + "Add phase": "Shto fazë", + "No phases yet": "Ende nuk ka faza", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Ndajeni projektin në faza, si nisja, përcaktimi dhe realizimi. Një fazë mbyllet sapo ngarkohet dokumenti i saj përmbyllës.", + "{hours} hours": "{hours} orë", + "Concluding document: {title}": "Dokumenti përmbyllës: {title}", + "Concluding document missing": "Mungon dokumenti përmbyllës", + "Move {title} up": "Zhvendos {title} lart", + "Move {title} down": "Zhvendos {title} poshtë", + "Close phase": "Mbyll fazën", + "Phase": "Faza", + "Files": "Skedarët", + "Notes": "Shënimet", + "Audit trail": "Gjurma e auditimit", + "Edit phase": "Ndrysho fazën", + "Name": "Emri", + "Budget hours": "Orët e buxhetuara", + "Could not save the phase. Please try again.": "Faza nuk u ruajt dot. Provoni përsëri.", + "Close phase {title}": "Mbyll fazën {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Një fazë mbyllet me dokumentin e saj përmbyllës: ngarkojeni këtu ose zgjidhni një nga skedarët e fazës.", + "Concluding document": "Dokumenti përmbyllës", + "This phase has no files yet.": "Kjo fazë nuk ka ende skedarë.", + "Upload a document": "Ngarko një dokument", + "The document was not uploaded. Please try again.": "Dokumenti nuk u ngarkua. Provoni përsëri.", + "Upload the concluding document before you close this phase.": "Ngarkoni dokumentin përmbyllës para se ta mbyllni këtë fazë.", + "This phase cannot be closed from its current status.": "Kjo fazë nuk mund të mbyllet nga gjendja e saj aktuale.", + "The phase was not closed. Please try again.": "Faza nuk u mbyll. Provoni përsëri.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID-ja e skedarit në këtë fazë që e përmbyll. Faza mund të përfundojë vetëm kur është vendosur dhe skedari është bashkëngjitur.", + "Import from Microsoft Project": "Importo nga Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Zgjidhni një plan të ruajtur nga Microsoft Project në formatin XML. Asgjë nuk importohet derisa të konfirmoni.", + "Plan file": "Skedari i planit", + "What the import creates": "Çfarë krijon importi", + "Tasks": "Detyra", + "Sub-tasks": "Nëndetyra", + "Milestones": "Pika kyçe", + "Links": "Lidhje", + "Already imported, updated in place: {count}": "Të importuara tashmë, të përditësuara në vend: {count}", + "What does not carry over": "Çfarë nuk barten", + "Tasks with resources, which are not imported: {count}": "Detyra me burime, të cilat nuk importohen: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Detyra më thellë se niveli 3, të vendosura nën detyrën e tyre të nivelit 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Lidhje të ndryshme nga fund-fillim, të importuara si lidhje të ngjashme: {count}", + "Link lags, which are dropped: {count}": "Vonesa të lidhjeve, që hiqen: {count}", + "Links to a summary task, which are not imported: {count}": "Lidhje me një detyrë përmbledhëse, që nuk importohen: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Lidhje me detyra jashtë këtij plani, që nuk importohen: {count}", + "No longer in the plan": "Nuk është më në plan", + "These stay in the project; remove them yourself if they are no longer needed.": "Këto mbeten në projekt; hiqini vetë nëse nuk nevojiten më.", + "Import": "Importo", + "Close": "Mbyll", + "The plan is imported: {created} created, {updated} updated.": "Plani u importua: {created} u krijuan, {updated} u përditësuan.", + "Links that would close a loop were left out: {count}": "Lidhjet që do të mbyllnin një lak u lanë jashtë: {count}", + "The import stopped part-way. Run it again to finish it.": "Importi ndaloi në gjysmë. Ekzekutojeni përsëri për ta përfunduar.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Ruajeni planin në Microsoft Project me Skedar, Ruaj si, formati XML, dhe importoni atë skedar.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ky skedar deklaron një DOCTYPE ose entitete, të cilat nuk pranohen.", + "The file is larger than 10 MB.": "Skedari është më i madh se 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plani ka më shumë se 2.000 detyra, më shumë se sa merr një import.", + "This file is not a Microsoft Project plan in XML format.": "Ky skedar nuk është plan i Microsoft Project në formatin XML.", + "Choose a file to import.": "Zgjidhni një skedar për ta importuar.", + "Only the project owner can import a plan.": "Vetëm pronari i projektit mund të importojë një plan.", + "The plan could not be read. Please try again.": "Plani nuk mund të lexohej. Provoni përsëri.", + "Linked case: {title}": "Çështja e lidhur: {title}", + "Linked to a case": "E lidhur me një çështje", + "Hand over to case": "Dorëzoje te çështja", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopjon pa ndryshime çdo skedar të projektit dhe detyrave të tij, dhe një skedar që përshkruan projektin, te çështja e lidhur.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Skedarë të kopjuar: {count}", + "Files that failed: {names}": "Skedarë që dështuan: {names}", + "The handover failed. Please try again.": "Dorëzimi dështoi. Provoni përsëri.", + "The linked case could not be found, or you cannot open it.": "Çështja e lidhur nuk u gjet, ose nuk mund ta hapni.", + "Case handovers": "Dorëzime te çështja", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Çdo dorëzim i skedarëve dhe meta të dhënave të projektit te çështja e tij: kur, nga kush, te cila çështje, çdo skedar i kopjuar me SHA-256 e tij dhe skedarët që dështuan.", + "Finance": "Financat", + "Add cost line": "Shto një rresht kostoje", + "Delivery terms": "Kushtet e dorëzimit", + "Billing model": "Modeli i faturimit", + "Budget in euro": "Buxheti në euro", + "Budget in hours": "Buxheti në orë", + "Hourly rate in euro": "Tarifa për orë në euro", + "Planned start": "Fillimi i planifikuar", + "Planned end": "Mbarimi i planifikuar", + "Planned dates": "Datat e planifikuara", + "Budget {amount}": "Buxheti {amount}", + "No budget agreed": "Nuk është rënë dakord për buxhet", + "Hours": "Orë", + "Only the project owner and the portfolio managers see the amounts.": "Shumat i shohin vetëm pronari i projektit dhe menaxherët e portofolit.", + "Budget against cost per category": "Buxheti kundrejt kostove sipas kategorisë", + "Labour (booked time)": "Punë (kohë e regjistruar)", + "No category": "Pa kategori", + "Hours are not available": "Orët nuk janë të disponueshme", + "Not yet assigned to a category": "Ende pa u caktuar në një kategori", + "Total": "Gjithsej", + "{spent} spent, {remaining} remaining": "{spent} të shpenzuara, {remaining} të mbetura", + "Budget against cost per phase": "Buxheti kundrejt kostove sipas fazës", + "No phase": "Pa fazë", + "Cost lines": "Rreshtat e kostos", + "From the finance system": "Nga sistemi financiar", + "Edit cost line {amount}": "Ndrysho rreshtin e kostos {amount}", + "No cost lines yet": "Ende nuk ka rreshta kostoje", + "Commitments": "Angazhime", + "Actual cost": "Kosto reale", + "Forecast": "Parashikim", + "Remaining": "Mbetet", + "Not planned yet": "Ende i paplanifikuar", + "{start} to {end}": "{start} deri më {end}", + "The terms were not saved. Please try again.": "Kushtet nuk u ruajtën. Provo sërish.", + "Terms saved": "Kushtet u ruajtën", + "Fixed price": "Çmim fiks", + "Hourly": "Me orë", + "Not billed": "Pa faturim", + "Commitment": "Angazhim", + "Edit cost line": "Ndrysho rreshtin e kostos", + "Kind": "Lloji", + "Amount in euro": "Shuma në euro", + "Remove": "Hiq", + "Could not save the cost line. Only the project owner changes the money of a project.": "Rreshti i kostos nuk u ruajt dot. Vetëm pronari i projektit ndryshon paratë e një projekti.", + "Could not remove the cost line. Please try again.": "Rreshti i kostos nuk u hoq dot. Provo sërish.", + "{amount} over budget": "{amount} mbi buxhetin", + "Cost categories": "Kategoritë e kostos", + "The categories every project splits its budget and costs into, one per line": "Kategoritë në të cilat çdo projekt ndan buxhetin dhe kostot e veta, një për rresht", + "Categories": "Kategoritë", + "Give at least one category, each name once.": "Jep të paktën një kategori, çdo emër një herë.", + "Cost categories saved": "Kategoritë e kostos u ruajtën", + "The cost categories were not saved. Please try again.": "Kategoritë e kostos nuk u ruajtën. Provo sërish.", + "Finance line": "Rresht financiar", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Një shumë parash në një projekt: buxhet, angazhim, kosto reale ose parashikim, në një kategori kostoje dhe sipas dëshirës në një fazë. E fut pronari i projektit ose e dërgon sistemi financiar përmes aplikacionit të integrimit.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekti të cilit i përket shuma. Bosh për një rresht nga sistemi financiar numri i projektit i të cilit nuk përputhet me asnjë projekt.", + "The phase this amount belongs to, if any": "Faza së cilës i përket shuma, nëse ka", + "The cost category, one of the categories the admin set up": "Kategoria e kostos, një nga kategoritë që ka vendosur administratori", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Nëse shuma është buxhet, angazhim, kosto reale apo parashikim", + "Amount": "Shuma", + "The amount in the reporting currency (euro)": "Shuma në monedhën e raportimit (euro)", + "The date the amount was booked or is expected": "Data kur shuma u regjistrua ose pritet", + "What the amount is for": "Për çfarë është shuma", + "Whether a person entered the line or the finance system sent it": "Nëse rreshtin e futi një person apo e dërgoi sistemi financiar", + "Entered by hand": "Futur me dorë", + "Finance line id": "ID e rreshtit financiar", + "The finance system's own id of this line. One imported line per id.": "ID-ja e vetë këtij rreshti në sistemin financiar. Një rresht i importuar për ID.", + "Project number": "Numri i projektit", + "The project number the finance system sent, matched against the project key": "Numri i projektit që dërgoi sistemi financiar, i krahasuar me çelësin e projektit", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portofoli i projektit të rreshtit, i kopjuar nga projekti që totalet e portofolit të kenë nevojë për një filtër", + "Finance readers": "Lexues financiarë", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-të e përdoruesve të Nextcloud që mund ta shohin shumën: pronari i projektit dhe menaxherët e portofolit të tij", + "Project owner": "Pronari i projektit", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID-ja e përdoruesit Nextcloud të pronarit të projektit, i cili mund të ndryshojë dhe heqë rreshtat manualë", + "How the client pays: not billed, a fixed price, or by the hour.": "Si paguan klienti: pa faturim, çmim fiks ose me orë.", + "Portfolio finance": "Financat e portofolit", + "You cannot see the money of any project in this portfolio": "Nuk mund të shohësh paratë e asnjë projekti në këtë portofol", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serveri ktheu rreshta kostoje nga projekte jashtë këtij portofoli, ndaj këto totale mund të jenë të gabuara.", + "Projects left out because you cannot see their money: {count}": "Projekte të lëna jashtë sepse nuk ua sheh paratë: {count}", + "Unmatched finance lines": "Rreshta financiarë të pa përputhur", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Buxheti, angazhimet, kosto reale dhe parashikimi të mbledhura për një portofol.", + "Subprojects": "Nënprojekte", + "{done} of {total}": "{done} nga {total}", + "{done} of {total} tasks done, including subprojects": "{done} nga {total} detyra të kryera, përfshirë nënprojektet", + "Show the subprojects of {title}": "Shfaq nënprojektet e {title}", + "Hide the subprojects of {title}": "Fshih nënprojektet e {title}", + "Part of": "Pjesë e", + "No parent project": "Pa projekt prind", + "A project cannot sit under one of its own subprojects.": "Një projekt nuk mund të qëndrojë nën një nga nënprojektet e veta.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projektet futen njëri brenda tjetrit deri në tre nivele: program, projekt dhe nënprojekt.", + "Parent project": "Projekt prind", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekti nën të cilin qëndron ky projekt, p.sh. një program. Projektet futen njëri brenda tjetrit deri në tre nivele.", + "Yes": "Po", + "No": "Jo", + "{label} (required)": "{label} (i detyrueshëm)", + "{label} is required": "{label} është i detyrueshëm", + "Project field": "Fushë projekti", + "A field an admin adds to every project, such as a policy area or a contract value.": "Një fushë që një administrator shton në çdo projekt, si një fushë politike ose vlera e kontratës.", + "Key": "Çelës", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Emri i qëndrueshëm me të cilin ruhet vlera, në lower camel case. Mbaje kur projektet e përdorin.", + "Label": "Etiketë", + "The name people see next to the field": "Emri që njerëzit shohin pranë fushës", + "What the field holds": "Çfarë mban fusha", + "Text": "Tekst", + "Number": "Numër", + "Choice": "Zgjedhje", + "Person": "Person", + "Yes or no": "Po ose jo", + "Options": "Opsione", + "The choices of a choice field": "Zgjedhjet e një fushe me zgjedhje", + "Required": "I detyrueshëm", + "Whether a project must fill in the field": "Nëse një projekt duhet ta plotësojë fushën", + "Where the field appears, lowest first": "Ku shfaqet fusha, më e vogla e para", + "Applies to": "Vlen për", + "What the field is added to": "Ku shtohet fusha", + "Custom fields": "Fusha të veta", + "The values of the project fields an admin defined, keyed by the field's key.": "Vlerat e fushave të projektit të përcaktuara nga një administrator, sipas çelësit të fushës.", + "Project fields": "Fushat e projektit", + "Related": "Të lidhura", + "Remove link": "Hiq lidhjen", + "Link type": "Lloji i lidhjes", + "Relates to": "Lidhet me", + "Duplicates": "Dublon", + "Project key": "Çelësi i projektit", + "Every task number starts with it, such as VERG-42.": "Çdo numër detyre fillon me të, për shembull VERG-42.", + "This key is already used by another project.": "Ky çelës përdoret tashmë nga një projekt tjetër.", + "Use 2 to 10 letters and digits, starting with a letter.": "Përdorni 2 deri në 10 shkronja dhe shifra, duke filluar me një shkronjë.", + "The key cannot change once tasks carry it.": "Çelësi nuk mund të ndryshojë pasi detyrat e mbajnë.", + "Project saved. The existing tasks get their numbers in the background.": "Projekti u ruajt. Detyrat ekzistuese marrin numrat e tyre në sfond.", + "Next task number": "Numri i detyrës së radhës", + "The number the next task of this project gets in its key. Only the system writes it.": "Numri që detyra e radhës e këtij projekti merr në çelësin e saj. Vetëm sistemi e shkruan.", + "Restore {title}": "Rikthe {title}", + "Restore": "Rikthe", + "Project restored": "Projekti u rikthye", + "Could not restore the project": "Projekti nuk mund të rikthehej", + "Bring this project back to the active list.": "Ktheje këtë projekt në listën e projekteve aktive.", + "Restore project": "Rikthe projektin", + "Request reason": "Arsyeja e kërkesës", + "Why the requester needs this project. Filled in when the project is requested.": "Pse kërkuesit i nevojitet ky projekt. Plotësohet me kërkesën.", + "Reviewed by": "Shqyrtuar nga", + "The user who approved or rejected the request.": "Përdoruesi që e miratoi ose e refuzoi kërkesën.", + "Reviewed at": "Shqyrtuar më", + "When the request was approved or rejected.": "Kur u miratua ose u refuzua kërkesa.", + "Review note": "Shënim i shqyrtimit", + "The reviewer's reason, shown to the requester when a request is not approved.": "Arsyeja e shqyrtuesit, që kërkuesi e sheh kur një kërkesë nuk miratohet.", + "Members of these groups": "Anëtarët e këtyre grupeve", + "Groups that may create projects": "Grupet që mund të krijojnë projekte", + "The group {group} no longer exists. Save to remove it.": "Grupi {group} nuk ekziston më. Ruajeni për ta hequr.", + "Review project request": "Shqyrto kërkesën për projekt", + "Requested by": "Kërkuar nga", + "Why it is needed": "Pse nevojitet", + "Desired start date": "Data e dëshiruar e fillimit", + "Why is it not approved?": "Pse nuk miratohet?", + "Give a reason. The requester sees it.": "Jepni një arsye. Kërkuesi do ta shohë.", + "Approve": "Mirato", + "Reject": "Refuzo", + "Reject request": "Refuzo kërkesën", + "The review was not saved. Try again.": "Shqyrtimi nuk u ruajt. Provoni sërish.", + "This project is waiting for review": "Ky projekt pret shqyrtim", + "This request was not approved": "Kjo kërkesë nuk u miratua", + "Reason: {note}": "Arsyeja: {note}", + "Review request": "Shqyrto kërkesën", + "Request a project": "Kërko një projekt", + "Step {step} of 2": "Hapi {step} nga 2", + "Why is this project needed?": "Pse nevojitet ky projekt?", + "Give a reason. The reviewer reads it.": "Jepni një arsye. Shqyrtuesi do ta lexojë.", + "Back": "Prapa", + "Next": "Përpara", + "Send request": "Dërgo kërkesën", + "The request was not sent. Try again.": "Kërkesa nuk u dërgua. Provoni sërish.", + "Requested": "E kërkuar", + "Not approved": "E pamiratuar", + "Your request was sent": "Kërkesa juaj u dërgua", + "Let everyone else request a project": "Lejo të gjithë të tjerët të kërkojnë një projekt", + "Add a task": "Shto një detyrë", + "Delete task": "Fshi detyrën", + "Edit task": "Ndrysho detyrën", + "Write": "Shkruaj", + "Preview": "Parapamje", + "Markdown works here: headings, lists and links.": "Këtu funksionon Markdown: tituj, lista dhe lidhje.", + "Could not save the task. Please try again.": "Detyra nuk u ruajt dot. Provoni sërish.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Te \"{title}\" është regjistruar kohë, prandaj nuk mund të fshihet. Në vend të kësaj mund ta anuloni: regjistrimet e kohës mbeten.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Të fshihet \"{title}\"? Hiqen edhe lidhjet e saj me detyra të tjera. Kjo nuk mund të zhbëhet.", + "Keep task": "Mbaje detyrën", + "Cancel task": "Anulo detyrën", + "Only the reporter, the project owner or an admin can delete this task.": "Këtë detyrë mund ta fshijë vetëm raportuesi, pronari i projektit ose një administrator.", + "Could not delete the task. Please try again.": "Detyra nuk u fshi dot. Provoni sërish.", + "Could not cancel the task. Please try again.": "Detyra nuk u anulua dot. Provoni sërish.", + "Responsible": "Përgjegjësi", + "Also working on this": "Punojnë gjithashtu për këtë", + "Labels": "Etiketa", + "Could not change the priority. Please try again.": "Përparësia nuk u ndryshua dot. Provoni sërish.", + "Other project members who work on this task alongside the person responsible.": "Anëtarë të tjerë të projektit që punojnë për këtë detyrë bashkë me përgjegjësin.", + "Duplicate": "Dyfisho", + "Could not copy the task. Please try again.": "Detyra nuk u kopjua dot. Provoni sërish.", + "Subtasks": "Nëndetyra", + "{done} of {total} done": "{done} nga {total} të kryera", + "Add a subtask": "Shto një nëndetyrë", + "Checklist": "Listë kontrolli", + "Checklist item actions": "Veprime për elementin e listës", + "Add a checklist item": "Shto një element në listë", + "Subtasks: {estimate} estimated, {logged} logged": "Nëndetyra: {estimate} vlerësuar, {logged} regjistruar", + "Total estimate: {total}": "Vlerësimi total: {total}", + "Part of {title}": "Pjesë e {title}", + "Checklist: {count} done": "Listë kontrolli: {count} të kryera", + "This task has subtasks: {count}.": "Kjo detyrë ka nëndetyra: {count}.", + "Keep subtasks as separate tasks": "Mbaji nëndetyrat si detyra të veçanta", + "Delete subtasks too": "Fshi edhe nëndetyrat", + "Copy of {title}": "Kopje e {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Detyra u kopjua, por jo të gjitha nëndetyrat e saj. Kontrolloni kopjen.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Hapa të vegjël brenda detyrës. Çdo element ka një id, një tekst dhe nëse është kryer.", + "Open work per person and per project.": "Punë e hapur sipas personit dhe projektit.", + "View": "Pamja", + "By person": "Sipas personit", + "By project": "Sipas projektit", + "Hours left": "Orë të mbetura", + "Tasks without an estimate": "Detyra pa vlerësim", + "Due in 14 days": "Afati brenda 14 ditëve", + "Shared": "Të ndara", + "Unassigned": "Pa caktuar", + "{hours} h": "{hours} orë", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Shfaqet puna në projektet që mund të shihni. Orët llogariten për personin përgjegjës; detyrat e ndara llogariten pa orë.", + "No open work in these projects.": "Nuk ka punë të hapur në këto projekte.", + "Open work": "Punë e hapur", + "{count} open tasks": "{count} detyra të hapura", + "Create a project to see capacity here.": "Krijoni një projekt për të parë këtu kapacitetin.", + "My tasks": "Detyrat e mia", + "Show all my tasks": "Shfaq të gjitha detyrat e mia", + "No tasks assigned to you": "Nuk keni detyra të caktuara", + "Browse projects": "Shfleto projektet", + "Later": "Më vonë", + "Due {date}": "Afati {date}", + "Could not change the status. Please try again.": "Statusi nuk mund të ndryshohej. Provoni sërish.", + "Completed today": "Përfunduar sot", + "My open tasks": "Detyrat e mia të hapura", + "My overdue tasks": "Detyrat e mia të vonuara", + "My tasks in progress": "Detyrat e mia në punë", + "Pin to the top": "Fikso në krye", + "Unpin": "Hiq fiksimin", + "Pinned": "Fiksuar", + "Actions for {title}": "Veprime për {title}", + "Could not save your project order. Please try again.": "Renditja e projekteve nuk mund të ruhej. Provoni sërish.", + "No boards yet": "Ende nuk ka tabela", + "Create a project to get a board.": "Krijoni një projekt për të pasur një tabelë.", + "Use the Projects page to create and manage your projects and tasks.": "Përdorni faqen Projektet për të krijuar dhe menaxhuar projektet dhe detyrat tuaja.", + "Go to projects": "Shko te projektet", + "You are not a member of any projects yet.": "Ende nuk jeni anëtar i asnjë projekti.", + "Could not search for users. Please try again.": "Përdoruesit nuk mund të kërkoheshin. Provoni sërish.", + "Project creation is restricted to administrators.": "Projektet mund t'i krijojnë vetëm administratorët.", + "Only the project owner or an administrator can delete this project.": "Këtë projekt mund ta fshijë vetëm pronari i projektit ose një administrator.", + "No projects are available to you yet. Ask an administrator to create one.": "Ende nuk keni projekte në dispozicion. Kërkojini një administratori të krijojë një.", + "Due: {date}": "Afati: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Detyrat me datë fillimi ose afat shfaqen në kronologji. Shtoni data për t'i parë këtu.", + "You do not have access to this project.": "Nuk keni qasje në këtë projekt.", + "Zoom level": "Niveli i zmadhimit", + "Unscheduled": "Të paplanifikuara", + "Start: {date}": "Fillimi: {date}", + "Today": "Sot", + "No scheduled tasks": "Nuk ka detyra të planifikuara", + "An unexpected error occurred.": "Ndodhi një gabim i papritur.", + "Column {number} name": "Emri i kolonës {number}", + "Failed to save creation policy": "Rregulli i krijimit nuk mund të ruhej", + "All authenticated users": "Të gjithë përdoruesit e identifikuar", + "Control who may create new projects": "Përcaktoni kush mund të krijojë projekte të reja", + "Administrators only": "Vetëm administratorët", + "Project creation": "Krijimi i projekteve", + "Allow project creation": "Lejo krijimin e projekteve", + "Creation policy saved successfully": "Rregulli i krijimit u ruajt", + "Initializing…": "Po niset…", + "e.g. 2h 30m, 90m, 1.5h": "p.sh. 2h 30m, 90m, 1.5h", + "Log time": "Regjistro kohë", + "Save estimate": "Ruaj vlerësimin", + "Logged: {logged}": "Regjistruar: {logged}", + "over by {amount}": "tejkaluar me {amount}", + "Time tracking": "Ndjekja e kohës", + "Estimate": "Vlerësimi", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Vendosni një vlerësim të vlefshëm (p.sh. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Vendosni një kohëzgjatje të vlefshme (p.sh. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Regjistrimi i kohës nuk mund të ruhej. Provoni sërish.", + "Edit time entry": "Ndrysho regjistrimin e kohës", + "Duration": "Kohëzgjatja", + "Date range": "Periudha", + "Last week": "Java e kaluar", + "No time logged": "Nuk ka kohë të regjistruar", + "Log time on a task to see it here.": "Regjistroni kohë në një detyrë për ta parë këtu.", + "To date": "Deri më", + "This week": "Kjo javë", + "Total: {total}": "Gjithsej: {total}", + "From date": "Nga data", + "Custom range": "Periudhë e personalizuar", + "All time": "Gjithë koha", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Një detyrë nuk mund të fshihej, prandaj mund të mbeten të dhëna. Fshijeni sërish projektin.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Një regjistrim kohe nuk mund të fshihej, prandaj mund të mbeten të dhëna. Fshijeni sërish projektin.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Një kolonë nuk mund të fshihej, prandaj mund të mbeten të dhëna. Fshijeni sërish projektin.", + "Could not delete the project. Please try again.": "Projekti nuk mund të fshihej. Provoni sërish.", + "Notification settings": "Cilësimet e njoftimeve", + "Configure when due-date reminders are sent": "Përcaktoni kur dërgohen kujtesat për afatet", + "Due-date reminder lead time (hours)": "Koha e kujtesës para afatit (orë)", + "Lead time must be between 1 and 336 hours": "Koha duhet të jetë nga 1 deri në 336 orë", + "Reminder lead time saved successfully": "Koha e kujtesës u ruajt", + "Failed to save reminder lead time": "Koha e kujtesës nuk mund të ruhej", + "Notifications": "Njoftime", + "Notify me 1 day before a task's due date": "Më njofto 1 ditë para afatit të një detyre", + "Draft": "Draft", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Nëse ora është draft që e sheh vetëm mësuesi i saj, zhvillohet apo është anuluar.", + "New release": "Version i ri", + "Roadmap chart. The same releases and epics are listed below.": "Grafiku i udhërrëfyesit. Të njëjtat versione dhe epika renditen më poshtë.", + "Nothing on the roadmap yet": "Ende asgjë në udhërrëfyes", + "Releases with a target date and epics with dated tasks appear here.": "Këtu shfaqen versionet me datë synimi dhe epikat me detyra me datë.", + "Releases": "Versione", + "No releases yet": "Ende pa versione", + "Target date: {date}": "Data e synuar: {date}", + "No target date": "Pa datë synimi", + "Edit {name}": "Ndrysho {name}", + "Mark {name} as released": "Shëno {name} si të publikuar", + "Mark as released": "Shëno si të publikuar", + "Epics": "Epika", + "No epics yet. Open a task to make it an epic.": "Ende pa epika. Hapni një detyrë për ta bërë epik.", + "Not scheduled yet": "Ende e paplanifikuar", + "Planned": "E planifikuar", + "Released": "E publikuar", + "Edit release": "Ndrysho versionin", + "Target date": "Data e synuar", + "Could not save the release. Please try again.": "Versioni nuk mund të ruhej. Provoni përsëri.", + "Every task of this release is done or cancelled.": "Çdo detyrë e këtij versioni është kryer ose anuluar.", + "Not finished yet: {count}": "Ende të papërfunduara: {count}", + "What happens to these tasks?": "Çfarë ndodh me këto detyra?", + "Move to {name}": "Zhvendos te {name}", + "Remove the release": "Hiq versionin", + "Keep it on {name}": "Lëri te {name}", + "Could not mark the release as released. Please try again.": "Versioni nuk mund të shënohej si i publikuar. Provoni përsëri.", + "Roadmap": "Udhërrëfyes", + "Tasks or roadmap": "Detyra ose udhërrëfyes", + "Release": "Version", + "Epic": "Epik", + "This task is an epic": "Kjo detyrë është epik", + "A named, dated delivery of a project that its tasks are planned against.": "Një dorëzim me emër dhe datë i një projekti, kundrejt të cilit planifikohen detyrat e tij.", + "Name of the release": "Emri i versionit", + "The project this release belongs to": "Projekti të cilit i përket ky version", + "What this release delivers": "Çfarë dorëzon ky version", + "When work on the release starts": "Kur fillon puna për versionin", + "The date the release is due": "Data kur versioni duhet të jetë gati", + "Whether the release is planned, released or archived": "Nëse versioni është i planifikuar, i publikuar apo i arkivuar", + "Released on": "Publikuar më", + "When the release was marked as released": "Kur versioni u shënua si i publikuar", + "The release this task is planned for": "Versioni për të cilin është planifikuar kjo detyrë", + "Board view options": "Opsionet e pamjes së tabelës", + "Colour cards": "Ngjyros kartat", + "No colour": "Pa ngjyrë", + "By label": "Sipas etiketës", + "Swimlanes": "Korsi", + "No swimlanes": "Pa korsi", + "By assignee": "Sipas të caktuarit", + "By epic": "Sipas epikës", + "No assignee": "Pa caktuar", + "No epic": "Pa epikë", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartat mbeten në rreshtin e epikës së tyre. Ndryshoni epikën në faqen e detyrës.", + "Hand over to": "Dorëzoja", + "Could not save your board view. It applies until you reload.": "Pamja e tabelës nuk u ruajt. Vlen derisa të ringarkoni faqen.", + "Timetable wish": "Dëshirë për orarin", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Një dëshirë që gjeneratori e merr parasysh. Një dëshirë të fortë e mban gjithmonë, një të butë aty ku mundet.", + "Whether the wish is about a teacher, a group, a room or one activity": "Nëse dëshira ka të bëjë me një mësues, grup, sallë apo një aktivitet", + "Teacher": "Mësues", + "Group": "Grup", + "Reference": "Referencë", + "The user, group, room or activity the wish is about": "Përdoruesi, grupi, salla ose aktiviteti që ka të bëjë dëshira", + "What the wish asks for": "Çfarë kërkon dëshira", + "Not on these periods": "Jo në këto orë", + "Preferably not on these periods": "Më mirë jo në këto orë", + "At most a number of lessons a day": "Më së shumti një numër orësh në ditë", + "No free periods between lessons": "Pa boshllëqe mes orëve", + "Always the same room": "Gjithmonë e njëjta sallë", + "Periods": "Orët", + "The periods of the week the wish is about, such as wed-5": "Orët e javës që ka të bëjë dëshira, p.sh. wed-5", + "Limit": "Kufi", + "The most lessons a day, for a wish of that kind": "Më së shumti orë në ditë, për një dëshirë të atij lloji", + "Strength": "Forca", + "Whether the generator must keep the wish or should keep it": "Nëse gjeneratori duhet ose do të duhej ta mbajë dëshirën", + "Hard": "E fortë", + "Soft": "E butë", + "Weight": "Pesha", + "How much a soft wish counts, from 1 to 3": "Sa vlen një dëshirë e butë, nga 1 deri në 3", + "Why the wish exists": "Pse ekziston dëshira", + "Timetable scenario": "Skenar orari", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Një model jave, i bërë nga gjeneratori ose i marrë nga orari aktual. Ruan të dhënat hyrëse dhe sa mirë i mban dëshirat.", + "The name timetablers know the scenario by": "Emri me të cilin hartuesit e orarit e njohin skenarin", + "Whether the generator made it or it came from the current timetable": "Nëse e bëri gjeneratori apo vjen nga orari aktual", + "Generated": "I gjeneruar", + "From the current timetable": "Nga orari aktual", + "Week of": "Java e", + "The Monday of the first week of the window": "E hëna e javës së parë të periudhës", + "Window start": "Fillimi i periudhës", + "The first day the week pattern applies to": "Dita e parë për të cilën vlen modeli i javës", + "Window end": "Fundi i periudhës", + "The last day the week pattern applies to": "Dita e fundit për të cilën vlen modeli i javës", + "Waiting, generating, done, failed, or published as draft lessons": "Në pritje, po gjenerohet, gati, dështoi ose u publikua si orë draft", + "Waiting": "Në pritje", + "Generating": "Po gjenerohet", + "Failed": "Dështoi", + "Published": "U publikua", + "Seed": "Farë", + "The number the generator starts from, so a run can be repeated": "Numri nga i cili nis gjeneratori, që një ekzekutim të mund të përsëritet", + "Input": "Të dhëna hyrëse", + "The periods, rooms, lessons and wishes the scenario was made from": "Orët, sallat, mësimet dhe dëshirat nga të cilat u bë skenari", + "Placements": "Vendosjet", + "Each lesson with the period and room it was given": "Çdo mësim me orën dhe sallën që mori", + "Unplaced lessons": "Mësime të pavendosura", + "Lessons without a place, each with the hard wish that blocked it": "Mësime pa vend, secili me dëshirën e fortë që e ndaloi", + "Broken wishes": "Dëshira të shkelura", + "The wishes this scenario breaks, with the lessons that break them": "Dëshirat që shkel ky skenar, me mësimet që i shkelin", + "Measures": "Matje", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Mësime të vendosura, dëshira të shkelura, boshllëqe të mësuesve, orë në ditë dhe përdorim i sallave", + "Reason": "Arsyeja", + "Why the run failed": "Pse dështoi ekzekutimi", + "Published at": "Publikuar më", + "When the scenario was written out as draft lessons": "Kur u shkrua skenari si orë draft", + "Edit wish": "Ndrysho dëshirën", + "New wish": "Dëshirë e re", + "Hard: the generator always keeps it": "E detyrueshme: gjeneratori e respekton gjithmonë", + "Soft: the generator keeps it where it can": "E butë: gjeneratori e respekton kur mundet", + "Weight (1 to 3)": "Pesha (nga 1 deri në 3)", + "Most lessons a day": "Së shumti orë mësimi në ditë", + "Period": "Orë", + "{day} period {number}": "{day} ora {number}", + "Teacher (user name)": "Mësues (emri i përdoruesit)", + "Activity (group:subject)": "Aktivitet (grup:lëndë)", + "Say who or what the wish is about.": "Tregoni për kë ose për çfarë është dëshira.", + "Choose at least one period.": "Zgjidhni të paktën një orë.", + "The limit is a whole number of 1 or more.": "Kufiri është numër i plotë 1 ose më shumë.", + "Timetable": "Orari", + "Wishes": "Dëshirat", + "Timetable wishes": "Dëshirat për orarin", + "Generator run": "Ekzekutimi i gjeneratorit", + "Generator progress": "Ecuria e gjeneratorit", + "The run failed: {reason}": "Ekzekutimi dështoi: {reason}", + "{placed} of {lessons} lessons placed": "U vendosën {placed} nga {lessons} orë mësimi", + "Generate again": "Gjenero sërish", + "Generate": "Gjenero", + "Every lesson has a place.": "Çdo orë mësimi ka një vend.", + "Lesson": "Orë mësimi", + "No free period and room": "Nuk ka orë dhe sallë të lirë", + "Broken soft wishes": "Dëshira të buta të shkelura", + "Every soft wish is kept.": "Çdo dëshirë e butë respektohet.", + "Wish": "Dëshirë", + "Lessons": "Orë mësimi", + "Generating: {percent}% of the time budget used": "Po gjenerohet: u përdor {percent}% e kohës", + "Waiting to start": "Në pritje të nisjes", + "Published as draft lessons": "U publikua si orë mësimi në draft", + "Could not read the scenario.": "Skenari nuk u lexua dot.", + "Could not start the run.": "Ekzekutimi nuk u nis dot.", + "Scenarios": "Skenarë", + "Timetable scenarios": "Skenarë orari", + "Scenario": "Skenar", + "Take the current timetable": "Merr orarin aktual", + "Could not take the current timetable.": "Orari aktual nuk u mor dot.", + "Broken hard wishes": "Dëshira të detyrueshme të shkelura", + "Not on a period of the week grid": "Nuk është në një orë të rrjetës javore", + "Compare scenarios": "Krahaso skenarët", + "Scenarios to compare": "Skenarët për krahasim", + "Choose two or three scenarios to compare them.": "Zgjidhni dy ose tre skenarë për t'i krahasuar.", + "Measure": "Masa", + "Best": "Më i miri", + "Lessons that differ": "Orë mësimi që ndryshojnë", + "No lesson differs.": "Asnjë orë mësimi nuk ndryshon.", + "Not placed": "E pavendosur", + "{period} in {room}": "{period} në {room}", + "Lessons placed": "Orë mësimi të vendosura", + "Lessons without a place": "Orë mësimi pa vend", + "Clashes": "Përplasje", + "Hard wishes broken": "Dëshira të detyrueshme të shkelura", + "Soft wishes broken": "Dëshira të buta të shkelura", + "Soft wishes broken, weighted": "Dëshira të buta të shkelura, të peshuara", + "Free periods between lessons, all teachers": "Orë bosh, të gjithë mësuesit", + "Most free periods of one teacher": "Më shumë orë bosh të një mësuesi", + "Most lessons of one group on a day": "Më shumë orë mësimi të një grupi në një ditë", + "Room use": "Përdorimi i sallave", + "Publish as draft lessons": "Publiko si orë draft", + "Draft lessons written: {count}": "Orë draft të shkruara: {count}", + "Could not publish the scenario.": "Skenari nuk u publikua dot.", + "Rules": "Rregulla", + "Rules for {column}": "Rregullat për {column}", + "When a card enters this column": "Kur një kartë hyn në këtë kolonë", + "Action": "Veprim", + "Set the priority": "Cakto përparësinë", + "Assign to": "Caktoja", + "Assign the person who moved the card": "Caktoja personit që lëvizi kartën", + "Remove the assignee": "Hiq të caktuarin", + "Add a label": "Shto një etiketë", + "No longer a project member": "Nuk është më anëtar i projektit", + "This label no longer exists": "Kjo etiketë nuk ekziston më", + "Add rule": "Shto rregull", + "Remove rule": "Hiq rregullin", + "No rules yet. Add one to change a card when it enters this column.": "Ende nuk ka rregulla. Shtoni një për të ndryshuar një kartë kur hyn në këtë kolonë.", + "Could not save the rules. Please try again.": "Rregullat nuk u ruajtën. Provoni përsëri.", + "1 rule runs when a card enters this column": "1 rregull zbatohet kur një kartë hyn në këtë kolonë", + "{count} rules run when a card enters this column": "{count} rregulla zbatohen kur një kartë hyn në këtë kolonë", + "Rules applied: {changes}": "Rregulla të zbatuara: {changes}", + "assigned to {name}": "caktuar te {name}", + "assignee removed": "i caktuari u hoq", + "priority {priority}": "përparësi {priority}", + "label {label}": "etiketë {label}", + "What happens to a card when it enters this column, applied in list order.": "Çfarë ndodh me një kartë kur hyn në këtë kolonë, sipas renditjes së listës.", + "Value": "Vlera", + "What the rule does to the card.": "Çfarë i bën rregulli kartës.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Përparësia, id-ja e përdoruesit ose id-ja e etiketës që përdor veprimi; bosh për veprimet pa vlerë.", + "is not": "nuk është", + "{dimension} is not": "{dimension} nuk është", + "Saved filters": "Filtra të ruajtur", + "No saved filters yet": "Ende nuk ka filtra të ruajtur", + "Save filter": "Ruaje filtrin", + "Rename \"{name}\"": "Riemërto \"{name}\"", + "Delete \"{name}\"": "Fshi \"{name}\"", + "Clear filters": "Pastro filtrat", + "Showing {shown} of {total} tasks": "Po shfaqen {shown} nga {total} detyra", + "Me": "Unë", + "No date": "Pa datë", + "Rename saved filter": "Riemërto filtrin e ruajtur", + "Share with the project": "Ndaje me projektin", + "Give the filter a name": "Jepini filtrit një emër", + "Could not save the filter. Please try again.": "Filtri nuk u ruajt. Provoni përsëri.", + "Some labels in \"{name}\" no longer exist and were left out.": "Disa etiketa në \"{name}\" nuk ekzistojnë më dhe u lanë jashtë.", + "Could not delete the filter. Please try again.": "Filtri nuk u fshi. Provoni përsëri.", + "Saved filter": "Filtër i ruajtur", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Një filtër tabele me emër i një projekti, privat për personin që e ruajti, përveç nëse ndahet me projektin.", + "The project whose board the filter applies to": "Projekti në tabelën e të cilit zbatohet filtri", + "The name the filter is listed under": "Emri me të cilin shfaqet filtri në listë", + "Saved by": "Ruajtur nga", + "Nextcloud user id of the person who saved the filter": "Id-ja e përdoruesit Nextcloud e personit që ruajti filtrin", + "Shared with the project": "I ndarë me projektin", + "Whether every project member sees and applies the filter": "Nëse çdo anëtar i projektit e sheh dhe mund ta zbatojë filtrin", + "Criteria": "Kritere", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtri: i caktuari, etiketa, përparësia dhe afati, secili me është ose nuk është dhe vlerat e tij", + "Cross-project view": "Pamje ndërprojektuese", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Një përzgjedhje e ruajtur projektesh, detyrat e të cilave shfaqen së bashku në kolona sipas gjendjes, e ndarë me njerëzit që përmend.", + "Shared with": "E ndarë me", + "The name the view is listed under": "Emri me të cilin renditet pamja", + "Nextcloud user id of the person who saved the view": "ID-ja e përdoruesit Nextcloud e personit që e ruajti pamjen", + "Nextcloud user ids of the people the view is shared with": "ID-të e përdoruesve Nextcloud të njerëzve me të cilët ndahet pamja", + "The projects whose tasks the view shows, at most twenty": "Projektet, detyrat e të cilëve i shfaq pamja, jo më shumë se njëzet", + "1 project in this view is hidden from you.": "1 projekt në këtë pamje është i fshehur për ju.", + "{count} projects in this view are hidden from you.": "{count} projekte në këtë pamje janë të fshehura për ju.", + "{project} has no column for {status}.": "{project} nuk ka kolonë për {status}.", + "This view does not exist or is not shared with you.": "Kjo pamje nuk ekziston ose nuk është ndarë me ju.", + "\"{task}\" moved to {status}.": "\"{task}\" u zhvendos te {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Pamje ndërprojektuese", + "New view": "Pamje e re", + "Edit view": "Ndrysho pamjen", + "Delete view": "Fshi pamjen", + "Give the view a name": "Jepi një emër pamjes", + "Pick at least one project": "Zgjidh të paktën një projekt", + "A view shows at most {max} projects": "Një pamje shfaq jo më shumë se {max} projekte", + "Could not save the view. Please try again.": "Pamja nuk u ruajt dot. Provo përsëri.", + "Could not delete the view. Please try again.": "Pamja nuk u fshi dot. Provo përsëri.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Të fshihet \"{title}\"? Projektet dhe detyrat e tyre mbeten siç janë.", + "People see the tasks of the projects they are in, never more.": "Secili sheh vetëm detyrat e projekteve ku bën pjesë.", + "No views yet. A view shows the tasks of several of your projects together.": "Ende nuk ka pamje. Një pamje shfaq së bashku detyrat e disa projekteve të tua.", + "Projects in view: {count}": "Projekte në pamje: {count}", + "Notify me when a task is assigned to me": "Më njofto kur më caktohet një detyrë", + "Also send these to me by email": "Ma dërgo edhe me email", + "Add an email address in your Nextcloud personal settings to get mail.": "Shto një adresë email-i te cilësimet personale të Nextcloud për të marrë email.", + "Code link": "Lidhje kodi", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Një commit, degë, kërkesë për bashkim ose problem në një platformë kodi që lidhet me një detyrë.", + "The task the link belongs to": "Detyra së cilës i përket lidhja", + "The project of the task": "Projekti i detyrës", + "Task key": "Çelësi i detyrës", + "The task key the forge text named, such as VC-12": "Çelësi i detyrës që përmendi teksti i platformës, p.sh. VC-12", + "What the link points at": "Ku tregon lidhja", + "Link": "Lidhje", + "The address of the item in the forge": "Adresa e elementit në platformën e kodit", + "The commit message, branch name or merge request title": "Mesazhi i commit-it, emri i degës ose titulli i kërkesës për bashkim", + "Repository": "Depo", + "The repository, such as acme/portal": "Depoja, p.sh. acme/portal", + "Forge id": "Id në platformë", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Id-ja e vetë elementit në platformën e kodit, p.sh. github:acme/portal#42 ose një hash commit-i", + "State": "Gjendja", + "The state of a merge request or issue": "Gjendja e një kërkese për bashkim ose problemi", + "Who made the commit or opened the merge request": "Kush e bëri commit-in ose hapi kërkesën për bashkim", + "When the commit was made or the merge request last changed": "Kur u bë commit-i ose ndryshoi për herë të fundit kërkesa për bashkim", + "Added by": "Shtuar nga", + "Whether a person added the link or the integration wrote it": "Nëse lidhjen e shtoi një person apo e shkroi integrimi", + "Nextcloud user UIDs of project members": "ID-të e përdoruesve Nextcloud të anëtarëve të projektit", + "Add link": "Shto lidhje", + "Added by hand": "Shtuar me dorë", + "Branch": "Degë", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Nga integrimi", + "Link to a commit, branch or merge request": "Lidhje me një commit, degë ose kërkesë për bashkim", + "Merge request": "Kërkesë për bashkim", + "Merged": "E bashkuar", + "No code linked yet. Name {key} in a commit message or paste a link.": "Ende nuk ka kod të lidhur. Përmendni {key} në një mesazh commit-i ose ngjitni një lidhje.", + "No code linked yet. Paste a link to a commit or merge request.": "Ende nuk ka kod të lidhur. Ngjitni një lidhje me një commit ose kërkesë për bashkim.", + "Paste a web address that starts with https://.": "Ngjitni një adresë web që fillon me https://.", + "Remove link {title}": "Hiq lidhjen {title}", + "The link could not be added.": "Lidhja nuk mund të shtohej.", + "The link could not be removed.": "Lidhja nuk mund të hiqej.", + "This link is already on the task.": "Kjo lidhje është tashmë te detyra.", + "Code forges": "Platforma kodi", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Lidhni commit-et dhe pull request-et e GitHub me detyrat. Integriq merr ngjarjet; planninq nuk thërret kurrë GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Shkarkoni konfigurimin dhe importojeni në Integriq. Pastaj plotësoni një sekret te rregulli \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Në GitHub, shtoni te depoja një webhook me këtë adresë dhe të njëjtin sekret. Zgjidhni llojin e përmbajtjes application/json dhe ngjarjet push dhe pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Përmendni çelësin e detyrës, p.sh. VC-12, në një mesazh commit-i, emër dege ose titull pull request-i. Lidhja shfaqet atëherë te ajo detyrë.", + "Without Integriq, project members can still paste a link on the task page.": "Pa Integriq, anëtarët e projektit mund të ngjitin ende një lidhje në faqen e detyrës.", + "Download the Integriq configuration": "Shkarko konfigurimin e Integriq", + "Calendar": "Kalendari", + "Previous": "I mëparshmi", + "Calendar view": "Pamja e kalendarit", + "Starts:": "Fillon:", + "No tasks with a date in this month.": "Nuk ka detyra me datë këtë muaj.", + "Week of {start} to {end}": "Java nga {start} deri më {end}", + "My calendar": "Kalendari im", + "Show as list": "Shfaq si listë", + "Show as calendar": "Shfaq si kalendar", + "Open my calendar": "Hap kalendarin tim", + "Nextcloud Tasks": "Detyrat e Nextcloud", + "Show my tasks in Nextcloud Tasks": "Shfaq detyrat e mia te Detyrat e Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Detyrat që ju janë caktuar ose ndarë me ju shfaqen në një listë \"Planninq\" te Detyrat dhe Kalendari i Nextcloud. Ndryshimet e bëra atje zëvendësohen nga ndryshimi i radhës në Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ky server nuk mund të shkruajë te Detyrat e Nextcloud, ndaj eksporti nuk është i disponueshëm.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Menaxhohet nga Planninq. Ndryshimet e bëra këtu zëvendësohen nga ndryshimi i radhës në Planninq.", + "Working days and holidays": "Ditët e punës dhe festat", + "Dates set on the timeline skip the days that are not working days.": "Datat e vendosura në kronologji kapërcejnë ditët që nuk janë ditë pune.", + "Working weekdays": "Ditët e punës së javës", + "Non-working days": "Ditë pushimi", + "No non-working days yet.": "Ende nuk ka ditë pushimi.", + "Add day": "Shto ditë", + "Year": "Viti", + "Add Dutch national holidays": "Shto festat kombëtare holandeze", + "Save working days": "Ruaj ditët e punës", + "Choose at least one working weekday.": "Zgjidhni të paktën një ditë pune.", + "Working days saved.": "Ditët e punës u ruajtën.", + "Could not save the working days.": "Ditët e punës nuk u ruajtën dot.", + "New Year's Day": "Viti i Ri", + "Easter Sunday": "E diela e Pashkëve", + "Easter Monday": "E hëna e Pashkëve", + "King's Day": "Dita e Mbretit", + "Liberation Day": "Dita e Çlirimit", + "Ascension Day": "Ngjitja në qiell", + "Whit Sunday": "Rrëshajët", + "Whit Monday": "E hëna e Rrëshajëve", + "Christmas Day": "Krishtlindja", + "Boxing Day": "Dita e dytë e Krishtlindjes", + "Dates of {title}": "Datat e {title}", + "The due date cannot be before the start date.": "Afati nuk mund të jetë para datës së fillimit.", + "{title}, from {start} to {end}": "{title}, nga {start} deri më {end}", + "The dates could not be saved.": "Datat nuk u ruajtën dot.", + "{title} now runs from {start} to {end}": "{title} tani zgjat nga {start} deri më {end}", + "Auto-scheduling": "Planifikim automatik", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kur është aktiv, shtyrja e një afati më vonë në kronologji propozon të zhvendosen edhe detyrat që bllokon.", + "Move blocked tasks along when a task slips": "Zhvendos detyrat e bllokuara kur një detyrë vonohet", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Në kronologji, një afat më i vonë propozon zhvendosjen e detyrave të bllokuara. Numërohen vetëm lidhjet \"bllokon\" dhe detyrat zhvendosen vetëm më vonë.", + "Move the tasks that wait for {title}?": "Të zhvendosen detyrat që presin {title}?", + "These tasks wait for it and would start after its new due date:": "Këto detyra e presin dhe do të fillonin pas afatit të ri:", + "{count} tasks would move; the first {limit} are listed.": "Do të zhvendoseshin {count} detyra; renditen {limit} të parat.", + "Now": "Tani", + "After the move": "Pas zhvendosjes", + "Only this task": "Vetëm këtë detyrë", + "Move all": "Zhvendosi të gjitha", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "U ndal te {title}: datat nuk u ruajtën dot. Detyrat para saj u zhvendosën.", + "Cumulative flow": "Rrjedhë kumulative", + "Show as chart": "Shfaq si grafik", + "Show as table": "Shfaq si tabelë", + "Tasks per column per day": "Detyra për kolonë në ditë", + "Tasks without recorded history in this period: {count}": "Detyra pa histori të regjistruar në këtë periudhë: {count}", + "Lead and cycle time": "Koha e dorëzimit dhe koha e ciklit", + "No tasks were finished in this period.": "Asnjë detyrë nuk u përfundua në këtë periudhë.", + "Finished tasks": "Detyra të përfunduara", + "Cycle time, average": "Koha e ciklit, mesatarja", + "Cycle time, 85th percentile": "Koha e ciklit, përqindëshi i 85-të", + "Lead time, average": "Koha e dorëzimit, mesatarja", + "Tasks whose finish time was estimated from their history: {count}": "Detyra, koha e përfundimit të të cilave u vlerësua nga historia: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Koha e ciklit e çdo detyre të përfunduar, me mesataren dhe përqindëshin e 85-të", + "Slowest tasks": "Detyrat më të ngadalta", + "cycle {cycle}, lead {lead}": "cikli {cycle}, dorëzimi {lead}", + "{days} days": "{days} ditë", + "Could not load the flow of this project.": "Rrjedha e këtij projekti nuk u ngarkua dot.", + "Last {days} days": "{days} ditët e fundit", + "Portfolio flow": "Rrjedha e portofolit", + "An admin adds portfolios under Projects, Portfolios.": "Një administrator shton portofole te Projektet, Portofolet.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekte që nuk shfaqen, sepse shfaqen më së shumti 50 njëherësh: {count}", + "Could not load the flow of this portfolio.": "Rrjedha e këtij portofoli nuk u ngarkua dot.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Rrjedhë kumulative dhe kohë cikli në projektet e një portofoli.", + "Edit report": "Ndrysho raportin", + "Only tasks where": "Vetëm detyrat ku", + "Group by": "Grupo sipas", + "Display": "Shfaqja", + "Share with everyone who can read its projects": "Ndaje me këdo që mund të lexojë projektet e tij", + "The report could not be saved.": "Raporti nuk u ruajt dot.", + "Number of tasks": "Numri i detyrave", + "Bar": "Shtylla", + "Donut": "Unazë", + "Table": "Tabelë", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} nga {total} projekte në këtë raport nuk janë të dukshme për ty", + "No tasks match this report.": "Asnjë detyrë nuk përputhet me këtë raport.", + "None": "Asnjë", + "Could not load this report.": "Ky raport nuk u ngarkua dot.", + "Report": "Raport", + "Your reports": "Raportet e tua", + "My reports": "Raportet e mia", + "Shared reports": "Raporte të ndara", + "You have not built a report yet.": "Nuk ke krijuar ende asnjë raport.", + "Nobody has shared a report with you yet.": "Askush nuk ka ndarë ende një raport me ty.", + "Reports you built over tasks, and the ones shared with you.": "Raportet që ke krijuar për detyrat, dhe ato të ndara me ty.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Një pyetje e ruajtur për detyrat: cilat projekte, cilët filtra, të grupuara sipas çfarë, të numëruara ose të mbledhura, dhe të shfaqura si tabelë ose grafik.", + "The name the report is listed under": "Emri me të cilin raporti shfaqet në listë", + "What the report shows and who it is for": "Çfarë tregon raporti dhe për kë është", + "Nextcloud user id of the person who saved the report": "ID-ja e përdoruesit Nextcloud të personit që ruajti raportin", + "Who can open the report": "Kush mund ta hapë raportin", + "Only me": "Vetëm unë", + "Everyone who can read its projects": "Këdo që mund të lexojë projektet e tij", + "The projects the report covers, at most fifty": "Projektet që mbulon raporti, më së shumti pesëdhjetë", + "Filters": "Filtra", + "Task fields and the value each must equal": "Fushat e detyrës dhe vlera me të cilën duhet të jetë e barabartë secila", + "The task field the report groups on": "Fusha e detyrës sipas së cilës grupon raporti", + "Count the tasks, or add up a number on them": "Numëro detyrat, ose mblidh një numër prej tyre", + "Sum": "Shuma", + "Sum of": "Shuma e", + "The number added up when the measure is a sum": "Numri që mblidhet kur masa është shumë", + "Story points": "Pikë historie", + "Estimated duration": "Kohëzgjatje e vlerësuar", + "How the report is shown": "Si shfaqet raporti", + "Issue type": "Lloji i çështjes", + "Task fields and the value each must equal; empty when the report covers every task": "Fushat e detyrës dhe vlera që duhet të ketë secila; bosh kur raporti përfshin të gjitha detyrat", + "The status a task must have": "Statusi që duhet të ketë një detyrë", + "The priority a task must have": "Përparësia që duhet të ketë një detyrë", + "The user a task must be assigned to": "Përdoruesi të cilit duhet t'i jetë caktuar një detyrë", + "A label a task must carry": "Një etiketë që duhet të mbajë një detyrë", + "The board column a task must be in": "Kolona e tabelës ku duhet të jetë një detyrë", + "The issue type a task must have": "Lloji i çështjes që duhet të ketë një detyrë", + "Manager groups": "Grupet e menaxherëve", + "Member groups": "Grupet e anëtarëve", + "Viewer groups": "Grupet e lexuesve", + "Viewers": "Lexuesit", + "Owning group": "Grupi pronar", + "Nextcloud groups whose members manage the project": "Grupet Nextcloud anëtarët e të cilave menaxhojnë projektin", + "Nextcloud groups whose members work on the project": "Grupet Nextcloud anëtarët e të cilave punojnë në projekt", + "Nextcloud groups whose members may read the project": "Grupet Nextcloud anëtarët e të cilave mund ta lexojnë projektin", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Përdoruesit Nextcloud që menaxhojnë projektin: cilësimet, anëtarët dhe punën", + "Nextcloud user ids who may read the project and its work but not change it": "Përdoruesit Nextcloud që mund të lexojnë projektin dhe punën e tij, por jo ta ndryshojnë", + "The Nextcloud group that owns the project with its creator, at most one": "Grupi Nextcloud që e zotëron projektin bashkë me krijuesin e tij, më së shumti një", + "Nextcloud user ids who may read this through the project": "Përdoruesit Nextcloud që mund ta lexojnë këtë përmes projektit", + "Nextcloud groups whose members may change this through the project": "Grupet Nextcloud anëtarët e të cilave mund ta ndryshojnë këtë përmes projektit", + "Nextcloud groups whose members may read this through the project": "Grupet Nextcloud anëtarët e të cilave mund ta lexojnë këtë përmes projektit", + "Search for a person or a group…": "Kërko një person ose një grup…", + "No one found. Your admin's sharing settings decide who you can find.": "Nuk u gjet askush. Cilësimet e ndarjes të administratorit tuaj vendosin kë mund të gjeni.", + "Type at least two characters": "Shkruani të paktën dy karaktere", + "Everyone in this group": "Të gjithë në këtë grup", + "Could not search for people. Please try again.": "Kërkimi i personave dështoi. Provoni përsëri.", + "Could not remove the group": "Grupi nuk mund të hiqej", + "Only the owner and managers change who is on this project.": "Vetëm pronari dhe menaxherët ndryshojnë se kush është në këtë projekt.", + "Role of {name}": "Roli i {name}", + "Manager": "Menaxher", + "Member": "Anëtar", + "Viewer": "Lexues", + "Could not change the role": "Roli nuk mund të ndryshohej", + "Owned by group: {name}": "Në pronësi të grupit: {name}", + "No group owns this project.": "Asnjë grup nuk e zotëron këtë projekt.", + "Owned by group": "Në pronësi të grupit", + "Search for a group…": "Kërko një grup…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nuk u gjet asnjë grup. Cilësimet e ndarjes së administratorit tuaj vendosin cilat grupe mund të gjeni.", + "No owning group": "Pa grup pronar", + "Could not search for groups. Please try again.": "Grupet nuk mund të kërkoheshin. Provoni përsëri.", + "Could not change the owning group": "Grupi pronar nuk mund të ndryshohej", + "You can read this project. Only its members change it.": "Mund ta lexoni këtë projekt. Vetëm anëtarët e tij e ndryshojnë.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursi që jepet në këtë orë mësimi, për shembull një lëndë me zgjedhje, kur aplikacioni mësimor i shkollës e njeh.", + "Online meeting link": "Lidhja e mësimit në internet", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Ku nxënësit i bashkohen këtij mësimi në internet. Butoni Bashkohu shfaqet vetëm për një lidhje https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sq.json b/l10n/sq.json index b03572f1..edb0f043 100644 --- a/l10n/sq.json +++ b/l10n/sq.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Projekte aktive", + "Archived projects": "Projekte të arkivuara", + "Boards": "Tabela", + "My projects": "Projektet e mia", + "Portfolio": "Portofol", + "Project board": "Tabela e projektit", + "Projects I am in": "Projekte në të cilat marr pjesë", + "Timeline": "Vija kohore", + "Timesheet": "Fletë orësh", + "Features & roadmap": "Veçoritë dhe plani i zhvillimit", + "Flow": "Rrjedhë", + "Flows": "Rrjedha", + "Reports": "Raportet", + "Pick a report to open it.": "Zgjidhni një raport për ta hapur.", + "In progress": "Në vazhdim", + "Date": "Data", + "Due": "Afati", + "Assignee": "Caktuar për", + "Who": "Kush", + "What": "Çfarë", + "Minutes": "Minuta", + "Entries": "Regjistrime", + "Most recent": "Më të fundit", + "Per person": "Për person", + "By status": "Sipas statusit", + "By priority": "Sipas përparësisë", + "Task status": "Statusi i detyrave", + "Time spent": "Koha e shpenzuar", + "Capacity": "Kapaciteti", + "Due soonest": "Skadojnë më parë", + "Minutes logged": "Minuta të regjistruara", + "Nothing is due": "Asgjë nuk skadon", + "Nothing logged yet": "Ende asgjë e regjistruar", + "What is open, what is blocked, and what is overdue.": "Çfarë është e hapur, çfarë është bllokuar dhe çfarë ka vonesë.", + "How allocation is spread across the people working on projects.": "Si shpërndahet ngarkesa mes njerëzve që punojnë në projekte.", + "Hours logged, and the projects they went to.": "Orët e regjistruara dhe projektet ku shkuan.", + "Billable": "I faturueshëm", + "Budget: {amount}": "Buxheti: {amount}", + "Loading projects": "Po ngarkohen projektet", + "No projects for this client yet": "Ende nuk ka projekte për këtë klient", + "Open in Planninq": "Hape në Planninq", + "This project could not be found": "Ky projekt nuk u gjet", + "Untitled project": "Projekt pa titull", + "and {count} more": "dhe {count} të tjera", + "Store": "Dyqani", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Instaloni regjistra, skema dhe rrjedha të publikuara nga organizata të tjera.", + "Work Date": "Data e punës", + "Zaak UUID": "UUID Zaak", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Veprimet e kolonës", + "Columns": "Kolonat", + "Could not remove the column. Please try again.": "Kolona nuk u hoq dot. Provoni përsëri.", + "Could not save the column. Please try again.": "Kolona nuk u ruajt dot. Provoni përsëri.", + "Done column": "Kolona e përfunduarave", + "Edit column": "Ndrysho kolonën", + "Keep the card's status": "Mbaj gjendjen e kartës", + "Move its cards to": "Zhvendos kartat e saj te", + "Move left": "Zhvendos majtas", + "Move right": "Zhvendos djathtas", + "Status of cards moved here": "Gjendja e kartave të zhvendosura këtu", + "The last done column cannot be removed.": "Kolona e fundit e përfunduarave nuk mund të hiqet.", + "WIP limit": "Kufiri WIP", + "over limit": "mbi kufirin", + "The status a card gets when it is moved into this column.": "Gjendja që merr një kartë kur zhvendoset në këtë kolonë.", + "All priorities": "Të gjitha prioritetet", + "Could not create the task. Please try again.": "Detyra nuk u krijua dot. Provoni përsëri.", + "Created": "Krijuar", + "Move to backlog": "Te lista e pritjes", + "Move to board": "Te tabela", + "New task": "Detyrë e re", + "Nothing in the backlog": "Asgjë në listën e pritjes", + "Rank": "Renditja", + "Sort by": "Rendit sipas", + "Sort by rank to reorder": "Rendit sipas renditjes për ta ndryshuar radhën", + "Task actions": "Veprimet e detyrës", + "All labels": "Të gjitha etiketat", + "Filter tasks by label": "Filtro detyrat sipas etiketës", + "View timeline": "Shiko kronologjinë", + "Board": "Tabela", + "List": "Lista", + "Column": "Kolona", + "Board or list": "Tabela ose lista", + "Log": "Regjistri", + "Add entry": "Shto hyrje", + "Show": "Shfaq", + "No actions yet": "Ende nuk ka veprime", + "Closed": "Mbyllur", + "Entry actions": "Veprimet e hyrjes", + "Add action": "Shto veprim", + "by {author}": "nga {author}", + "saved {time}": "ruajtur {time}", + "Attendees: {names}": "Të pranishëm: {names}", + "Add the first entry": "Shto hyrjen e parë", + "Issues": "Çështje", + "Lessons learned": "Mësime të nxjerra", + "Meetings": "Takime", + "Decisions": "Vendime", + "Actions": "Veprime", + "Issue": "Çështje", + "Lesson learned": "Mësim i nxjerrë", + "Meeting": "Takim", + "Decision": "Vendim", + "About this project": "Rreth këtij projekti", + "No description yet": "Ende pa përshkrim", + "Start date": "Data e fillimit", + "Not set": "E pacaktuar", + "End date": "Data e mbarimit", + "Progress": "Ecuria", + "No tasks yet": "Ende nuk ka detyra", + "Open the board": "Hap tabelën", + "People": "Njerëz", + "Owner": "Pronari", + "Latest log entries": "Hyrjet më të fundit", + "Open the log": "Hap regjistrin", + "{done} of {total} tasks done": "{done} nga {total} detyra të kryera", + "Edit entry": "Ndrysho hyrjen", + "Type": "Lloji", + "Attendees": "Të pranishëm", + "Issue is closed": "Çështja është mbyllur", + "Could not save the entry. Please try again.": "Hyrja nuk u ruajt dot. Provoni përsëri.", + "From: {title}": "Nga: {title}", + "What needs to happen": "Çfarë duhet bërë", + "Could not create the action. Please try again.": "Veprimi nuk u krijua dot. Provoni përsëri.", + "The action was created but could not be linked to the entry.": "Veprimi u krijua, por nuk u lidh dot me hyrjen.", + "Project pages": "Faqet e projektit", + "Overview": "Përmbledhje", + "Risks": "Rreziqe", + "Log entry": "Hyrje regjistri", + "A short name for the entry": "Një emër i shkurtër për hyrjen", + "Project": "Projekt", + "The project this entry belongs to": "Projekti të cilit i përket kjo hyrje", + "What kind of entry this is": "Çfarë lloj hyrjeje është", + "When it happened": "Kur ndodhi", + "What happened, in Markdown": "Çfarë ndodhi, në Markdown", + "Whether an issue is still open": "Nëse një çështje është ende e hapur", + "The people at a meeting": "Njerëzit në një takim", + "Tasks that came out of this entry": "Detyrat që dolën nga kjo hyrje", + "Add risk": "Shto rrezik", + "Risk": "Rrezik", + "Score": "Pikët", + "Response": "Përgjigjja", + "Review date": "Data e rishikimit", + "no longer on the project": "nuk është më në projekt", + "Edit {title}": "Ndrysho {title}", + "No risks recorded yet": "Ende nuk ka rreziqe të regjistruara", + "Add the first risk": "Shto rrezikun e parë", + "Medium": "Mesatar", + "Mitigating": "Në zbutje", + "Occurred": "Ndodhi", + "Avoid": "Shmang", + "Reduce": "Ul", + "Transfer": "Transfero", + "Accept": "Prano", + "Highest open risks": "Rreziqet e hapura më të larta", + "No open risks": "Nuk ka rreziqe të hapura", + "Open the risk register": "Hap regjistrin e rreziqeve", + "Edit risk": "Ndrysho rrezikun", + "What could go wrong": "Çfarë mund të shkojë keq", + "Likelihood": "Gjasat", + "Impact": "Ndikimi", + "Score {score}": "Pikët {score}", + "Countermeasures": "Kundërmasat", + "Could not save the risk. Please try again.": "Rreziku nuk u ruajt dot. Provoni përsëri.", + "Risks by likelihood and impact": "Rreziqet sipas gjasave dhe ndikimit", + "Risk scale": "Shkalla e rrezikut", + "The levels every project scores its risks on, and where low turns into medium and high": "Nivelet mbi të cilat çdo projekt pikëzon rreziqet e veta, dhe ku i ulëti kalon në mesatar dhe të lartë", + "Number of levels": "Numri i niveleve", + "Likelihood labels": "Etiketat e gjasave", + "Impact labels": "Etiketat e ndikimit", + "Level {level}": "Niveli {level}", + "Medium from score": "Mesatar nga pikët", + "High from score": "I lartë nga pikët", + "Risk scale saved": "Shkalla e rrezikut u ruajt", + "1 risk uses level {level}. Change it first.": "1 rrezik përdor nivelin {level}. Ndryshojeni më parë.", + "{count} risks use level {level}. Change them first.": "{count} rreziqe përdorin nivelin {level}. Ndryshojini më parë.", + "Every level needs a label, and high must start above medium.": "Çdo nivel ka nevojë për etiketë, dhe i larti duhet të fillojë mbi mesataren.", + "The project this risk belongs to": "Projekti të cilit i përket ky rrezik", + "The cause and the effect, in Markdown": "Shkaku dhe pasoja, në Markdown", + "Category": "Kategoria", + "A free grouping, such as planning, budget or supplier": "Një grupim i lirë, si planifikim, buxhet ose furnizues", + "How likely it is, on the admin's risk scale": "Sa i mundshëm është, në shkallën e rrezikut të administratorit", + "How hard it would hit, on the admin's risk scale": "Sa rëndë do të godiste, në shkallën e rrezikut të administratorit", + "Likelihood times impact, calculated by the server": "Gjasat herë ndikimin, llogaritur nga serveri", + "Where the risk stands": "Ku ndodhet rreziku", + "The person who watches this risk": "Personi që ndjek këtë rrezik", + "How the project answers the risk": "Si i përgjigjet projekti rrezikut", + "What is done to prevent it or soften it, in Markdown": "Çfarë bëhet për ta parandaluar ose zbutur, në Markdown", + "When to look at this risk again": "Kur të rishikohet përsëri ky rrezik", + "Very low": "Shumë i ulët", + "Very high": "Shumë i lartë", + "All projects": "Të gjitha projektet", + "Project status report": "Raport gjendjeje i projektit", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Një raport me datë se si qëndron një projekt për para, organizim, kohë, informacion, cilësi dhe rrezik (aspektet GROTIK), secili me një shënim.", + "The project this report is about": "Projekti për të cilin është raporti", + "Report date": "Data e raportit", + "The day the report describes": "Dita që përshkruan raporti", + "Money": "Para", + "How the project stands on this aspect": "Si qëndron projekti në këtë aspekt", + "On track": "Sipas planit", + "At risk": "Në rrezik", + "Off track": "Jashtë planit", + "Money note": "Shënim për paratë", + "A short explanation of this status": "Një shpjegim i shkurtër i kësaj gjendjeje", + "Organisation": "Organizim", + "Organisation note": "Shënim për organizimin", + "Time": "Kohë", + "Time note": "Shënim për kohën", + "Information": "Informacion", + "Information note": "Shënim për informacionin", + "Quality": "Cilësi", + "Quality note": "Shënim për cilësinë", + "Risk note": "Shënim për rrezikun", + "Overall": "Gjithsej", + "The worst of the six statuses, calculated by the server": "Më e keqja nga gjashtë gjendjet, e llogaritur nga serveri", + "Health: money": "Shëndeti: para", + "Copied from the newest status report": "Kopjuar nga raporti më i ri i gjendjes", + "Health: organisation": "Shëndeti: organizim", + "Health: time": "Shëndeti: kohë", + "Health: information": "Shëndeti: informacion", + "Health: quality": "Shëndeti: cilësi", + "Health: risk": "Shëndeti: rrezik", + "Health: overall": "Shëndeti: gjithsej", + "Health: report date": "Shëndeti: data e raportit", + "The date of the newest status report": "Data e raportit më të ri të gjendjes", + "New report": "Raport i ri", + "Only the project owner writes status reports.": "Vetëm pronari i projektit shkruan raporte gjendjeje.", + "Latest report, {date}": "Raporti i fundit, {date}", + "Aspect": "Aspekt", + "Note": "Shënim", + "Report history": "Historiku i raporteve", + "Author": "Autor", + "No status reports yet": "Ende nuk ka raporte gjendjeje", + "Write the first report": "Shkruaj raportin e parë", + "Choose a status for every aspect to save the report.": "Zgjidhni një gjendje për çdo aspekt për ta ruajtur raportin.", + "Suggested: on track.": "Sugjerim: sipas planit.", + "Suggested: at risk.": "Sugjerim: në rrezik.", + "Suggested: off track.": "Sugjerim: jashtë planit.", + "1 task is past its due date.": "1 detyrë e ka kaluar afatin.", + "{count} tasks are past their due date.": "Detyra që e kanë kaluar afatin: {count}.", + "The end date has passed with 1 open task.": "Data e mbarimit ka kaluar me 1 detyrë të hapur.", + "The end date has passed with {count} open tasks.": "Data e mbarimit ka kaluar, detyra të hapura: {count}.", + "No open task is past its due date.": "Asnjë detyrë e hapur nuk e ka kaluar afatin.", + "The highest open risk, \"{title}\", scores {score}.": "Rreziku më i lartë i hapur, \"{title}\", ka pikë {score}.", + "There are no open risks.": "Nuk ka rreziqe të hapura.", + "Costs are at {percent}% of the budget.": "Kostot janë në {percent}% të buxhetit.", + "No suggestion: the project has no budget.": "Asnjë sugjerim: projekti nuk ka buxhet.", + "No suggestion: no costs are recorded for this project yet.": "Asnjë sugjerim: ende nuk janë regjistruar kosto për këtë projekt.", + "The report was not saved. Only the project owner can write status reports.": "Raporti nuk u ruajt. Vetëm pronari i projektit mund të shkruajë raporte gjendjeje.", + "No report": "Asnjë raport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Një grup projektesh që drejtohen nga të njëjtët njerëz, si një departament ose një program. Drejtuesit e tij lexojnë çdo projekt në të.", + "The name of the portfolio": "Emri i portofolit", + "What the portfolio holds and who runs it": "Çfarë përmban portofoli dhe kush e drejton", + "A colour for the portfolio's section in project lists": "Një ngjyrë për seksionin e portofolit në listat e projekteve", + "Managers": "Drejtues", + "Nextcloud user UIDs of the people who run the portfolio": "ID-të e përdoruesve Nextcloud të njerëzve që drejtojnë portofolin", + "Order": "Renditja", + "Where the portfolio comes in project lists, lowest first": "Vendi i portofolit në listat e projekteve, më i ulëti i pari", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Shkalla e vet e rrezikut e këtij portofoli si JSON, në të njëjtën formë si ajo e gjithë aplikacionit. Bosh do të thotë shkalla e aplikacionit.", + "Portfolio readers": "Lexuesit e portofolit", + "Nextcloud user UIDs of the managers of the project's portfolio": "ID-të e përdoruesve Nextcloud të drejtuesve të portofolit të projektit", + "The portfolio this project belongs to": "Portofoli të cilit i përket ky projekt", + "No portfolio": "Pa portofol", + "All portfolios": "Të gjithë portofolet", + "You read this project as a manager of its portfolio. Only its members change it.": "E lexoni këtë projekt si drejtues i portofolit të tij. Vetëm anëtarët e tij e ndryshojnë.", + "Portfolios": "Portofole", + "Portfolio status": "Gjendja e portofolit", + "No portfolios yet": "Ende nuk ka portofole", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Një administrator shton portofole te Projektet, Portofolet. Projektet e një portofoli renditen këtu me gjendjen e tyre.", + "Roll-up": "Përmbledhje", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} sipas planit, {atRisk} në rrezik, {offTrack} jashtë planit, {noReport} pa raport", + "No project in this portfolio that you can read.": "Asnjë projekt në këtë portofol që mund ta lexoni.", + "Start": "Fillimi", + "End": "Fundi", + "Budget": "Buxheti", + "Last report": "Raporti i fundit", + "Out of date": "I vjetruar", + "Portfolio timeline": "Afati kohor i portofolit", + "Zoom": "Zmadhimi", + "Could not load the timeline": "Afati kohor nuk u ngarkua dot", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Një administrator shton portofole te Projektet, Portofolet. Projektet e një portofoli shfaqen këtu në një afat kohor të vetëm.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Hapni një projekt për të parë fazat dhe detyrat e tij. Afati kohor është vetëm për lexim.", + "Phase: {title}": "Faza: {title}", + "Left out because you cannot read them: {count} projects": "Lënë jashtë sepse nuk mund t'i lexoni: {count} projekte", + "Week": "Java", + "Day": "Dita", + "Month": "Muaji", + "Please try again later.": "Provoni përsëri më vonë.", + "Status reports": "Raportet e gjendjes", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Pas sa ditësh raporti i fundit i gjendjes së një projekti shënohet si i vjetruar në pasqyrën e portofolit", + "Reporting period (days)": "Periudha e raportimit (ditë)", + "The reporting period is a whole number of days from 1 to 365.": "Periudha e raportimit është një numër i plotë ditësh nga 1 deri në 365.", + "Reporting period saved": "Periudha e raportimit u ruajt", + "The reporting period was not saved. Please try again.": "Periudha e raportimit nuk u ruajt. Provoni përsëri.", + "Every project of a portfolio with its status per aspect, rolled up.": "Çdo projekt i një portofoli me gjendjen sipas aspekteve, i përmbledhur.", + "The projects of a portfolio on one timeline.": "Projektet e një portofoli në një afat kohor të vetëm.", + "Phases": "Fazat", + "Add phase": "Shto fazë", + "No phases yet": "Ende nuk ka faza", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Ndajeni projektin në faza, si nisja, përcaktimi dhe realizimi. Një fazë mbyllet sapo ngarkohet dokumenti i saj përmbyllës.", + "{hours} hours": "{hours} orë", + "Concluding document: {title}": "Dokumenti përmbyllës: {title}", + "Concluding document missing": "Mungon dokumenti përmbyllës", + "Move {title} up": "Zhvendos {title} lart", + "Move {title} down": "Zhvendos {title} poshtë", + "Close phase": "Mbyll fazën", + "Phase": "Faza", + "Files": "Skedarët", + "Notes": "Shënimet", + "Audit trail": "Gjurma e auditimit", + "Edit phase": "Ndrysho fazën", + "Name": "Emri", + "Budget hours": "Orët e buxhetuara", + "Could not save the phase. Please try again.": "Faza nuk u ruajt dot. Provoni përsëri.", + "Close phase {title}": "Mbyll fazën {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Një fazë mbyllet me dokumentin e saj përmbyllës: ngarkojeni këtu ose zgjidhni një nga skedarët e fazës.", + "Concluding document": "Dokumenti përmbyllës", + "This phase has no files yet.": "Kjo fazë nuk ka ende skedarë.", + "Upload a document": "Ngarko një dokument", + "The document was not uploaded. Please try again.": "Dokumenti nuk u ngarkua. Provoni përsëri.", + "Upload the concluding document before you close this phase.": "Ngarkoni dokumentin përmbyllës para se ta mbyllni këtë fazë.", + "This phase cannot be closed from its current status.": "Kjo fazë nuk mund të mbyllet nga gjendja e saj aktuale.", + "The phase was not closed. Please try again.": "Faza nuk u mbyll. Provoni përsëri.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID-ja e skedarit në këtë fazë që e përmbyll. Faza mund të përfundojë vetëm kur është vendosur dhe skedari është bashkëngjitur.", + "Import from Microsoft Project": "Importo nga Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Zgjidhni një plan të ruajtur nga Microsoft Project në formatin XML. Asgjë nuk importohet derisa të konfirmoni.", + "Plan file": "Skedari i planit", + "What the import creates": "Çfarë krijon importi", + "Tasks": "Detyra", + "Sub-tasks": "Nëndetyra", + "Milestones": "Pika kyçe", + "Links": "Lidhje", + "Already imported, updated in place: {count}": "Të importuara tashmë, të përditësuara në vend: {count}", + "What does not carry over": "Çfarë nuk barten", + "Tasks with resources, which are not imported: {count}": "Detyra me burime, të cilat nuk importohen: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Detyra më thellë se niveli 3, të vendosura nën detyrën e tyre të nivelit 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Lidhje të ndryshme nga fund-fillim, të importuara si lidhje të ngjashme: {count}", + "Link lags, which are dropped: {count}": "Vonesa të lidhjeve, që hiqen: {count}", + "Links to a summary task, which are not imported: {count}": "Lidhje me një detyrë përmbledhëse, që nuk importohen: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Lidhje me detyra jashtë këtij plani, që nuk importohen: {count}", + "No longer in the plan": "Nuk është më në plan", + "These stay in the project; remove them yourself if they are no longer needed.": "Këto mbeten në projekt; hiqini vetë nëse nuk nevojiten më.", + "Import": "Importo", + "Close": "Mbyll", + "The plan is imported: {created} created, {updated} updated.": "Plani u importua: {created} u krijuan, {updated} u përditësuan.", + "Links that would close a loop were left out: {count}": "Lidhjet që do të mbyllnin një lak u lanë jashtë: {count}", + "The import stopped part-way. Run it again to finish it.": "Importi ndaloi në gjysmë. Ekzekutojeni përsëri për ta përfunduar.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Ruajeni planin në Microsoft Project me Skedar, Ruaj si, formati XML, dhe importoni atë skedar.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ky skedar deklaron një DOCTYPE ose entitete, të cilat nuk pranohen.", + "The file is larger than 10 MB.": "Skedari është më i madh se 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Plani ka më shumë se 2.000 detyra, më shumë se sa merr një import.", + "This file is not a Microsoft Project plan in XML format.": "Ky skedar nuk është plan i Microsoft Project në formatin XML.", + "Choose a file to import.": "Zgjidhni një skedar për ta importuar.", + "Only the project owner can import a plan.": "Vetëm pronari i projektit mund të importojë një plan.", + "The plan could not be read. Please try again.": "Plani nuk mund të lexohej. Provoni përsëri.", + "Linked case: {title}": "Çështja e lidhur: {title}", + "Linked to a case": "E lidhur me një çështje", + "Hand over to case": "Dorëzoje te çështja", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopjon pa ndryshime çdo skedar të projektit dhe detyrave të tij, dhe një skedar që përshkruan projektin, te çështja e lidhur.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Skedarë të kopjuar: {count}", + "Files that failed: {names}": "Skedarë që dështuan: {names}", + "The handover failed. Please try again.": "Dorëzimi dështoi. Provoni përsëri.", + "The linked case could not be found, or you cannot open it.": "Çështja e lidhur nuk u gjet, ose nuk mund ta hapni.", + "Case handovers": "Dorëzime te çështja", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Çdo dorëzim i skedarëve dhe meta të dhënave të projektit te çështja e tij: kur, nga kush, te cila çështje, çdo skedar i kopjuar me SHA-256 e tij dhe skedarët që dështuan.", + "Finance": "Financat", + "Add cost line": "Shto një rresht kostoje", + "Delivery terms": "Kushtet e dorëzimit", + "Billing model": "Modeli i faturimit", + "Budget in euro": "Buxheti në euro", + "Budget in hours": "Buxheti në orë", + "Hourly rate in euro": "Tarifa për orë në euro", + "Planned start": "Fillimi i planifikuar", + "Planned end": "Mbarimi i planifikuar", + "Planned dates": "Datat e planifikuara", + "Budget {amount}": "Buxheti {amount}", + "No budget agreed": "Nuk është rënë dakord për buxhet", + "Hours": "Orë", + "Only the project owner and the portfolio managers see the amounts.": "Shumat i shohin vetëm pronari i projektit dhe menaxherët e portofolit.", + "Budget against cost per category": "Buxheti kundrejt kostove sipas kategorisë", + "Labour (booked time)": "Punë (kohë e regjistruar)", + "No category": "Pa kategori", + "Hours are not available": "Orët nuk janë të disponueshme", + "Not yet assigned to a category": "Ende pa u caktuar në një kategori", + "Total": "Gjithsej", + "{spent} spent, {remaining} remaining": "{spent} të shpenzuara, {remaining} të mbetura", + "Budget against cost per phase": "Buxheti kundrejt kostove sipas fazës", + "No phase": "Pa fazë", + "Cost lines": "Rreshtat e kostos", + "From the finance system": "Nga sistemi financiar", + "Edit cost line {amount}": "Ndrysho rreshtin e kostos {amount}", + "No cost lines yet": "Ende nuk ka rreshta kostoje", + "Commitments": "Angazhime", + "Actual cost": "Kosto reale", + "Forecast": "Parashikim", + "Remaining": "Mbetet", + "Not planned yet": "Ende i paplanifikuar", + "{start} to {end}": "{start} deri më {end}", + "The terms were not saved. Please try again.": "Kushtet nuk u ruajtën. Provo sërish.", + "Terms saved": "Kushtet u ruajtën", + "Fixed price": "Çmim fiks", + "Hourly": "Me orë", + "Not billed": "Pa faturim", + "Commitment": "Angazhim", + "Edit cost line": "Ndrysho rreshtin e kostos", + "Kind": "Lloji", + "Amount in euro": "Shuma në euro", + "Remove": "Hiq", + "Could not save the cost line. Only the project owner changes the money of a project.": "Rreshti i kostos nuk u ruajt dot. Vetëm pronari i projektit ndryshon paratë e një projekti.", + "Could not remove the cost line. Please try again.": "Rreshti i kostos nuk u hoq dot. Provo sërish.", + "{amount} over budget": "{amount} mbi buxhetin", + "Cost categories": "Kategoritë e kostos", + "The categories every project splits its budget and costs into, one per line": "Kategoritë në të cilat çdo projekt ndan buxhetin dhe kostot e veta, një për rresht", + "Categories": "Kategoritë", + "Give at least one category, each name once.": "Jep të paktën një kategori, çdo emër një herë.", + "Cost categories saved": "Kategoritë e kostos u ruajtën", + "The cost categories were not saved. Please try again.": "Kategoritë e kostos nuk u ruajtën. Provo sërish.", + "Finance line": "Rresht financiar", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Një shumë parash në një projekt: buxhet, angazhim, kosto reale ose parashikim, në një kategori kostoje dhe sipas dëshirës në një fazë. E fut pronari i projektit ose e dërgon sistemi financiar përmes aplikacionit të integrimit.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projekti të cilit i përket shuma. Bosh për një rresht nga sistemi financiar numri i projektit i të cilit nuk përputhet me asnjë projekt.", + "The phase this amount belongs to, if any": "Faza së cilës i përket shuma, nëse ka", + "The cost category, one of the categories the admin set up": "Kategoria e kostos, një nga kategoritë që ka vendosur administratori", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Nëse shuma është buxhet, angazhim, kosto reale apo parashikim", + "Amount": "Shuma", + "The amount in the reporting currency (euro)": "Shuma në monedhën e raportimit (euro)", + "The date the amount was booked or is expected": "Data kur shuma u regjistrua ose pritet", + "What the amount is for": "Për çfarë është shuma", + "Whether a person entered the line or the finance system sent it": "Nëse rreshtin e futi një person apo e dërgoi sistemi financiar", + "Entered by hand": "Futur me dorë", + "Finance line id": "ID e rreshtit financiar", + "The finance system's own id of this line. One imported line per id.": "ID-ja e vetë këtij rreshti në sistemin financiar. Një rresht i importuar për ID.", + "Project number": "Numri i projektit", + "The project number the finance system sent, matched against the project key": "Numri i projektit që dërgoi sistemi financiar, i krahasuar me çelësin e projektit", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portofoli i projektit të rreshtit, i kopjuar nga projekti që totalet e portofolit të kenë nevojë për një filtër", + "Finance readers": "Lexues financiarë", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-të e përdoruesve të Nextcloud që mund ta shohin shumën: pronari i projektit dhe menaxherët e portofolit të tij", + "Project owner": "Pronari i projektit", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID-ja e përdoruesit Nextcloud të pronarit të projektit, i cili mund të ndryshojë dhe heqë rreshtat manualë", + "How the client pays: not billed, a fixed price, or by the hour.": "Si paguan klienti: pa faturim, çmim fiks ose me orë.", + "Portfolio finance": "Financat e portofolit", + "You cannot see the money of any project in this portfolio": "Nuk mund të shohësh paratë e asnjë projekti në këtë portofol", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Serveri ktheu rreshta kostoje nga projekte jashtë këtij portofoli, ndaj këto totale mund të jenë të gabuara.", + "Projects left out because you cannot see their money: {count}": "Projekte të lëna jashtë sepse nuk ua sheh paratë: {count}", + "Unmatched finance lines": "Rreshta financiarë të pa përputhur", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Buxheti, angazhimet, kosto reale dhe parashikimi të mbledhura për një portofol.", + "Subprojects": "Nënprojekte", + "{done} of {total}": "{done} nga {total}", + "{done} of {total} tasks done, including subprojects": "{done} nga {total} detyra të kryera, përfshirë nënprojektet", + "Show the subprojects of {title}": "Shfaq nënprojektet e {title}", + "Hide the subprojects of {title}": "Fshih nënprojektet e {title}", + "Part of": "Pjesë e", + "No parent project": "Pa projekt prind", + "A project cannot sit under one of its own subprojects.": "Një projekt nuk mund të qëndrojë nën një nga nënprojektet e veta.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projektet futen njëri brenda tjetrit deri në tre nivele: program, projekt dhe nënprojekt.", + "Parent project": "Projekt prind", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projekti nën të cilin qëndron ky projekt, p.sh. një program. Projektet futen njëri brenda tjetrit deri në tre nivele.", + "Yes": "Po", + "No": "Jo", + "{label} (required)": "{label} (i detyrueshëm)", + "{label} is required": "{label} është i detyrueshëm", + "Project field": "Fushë projekti", + "A field an admin adds to every project, such as a policy area or a contract value.": "Një fushë që një administrator shton në çdo projekt, si një fushë politike ose vlera e kontratës.", + "Key": "Çelës", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Emri i qëndrueshëm me të cilin ruhet vlera, në lower camel case. Mbaje kur projektet e përdorin.", + "Label": "Etiketë", + "The name people see next to the field": "Emri që njerëzit shohin pranë fushës", + "What the field holds": "Çfarë mban fusha", + "Text": "Tekst", + "Number": "Numër", + "Choice": "Zgjedhje", + "Person": "Person", + "Yes or no": "Po ose jo", + "Options": "Opsione", + "The choices of a choice field": "Zgjedhjet e një fushe me zgjedhje", + "Required": "I detyrueshëm", + "Whether a project must fill in the field": "Nëse një projekt duhet ta plotësojë fushën", + "Where the field appears, lowest first": "Ku shfaqet fusha, më e vogla e para", + "Applies to": "Vlen për", + "What the field is added to": "Ku shtohet fusha", + "Custom fields": "Fusha të veta", + "The values of the project fields an admin defined, keyed by the field's key.": "Vlerat e fushave të projektit të përcaktuara nga një administrator, sipas çelësit të fushës.", + "Project fields": "Fushat e projektit", + "Related": "Të lidhura", + "Remove link": "Hiq lidhjen", + "Link type": "Lloji i lidhjes", + "Relates to": "Lidhet me", + "Duplicates": "Dublon", + "Project key": "Çelësi i projektit", + "Every task number starts with it, such as VERG-42.": "Çdo numër detyre fillon me të, për shembull VERG-42.", + "This key is already used by another project.": "Ky çelës përdoret tashmë nga një projekt tjetër.", + "Use 2 to 10 letters and digits, starting with a letter.": "Përdorni 2 deri në 10 shkronja dhe shifra, duke filluar me një shkronjë.", + "The key cannot change once tasks carry it.": "Çelësi nuk mund të ndryshojë pasi detyrat e mbajnë.", + "Project saved. The existing tasks get their numbers in the background.": "Projekti u ruajt. Detyrat ekzistuese marrin numrat e tyre në sfond.", + "Next task number": "Numri i detyrës së radhës", + "The number the next task of this project gets in its key. Only the system writes it.": "Numri që detyra e radhës e këtij projekti merr në çelësin e saj. Vetëm sistemi e shkruan.", + "Restore {title}": "Rikthe {title}", + "Restore": "Rikthe", + "Project restored": "Projekti u rikthye", + "Could not restore the project": "Projekti nuk mund të rikthehej", + "Bring this project back to the active list.": "Ktheje këtë projekt në listën e projekteve aktive.", + "Restore project": "Rikthe projektin", + "Request reason": "Arsyeja e kërkesës", + "Why the requester needs this project. Filled in when the project is requested.": "Pse kërkuesit i nevojitet ky projekt. Plotësohet me kërkesën.", + "Reviewed by": "Shqyrtuar nga", + "The user who approved or rejected the request.": "Përdoruesi që e miratoi ose e refuzoi kërkesën.", + "Reviewed at": "Shqyrtuar më", + "When the request was approved or rejected.": "Kur u miratua ose u refuzua kërkesa.", + "Review note": "Shënim i shqyrtimit", + "The reviewer's reason, shown to the requester when a request is not approved.": "Arsyeja e shqyrtuesit, që kërkuesi e sheh kur një kërkesë nuk miratohet.", + "Members of these groups": "Anëtarët e këtyre grupeve", + "Groups that may create projects": "Grupet që mund të krijojnë projekte", + "The group {group} no longer exists. Save to remove it.": "Grupi {group} nuk ekziston më. Ruajeni për ta hequr.", + "Review project request": "Shqyrto kërkesën për projekt", + "Requested by": "Kërkuar nga", + "Why it is needed": "Pse nevojitet", + "Desired start date": "Data e dëshiruar e fillimit", + "Why is it not approved?": "Pse nuk miratohet?", + "Give a reason. The requester sees it.": "Jepni një arsye. Kërkuesi do ta shohë.", + "Approve": "Mirato", + "Reject": "Refuzo", + "Reject request": "Refuzo kërkesën", + "The review was not saved. Try again.": "Shqyrtimi nuk u ruajt. Provoni sërish.", + "This project is waiting for review": "Ky projekt pret shqyrtim", + "This request was not approved": "Kjo kërkesë nuk u miratua", + "Reason: {note}": "Arsyeja: {note}", + "Review request": "Shqyrto kërkesën", + "Request a project": "Kërko një projekt", + "Step {step} of 2": "Hapi {step} nga 2", + "Why is this project needed?": "Pse nevojitet ky projekt?", + "Give a reason. The reviewer reads it.": "Jepni një arsye. Shqyrtuesi do ta lexojë.", + "Back": "Prapa", + "Next": "Përpara", + "Send request": "Dërgo kërkesën", + "The request was not sent. Try again.": "Kërkesa nuk u dërgua. Provoni sërish.", + "Requested": "E kërkuar", + "Not approved": "E pamiratuar", + "Your request was sent": "Kërkesa juaj u dërgua", + "Let everyone else request a project": "Lejo të gjithë të tjerët të kërkojnë një projekt", + "Add a task": "Shto një detyrë", + "Delete task": "Fshi detyrën", + "Edit task": "Ndrysho detyrën", + "Write": "Shkruaj", + "Preview": "Parapamje", + "Markdown works here: headings, lists and links.": "Këtu funksionon Markdown: tituj, lista dhe lidhje.", + "Could not save the task. Please try again.": "Detyra nuk u ruajt dot. Provoni sërish.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Te \"{title}\" është regjistruar kohë, prandaj nuk mund të fshihet. Në vend të kësaj mund ta anuloni: regjistrimet e kohës mbeten.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Të fshihet \"{title}\"? Hiqen edhe lidhjet e saj me detyra të tjera. Kjo nuk mund të zhbëhet.", + "Keep task": "Mbaje detyrën", + "Cancel task": "Anulo detyrën", + "Only the reporter, the project owner or an admin can delete this task.": "Këtë detyrë mund ta fshijë vetëm raportuesi, pronari i projektit ose një administrator.", + "Could not delete the task. Please try again.": "Detyra nuk u fshi dot. Provoni sërish.", + "Could not cancel the task. Please try again.": "Detyra nuk u anulua dot. Provoni sërish.", + "Responsible": "Përgjegjësi", + "Also working on this": "Punojnë gjithashtu për këtë", + "Labels": "Etiketa", + "Could not change the priority. Please try again.": "Përparësia nuk u ndryshua dot. Provoni sërish.", + "Other project members who work on this task alongside the person responsible.": "Anëtarë të tjerë të projektit që punojnë për këtë detyrë bashkë me përgjegjësin.", + "Duplicate": "Dyfisho", + "Could not copy the task. Please try again.": "Detyra nuk u kopjua dot. Provoni sërish.", + "Subtasks": "Nëndetyra", + "{done} of {total} done": "{done} nga {total} të kryera", + "Add a subtask": "Shto një nëndetyrë", + "Checklist": "Listë kontrolli", + "Checklist item actions": "Veprime për elementin e listës", + "Add a checklist item": "Shto një element në listë", + "Subtasks: {estimate} estimated, {logged} logged": "Nëndetyra: {estimate} vlerësuar, {logged} regjistruar", + "Total estimate: {total}": "Vlerësimi total: {total}", + "Part of {title}": "Pjesë e {title}", + "Checklist: {count} done": "Listë kontrolli: {count} të kryera", + "This task has subtasks: {count}.": "Kjo detyrë ka nëndetyra: {count}.", + "Keep subtasks as separate tasks": "Mbaji nëndetyrat si detyra të veçanta", + "Delete subtasks too": "Fshi edhe nëndetyrat", + "Copy of {title}": "Kopje e {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Detyra u kopjua, por jo të gjitha nëndetyrat e saj. Kontrolloni kopjen.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Hapa të vegjël brenda detyrës. Çdo element ka një id, një tekst dhe nëse është kryer.", + "Open work per person and per project.": "Punë e hapur sipas personit dhe projektit.", + "View": "Pamja", + "By person": "Sipas personit", + "By project": "Sipas projektit", + "Hours left": "Orë të mbetura", + "Tasks without an estimate": "Detyra pa vlerësim", + "Due in 14 days": "Afati brenda 14 ditëve", + "Shared": "Të ndara", + "Unassigned": "Pa caktuar", + "{hours} h": "{hours} orë", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Shfaqet puna në projektet që mund të shihni. Orët llogariten për personin përgjegjës; detyrat e ndara llogariten pa orë.", + "No open work in these projects.": "Nuk ka punë të hapur në këto projekte.", + "Open work": "Punë e hapur", + "{count} open tasks": "{count} detyra të hapura", + "Create a project to see capacity here.": "Krijoni një projekt për të parë këtu kapacitetin.", + "My tasks": "Detyrat e mia", + "Show all my tasks": "Shfaq të gjitha detyrat e mia", + "No tasks assigned to you": "Nuk keni detyra të caktuara", + "Browse projects": "Shfleto projektet", + "Later": "Më vonë", + "Due {date}": "Afati {date}", + "Could not change the status. Please try again.": "Statusi nuk mund të ndryshohej. Provoni sërish.", + "Completed today": "Përfunduar sot", + "My open tasks": "Detyrat e mia të hapura", + "My overdue tasks": "Detyrat e mia të vonuara", + "My tasks in progress": "Detyrat e mia në punë", + "Pin to the top": "Fikso në krye", + "Unpin": "Hiq fiksimin", + "Pinned": "Fiksuar", + "Actions for {title}": "Veprime për {title}", + "Could not save your project order. Please try again.": "Renditja e projekteve nuk mund të ruhej. Provoni sërish.", + "No boards yet": "Ende nuk ka tabela", + "Create a project to get a board.": "Krijoni një projekt për të pasur një tabelë.", + "Use the Projects page to create and manage your projects and tasks.": "Përdorni faqen Projektet për të krijuar dhe menaxhuar projektet dhe detyrat tuaja.", + "Go to projects": "Shko te projektet", + "You are not a member of any projects yet.": "Ende nuk jeni anëtar i asnjë projekti.", + "Could not search for users. Please try again.": "Përdoruesit nuk mund të kërkoheshin. Provoni sërish.", + "Project creation is restricted to administrators.": "Projektet mund t'i krijojnë vetëm administratorët.", + "Only the project owner or an administrator can delete this project.": "Këtë projekt mund ta fshijë vetëm pronari i projektit ose një administrator.", + "No projects are available to you yet. Ask an administrator to create one.": "Ende nuk keni projekte në dispozicion. Kërkojini një administratori të krijojë një.", + "Due: {date}": "Afati: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Detyrat me datë fillimi ose afat shfaqen në kronologji. Shtoni data për t'i parë këtu.", + "You do not have access to this project.": "Nuk keni qasje në këtë projekt.", + "Zoom level": "Niveli i zmadhimit", + "Unscheduled": "Të paplanifikuara", + "Start: {date}": "Fillimi: {date}", + "Today": "Sot", + "No scheduled tasks": "Nuk ka detyra të planifikuara", + "An unexpected error occurred.": "Ndodhi një gabim i papritur.", + "Column {number} name": "Emri i kolonës {number}", + "Failed to save creation policy": "Rregulli i krijimit nuk mund të ruhej", + "All authenticated users": "Të gjithë përdoruesit e identifikuar", + "Control who may create new projects": "Përcaktoni kush mund të krijojë projekte të reja", + "Administrators only": "Vetëm administratorët", + "Project creation": "Krijimi i projekteve", + "Allow project creation": "Lejo krijimin e projekteve", + "Creation policy saved successfully": "Rregulli i krijimit u ruajt", + "Initializing…": "Po niset…", + "e.g. 2h 30m, 90m, 1.5h": "p.sh. 2h 30m, 90m, 1.5h", + "Log time": "Regjistro kohë", + "Save estimate": "Ruaj vlerësimin", + "Logged: {logged}": "Regjistruar: {logged}", + "over by {amount}": "tejkaluar me {amount}", + "Time tracking": "Ndjekja e kohës", + "Estimate": "Vlerësimi", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Vendosni një vlerësim të vlefshëm (p.sh. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Vendosni një kohëzgjatje të vlefshme (p.sh. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Regjistrimi i kohës nuk mund të ruhej. Provoni sërish.", + "Edit time entry": "Ndrysho regjistrimin e kohës", + "Duration": "Kohëzgjatja", + "Date range": "Periudha", + "Last week": "Java e kaluar", + "No time logged": "Nuk ka kohë të regjistruar", + "Log time on a task to see it here.": "Regjistroni kohë në një detyrë për ta parë këtu.", + "To date": "Deri më", + "This week": "Kjo javë", + "Total: {total}": "Gjithsej: {total}", + "From date": "Nga data", + "Custom range": "Periudhë e personalizuar", + "All time": "Gjithë koha", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Një detyrë nuk mund të fshihej, prandaj mund të mbeten të dhëna. Fshijeni sërish projektin.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Një regjistrim kohe nuk mund të fshihej, prandaj mund të mbeten të dhëna. Fshijeni sërish projektin.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Një kolonë nuk mund të fshihej, prandaj mund të mbeten të dhëna. Fshijeni sërish projektin.", + "Could not delete the project. Please try again.": "Projekti nuk mund të fshihej. Provoni sërish.", + "Notification settings": "Cilësimet e njoftimeve", + "Configure when due-date reminders are sent": "Përcaktoni kur dërgohen kujtesat për afatet", + "Due-date reminder lead time (hours)": "Koha e kujtesës para afatit (orë)", + "Lead time must be between 1 and 336 hours": "Koha duhet të jetë nga 1 deri në 336 orë", + "Reminder lead time saved successfully": "Koha e kujtesës u ruajt", + "Failed to save reminder lead time": "Koha e kujtesës nuk mund të ruhej", + "Notifications": "Njoftime", + "Notify me 1 day before a task's due date": "Më njofto 1 ditë para afatit të një detyre", + "Draft": "Draft", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Nëse ora është draft që e sheh vetëm mësuesi i saj, zhvillohet apo është anuluar.", + "New release": "Version i ri", + "Roadmap chart. The same releases and epics are listed below.": "Grafiku i udhërrëfyesit. Të njëjtat versione dhe epika renditen më poshtë.", + "Nothing on the roadmap yet": "Ende asgjë në udhërrëfyes", + "Releases with a target date and epics with dated tasks appear here.": "Këtu shfaqen versionet me datë synimi dhe epikat me detyra me datë.", + "Releases": "Versione", + "No releases yet": "Ende pa versione", + "Target date: {date}": "Data e synuar: {date}", + "No target date": "Pa datë synimi", + "Edit {name}": "Ndrysho {name}", + "Mark {name} as released": "Shëno {name} si të publikuar", + "Mark as released": "Shëno si të publikuar", + "Epics": "Epika", + "No epics yet. Open a task to make it an epic.": "Ende pa epika. Hapni një detyrë për ta bërë epik.", + "Not scheduled yet": "Ende e paplanifikuar", + "Planned": "E planifikuar", + "Released": "E publikuar", + "Edit release": "Ndrysho versionin", + "Target date": "Data e synuar", + "Could not save the release. Please try again.": "Versioni nuk mund të ruhej. Provoni përsëri.", + "Every task of this release is done or cancelled.": "Çdo detyrë e këtij versioni është kryer ose anuluar.", + "Not finished yet: {count}": "Ende të papërfunduara: {count}", + "What happens to these tasks?": "Çfarë ndodh me këto detyra?", + "Move to {name}": "Zhvendos te {name}", + "Remove the release": "Hiq versionin", + "Keep it on {name}": "Lëri te {name}", + "Could not mark the release as released. Please try again.": "Versioni nuk mund të shënohej si i publikuar. Provoni përsëri.", + "Roadmap": "Udhërrëfyes", + "Tasks or roadmap": "Detyra ose udhërrëfyes", + "Release": "Version", + "Epic": "Epik", + "This task is an epic": "Kjo detyrë është epik", + "A named, dated delivery of a project that its tasks are planned against.": "Një dorëzim me emër dhe datë i një projekti, kundrejt të cilit planifikohen detyrat e tij.", + "Name of the release": "Emri i versionit", + "The project this release belongs to": "Projekti të cilit i përket ky version", + "What this release delivers": "Çfarë dorëzon ky version", + "When work on the release starts": "Kur fillon puna për versionin", + "The date the release is due": "Data kur versioni duhet të jetë gati", + "Whether the release is planned, released or archived": "Nëse versioni është i planifikuar, i publikuar apo i arkivuar", + "Released on": "Publikuar më", + "When the release was marked as released": "Kur versioni u shënua si i publikuar", + "The release this task is planned for": "Versioni për të cilin është planifikuar kjo detyrë", + "Board view options": "Opsionet e pamjes së tabelës", + "Colour cards": "Ngjyros kartat", + "No colour": "Pa ngjyrë", + "By label": "Sipas etiketës", + "Swimlanes": "Korsi", + "No swimlanes": "Pa korsi", + "By assignee": "Sipas të caktuarit", + "By epic": "Sipas epikës", + "No assignee": "Pa caktuar", + "No epic": "Pa epikë", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartat mbeten në rreshtin e epikës së tyre. Ndryshoni epikën në faqen e detyrës.", + "Hand over to": "Dorëzoja", + "Could not save your board view. It applies until you reload.": "Pamja e tabelës nuk u ruajt. Vlen derisa të ringarkoni faqen.", + "Timetable wish": "Dëshirë për orarin", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Një dëshirë që gjeneratori e merr parasysh. Një dëshirë të fortë e mban gjithmonë, një të butë aty ku mundet.", + "Whether the wish is about a teacher, a group, a room or one activity": "Nëse dëshira ka të bëjë me një mësues, grup, sallë apo një aktivitet", + "Teacher": "Mësues", + "Group": "Grup", + "Reference": "Referencë", + "The user, group, room or activity the wish is about": "Përdoruesi, grupi, salla ose aktiviteti që ka të bëjë dëshira", + "What the wish asks for": "Çfarë kërkon dëshira", + "Not on these periods": "Jo në këto orë", + "Preferably not on these periods": "Më mirë jo në këto orë", + "At most a number of lessons a day": "Më së shumti një numër orësh në ditë", + "No free periods between lessons": "Pa boshllëqe mes orëve", + "Always the same room": "Gjithmonë e njëjta sallë", + "Periods": "Orët", + "The periods of the week the wish is about, such as wed-5": "Orët e javës që ka të bëjë dëshira, p.sh. wed-5", + "Limit": "Kufi", + "The most lessons a day, for a wish of that kind": "Më së shumti orë në ditë, për një dëshirë të atij lloji", + "Strength": "Forca", + "Whether the generator must keep the wish or should keep it": "Nëse gjeneratori duhet ose do të duhej ta mbajë dëshirën", + "Hard": "E fortë", + "Soft": "E butë", + "Weight": "Pesha", + "How much a soft wish counts, from 1 to 3": "Sa vlen një dëshirë e butë, nga 1 deri në 3", + "Why the wish exists": "Pse ekziston dëshira", + "Timetable scenario": "Skenar orari", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Një model jave, i bërë nga gjeneratori ose i marrë nga orari aktual. Ruan të dhënat hyrëse dhe sa mirë i mban dëshirat.", + "The name timetablers know the scenario by": "Emri me të cilin hartuesit e orarit e njohin skenarin", + "Whether the generator made it or it came from the current timetable": "Nëse e bëri gjeneratori apo vjen nga orari aktual", + "Generated": "I gjeneruar", + "From the current timetable": "Nga orari aktual", + "Week of": "Java e", + "The Monday of the first week of the window": "E hëna e javës së parë të periudhës", + "Window start": "Fillimi i periudhës", + "The first day the week pattern applies to": "Dita e parë për të cilën vlen modeli i javës", + "Window end": "Fundi i periudhës", + "The last day the week pattern applies to": "Dita e fundit për të cilën vlen modeli i javës", + "Waiting, generating, done, failed, or published as draft lessons": "Në pritje, po gjenerohet, gati, dështoi ose u publikua si orë draft", + "Waiting": "Në pritje", + "Generating": "Po gjenerohet", + "Failed": "Dështoi", + "Published": "U publikua", + "Seed": "Farë", + "The number the generator starts from, so a run can be repeated": "Numri nga i cili nis gjeneratori, që një ekzekutim të mund të përsëritet", + "Input": "Të dhëna hyrëse", + "The periods, rooms, lessons and wishes the scenario was made from": "Orët, sallat, mësimet dhe dëshirat nga të cilat u bë skenari", + "Placements": "Vendosjet", + "Each lesson with the period and room it was given": "Çdo mësim me orën dhe sallën që mori", + "Unplaced lessons": "Mësime të pavendosura", + "Lessons without a place, each with the hard wish that blocked it": "Mësime pa vend, secili me dëshirën e fortë që e ndaloi", + "Broken wishes": "Dëshira të shkelura", + "The wishes this scenario breaks, with the lessons that break them": "Dëshirat që shkel ky skenar, me mësimet që i shkelin", + "Measures": "Matje", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Mësime të vendosura, dëshira të shkelura, boshllëqe të mësuesve, orë në ditë dhe përdorim i sallave", + "Reason": "Arsyeja", + "Why the run failed": "Pse dështoi ekzekutimi", + "Published at": "Publikuar më", + "When the scenario was written out as draft lessons": "Kur u shkrua skenari si orë draft", + "Edit wish": "Ndrysho dëshirën", + "New wish": "Dëshirë e re", + "Hard: the generator always keeps it": "E detyrueshme: gjeneratori e respekton gjithmonë", + "Soft: the generator keeps it where it can": "E butë: gjeneratori e respekton kur mundet", + "Weight (1 to 3)": "Pesha (nga 1 deri në 3)", + "Most lessons a day": "Së shumti orë mësimi në ditë", + "Period": "Orë", + "{day} period {number}": "{day} ora {number}", + "Teacher (user name)": "Mësues (emri i përdoruesit)", + "Activity (group:subject)": "Aktivitet (grup:lëndë)", + "Say who or what the wish is about.": "Tregoni për kë ose për çfarë është dëshira.", + "Choose at least one period.": "Zgjidhni të paktën një orë.", + "The limit is a whole number of 1 or more.": "Kufiri është numër i plotë 1 ose më shumë.", + "Timetable": "Orari", + "Wishes": "Dëshirat", + "Timetable wishes": "Dëshirat për orarin", + "Generator run": "Ekzekutimi i gjeneratorit", + "Generator progress": "Ecuria e gjeneratorit", + "The run failed: {reason}": "Ekzekutimi dështoi: {reason}", + "{placed} of {lessons} lessons placed": "U vendosën {placed} nga {lessons} orë mësimi", + "Generate again": "Gjenero sërish", + "Generate": "Gjenero", + "Every lesson has a place.": "Çdo orë mësimi ka një vend.", + "Lesson": "Orë mësimi", + "No free period and room": "Nuk ka orë dhe sallë të lirë", + "Broken soft wishes": "Dëshira të buta të shkelura", + "Every soft wish is kept.": "Çdo dëshirë e butë respektohet.", + "Wish": "Dëshirë", + "Lessons": "Orë mësimi", + "Generating: {percent}% of the time budget used": "Po gjenerohet: u përdor {percent}% e kohës", + "Waiting to start": "Në pritje të nisjes", + "Published as draft lessons": "U publikua si orë mësimi në draft", + "Could not read the scenario.": "Skenari nuk u lexua dot.", + "Could not start the run.": "Ekzekutimi nuk u nis dot.", + "Scenarios": "Skenarë", + "Timetable scenarios": "Skenarë orari", + "Scenario": "Skenar", + "Take the current timetable": "Merr orarin aktual", + "Could not take the current timetable.": "Orari aktual nuk u mor dot.", + "Broken hard wishes": "Dëshira të detyrueshme të shkelura", + "Not on a period of the week grid": "Nuk është në një orë të rrjetës javore", + "Compare scenarios": "Krahaso skenarët", + "Scenarios to compare": "Skenarët për krahasim", + "Choose two or three scenarios to compare them.": "Zgjidhni dy ose tre skenarë për t'i krahasuar.", + "Measure": "Masa", + "Best": "Më i miri", + "Lessons that differ": "Orë mësimi që ndryshojnë", + "No lesson differs.": "Asnjë orë mësimi nuk ndryshon.", + "Not placed": "E pavendosur", + "{period} in {room}": "{period} në {room}", + "Lessons placed": "Orë mësimi të vendosura", + "Lessons without a place": "Orë mësimi pa vend", + "Clashes": "Përplasje", + "Hard wishes broken": "Dëshira të detyrueshme të shkelura", + "Soft wishes broken": "Dëshira të buta të shkelura", + "Soft wishes broken, weighted": "Dëshira të buta të shkelura, të peshuara", + "Free periods between lessons, all teachers": "Orë bosh, të gjithë mësuesit", + "Most free periods of one teacher": "Më shumë orë bosh të një mësuesi", + "Most lessons of one group on a day": "Më shumë orë mësimi të një grupi në një ditë", + "Room use": "Përdorimi i sallave", + "Publish as draft lessons": "Publiko si orë draft", + "Draft lessons written: {count}": "Orë draft të shkruara: {count}", + "Could not publish the scenario.": "Skenari nuk u publikua dot.", + "Rules": "Rregulla", + "Rules for {column}": "Rregullat për {column}", + "When a card enters this column": "Kur një kartë hyn në këtë kolonë", + "Action": "Veprim", + "Set the priority": "Cakto përparësinë", + "Assign to": "Caktoja", + "Assign the person who moved the card": "Caktoja personit që lëvizi kartën", + "Remove the assignee": "Hiq të caktuarin", + "Add a label": "Shto një etiketë", + "No longer a project member": "Nuk është më anëtar i projektit", + "This label no longer exists": "Kjo etiketë nuk ekziston më", + "Add rule": "Shto rregull", + "Remove rule": "Hiq rregullin", + "No rules yet. Add one to change a card when it enters this column.": "Ende nuk ka rregulla. Shtoni një për të ndryshuar një kartë kur hyn në këtë kolonë.", + "Could not save the rules. Please try again.": "Rregullat nuk u ruajtën. Provoni përsëri.", + "1 rule runs when a card enters this column": "1 rregull zbatohet kur një kartë hyn në këtë kolonë", + "{count} rules run when a card enters this column": "{count} rregulla zbatohen kur një kartë hyn në këtë kolonë", + "Rules applied: {changes}": "Rregulla të zbatuara: {changes}", + "assigned to {name}": "caktuar te {name}", + "assignee removed": "i caktuari u hoq", + "priority {priority}": "përparësi {priority}", + "label {label}": "etiketë {label}", + "What happens to a card when it enters this column, applied in list order.": "Çfarë ndodh me një kartë kur hyn në këtë kolonë, sipas renditjes së listës.", + "Value": "Vlera", + "What the rule does to the card.": "Çfarë i bën rregulli kartës.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Përparësia, id-ja e përdoruesit ose id-ja e etiketës që përdor veprimi; bosh për veprimet pa vlerë.", + "is not": "nuk është", + "{dimension} is not": "{dimension} nuk është", + "Saved filters": "Filtra të ruajtur", + "No saved filters yet": "Ende nuk ka filtra të ruajtur", + "Save filter": "Ruaje filtrin", + "Rename \"{name}\"": "Riemërto \"{name}\"", + "Delete \"{name}\"": "Fshi \"{name}\"", + "Clear filters": "Pastro filtrat", + "Showing {shown} of {total} tasks": "Po shfaqen {shown} nga {total} detyra", + "Me": "Unë", + "No date": "Pa datë", + "Rename saved filter": "Riemërto filtrin e ruajtur", + "Share with the project": "Ndaje me projektin", + "Give the filter a name": "Jepini filtrit një emër", + "Could not save the filter. Please try again.": "Filtri nuk u ruajt. Provoni përsëri.", + "Some labels in \"{name}\" no longer exist and were left out.": "Disa etiketa në \"{name}\" nuk ekzistojnë më dhe u lanë jashtë.", + "Could not delete the filter. Please try again.": "Filtri nuk u fshi. Provoni përsëri.", + "Saved filter": "Filtër i ruajtur", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Një filtër tabele me emër i një projekti, privat për personin që e ruajti, përveç nëse ndahet me projektin.", + "The project whose board the filter applies to": "Projekti në tabelën e të cilit zbatohet filtri", + "The name the filter is listed under": "Emri me të cilin shfaqet filtri në listë", + "Saved by": "Ruajtur nga", + "Nextcloud user id of the person who saved the filter": "Id-ja e përdoruesit Nextcloud e personit që ruajti filtrin", + "Shared with the project": "I ndarë me projektin", + "Whether every project member sees and applies the filter": "Nëse çdo anëtar i projektit e sheh dhe mund ta zbatojë filtrin", + "Criteria": "Kritere", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtri: i caktuari, etiketa, përparësia dhe afati, secili me është ose nuk është dhe vlerat e tij", + "Cross-project view": "Pamje ndërprojektuese", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Një përzgjedhje e ruajtur projektesh, detyrat e të cilave shfaqen së bashku në kolona sipas gjendjes, e ndarë me njerëzit që përmend.", + "Shared with": "E ndarë me", + "The name the view is listed under": "Emri me të cilin renditet pamja", + "Nextcloud user id of the person who saved the view": "ID-ja e përdoruesit Nextcloud e personit që e ruajti pamjen", + "Nextcloud user ids of the people the view is shared with": "ID-të e përdoruesve Nextcloud të njerëzve me të cilët ndahet pamja", + "The projects whose tasks the view shows, at most twenty": "Projektet, detyrat e të cilëve i shfaq pamja, jo më shumë se njëzet", + "1 project in this view is hidden from you.": "1 projekt në këtë pamje është i fshehur për ju.", + "{count} projects in this view are hidden from you.": "{count} projekte në këtë pamje janë të fshehura për ju.", + "{project} has no column for {status}.": "{project} nuk ka kolonë për {status}.", + "This view does not exist or is not shared with you.": "Kjo pamje nuk ekziston ose nuk është ndarë me ju.", + "\"{task}\" moved to {status}.": "\"{task}\" u zhvendos te {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Pamje ndërprojektuese", + "New view": "Pamje e re", + "Edit view": "Ndrysho pamjen", + "Delete view": "Fshi pamjen", + "Give the view a name": "Jepi një emër pamjes", + "Pick at least one project": "Zgjidh të paktën një projekt", + "A view shows at most {max} projects": "Një pamje shfaq jo më shumë se {max} projekte", + "Could not save the view. Please try again.": "Pamja nuk u ruajt dot. Provo përsëri.", + "Could not delete the view. Please try again.": "Pamja nuk u fshi dot. Provo përsëri.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Të fshihet \"{title}\"? Projektet dhe detyrat e tyre mbeten siç janë.", + "People see the tasks of the projects they are in, never more.": "Secili sheh vetëm detyrat e projekteve ku bën pjesë.", + "No views yet. A view shows the tasks of several of your projects together.": "Ende nuk ka pamje. Një pamje shfaq së bashku detyrat e disa projekteve të tua.", + "Projects in view: {count}": "Projekte në pamje: {count}", + "Notify me when a task is assigned to me": "Më njofto kur më caktohet një detyrë", + "Also send these to me by email": "Ma dërgo edhe me email", + "Add an email address in your Nextcloud personal settings to get mail.": "Shto një adresë email-i te cilësimet personale të Nextcloud për të marrë email.", + "Code link": "Lidhje kodi", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Një commit, degë, kërkesë për bashkim ose problem në një platformë kodi që lidhet me një detyrë.", + "The task the link belongs to": "Detyra së cilës i përket lidhja", + "The project of the task": "Projekti i detyrës", + "Task key": "Çelësi i detyrës", + "The task key the forge text named, such as VC-12": "Çelësi i detyrës që përmendi teksti i platformës, p.sh. VC-12", + "What the link points at": "Ku tregon lidhja", + "Link": "Lidhje", + "The address of the item in the forge": "Adresa e elementit në platformën e kodit", + "The commit message, branch name or merge request title": "Mesazhi i commit-it, emri i degës ose titulli i kërkesës për bashkim", + "Repository": "Depo", + "The repository, such as acme/portal": "Depoja, p.sh. acme/portal", + "Forge id": "Id në platformë", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Id-ja e vetë elementit në platformën e kodit, p.sh. github:acme/portal#42 ose një hash commit-i", + "State": "Gjendja", + "The state of a merge request or issue": "Gjendja e një kërkese për bashkim ose problemi", + "Who made the commit or opened the merge request": "Kush e bëri commit-in ose hapi kërkesën për bashkim", + "When the commit was made or the merge request last changed": "Kur u bë commit-i ose ndryshoi për herë të fundit kërkesa për bashkim", + "Added by": "Shtuar nga", + "Whether a person added the link or the integration wrote it": "Nëse lidhjen e shtoi një person apo e shkroi integrimi", + "Nextcloud user UIDs of project members": "ID-të e përdoruesve Nextcloud të anëtarëve të projektit", + "Add link": "Shto lidhje", + "Added by hand": "Shtuar me dorë", + "Branch": "Degë", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Nga integrimi", + "Link to a commit, branch or merge request": "Lidhje me një commit, degë ose kërkesë për bashkim", + "Merge request": "Kërkesë për bashkim", + "Merged": "E bashkuar", + "No code linked yet. Name {key} in a commit message or paste a link.": "Ende nuk ka kod të lidhur. Përmendni {key} në një mesazh commit-i ose ngjitni një lidhje.", + "No code linked yet. Paste a link to a commit or merge request.": "Ende nuk ka kod të lidhur. Ngjitni një lidhje me një commit ose kërkesë për bashkim.", + "Paste a web address that starts with https://.": "Ngjitni një adresë web që fillon me https://.", + "Remove link {title}": "Hiq lidhjen {title}", + "The link could not be added.": "Lidhja nuk mund të shtohej.", + "The link could not be removed.": "Lidhja nuk mund të hiqej.", + "This link is already on the task.": "Kjo lidhje është tashmë te detyra.", + "Code forges": "Platforma kodi", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Lidhni commit-et dhe pull request-et e GitHub me detyrat. Integriq merr ngjarjet; planninq nuk thërret kurrë GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Shkarkoni konfigurimin dhe importojeni në Integriq. Pastaj plotësoni një sekret te rregulli \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Në GitHub, shtoni te depoja një webhook me këtë adresë dhe të njëjtin sekret. Zgjidhni llojin e përmbajtjes application/json dhe ngjarjet push dhe pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Përmendni çelësin e detyrës, p.sh. VC-12, në një mesazh commit-i, emër dege ose titull pull request-i. Lidhja shfaqet atëherë te ajo detyrë.", + "Without Integriq, project members can still paste a link on the task page.": "Pa Integriq, anëtarët e projektit mund të ngjitin ende një lidhje në faqen e detyrës.", + "Download the Integriq configuration": "Shkarko konfigurimin e Integriq", + "Calendar": "Kalendari", + "Previous": "I mëparshmi", + "Calendar view": "Pamja e kalendarit", + "Starts:": "Fillon:", + "No tasks with a date in this month.": "Nuk ka detyra me datë këtë muaj.", + "Week of {start} to {end}": "Java nga {start} deri më {end}", + "My calendar": "Kalendari im", + "Show as list": "Shfaq si listë", + "Show as calendar": "Shfaq si kalendar", + "Open my calendar": "Hap kalendarin tim", + "Nextcloud Tasks": "Detyrat e Nextcloud", + "Show my tasks in Nextcloud Tasks": "Shfaq detyrat e mia te Detyrat e Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Detyrat që ju janë caktuar ose ndarë me ju shfaqen në një listë \"Planninq\" te Detyrat dhe Kalendari i Nextcloud. Ndryshimet e bëra atje zëvendësohen nga ndryshimi i radhës në Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Ky server nuk mund të shkruajë te Detyrat e Nextcloud, ndaj eksporti nuk është i disponueshëm.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Menaxhohet nga Planninq. Ndryshimet e bëra këtu zëvendësohen nga ndryshimi i radhës në Planninq.", + "Working days and holidays": "Ditët e punës dhe festat", + "Dates set on the timeline skip the days that are not working days.": "Datat e vendosura në kronologji kapërcejnë ditët që nuk janë ditë pune.", + "Working weekdays": "Ditët e punës së javës", + "Non-working days": "Ditë pushimi", + "No non-working days yet.": "Ende nuk ka ditë pushimi.", + "Add day": "Shto ditë", + "Year": "Viti", + "Add Dutch national holidays": "Shto festat kombëtare holandeze", + "Save working days": "Ruaj ditët e punës", + "Choose at least one working weekday.": "Zgjidhni të paktën një ditë pune.", + "Working days saved.": "Ditët e punës u ruajtën.", + "Could not save the working days.": "Ditët e punës nuk u ruajtën dot.", + "New Year's Day": "Viti i Ri", + "Easter Sunday": "E diela e Pashkëve", + "Easter Monday": "E hëna e Pashkëve", + "King's Day": "Dita e Mbretit", + "Liberation Day": "Dita e Çlirimit", + "Ascension Day": "Ngjitja në qiell", + "Whit Sunday": "Rrëshajët", + "Whit Monday": "E hëna e Rrëshajëve", + "Christmas Day": "Krishtlindja", + "Boxing Day": "Dita e dytë e Krishtlindjes", + "Dates of {title}": "Datat e {title}", + "The due date cannot be before the start date.": "Afati nuk mund të jetë para datës së fillimit.", + "{title}, from {start} to {end}": "{title}, nga {start} deri më {end}", + "The dates could not be saved.": "Datat nuk u ruajtën dot.", + "{title} now runs from {start} to {end}": "{title} tani zgjat nga {start} deri më {end}", + "Auto-scheduling": "Planifikim automatik", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Kur është aktiv, shtyrja e një afati më vonë në kronologji propozon të zhvendosen edhe detyrat që bllokon.", + "Move blocked tasks along when a task slips": "Zhvendos detyrat e bllokuara kur një detyrë vonohet", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Në kronologji, një afat më i vonë propozon zhvendosjen e detyrave të bllokuara. Numërohen vetëm lidhjet \"bllokon\" dhe detyrat zhvendosen vetëm më vonë.", + "Move the tasks that wait for {title}?": "Të zhvendosen detyrat që presin {title}?", + "These tasks wait for it and would start after its new due date:": "Këto detyra e presin dhe do të fillonin pas afatit të ri:", + "{count} tasks would move; the first {limit} are listed.": "Do të zhvendoseshin {count} detyra; renditen {limit} të parat.", + "Now": "Tani", + "After the move": "Pas zhvendosjes", + "Only this task": "Vetëm këtë detyrë", + "Move all": "Zhvendosi të gjitha", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "U ndal te {title}: datat nuk u ruajtën dot. Detyrat para saj u zhvendosën.", + "Cumulative flow": "Rrjedhë kumulative", + "Show as chart": "Shfaq si grafik", + "Show as table": "Shfaq si tabelë", + "Tasks per column per day": "Detyra për kolonë në ditë", + "Tasks without recorded history in this period: {count}": "Detyra pa histori të regjistruar në këtë periudhë: {count}", + "Lead and cycle time": "Koha e dorëzimit dhe koha e ciklit", + "No tasks were finished in this period.": "Asnjë detyrë nuk u përfundua në këtë periudhë.", + "Finished tasks": "Detyra të përfunduara", + "Cycle time, average": "Koha e ciklit, mesatarja", + "Cycle time, 85th percentile": "Koha e ciklit, përqindëshi i 85-të", + "Lead time, average": "Koha e dorëzimit, mesatarja", + "Tasks whose finish time was estimated from their history: {count}": "Detyra, koha e përfundimit të të cilave u vlerësua nga historia: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Koha e ciklit e çdo detyre të përfunduar, me mesataren dhe përqindëshin e 85-të", + "Slowest tasks": "Detyrat më të ngadalta", + "cycle {cycle}, lead {lead}": "cikli {cycle}, dorëzimi {lead}", + "{days} days": "{days} ditë", + "Could not load the flow of this project.": "Rrjedha e këtij projekti nuk u ngarkua dot.", + "Last {days} days": "{days} ditët e fundit", + "Portfolio flow": "Rrjedha e portofolit", + "An admin adds portfolios under Projects, Portfolios.": "Një administrator shton portofole te Projektet, Portofolet.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekte që nuk shfaqen, sepse shfaqen më së shumti 50 njëherësh: {count}", + "Could not load the flow of this portfolio.": "Rrjedha e këtij portofoli nuk u ngarkua dot.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Rrjedhë kumulative dhe kohë cikli në projektet e një portofoli.", + "Edit report": "Ndrysho raportin", + "Only tasks where": "Vetëm detyrat ku", + "Group by": "Grupo sipas", + "Display": "Shfaqja", + "Share with everyone who can read its projects": "Ndaje me këdo që mund të lexojë projektet e tij", + "The report could not be saved.": "Raporti nuk u ruajt dot.", + "Number of tasks": "Numri i detyrave", + "Bar": "Shtylla", + "Donut": "Unazë", + "Table": "Tabelë", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} nga {total} projekte në këtë raport nuk janë të dukshme për ty", + "No tasks match this report.": "Asnjë detyrë nuk përputhet me këtë raport.", + "None": "Asnjë", + "Could not load this report.": "Ky raport nuk u ngarkua dot.", + "Report": "Raport", + "Your reports": "Raportet e tua", + "My reports": "Raportet e mia", + "Shared reports": "Raporte të ndara", + "You have not built a report yet.": "Nuk ke krijuar ende asnjë raport.", + "Nobody has shared a report with you yet.": "Askush nuk ka ndarë ende një raport me ty.", + "Reports you built over tasks, and the ones shared with you.": "Raportet që ke krijuar për detyrat, dhe ato të ndara me ty.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Një pyetje e ruajtur për detyrat: cilat projekte, cilët filtra, të grupuara sipas çfarë, të numëruara ose të mbledhura, dhe të shfaqura si tabelë ose grafik.", + "The name the report is listed under": "Emri me të cilin raporti shfaqet në listë", + "What the report shows and who it is for": "Çfarë tregon raporti dhe për kë është", + "Nextcloud user id of the person who saved the report": "ID-ja e përdoruesit Nextcloud të personit që ruajti raportin", + "Who can open the report": "Kush mund ta hapë raportin", + "Only me": "Vetëm unë", + "Everyone who can read its projects": "Këdo që mund të lexojë projektet e tij", + "The projects the report covers, at most fifty": "Projektet që mbulon raporti, më së shumti pesëdhjetë", + "Filters": "Filtra", + "Task fields and the value each must equal": "Fushat e detyrës dhe vlera me të cilën duhet të jetë e barabartë secila", + "The task field the report groups on": "Fusha e detyrës sipas së cilës grupon raporti", + "Count the tasks, or add up a number on them": "Numëro detyrat, ose mblidh një numër prej tyre", + "Sum": "Shuma", + "Sum of": "Shuma e", + "The number added up when the measure is a sum": "Numri që mblidhet kur masa është shumë", + "Story points": "Pikë historie", + "Estimated duration": "Kohëzgjatje e vlerësuar", + "How the report is shown": "Si shfaqet raporti", + "Issue type": "Lloji i çështjes", + "Task fields and the value each must equal; empty when the report covers every task": "Fushat e detyrës dhe vlera që duhet të ketë secila; bosh kur raporti përfshin të gjitha detyrat", + "The status a task must have": "Statusi që duhet të ketë një detyrë", + "The priority a task must have": "Përparësia që duhet të ketë një detyrë", + "The user a task must be assigned to": "Përdoruesi të cilit duhet t'i jetë caktuar një detyrë", + "A label a task must carry": "Një etiketë që duhet të mbajë një detyrë", + "The board column a task must be in": "Kolona e tabelës ku duhet të jetë një detyrë", + "The issue type a task must have": "Lloji i çështjes që duhet të ketë një detyrë", + "Manager groups": "Grupet e menaxherëve", + "Member groups": "Grupet e anëtarëve", + "Viewer groups": "Grupet e lexuesve", + "Viewers": "Lexuesit", + "Owning group": "Grupi pronar", + "Nextcloud groups whose members manage the project": "Grupet Nextcloud anëtarët e të cilave menaxhojnë projektin", + "Nextcloud groups whose members work on the project": "Grupet Nextcloud anëtarët e të cilave punojnë në projekt", + "Nextcloud groups whose members may read the project": "Grupet Nextcloud anëtarët e të cilave mund ta lexojnë projektin", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Përdoruesit Nextcloud që menaxhojnë projektin: cilësimet, anëtarët dhe punën", + "Nextcloud user ids who may read the project and its work but not change it": "Përdoruesit Nextcloud që mund të lexojnë projektin dhe punën e tij, por jo ta ndryshojnë", + "The Nextcloud group that owns the project with its creator, at most one": "Grupi Nextcloud që e zotëron projektin bashkë me krijuesin e tij, më së shumti një", + "Nextcloud user ids who may read this through the project": "Përdoruesit Nextcloud që mund ta lexojnë këtë përmes projektit", + "Nextcloud groups whose members may change this through the project": "Grupet Nextcloud anëtarët e të cilave mund ta ndryshojnë këtë përmes projektit", + "Nextcloud groups whose members may read this through the project": "Grupet Nextcloud anëtarët e të cilave mund ta lexojnë këtë përmes projektit", + "Search for a person or a group…": "Kërko një person ose një grup…", + "No one found. Your admin's sharing settings decide who you can find.": "Nuk u gjet askush. Cilësimet e ndarjes të administratorit tuaj vendosin kë mund të gjeni.", + "Type at least two characters": "Shkruani të paktën dy karaktere", + "Everyone in this group": "Të gjithë në këtë grup", + "Could not search for people. Please try again.": "Kërkimi i personave dështoi. Provoni përsëri.", + "Could not remove the group": "Grupi nuk mund të hiqej", + "Only the owner and managers change who is on this project.": "Vetëm pronari dhe menaxherët ndryshojnë se kush është në këtë projekt.", + "Role of {name}": "Roli i {name}", + "Manager": "Menaxher", + "Member": "Anëtar", + "Viewer": "Lexues", + "Could not change the role": "Roli nuk mund të ndryshohej", + "Owned by group: {name}": "Në pronësi të grupit: {name}", + "No group owns this project.": "Asnjë grup nuk e zotëron këtë projekt.", + "Owned by group": "Në pronësi të grupit", + "Search for a group…": "Kërko një grup…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Nuk u gjet asnjë grup. Cilësimet e ndarjes së administratorit tuaj vendosin cilat grupe mund të gjeni.", + "No owning group": "Pa grup pronar", + "Could not search for groups. Please try again.": "Grupet nuk mund të kërkoheshin. Provoni përsëri.", + "Could not change the owning group": "Grupi pronar nuk mund të ndryshohej", + "You can read this project. Only its members change it.": "Mund ta lexoni këtë projekt. Vetëm anëtarët e tij e ndryshojnë.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursi që jepet në këtë orë mësimi, për shembull një lëndë me zgjedhje, kur aplikacioni mësimor i shkollës e njeh.", + "Online meeting link": "Lidhja e mësimit në internet", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Ku nxënësit i bashkohen këtij mësimi në internet. Butoni Bashkohu shfaqet vetëm për një lidhje https." }, "plurals": {} } diff --git a/l10n/sr.js b/l10n/sr.js index 9c601f86..2a17b019 100644 --- a/l10n/sr.js +++ b/l10n/sr.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Активни пројекти", + "Archived projects": "Архивирани пројекти", + "Boards": "Табле", + "My projects": "Моји пројекти", + "Portfolio": "Портфолио", + "Project board": "Табла пројекта", + "Projects I am in": "Пројекти у којима учествујем", + "Timeline": "Временска линија", + "Timesheet": "Евиденција времена", + "Features & roadmap": "Функције и план развоја", + "Flow": "Ток", + "Flows": "Токови", + "Reports": "Извештаји", + "Pick a report to open it.": "Изаберите извештај да бисте га отворили.", + "In progress": "У току", + "Date": "Датум", + "Due": "Рок", + "Assignee": "Додељено", + "Who": "Ко", + "What": "Шта", + "Minutes": "Минути", + "Entries": "Уноси", + "Most recent": "Најновије", + "Per person": "По особи", + "By status": "По статусу", + "By priority": "По приоритету", + "Task status": "Статус задатака", + "Time spent": "Утрошено време", + "Capacity": "Капацитет", + "Due soonest": "Најскорији рок", + "Minutes logged": "Забележени минути", + "Nothing is due": "Ништа не доспева", + "Nothing logged yet": "Још ништа није забележено", + "What is open, what is blocked, and what is overdue.": "Шта је отворено, шта блокирано и шта касни.", + "How allocation is spread across the people working on projects.": "Како је оптерећење распоређено међу људима на пројектима.", + "Hours logged, and the projects they went to.": "Забележени сати и пројекти на које су отишли.", + "Billable": "Naplativo", + "Budget: {amount}": "Budžet: {amount}", + "Loading projects": "Učitavanje projekata", + "No projects for this client yet": "Još nema projekata za ovog klijenta", + "Open in Planninq": "Otvori u Planninq", + "This project could not be found": "Ovaj projekat nije pronađen", + "Untitled project": "Projekat bez naziva", + "and {count} more": "i još {count}", + "Store": "Продавница", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Инсталирајте регистре, шеме и токове које су објавиле друге организације.", + "Work Date": "Датум рада", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Радње колоне", + "Columns": "Колоне", + "Could not remove the column. Please try again.": "Колону није могуће уклонити. Покушајте поново.", + "Could not save the column. Please try again.": "Колону није могуће сачувати. Покушајте поново.", + "Done column": "Колона завршених", + "Edit column": "Уреди колону", + "Keep the card's status": "Задржи статус картице", + "Move its cards to": "Премести њене картице у", + "Move left": "Помери лево", + "Move right": "Помери десно", + "Status of cards moved here": "Статус картица премештених овде", + "The last done column cannot be removed.": "Последња колона завршених не може да се уклони.", + "WIP limit": "WIP ограничење", + "over limit": "изнад ограничења", + "The status a card gets when it is moved into this column.": "Статус који картица добија када се премести у ову колону.", + "All priorities": "Сви приоритети", + "Could not create the task. Please try again.": "Задатак није могуће направити. Покушајте поново.", + "Created": "Направљено", + "Move to backlog": "У заостатак", + "Move to board": "На таблу", + "New task": "Нови задатак", + "Nothing in the backlog": "Нема ничега у заостатку", + "Rank": "Ранг", + "Sort by": "Поређај по", + "Sort by rank to reorder": "Поређајте по рангу да бисте променили редослед", + "Task actions": "Радње задатка", + "All labels": "Све ознаке", + "Filter tasks by label": "Филтрирај задатке по ознаци", + "View timeline": "Прикажи временску линију", + "Board": "Табла", + "List": "Листа", + "Column": "Колона", + "Board or list": "Табла или листа", + "Log": "Дневник", + "Add entry": "Додај унос", + "Show": "Прикажи", + "No actions yet": "Још нема радњи", + "Closed": "Затворено", + "Entry actions": "Радње уноса", + "Add action": "Додај радњу", + "by {author}": "аутор {author}", + "saved {time}": "сачувано {time}", + "Attendees: {names}": "Присутни: {names}", + "Add the first entry": "Додај први унос", + "Issues": "Проблеми", + "Lessons learned": "Научене лекције", + "Meetings": "Састанци", + "Decisions": "Одлуке", + "Actions": "Радње", + "Issue": "Проблем", + "Lesson learned": "Научена лекција", + "Meeting": "Састанак", + "Decision": "Одлука", + "About this project": "О овом пројекту", + "No description yet": "Још нема описа", + "Start date": "Датум почетка", + "Not set": "Није постављено", + "End date": "Датум завршетка", + "Progress": "Напредак", + "No tasks yet": "Још нема задатака", + "Open the board": "Отвори таблу", + "People": "Особе", + "Owner": "Власник", + "Latest log entries": "Најновији уноси", + "Open the log": "Отвори дневник", + "{done} of {total} tasks done": "Готово {done} од {total} задатака", + "Edit entry": "Уреди унос", + "Type": "Врста", + "Attendees": "Присутни", + "Issue is closed": "Проблем је затворен", + "Could not save the entry. Please try again.": "Унос није могуће сачувати. Покушајте поново.", + "From: {title}": "Из: {title}", + "What needs to happen": "Шта треба урадити", + "Could not create the action. Please try again.": "Радњу није могуће направити. Покушајте поново.", + "The action was created but could not be linked to the entry.": "Радња је направљена, али није могуће повезати је са уносом.", + "Project pages": "Странице пројекта", + "Overview": "Преглед", + "Risks": "Ризици", + "Log entry": "Унос у дневник", + "A short name for the entry": "Кратак назив уноса", + "Project": "Пројекат", + "The project this entry belongs to": "Пројекат коме овај унос припада", + "What kind of entry this is": "Која је ово врста уноса", + "When it happened": "Када се догодило", + "What happened, in Markdown": "Шта се догодило, у Markdown-у", + "Whether an issue is still open": "Да ли је проблем још отворен", + "The people at a meeting": "Особе на састанку", + "Tasks that came out of this entry": "Задаци проистекли из овог уноса", + "Add risk": "Додај ризик", + "Risk": "Ризик", + "Score": "Оцена", + "Response": "Одговор", + "Review date": "Датум прегледа", + "no longer on the project": "више није на пројекту", + "Edit {title}": "Уреди {title}", + "No risks recorded yet": "Још нема забележених ризика", + "Add the first risk": "Додај први ризик", + "Medium": "Средње", + "Mitigating": "Ублажава се", + "Occurred": "Наступио", + "Avoid": "Избећи", + "Reduce": "Смањити", + "Transfer": "Пренети", + "Accept": "Прихватити", + "Highest open risks": "Највиши отворени ризици", + "No open risks": "Нема отворених ризика", + "Open the risk register": "Отвори регистар ризика", + "Edit risk": "Уреди ризик", + "What could go wrong": "Шта може поћи наопако", + "Likelihood": "Вероватноћа", + "Impact": "Утицај", + "Score {score}": "Оцена {score}", + "Countermeasures": "Противмере", + "Could not save the risk. Please try again.": "Ризик није могуће сачувати. Покушајте поново.", + "Risks by likelihood and impact": "Ризици по вероватноћи и утицају", + "Risk scale": "Скала ризика", + "The levels every project scores its risks on, and where low turns into medium and high": "Нивои на којима сваки пројекат оцењује своје ризике, и где ниско прелази у средње и високо", + "Number of levels": "Број нивоа", + "Likelihood labels": "Ознаке вероватноће", + "Impact labels": "Ознаке утицаја", + "Level {level}": "Ниво {level}", + "Medium from score": "Средње од оцене", + "High from score": "Високо од оцене", + "Risk scale saved": "Скала ризика је сачувана", + "1 risk uses level {level}. Change it first.": "1 ризик користи ниво {level}. Прво га промените.", + "{count} risks use level {level}. Change them first.": "Ризика који користе ниво {level}: {count}. Прво их промените.", + "Every level needs a label, and high must start above medium.": "Сваки ниво треба ознаку, а високо мора почети изнад средњег.", + "The project this risk belongs to": "Пројекат коме овај ризик припада", + "The cause and the effect, in Markdown": "Узрок и последица, у Markdown-у", + "Category": "Категорија", + "A free grouping, such as planning, budget or supplier": "Слободно груписање, нпр. планирање, буџет или добављач", + "How likely it is, on the admin's risk scale": "Колико је вероватно, на скали ризика администратора", + "How hard it would hit, on the admin's risk scale": "Колико би снажно погодило, на скали ризика администратора", + "Likelihood times impact, calculated by the server": "Вероватноћа пута утицај, израчунава сервер", + "Where the risk stands": "Где је ризик", + "The person who watches this risk": "Особа која прати овај ризик", + "How the project answers the risk": "Како пројекат одговара на ризик", + "What is done to prevent it or soften it, in Markdown": "Шта се ради да се спречи или ублажи, у Markdown-у", + "When to look at this risk again": "Када поново прегледати овај ризик", + "Very low": "Веома ниско", + "Very high": "Веома високо", + "All projects": "Сви пројекти", + "Project status report": "Извештај о стању пројекта", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датирани извештај о томе како пројекат стоји са новцем, организацијом, временом, информацијама, квалитетом и ризиком (GROTIK аспекти), сваки са белешком.", + "The project this report is about": "Пројекат на који се извештај односи", + "Report date": "Датум извештаја", + "The day the report describes": "Дан који извештај описује", + "Money": "Новац", + "How the project stands on this aspect": "Како пројекат стоји у овом аспекту", + "On track": "По плану", + "At risk": "Угрожено", + "Off track": "Ван плана", + "Money note": "Белешка о новцу", + "A short explanation of this status": "Кратко објашњење овог стања", + "Organisation": "Организација", + "Organisation note": "Белешка о организацији", + "Time": "Време", + "Time note": "Белешка о времену", + "Information": "Информације", + "Information note": "Белешка о информацијама", + "Quality": "Квалитет", + "Quality note": "Белешка о квалитету", + "Risk note": "Белешка о ризику", + "Overall": "Укупно", + "The worst of the six statuses, calculated by the server": "Најлошије од шест стања, израчунава га сервер", + "Health: money": "Стање: новац", + "Copied from the newest status report": "Преузето из најновијег извештаја о стању", + "Health: organisation": "Стање: организација", + "Health: time": "Стање: време", + "Health: information": "Стање: информације", + "Health: quality": "Стање: квалитет", + "Health: risk": "Стање: ризик", + "Health: overall": "Стање: укупно", + "Health: report date": "Стање: датум извештаја", + "The date of the newest status report": "Датум најновијег извештаја о стању", + "New report": "Нови извештај", + "Only the project owner writes status reports.": "Извештаје о стању пише само власник пројекта.", + "Latest report, {date}": "Последњи извештај, {date}", + "Aspect": "Аспект", + "Note": "Белешка", + "Report history": "Историја извештаја", + "Author": "Аутор", + "No status reports yet": "Још нема извештаја о стању", + "Write the first report": "Напиши први извештај", + "Choose a status for every aspect to save the report.": "Да бисте сачували извештај, изаберите стање за сваки аспект.", + "Suggested: on track.": "Предлог: по плану.", + "Suggested: at risk.": "Предлог: угрожено.", + "Suggested: off track.": "Предлог: ван плана.", + "1 task is past its due date.": "1 задатак је прекорачио рок.", + "{count} tasks are past their due date.": "Задаци који су прекорачили рок: {count}.", + "The end date has passed with 1 open task.": "Датум завршетка је прошао са 1 отвореним задатком.", + "The end date has passed with {count} open tasks.": "Датум завршетка је прошао, отворени задаци: {count}.", + "No open task is past its due date.": "Ниједан отворени задатак није прекорачио рок.", + "The highest open risk, \"{title}\", scores {score}.": "Највећи отворени ризик, \"{title}\", има оцену {score}.", + "There are no open risks.": "Нема отворених ризика.", + "Costs are at {percent}% of the budget.": "Трошкови су на {percent}% буџета.", + "No suggestion: the project has no budget.": "Нема предлога: пројекат нема буџет.", + "No suggestion: no costs are recorded for this project yet.": "Нема предлога: за овај пројекат још нису евидентирани трошкови.", + "The report was not saved. Only the project owner can write status reports.": "Извештај није сачуван. Извештаје о стању може писати само власник пројекта.", + "No report": "Нема извештаја", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Група пројеката које воде исти људи, на пример одељење или програм. Њени руководиоци читају сваки пројекат у њој.", + "The name of the portfolio": "Назив портфолија", + "What the portfolio holds and who runs it": "Шта портфолио садржи и ко га води", + "A colour for the portfolio's section in project lists": "Боја одељка портфолија у листама пројеката", + "Managers": "Руководиоци", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud кориснички ID-јеви људи који воде портфолио", + "Order": "Редослед", + "Where the portfolio comes in project lists, lowest first": "Где је портфолио у листама пројеката, најнижи први", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Сопствена скала ризика овог портфолија као JSON, у истом облику као скала целе апликације. Празно значи скалу апликације.", + "Portfolio readers": "Читаоци портфолија", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud кориснички ID-јеви руководилаца портфолија пројекта", + "The portfolio this project belongs to": "Портфолио коме овај пројекат припада", + "No portfolio": "Без портфолија", + "All portfolios": "Сви портфолији", + "You read this project as a manager of its portfolio. Only its members change it.": "Овај пројекат читате као руководилац његовог портфолија. Мењају га само његови чланови.", + "Portfolios": "Портфолији", + "Portfolio status": "Стање портфолија", + "No portfolios yet": "Још нема портфолија", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Администратор додаје портфолије у Пројекти, Портфолији. Пројекти у портфолију овде су наведени са својим стањем.", + "Roll-up": "Сажетак", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} по плану, {atRisk} угрожено, {offTrack} ван плана, {noReport} без извештаја", + "No project in this portfolio that you can read.": "У овом портфолију нема пројекта који можете да читате.", + "Start": "Почетак", + "End": "Крај", + "Budget": "Буџет", + "Last report": "Последњи извештај", + "Out of date": "Застарело", + "Portfolio timeline": "Временска линија портфолија", + "Zoom": "Зумирање", + "Could not load the timeline": "Временска линија није могла да се учита", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Администратор додаје портфолије у Пројекти, Портфолији. Пројекти у портфолију овде су на једној временској линији.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Отворите пројекат да видите његове фазе и задатке. Временска линија је само за читање.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Изостављено јер не можете да их читате: {count} пројеката", + "Week": "Недеља", + "Day": "Дан", + "Month": "Месец", + "Please try again later.": "Покушајте поново касније.", + "Status reports": "Извештаји о стању", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "После колико дана се последњи извештај о стању пројекта у прегледу портфолија означава као застарео", + "Reporting period (days)": "Период извештавања (дани)", + "The reporting period is a whole number of days from 1 to 365.": "Период извештавања је цео број дана од 1 до 365.", + "Reporting period saved": "Период извештавања сачуван", + "The reporting period was not saved. Please try again.": "Период извештавања није сачуван. Покушајте поново.", + "Every project of a portfolio with its status per aspect, rolled up.": "Сваки пројекат портфолија са стањем по аспектима, сажето.", + "The projects of a portfolio on one timeline.": "Пројекти портфолија на једној временској линији.", + "Phases": "Фазе", + "Add phase": "Додај фазу", + "No phases yet": "Још нема фаза", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Поделите пројекат на фазе, нпр. покретање, дефиницију и реализацију. Фаза се затвара када се отпреми њен завршни документ.", + "{hours} hours": "{hours} сати", + "Concluding document: {title}": "Завршни документ: {title}", + "Concluding document missing": "Недостаје завршни документ", + "Move {title} up": "Помери {title} горе", + "Move {title} down": "Помери {title} доле", + "Close phase": "Затвори фазу", + "Phase": "Фаза", + "Files": "Датотеке", + "Notes": "Белешке", + "Audit trail": "Ревизорски траг", + "Edit phase": "Уреди фазу", + "Name": "Назив", + "Budget hours": "Планирани сати", + "Could not save the phase. Please try again.": "Фаза није могла да се сачува. Покушајте поново.", + "Close phase {title}": "Затвори фазу {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фаза се затвара завршним документом: отпремите га овде или изаберите једну од датотека фазе.", + "Concluding document": "Завршни документ", + "This phase has no files yet.": "Ова фаза још нема датотека.", + "Upload a document": "Отпреми документ", + "The document was not uploaded. Please try again.": "Документ није отпремљен. Покушајте поново.", + "Upload the concluding document before you close this phase.": "Отпремите завршни документ пре него што затворите ову фазу.", + "This phase cannot be closed from its current status.": "Ова фаза не може да се затвори из тренутног стања.", + "The phase was not closed. Please try again.": "Фаза није затворена. Покушајте поново.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ИД датотеке ове фазе која је затвара. Фаза може да се заврши тек када је постављен и датотека приложена.", + "Import from Microsoft Project": "Увези из Microsoft Project-а", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Изаберите план сачуван из Microsoft Project-а у XML формату. Ништа се не увози док не потврдите.", + "Plan file": "Датотека плана", + "What the import creates": "Шта увоз прави", + "Tasks": "Задаци", + "Sub-tasks": "Подзадаци", + "Milestones": "Прекретнице", + "Links": "Везе", + "Already imported, updated in place: {count}": "Већ увезено, ажурирано на месту: {count}", + "What does not carry over": "Шта се не преноси", + "Tasks with resources, which are not imported: {count}": "Задаци са ресурсима, који се не увозе: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Задаци дубље од нивоа 3, смештени под свој задатак нивоа 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Везе осим крај-почетак, увезене као повезане везе: {count}", + "Link lags, which are dropped: {count}": "Кашњења веза, која се одбацују: {count}", + "Links to a summary task, which are not imported: {count}": "Везе ка збирном задатку, које се не увозе: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Везе ка задацима ван овог плана, које се не увозе: {count}", + "No longer in the plan": "Више није у плану", + "These stay in the project; remove them yourself if they are no longer needed.": "Остају у пројекту; уклоните их сами ако више нису потребни.", + "Import": "Увези", + "Close": "Затвори", + "The plan is imported: {created} created, {updated} updated.": "План је увезен: направљено {created}, ажурирано {updated}.", + "Links that would close a loop were left out: {count}": "Везе које би затвориле петљу изостављене су: {count}", + "The import stopped part-way. Run it again to finish it.": "Увоз је стао на пола пута. Покрените га поново да га завршите.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Сачувајте план у Microsoft Project-у преко Датотека, Сачувај као, XML формат, и увезите ту датотеку.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ова датотека декларише DOCTYPE или ентитете, који се не прихватају.", + "The file is larger than 10 MB.": "Датотека је већа од 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "План има више од 2.000 задатака, више него што један увоз прима.", + "This file is not a Microsoft Project plan in XML format.": "Ова датотека није план Microsoft Project-а у XML формату.", + "Choose a file to import.": "Изаберите датотеку за увоз.", + "Only the project owner can import a plan.": "Само власник пројекта може да увезе план.", + "The plan could not be read. Please try again.": "План није могуће прочитати. Покушајте поново.", + "Linked case: {title}": "Повезани предмет: {title}", + "Linked to a case": "Повезано са предметом", + "Hand over to case": "Предај предмету", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Непромењено копира сваку датотеку пројекта и његових задатака и датотеку која описује пројекат у повезани предмет.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Копиране датотеке: {count}", + "Files that failed: {names}": "Неуспеле датотеке: {names}", + "The handover failed. Please try again.": "Предаја није успела. Покушајте поново.", + "The linked case could not be found, or you cannot open it.": "Повезани предмет није пронађен или не можете да га отворите.", + "Case handovers": "Предаје предмету", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Свака предаја датотека и метаподатака пројекта његовом предмету: када, ко, ком предмету, свака копирана датотека са њеним SHA-256 и неуспеле датотеке.", + "Finance": "Финансије", + "Add cost line": "Додај ставку трошка", + "Delivery terms": "Услови испоруке", + "Billing model": "Модел наплате", + "Budget in euro": "Буџет у еврима", + "Budget in hours": "Буџет у сатима", + "Hourly rate in euro": "Сатница у еврима", + "Planned start": "Планирани почетак", + "Planned end": "Планирани крај", + "Planned dates": "Планирани датуми", + "Budget {amount}": "Буџет {amount}", + "No budget agreed": "Буџет није договорен", + "Hours": "Сати", + "Only the project owner and the portfolio managers see the amounts.": "Износе виде само власник пројекта и менаџери портфолија.", + "Budget against cost per category": "Буџет у односу на трошкове по категорији", + "Labour (booked time)": "Рад (евидентирани сати)", + "No category": "Без категорије", + "Hours are not available": "Сати нису доступни", + "Not yet assigned to a category": "Још није додељено категорији", + "Total": "Укупно", + "{spent} spent, {remaining} remaining": "{spent} потрошено, {remaining} преостало", + "Budget against cost per phase": "Буџет у односу на трошкове по фази", + "No phase": "Без фазе", + "Cost lines": "Ставке трошка", + "From the finance system": "Из финансијског система", + "Edit cost line {amount}": "Уреди ставку трошка {amount}", + "No cost lines yet": "Још нема ставки трошка", + "Commitments": "Обавезе", + "Actual cost": "Стварни трошак", + "Forecast": "Прогноза", + "Remaining": "Преостало", + "Not planned yet": "Још није планирано", + "{start} to {end}": "{start} до {end}", + "The terms were not saved. Please try again.": "Услови нису сачувани. Покушајте поново.", + "Terms saved": "Услови сачувани", + "Fixed price": "Фиксна цена", + "Hourly": "По сату", + "Not billed": "Не наплаћује се", + "Commitment": "Обавеза", + "Edit cost line": "Уреди ставку трошка", + "Kind": "Врста", + "Amount in euro": "Износ у еврима", + "Remove": "Уклони", + "Could not save the cost line. Only the project owner changes the money of a project.": "Ставку трошка није могуће сачувати. Новац пројекта мења само власник пројекта.", + "Could not remove the cost line. Please try again.": "Ставку трошка није могуће уклонити. Покушајте поново.", + "{amount} over budget": "{amount} изнад буџета", + "Cost categories": "Категорије трошкова", + "The categories every project splits its budget and costs into, one per line": "Категорије на које сваки пројекат дели свој буџет и трошкове, једна по реду", + "Categories": "Категорије", + "Give at least one category, each name once.": "Наведите бар једну категорију, сваки назив једном.", + "Cost categories saved": "Категорије трошкова сачуване", + "The cost categories were not saved. Please try again.": "Категорије трошкова нису сачуване. Покушајте поново.", + "Finance line": "Финансијска ставка", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Један новчани износ пројекта: буџет, обавеза, стварни трошак или прогноза, у категорији трошкова и по жељи у фази. Уноси је власник пројекта или је шаље финансијски систем преко апликације за интеграцију.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Пројекат коме износ припада. Празно за ставку из финансијског система чији број пројекта не одговара ниједном пројекту.", + "The phase this amount belongs to, if any": "Фаза којој износ припада, ако постоји", + "The cost category, one of the categories the admin set up": "Категорија трошкова, једна од категорија које је подесио администратор", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Да ли је износ буџет, обавеза, стварни трошак или прогноза", + "Amount": "Износ", + "The amount in the reporting currency (euro)": "Износ у извештајној валути (евро)", + "The date the amount was booked or is expected": "Датум када је износ књижен или се очекује", + "What the amount is for": "За шта је износ", + "Whether a person entered the line or the finance system sent it": "Да ли је ставку унела особа или ју је послао финансијски систем", + "Entered by hand": "Унето ручно", + "Finance line id": "Ид финансијске ставке", + "The finance system's own id of this line. One imported line per id.": "Сопствени ид ове ставке у финансијском систему. Једна увезена ставка по иду.", + "Project number": "Број пројекта", + "The project number the finance system sent, matched against the project key": "Број пројекта који је послао финансијски систем, упоређен са кључем пројекта", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Портфолио пројекта ставке, преузет са пројекта да би збирови портфолија требали један филтер", + "Finance readers": "Читаоци финансија", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-ови корисника Nextcloud-а који смеју да виде овај износ: власник пројекта и менаџери његовог портфолија", + "Project owner": "Власник пројекта", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID корисника Nextcloud-а власника пројекта, који сме да мења и уклања ручне ставке", + "How the client pays: not billed, a fixed price, or by the hour.": "Како клијент плаћа: не наплаћује се, фиксна цена или по сату.", + "Portfolio finance": "Финансије портфолија", + "You cannot see the money of any project in this portfolio": "Не можете да видите новац ниједног пројекта у овом портфолију", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Сервер је вратио ставке трошка пројеката ван овог портфолија, па ови збирови могу бити погрешни.", + "Projects left out because you cannot see their money: {count}": "Изостављени пројекти јер не можете да видите њихов новац: {count}", + "Unmatched finance lines": "Неповезане финансијске ставке", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Буџет, обавезе, стварни трошак и прогноза сабрани за портфолио.", + "Subprojects": "Потпројекти", + "{done} of {total}": "{done} од {total}", + "{done} of {total} tasks done, including subprojects": "{done} од {total} задатака готово, укључујући потпројекте", + "Show the subprojects of {title}": "Прикажи потпројекте {title}", + "Hide the subprojects of {title}": "Сакриј потпројекте {title}", + "Part of": "Део", + "No parent project": "Без надређеног пројекта", + "A project cannot sit under one of its own subprojects.": "Пројекат не може бити испод једног од својих потпројеката.", + "Projects nest three levels deep at most: programme, project and subproject.": "Пројекти се угнежђују највише три нивоа дубоко: програм, пројекат и потпројекат.", + "Parent project": "Надређени пројекат", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Пројекат испод ког је овај пројекат, нпр. програм. Пројекти се угнежђују највише три нивоа дубоко.", + "Yes": "Да", + "No": "Не", + "{label} (required)": "{label} (обавезно)", + "{label} is required": "{label} је обавезно", + "Project field": "Поље пројекта", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поље које администратор додаје сваком пројекту, нпр. област политике или вредност уговора.", + "Key": "Кључ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Стални назив под којим се вредност чува, у lower camel case. Задржите га када га пројекти користе.", + "Label": "Ознака", + "The name people see next to the field": "Назив који људи виде поред поља", + "What the field holds": "Шта поље садржи", + "Text": "Текст", + "Number": "Број", + "Choice": "Избор", + "Person": "Особа", + "Yes or no": "Да или не", + "Options": "Опције", + "The choices of a choice field": "Опције поља избора", + "Required": "Обавезно", + "Whether a project must fill in the field": "Да ли пројекат мора да попуни поље", + "Where the field appears, lowest first": "Где се поље појављује, најниже прво", + "Applies to": "Важи за", + "What the field is added to": "Чему се поље додаје", + "Custom fields": "Сопствена поља", + "The values of the project fields an admin defined, keyed by the field's key.": "Вредности поља пројекта која је дефинисао администратор, према кључу поља.", + "Project fields": "Поља пројекта", + "Related": "Повезано", + "Remove link": "Уклони везу", + "Link type": "Врста везе", + "Relates to": "Повезано са", + "Duplicates": "Дуплира", + "Project key": "Кључ пројекта", + "Every task number starts with it, such as VERG-42.": "Сваки број задатка почиње њиме, на пример VERG-42.", + "This key is already used by another project.": "Овај кључ већ користи други пројекат.", + "Use 2 to 10 letters and digits, starting with a letter.": "Користите од 2 до 10 слова и цифара, почевши словом.", + "The key cannot change once tasks carry it.": "Кључ се не може променити када га задаци носе.", + "Project saved. The existing tasks get their numbers in the background.": "Пројекат је сачуван. Постојећи задаци добијају бројеве у позадини.", + "Next task number": "Број следећег задатка", + "The number the next task of this project gets in its key. Only the system writes it.": "Број који следећи задатак овог пројекта добија у свом кључу. Уписује га само систем.", + "Restore {title}": "Врати {title}", + "Restore": "Врати", + "Project restored": "Пројекат је враћен", + "Could not restore the project": "Пројекат није могуће вратити", + "Bring this project back to the active list.": "Врати овај пројекат на списак активних пројеката.", + "Restore project": "Врати пројекат", + "Request reason": "Разлог захтева", + "Why the requester needs this project. Filled in when the project is requested.": "Зашто подносиоцу треба овај пројекат. Попуњава се при захтеву.", + "Reviewed by": "Прегледао", + "The user who approved or rejected the request.": "Корисник који је одобрио или одбио захтев.", + "Reviewed at": "Прегледано", + "When the request was approved or rejected.": "Када је захтев одобрен или одбијен.", + "Review note": "Напомена прегледача", + "The reviewer's reason, shown to the requester when a request is not approved.": "Разлог прегледача који подносилац види када захтев није одобрен.", + "Members of these groups": "Чланови ових група", + "Groups that may create projects": "Групе које смеју да праве пројекте", + "The group {group} no longer exists. Save to remove it.": "Група {group} више не постоји. Сачувајте да бисте је уклонили.", + "Review project request": "Прегледај захтев за пројекат", + "Requested by": "Затражио", + "Why it is needed": "Зашто је потребан", + "Desired start date": "Жељени датум почетка", + "Why is it not approved?": "Зашто није одобрен?", + "Give a reason. The requester sees it.": "Наведите разлог. Подносилац ће га видети.", + "Approve": "Одобри", + "Reject": "Одбиј", + "Reject request": "Одбиј захтев", + "The review was not saved. Try again.": "Преглед није сачуван. Покушајте поново.", + "This project is waiting for review": "Овај пројекат чека преглед", + "This request was not approved": "Овај захтев није одобрен", + "Reason: {note}": "Разлог: {note}", + "Review request": "Прегледај захтев", + "Request a project": "Затражи пројекат", + "Step {step} of 2": "Корак {step} од 2", + "Why is this project needed?": "Зашто је овај пројекат потребан?", + "Give a reason. The reviewer reads it.": "Наведите разлог. Прегледач ће га прочитати.", + "Back": "Назад", + "Next": "Даље", + "Send request": "Пошаљи захтев", + "The request was not sent. Try again.": "Захтев није послат. Покушајте поново.", + "Requested": "Затражено", + "Not approved": "Није одобрено", + "Your request was sent": "Ваш захтев је послат", + "Let everyone else request a project": "Дозволи свима осталима да затраже пројекат", + "Add a task": "Додај задатак", + "Delete task": "Обриши задатак", + "Edit task": "Уреди задатак", + "Write": "Пиши", + "Preview": "Преглед", + "Markdown works here: headings, lists and links.": "Овде ради Markdown: наслови, листе и везе.", + "Could not save the task. Please try again.": "Задатак није могуће сачувати. Покушајте поново.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "На задатку \"{title}\" је евидентирано време, па се не може обрисати. Уместо тога можете га отказати: записи времена остају.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Обрисати \"{title}\"? Уклониће се и његове везе са другим задацима. Ово се не може поништити.", + "Keep task": "Задржи задатак", + "Cancel task": "Откажи задатак", + "Only the reporter, the project owner or an admin can delete this task.": "Овај задатак може обрисати само пријавилац, власник пројекта или администратор.", + "Could not delete the task. Please try again.": "Задатак није могуће обрисати. Покушајте поново.", + "Could not cancel the task. Please try again.": "Задатак није могуће отказати. Покушајте поново.", + "Responsible": "Одговорна особа", + "Also working on this": "На овоме раде и", + "Labels": "Ознаке", + "Could not change the priority. Please try again.": "Приоритет није могуће променити. Покушајте поново.", + "Other project members who work on this task alongside the person responsible.": "Остали чланови пројекта који на овом задатку раде заједно са одговорном особом.", + "Duplicate": "Дуплирај", + "Could not copy the task. Please try again.": "Задатак није могуће копирати. Покушајте поново.", + "Subtasks": "Подзадаци", + "{done} of {total} done": "Готово {done} од {total}", + "Add a subtask": "Додај подзадатак", + "Checklist": "Контролна листа", + "Checklist item actions": "Радње ставке листе", + "Add a checklist item": "Додај ставку листе", + "Subtasks: {estimate} estimated, {logged} logged": "Подзадаци: процена {estimate}, евидентирано {logged}", + "Total estimate: {total}": "Укупна процена: {total}", + "Part of {title}": "Део задатка {title}", + "Checklist: {count} done": "Контролна листа: готово {count}", + "This task has subtasks: {count}.": "Овај задатак има подзадатке: {count}.", + "Keep subtasks as separate tasks": "Задржи подзадатке као засебне задатке", + "Delete subtasks too": "Обриши и подзадатке", + "Copy of {title}": "Копија: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Задатак је копиран, али не и сви његови подзадаци. Проверите копију.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Мали кораци унутар задатка. Свака ставка има id, текст и податак да ли је готова.", + "Open work per person and per project.": "Отворени посао по особи и по пројекту.", + "View": "Приказ", + "By person": "По особи", + "By project": "По пројекту", + "Hours left": "Преостали сати", + "Tasks without an estimate": "Задаци без процене", + "Due in 14 days": "Рок у 14 дана", + "Shared": "Дељено", + "Unassigned": "Недодељено", + "{hours} h": "{hours} ч", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Приказује се посао у пројектима које можете да видите. Сати се рачунају одговорној особи; дељени задаци рачунају се без сати.", + "No open work in these projects.": "Нема отвореног посла у овим пројектима.", + "Open work": "Отворени посао", + "{count} open tasks": "{count} отворених задатака", + "Create a project to see capacity here.": "Направите пројекат да бисте овде видели капацитет.", + "My tasks": "Моји задаци", + "Show all my tasks": "Прикажи све моје задатке", + "No tasks assigned to you": "Немате додељених задатака", + "Browse projects": "Прегледај пројекте", + "Later": "Касније", + "Due {date}": "Рок {date}", + "Could not change the status. Please try again.": "Статус није могуће променити. Покушајте поново.", + "Completed today": "Завршено данас", + "My open tasks": "Моји отворени задаци", + "My overdue tasks": "Моји задаци у кашњењу", + "My tasks in progress": "Моји задаци у току", + "Pin to the top": "Закачи на врх", + "Unpin": "Откачи", + "Pinned": "Закачено", + "Actions for {title}": "Радње за {title}", + "Could not save your project order. Please try again.": "Редослед пројеката није могуће сачувати. Покушајте поново.", + "No boards yet": "Још нема табли", + "Create a project to get a board.": "Направите пројекат да бисте добили таблу.", + "Use the Projects page to create and manage your projects and tasks.": "На страници Пројекти правите пројекте и задатке и управљајте њима.", + "Go to projects": "Иди на пројекте", + "You are not a member of any projects yet.": "Још нисте члан ниједног пројекта.", + "Could not search for users. Please try again.": "Претрага корисника није успела. Покушајте поново.", + "Project creation is restricted to administrators.": "Пројекте могу да праве само администратори.", + "Only the project owner or an administrator can delete this project.": "Овај пројекат може да обрише само власник пројекта или администратор.", + "No projects are available to you yet. Ask an administrator to create one.": "Још немате доступних пројеката. Замолите администратора да направи један.", + "Due: {date}": "Рок: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Задаци са датумом почетка или роком приказују се на временској линији. Додајте датуме да бисте их овде видели.", + "You do not have access to this project.": "Немате приступ овом пројекту.", + "Zoom level": "Ниво зумирања", + "Unscheduled": "Непланирано", + "Start: {date}": "Почетак: {date}", + "Today": "Данас", + "No scheduled tasks": "Нема планираних задатака", + "An unexpected error occurred.": "Дошло је до неочекиване грешке.", + "Column {number} name": "Назив колоне {number}", + "Failed to save creation policy": "Правило прављења није могуће сачувати", + "All authenticated users": "Сви пријављени корисници", + "Control who may create new projects": "Одредите ко сме да прави нове пројекте", + "Administrators only": "Само администратори", + "Project creation": "Прављење пројеката", + "Allow project creation": "Дозволи прављење пројеката", + "Creation policy saved successfully": "Правило прављења сачувано", + "Initializing…": "Покретање…", + "e.g. 2h 30m, 90m, 1.5h": "нпр. 2h 30m, 90m, 1.5h", + "Log time": "Упиши време", + "Save estimate": "Сачувај процену", + "Logged: {logged}": "Уписано: {logged}", + "over by {amount}": "прекорачено за {amount}", + "Time tracking": "Евиденција времена", + "Estimate": "Процена", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Унесите исправну процену (нпр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Унесите исправно трајање (нпр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Унос времена није могуће сачувати. Покушајте поново.", + "Edit time entry": "Уреди унос времена", + "Duration": "Трајање", + "Date range": "Период", + "Last week": "Прошла недеља", + "No time logged": "Нема уписаног времена", + "Log time on a task to see it here.": "Упишите време на задатак да бисте га овде видели.", + "To date": "До датума", + "This week": "Ова недеља", + "Total: {total}": "Укупно: {total}", + "From date": "Од датума", + "Custom range": "Прилагођени период", + "All time": "Све време", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Задатак није могуће обрисати па подаци могу остати. Поново обришите пројекат.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Унос времена није могуће обрисати па подаци могу остати. Поново обришите пројекат.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Колону није могуће обрисати па подаци могу остати. Поново обришите пројекат.", + "Could not delete the project. Please try again.": "Пројекат није могуће обрисати. Покушајте поново.", + "Notification settings": "Подешавања обавештења", + "Configure when due-date reminders are sent": "Одредите када се шаљу подсетници на рокове", + "Due-date reminder lead time (hours)": "Време подсетника пре рока (сати)", + "Lead time must be between 1 and 336 hours": "Време мора бити између 1 и 336 сати", + "Reminder lead time saved successfully": "Време подсетника сачувано", + "Failed to save reminder lead time": "Време подсетника није могуће сачувати", + "Notifications": "Обавештења", + "Notify me 1 day before a task's due date": "Обавести ме 1 дан пре рока задатка", + "Draft": "Нацрт", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Да ли је час нацрт који види само његов наставник, одржава ли се или је отказан.", + "New release": "Ново издање", + "Roadmap chart. The same releases and epics are listed below.": "Графикон плана развоја. Иста издања и епови наведени су испод.", + "Nothing on the roadmap yet": "Још ништа на плану развоја", + "Releases with a target date and epics with dated tasks appear here.": "Овде се приказују издања са циљним датумом и епови са задацима који имају датум.", + "Releases": "Издања", + "No releases yet": "Још нема издања", + "Target date: {date}": "Циљни датум: {date}", + "No target date": "Нема циљног датума", + "Edit {name}": "Уреди {name}", + "Mark {name} as released": "Означи {name} као објављено", + "Mark as released": "Означи као објављено", + "Epics": "Епови", + "No epics yet. Open a task to make it an epic.": "Још нема епова. Отворите задатак да бисте га претворили у еп.", + "Not scheduled yet": "Још није заказано", + "Planned": "Планирано", + "Released": "Објављено", + "Edit release": "Уреди издање", + "Target date": "Циљни датум", + "Could not save the release. Please try again.": "Издање није могуће сачувати. Покушајте поново.", + "Every task of this release is done or cancelled.": "Сваки задатак овог издања је завршен или отказан.", + "Not finished yet: {count}": "Још није завршено: {count}", + "What happens to these tasks?": "Шта се дешава са овим задацима?", + "Move to {name}": "Премести у {name}", + "Remove the release": "Уклони издање", + "Keep it on {name}": "Остави их у {name}", + "Could not mark the release as released. Please try again.": "Издање није могуће означити као објављено. Покушајте поново.", + "Roadmap": "План развоја", + "Tasks or roadmap": "Задаци или план развоја", + "Release": "Издање", + "Epic": "Еп", + "This task is an epic": "Овај задатак је еп", + "A named, dated delivery of a project that its tasks are planned against.": "Именована испорука пројекта са датумом према којој се планирају његови задаци.", + "Name of the release": "Назив издања", + "The project this release belongs to": "Пројекат коме припада ово издање", + "What this release delivers": "Шта ово издање испоручује", + "When work on the release starts": "Када почиње рад на издању", + "The date the release is due": "Датум до ког издање треба да буде готово", + "Whether the release is planned, released or archived": "Да ли је издање планирано, објављено или архивирано", + "Released on": "Објављено", + "When the release was marked as released": "Када је издање означено као објављено", + "The release this task is planned for": "Издање за које је овај задатак планиран", + "Board view options": "Опције приказа табле", + "Colour cards": "Обоји картице", + "No colour": "Без боје", + "By label": "По ознаци", + "Swimlanes": "Стазе", + "No swimlanes": "Без стаза", + "By assignee": "По задуженој особи", + "By epic": "По епику", + "No assignee": "Није додељено", + "No epic": "Без епика", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Картице остају у реду свог епика. Промените епик на страници задатка.", + "Hand over to": "Предај", + "Could not save your board view. It applies until you reload.": "Приказ табле није сачуван. Важи до поновног учитавања.", + "Timetable wish": "Želja za raspored", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Želja koju generator uzima u obzir. Čvrstu želju uvek poštuje, meku gde može.", + "Whether the wish is about a teacher, a group, a room or one activity": "Da li se želja odnosi na nastavnika, grupu, prostoriju ili jednu aktivnost", + "Teacher": "Nastavnik", + "Group": "Grupa", + "Reference": "Referenca", + "The user, group, room or activity the wish is about": "Korisnik, grupa, prostorija ili aktivnost na koju se želja odnosi", + "What the wish asks for": "Šta želja traži", + "Not on these periods": "Ne u ovim časovima", + "Preferably not on these periods": "Radije ne u ovim časovima", + "At most a number of lessons a day": "Najviše određen broj časova dnevno", + "No free periods between lessons": "Bez rupa između časova", + "Always the same room": "Uvek ista prostorija", + "Periods": "Časovi", + "The periods of the week the wish is about, such as wed-5": "Časovi u nedelji na koje se želja odnosi, npr. wed-5", + "Limit": "Granica", + "The most lessons a day, for a wish of that kind": "Najviše časova dnevno, za želju te vrste", + "Strength": "Jačina", + "Whether the generator must keep the wish or should keep it": "Da li generator mora ili bi trebalo da poštuje želju", + "Hard": "Čvrsta", + "Soft": "Meka", + "Weight": "Težina", + "How much a soft wish counts, from 1 to 3": "Koliko meka želja vredi, od 1 do 3", + "Why the wish exists": "Zašto želja postoji", + "Timetable scenario": "Scenario rasporeda", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jedan nedeljni obrazac, koji je napravio generator ili je preuzet iz trenutnog rasporeda. Čuva svoj ulaz i koliko dobro poštuje želje.", + "The name timetablers know the scenario by": "Naziv pod kojim sastavljači rasporeda znaju scenario", + "Whether the generator made it or it came from the current timetable": "Da li ga je napravio generator ili dolazi iz trenutnog rasporeda", + "Generated": "Generisano", + "From the current timetable": "Iz trenutnog rasporeda", + "Week of": "Nedelja od", + "The Monday of the first week of the window": "Ponedeljak prve nedelje perioda", + "Window start": "Početak perioda", + "The first day the week pattern applies to": "Prvi dan na koji se nedeljni obrazac odnosi", + "Window end": "Kraj perioda", + "The last day the week pattern applies to": "Poslednji dan na koji se nedeljni obrazac odnosi", + "Waiting, generating, done, failed, or published as draft lessons": "Čeka, generiše se, gotovo, neuspelo ili objavljeno kao nacrti časova", + "Waiting": "Čeka", + "Generating": "Generiše se", + "Failed": "Neuspelo", + "Published": "Objavljeno", + "Seed": "Seme", + "The number the generator starts from, so a run can be repeated": "Broj od kog generator kreće, kako bi pokretanje moglo da se ponovi", + "Input": "Ulaz", + "The periods, rooms, lessons and wishes the scenario was made from": "Časovi, prostorije, predavanja i želje od kojih je nastao scenario", + "Placements": "Smeštaji", + "Each lesson with the period and room it was given": "Svaki čas sa terminom i prostorijom koje je dobio", + "Unplaced lessons": "Nesmešteni časovi", + "Lessons without a place, each with the hard wish that blocked it": "Časovi bez mesta, svaki sa čvrstom željom koja ga je zaustavila", + "Broken wishes": "Prekršene želje", + "The wishes this scenario breaks, with the lessons that break them": "Želje koje ovaj scenario krši, sa časovima koji ih krše", + "Measures": "Mere", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Smešteni časovi, prekršene želje, rupe nastavnika, časovi dnevno i korišćenje prostorija", + "Reason": "Razlog", + "Why the run failed": "Zašto pokretanje nije uspelo", + "Published at": "Objavljeno", + "When the scenario was written out as draft lessons": "Kada je scenario zapisan kao nacrti časova", + "Edit wish": "Уреди жељу", + "New wish": "Нова жеља", + "Hard: the generator always keeps it": "Обавезна: генератор је увек поштује", + "Soft: the generator keeps it where it can": "Флексибилна: генератор је поштује где може", + "Weight (1 to 3)": "Тежина (од 1 до 3)", + "Most lessons a day": "Највише часова дневно", + "Period": "Час", + "{day} period {number}": "{day} час {number}", + "Teacher (user name)": "Наставник (корисничко име)", + "Activity (group:subject)": "Активност (група:предмет)", + "Say who or what the wish is about.": "Наведите на кога или шта се жеља односи.", + "Choose at least one period.": "Изаберите бар један час.", + "The limit is a whole number of 1 or more.": "Ограничење је цео број 1 или више.", + "Timetable": "Распоред", + "Wishes": "Жеље", + "Timetable wishes": "Жеље за распоред", + "Generator run": "Покретање генератора", + "Generator progress": "Напредак генератора", + "The run failed: {reason}": "Покретање није успело: {reason}", + "{placed} of {lessons} lessons placed": "Смештено {placed} од {lessons} часова", + "Generate again": "Генериши поново", + "Generate": "Генериши", + "Every lesson has a place.": "Сваки час има место.", + "Lesson": "Час", + "No free period and room": "Нема слободног часа и учионице", + "Broken soft wishes": "Прекршене флексибилне жеље", + "Every soft wish is kept.": "Свака флексибилна жеља је поштована.", + "Wish": "Жеља", + "Lessons": "Часови", + "Generating: {percent}% of the time budget used": "Генерисање: искоришћено {percent}% времена", + "Waiting to start": "Чека почетак", + "Published as draft lessons": "Објављено као нацрти часова", + "Could not read the scenario.": "Сценарио није могуће прочитати.", + "Could not start the run.": "Покретање није могуће започети.", + "Scenarios": "Сценарији", + "Timetable scenarios": "Сценарији распореда", + "Scenario": "Сценарио", + "Take the current timetable": "Преузми тренутни распоред", + "Could not take the current timetable.": "Тренутни распоред није могуће преузети.", + "Broken hard wishes": "Прекршене обавезне жеље", + "Not on a period of the week grid": "Није на часу недељне мреже", + "Compare scenarios": "Упореди сценарије", + "Scenarios to compare": "Сценарији за поређење", + "Choose two or three scenarios to compare them.": "Изаберите два или три сценарија за поређење.", + "Measure": "Мера", + "Best": "Најбоље", + "Lessons that differ": "Часови који се разликују", + "No lesson differs.": "Ниједан час се не разликује.", + "Not placed": "Није смештен", + "{period} in {room}": "{period} у {room}", + "Lessons placed": "Смештени часови", + "Lessons without a place": "Часови без места", + "Clashes": "Сукоби", + "Hard wishes broken": "Прекршене обавезне жеље", + "Soft wishes broken": "Прекршене флексибилне жеље", + "Soft wishes broken, weighted": "Прекршене флексибилне жеље, пондерисане", + "Free periods between lessons, all teachers": "Празни часови, сви наставници", + "Most free periods of one teacher": "Највише празних часова једног наставника", + "Most lessons of one group on a day": "Највише часова једне групе у дану", + "Room use": "Коришћење учионица", + "Publish as draft lessons": "Објави као нацрте часова", + "Draft lessons written: {count}": "Записани нацрти часова: {count}", + "Could not publish the scenario.": "Сценарио није могуће објавити.", + "Rules": "Правила", + "Rules for {column}": "Правила за {column}", + "When a card enters this column": "Када картица уђе у ову колону", + "Action": "Радња", + "Set the priority": "Постави приоритет", + "Assign to": "Додели", + "Assign the person who moved the card": "Додели особи која је преместила картицу", + "Remove the assignee": "Уклони задужену особу", + "Add a label": "Додај ознаку", + "No longer a project member": "Више није члан пројекта", + "This label no longer exists": "Ова ознака више не постоји", + "Add rule": "Додај правило", + "Remove rule": "Уклони правило", + "No rules yet. Add one to change a card when it enters this column.": "Још нема правила. Додајте једно да бисте мењали картицу када уђе у ову колону.", + "Could not save the rules. Please try again.": "Правила није могуће сачувати. Покушајте поново.", + "1 rule runs when a card enters this column": "1 правило се извршава када картица уђе у ову колону", + "{count} rules run when a card enters this column": "Број правила која се извршавају када картица уђе у ову колону: {count}", + "Rules applied: {changes}": "Примењена правила: {changes}", + "assigned to {name}": "додељено: {name}", + "assignee removed": "задужена особа уклоњена", + "priority {priority}": "приоритет {priority}", + "label {label}": "ознака {label}", + "What happens to a card when it enters this column, applied in list order.": "Шта се дешава са картицом када уђе у ову колону, редоследом листе.", + "Value": "Вредност", + "What the rule does to the card.": "Шта правило ради са картицом.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Приоритет, ID корисника или ID ознаке које радња користи; празно за радње без вредности.", + "is not": "није", + "{dimension} is not": "{dimension} није", + "Saved filters": "Сачувани филтери", + "No saved filters yet": "Још нема сачуваних филтера", + "Save filter": "Сачувај филтер", + "Rename \"{name}\"": "Преименуј „{name}”", + "Delete \"{name}\"": "Обриши „{name}”", + "Clear filters": "Очисти филтере", + "Showing {shown} of {total} tasks": "Приказано {shown} од {total} задатака", + "Me": "Ја", + "No date": "Без датума", + "Rename saved filter": "Преименуј сачувани филтер", + "Share with the project": "Подели са пројектом", + "Give the filter a name": "Дајте филтеру назив", + "Could not save the filter. Please try again.": "Филтер није могуће сачувати. Покушајте поново.", + "Some labels in \"{name}\" no longer exist and were left out.": "Неке ознаке у „{name}” више не постоје и изостављене су.", + "Could not delete the filter. Please try again.": "Филтер није могуће обрисати. Покушајте поново.", + "Saved filter": "Сачувани филтер", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Именовани филтер табле једног пројекта, приватан за особу која га је сачувала, осим ако је подељен са пројектом.", + "The project whose board the filter applies to": "Пројекат на чијој се табли филтер примењује", + "The name the filter is listed under": "Назив под којим је филтер на листи", + "Saved by": "Сачувао/ла", + "Nextcloud user id of the person who saved the filter": "Nextcloud ID корисника који је сачувао филтер", + "Shared with the project": "Подељено са пројектом", + "Whether every project member sees and applies the filter": "Да ли сваки члан пројекта види филтер и може да га примени", + "Criteria": "Критеријуми", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Филтер: задужена особа, ознака, приоритет и рок, сваки са јесте или није и својим вредностима", + "Cross-project view": "Међупројектни приказ", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Сачуван избор пројеката чији се задаци приказују заједно у колонама статуса, подељен са наведеним особама.", + "Shared with": "Подељено са", + "The name the view is listed under": "Назив под којим је приказ наведен", + "Nextcloud user id of the person who saved the view": "Nextcloud кориснички ID особе која је сачувала приказ", + "Nextcloud user ids of the people the view is shared with": "Nextcloud кориснички ID-ови особа са којима је приказ подељен", + "The projects whose tasks the view shows, at most twenty": "Пројекти чије задатке приказ приказује, највише двадесет", + "1 project in this view is hidden from you.": "1 пројекат у овом приказу је скривен од вас.", + "{count} projects in this view are hidden from you.": "Пројекти у овом приказу скривени од вас: {count}.", + "{project} has no column for {status}.": "Пројекат {project} нема колону за статус {status}.", + "This view does not exist or is not shared with you.": "Овај приказ не постоји или није подељен са вама.", + "\"{task}\" moved to {status}.": "\"{task}\" премештено у {status}.", + "Project: {title}": "Пројекат: {title}", + "Cross-project views": "Међупројектни прикази", + "New view": "Нови приказ", + "Edit view": "Уреди приказ", + "Delete view": "Обриши приказ", + "Give the view a name": "Дајте приказу назив", + "Pick at least one project": "Изаберите бар један пројекат", + "A view shows at most {max} projects": "Приказ приказује највише {max} пројеката", + "Could not save the view. Please try again.": "Приказ није могуће сачувати. Покушајте поново.", + "Could not delete the view. Please try again.": "Приказ није могуће обрисати. Покушајте поново.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Обрисати „{title}”? Пројекти и њихови задаци остају какви јесу.", + "People see the tasks of the projects they are in, never more.": "Свако види само задатке пројеката у којима је.", + "No views yet. A view shows the tasks of several of your projects together.": "Још нема приказа. Приказ приказује задатке више ваших пројеката заједно.", + "Projects in view: {count}": "Пројекти у приказу: {count}", + "Notify me when a task is assigned to me": "Обавести ме када ми се додели задатак", + "Also send these to me by email": "Шаљи ми их и е-поштом", + "Add an email address in your Nextcloud personal settings to get mail.": "Додајте адресу е-поште у личним подешавањима Nextcloud-а да бисте примали е-пошту.", + "Code link": "Веза ка коду", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, грана, захтев за спајање или пријава на платформи за код која се односи на задатак.", + "The task the link belongs to": "Задатак коме веза припада", + "The project of the task": "Пројекат задатка", + "Task key": "Кључ задатка", + "The task key the forge text named, such as VC-12": "Кључ задатка наведен у тексту платформе, нпр. VC-12", + "What the link points at": "На шта веза показује", + "Link": "Веза", + "The address of the item in the forge": "Адреса ставке на платформи за код", + "The commit message, branch name or merge request title": "Порука commit-а, назив гране или наслов захтева за спајање", + "Repository": "Репозиторијум", + "The repository, such as acme/portal": "Репозиторијум, нпр. acme/portal", + "Forge id": "Id на платформи", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Сопствени id ставке на платформи за код, нпр. github:acme/portal#42 или hash commit-а", + "State": "Стање", + "The state of a merge request or issue": "Стање захтева за спајање или пријаве", + "Who made the commit or opened the merge request": "Ко је направио commit или отворио захтев за спајање", + "When the commit was made or the merge request last changed": "Када је направљен commit или се захтев за спајање последњи пут променио", + "Added by": "Додао", + "Whether a person added the link or the integration wrote it": "Да ли је везу додала особа или ју је записала интеграција", + "Nextcloud user UIDs of project members": "Nextcloud кориснички ID-ови чланова пројекта", + "Add link": "Додај везу", + "Added by hand": "Додато ручно", + "Branch": "Грана", + "Code": "Код", + "Commit": "Commit", + "From the integration": "Из интеграције", + "Link to a commit, branch or merge request": "Веза ка commit-у, грани или захтеву за спајање", + "Merge request": "Захтев за спајање", + "Merged": "Спојено", + "No code linked yet. Name {key} in a commit message or paste a link.": "Још нема повезаног кода. Наведите {key} у поруци commit-а или налепите везу.", + "No code linked yet. Paste a link to a commit or merge request.": "Још нема повезаног кода. Налепите везу ка commit-у или захтеву за спајање.", + "Paste a web address that starts with https://.": "Налепите веб-адресу која почиње са https://.", + "Remove link {title}": "Уклони везу {title}", + "The link could not be added.": "Везу није било могуће додати.", + "The link could not be removed.": "Везу није било могуће уклонити.", + "This link is already on the task.": "Ова веза је већ на задатку.", + "Code forges": "Платформе за код", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Повежите commit-ове и pull request-ове са GitHub-а са задацима. Integriq прима догађаје; planninq никад не позива GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Преузмите конфигурацију и увезите је у Integriq. Затим упишите тајну у правило \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "У GitHub-у репозиторијуму додајте webhook са овом адресом и истом тајном. Изаберите тип садржаја application/json и догађаје push и pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Наведите кључ задатка, нпр. VC-12, у поруци commit-а, називу гране или наслову pull request-а. Веза се тада појављује на том задатку.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq-а чланови пројекта и даље могу да налепе везу на страници задатка.", + "Download the Integriq configuration": "Преузми Integriq конфигурацију", + "Calendar": "Календар", + "Previous": "Претходно", + "Calendar view": "Приказ календара", + "Starts:": "Почиње:", + "No tasks with a date in this month.": "Овог месеца нема задатака са датумом.", + "Week of {start} to {end}": "Недеља од {start} до {end}", + "My calendar": "Мој календар", + "Show as list": "Прикажи као листу", + "Show as calendar": "Прикажи као календар", + "Open my calendar": "Отвори мој календар", + "Nextcloud Tasks": "Nextcloud задаци", + "Show my tasks in Nextcloud Tasks": "Прикажи моје задатке у Nextcloud задацима", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Задаци додељени вама или подељени са вама појављују се на листи \"Planninq\" у Nextcloud задацима и календару. Измене направљене тамо замењују се следећом изменом у Planninq-у.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Овај сервер не може да пише у Nextcloud задатке, па извоз није доступан.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Њиме управља Planninq. Измене направљене овде замењују се следећом изменом у Planninq-у.", + "Working days and holidays": "Радни дани и празници", + "Dates set on the timeline skip the days that are not working days.": "Датуми постављени на временској линији прескачу дане који нису радни.", + "Working weekdays": "Радни дани у недељи", + "Non-working days": "Нерадни дани", + "No non-working days yet.": "Још нема нерадних дана.", + "Add day": "Додај дан", + "Year": "Година", + "Add Dutch national holidays": "Додај холандске државне празнике", + "Save working days": "Сачувај радне дане", + "Choose at least one working weekday.": "Изаберите бар један радни дан.", + "Working days saved.": "Радни дани су сачувани.", + "Could not save the working days.": "Радне дане није било могуће сачувати.", + "New Year's Day": "Нова година", + "Easter Sunday": "Васкрс", + "Easter Monday": "Васкршњи понедељак", + "King's Day": "Краљев дан", + "Liberation Day": "Дан ослобођења", + "Ascension Day": "Спасовдан", + "Whit Sunday": "Духови", + "Whit Monday": "Духовски понедељак", + "Christmas Day": "Божић", + "Boxing Day": "Други дан Божића", + "Dates of {title}": "Датуми за {title}", + "The due date cannot be before the start date.": "Рок не може бити пре датума почетка.", + "{title}, from {start} to {end}": "{title}, од {start} до {end}", + "The dates could not be saved.": "Датуме није било могуће сачувати.", + "{title} now runs from {start} to {end}": "{title} сада траје од {start} до {end}", + "Auto-scheduling": "Аутоматско планирање", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Када је укључено, каснији рок на временској линији нуди померање задатака које блокира.", + "Move blocked tasks along when a task slips": "Помери блокиране задатке када задатак касни", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На временској линији каснији рок нуди померање блокираних задатака. Броје се само везе \"блокира\", а задаци се померају само касније.", + "Move the tasks that wait for {title}?": "Померити задатке који чекају {title}?", + "These tasks wait for it and would start after its new due date:": "Ови задаци га чекају и почели би после новог рока:", + "{count} tasks would move; the first {limit} are listed.": "Померило би се {count} задатака; приказано је првих {limit}.", + "Now": "Сада", + "After the move": "После померања", + "Only this task": "Само овај задатак", + "Move all": "Помери све", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Заустављено код {title}: датуме није било могуће сачувати. Задаци пре њега су померени.", + "Cumulative flow": "Кумулативни ток", + "Show as chart": "Прикажи као графикон", + "Show as table": "Прикажи као табелу", + "Tasks per column per day": "Задаци по колони по дану", + "Tasks without recorded history in this period: {count}": "Задаци без забележене историје у овом периоду: {count}", + "Lead and cycle time": "Време испоруке и време циклуса", + "No tasks were finished in this period.": "У овом периоду није завршен ниједан задатак.", + "Finished tasks": "Завршени задаци", + "Cycle time, average": "Време циклуса, просек", + "Cycle time, 85th percentile": "Време циклуса, 85. перцентил", + "Lead time, average": "Време испоруке, просек", + "Tasks whose finish time was estimated from their history: {count}": "Задаци чије је време завршетка процењено из историје: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Време циклуса сваког завршеног задатка, са просеком и 85. перцентилом", + "Slowest tasks": "Најспорији задаци", + "cycle {cycle}, lead {lead}": "циклус {cycle}, испорука {lead}", + "{days} days": "{days} дана", + "Could not load the flow of this project.": "Ток овог пројекта није могуће учитати.", + "Last {days} days": "Последњих {days} дана", + "Portfolio flow": "Ток портфолија", + "An admin adds portfolios under Projects, Portfolios.": "Администратор додаје портфолије под Пројекти, Портфолији.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Пројекти који нису приказани јер се одједном приказује највише 50: {count}", + "Could not load the flow of this portfolio.": "Ток овог портфолија није могуће учитати.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Кумулативни ток и време циклуса кроз пројекте портфолија.", + "Edit report": "Уреди извештај", + "Only tasks where": "Само задаци где", + "Group by": "Групиши по", + "Display": "Приказ", + "Share with everyone who can read its projects": "Подели са свима који могу да читају његове пројекте", + "The report could not be saved.": "Извештај није могуће сачувати.", + "Number of tasks": "Број задатака", + "Bar": "Стубићи", + "Donut": "Прстен", + "Table": "Табела", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} од {total} пројеката у овом извештају није видљиво за вас", + "No tasks match this report.": "Ниједан задатак не одговара овом извештају.", + "None": "Ништа", + "Could not load this report.": "Овај извештај није могуће учитати.", + "Report": "Извештај", + "Your reports": "Ваши извештаји", + "My reports": "Моји извештаји", + "Shared reports": "Дељени извештаји", + "You have not built a report yet.": "Још нисте направили извештај.", + "Nobody has shared a report with you yet.": "Још нико није поделио извештај са вама.", + "Reports you built over tasks, and the ones shared with you.": "Извештаји које сте направили над задацима, и они подељени са вама.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Сачувани упит над задацима: који пројекти, који филтери, груписано по чему, пребројано или сабрано, и приказано као табела или графикон.", + "The name the report is listed under": "Назив под којим је извештај наведен", + "What the report shows and who it is for": "Шта извештај приказује и коме је намењен", + "Nextcloud user id of the person who saved the report": "Nextcloud ID корисника који је сачувао извештај", + "Who can open the report": "Ко може да отвори извештај", + "Only me": "Само ја", + "Everyone who can read its projects": "Сви који могу да читају његове пројекте", + "The projects the report covers, at most fifty": "Пројекти које извештај обухвата, највише педесет", + "Filters": "Филтери", + "Task fields and the value each must equal": "Поља задатка и вредност којој свако мора бити једнако", + "The task field the report groups on": "Поље задатка по којем извештај групише", + "Count the tasks, or add up a number on them": "Преброј задатке или саберите број на њима", + "Sum": "Збир", + "Sum of": "Збир поља", + "The number added up when the measure is a sum": "Број који се сабира када је мера збир", + "Story points": "Бодови приче", + "Estimated duration": "Процењено трајање", + "How the report is shown": "Како се извештај приказује", + "Issue type": "Врста захтева", + "Task fields and the value each must equal; empty when the report covers every task": "Поља задатка и вредност коју свако мора имати; празно када извештај обухвата све задатке", + "The status a task must have": "Статус који задатак мора имати", + "The priority a task must have": "Приоритет који задатак мора имати", + "The user a task must be assigned to": "Корисник коме задатак мора бити додељен", + "A label a task must carry": "Ознака коју задатак мора имати", + "The board column a task must be in": "Колона табле у којој задатак мора бити", + "The issue type a task must have": "Врста захтева коју задатак мора имати", + "Manager groups": "Групе руководилаца", + "Member groups": "Групе чланова", + "Viewer groups": "Групе читалаца", + "Viewers": "Читаоци", + "Owning group": "Власничка група", + "Nextcloud groups whose members manage the project": "Nextcloud групе чији чланови воде пројекат", + "Nextcloud groups whose members work on the project": "Nextcloud групе чији чланови раде на пројекту", + "Nextcloud groups whose members may read the project": "Nextcloud групе чији чланови смеју да читају пројекат", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud корисници који воде пројекат: подешавања, чланове и рад", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud корисници који смеју да читају пројекат и његов рад, али не и да га мењају", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud група која поседује пројекат заједно са његовим аутором, највише једна", + "Nextcloud user ids who may read this through the project": "Nextcloud корисници који ово смеју да читају кроз пројекат", + "Nextcloud groups whose members may change this through the project": "Nextcloud групе чији чланови ово смеју да мењају кроз пројекат", + "Nextcloud groups whose members may read this through the project": "Nextcloud групе чији чланови ово смеју да читају кроз пројекат", + "Search for a person or a group…": "Претражи особу или групу…", + "No one found. Your admin's sharing settings decide who you can find.": "Нико није пронађен. Подешавања дељења вашег администратора одређују кога можете да пронађете.", + "Type at least two characters": "Унесите најмање два знака", + "Everyone in this group": "Сви у овој групи", + "Could not search for people. Please try again.": "Претрага особа није успела. Покушајте поново.", + "Could not remove the group": "Групу није могуће уклонити", + "Only the owner and managers change who is on this project.": "Само власник и управитељи мењају ко је на овом пројекту.", + "Role of {name}": "Улога: {name}", + "Manager": "Управитељ", + "Member": "Члан", + "Viewer": "Читалац", + "Could not change the role": "Улогу није могуће променити", + "Owned by group: {name}": "У власништву групе: {name}", + "No group owns this project.": "Ниједна група није власник овог пројекта.", + "Owned by group": "У власништву групе", + "Search for a group…": "Потражи групу…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Није пронађена ниједна група. Подешавања дељења вашег администратора одређују које групе можете пронаћи.", + "No owning group": "Без групе власника", + "Could not search for groups. Please try again.": "Претрага група није успела. Покушајте поново.", + "Could not change the owning group": "Групу власника није могуће променити", + "You can read this project. Only its members change it.": "Овај пројекат можете да читате. Мењају га само његови чланови.", + "Course": "Предмет", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Предмет који се предаје на овом часу, на пример изборни предмет, када га школска апликација за учење познаје.", + "Online meeting link": "Веза за онлајн час", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Где се ученици придружују овом часу онлајн. Дугме Придружи се приказује се само за https везу." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sr.json b/l10n/sr.json index 825012e1..2e701d01 100644 --- a/l10n/sr.json +++ b/l10n/sr.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Активни пројекти", + "Archived projects": "Архивирани пројекти", + "Boards": "Табле", + "My projects": "Моји пројекти", + "Portfolio": "Портфолио", + "Project board": "Табла пројекта", + "Projects I am in": "Пројекти у којима учествујем", + "Timeline": "Временска линија", + "Timesheet": "Евиденција времена", + "Features & roadmap": "Функције и план развоја", + "Flow": "Ток", + "Flows": "Токови", + "Reports": "Извештаји", + "Pick a report to open it.": "Изаберите извештај да бисте га отворили.", + "In progress": "У току", + "Date": "Датум", + "Due": "Рок", + "Assignee": "Додељено", + "Who": "Ко", + "What": "Шта", + "Minutes": "Минути", + "Entries": "Уноси", + "Most recent": "Најновије", + "Per person": "По особи", + "By status": "По статусу", + "By priority": "По приоритету", + "Task status": "Статус задатака", + "Time spent": "Утрошено време", + "Capacity": "Капацитет", + "Due soonest": "Најскорији рок", + "Minutes logged": "Забележени минути", + "Nothing is due": "Ништа не доспева", + "Nothing logged yet": "Још ништа није забележено", + "What is open, what is blocked, and what is overdue.": "Шта је отворено, шта блокирано и шта касни.", + "How allocation is spread across the people working on projects.": "Како је оптерећење распоређено међу људима на пројектима.", + "Hours logged, and the projects they went to.": "Забележени сати и пројекти на које су отишли.", + "Billable": "Naplativo", + "Budget: {amount}": "Budžet: {amount}", + "Loading projects": "Učitavanje projekata", + "No projects for this client yet": "Još nema projekata za ovog klijenta", + "Open in Planninq": "Otvori u Planninq", + "This project could not be found": "Ovaj projekat nije pronađen", + "Untitled project": "Projekat bez naziva", + "and {count} more": "i još {count}", + "Store": "Продавница", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Инсталирајте регистре, шеме и токове које су објавиле друге организације.", + "Work Date": "Датум рада", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Радње колоне", + "Columns": "Колоне", + "Could not remove the column. Please try again.": "Колону није могуће уклонити. Покушајте поново.", + "Could not save the column. Please try again.": "Колону није могуће сачувати. Покушајте поново.", + "Done column": "Колона завршених", + "Edit column": "Уреди колону", + "Keep the card's status": "Задржи статус картице", + "Move its cards to": "Премести њене картице у", + "Move left": "Помери лево", + "Move right": "Помери десно", + "Status of cards moved here": "Статус картица премештених овде", + "The last done column cannot be removed.": "Последња колона завршених не може да се уклони.", + "WIP limit": "WIP ограничење", + "over limit": "изнад ограничења", + "The status a card gets when it is moved into this column.": "Статус који картица добија када се премести у ову колону.", + "All priorities": "Сви приоритети", + "Could not create the task. Please try again.": "Задатак није могуће направити. Покушајте поново.", + "Created": "Направљено", + "Move to backlog": "У заостатак", + "Move to board": "На таблу", + "New task": "Нови задатак", + "Nothing in the backlog": "Нема ничега у заостатку", + "Rank": "Ранг", + "Sort by": "Поређај по", + "Sort by rank to reorder": "Поређајте по рангу да бисте променили редослед", + "Task actions": "Радње задатка", + "All labels": "Све ознаке", + "Filter tasks by label": "Филтрирај задатке по ознаци", + "View timeline": "Прикажи временску линију", + "Board": "Табла", + "List": "Листа", + "Column": "Колона", + "Board or list": "Табла или листа", + "Log": "Дневник", + "Add entry": "Додај унос", + "Show": "Прикажи", + "No actions yet": "Још нема радњи", + "Closed": "Затворено", + "Entry actions": "Радње уноса", + "Add action": "Додај радњу", + "by {author}": "аутор {author}", + "saved {time}": "сачувано {time}", + "Attendees: {names}": "Присутни: {names}", + "Add the first entry": "Додај први унос", + "Issues": "Проблеми", + "Lessons learned": "Научене лекције", + "Meetings": "Састанци", + "Decisions": "Одлуке", + "Actions": "Радње", + "Issue": "Проблем", + "Lesson learned": "Научена лекција", + "Meeting": "Састанак", + "Decision": "Одлука", + "About this project": "О овом пројекту", + "No description yet": "Још нема описа", + "Start date": "Датум почетка", + "Not set": "Није постављено", + "End date": "Датум завршетка", + "Progress": "Напредак", + "No tasks yet": "Још нема задатака", + "Open the board": "Отвори таблу", + "People": "Особе", + "Owner": "Власник", + "Latest log entries": "Најновији уноси", + "Open the log": "Отвори дневник", + "{done} of {total} tasks done": "Готово {done} од {total} задатака", + "Edit entry": "Уреди унос", + "Type": "Врста", + "Attendees": "Присутни", + "Issue is closed": "Проблем је затворен", + "Could not save the entry. Please try again.": "Унос није могуће сачувати. Покушајте поново.", + "From: {title}": "Из: {title}", + "What needs to happen": "Шта треба урадити", + "Could not create the action. Please try again.": "Радњу није могуће направити. Покушајте поново.", + "The action was created but could not be linked to the entry.": "Радња је направљена, али није могуће повезати је са уносом.", + "Project pages": "Странице пројекта", + "Overview": "Преглед", + "Risks": "Ризици", + "Log entry": "Унос у дневник", + "A short name for the entry": "Кратак назив уноса", + "Project": "Пројекат", + "The project this entry belongs to": "Пројекат коме овај унос припада", + "What kind of entry this is": "Која је ово врста уноса", + "When it happened": "Када се догодило", + "What happened, in Markdown": "Шта се догодило, у Markdown-у", + "Whether an issue is still open": "Да ли је проблем још отворен", + "The people at a meeting": "Особе на састанку", + "Tasks that came out of this entry": "Задаци проистекли из овог уноса", + "Add risk": "Додај ризик", + "Risk": "Ризик", + "Score": "Оцена", + "Response": "Одговор", + "Review date": "Датум прегледа", + "no longer on the project": "више није на пројекту", + "Edit {title}": "Уреди {title}", + "No risks recorded yet": "Још нема забележених ризика", + "Add the first risk": "Додај први ризик", + "Medium": "Средње", + "Mitigating": "Ублажава се", + "Occurred": "Наступио", + "Avoid": "Избећи", + "Reduce": "Смањити", + "Transfer": "Пренети", + "Accept": "Прихватити", + "Highest open risks": "Највиши отворени ризици", + "No open risks": "Нема отворених ризика", + "Open the risk register": "Отвори регистар ризика", + "Edit risk": "Уреди ризик", + "What could go wrong": "Шта може поћи наопако", + "Likelihood": "Вероватноћа", + "Impact": "Утицај", + "Score {score}": "Оцена {score}", + "Countermeasures": "Противмере", + "Could not save the risk. Please try again.": "Ризик није могуће сачувати. Покушајте поново.", + "Risks by likelihood and impact": "Ризици по вероватноћи и утицају", + "Risk scale": "Скала ризика", + "The levels every project scores its risks on, and where low turns into medium and high": "Нивои на којима сваки пројекат оцењује своје ризике, и где ниско прелази у средње и високо", + "Number of levels": "Број нивоа", + "Likelihood labels": "Ознаке вероватноће", + "Impact labels": "Ознаке утицаја", + "Level {level}": "Ниво {level}", + "Medium from score": "Средње од оцене", + "High from score": "Високо од оцене", + "Risk scale saved": "Скала ризика је сачувана", + "1 risk uses level {level}. Change it first.": "1 ризик користи ниво {level}. Прво га промените.", + "{count} risks use level {level}. Change them first.": "Ризика који користе ниво {level}: {count}. Прво их промените.", + "Every level needs a label, and high must start above medium.": "Сваки ниво треба ознаку, а високо мора почети изнад средњег.", + "The project this risk belongs to": "Пројекат коме овај ризик припада", + "The cause and the effect, in Markdown": "Узрок и последица, у Markdown-у", + "Category": "Категорија", + "A free grouping, such as planning, budget or supplier": "Слободно груписање, нпр. планирање, буџет или добављач", + "How likely it is, on the admin's risk scale": "Колико је вероватно, на скали ризика администратора", + "How hard it would hit, on the admin's risk scale": "Колико би снажно погодило, на скали ризика администратора", + "Likelihood times impact, calculated by the server": "Вероватноћа пута утицај, израчунава сервер", + "Where the risk stands": "Где је ризик", + "The person who watches this risk": "Особа која прати овај ризик", + "How the project answers the risk": "Како пројекат одговара на ризик", + "What is done to prevent it or soften it, in Markdown": "Шта се ради да се спречи или ублажи, у Markdown-у", + "When to look at this risk again": "Када поново прегледати овај ризик", + "Very low": "Веома ниско", + "Very high": "Веома високо", + "All projects": "Сви пројекти", + "Project status report": "Извештај о стању пројекта", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датирани извештај о томе како пројекат стоји са новцем, организацијом, временом, информацијама, квалитетом и ризиком (GROTIK аспекти), сваки са белешком.", + "The project this report is about": "Пројекат на који се извештај односи", + "Report date": "Датум извештаја", + "The day the report describes": "Дан који извештај описује", + "Money": "Новац", + "How the project stands on this aspect": "Како пројекат стоји у овом аспекту", + "On track": "По плану", + "At risk": "Угрожено", + "Off track": "Ван плана", + "Money note": "Белешка о новцу", + "A short explanation of this status": "Кратко објашњење овог стања", + "Organisation": "Организација", + "Organisation note": "Белешка о организацији", + "Time": "Време", + "Time note": "Белешка о времену", + "Information": "Информације", + "Information note": "Белешка о информацијама", + "Quality": "Квалитет", + "Quality note": "Белешка о квалитету", + "Risk note": "Белешка о ризику", + "Overall": "Укупно", + "The worst of the six statuses, calculated by the server": "Најлошије од шест стања, израчунава га сервер", + "Health: money": "Стање: новац", + "Copied from the newest status report": "Преузето из најновијег извештаја о стању", + "Health: organisation": "Стање: организација", + "Health: time": "Стање: време", + "Health: information": "Стање: информације", + "Health: quality": "Стање: квалитет", + "Health: risk": "Стање: ризик", + "Health: overall": "Стање: укупно", + "Health: report date": "Стање: датум извештаја", + "The date of the newest status report": "Датум најновијег извештаја о стању", + "New report": "Нови извештај", + "Only the project owner writes status reports.": "Извештаје о стању пише само власник пројекта.", + "Latest report, {date}": "Последњи извештај, {date}", + "Aspect": "Аспект", + "Note": "Белешка", + "Report history": "Историја извештаја", + "Author": "Аутор", + "No status reports yet": "Још нема извештаја о стању", + "Write the first report": "Напиши први извештај", + "Choose a status for every aspect to save the report.": "Да бисте сачували извештај, изаберите стање за сваки аспект.", + "Suggested: on track.": "Предлог: по плану.", + "Suggested: at risk.": "Предлог: угрожено.", + "Suggested: off track.": "Предлог: ван плана.", + "1 task is past its due date.": "1 задатак је прекорачио рок.", + "{count} tasks are past their due date.": "Задаци који су прекорачили рок: {count}.", + "The end date has passed with 1 open task.": "Датум завршетка је прошао са 1 отвореним задатком.", + "The end date has passed with {count} open tasks.": "Датум завршетка је прошао, отворени задаци: {count}.", + "No open task is past its due date.": "Ниједан отворени задатак није прекорачио рок.", + "The highest open risk, \"{title}\", scores {score}.": "Највећи отворени ризик, \"{title}\", има оцену {score}.", + "There are no open risks.": "Нема отворених ризика.", + "Costs are at {percent}% of the budget.": "Трошкови су на {percent}% буџета.", + "No suggestion: the project has no budget.": "Нема предлога: пројекат нема буџет.", + "No suggestion: no costs are recorded for this project yet.": "Нема предлога: за овај пројекат још нису евидентирани трошкови.", + "The report was not saved. Only the project owner can write status reports.": "Извештај није сачуван. Извештаје о стању може писати само власник пројекта.", + "No report": "Нема извештаја", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Група пројеката које воде исти људи, на пример одељење или програм. Њени руководиоци читају сваки пројекат у њој.", + "The name of the portfolio": "Назив портфолија", + "What the portfolio holds and who runs it": "Шта портфолио садржи и ко га води", + "A colour for the portfolio's section in project lists": "Боја одељка портфолија у листама пројеката", + "Managers": "Руководиоци", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud кориснички ID-јеви људи који воде портфолио", + "Order": "Редослед", + "Where the portfolio comes in project lists, lowest first": "Где је портфолио у листама пројеката, најнижи први", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Сопствена скала ризика овог портфолија као JSON, у истом облику као скала целе апликације. Празно значи скалу апликације.", + "Portfolio readers": "Читаоци портфолија", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud кориснички ID-јеви руководилаца портфолија пројекта", + "The portfolio this project belongs to": "Портфолио коме овај пројекат припада", + "No portfolio": "Без портфолија", + "All portfolios": "Сви портфолији", + "You read this project as a manager of its portfolio. Only its members change it.": "Овај пројекат читате као руководилац његовог портфолија. Мењају га само његови чланови.", + "Portfolios": "Портфолији", + "Portfolio status": "Стање портфолија", + "No portfolios yet": "Још нема портфолија", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Администратор додаје портфолије у Пројекти, Портфолији. Пројекти у портфолију овде су наведени са својим стањем.", + "Roll-up": "Сажетак", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} по плану, {atRisk} угрожено, {offTrack} ван плана, {noReport} без извештаја", + "No project in this portfolio that you can read.": "У овом портфолију нема пројекта који можете да читате.", + "Start": "Почетак", + "End": "Крај", + "Budget": "Буџет", + "Last report": "Последњи извештај", + "Out of date": "Застарело", + "Portfolio timeline": "Временска линија портфолија", + "Zoom": "Зумирање", + "Could not load the timeline": "Временска линија није могла да се учита", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Администратор додаје портфолије у Пројекти, Портфолији. Пројекти у портфолију овде су на једној временској линији.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Отворите пројекат да видите његове фазе и задатке. Временска линија је само за читање.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Изостављено јер не можете да их читате: {count} пројеката", + "Week": "Недеља", + "Day": "Дан", + "Month": "Месец", + "Please try again later.": "Покушајте поново касније.", + "Status reports": "Извештаји о стању", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "После колико дана се последњи извештај о стању пројекта у прегледу портфолија означава као застарео", + "Reporting period (days)": "Период извештавања (дани)", + "The reporting period is a whole number of days from 1 to 365.": "Период извештавања је цео број дана од 1 до 365.", + "Reporting period saved": "Период извештавања сачуван", + "The reporting period was not saved. Please try again.": "Период извештавања није сачуван. Покушајте поново.", + "Every project of a portfolio with its status per aspect, rolled up.": "Сваки пројекат портфолија са стањем по аспектима, сажето.", + "The projects of a portfolio on one timeline.": "Пројекти портфолија на једној временској линији.", + "Phases": "Фазе", + "Add phase": "Додај фазу", + "No phases yet": "Још нема фаза", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Поделите пројекат на фазе, нпр. покретање, дефиницију и реализацију. Фаза се затвара када се отпреми њен завршни документ.", + "{hours} hours": "{hours} сати", + "Concluding document: {title}": "Завршни документ: {title}", + "Concluding document missing": "Недостаје завршни документ", + "Move {title} up": "Помери {title} горе", + "Move {title} down": "Помери {title} доле", + "Close phase": "Затвори фазу", + "Phase": "Фаза", + "Files": "Датотеке", + "Notes": "Белешке", + "Audit trail": "Ревизорски траг", + "Edit phase": "Уреди фазу", + "Name": "Назив", + "Budget hours": "Планирани сати", + "Could not save the phase. Please try again.": "Фаза није могла да се сачува. Покушајте поново.", + "Close phase {title}": "Затвори фазу {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фаза се затвара завршним документом: отпремите га овде или изаберите једну од датотека фазе.", + "Concluding document": "Завршни документ", + "This phase has no files yet.": "Ова фаза још нема датотека.", + "Upload a document": "Отпреми документ", + "The document was not uploaded. Please try again.": "Документ није отпремљен. Покушајте поново.", + "Upload the concluding document before you close this phase.": "Отпремите завршни документ пре него што затворите ову фазу.", + "This phase cannot be closed from its current status.": "Ова фаза не може да се затвори из тренутног стања.", + "The phase was not closed. Please try again.": "Фаза није затворена. Покушајте поново.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ИД датотеке ове фазе која је затвара. Фаза може да се заврши тек када је постављен и датотека приложена.", + "Import from Microsoft Project": "Увези из Microsoft Project-а", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Изаберите план сачуван из Microsoft Project-а у XML формату. Ништа се не увози док не потврдите.", + "Plan file": "Датотека плана", + "What the import creates": "Шта увоз прави", + "Tasks": "Задаци", + "Sub-tasks": "Подзадаци", + "Milestones": "Прекретнице", + "Links": "Везе", + "Already imported, updated in place: {count}": "Већ увезено, ажурирано на месту: {count}", + "What does not carry over": "Шта се не преноси", + "Tasks with resources, which are not imported: {count}": "Задаци са ресурсима, који се не увозе: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Задаци дубље од нивоа 3, смештени под свој задатак нивоа 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Везе осим крај-почетак, увезене као повезане везе: {count}", + "Link lags, which are dropped: {count}": "Кашњења веза, која се одбацују: {count}", + "Links to a summary task, which are not imported: {count}": "Везе ка збирном задатку, које се не увозе: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Везе ка задацима ван овог плана, које се не увозе: {count}", + "No longer in the plan": "Више није у плану", + "These stay in the project; remove them yourself if they are no longer needed.": "Остају у пројекту; уклоните их сами ако више нису потребни.", + "Import": "Увези", + "Close": "Затвори", + "The plan is imported: {created} created, {updated} updated.": "План је увезен: направљено {created}, ажурирано {updated}.", + "Links that would close a loop were left out: {count}": "Везе које би затвориле петљу изостављене су: {count}", + "The import stopped part-way. Run it again to finish it.": "Увоз је стао на пола пута. Покрените га поново да га завршите.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Сачувајте план у Microsoft Project-у преко Датотека, Сачувај као, XML формат, и увезите ту датотеку.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Ова датотека декларише DOCTYPE или ентитете, који се не прихватају.", + "The file is larger than 10 MB.": "Датотека је већа од 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "План има више од 2.000 задатака, више него што један увоз прима.", + "This file is not a Microsoft Project plan in XML format.": "Ова датотека није план Microsoft Project-а у XML формату.", + "Choose a file to import.": "Изаберите датотеку за увоз.", + "Only the project owner can import a plan.": "Само власник пројекта може да увезе план.", + "The plan could not be read. Please try again.": "План није могуће прочитати. Покушајте поново.", + "Linked case: {title}": "Повезани предмет: {title}", + "Linked to a case": "Повезано са предметом", + "Hand over to case": "Предај предмету", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Непромењено копира сваку датотеку пројекта и његових задатака и датотеку која описује пројекат у повезани предмет.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Копиране датотеке: {count}", + "Files that failed: {names}": "Неуспеле датотеке: {names}", + "The handover failed. Please try again.": "Предаја није успела. Покушајте поново.", + "The linked case could not be found, or you cannot open it.": "Повезани предмет није пронађен или не можете да га отворите.", + "Case handovers": "Предаје предмету", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Свака предаја датотека и метаподатака пројекта његовом предмету: када, ко, ком предмету, свака копирана датотека са њеним SHA-256 и неуспеле датотеке.", + "Finance": "Финансије", + "Add cost line": "Додај ставку трошка", + "Delivery terms": "Услови испоруке", + "Billing model": "Модел наплате", + "Budget in euro": "Буџет у еврима", + "Budget in hours": "Буџет у сатима", + "Hourly rate in euro": "Сатница у еврима", + "Planned start": "Планирани почетак", + "Planned end": "Планирани крај", + "Planned dates": "Планирани датуми", + "Budget {amount}": "Буџет {amount}", + "No budget agreed": "Буџет није договорен", + "Hours": "Сати", + "Only the project owner and the portfolio managers see the amounts.": "Износе виде само власник пројекта и менаџери портфолија.", + "Budget against cost per category": "Буџет у односу на трошкове по категорији", + "Labour (booked time)": "Рад (евидентирани сати)", + "No category": "Без категорије", + "Hours are not available": "Сати нису доступни", + "Not yet assigned to a category": "Још није додељено категорији", + "Total": "Укупно", + "{spent} spent, {remaining} remaining": "{spent} потрошено, {remaining} преостало", + "Budget against cost per phase": "Буџет у односу на трошкове по фази", + "No phase": "Без фазе", + "Cost lines": "Ставке трошка", + "From the finance system": "Из финансијског система", + "Edit cost line {amount}": "Уреди ставку трошка {amount}", + "No cost lines yet": "Још нема ставки трошка", + "Commitments": "Обавезе", + "Actual cost": "Стварни трошак", + "Forecast": "Прогноза", + "Remaining": "Преостало", + "Not planned yet": "Још није планирано", + "{start} to {end}": "{start} до {end}", + "The terms were not saved. Please try again.": "Услови нису сачувани. Покушајте поново.", + "Terms saved": "Услови сачувани", + "Fixed price": "Фиксна цена", + "Hourly": "По сату", + "Not billed": "Не наплаћује се", + "Commitment": "Обавеза", + "Edit cost line": "Уреди ставку трошка", + "Kind": "Врста", + "Amount in euro": "Износ у еврима", + "Remove": "Уклони", + "Could not save the cost line. Only the project owner changes the money of a project.": "Ставку трошка није могуће сачувати. Новац пројекта мења само власник пројекта.", + "Could not remove the cost line. Please try again.": "Ставку трошка није могуће уклонити. Покушајте поново.", + "{amount} over budget": "{amount} изнад буџета", + "Cost categories": "Категорије трошкова", + "The categories every project splits its budget and costs into, one per line": "Категорије на које сваки пројекат дели свој буџет и трошкове, једна по реду", + "Categories": "Категорије", + "Give at least one category, each name once.": "Наведите бар једну категорију, сваки назив једном.", + "Cost categories saved": "Категорије трошкова сачуване", + "The cost categories were not saved. Please try again.": "Категорије трошкова нису сачуване. Покушајте поново.", + "Finance line": "Финансијска ставка", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Један новчани износ пројекта: буџет, обавеза, стварни трошак или прогноза, у категорији трошкова и по жељи у фази. Уноси је власник пројекта или је шаље финансијски систем преко апликације за интеграцију.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Пројекат коме износ припада. Празно за ставку из финансијског система чији број пројекта не одговара ниједном пројекту.", + "The phase this amount belongs to, if any": "Фаза којој износ припада, ако постоји", + "The cost category, one of the categories the admin set up": "Категорија трошкова, једна од категорија које је подесио администратор", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Да ли је износ буџет, обавеза, стварни трошак или прогноза", + "Amount": "Износ", + "The amount in the reporting currency (euro)": "Износ у извештајној валути (евро)", + "The date the amount was booked or is expected": "Датум када је износ књижен или се очекује", + "What the amount is for": "За шта је износ", + "Whether a person entered the line or the finance system sent it": "Да ли је ставку унела особа или ју је послао финансијски систем", + "Entered by hand": "Унето ручно", + "Finance line id": "Ид финансијске ставке", + "The finance system's own id of this line. One imported line per id.": "Сопствени ид ове ставке у финансијском систему. Једна увезена ставка по иду.", + "Project number": "Број пројекта", + "The project number the finance system sent, matched against the project key": "Број пројекта који је послао финансијски систем, упоређен са кључем пројекта", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Портфолио пројекта ставке, преузет са пројекта да би збирови портфолија требали један филтер", + "Finance readers": "Читаоци финансија", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID-ови корисника Nextcloud-а који смеју да виде овај износ: власник пројекта и менаџери његовог портфолија", + "Project owner": "Власник пројекта", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID корисника Nextcloud-а власника пројекта, који сме да мења и уклања ручне ставке", + "How the client pays: not billed, a fixed price, or by the hour.": "Како клијент плаћа: не наплаћује се, фиксна цена или по сату.", + "Portfolio finance": "Финансије портфолија", + "You cannot see the money of any project in this portfolio": "Не можете да видите новац ниједног пројекта у овом портфолију", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Сервер је вратио ставке трошка пројеката ван овог портфолија, па ови збирови могу бити погрешни.", + "Projects left out because you cannot see their money: {count}": "Изостављени пројекти јер не можете да видите њихов новац: {count}", + "Unmatched finance lines": "Неповезане финансијске ставке", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Буџет, обавезе, стварни трошак и прогноза сабрани за портфолио.", + "Subprojects": "Потпројекти", + "{done} of {total}": "{done} од {total}", + "{done} of {total} tasks done, including subprojects": "{done} од {total} задатака готово, укључујући потпројекте", + "Show the subprojects of {title}": "Прикажи потпројекте {title}", + "Hide the subprojects of {title}": "Сакриј потпројекте {title}", + "Part of": "Део", + "No parent project": "Без надређеног пројекта", + "A project cannot sit under one of its own subprojects.": "Пројекат не може бити испод једног од својих потпројеката.", + "Projects nest three levels deep at most: programme, project and subproject.": "Пројекти се угнежђују највише три нивоа дубоко: програм, пројекат и потпројекат.", + "Parent project": "Надређени пројекат", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Пројекат испод ког је овај пројекат, нпр. програм. Пројекти се угнежђују највише три нивоа дубоко.", + "Yes": "Да", + "No": "Не", + "{label} (required)": "{label} (обавезно)", + "{label} is required": "{label} је обавезно", + "Project field": "Поље пројекта", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поље које администратор додаје сваком пројекту, нпр. област политике или вредност уговора.", + "Key": "Кључ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Стални назив под којим се вредност чува, у lower camel case. Задржите га када га пројекти користе.", + "Label": "Ознака", + "The name people see next to the field": "Назив који људи виде поред поља", + "What the field holds": "Шта поље садржи", + "Text": "Текст", + "Number": "Број", + "Choice": "Избор", + "Person": "Особа", + "Yes or no": "Да или не", + "Options": "Опције", + "The choices of a choice field": "Опције поља избора", + "Required": "Обавезно", + "Whether a project must fill in the field": "Да ли пројекат мора да попуни поље", + "Where the field appears, lowest first": "Где се поље појављује, најниже прво", + "Applies to": "Важи за", + "What the field is added to": "Чему се поље додаје", + "Custom fields": "Сопствена поља", + "The values of the project fields an admin defined, keyed by the field's key.": "Вредности поља пројекта која је дефинисао администратор, према кључу поља.", + "Project fields": "Поља пројекта", + "Related": "Повезано", + "Remove link": "Уклони везу", + "Link type": "Врста везе", + "Relates to": "Повезано са", + "Duplicates": "Дуплира", + "Project key": "Кључ пројекта", + "Every task number starts with it, such as VERG-42.": "Сваки број задатка почиње њиме, на пример VERG-42.", + "This key is already used by another project.": "Овај кључ већ користи други пројекат.", + "Use 2 to 10 letters and digits, starting with a letter.": "Користите од 2 до 10 слова и цифара, почевши словом.", + "The key cannot change once tasks carry it.": "Кључ се не може променити када га задаци носе.", + "Project saved. The existing tasks get their numbers in the background.": "Пројекат је сачуван. Постојећи задаци добијају бројеве у позадини.", + "Next task number": "Број следећег задатка", + "The number the next task of this project gets in its key. Only the system writes it.": "Број који следећи задатак овог пројекта добија у свом кључу. Уписује га само систем.", + "Restore {title}": "Врати {title}", + "Restore": "Врати", + "Project restored": "Пројекат је враћен", + "Could not restore the project": "Пројекат није могуће вратити", + "Bring this project back to the active list.": "Врати овај пројекат на списак активних пројеката.", + "Restore project": "Врати пројекат", + "Request reason": "Разлог захтева", + "Why the requester needs this project. Filled in when the project is requested.": "Зашто подносиоцу треба овај пројекат. Попуњава се при захтеву.", + "Reviewed by": "Прегледао", + "The user who approved or rejected the request.": "Корисник који је одобрио или одбио захтев.", + "Reviewed at": "Прегледано", + "When the request was approved or rejected.": "Када је захтев одобрен или одбијен.", + "Review note": "Напомена прегледача", + "The reviewer's reason, shown to the requester when a request is not approved.": "Разлог прегледача који подносилац види када захтев није одобрен.", + "Members of these groups": "Чланови ових група", + "Groups that may create projects": "Групе које смеју да праве пројекте", + "The group {group} no longer exists. Save to remove it.": "Група {group} више не постоји. Сачувајте да бисте је уклонили.", + "Review project request": "Прегледај захтев за пројекат", + "Requested by": "Затражио", + "Why it is needed": "Зашто је потребан", + "Desired start date": "Жељени датум почетка", + "Why is it not approved?": "Зашто није одобрен?", + "Give a reason. The requester sees it.": "Наведите разлог. Подносилац ће га видети.", + "Approve": "Одобри", + "Reject": "Одбиј", + "Reject request": "Одбиј захтев", + "The review was not saved. Try again.": "Преглед није сачуван. Покушајте поново.", + "This project is waiting for review": "Овај пројекат чека преглед", + "This request was not approved": "Овај захтев није одобрен", + "Reason: {note}": "Разлог: {note}", + "Review request": "Прегледај захтев", + "Request a project": "Затражи пројекат", + "Step {step} of 2": "Корак {step} од 2", + "Why is this project needed?": "Зашто је овај пројекат потребан?", + "Give a reason. The reviewer reads it.": "Наведите разлог. Прегледач ће га прочитати.", + "Back": "Назад", + "Next": "Даље", + "Send request": "Пошаљи захтев", + "The request was not sent. Try again.": "Захтев није послат. Покушајте поново.", + "Requested": "Затражено", + "Not approved": "Није одобрено", + "Your request was sent": "Ваш захтев је послат", + "Let everyone else request a project": "Дозволи свима осталима да затраже пројекат", + "Add a task": "Додај задатак", + "Delete task": "Обриши задатак", + "Edit task": "Уреди задатак", + "Write": "Пиши", + "Preview": "Преглед", + "Markdown works here: headings, lists and links.": "Овде ради Markdown: наслови, листе и везе.", + "Could not save the task. Please try again.": "Задатак није могуће сачувати. Покушајте поново.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "На задатку \"{title}\" је евидентирано време, па се не може обрисати. Уместо тога можете га отказати: записи времена остају.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Обрисати \"{title}\"? Уклониће се и његове везе са другим задацима. Ово се не може поништити.", + "Keep task": "Задржи задатак", + "Cancel task": "Откажи задатак", + "Only the reporter, the project owner or an admin can delete this task.": "Овај задатак може обрисати само пријавилац, власник пројекта или администратор.", + "Could not delete the task. Please try again.": "Задатак није могуће обрисати. Покушајте поново.", + "Could not cancel the task. Please try again.": "Задатак није могуће отказати. Покушајте поново.", + "Responsible": "Одговорна особа", + "Also working on this": "На овоме раде и", + "Labels": "Ознаке", + "Could not change the priority. Please try again.": "Приоритет није могуће променити. Покушајте поново.", + "Other project members who work on this task alongside the person responsible.": "Остали чланови пројекта који на овом задатку раде заједно са одговорном особом.", + "Duplicate": "Дуплирај", + "Could not copy the task. Please try again.": "Задатак није могуће копирати. Покушајте поново.", + "Subtasks": "Подзадаци", + "{done} of {total} done": "Готово {done} од {total}", + "Add a subtask": "Додај подзадатак", + "Checklist": "Контролна листа", + "Checklist item actions": "Радње ставке листе", + "Add a checklist item": "Додај ставку листе", + "Subtasks: {estimate} estimated, {logged} logged": "Подзадаци: процена {estimate}, евидентирано {logged}", + "Total estimate: {total}": "Укупна процена: {total}", + "Part of {title}": "Део задатка {title}", + "Checklist: {count} done": "Контролна листа: готово {count}", + "This task has subtasks: {count}.": "Овај задатак има подзадатке: {count}.", + "Keep subtasks as separate tasks": "Задржи подзадатке као засебне задатке", + "Delete subtasks too": "Обриши и подзадатке", + "Copy of {title}": "Копија: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Задатак је копиран, али не и сви његови подзадаци. Проверите копију.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Мали кораци унутар задатка. Свака ставка има id, текст и податак да ли је готова.", + "Open work per person and per project.": "Отворени посао по особи и по пројекту.", + "View": "Приказ", + "By person": "По особи", + "By project": "По пројекту", + "Hours left": "Преостали сати", + "Tasks without an estimate": "Задаци без процене", + "Due in 14 days": "Рок у 14 дана", + "Shared": "Дељено", + "Unassigned": "Недодељено", + "{hours} h": "{hours} ч", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Приказује се посао у пројектима које можете да видите. Сати се рачунају одговорној особи; дељени задаци рачунају се без сати.", + "No open work in these projects.": "Нема отвореног посла у овим пројектима.", + "Open work": "Отворени посао", + "{count} open tasks": "{count} отворених задатака", + "Create a project to see capacity here.": "Направите пројекат да бисте овде видели капацитет.", + "My tasks": "Моји задаци", + "Show all my tasks": "Прикажи све моје задатке", + "No tasks assigned to you": "Немате додељених задатака", + "Browse projects": "Прегледај пројекте", + "Later": "Касније", + "Due {date}": "Рок {date}", + "Could not change the status. Please try again.": "Статус није могуће променити. Покушајте поново.", + "Completed today": "Завршено данас", + "My open tasks": "Моји отворени задаци", + "My overdue tasks": "Моји задаци у кашњењу", + "My tasks in progress": "Моји задаци у току", + "Pin to the top": "Закачи на врх", + "Unpin": "Откачи", + "Pinned": "Закачено", + "Actions for {title}": "Радње за {title}", + "Could not save your project order. Please try again.": "Редослед пројеката није могуће сачувати. Покушајте поново.", + "No boards yet": "Још нема табли", + "Create a project to get a board.": "Направите пројекат да бисте добили таблу.", + "Use the Projects page to create and manage your projects and tasks.": "На страници Пројекти правите пројекте и задатке и управљајте њима.", + "Go to projects": "Иди на пројекте", + "You are not a member of any projects yet.": "Још нисте члан ниједног пројекта.", + "Could not search for users. Please try again.": "Претрага корисника није успела. Покушајте поново.", + "Project creation is restricted to administrators.": "Пројекте могу да праве само администратори.", + "Only the project owner or an administrator can delete this project.": "Овај пројекат може да обрише само власник пројекта или администратор.", + "No projects are available to you yet. Ask an administrator to create one.": "Још немате доступних пројеката. Замолите администратора да направи један.", + "Due: {date}": "Рок: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Задаци са датумом почетка или роком приказују се на временској линији. Додајте датуме да бисте их овде видели.", + "You do not have access to this project.": "Немате приступ овом пројекту.", + "Zoom level": "Ниво зумирања", + "Unscheduled": "Непланирано", + "Start: {date}": "Почетак: {date}", + "Today": "Данас", + "No scheduled tasks": "Нема планираних задатака", + "An unexpected error occurred.": "Дошло је до неочекиване грешке.", + "Column {number} name": "Назив колоне {number}", + "Failed to save creation policy": "Правило прављења није могуће сачувати", + "All authenticated users": "Сви пријављени корисници", + "Control who may create new projects": "Одредите ко сме да прави нове пројекте", + "Administrators only": "Само администратори", + "Project creation": "Прављење пројеката", + "Allow project creation": "Дозволи прављење пројеката", + "Creation policy saved successfully": "Правило прављења сачувано", + "Initializing…": "Покретање…", + "e.g. 2h 30m, 90m, 1.5h": "нпр. 2h 30m, 90m, 1.5h", + "Log time": "Упиши време", + "Save estimate": "Сачувај процену", + "Logged: {logged}": "Уписано: {logged}", + "over by {amount}": "прекорачено за {amount}", + "Time tracking": "Евиденција времена", + "Estimate": "Процена", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Унесите исправну процену (нпр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Унесите исправно трајање (нпр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Унос времена није могуће сачувати. Покушајте поново.", + "Edit time entry": "Уреди унос времена", + "Duration": "Трајање", + "Date range": "Период", + "Last week": "Прошла недеља", + "No time logged": "Нема уписаног времена", + "Log time on a task to see it here.": "Упишите време на задатак да бисте га овде видели.", + "To date": "До датума", + "This week": "Ова недеља", + "Total: {total}": "Укупно: {total}", + "From date": "Од датума", + "Custom range": "Прилагођени период", + "All time": "Све време", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Задатак није могуће обрисати па подаци могу остати. Поново обришите пројекат.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Унос времена није могуће обрисати па подаци могу остати. Поново обришите пројекат.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Колону није могуће обрисати па подаци могу остати. Поново обришите пројекат.", + "Could not delete the project. Please try again.": "Пројекат није могуће обрисати. Покушајте поново.", + "Notification settings": "Подешавања обавештења", + "Configure when due-date reminders are sent": "Одредите када се шаљу подсетници на рокове", + "Due-date reminder lead time (hours)": "Време подсетника пре рока (сати)", + "Lead time must be between 1 and 336 hours": "Време мора бити између 1 и 336 сати", + "Reminder lead time saved successfully": "Време подсетника сачувано", + "Failed to save reminder lead time": "Време подсетника није могуће сачувати", + "Notifications": "Обавештења", + "Notify me 1 day before a task's due date": "Обавести ме 1 дан пре рока задатка", + "Draft": "Нацрт", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Да ли је час нацрт који види само његов наставник, одржава ли се или је отказан.", + "New release": "Ново издање", + "Roadmap chart. The same releases and epics are listed below.": "Графикон плана развоја. Иста издања и епови наведени су испод.", + "Nothing on the roadmap yet": "Још ништа на плану развоја", + "Releases with a target date and epics with dated tasks appear here.": "Овде се приказују издања са циљним датумом и епови са задацима који имају датум.", + "Releases": "Издања", + "No releases yet": "Још нема издања", + "Target date: {date}": "Циљни датум: {date}", + "No target date": "Нема циљног датума", + "Edit {name}": "Уреди {name}", + "Mark {name} as released": "Означи {name} као објављено", + "Mark as released": "Означи као објављено", + "Epics": "Епови", + "No epics yet. Open a task to make it an epic.": "Још нема епова. Отворите задатак да бисте га претворили у еп.", + "Not scheduled yet": "Још није заказано", + "Planned": "Планирано", + "Released": "Објављено", + "Edit release": "Уреди издање", + "Target date": "Циљни датум", + "Could not save the release. Please try again.": "Издање није могуће сачувати. Покушајте поново.", + "Every task of this release is done or cancelled.": "Сваки задатак овог издања је завршен или отказан.", + "Not finished yet: {count}": "Још није завршено: {count}", + "What happens to these tasks?": "Шта се дешава са овим задацима?", + "Move to {name}": "Премести у {name}", + "Remove the release": "Уклони издање", + "Keep it on {name}": "Остави их у {name}", + "Could not mark the release as released. Please try again.": "Издање није могуће означити као објављено. Покушајте поново.", + "Roadmap": "План развоја", + "Tasks or roadmap": "Задаци или план развоја", + "Release": "Издање", + "Epic": "Еп", + "This task is an epic": "Овај задатак је еп", + "A named, dated delivery of a project that its tasks are planned against.": "Именована испорука пројекта са датумом према којој се планирају његови задаци.", + "Name of the release": "Назив издања", + "The project this release belongs to": "Пројекат коме припада ово издање", + "What this release delivers": "Шта ово издање испоручује", + "When work on the release starts": "Када почиње рад на издању", + "The date the release is due": "Датум до ког издање треба да буде готово", + "Whether the release is planned, released or archived": "Да ли је издање планирано, објављено или архивирано", + "Released on": "Објављено", + "When the release was marked as released": "Када је издање означено као објављено", + "The release this task is planned for": "Издање за које је овај задатак планиран", + "Board view options": "Опције приказа табле", + "Colour cards": "Обоји картице", + "No colour": "Без боје", + "By label": "По ознаци", + "Swimlanes": "Стазе", + "No swimlanes": "Без стаза", + "By assignee": "По задуженој особи", + "By epic": "По епику", + "No assignee": "Није додељено", + "No epic": "Без епика", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Картице остају у реду свог епика. Промените епик на страници задатка.", + "Hand over to": "Предај", + "Could not save your board view. It applies until you reload.": "Приказ табле није сачуван. Важи до поновног учитавања.", + "Timetable wish": "Želja za raspored", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Želja koju generator uzima u obzir. Čvrstu želju uvek poštuje, meku gde može.", + "Whether the wish is about a teacher, a group, a room or one activity": "Da li se želja odnosi na nastavnika, grupu, prostoriju ili jednu aktivnost", + "Teacher": "Nastavnik", + "Group": "Grupa", + "Reference": "Referenca", + "The user, group, room or activity the wish is about": "Korisnik, grupa, prostorija ili aktivnost na koju se želja odnosi", + "What the wish asks for": "Šta želja traži", + "Not on these periods": "Ne u ovim časovima", + "Preferably not on these periods": "Radije ne u ovim časovima", + "At most a number of lessons a day": "Najviše određen broj časova dnevno", + "No free periods between lessons": "Bez rupa između časova", + "Always the same room": "Uvek ista prostorija", + "Periods": "Časovi", + "The periods of the week the wish is about, such as wed-5": "Časovi u nedelji na koje se želja odnosi, npr. wed-5", + "Limit": "Granica", + "The most lessons a day, for a wish of that kind": "Najviše časova dnevno, za želju te vrste", + "Strength": "Jačina", + "Whether the generator must keep the wish or should keep it": "Da li generator mora ili bi trebalo da poštuje želju", + "Hard": "Čvrsta", + "Soft": "Meka", + "Weight": "Težina", + "How much a soft wish counts, from 1 to 3": "Koliko meka želja vredi, od 1 do 3", + "Why the wish exists": "Zašto želja postoji", + "Timetable scenario": "Scenario rasporeda", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Jedan nedeljni obrazac, koji je napravio generator ili je preuzet iz trenutnog rasporeda. Čuva svoj ulaz i koliko dobro poštuje želje.", + "The name timetablers know the scenario by": "Naziv pod kojim sastavljači rasporeda znaju scenario", + "Whether the generator made it or it came from the current timetable": "Da li ga je napravio generator ili dolazi iz trenutnog rasporeda", + "Generated": "Generisano", + "From the current timetable": "Iz trenutnog rasporeda", + "Week of": "Nedelja od", + "The Monday of the first week of the window": "Ponedeljak prve nedelje perioda", + "Window start": "Početak perioda", + "The first day the week pattern applies to": "Prvi dan na koji se nedeljni obrazac odnosi", + "Window end": "Kraj perioda", + "The last day the week pattern applies to": "Poslednji dan na koji se nedeljni obrazac odnosi", + "Waiting, generating, done, failed, or published as draft lessons": "Čeka, generiše se, gotovo, neuspelo ili objavljeno kao nacrti časova", + "Waiting": "Čeka", + "Generating": "Generiše se", + "Failed": "Neuspelo", + "Published": "Objavljeno", + "Seed": "Seme", + "The number the generator starts from, so a run can be repeated": "Broj od kog generator kreće, kako bi pokretanje moglo da se ponovi", + "Input": "Ulaz", + "The periods, rooms, lessons and wishes the scenario was made from": "Časovi, prostorije, predavanja i želje od kojih je nastao scenario", + "Placements": "Smeštaji", + "Each lesson with the period and room it was given": "Svaki čas sa terminom i prostorijom koje je dobio", + "Unplaced lessons": "Nesmešteni časovi", + "Lessons without a place, each with the hard wish that blocked it": "Časovi bez mesta, svaki sa čvrstom željom koja ga je zaustavila", + "Broken wishes": "Prekršene želje", + "The wishes this scenario breaks, with the lessons that break them": "Želje koje ovaj scenario krši, sa časovima koji ih krše", + "Measures": "Mere", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Smešteni časovi, prekršene želje, rupe nastavnika, časovi dnevno i korišćenje prostorija", + "Reason": "Razlog", + "Why the run failed": "Zašto pokretanje nije uspelo", + "Published at": "Objavljeno", + "When the scenario was written out as draft lessons": "Kada je scenario zapisan kao nacrti časova", + "Edit wish": "Уреди жељу", + "New wish": "Нова жеља", + "Hard: the generator always keeps it": "Обавезна: генератор је увек поштује", + "Soft: the generator keeps it where it can": "Флексибилна: генератор је поштује где може", + "Weight (1 to 3)": "Тежина (од 1 до 3)", + "Most lessons a day": "Највише часова дневно", + "Period": "Час", + "{day} period {number}": "{day} час {number}", + "Teacher (user name)": "Наставник (корисничко име)", + "Activity (group:subject)": "Активност (група:предмет)", + "Say who or what the wish is about.": "Наведите на кога или шта се жеља односи.", + "Choose at least one period.": "Изаберите бар један час.", + "The limit is a whole number of 1 or more.": "Ограничење је цео број 1 или више.", + "Timetable": "Распоред", + "Wishes": "Жеље", + "Timetable wishes": "Жеље за распоред", + "Generator run": "Покретање генератора", + "Generator progress": "Напредак генератора", + "The run failed: {reason}": "Покретање није успело: {reason}", + "{placed} of {lessons} lessons placed": "Смештено {placed} од {lessons} часова", + "Generate again": "Генериши поново", + "Generate": "Генериши", + "Every lesson has a place.": "Сваки час има место.", + "Lesson": "Час", + "No free period and room": "Нема слободног часа и учионице", + "Broken soft wishes": "Прекршене флексибилне жеље", + "Every soft wish is kept.": "Свака флексибилна жеља је поштована.", + "Wish": "Жеља", + "Lessons": "Часови", + "Generating: {percent}% of the time budget used": "Генерисање: искоришћено {percent}% времена", + "Waiting to start": "Чека почетак", + "Published as draft lessons": "Објављено као нацрти часова", + "Could not read the scenario.": "Сценарио није могуће прочитати.", + "Could not start the run.": "Покретање није могуће започети.", + "Scenarios": "Сценарији", + "Timetable scenarios": "Сценарији распореда", + "Scenario": "Сценарио", + "Take the current timetable": "Преузми тренутни распоред", + "Could not take the current timetable.": "Тренутни распоред није могуће преузети.", + "Broken hard wishes": "Прекршене обавезне жеље", + "Not on a period of the week grid": "Није на часу недељне мреже", + "Compare scenarios": "Упореди сценарије", + "Scenarios to compare": "Сценарији за поређење", + "Choose two or three scenarios to compare them.": "Изаберите два или три сценарија за поређење.", + "Measure": "Мера", + "Best": "Најбоље", + "Lessons that differ": "Часови који се разликују", + "No lesson differs.": "Ниједан час се не разликује.", + "Not placed": "Није смештен", + "{period} in {room}": "{period} у {room}", + "Lessons placed": "Смештени часови", + "Lessons without a place": "Часови без места", + "Clashes": "Сукоби", + "Hard wishes broken": "Прекршене обавезне жеље", + "Soft wishes broken": "Прекршене флексибилне жеље", + "Soft wishes broken, weighted": "Прекршене флексибилне жеље, пондерисане", + "Free periods between lessons, all teachers": "Празни часови, сви наставници", + "Most free periods of one teacher": "Највише празних часова једног наставника", + "Most lessons of one group on a day": "Највише часова једне групе у дану", + "Room use": "Коришћење учионица", + "Publish as draft lessons": "Објави као нацрте часова", + "Draft lessons written: {count}": "Записани нацрти часова: {count}", + "Could not publish the scenario.": "Сценарио није могуће објавити.", + "Rules": "Правила", + "Rules for {column}": "Правила за {column}", + "When a card enters this column": "Када картица уђе у ову колону", + "Action": "Радња", + "Set the priority": "Постави приоритет", + "Assign to": "Додели", + "Assign the person who moved the card": "Додели особи која је преместила картицу", + "Remove the assignee": "Уклони задужену особу", + "Add a label": "Додај ознаку", + "No longer a project member": "Више није члан пројекта", + "This label no longer exists": "Ова ознака више не постоји", + "Add rule": "Додај правило", + "Remove rule": "Уклони правило", + "No rules yet. Add one to change a card when it enters this column.": "Још нема правила. Додајте једно да бисте мењали картицу када уђе у ову колону.", + "Could not save the rules. Please try again.": "Правила није могуће сачувати. Покушајте поново.", + "1 rule runs when a card enters this column": "1 правило се извршава када картица уђе у ову колону", + "{count} rules run when a card enters this column": "Број правила која се извршавају када картица уђе у ову колону: {count}", + "Rules applied: {changes}": "Примењена правила: {changes}", + "assigned to {name}": "додељено: {name}", + "assignee removed": "задужена особа уклоњена", + "priority {priority}": "приоритет {priority}", + "label {label}": "ознака {label}", + "What happens to a card when it enters this column, applied in list order.": "Шта се дешава са картицом када уђе у ову колону, редоследом листе.", + "Value": "Вредност", + "What the rule does to the card.": "Шта правило ради са картицом.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Приоритет, ID корисника или ID ознаке које радња користи; празно за радње без вредности.", + "is not": "није", + "{dimension} is not": "{dimension} није", + "Saved filters": "Сачувани филтери", + "No saved filters yet": "Још нема сачуваних филтера", + "Save filter": "Сачувај филтер", + "Rename \"{name}\"": "Преименуј „{name}”", + "Delete \"{name}\"": "Обриши „{name}”", + "Clear filters": "Очисти филтере", + "Showing {shown} of {total} tasks": "Приказано {shown} од {total} задатака", + "Me": "Ја", + "No date": "Без датума", + "Rename saved filter": "Преименуј сачувани филтер", + "Share with the project": "Подели са пројектом", + "Give the filter a name": "Дајте филтеру назив", + "Could not save the filter. Please try again.": "Филтер није могуће сачувати. Покушајте поново.", + "Some labels in \"{name}\" no longer exist and were left out.": "Неке ознаке у „{name}” више не постоје и изостављене су.", + "Could not delete the filter. Please try again.": "Филтер није могуће обрисати. Покушајте поново.", + "Saved filter": "Сачувани филтер", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Именовани филтер табле једног пројекта, приватан за особу која га је сачувала, осим ако је подељен са пројектом.", + "The project whose board the filter applies to": "Пројекат на чијој се табли филтер примењује", + "The name the filter is listed under": "Назив под којим је филтер на листи", + "Saved by": "Сачувао/ла", + "Nextcloud user id of the person who saved the filter": "Nextcloud ID корисника који је сачувао филтер", + "Shared with the project": "Подељено са пројектом", + "Whether every project member sees and applies the filter": "Да ли сваки члан пројекта види филтер и може да га примени", + "Criteria": "Критеријуми", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Филтер: задужена особа, ознака, приоритет и рок, сваки са јесте или није и својим вредностима", + "Cross-project view": "Међупројектни приказ", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Сачуван избор пројеката чији се задаци приказују заједно у колонама статуса, подељен са наведеним особама.", + "Shared with": "Подељено са", + "The name the view is listed under": "Назив под којим је приказ наведен", + "Nextcloud user id of the person who saved the view": "Nextcloud кориснички ID особе која је сачувала приказ", + "Nextcloud user ids of the people the view is shared with": "Nextcloud кориснички ID-ови особа са којима је приказ подељен", + "The projects whose tasks the view shows, at most twenty": "Пројекти чије задатке приказ приказује, највише двадесет", + "1 project in this view is hidden from you.": "1 пројекат у овом приказу је скривен од вас.", + "{count} projects in this view are hidden from you.": "Пројекти у овом приказу скривени од вас: {count}.", + "{project} has no column for {status}.": "Пројекат {project} нема колону за статус {status}.", + "This view does not exist or is not shared with you.": "Овај приказ не постоји или није подељен са вама.", + "\"{task}\" moved to {status}.": "\"{task}\" премештено у {status}.", + "Project: {title}": "Пројекат: {title}", + "Cross-project views": "Међупројектни прикази", + "New view": "Нови приказ", + "Edit view": "Уреди приказ", + "Delete view": "Обриши приказ", + "Give the view a name": "Дајте приказу назив", + "Pick at least one project": "Изаберите бар један пројекат", + "A view shows at most {max} projects": "Приказ приказује највише {max} пројеката", + "Could not save the view. Please try again.": "Приказ није могуће сачувати. Покушајте поново.", + "Could not delete the view. Please try again.": "Приказ није могуће обрисати. Покушајте поново.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Обрисати „{title}”? Пројекти и њихови задаци остају какви јесу.", + "People see the tasks of the projects they are in, never more.": "Свако види само задатке пројеката у којима је.", + "No views yet. A view shows the tasks of several of your projects together.": "Још нема приказа. Приказ приказује задатке више ваших пројеката заједно.", + "Projects in view: {count}": "Пројекти у приказу: {count}", + "Notify me when a task is assigned to me": "Обавести ме када ми се додели задатак", + "Also send these to me by email": "Шаљи ми их и е-поштом", + "Add an email address in your Nextcloud personal settings to get mail.": "Додајте адресу е-поште у личним подешавањима Nextcloud-а да бисте примали е-пошту.", + "Code link": "Веза ка коду", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Commit, грана, захтев за спајање или пријава на платформи за код која се односи на задатак.", + "The task the link belongs to": "Задатак коме веза припада", + "The project of the task": "Пројекат задатка", + "Task key": "Кључ задатка", + "The task key the forge text named, such as VC-12": "Кључ задатка наведен у тексту платформе, нпр. VC-12", + "What the link points at": "На шта веза показује", + "Link": "Веза", + "The address of the item in the forge": "Адреса ставке на платформи за код", + "The commit message, branch name or merge request title": "Порука commit-а, назив гране или наслов захтева за спајање", + "Repository": "Репозиторијум", + "The repository, such as acme/portal": "Репозиторијум, нпр. acme/portal", + "Forge id": "Id на платформи", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Сопствени id ставке на платформи за код, нпр. github:acme/portal#42 или hash commit-а", + "State": "Стање", + "The state of a merge request or issue": "Стање захтева за спајање или пријаве", + "Who made the commit or opened the merge request": "Ко је направио commit или отворио захтев за спајање", + "When the commit was made or the merge request last changed": "Када је направљен commit или се захтев за спајање последњи пут променио", + "Added by": "Додао", + "Whether a person added the link or the integration wrote it": "Да ли је везу додала особа или ју је записала интеграција", + "Nextcloud user UIDs of project members": "Nextcloud кориснички ID-ови чланова пројекта", + "Add link": "Додај везу", + "Added by hand": "Додато ручно", + "Branch": "Грана", + "Code": "Код", + "Commit": "Commit", + "From the integration": "Из интеграције", + "Link to a commit, branch or merge request": "Веза ка commit-у, грани или захтеву за спајање", + "Merge request": "Захтев за спајање", + "Merged": "Спојено", + "No code linked yet. Name {key} in a commit message or paste a link.": "Још нема повезаног кода. Наведите {key} у поруци commit-а или налепите везу.", + "No code linked yet. Paste a link to a commit or merge request.": "Још нема повезаног кода. Налепите везу ка commit-у или захтеву за спајање.", + "Paste a web address that starts with https://.": "Налепите веб-адресу која почиње са https://.", + "Remove link {title}": "Уклони везу {title}", + "The link could not be added.": "Везу није било могуће додати.", + "The link could not be removed.": "Везу није било могуће уклонити.", + "This link is already on the task.": "Ова веза је већ на задатку.", + "Code forges": "Платформе за код", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Повежите commit-ове и pull request-ове са GitHub-а са задацима. Integriq прима догађаје; planninq никад не позива GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Преузмите конфигурацију и увезите је у Integriq. Затим упишите тајну у правило \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "У GitHub-у репозиторијуму додајте webhook са овом адресом и истом тајном. Изаберите тип садржаја application/json и догађаје push и pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Наведите кључ задатка, нпр. VC-12, у поруци commit-а, називу гране или наслову pull request-а. Веза се тада појављује на том задатку.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq-а чланови пројекта и даље могу да налепе везу на страници задатка.", + "Download the Integriq configuration": "Преузми Integriq конфигурацију", + "Calendar": "Календар", + "Previous": "Претходно", + "Calendar view": "Приказ календара", + "Starts:": "Почиње:", + "No tasks with a date in this month.": "Овог месеца нема задатака са датумом.", + "Week of {start} to {end}": "Недеља од {start} до {end}", + "My calendar": "Мој календар", + "Show as list": "Прикажи као листу", + "Show as calendar": "Прикажи као календар", + "Open my calendar": "Отвори мој календар", + "Nextcloud Tasks": "Nextcloud задаци", + "Show my tasks in Nextcloud Tasks": "Прикажи моје задатке у Nextcloud задацима", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Задаци додељени вама или подељени са вама појављују се на листи \"Planninq\" у Nextcloud задацима и календару. Измене направљене тамо замењују се следећом изменом у Planninq-у.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Овај сервер не може да пише у Nextcloud задатке, па извоз није доступан.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Њиме управља Planninq. Измене направљене овде замењују се следећом изменом у Planninq-у.", + "Working days and holidays": "Радни дани и празници", + "Dates set on the timeline skip the days that are not working days.": "Датуми постављени на временској линији прескачу дане који нису радни.", + "Working weekdays": "Радни дани у недељи", + "Non-working days": "Нерадни дани", + "No non-working days yet.": "Још нема нерадних дана.", + "Add day": "Додај дан", + "Year": "Година", + "Add Dutch national holidays": "Додај холандске државне празнике", + "Save working days": "Сачувај радне дане", + "Choose at least one working weekday.": "Изаберите бар један радни дан.", + "Working days saved.": "Радни дани су сачувани.", + "Could not save the working days.": "Радне дане није било могуће сачувати.", + "New Year's Day": "Нова година", + "Easter Sunday": "Васкрс", + "Easter Monday": "Васкршњи понедељак", + "King's Day": "Краљев дан", + "Liberation Day": "Дан ослобођења", + "Ascension Day": "Спасовдан", + "Whit Sunday": "Духови", + "Whit Monday": "Духовски понедељак", + "Christmas Day": "Божић", + "Boxing Day": "Други дан Божића", + "Dates of {title}": "Датуми за {title}", + "The due date cannot be before the start date.": "Рок не може бити пре датума почетка.", + "{title}, from {start} to {end}": "{title}, од {start} до {end}", + "The dates could not be saved.": "Датуме није било могуће сачувати.", + "{title} now runs from {start} to {end}": "{title} сада траје од {start} до {end}", + "Auto-scheduling": "Аутоматско планирање", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Када је укључено, каснији рок на временској линији нуди померање задатака које блокира.", + "Move blocked tasks along when a task slips": "Помери блокиране задатке када задатак касни", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На временској линији каснији рок нуди померање блокираних задатака. Броје се само везе \"блокира\", а задаци се померају само касније.", + "Move the tasks that wait for {title}?": "Померити задатке који чекају {title}?", + "These tasks wait for it and would start after its new due date:": "Ови задаци га чекају и почели би после новог рока:", + "{count} tasks would move; the first {limit} are listed.": "Померило би се {count} задатака; приказано је првих {limit}.", + "Now": "Сада", + "After the move": "После померања", + "Only this task": "Само овај задатак", + "Move all": "Помери све", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Заустављено код {title}: датуме није било могуће сачувати. Задаци пре њега су померени.", + "Cumulative flow": "Кумулативни ток", + "Show as chart": "Прикажи као графикон", + "Show as table": "Прикажи као табелу", + "Tasks per column per day": "Задаци по колони по дану", + "Tasks without recorded history in this period: {count}": "Задаци без забележене историје у овом периоду: {count}", + "Lead and cycle time": "Време испоруке и време циклуса", + "No tasks were finished in this period.": "У овом периоду није завршен ниједан задатак.", + "Finished tasks": "Завршени задаци", + "Cycle time, average": "Време циклуса, просек", + "Cycle time, 85th percentile": "Време циклуса, 85. перцентил", + "Lead time, average": "Време испоруке, просек", + "Tasks whose finish time was estimated from their history: {count}": "Задаци чије је време завршетка процењено из историје: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Време циклуса сваког завршеног задатка, са просеком и 85. перцентилом", + "Slowest tasks": "Најспорији задаци", + "cycle {cycle}, lead {lead}": "циклус {cycle}, испорука {lead}", + "{days} days": "{days} дана", + "Could not load the flow of this project.": "Ток овог пројекта није могуће учитати.", + "Last {days} days": "Последњих {days} дана", + "Portfolio flow": "Ток портфолија", + "An admin adds portfolios under Projects, Portfolios.": "Администратор додаје портфолије под Пројекти, Портфолији.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Пројекти који нису приказани јер се одједном приказује највише 50: {count}", + "Could not load the flow of this portfolio.": "Ток овог портфолија није могуће учитати.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Кумулативни ток и време циклуса кроз пројекте портфолија.", + "Edit report": "Уреди извештај", + "Only tasks where": "Само задаци где", + "Group by": "Групиши по", + "Display": "Приказ", + "Share with everyone who can read its projects": "Подели са свима који могу да читају његове пројекте", + "The report could not be saved.": "Извештај није могуће сачувати.", + "Number of tasks": "Број задатака", + "Bar": "Стубићи", + "Donut": "Прстен", + "Table": "Табела", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} од {total} пројеката у овом извештају није видљиво за вас", + "No tasks match this report.": "Ниједан задатак не одговара овом извештају.", + "None": "Ништа", + "Could not load this report.": "Овај извештај није могуће учитати.", + "Report": "Извештај", + "Your reports": "Ваши извештаји", + "My reports": "Моји извештаји", + "Shared reports": "Дељени извештаји", + "You have not built a report yet.": "Још нисте направили извештај.", + "Nobody has shared a report with you yet.": "Још нико није поделио извештај са вама.", + "Reports you built over tasks, and the ones shared with you.": "Извештаји које сте направили над задацима, и они подељени са вама.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Сачувани упит над задацима: који пројекти, који филтери, груписано по чему, пребројано или сабрано, и приказано као табела или графикон.", + "The name the report is listed under": "Назив под којим је извештај наведен", + "What the report shows and who it is for": "Шта извештај приказује и коме је намењен", + "Nextcloud user id of the person who saved the report": "Nextcloud ID корисника који је сачувао извештај", + "Who can open the report": "Ко може да отвори извештај", + "Only me": "Само ја", + "Everyone who can read its projects": "Сви који могу да читају његове пројекте", + "The projects the report covers, at most fifty": "Пројекти које извештај обухвата, највише педесет", + "Filters": "Филтери", + "Task fields and the value each must equal": "Поља задатка и вредност којој свако мора бити једнако", + "The task field the report groups on": "Поље задатка по којем извештај групише", + "Count the tasks, or add up a number on them": "Преброј задатке или саберите број на њима", + "Sum": "Збир", + "Sum of": "Збир поља", + "The number added up when the measure is a sum": "Број који се сабира када је мера збир", + "Story points": "Бодови приче", + "Estimated duration": "Процењено трајање", + "How the report is shown": "Како се извештај приказује", + "Issue type": "Врста захтева", + "Task fields and the value each must equal; empty when the report covers every task": "Поља задатка и вредност коју свако мора имати; празно када извештај обухвата све задатке", + "The status a task must have": "Статус који задатак мора имати", + "The priority a task must have": "Приоритет који задатак мора имати", + "The user a task must be assigned to": "Корисник коме задатак мора бити додељен", + "A label a task must carry": "Ознака коју задатак мора имати", + "The board column a task must be in": "Колона табле у којој задатак мора бити", + "The issue type a task must have": "Врста захтева коју задатак мора имати", + "Manager groups": "Групе руководилаца", + "Member groups": "Групе чланова", + "Viewer groups": "Групе читалаца", + "Viewers": "Читаоци", + "Owning group": "Власничка група", + "Nextcloud groups whose members manage the project": "Nextcloud групе чији чланови воде пројекат", + "Nextcloud groups whose members work on the project": "Nextcloud групе чији чланови раде на пројекту", + "Nextcloud groups whose members may read the project": "Nextcloud групе чији чланови смеју да читају пројекат", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud корисници који воде пројекат: подешавања, чланове и рад", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud корисници који смеју да читају пројекат и његов рад, али не и да га мењају", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud група која поседује пројекат заједно са његовим аутором, највише једна", + "Nextcloud user ids who may read this through the project": "Nextcloud корисници који ово смеју да читају кроз пројекат", + "Nextcloud groups whose members may change this through the project": "Nextcloud групе чији чланови ово смеју да мењају кроз пројекат", + "Nextcloud groups whose members may read this through the project": "Nextcloud групе чији чланови ово смеју да читају кроз пројекат", + "Search for a person or a group…": "Претражи особу или групу…", + "No one found. Your admin's sharing settings decide who you can find.": "Нико није пронађен. Подешавања дељења вашег администратора одређују кога можете да пронађете.", + "Type at least two characters": "Унесите најмање два знака", + "Everyone in this group": "Сви у овој групи", + "Could not search for people. Please try again.": "Претрага особа није успела. Покушајте поново.", + "Could not remove the group": "Групу није могуће уклонити", + "Only the owner and managers change who is on this project.": "Само власник и управитељи мењају ко је на овом пројекту.", + "Role of {name}": "Улога: {name}", + "Manager": "Управитељ", + "Member": "Члан", + "Viewer": "Читалац", + "Could not change the role": "Улогу није могуће променити", + "Owned by group: {name}": "У власништву групе: {name}", + "No group owns this project.": "Ниједна група није власник овог пројекта.", + "Owned by group": "У власништву групе", + "Search for a group…": "Потражи групу…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Није пронађена ниједна група. Подешавања дељења вашег администратора одређују које групе можете пронаћи.", + "No owning group": "Без групе власника", + "Could not search for groups. Please try again.": "Претрага група није успела. Покушајте поново.", + "Could not change the owning group": "Групу власника није могуће променити", + "You can read this project. Only its members change it.": "Овај пројекат можете да читате. Мењају га само његови чланови.", + "Course": "Предмет", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Предмет који се предаје на овом часу, на пример изборни предмет, када га школска апликација за учење познаје.", + "Online meeting link": "Веза за онлајн час", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Где се ученици придружују овом часу онлајн. Дугме Придружи се приказује се само за https везу." }, "plurals": null } diff --git a/l10n/sv.js b/l10n/sv.js index dff97a89..55560f26 100644 --- a/l10n/sv.js +++ b/l10n/sv.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktiva projekt", + "Archived projects": "Arkiverade projekt", + "Boards": "Tavlor", + "My projects": "Mina projekt", + "Portfolio": "Portfölj", + "Project board": "Projekttavla", + "Projects I am in": "Projekt jag deltar i", + "Timeline": "Tidslinje", + "Timesheet": "Tidrapport", + "Features & roadmap": "Funktioner och färdplan", + "Flow": "Flöde", + "Flows": "Flöden", + "Reports": "Rapporter", + "Pick a report to open it.": "Välj en rapport för att öppna den.", + "In progress": "Pågår", + "Date": "Datum", + "Due": "Förfaller", + "Assignee": "Tilldelad", + "Who": "Vem", + "What": "Vad", + "Minutes": "Minuter", + "Entries": "Poster", + "Most recent": "Senaste", + "Per person": "Per person", + "By status": "Efter status", + "By priority": "Efter prioritet", + "Task status": "Uppgiftsstatus", + "Time spent": "Nedlagd tid", + "Capacity": "Kapacitet", + "Due soonest": "Förfaller först", + "Minutes logged": "Registrerade minuter", + "Nothing is due": "Inget förfaller", + "Nothing logged yet": "Inget registrerat ännu", + "What is open, what is blocked, and what is overdue.": "Vad som är öppet, vad som är blockerat och vad som är försenat.", + "How allocation is spread across the people working on projects.": "Hur belastningen fördelas mellan dem som arbetar med projekt.", + "Hours logged, and the projects they went to.": "Registrerade timmar och de projekt de gick till.", + "Billable": "Fakturerbar", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Laddar projekt", + "No projects for this client yet": "Inga projekt för den här kunden ännu", + "Open in Planninq": "Öppna i Planninq", + "This project could not be found": "Det här projektet hittades inte", + "Untitled project": "Namnlöst projekt", + "and {count} more": "och {count} till", + "Store": "Butik", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installera register, scheman och flöden som andra organisationer har publicerat.", + "Work Date": "Arbetsdatum", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Kolumnåtgärder", + "Columns": "Kolumner", + "Could not remove the column. Please try again.": "Kolumnen kunde inte tas bort. Försök igen.", + "Could not save the column. Please try again.": "Kolumnen kunde inte sparas. Försök igen.", + "Done column": "Klar-kolumn", + "Edit column": "Redigera kolumn", + "Keep the card's status": "Behåll kortets status", + "Move its cards to": "Flytta dess kort till", + "Move left": "Flytta åt vänster", + "Move right": "Flytta åt höger", + "Status of cards moved here": "Status för kort som flyttas hit", + "The last done column cannot be removed.": "Den sista klar-kolumnen kan inte tas bort.", + "WIP limit": "WIP-gräns", + "over limit": "över gränsen", + "The status a card gets when it is moved into this column.": "Den status ett kort får när det flyttas till den här kolumnen.", + "All priorities": "Alla prioriteter", + "Could not create the task. Please try again.": "Uppgiften kunde inte skapas. Försök igen.", + "Created": "Skapad", + "Move to backlog": "Till backloggen", + "Move to board": "Till tavlan", + "New task": "Ny uppgift", + "Nothing in the backlog": "Inget i backloggen", + "Rank": "Rang", + "Sort by": "Sortera efter", + "Sort by rank to reorder": "Sortera efter rang för att ändra ordningen", + "Task actions": "Uppgiftsåtgärder", + "All labels": "Alla etiketter", + "Filter tasks by label": "Filtrera uppgifter efter etikett", + "View timeline": "Visa tidslinje", + "Board": "Tavla", + "List": "Lista", + "Column": "Kolumn", + "Board or list": "Tavla eller lista", + "Log": "Logg", + "Add entry": "Lägg till post", + "Show": "Visa", + "No actions yet": "Inga åtgärder än", + "Closed": "Stängd", + "Entry actions": "Poståtgärder", + "Add action": "Lägg till åtgärd", + "by {author}": "av {author}", + "saved {time}": "sparad {time}", + "Attendees: {names}": "Deltagare: {names}", + "Add the first entry": "Lägg till den första posten", + "Issues": "Problem", + "Lessons learned": "Lärdomar", + "Meetings": "Möten", + "Decisions": "Beslut", + "Actions": "Åtgärder", + "Issue": "Problem", + "Lesson learned": "Lärdom", + "Meeting": "Möte", + "Decision": "Beslut", + "About this project": "Om projektet", + "No description yet": "Ingen beskrivning än", + "Start date": "Startdatum", + "Not set": "Inte angivet", + "End date": "Slutdatum", + "Progress": "Framsteg", + "No tasks yet": "Inga uppgifter än", + "Open the board": "Öppna tavlan", + "People": "Personer", + "Owner": "Ägare", + "Latest log entries": "Senaste poster", + "Open the log": "Öppna loggen", + "{done} of {total} tasks done": "{done} av {total} uppgifter klara", + "Edit entry": "Redigera post", + "Type": "Typ", + "Attendees": "Deltagare", + "Issue is closed": "Problemet är stängt", + "Could not save the entry. Please try again.": "Posten kunde inte sparas. Försök igen.", + "From: {title}": "Från: {title}", + "What needs to happen": "Vad som behöver göras", + "Could not create the action. Please try again.": "Åtgärden kunde inte skapas. Försök igen.", + "The action was created but could not be linked to the entry.": "Åtgärden skapades men kunde inte kopplas till posten.", + "Project pages": "Projektsidor", + "Overview": "Översikt", + "Risks": "Risker", + "Log entry": "Loggpost", + "A short name for the entry": "Ett kort namn på posten", + "Project": "Projekt", + "The project this entry belongs to": "Projektet som posten hör till", + "What kind of entry this is": "Vilken sorts post detta är", + "When it happened": "När det hände", + "What happened, in Markdown": "Vad som hände, i Markdown", + "Whether an issue is still open": "Om ett problem fortfarande är öppet", + "The people at a meeting": "Personerna på ett möte", + "Tasks that came out of this entry": "Uppgifter som kom ur den här posten", + "Add risk": "Lägg till risk", + "Risk": "Risk", + "Score": "Poäng", + "Response": "Hantering", + "Review date": "Granskningsdatum", + "no longer on the project": "är inte längre med i projektet", + "Edit {title}": "Redigera {title}", + "No risks recorded yet": "Inga risker registrerade än", + "Add the first risk": "Lägg till den första risken", + "Medium": "Medel", + "Mitigating": "Mildras", + "Occurred": "Inträffat", + "Avoid": "Undvika", + "Reduce": "Minska", + "Transfer": "Överföra", + "Accept": "Acceptera", + "Highest open risks": "Högsta öppna risker", + "No open risks": "Inga öppna risker", + "Open the risk register": "Öppna riskregistret", + "Edit risk": "Redigera risk", + "What could go wrong": "Vad som kan gå fel", + "Likelihood": "Sannolikhet", + "Impact": "Konsekvens", + "Score {score}": "Poäng {score}", + "Countermeasures": "Motåtgärder", + "Could not save the risk. Please try again.": "Risken kunde inte sparas. Försök igen.", + "Risks by likelihood and impact": "Risker efter sannolikhet och konsekvens", + "Risk scale": "Riskskala", + "The levels every project scores its risks on, and where low turns into medium and high": "Nivåerna som varje projekt poängsätter sina risker på, och var låg övergår i medel och hög", + "Number of levels": "Antal nivåer", + "Likelihood labels": "Etiketter för sannolikhet", + "Impact labels": "Etiketter för konsekvens", + "Level {level}": "Nivå {level}", + "Medium from score": "Medel från poäng", + "High from score": "Hög från poäng", + "Risk scale saved": "Riskskalan sparad", + "1 risk uses level {level}. Change it first.": "1 risk använder nivå {level}. Ändra den först.", + "{count} risks use level {level}. Change them first.": "{count} risker använder nivå {level}. Ändra dem först.", + "Every level needs a label, and high must start above medium.": "Varje nivå behöver en etikett, och hög måste börja över medel.", + "The project this risk belongs to": "Projektet som risken hör till", + "The cause and the effect, in Markdown": "Orsak och verkan, i Markdown", + "Category": "Kategori", + "A free grouping, such as planning, budget or supplier": "En fri gruppering, till exempel planering, budget eller leverantör", + "How likely it is, on the admin's risk scale": "Hur sannolik den är, på administratörens riskskala", + "How hard it would hit, on the admin's risk scale": "Hur hårt den skulle slå, på administratörens riskskala", + "Likelihood times impact, calculated by the server": "Sannolikhet gånger konsekvens, beräknad av servern", + "Where the risk stands": "Var risken står", + "The person who watches this risk": "Personen som bevakar risken", + "How the project answers the risk": "Hur projektet hanterar risken", + "What is done to prevent it or soften it, in Markdown": "Vad som görs för att förhindra eller mildra den, i Markdown", + "When to look at this risk again": "När risken ska ses över igen", + "Very low": "Mycket låg", + "Very high": "Mycket hög", + "All projects": "Alla projekt", + "Project status report": "Projektstatusrapport", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "En daterad rapport om hur ett projekt ligger till med pengar, organisation, tid, information, kvalitet och risk (GROTIK-aspekterna), var och en med en anteckning.", + "The project this report is about": "Projektet som rapporten gäller", + "Report date": "Rapportdatum", + "The day the report describes": "Dagen som rapporten beskriver", + "Money": "Pengar", + "How the project stands on this aspect": "Hur projektet ligger till för denna aspekt", + "On track": "Enligt plan", + "At risk": "I riskzonen", + "Off track": "Ur kurs", + "Money note": "Anteckning om pengar", + "A short explanation of this status": "En kort förklaring av denna status", + "Organisation": "Organisation", + "Organisation note": "Anteckning om organisation", + "Time": "Tid", + "Time note": "Anteckning om tid", + "Information": "Information", + "Information note": "Anteckning om information", + "Quality": "Kvalitet", + "Quality note": "Anteckning om kvalitet", + "Risk note": "Anteckning om risk", + "Overall": "Totalt", + "The worst of the six statuses, calculated by the server": "Den sämsta av de sex statusarna, beräknad av servern", + "Health: money": "Hälsa: pengar", + "Copied from the newest status report": "Kopierad från den senaste statusrapporten", + "Health: organisation": "Hälsa: organisation", + "Health: time": "Hälsa: tid", + "Health: information": "Hälsa: information", + "Health: quality": "Hälsa: kvalitet", + "Health: risk": "Hälsa: risk", + "Health: overall": "Hälsa: totalt", + "Health: report date": "Hälsa: rapportdatum", + "The date of the newest status report": "Datumet för den senaste statusrapporten", + "New report": "Ny rapport", + "Only the project owner writes status reports.": "Endast projektägaren skriver statusrapporter.", + "Latest report, {date}": "Senaste rapport, {date}", + "Aspect": "Aspekt", + "Note": "Anteckning", + "Report history": "Rapporthistorik", + "Author": "Författare", + "No status reports yet": "Inga statusrapporter än", + "Write the first report": "Skriv den första rapporten", + "Choose a status for every aspect to save the report.": "Välj en status för varje aspekt för att spara rapporten.", + "Suggested: on track.": "Förslag: enligt plan.", + "Suggested: at risk.": "Förslag: i riskzonen.", + "Suggested: off track.": "Förslag: ur kurs.", + "1 task is past its due date.": "1 uppgift har passerat sitt förfallodatum.", + "{count} tasks are past their due date.": "{count} uppgifter har passerat sitt förfallodatum.", + "The end date has passed with 1 open task.": "Slutdatumet har passerats med 1 öppen uppgift.", + "The end date has passed with {count} open tasks.": "Slutdatumet har passerats med {count} öppna uppgifter.", + "No open task is past its due date.": "Ingen öppen uppgift har passerat sitt förfallodatum.", + "The highest open risk, \"{title}\", scores {score}.": "Den högsta öppna risken, \"{title}\", har poängen {score}.", + "There are no open risks.": "Det finns inga öppna risker.", + "Costs are at {percent}% of the budget.": "Kostnaderna ligger på {percent}% av budgeten.", + "No suggestion: the project has no budget.": "Inget förslag: projektet har ingen budget.", + "No suggestion: no costs are recorded for this project yet.": "Inget förslag: inga kostnader har registrerats för projektet än.", + "The report was not saved. Only the project owner can write status reports.": "Rapporten sparades inte. Endast projektägaren kan skriva statusrapporter.", + "No report": "Ingen rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "En grupp projekt som drivs av samma personer, till exempel en avdelning eller ett program. Dess ansvariga läser varje projekt i den.", + "The name of the portfolio": "Portföljens namn", + "What the portfolio holds and who runs it": "Vad portföljen innehåller och vem som driver den", + "A colour for the portfolio's section in project lists": "En färg för portföljens avsnitt i projektlistor", + "Managers": "Ansvariga", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-användar-id för de personer som driver portföljen", + "Order": "Ordning", + "Where the portfolio comes in project lists, lowest first": "Var portföljen står i projektlistor, lägst först", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Portföljens egen riskskala som JSON, i samma form som den för hela appen. Tom betyder skalan för hela appen.", + "Portfolio readers": "Portföljläsare", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-användar-id för de ansvariga för projektets portfölj", + "The portfolio this project belongs to": "Portföljen som projektet hör till", + "No portfolio": "Ingen portfölj", + "All portfolios": "Alla portföljer", + "You read this project as a manager of its portfolio. Only its members change it.": "Du läser det här projektet som ansvarig för dess portfölj. Endast medlemmarna ändrar det.", + "Portfolios": "Portföljer", + "Portfolio status": "Portföljstatus", + "No portfolios yet": "Inga portföljer än", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "En administratör lägger till portföljer under Projekt, Portföljer. Projekt i en portfölj visas här med sin status.", + "Roll-up": "Sammanställning", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} enligt plan, {atRisk} i riskzonen, {offTrack} ur kurs, {noReport} utan rapport", + "No project in this portfolio that you can read.": "Inget projekt i den här portföljen som du kan läsa.", + "Start": "Start", + "End": "Slut", + "Budget": "Budget", + "Last report": "Senaste rapport", + "Out of date": "Inaktuell", + "Portfolio timeline": "Portföljtidslinje", + "Zoom": "Zoom", + "Could not load the timeline": "Det gick inte att läsa in tidslinjen", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "En administratör lägger till portföljer under Projekt, Portföljer. Projekt i en portfölj visas här på en tidslinje.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Öppna ett projekt för att se dess faser och uppgifter. Tidslinjen är skrivskyddad.", + "Phase: {title}": "Fas: {title}", + "Left out because you cannot read them: {count} projects": "Utelämnade eftersom du inte kan läsa dem: {count} projekt", + "Week": "Vecka", + "Day": "Dag", + "Month": "Månad", + "Please try again later.": "Försök igen senare.", + "Status reports": "Statusrapporter", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Efter hur många dagar ett projekts senaste statusrapport markeras som inaktuell i portföljöversikten", + "Reporting period (days)": "Rapportperiod (dagar)", + "The reporting period is a whole number of days from 1 to 365.": "Rapportperioden är ett helt antal dagar från 1 till 365.", + "Reporting period saved": "Rapportperioden sparad", + "The reporting period was not saved. Please try again.": "Rapportperioden sparades inte. Försök igen.", + "Every project of a portfolio with its status per aspect, rolled up.": "Varje projekt i en portfölj med status per aspekt, sammanställt.", + "The projects of a portfolio on one timeline.": "Projekten i en portfölj på en tidslinje.", + "Phases": "Faser", + "Add phase": "Lägg till fas", + "No phases yet": "Inga faser än", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Dela upp projektet i faser, till exempel initiering, definition och genomförande. En fas stängs när dess avslutande dokument är uppladdat.", + "{hours} hours": "{hours} timmar", + "Concluding document: {title}": "Avslutande dokument: {title}", + "Concluding document missing": "Avslutande dokument saknas", + "Move {title} up": "Flytta upp {title}", + "Move {title} down": "Flytta ned {title}", + "Close phase": "Stäng fas", + "Phase": "Fas", + "Files": "Filer", + "Notes": "Anteckningar", + "Audit trail": "Granskningslogg", + "Edit phase": "Redigera fas", + "Name": "Namn", + "Budget hours": "Budgettimmar", + "Could not save the phase. Please try again.": "Det gick inte att spara fasen. Försök igen.", + "Close phase {title}": "Stäng fasen {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "En fas stängs med sitt avslutande dokument: ladda upp det här eller välj en av fasens filer.", + "Concluding document": "Avslutande dokument", + "This phase has no files yet.": "Den här fasen har inga filer än.", + "Upload a document": "Ladda upp ett dokument", + "The document was not uploaded. Please try again.": "Dokumentet laddades inte upp. Försök igen.", + "Upload the concluding document before you close this phase.": "Ladda upp det avslutande dokumentet innan du stänger den här fasen.", + "This phase cannot be closed from its current status.": "Den här fasen kan inte stängas från sin nuvarande status.", + "The phase was not closed. Please try again.": "Fasen stängdes inte. Försök igen.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Id för filen på den här fasen som avslutar den. Fasen kan slutföras först när det är angivet och filen är bifogad.", + "Import from Microsoft Project": "Importera från Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Välj en plan som sparats från Microsoft Project i XML-format. Inget importeras förrän du bekräftar.", + "Plan file": "Planfil", + "What the import creates": "Vad importen skapar", + "Tasks": "Uppgifter", + "Sub-tasks": "Deluppgifter", + "Milestones": "Milstolpar", + "Links": "Länkar", + "Already imported, updated in place: {count}": "Redan importerade, uppdaterade på plats: {count}", + "What does not carry over": "Vad som inte följer med", + "Tasks with resources, which are not imported: {count}": "Uppgifter med resurser, som inte importeras: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Uppgifter djupare än nivå 3, placerade under sin uppgift på nivå 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Länkar utöver slut-till-start, importerade som relaterade länkar: {count}", + "Link lags, which are dropped: {count}": "Fördröjningar på länkar, som tas bort: {count}", + "Links to a summary task, which are not imported: {count}": "Länkar till en sammanfattningsaktivitet, som inte importeras: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Länkar till uppgifter utanför denna plan, som inte importeras: {count}", + "No longer in the plan": "Inte längre i planen", + "These stay in the project; remove them yourself if they are no longer needed.": "De stannar i projektet; ta bort dem själv om de inte längre behövs.", + "Import": "Importera", + "Close": "Stäng", + "The plan is imported: {created} created, {updated} updated.": "Planen är importerad: {created} skapade, {updated} uppdaterade.", + "Links that would close a loop were left out: {count}": "Länkar som skulle sluta en slinga utelämnades: {count}", + "The import stopped part-way. Run it again to finish it.": "Importen stannade halvvägs. Kör den igen för att slutföra den.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Spara planen i Microsoft Project med Arkiv, Spara som, XML-format, och importera den filen.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Den här filen deklarerar en DOCTYPE eller entiteter, som inte accepteras.", + "The file is larger than 10 MB.": "Filen är större än 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Planen har fler än 2 000 uppgifter, fler än en import tar.", + "This file is not a Microsoft Project plan in XML format.": "Den här filen är inte en Microsoft Project-plan i XML-format.", + "Choose a file to import.": "Välj en fil att importera.", + "Only the project owner can import a plan.": "Endast projektägaren kan importera en plan.", + "The plan could not be read. Please try again.": "Planen kunde inte läsas. Försök igen.", + "Linked case: {title}": "Kopplat ärende: {title}", + "Linked to a case": "Kopplat till ett ärende", + "Hand over to case": "Överlämna till ärende", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopierar varje fil i projektet och dess uppgifter, och en fil som beskriver projektet, oförändrat till det kopplade ärendet.", + "{date} by {user}": "{date} av {user}", + "Files copied: {count}": "Kopierade filer: {count}", + "Files that failed: {names}": "Filer som misslyckades: {names}", + "The handover failed. Please try again.": "Överlämningen misslyckades. Försök igen.", + "The linked case could not be found, or you cannot open it.": "Det kopplade ärendet hittades inte, eller så kan du inte öppna det.", + "Case handovers": "Överlämningar till ärendet", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Varje gång projektets filer och metadata överlämnades till ärendet: när, av vem, till vilket ärende, varje kopierad fil med sin SHA-256, och filerna som misslyckades.", + "Finance": "Ekonomi", + "Add cost line": "Lägg till kostnadsrad", + "Delivery terms": "Leveransvillkor", + "Billing model": "Faktureringsmodell", + "Budget in euro": "Budget i euro", + "Budget in hours": "Budget i timmar", + "Hourly rate in euro": "Timpris i euro", + "Planned start": "Planerad start", + "Planned end": "Planerat slut", + "Planned dates": "Planerade datum", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Ingen budget avtalad", + "Hours": "Timmar", + "Only the project owner and the portfolio managers see the amounts.": "Bara projektägaren och portföljförvaltarna ser beloppen.", + "Budget against cost per category": "Budget mot kostnader per kategori", + "Labour (booked time)": "Arbete (registrerad tid)", + "No category": "Ingen kategori", + "Hours are not available": "Timmarna är inte tillgängliga", + "Not yet assigned to a category": "Ännu inte tilldelad en kategori", + "Total": "Totalt", + "{spent} spent, {remaining} remaining": "{spent} förbrukat, {remaining} kvar", + "Budget against cost per phase": "Budget mot kostnader per fas", + "No phase": "Ingen fas", + "Cost lines": "Kostnadsrader", + "From the finance system": "Från ekonomisystemet", + "Edit cost line {amount}": "Redigera kostnadsraden {amount}", + "No cost lines yet": "Inga kostnadsrader ännu", + "Commitments": "Åtaganden", + "Actual cost": "Faktisk kostnad", + "Forecast": "Prognos", + "Remaining": "Återstår", + "Not planned yet": "Inte planerat ännu", + "{start} to {end}": "{start} till {end}", + "The terms were not saved. Please try again.": "Villkoren sparades inte. Försök igen.", + "Terms saved": "Villkor sparade", + "Fixed price": "Fast pris", + "Hourly": "Per timme", + "Not billed": "Faktureras inte", + "Commitment": "Åtagande", + "Edit cost line": "Redigera kostnadsrad", + "Kind": "Typ", + "Amount in euro": "Belopp i euro", + "Remove": "Ta bort", + "Could not save the cost line. Only the project owner changes the money of a project.": "Kostnadsraden kunde inte sparas. Bara projektägaren ändrar ett projekts pengar.", + "Could not remove the cost line. Please try again.": "Kostnadsraden kunde inte tas bort. Försök igen.", + "{amount} over budget": "{amount} över budget", + "Cost categories": "Kostnadskategorier", + "The categories every project splits its budget and costs into, one per line": "Kategorierna som varje projekt delar upp sin budget och sina kostnader i, en per rad", + "Categories": "Kategorier", + "Give at least one category, each name once.": "Ange minst en kategori, varje namn en gång.", + "Cost categories saved": "Kostnadskategorier sparade", + "The cost categories were not saved. Please try again.": "Kostnadskategorierna sparades inte. Försök igen.", + "Finance line": "Ekonomirad", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Ett penningbelopp i ett projekt: en budget, ett åtagande, en faktisk kostnad eller en prognos, i en kostnadskategori och eventuellt en fas. Inmatad av projektägaren eller skickad av ekonomisystemet via integrationsappen.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projektet som beloppet hör till. Tomt för en rad från ekonomisystemet vars projektnummer inte matchar något projekt.", + "The phase this amount belongs to, if any": "Fasen som beloppet hör till, om någon", + "The cost category, one of the categories the admin set up": "Kostnadskategorin, en av de kategorier administratören har lagt upp", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Om beloppet är en budget, ett åtagande, en faktisk kostnad eller en prognos", + "Amount": "Belopp", + "The amount in the reporting currency (euro)": "Beloppet i rapporteringsvalutan (euro)", + "The date the amount was booked or is expected": "Datumet då beloppet bokfördes eller förväntas", + "What the amount is for": "Vad beloppet avser", + "Whether a person entered the line or the finance system sent it": "Om en person matade in raden eller ekonomisystemet skickade den", + "Entered by hand": "Inmatad för hand", + "Finance line id": "Ekonomiradens id", + "The finance system's own id of this line. One imported line per id.": "Radens eget id i ekonomisystemet. En importerad rad per id.", + "Project number": "Projektnummer", + "The project number the finance system sent, matched against the project key": "Projektnumret som ekonomisystemet skickade, jämfört med projektnyckeln", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portföljen för radens projekt, kopierad från projektet så att portföljsummor behöver ett filter", + "Finance readers": "Ekonomiläsare", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-användar-UID:n för personerna som får se beloppet: projektägaren och portföljens förvaltare", + "Project owner": "Projektägare", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-användar-UID för projektägaren, som får ändra och ta bort manuella rader", + "How the client pays: not billed, a fixed price, or by the hour.": "Hur kunden betalar: faktureras inte, fast pris eller per timme.", + "Portfolio finance": "Portföljekonomi", + "You cannot see the money of any project in this portfolio": "Du kan inte se pengarna för något projekt i den här portföljen", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Servern returnerade kostnadsrader från projekt utanför den här portföljen, så summorna kan vara fel.", + "Projects left out because you cannot see their money: {count}": "Projekt som utelämnats eftersom du inte kan se deras pengar: {count}", + "Unmatched finance lines": "Omatchade ekonomirader", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, åtaganden, faktisk kostnad och prognos summerade för en portfölj.", + "Subprojects": "Delprojekt", + "{done} of {total}": "{done} av {total}", + "{done} of {total} tasks done, including subprojects": "{done} av {total} uppgifter klara, delprojekt inräknade", + "Show the subprojects of {title}": "Visa delprojekten under {title}", + "Hide the subprojects of {title}": "Dölj delprojekten under {title}", + "Part of": "Del av", + "No parent project": "Inget överordnat projekt", + "A project cannot sit under one of its own subprojects.": "Ett projekt kan inte ligga under ett av sina egna delprojekt.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekt kan ligga högst tre nivåer djupt: program, projekt och delprojekt.", + "Parent project": "Överordnat projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projektet som detta projekt ligger under, till exempel ett program. Projekt kan ligga högst tre nivåer djupt.", + "Yes": "Ja", + "No": "Nej", + "{label} (required)": "{label} (obligatoriskt)", + "{label} is required": "{label} är obligatoriskt", + "Project field": "Projektfält", + "A field an admin adds to every project, such as a policy area or a contract value.": "Ett fält som en administratör lägger till i varje projekt, till exempel ett policyområde eller ett kontraktsvärde.", + "Key": "Nyckel", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Det fasta namnet som värdet sparas under, i lower camel case. Behåll det när projekt använder det.", + "Label": "Etikett", + "The name people see next to the field": "Namnet som visas vid fältet", + "What the field holds": "Vad fältet innehåller", + "Text": "Text", + "Number": "Tal", + "Choice": "Val", + "Person": "Person", + "Yes or no": "Ja eller nej", + "Options": "Alternativ", + "The choices of a choice field": "Valen i ett valfält", + "Required": "Obligatoriskt", + "Whether a project must fill in the field": "Om ett projekt måste fylla i fältet", + "Where the field appears, lowest first": "Var fältet visas, lägsta först", + "Applies to": "Gäller för", + "What the field is added to": "Vad fältet läggs till på", + "Custom fields": "Egna fält", + "The values of the project fields an admin defined, keyed by the field's key.": "Värdena i de projektfält som en administratör har definierat, efter fältets nyckel.", + "Project fields": "Projektfält", + "Related": "Relaterade", + "Remove link": "Ta bort länk", + "Link type": "Länktyp", + "Relates to": "Relaterar till", + "Duplicates": "Duplicerar", + "Project key": "Projektnyckel", + "Every task number starts with it, such as VERG-42.": "Varje uppgiftsnummer börjar med den, till exempel VERG-42.", + "This key is already used by another project.": "Den här nyckeln används redan av ett annat projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Använd 2 till 10 bokstäver och siffror som börjar med en bokstav.", + "The key cannot change once tasks carry it.": "Nyckeln kan inte ändras när uppgifter bär den.", + "Project saved. The existing tasks get their numbers in the background.": "Projektet sparat. De befintliga uppgifterna får sina nummer i bakgrunden.", + "Next task number": "Nästa uppgiftsnummer", + "The number the next task of this project gets in its key. Only the system writes it.": "Numret som nästa uppgift i det här projektet får i sin nyckel. Bara systemet skriver det.", + "Restore {title}": "Återställ {title}", + "Restore": "Återställ", + "Project restored": "Projektet har återställts", + "Could not restore the project": "Det gick inte att återställa projektet", + "Bring this project back to the active list.": "Flytta tillbaka projektet till listan över aktiva projekt.", + "Restore project": "Återställ projekt", + "Request reason": "Skäl för begäran", + "Why the requester needs this project. Filled in when the project is requested.": "Varför den som begär projektet behöver det. Fylls i vid begäran.", + "Reviewed by": "Granskad av", + "The user who approved or rejected the request.": "Användaren som godkände eller avslog begäran.", + "Reviewed at": "Granskad", + "When the request was approved or rejected.": "När begäran godkändes eller avslogs.", + "Review note": "Granskningsanteckning", + "The reviewer's reason, shown to the requester when a request is not approved.": "Granskarens skäl, som visas för den som begärde projektet när en begäran inte godkänns.", + "Members of these groups": "Medlemmar i dessa grupper", + "Groups that may create projects": "Grupper som får skapa projekt", + "The group {group} no longer exists. Save to remove it.": "Gruppen {group} finns inte längre. Spara för att ta bort den.", + "Review project request": "Granska projektbegäran", + "Requested by": "Begärd av", + "Why it is needed": "Varför det behövs", + "Desired start date": "Önskat startdatum", + "Why is it not approved?": "Varför godkänns det inte?", + "Give a reason. The requester sees it.": "Ange ett skäl. Den som begärde ser det.", + "Approve": "Godkänn", + "Reject": "Avslå", + "Reject request": "Avslå begäran", + "The review was not saved. Try again.": "Granskningen sparades inte. Försök igen.", + "This project is waiting for review": "Projektet väntar på granskning", + "This request was not approved": "Begäran godkändes inte", + "Reason: {note}": "Skäl: {note}", + "Review request": "Granska begäran", + "Request a project": "Begär ett projekt", + "Step {step} of 2": "Steg {step} av 2", + "Why is this project needed?": "Varför behövs projektet?", + "Give a reason. The reviewer reads it.": "Ange ett skäl. Granskaren läser det.", + "Back": "Tillbaka", + "Next": "Nästa", + "Send request": "Skicka begäran", + "The request was not sent. Try again.": "Begäran skickades inte. Försök igen.", + "Requested": "Begärd", + "Not approved": "Inte godkänd", + "Your request was sent": "Din begäran har skickats", + "Let everyone else request a project": "Låt alla andra begära ett projekt", + "Add a task": "Lägg till en uppgift", + "Delete task": "Ta bort uppgift", + "Edit task": "Redigera uppgift", + "Write": "Skriv", + "Preview": "Förhandsgranska", + "Markdown works here: headings, lists and links.": "Markdown fungerar här: rubriker, listor och länkar.", + "Could not save the task. Please try again.": "Uppgiften kunde inte sparas. Försök igen.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Det finns registrerad tid på \"{title}\", så den kan inte tas bort. Du kan avbryta den i stället: tidsposterna finns kvar.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Ta bort \"{title}\"? Dess länkar till andra uppgifter tas också bort. Detta kan inte ångras.", + "Keep task": "Behåll uppgift", + "Cancel task": "Avbryt uppgift", + "Only the reporter, the project owner or an admin can delete this task.": "Endast rapportören, projektägaren eller en administratör kan ta bort den här uppgiften.", + "Could not delete the task. Please try again.": "Uppgiften kunde inte tas bort. Försök igen.", + "Could not cancel the task. Please try again.": "Uppgiften kunde inte avbrytas. Försök igen.", + "Responsible": "Ansvarig", + "Also working on this": "Arbetar också med detta", + "Labels": "Etiketter", + "Could not change the priority. Please try again.": "Prioriteten kunde inte ändras. Försök igen.", + "Other project members who work on this task alongside the person responsible.": "Andra projektmedlemmar som arbetar med uppgiften tillsammans med den ansvariga.", + "Duplicate": "Duplicera", + "Could not copy the task. Please try again.": "Uppgiften kunde inte kopieras. Försök igen.", + "Subtasks": "Deluppgifter", + "{done} of {total} done": "{done} av {total} klara", + "Add a subtask": "Lägg till en deluppgift", + "Checklist": "Checklista", + "Checklist item actions": "Åtgärder för checklistpunkt", + "Add a checklist item": "Lägg till en checklistpunkt", + "Subtasks: {estimate} estimated, {logged} logged": "Deluppgifter: {estimate} uppskattat, {logged} registrerat", + "Total estimate: {total}": "Total uppskattning: {total}", + "Part of {title}": "Del av {title}", + "Checklist: {count} done": "Checklista: {count} klara", + "This task has subtasks: {count}.": "Den här uppgiften har deluppgifter: {count}.", + "Keep subtasks as separate tasks": "Behåll deluppgifterna som separata uppgifter", + "Delete subtasks too": "Ta bort deluppgifterna också", + "Copy of {title}": "Kopia av {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Uppgiften kopierades, men inte alla dess deluppgifter. Kontrollera kopian.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Små steg inom uppgiften. Varje punkt har ett id, en text och om den är klar.", + "Open work per person and per project.": "Öppet arbete per person och per projekt.", + "View": "Vy", + "By person": "Per person", + "By project": "Per projekt", + "Hours left": "Timmar kvar", + "Tasks without an estimate": "Uppgifter utan uppskattning", + "Due in 14 days": "Förfaller inom 14 dagar", + "Shared": "Delade", + "Unassigned": "Ej tilldelade", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Visar arbete i de projekt du kan se. Timmar räknas för den ansvariga; delade uppgifter räknas utan timmar.", + "No open work in these projects.": "Inget öppet arbete i dessa projekt.", + "Open work": "Öppet arbete", + "{count} open tasks": "{count} öppna uppgifter", + "Create a project to see capacity here.": "Skapa ett projekt för att se kapaciteten här.", + "My tasks": "Mina uppgifter", + "Show all my tasks": "Visa alla mina uppgifter", + "No tasks assigned to you": "Inga uppgifter är tilldelade dig", + "Browse projects": "Bläddra bland projekt", + "Later": "Senare", + "Due {date}": "Förfaller {date}", + "Could not change the status. Please try again.": "Statusen kunde inte ändras. Försök igen.", + "Completed today": "Klara i dag", + "My open tasks": "Mina öppna uppgifter", + "My overdue tasks": "Mina försenade uppgifter", + "My tasks in progress": "Mina pågående uppgifter", + "Pin to the top": "Fäst överst", + "Unpin": "Lossa", + "Pinned": "Fäst", + "Actions for {title}": "Åtgärder för {title}", + "Could not save your project order. Please try again.": "Din projektordning kunde inte sparas. Försök igen.", + "No boards yet": "Inga tavlor än", + "Create a project to get a board.": "Skapa ett projekt för att få en tavla.", + "Use the Projects page to create and manage your projects and tasks.": "Använd sidan Projekt för att skapa och hantera dina projekt och uppgifter.", + "Go to projects": "Gå till projekt", + "You are not a member of any projects yet.": "Du är inte medlem i något projekt än.", + "Could not search for users. Please try again.": "Det gick inte att söka efter användare. Försök igen.", + "Project creation is restricted to administrators.": "Endast administratörer kan skapa projekt.", + "Only the project owner or an administrator can delete this project.": "Endast projektägaren eller en administratör kan ta bort det här projektet.", + "No projects are available to you yet. Ask an administrator to create one.": "Inga projekt är tillgängliga för dig än. Be en administratör skapa ett.", + "Due: {date}": "Förfaller: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Uppgifter med start- eller förfallodatum visas på tidslinjen. Lägg till datum för att se dem här.", + "You do not have access to this project.": "Du har inte åtkomst till det här projektet.", + "Zoom level": "Zoomnivå", + "Unscheduled": "Ej planerade", + "Start: {date}": "Start: {date}", + "Today": "I dag", + "No scheduled tasks": "Inga planerade uppgifter", + "An unexpected error occurred.": "Ett oväntat fel uppstod.", + "Column {number} name": "Namn på kolumn {number}", + "Failed to save creation policy": "Det gick inte att spara policyn för att skapa projekt", + "All authenticated users": "Alla inloggade användare", + "Control who may create new projects": "Styr vem som får skapa nya projekt", + "Administrators only": "Endast administratörer", + "Project creation": "Skapa projekt", + "Allow project creation": "Tillåt att projekt skapas", + "Creation policy saved successfully": "Policyn för att skapa projekt har sparats", + "Initializing…": "Startar…", + "e.g. 2h 30m, 90m, 1.5h": "t.ex. 2h 30m, 90m, 1.5h", + "Log time": "Registrera tid", + "Save estimate": "Spara uppskattning", + "Logged: {logged}": "Registrerat: {logged}", + "over by {amount}": "{amount} över", + "Time tracking": "Tidrapportering", + "Estimate": "Uppskattning", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Ange en giltig uppskattning (t.ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Ange en giltig varaktighet (t.ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Tidsposten kunde inte sparas. Försök igen.", + "Edit time entry": "Redigera tidspost", + "Duration": "Varaktighet", + "Date range": "Period", + "Last week": "Förra veckan", + "No time logged": "Ingen tid registrerad", + "Log time on a task to see it here.": "Registrera tid på en uppgift för att se den här.", + "To date": "Till datum", + "This week": "Den här veckan", + "Total: {total}": "Totalt: {total}", + "From date": "Från datum", + "Custom range": "Egen period", + "All time": "All tid", + "Could not delete a task, so some data may remain. Try deleting the project again.": "En uppgift kunde inte tas bort, så data kan finnas kvar. Ta bort projektet igen.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "En tidspost kunde inte tas bort, så data kan finnas kvar. Ta bort projektet igen.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "En kolumn kunde inte tas bort, så data kan finnas kvar. Ta bort projektet igen.", + "Could not delete the project. Please try again.": "Projektet kunde inte tas bort. Försök igen.", + "Notification settings": "Aviseringsinställningar", + "Configure when due-date reminders are sent": "Ange när påminnelser om förfallodatum skickas", + "Due-date reminder lead time (hours)": "Framförhållning för påminnelse (timmar)", + "Lead time must be between 1 and 336 hours": "Framförhållningen måste vara mellan 1 och 336 timmar", + "Reminder lead time saved successfully": "Framförhållningen för påminnelsen har sparats", + "Failed to save reminder lead time": "Framförhållningen för påminnelsen kunde inte sparas", + "Notifications": "Aviseringar", + "Notify me 1 day before a task's due date": "Meddela mig 1 dag före en uppgifts förfallodatum", + "Draft": "Utkast", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Om lektionen är ett utkast som bara läraren ser, blir av eller är inställd.", + "New release": "Ny version", + "Roadmap chart. The same releases and epics are listed below.": "Färdplansdiagram. Samma versioner och epics finns i listan nedan.", + "Nothing on the roadmap yet": "Inget på färdplanen än", + "Releases with a target date and epics with dated tasks appear here.": "Här visas versioner med ett måldatum och epics med daterade uppgifter.", + "Releases": "Versioner", + "No releases yet": "Inga versioner än", + "Target date: {date}": "Måldatum: {date}", + "No target date": "Inget måldatum", + "Edit {name}": "Redigera {name}", + "Mark {name} as released": "Markera {name} som släppt", + "Mark as released": "Markera som släppt", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Inga epics än. Öppna en uppgift för att göra den till en epic.", + "Not scheduled yet": "Inte schemalagd än", + "Planned": "Planerad", + "Released": "Släppt", + "Edit release": "Redigera version", + "Target date": "Måldatum", + "Could not save the release. Please try again.": "Versionen kunde inte sparas. Försök igen.", + "Every task of this release is done or cancelled.": "Alla uppgifter i den här versionen är klara eller avbrutna.", + "Not finished yet: {count}": "Inte klara än: {count}", + "What happens to these tasks?": "Vad händer med de här uppgifterna?", + "Move to {name}": "Flytta till {name}", + "Remove the release": "Ta bort versionen", + "Keep it on {name}": "Behåll dem i {name}", + "Could not mark the release as released. Please try again.": "Versionen kunde inte markeras som släppt. Försök igen.", + "Roadmap": "Färdplan", + "Tasks or roadmap": "Uppgifter eller färdplan", + "Release": "Version", + "Epic": "Epic", + "This task is an epic": "Den här uppgiften är en epic", + "A named, dated delivery of a project that its tasks are planned against.": "En namngiven, daterad leverans från ett projekt som projektets uppgifter planeras mot.", + "Name of the release": "Versionens namn", + "The project this release belongs to": "Projektet som versionen hör till", + "What this release delivers": "Vad versionen levererar", + "When work on the release starts": "När arbetet med versionen börjar", + "The date the release is due": "Datumet då versionen ska vara klar", + "Whether the release is planned, released or archived": "Om versionen är planerad, släppt eller arkiverad", + "Released on": "Släppt den", + "When the release was marked as released": "När versionen markerades som släppt", + "The release this task is planned for": "Den version som uppgiften är planerad för", + "Board view options": "Visningsalternativ för tavlan", + "Colour cards": "Färglägg kort", + "No colour": "Ingen färg", + "By label": "Efter etikett", + "Swimlanes": "Simbanor", + "No swimlanes": "Inga simbanor", + "By assignee": "Efter ansvarig", + "By epic": "Efter epic", + "No assignee": "Inte tilldelad", + "No epic": "Ingen epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kort stannar i sin epic-rad. Byt epic på uppgiftssidan.", + "Hand over to": "Lämna över till", + "Could not save your board view. It applies until you reload.": "Din tavelvy kunde inte sparas. Den gäller tills du laddar om.", + "Timetable wish": "Schemaönskemål", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Ett önskemål som generatorn väger in. Ett hårt önskemål håller den alltid, ett mjukt där det går.", + "Whether the wish is about a teacher, a group, a room or one activity": "Om önskemålet gäller en lärare, en grupp, en sal eller en aktivitet", + "Teacher": "Lärare", + "Group": "Grupp", + "Reference": "Referens", + "The user, group, room or activity the wish is about": "Användaren, gruppen, salen eller aktiviteten som önskemålet gäller", + "What the wish asks for": "Vad önskemålet begär", + "Not on these periods": "Inte på dessa pass", + "Preferably not on these periods": "Helst inte på dessa pass", + "At most a number of lessons a day": "Högst ett antal lektioner per dag", + "No free periods between lessons": "Inga håltimmar mellan lektionerna", + "Always the same room": "Alltid samma sal", + "Periods": "Pass", + "The periods of the week the wish is about, such as wed-5": "Veckans pass som önskemålet gäller, till exempel wed-5", + "Limit": "Gräns", + "The most lessons a day, for a wish of that kind": "Flest lektioner per dag, för ett önskemål av det slaget", + "Strength": "Styrka", + "Whether the generator must keep the wish or should keep it": "Om generatorn måste eller bör hålla önskemålet", + "Hard": "Hårt", + "Soft": "Mjukt", + "Weight": "Vikt", + "How much a soft wish counts, from 1 to 3": "Hur mycket ett mjukt önskemål väger, från 1 till 3", + "Why the wish exists": "Varför önskemålet finns", + "Timetable scenario": "Schemascenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Ett veckomönster, gjort av generatorn eller hämtat ur det nuvarande schemat. Det sparar sin indata och hur väl det håller önskemålen.", + "The name timetablers know the scenario by": "Namnet som schemaläggarna känner scenariot under", + "Whether the generator made it or it came from the current timetable": "Om generatorn gjorde det eller om det kommer från det nuvarande schemat", + "Generated": "Genererat", + "From the current timetable": "Från det nuvarande schemat", + "Week of": "Vecka från", + "The Monday of the first week of the window": "Måndagen i periodens första vecka", + "Window start": "Periodens början", + "The first day the week pattern applies to": "Den första dagen veckomönstret gäller", + "Window end": "Periodens slut", + "The last day the week pattern applies to": "Den sista dagen veckomönstret gäller", + "Waiting, generating, done, failed, or published as draft lessons": "Väntar, genereras, klart, misslyckat eller publicerat som utkastlektioner", + "Waiting": "Väntar", + "Generating": "Genereras", + "Failed": "Misslyckat", + "Published": "Publicerat", + "Seed": "Frö", + "The number the generator starts from, so a run can be repeated": "Talet som generatorn börjar från, så att en körning kan upprepas", + "Input": "Indata", + "The periods, rooms, lessons and wishes the scenario was made from": "Passen, salarna, lektionerna och önskemålen som scenariot gjordes av", + "Placements": "Placeringar", + "Each lesson with the period and room it was given": "Varje lektion med passet och salen den fick", + "Unplaced lessons": "Oplacerade lektioner", + "Lessons without a place, each with the hard wish that blocked it": "Lektioner utan plats, var och en med det hårda önskemål som stoppade den", + "Broken wishes": "Brutna önskemål", + "The wishes this scenario breaks, with the lessons that break them": "Önskemålen som scenariot bryter, med lektionerna som bryter dem", + "Measures": "Mått", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Placerade lektioner, brutna önskemål, håltimmar, lektioner per dag och salsanvändning", + "Reason": "Orsak", + "Why the run failed": "Varför körningen misslyckades", + "Published at": "Publicerat", + "When the scenario was written out as draft lessons": "När scenariot skrevs ut som utkastlektioner", + "Edit wish": "Redigera önskemål", + "New wish": "Nytt önskemål", + "Hard: the generator always keeps it": "Hårt: generatorn följer det alltid", + "Soft: the generator keeps it where it can": "Mjukt: generatorn följer det där den kan", + "Weight (1 to 3)": "Vikt (1 till 3)", + "Most lessons a day": "Högst antal lektioner per dag", + "Period": "Lektion", + "{day} period {number}": "{day} lektion {number}", + "Teacher (user name)": "Lärare (användarnamn)", + "Activity (group:subject)": "Aktivitet (grupp:ämne)", + "Say who or what the wish is about.": "Ange vem eller vad önskemålet gäller.", + "Choose at least one period.": "Välj minst en lektion.", + "The limit is a whole number of 1 or more.": "Gränsen är ett heltal på 1 eller mer.", + "Timetable": "Schema", + "Wishes": "Önskemål", + "Timetable wishes": "Schemaönskemål", + "Generator run": "Generatorkörning", + "Generator progress": "Generatorns förlopp", + "The run failed: {reason}": "Körningen misslyckades: {reason}", + "{placed} of {lessons} lessons placed": "{placed} av {lessons} lektioner placerade", + "Generate again": "Generera igen", + "Generate": "Generera", + "Every lesson has a place.": "Varje lektion har en plats.", + "Lesson": "Lektion", + "No free period and room": "Ingen ledig lektion och sal", + "Broken soft wishes": "Brutna mjuka önskemål", + "Every soft wish is kept.": "Varje mjukt önskemål hålls.", + "Wish": "Önskemål", + "Lessons": "Lektioner", + "Generating: {percent}% of the time budget used": "Genererar: {percent} % av tiden använd", + "Waiting to start": "Väntar på start", + "Published as draft lessons": "Publicerat som utkastlektioner", + "Could not read the scenario.": "Scenariot kunde inte läsas.", + "Could not start the run.": "Körningen kunde inte startas.", + "Scenarios": "Scenarier", + "Timetable scenarios": "Schemascenarier", + "Scenario": "Scenario", + "Take the current timetable": "Använd det nuvarande schemat", + "Could not take the current timetable.": "Det gick inte att hämta det nuvarande schemat.", + "Broken hard wishes": "Brutna hårda önskemål", + "Not on a period of the week grid": "Inte på en lektion i veckoschemat", + "Compare scenarios": "Jämför scenarier", + "Scenarios to compare": "Scenarier att jämföra", + "Choose two or three scenarios to compare them.": "Välj två eller tre scenarier att jämföra.", + "Measure": "Mått", + "Best": "Bäst", + "Lessons that differ": "Lektioner som skiljer sig", + "No lesson differs.": "Ingen lektion skiljer sig.", + "Not placed": "Inte placerad", + "{period} in {room}": "{period} i {room}", + "Lessons placed": "Placerade lektioner", + "Lessons without a place": "Lektioner utan plats", + "Clashes": "Krockar", + "Hard wishes broken": "Brutna hårda önskemål", + "Soft wishes broken": "Brutna mjuka önskemål", + "Soft wishes broken, weighted": "Brutna mjuka önskemål, viktade", + "Free periods between lessons, all teachers": "Håltimmar, alla lärare", + "Most free periods of one teacher": "Flest håltimmar för en lärare", + "Most lessons of one group on a day": "Flest lektioner för en grupp en dag", + "Room use": "Salsanvändning", + "Publish as draft lessons": "Publicera som utkastlektioner", + "Draft lessons written: {count}": "Utkastlektioner skrivna: {count}", + "Could not publish the scenario.": "Det gick inte att publicera scenariot.", + "Rules": "Regler", + "Rules for {column}": "Regler för {column}", + "When a card enters this column": "När ett kort kommer in i den här kolumnen", + "Action": "Åtgärd", + "Set the priority": "Ange prioritet", + "Assign to": "Tilldela", + "Assign the person who moved the card": "Tilldela personen som flyttade kortet", + "Remove the assignee": "Ta bort ansvarig", + "Add a label": "Lägg till en etikett", + "No longer a project member": "Inte längre projektmedlem", + "This label no longer exists": "Den här etiketten finns inte längre", + "Add rule": "Lägg till regel", + "Remove rule": "Ta bort regel", + "No rules yet. Add one to change a card when it enters this column.": "Inga regler än. Lägg till en för att ändra ett kort när det kommer in i den här kolumnen.", + "Could not save the rules. Please try again.": "Reglerna kunde inte sparas. Försök igen.", + "1 rule runs when a card enters this column": "1 regel körs när ett kort kommer in i den här kolumnen", + "{count} rules run when a card enters this column": "{count} regler körs när ett kort kommer in i den här kolumnen", + "Rules applied: {changes}": "Regler tillämpade: {changes}", + "assigned to {name}": "tilldelad {name}", + "assignee removed": "ansvarig borttagen", + "priority {priority}": "prioritet {priority}", + "label {label}": "etikett {label}", + "What happens to a card when it enters this column, applied in list order.": "Vad som händer med ett kort när det kommer in i den här kolumnen, i listans ordning.", + "Value": "Värde", + "What the rule does to the card.": "Vad regeln gör med kortet.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioriteten, användar-id:t eller etikett-id:t som åtgärden använder; tomt för åtgärder utan värde.", + "is not": "är inte", + "{dimension} is not": "{dimension} är inte", + "Saved filters": "Sparade filter", + "No saved filters yet": "Inga sparade filter än", + "Save filter": "Spara filter", + "Rename \"{name}\"": "Byt namn på ”{name}”", + "Delete \"{name}\"": "Ta bort ”{name}”", + "Clear filters": "Rensa filter", + "Showing {shown} of {total} tasks": "Visar {shown} av {total} uppgifter", + "Me": "Jag", + "No date": "Inget datum", + "Rename saved filter": "Byt namn på sparat filter", + "Share with the project": "Dela med projektet", + "Give the filter a name": "Ge filtret ett namn", + "Could not save the filter. Please try again.": "Filtret kunde inte sparas. Försök igen.", + "Some labels in \"{name}\" no longer exist and were left out.": "Några etiketter i ”{name}” finns inte längre och har utelämnats.", + "Could not delete the filter. Please try again.": "Filtret kunde inte tas bort. Försök igen.", + "Saved filter": "Sparat filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Ett namngivet tavelfilter för ett projekt, privat för den som sparade det om det inte delas med projektet.", + "The project whose board the filter applies to": "Projektet vars tavla filtret gäller", + "The name the filter is listed under": "Namnet som filtret listas under", + "Saved by": "Sparat av", + "Nextcloud user id of the person who saved the filter": "Nextcloud-användar-id för den som sparade filtret", + "Shared with the project": "Delat med projektet", + "Whether every project member sees and applies the filter": "Om varje projektmedlem ser och kan använda filtret", + "Criteria": "Villkor", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtret: ansvarig, etikett, prioritet och förfallodatum, var och en med är eller är inte och sina värden", + "Cross-project view": "Projektövergripande vy", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Ett sparat urval av projekt vars uppgifter visas tillsammans i statusbanor, delat med de personer det nämner.", + "Shared with": "Delad med", + "The name the view is listed under": "Namnet som vyn listas under", + "Nextcloud user id of the person who saved the view": "Nextcloud-användar-id för personen som sparade vyn", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-användar-id:n för personerna som vyn delas med", + "The projects whose tasks the view shows, at most twenty": "Projekten vars uppgifter vyn visar, högst tjugo", + "1 project in this view is hidden from you.": "1 projekt i den här vyn är dolt för dig.", + "{count} projects in this view are hidden from you.": "{count} projekt i den här vyn är dolda för dig.", + "{project} has no column for {status}.": "{project} har ingen kolumn för {status}.", + "This view does not exist or is not shared with you.": "Den här vyn finns inte eller är inte delad med dig.", + "\"{task}\" moved to {status}.": "\"{task}\" flyttad till {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Projektövergripande vyer", + "New view": "Ny vy", + "Edit view": "Redigera vy", + "Delete view": "Ta bort vy", + "Give the view a name": "Ge vyn ett namn", + "Pick at least one project": "Välj minst ett projekt", + "A view shows at most {max} projects": "En vy visar högst {max} projekt", + "Could not save the view. Please try again.": "Det gick inte att spara vyn. Försök igen.", + "Could not delete the view. Please try again.": "Det gick inte att ta bort vyn. Försök igen.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Ta bort \"{title}\"? Projekten och deras uppgifter förblir som de är.", + "People see the tasks of the projects they are in, never more.": "Var och en ser uppgifterna i de projekt de är med i, aldrig mer.", + "No views yet. A view shows the tasks of several of your projects together.": "Inga vyer än. En vy visar uppgifterna från flera av dina projekt tillsammans.", + "Projects in view: {count}": "Projekt i vyn: {count}", + "Notify me when a task is assigned to me": "Meddela mig när en uppgift tilldelas mig", + "Also send these to me by email": "Skicka dem även till mig via e-post", + "Add an email address in your Nextcloud personal settings to get mail.": "Lägg till en e-postadress i dina personliga Nextcloud-inställningar för att få e-post.", + "Code link": "Kodlänk", + "A commit, branch, merge request or issue in a code forge that works on a task.": "En commit, gren, merge request eller ett ärende i en kodplattform som arbetar med en uppgift.", + "The task the link belongs to": "Uppgiften som länken hör till", + "The project of the task": "Uppgiftens projekt", + "Task key": "Uppgiftsnyckel", + "The task key the forge text named, such as VC-12": "Uppgiftsnyckeln som texten i kodplattformen nämnde, till exempel VC-12", + "What the link points at": "Vad länken pekar på", + "Link": "Länk", + "The address of the item in the forge": "Objektets adress i kodplattformen", + "The commit message, branch name or merge request title": "Commit-meddelandet, grennamnet eller titeln på merge requesten", + "Repository": "Repository", + "The repository, such as acme/portal": "Repositoryt, till exempel acme/portal", + "Forge id": "Id i plattformen", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Objektets eget id i kodplattformen, till exempel github:acme/portal#42 eller en commit-hash", + "State": "Status", + "The state of a merge request or issue": "Status för en merge request eller ett ärende", + "Who made the commit or opened the merge request": "Vem som gjorde committen eller öppnade merge requesten", + "When the commit was made or the merge request last changed": "När committen gjordes eller merge requesten senast ändrades", + "Added by": "Tillagd av", + "Whether a person added the link or the integration wrote it": "Om en person lade till länken eller integrationen skrev den", + "Nextcloud user UIDs of project members": "Nextcloud-användar-id:n för projektmedlemmar", + "Add link": "Lägg till länk", + "Added by hand": "Tillagd för hand", + "Branch": "Gren", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Från integrationen", + "Link to a commit, branch or merge request": "Länk till en commit, gren eller merge request", + "Merge request": "Merge request", + "Merged": "Sammanfogad", + "No code linked yet. Name {key} in a commit message or paste a link.": "Ingen kod länkad än. Nämn {key} i ett commit-meddelande eller klistra in en länk.", + "No code linked yet. Paste a link to a commit or merge request.": "Ingen kod länkad än. Klistra in en länk till en commit eller merge request.", + "Paste a web address that starts with https://.": "Klistra in en webbadress som börjar med https://.", + "Remove link {title}": "Ta bort länken {title}", + "The link could not be added.": "Länken kunde inte läggas till.", + "The link could not be removed.": "Länken kunde inte tas bort.", + "This link is already on the task.": "Den här länken finns redan på uppgiften.", + "Code forges": "Kodplattformar", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Länka GitHub-commits och pull requests till uppgifter. Integriq tar emot händelserna; planninq anropar aldrig GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Ladda ner konfigurationen och importera den i Integriq. Fyll sedan i en hemlighet i regeln \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Lägg i GitHub till en webhook i repositoryt med den här adressen och samma hemlighet. Välj innehållstypen application/json och händelserna push och pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nämn uppgiftsnyckeln, till exempel VC-12, i ett commit-meddelande, ett grennamn eller titeln på en pull request. Länken visas då på den uppgiften.", + "Without Integriq, project members can still paste a link on the task page.": "Utan Integriq kan projektmedlemmar fortfarande klistra in en länk på uppgiftssidan.", + "Download the Integriq configuration": "Ladda ner Integriq-konfigurationen", + "Calendar": "Kalender", + "Previous": "Föregående", + "Calendar view": "Kalendervy", + "Starts:": "Börjar:", + "No tasks with a date in this month.": "Inga uppgifter med datum den här månaden.", + "Week of {start} to {end}": "Vecka från {start} till {end}", + "My calendar": "Min kalender", + "Show as list": "Visa som lista", + "Show as calendar": "Visa som kalender", + "Open my calendar": "Öppna min kalender", + "Nextcloud Tasks": "Nextcloud Uppgifter", + "Show my tasks in Nextcloud Tasks": "Visa mina uppgifter i Nextcloud Uppgifter", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Uppgifterna som tilldelats dig eller delats med dig visas i en lista \"Planninq\" i Nextcloud Uppgifter och Kalender. Ändringar du gör där ersätts vid nästa ändring i Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Den här servern kan inte skriva till Nextcloud Uppgifter, så exporten är inte tillgänglig.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Hanteras av Planninq. Ändringar du gör här ersätts vid nästa ändring i Planninq.", + "Working days and holidays": "Arbetsdagar och helgdagar", + "Dates set on the timeline skip the days that are not working days.": "Datum som sätts på tidslinjen hoppar över dagar som inte är arbetsdagar.", + "Working weekdays": "Veckans arbetsdagar", + "Non-working days": "Lediga dagar", + "No non-working days yet.": "Inga lediga dagar än.", + "Add day": "Lägg till dag", + "Year": "År", + "Add Dutch national holidays": "Lägg till nederländska helgdagar", + "Save working days": "Spara arbetsdagar", + "Choose at least one working weekday.": "Välj minst en arbetsdag.", + "Working days saved.": "Arbetsdagarna har sparats.", + "Could not save the working days.": "Arbetsdagarna kunde inte sparas.", + "New Year's Day": "Nyårsdagen", + "Easter Sunday": "Påskdagen", + "Easter Monday": "Annandag påsk", + "King's Day": "Kungens dag", + "Liberation Day": "Befrielsedagen", + "Ascension Day": "Kristi himmelfärdsdag", + "Whit Sunday": "Pingstdagen", + "Whit Monday": "Annandag pingst", + "Christmas Day": "Juldagen", + "Boxing Day": "Annandag jul", + "Dates of {title}": "Datum för {title}", + "The due date cannot be before the start date.": "Förfallodatumet kan inte ligga före startdatumet.", + "{title}, from {start} to {end}": "{title}, från {start} till {end}", + "The dates could not be saved.": "Datumen kunde inte sparas.", + "{title} now runs from {start} to {end}": "{title} pågår nu från {start} till {end}", + "Auto-scheduling": "Automatisk schemaläggning", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "När den är på erbjuder ett senare förfallodatum på tidslinjen att flytta de uppgifter den blockerar.", + "Move blocked tasks along when a task slips": "Flytta blockerade uppgifter när en uppgift blir försenad", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "På tidslinjen erbjuder ett senare förfallodatum att flytta de blockerade uppgifterna. Bara \"blockerar\"-länkar räknas, och uppgifter flyttas bara senare.", + "Move the tasks that wait for {title}?": "Flytta uppgifterna som väntar på {title}?", + "These tasks wait for it and would start after its new due date:": "De här uppgifterna väntar på den och skulle börja efter det nya förfallodatumet:", + "{count} tasks would move; the first {limit} are listed.": "{count} uppgifter skulle flyttas; de första {limit} visas.", + "Now": "Nu", + "After the move": "Efter flytten", + "Only this task": "Bara den här uppgiften", + "Move all": "Flytta alla", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stoppade vid {title}: datumen kunde inte sparas. Uppgifterna före den flyttades.", + "Cumulative flow": "Kumulativt flöde", + "Show as chart": "Visa som diagram", + "Show as table": "Visa som tabell", + "Tasks per column per day": "Uppgifter per kolumn per dag", + "Tasks without recorded history in this period: {count}": "Uppgifter utan registrerad historik under perioden: {count}", + "Lead and cycle time": "Ledtid och cykeltid", + "No tasks were finished in this period.": "Inga uppgifter slutfördes under perioden.", + "Finished tasks": "Slutförda uppgifter", + "Cycle time, average": "Cykeltid, medel", + "Cycle time, 85th percentile": "Cykeltid, 85:e percentilen", + "Lead time, average": "Ledtid, medel", + "Tasks whose finish time was estimated from their history: {count}": "Uppgifter vars sluttid uppskattades från historiken: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Cykeltid för varje slutförd uppgift, med medelvärdet och 85:e percentilen", + "Slowest tasks": "Långsammaste uppgifterna", + "cycle {cycle}, lead {lead}": "cykel {cycle}, ledtid {lead}", + "{days} days": "{days} dagar", + "Could not load the flow of this project.": "Projektets flöde kunde inte läsas in.", + "Last {days} days": "Senaste {days} dagarna", + "Portfolio flow": "Portföljflöde", + "An admin adds portfolios under Projects, Portfolios.": "En administratör lägger till portföljer under Projekt, Portföljer.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekt som inte visas, eftersom högst 50 visas åt gången: {count}", + "Could not load the flow of this portfolio.": "Portföljens flöde kunde inte läsas in.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativt flöde och cykeltid över en portföljs projekt.", + "Edit report": "Redigera rapport", + "Only tasks where": "Endast uppgifter där", + "Group by": "Gruppera efter", + "Display": "Visning", + "Share with everyone who can read its projects": "Dela med alla som kan läsa dess projekt", + "The report could not be saved.": "Rapporten kunde inte sparas.", + "Number of tasks": "Antal uppgifter", + "Bar": "Stapel", + "Donut": "Ring", + "Table": "Tabell", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} av {total} projekt i rapporten är inte synliga för dig", + "No tasks match this report.": "Inga uppgifter matchar rapporten.", + "None": "Ingen", + "Could not load this report.": "Rapporten kunde inte läsas in.", + "Report": "Rapport", + "Your reports": "Dina rapporter", + "My reports": "Mina rapporter", + "Shared reports": "Delade rapporter", + "You have not built a report yet.": "Du har inte skapat någon rapport än.", + "Nobody has shared a report with you yet.": "Ingen har delat en rapport med dig än.", + "Reports you built over tasks, and the ones shared with you.": "Rapporter du har skapat över uppgifter, och de som delats med dig.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "En sparad fråga över uppgifter: vilka projekt, vilka filter, grupperad efter vad, räknad eller summerad, och visad som tabell eller diagram.", + "The name the report is listed under": "Namnet rapporten listas under", + "What the report shows and who it is for": "Vad rapporten visar och vem den är till för", + "Nextcloud user id of the person who saved the report": "Nextcloud-användar-id för den som sparade rapporten", + "Who can open the report": "Vem som kan öppna rapporten", + "Only me": "Bara jag", + "Everyone who can read its projects": "Alla som kan läsa dess projekt", + "The projects the report covers, at most fifty": "Projekten rapporten omfattar, högst femtio", + "Filters": "Filter", + "Task fields and the value each must equal": "Uppgiftsfält och värdet vart och ett ska vara lika med", + "The task field the report groups on": "Uppgiftsfältet rapporten grupperar på", + "Count the tasks, or add up a number on them": "Räkna uppgifterna, eller summera ett tal på dem", + "Sum": "Summa", + "Sum of": "Summa av", + "The number added up when the measure is a sum": "Talet som summeras när måttet är en summa", + "Story points": "Story points", + "Estimated duration": "Uppskattad varaktighet", + "How the report is shown": "Hur rapporten visas", + "Issue type": "Ärendetyp", + "Task fields and the value each must equal; empty when the report covers every task": "Uppgiftsfält och värdet vart och ett måste ha; tomt när rapporten omfattar alla uppgifter", + "The status a task must have": "Den status en uppgift måste ha", + "The priority a task must have": "Den prioritet en uppgift måste ha", + "The user a task must be assigned to": "Den användare en uppgift måste vara tilldelad", + "A label a task must carry": "En etikett en uppgift måste ha", + "The board column a task must be in": "Den tavlkolumn en uppgift måste stå i", + "The issue type a task must have": "Den ärendetyp en uppgift måste ha", + "Manager groups": "Ledargrupper", + "Member groups": "Medlemsgrupper", + "Viewer groups": "Läsargrupper", + "Viewers": "Läsare", + "Owning group": "Ägargrupp", + "Nextcloud groups whose members manage the project": "Nextcloud-grupper vars medlemmar leder projektet", + "Nextcloud groups whose members work on the project": "Nextcloud-grupper vars medlemmar arbetar i projektet", + "Nextcloud groups whose members may read the project": "Nextcloud-grupper vars medlemmar får läsa projektet", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-användare som leder projektet: inställningar, medlemmar och arbete", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-användare som får läsa projektet och dess arbete men inte ändra det", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud-gruppen som äger projektet tillsammans med den som skapade det, högst en", + "Nextcloud user ids who may read this through the project": "Nextcloud-användare som får läsa detta via projektet", + "Nextcloud groups whose members may change this through the project": "Nextcloud-grupper vars medlemmar får ändra detta via projektet", + "Nextcloud groups whose members may read this through the project": "Nextcloud-grupper vars medlemmar får läsa detta via projektet", + "Search for a person or a group…": "Sök efter en person eller en grupp…", + "No one found. Your admin's sharing settings decide who you can find.": "Ingen hittades. Din administratörs delningsinställningar avgör vem du kan hitta.", + "Type at least two characters": "Skriv minst två tecken", + "Everyone in this group": "Alla i den här gruppen", + "Could not search for people. Please try again.": "Det gick inte att söka efter personer. Försök igen.", + "Could not remove the group": "Det gick inte att ta bort gruppen", + "Only the owner and managers change who is on this project.": "Bara ägaren och förvaltarna ändrar vem som är med i det här projektet.", + "Role of {name}": "Roll för {name}", + "Manager": "Förvaltare", + "Member": "Medlem", + "Viewer": "Läsare", + "Could not change the role": "Det gick inte att ändra rollen", + "Owned by group: {name}": "Ägs av gruppen: {name}", + "No group owns this project.": "Ingen grupp äger det här projektet.", + "Owned by group": "Ägs av grupp", + "Search for a group…": "Sök efter en grupp…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen grupp hittades. Din administratörs delningsinställningar avgör vilka grupper du kan hitta.", + "No owning group": "Ingen ägargrupp", + "Could not search for groups. Please try again.": "Det gick inte att söka efter grupper. Försök igen.", + "Could not change the owning group": "Det gick inte att ändra ägargruppen", + "You can read this project. Only its members change it.": "Du kan läsa det här projektet. Bara dess medlemmar ändrar det.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursen som lektionen undervisar i, till exempel ett tillval, när skolans lärapp känner till den.", + "Online meeting link": "Länk till onlinelektionen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Var eleverna ansluter till lektionen online. Knappen Anslut visas bara för en https-länk." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/sv.json b/l10n/sv.json index f834f6f7..27822288 100644 --- a/l10n/sv.json +++ b/l10n/sv.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Aktiva projekt", + "Archived projects": "Arkiverade projekt", + "Boards": "Tavlor", + "My projects": "Mina projekt", + "Portfolio": "Portfölj", + "Project board": "Projekttavla", + "Projects I am in": "Projekt jag deltar i", + "Timeline": "Tidslinje", + "Timesheet": "Tidrapport", + "Features & roadmap": "Funktioner och färdplan", + "Flow": "Flöde", + "Flows": "Flöden", + "Reports": "Rapporter", + "Pick a report to open it.": "Välj en rapport för att öppna den.", + "In progress": "Pågår", + "Date": "Datum", + "Due": "Förfaller", + "Assignee": "Tilldelad", + "Who": "Vem", + "What": "Vad", + "Minutes": "Minuter", + "Entries": "Poster", + "Most recent": "Senaste", + "Per person": "Per person", + "By status": "Efter status", + "By priority": "Efter prioritet", + "Task status": "Uppgiftsstatus", + "Time spent": "Nedlagd tid", + "Capacity": "Kapacitet", + "Due soonest": "Förfaller först", + "Minutes logged": "Registrerade minuter", + "Nothing is due": "Inget förfaller", + "Nothing logged yet": "Inget registrerat ännu", + "What is open, what is blocked, and what is overdue.": "Vad som är öppet, vad som är blockerat och vad som är försenat.", + "How allocation is spread across the people working on projects.": "Hur belastningen fördelas mellan dem som arbetar med projekt.", + "Hours logged, and the projects they went to.": "Registrerade timmar och de projekt de gick till.", + "Billable": "Fakturerbar", + "Budget: {amount}": "Budget: {amount}", + "Loading projects": "Laddar projekt", + "No projects for this client yet": "Inga projekt för den här kunden ännu", + "Open in Planninq": "Öppna i Planninq", + "This project could not be found": "Det här projektet hittades inte", + "Untitled project": "Namnlöst projekt", + "and {count} more": "och {count} till", + "Store": "Butik", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Installera register, scheman och flöden som andra organisationer har publicerat.", + "Work Date": "Arbetsdatum", + "Zaak UUID": "Zaak-UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Kolumnåtgärder", + "Columns": "Kolumner", + "Could not remove the column. Please try again.": "Kolumnen kunde inte tas bort. Försök igen.", + "Could not save the column. Please try again.": "Kolumnen kunde inte sparas. Försök igen.", + "Done column": "Klar-kolumn", + "Edit column": "Redigera kolumn", + "Keep the card's status": "Behåll kortets status", + "Move its cards to": "Flytta dess kort till", + "Move left": "Flytta åt vänster", + "Move right": "Flytta åt höger", + "Status of cards moved here": "Status för kort som flyttas hit", + "The last done column cannot be removed.": "Den sista klar-kolumnen kan inte tas bort.", + "WIP limit": "WIP-gräns", + "over limit": "över gränsen", + "The status a card gets when it is moved into this column.": "Den status ett kort får när det flyttas till den här kolumnen.", + "All priorities": "Alla prioriteter", + "Could not create the task. Please try again.": "Uppgiften kunde inte skapas. Försök igen.", + "Created": "Skapad", + "Move to backlog": "Till backloggen", + "Move to board": "Till tavlan", + "New task": "Ny uppgift", + "Nothing in the backlog": "Inget i backloggen", + "Rank": "Rang", + "Sort by": "Sortera efter", + "Sort by rank to reorder": "Sortera efter rang för att ändra ordningen", + "Task actions": "Uppgiftsåtgärder", + "All labels": "Alla etiketter", + "Filter tasks by label": "Filtrera uppgifter efter etikett", + "View timeline": "Visa tidslinje", + "Board": "Tavla", + "List": "Lista", + "Column": "Kolumn", + "Board or list": "Tavla eller lista", + "Log": "Logg", + "Add entry": "Lägg till post", + "Show": "Visa", + "No actions yet": "Inga åtgärder än", + "Closed": "Stängd", + "Entry actions": "Poståtgärder", + "Add action": "Lägg till åtgärd", + "by {author}": "av {author}", + "saved {time}": "sparad {time}", + "Attendees: {names}": "Deltagare: {names}", + "Add the first entry": "Lägg till den första posten", + "Issues": "Problem", + "Lessons learned": "Lärdomar", + "Meetings": "Möten", + "Decisions": "Beslut", + "Actions": "Åtgärder", + "Issue": "Problem", + "Lesson learned": "Lärdom", + "Meeting": "Möte", + "Decision": "Beslut", + "About this project": "Om projektet", + "No description yet": "Ingen beskrivning än", + "Start date": "Startdatum", + "Not set": "Inte angivet", + "End date": "Slutdatum", + "Progress": "Framsteg", + "No tasks yet": "Inga uppgifter än", + "Open the board": "Öppna tavlan", + "People": "Personer", + "Owner": "Ägare", + "Latest log entries": "Senaste poster", + "Open the log": "Öppna loggen", + "{done} of {total} tasks done": "{done} av {total} uppgifter klara", + "Edit entry": "Redigera post", + "Type": "Typ", + "Attendees": "Deltagare", + "Issue is closed": "Problemet är stängt", + "Could not save the entry. Please try again.": "Posten kunde inte sparas. Försök igen.", + "From: {title}": "Från: {title}", + "What needs to happen": "Vad som behöver göras", + "Could not create the action. Please try again.": "Åtgärden kunde inte skapas. Försök igen.", + "The action was created but could not be linked to the entry.": "Åtgärden skapades men kunde inte kopplas till posten.", + "Project pages": "Projektsidor", + "Overview": "Översikt", + "Risks": "Risker", + "Log entry": "Loggpost", + "A short name for the entry": "Ett kort namn på posten", + "Project": "Projekt", + "The project this entry belongs to": "Projektet som posten hör till", + "What kind of entry this is": "Vilken sorts post detta är", + "When it happened": "När det hände", + "What happened, in Markdown": "Vad som hände, i Markdown", + "Whether an issue is still open": "Om ett problem fortfarande är öppet", + "The people at a meeting": "Personerna på ett möte", + "Tasks that came out of this entry": "Uppgifter som kom ur den här posten", + "Add risk": "Lägg till risk", + "Risk": "Risk", + "Score": "Poäng", + "Response": "Hantering", + "Review date": "Granskningsdatum", + "no longer on the project": "är inte längre med i projektet", + "Edit {title}": "Redigera {title}", + "No risks recorded yet": "Inga risker registrerade än", + "Add the first risk": "Lägg till den första risken", + "Medium": "Medel", + "Mitigating": "Mildras", + "Occurred": "Inträffat", + "Avoid": "Undvika", + "Reduce": "Minska", + "Transfer": "Överföra", + "Accept": "Acceptera", + "Highest open risks": "Högsta öppna risker", + "No open risks": "Inga öppna risker", + "Open the risk register": "Öppna riskregistret", + "Edit risk": "Redigera risk", + "What could go wrong": "Vad som kan gå fel", + "Likelihood": "Sannolikhet", + "Impact": "Konsekvens", + "Score {score}": "Poäng {score}", + "Countermeasures": "Motåtgärder", + "Could not save the risk. Please try again.": "Risken kunde inte sparas. Försök igen.", + "Risks by likelihood and impact": "Risker efter sannolikhet och konsekvens", + "Risk scale": "Riskskala", + "The levels every project scores its risks on, and where low turns into medium and high": "Nivåerna som varje projekt poängsätter sina risker på, och var låg övergår i medel och hög", + "Number of levels": "Antal nivåer", + "Likelihood labels": "Etiketter för sannolikhet", + "Impact labels": "Etiketter för konsekvens", + "Level {level}": "Nivå {level}", + "Medium from score": "Medel från poäng", + "High from score": "Hög från poäng", + "Risk scale saved": "Riskskalan sparad", + "1 risk uses level {level}. Change it first.": "1 risk använder nivå {level}. Ändra den först.", + "{count} risks use level {level}. Change them first.": "{count} risker använder nivå {level}. Ändra dem först.", + "Every level needs a label, and high must start above medium.": "Varje nivå behöver en etikett, och hög måste börja över medel.", + "The project this risk belongs to": "Projektet som risken hör till", + "The cause and the effect, in Markdown": "Orsak och verkan, i Markdown", + "Category": "Kategori", + "A free grouping, such as planning, budget or supplier": "En fri gruppering, till exempel planering, budget eller leverantör", + "How likely it is, on the admin's risk scale": "Hur sannolik den är, på administratörens riskskala", + "How hard it would hit, on the admin's risk scale": "Hur hårt den skulle slå, på administratörens riskskala", + "Likelihood times impact, calculated by the server": "Sannolikhet gånger konsekvens, beräknad av servern", + "Where the risk stands": "Var risken står", + "The person who watches this risk": "Personen som bevakar risken", + "How the project answers the risk": "Hur projektet hanterar risken", + "What is done to prevent it or soften it, in Markdown": "Vad som görs för att förhindra eller mildra den, i Markdown", + "When to look at this risk again": "När risken ska ses över igen", + "Very low": "Mycket låg", + "Very high": "Mycket hög", + "All projects": "Alla projekt", + "Project status report": "Projektstatusrapport", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "En daterad rapport om hur ett projekt ligger till med pengar, organisation, tid, information, kvalitet och risk (GROTIK-aspekterna), var och en med en anteckning.", + "The project this report is about": "Projektet som rapporten gäller", + "Report date": "Rapportdatum", + "The day the report describes": "Dagen som rapporten beskriver", + "Money": "Pengar", + "How the project stands on this aspect": "Hur projektet ligger till för denna aspekt", + "On track": "Enligt plan", + "At risk": "I riskzonen", + "Off track": "Ur kurs", + "Money note": "Anteckning om pengar", + "A short explanation of this status": "En kort förklaring av denna status", + "Organisation": "Organisation", + "Organisation note": "Anteckning om organisation", + "Time": "Tid", + "Time note": "Anteckning om tid", + "Information": "Information", + "Information note": "Anteckning om information", + "Quality": "Kvalitet", + "Quality note": "Anteckning om kvalitet", + "Risk note": "Anteckning om risk", + "Overall": "Totalt", + "The worst of the six statuses, calculated by the server": "Den sämsta av de sex statusarna, beräknad av servern", + "Health: money": "Hälsa: pengar", + "Copied from the newest status report": "Kopierad från den senaste statusrapporten", + "Health: organisation": "Hälsa: organisation", + "Health: time": "Hälsa: tid", + "Health: information": "Hälsa: information", + "Health: quality": "Hälsa: kvalitet", + "Health: risk": "Hälsa: risk", + "Health: overall": "Hälsa: totalt", + "Health: report date": "Hälsa: rapportdatum", + "The date of the newest status report": "Datumet för den senaste statusrapporten", + "New report": "Ny rapport", + "Only the project owner writes status reports.": "Endast projektägaren skriver statusrapporter.", + "Latest report, {date}": "Senaste rapport, {date}", + "Aspect": "Aspekt", + "Note": "Anteckning", + "Report history": "Rapporthistorik", + "Author": "Författare", + "No status reports yet": "Inga statusrapporter än", + "Write the first report": "Skriv den första rapporten", + "Choose a status for every aspect to save the report.": "Välj en status för varje aspekt för att spara rapporten.", + "Suggested: on track.": "Förslag: enligt plan.", + "Suggested: at risk.": "Förslag: i riskzonen.", + "Suggested: off track.": "Förslag: ur kurs.", + "1 task is past its due date.": "1 uppgift har passerat sitt förfallodatum.", + "{count} tasks are past their due date.": "{count} uppgifter har passerat sitt förfallodatum.", + "The end date has passed with 1 open task.": "Slutdatumet har passerats med 1 öppen uppgift.", + "The end date has passed with {count} open tasks.": "Slutdatumet har passerats med {count} öppna uppgifter.", + "No open task is past its due date.": "Ingen öppen uppgift har passerat sitt förfallodatum.", + "The highest open risk, \"{title}\", scores {score}.": "Den högsta öppna risken, \"{title}\", har poängen {score}.", + "There are no open risks.": "Det finns inga öppna risker.", + "Costs are at {percent}% of the budget.": "Kostnaderna ligger på {percent}% av budgeten.", + "No suggestion: the project has no budget.": "Inget förslag: projektet har ingen budget.", + "No suggestion: no costs are recorded for this project yet.": "Inget förslag: inga kostnader har registrerats för projektet än.", + "The report was not saved. Only the project owner can write status reports.": "Rapporten sparades inte. Endast projektägaren kan skriva statusrapporter.", + "No report": "Ingen rapport", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "En grupp projekt som drivs av samma personer, till exempel en avdelning eller ett program. Dess ansvariga läser varje projekt i den.", + "The name of the portfolio": "Portföljens namn", + "What the portfolio holds and who runs it": "Vad portföljen innehåller och vem som driver den", + "A colour for the portfolio's section in project lists": "En färg för portföljens avsnitt i projektlistor", + "Managers": "Ansvariga", + "Nextcloud user UIDs of the people who run the portfolio": "Nextcloud-användar-id för de personer som driver portföljen", + "Order": "Ordning", + "Where the portfolio comes in project lists, lowest first": "Var portföljen står i projektlistor, lägst först", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Portföljens egen riskskala som JSON, i samma form som den för hela appen. Tom betyder skalan för hela appen.", + "Portfolio readers": "Portföljläsare", + "Nextcloud user UIDs of the managers of the project's portfolio": "Nextcloud-användar-id för de ansvariga för projektets portfölj", + "The portfolio this project belongs to": "Portföljen som projektet hör till", + "No portfolio": "Ingen portfölj", + "All portfolios": "Alla portföljer", + "You read this project as a manager of its portfolio. Only its members change it.": "Du läser det här projektet som ansvarig för dess portfölj. Endast medlemmarna ändrar det.", + "Portfolios": "Portföljer", + "Portfolio status": "Portföljstatus", + "No portfolios yet": "Inga portföljer än", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "En administratör lägger till portföljer under Projekt, Portföljer. Projekt i en portfölj visas här med sin status.", + "Roll-up": "Sammanställning", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} enligt plan, {atRisk} i riskzonen, {offTrack} ur kurs, {noReport} utan rapport", + "No project in this portfolio that you can read.": "Inget projekt i den här portföljen som du kan läsa.", + "Start": "Start", + "End": "Slut", + "Budget": "Budget", + "Last report": "Senaste rapport", + "Out of date": "Inaktuell", + "Portfolio timeline": "Portföljtidslinje", + "Zoom": "Zoom", + "Could not load the timeline": "Det gick inte att läsa in tidslinjen", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "En administratör lägger till portföljer under Projekt, Portföljer. Projekt i en portfölj visas här på en tidslinje.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Öppna ett projekt för att se dess faser och uppgifter. Tidslinjen är skrivskyddad.", + "Phase: {title}": "Fas: {title}", + "Left out because you cannot read them: {count} projects": "Utelämnade eftersom du inte kan läsa dem: {count} projekt", + "Week": "Vecka", + "Day": "Dag", + "Month": "Månad", + "Please try again later.": "Försök igen senare.", + "Status reports": "Statusrapporter", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Efter hur många dagar ett projekts senaste statusrapport markeras som inaktuell i portföljöversikten", + "Reporting period (days)": "Rapportperiod (dagar)", + "The reporting period is a whole number of days from 1 to 365.": "Rapportperioden är ett helt antal dagar från 1 till 365.", + "Reporting period saved": "Rapportperioden sparad", + "The reporting period was not saved. Please try again.": "Rapportperioden sparades inte. Försök igen.", + "Every project of a portfolio with its status per aspect, rolled up.": "Varje projekt i en portfölj med status per aspekt, sammanställt.", + "The projects of a portfolio on one timeline.": "Projekten i en portfölj på en tidslinje.", + "Phases": "Faser", + "Add phase": "Lägg till fas", + "No phases yet": "Inga faser än", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Dela upp projektet i faser, till exempel initiering, definition och genomförande. En fas stängs när dess avslutande dokument är uppladdat.", + "{hours} hours": "{hours} timmar", + "Concluding document: {title}": "Avslutande dokument: {title}", + "Concluding document missing": "Avslutande dokument saknas", + "Move {title} up": "Flytta upp {title}", + "Move {title} down": "Flytta ned {title}", + "Close phase": "Stäng fas", + "Phase": "Fas", + "Files": "Filer", + "Notes": "Anteckningar", + "Audit trail": "Granskningslogg", + "Edit phase": "Redigera fas", + "Name": "Namn", + "Budget hours": "Budgettimmar", + "Could not save the phase. Please try again.": "Det gick inte att spara fasen. Försök igen.", + "Close phase {title}": "Stäng fasen {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "En fas stängs med sitt avslutande dokument: ladda upp det här eller välj en av fasens filer.", + "Concluding document": "Avslutande dokument", + "This phase has no files yet.": "Den här fasen har inga filer än.", + "Upload a document": "Ladda upp ett dokument", + "The document was not uploaded. Please try again.": "Dokumentet laddades inte upp. Försök igen.", + "Upload the concluding document before you close this phase.": "Ladda upp det avslutande dokumentet innan du stänger den här fasen.", + "This phase cannot be closed from its current status.": "Den här fasen kan inte stängas från sin nuvarande status.", + "The phase was not closed. Please try again.": "Fasen stängdes inte. Försök igen.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Id för filen på den här fasen som avslutar den. Fasen kan slutföras först när det är angivet och filen är bifogad.", + "Import from Microsoft Project": "Importera från Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Välj en plan som sparats från Microsoft Project i XML-format. Inget importeras förrän du bekräftar.", + "Plan file": "Planfil", + "What the import creates": "Vad importen skapar", + "Tasks": "Uppgifter", + "Sub-tasks": "Deluppgifter", + "Milestones": "Milstolpar", + "Links": "Länkar", + "Already imported, updated in place: {count}": "Redan importerade, uppdaterade på plats: {count}", + "What does not carry over": "Vad som inte följer med", + "Tasks with resources, which are not imported: {count}": "Uppgifter med resurser, som inte importeras: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Uppgifter djupare än nivå 3, placerade under sin uppgift på nivå 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Länkar utöver slut-till-start, importerade som relaterade länkar: {count}", + "Link lags, which are dropped: {count}": "Fördröjningar på länkar, som tas bort: {count}", + "Links to a summary task, which are not imported: {count}": "Länkar till en sammanfattningsaktivitet, som inte importeras: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Länkar till uppgifter utanför denna plan, som inte importeras: {count}", + "No longer in the plan": "Inte längre i planen", + "These stay in the project; remove them yourself if they are no longer needed.": "De stannar i projektet; ta bort dem själv om de inte längre behövs.", + "Import": "Importera", + "Close": "Stäng", + "The plan is imported: {created} created, {updated} updated.": "Planen är importerad: {created} skapade, {updated} uppdaterade.", + "Links that would close a loop were left out: {count}": "Länkar som skulle sluta en slinga utelämnades: {count}", + "The import stopped part-way. Run it again to finish it.": "Importen stannade halvvägs. Kör den igen för att slutföra den.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Spara planen i Microsoft Project med Arkiv, Spara som, XML-format, och importera den filen.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Den här filen deklarerar en DOCTYPE eller entiteter, som inte accepteras.", + "The file is larger than 10 MB.": "Filen är större än 10 MB.", + "The plan has more than 2,000 tasks, more than one import takes.": "Planen har fler än 2 000 uppgifter, fler än en import tar.", + "This file is not a Microsoft Project plan in XML format.": "Den här filen är inte en Microsoft Project-plan i XML-format.", + "Choose a file to import.": "Välj en fil att importera.", + "Only the project owner can import a plan.": "Endast projektägaren kan importera en plan.", + "The plan could not be read. Please try again.": "Planen kunde inte läsas. Försök igen.", + "Linked case: {title}": "Kopplat ärende: {title}", + "Linked to a case": "Kopplat till ett ärende", + "Hand over to case": "Överlämna till ärende", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Kopierar varje fil i projektet och dess uppgifter, och en fil som beskriver projektet, oförändrat till det kopplade ärendet.", + "{date} by {user}": "{date} av {user}", + "Files copied: {count}": "Kopierade filer: {count}", + "Files that failed: {names}": "Filer som misslyckades: {names}", + "The handover failed. Please try again.": "Överlämningen misslyckades. Försök igen.", + "The linked case could not be found, or you cannot open it.": "Det kopplade ärendet hittades inte, eller så kan du inte öppna det.", + "Case handovers": "Överlämningar till ärendet", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Varje gång projektets filer och metadata överlämnades till ärendet: när, av vem, till vilket ärende, varje kopierad fil med sin SHA-256, och filerna som misslyckades.", + "Finance": "Ekonomi", + "Add cost line": "Lägg till kostnadsrad", + "Delivery terms": "Leveransvillkor", + "Billing model": "Faktureringsmodell", + "Budget in euro": "Budget i euro", + "Budget in hours": "Budget i timmar", + "Hourly rate in euro": "Timpris i euro", + "Planned start": "Planerad start", + "Planned end": "Planerat slut", + "Planned dates": "Planerade datum", + "Budget {amount}": "Budget {amount}", + "No budget agreed": "Ingen budget avtalad", + "Hours": "Timmar", + "Only the project owner and the portfolio managers see the amounts.": "Bara projektägaren och portföljförvaltarna ser beloppen.", + "Budget against cost per category": "Budget mot kostnader per kategori", + "Labour (booked time)": "Arbete (registrerad tid)", + "No category": "Ingen kategori", + "Hours are not available": "Timmarna är inte tillgängliga", + "Not yet assigned to a category": "Ännu inte tilldelad en kategori", + "Total": "Totalt", + "{spent} spent, {remaining} remaining": "{spent} förbrukat, {remaining} kvar", + "Budget against cost per phase": "Budget mot kostnader per fas", + "No phase": "Ingen fas", + "Cost lines": "Kostnadsrader", + "From the finance system": "Från ekonomisystemet", + "Edit cost line {amount}": "Redigera kostnadsraden {amount}", + "No cost lines yet": "Inga kostnadsrader ännu", + "Commitments": "Åtaganden", + "Actual cost": "Faktisk kostnad", + "Forecast": "Prognos", + "Remaining": "Återstår", + "Not planned yet": "Inte planerat ännu", + "{start} to {end}": "{start} till {end}", + "The terms were not saved. Please try again.": "Villkoren sparades inte. Försök igen.", + "Terms saved": "Villkor sparade", + "Fixed price": "Fast pris", + "Hourly": "Per timme", + "Not billed": "Faktureras inte", + "Commitment": "Åtagande", + "Edit cost line": "Redigera kostnadsrad", + "Kind": "Typ", + "Amount in euro": "Belopp i euro", + "Remove": "Ta bort", + "Could not save the cost line. Only the project owner changes the money of a project.": "Kostnadsraden kunde inte sparas. Bara projektägaren ändrar ett projekts pengar.", + "Could not remove the cost line. Please try again.": "Kostnadsraden kunde inte tas bort. Försök igen.", + "{amount} over budget": "{amount} över budget", + "Cost categories": "Kostnadskategorier", + "The categories every project splits its budget and costs into, one per line": "Kategorierna som varje projekt delar upp sin budget och sina kostnader i, en per rad", + "Categories": "Kategorier", + "Give at least one category, each name once.": "Ange minst en kategori, varje namn en gång.", + "Cost categories saved": "Kostnadskategorier sparade", + "The cost categories were not saved. Please try again.": "Kostnadskategorierna sparades inte. Försök igen.", + "Finance line": "Ekonomirad", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Ett penningbelopp i ett projekt: en budget, ett åtagande, en faktisk kostnad eller en prognos, i en kostnadskategori och eventuellt en fas. Inmatad av projektägaren eller skickad av ekonomisystemet via integrationsappen.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Projektet som beloppet hör till. Tomt för en rad från ekonomisystemet vars projektnummer inte matchar något projekt.", + "The phase this amount belongs to, if any": "Fasen som beloppet hör till, om någon", + "The cost category, one of the categories the admin set up": "Kostnadskategorin, en av de kategorier administratören har lagt upp", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Om beloppet är en budget, ett åtagande, en faktisk kostnad eller en prognos", + "Amount": "Belopp", + "The amount in the reporting currency (euro)": "Beloppet i rapporteringsvalutan (euro)", + "The date the amount was booked or is expected": "Datumet då beloppet bokfördes eller förväntas", + "What the amount is for": "Vad beloppet avser", + "Whether a person entered the line or the finance system sent it": "Om en person matade in raden eller ekonomisystemet skickade den", + "Entered by hand": "Inmatad för hand", + "Finance line id": "Ekonomiradens id", + "The finance system's own id of this line. One imported line per id.": "Radens eget id i ekonomisystemet. En importerad rad per id.", + "Project number": "Projektnummer", + "The project number the finance system sent, matched against the project key": "Projektnumret som ekonomisystemet skickade, jämfört med projektnyckeln", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Portföljen för radens projekt, kopierad från projektet så att portföljsummor behöver ett filter", + "Finance readers": "Ekonomiläsare", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Nextcloud-användar-UID:n för personerna som får se beloppet: projektägaren och portföljens förvaltare", + "Project owner": "Projektägare", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Nextcloud-användar-UID för projektägaren, som får ändra och ta bort manuella rader", + "How the client pays: not billed, a fixed price, or by the hour.": "Hur kunden betalar: faktureras inte, fast pris eller per timme.", + "Portfolio finance": "Portföljekonomi", + "You cannot see the money of any project in this portfolio": "Du kan inte se pengarna för något projekt i den här portföljen", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Servern returnerade kostnadsrader från projekt utanför den här portföljen, så summorna kan vara fel.", + "Projects left out because you cannot see their money: {count}": "Projekt som utelämnats eftersom du inte kan se deras pengar: {count}", + "Unmatched finance lines": "Omatchade ekonomirader", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Budget, åtaganden, faktisk kostnad och prognos summerade för en portfölj.", + "Subprojects": "Delprojekt", + "{done} of {total}": "{done} av {total}", + "{done} of {total} tasks done, including subprojects": "{done} av {total} uppgifter klara, delprojekt inräknade", + "Show the subprojects of {title}": "Visa delprojekten under {title}", + "Hide the subprojects of {title}": "Dölj delprojekten under {title}", + "Part of": "Del av", + "No parent project": "Inget överordnat projekt", + "A project cannot sit under one of its own subprojects.": "Ett projekt kan inte ligga under ett av sina egna delprojekt.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projekt kan ligga högst tre nivåer djupt: program, projekt och delprojekt.", + "Parent project": "Överordnat projekt", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Projektet som detta projekt ligger under, till exempel ett program. Projekt kan ligga högst tre nivåer djupt.", + "Yes": "Ja", + "No": "Nej", + "{label} (required)": "{label} (obligatoriskt)", + "{label} is required": "{label} är obligatoriskt", + "Project field": "Projektfält", + "A field an admin adds to every project, such as a policy area or a contract value.": "Ett fält som en administratör lägger till i varje projekt, till exempel ett policyområde eller ett kontraktsvärde.", + "Key": "Nyckel", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Det fasta namnet som värdet sparas under, i lower camel case. Behåll det när projekt använder det.", + "Label": "Etikett", + "The name people see next to the field": "Namnet som visas vid fältet", + "What the field holds": "Vad fältet innehåller", + "Text": "Text", + "Number": "Tal", + "Choice": "Val", + "Person": "Person", + "Yes or no": "Ja eller nej", + "Options": "Alternativ", + "The choices of a choice field": "Valen i ett valfält", + "Required": "Obligatoriskt", + "Whether a project must fill in the field": "Om ett projekt måste fylla i fältet", + "Where the field appears, lowest first": "Var fältet visas, lägsta först", + "Applies to": "Gäller för", + "What the field is added to": "Vad fältet läggs till på", + "Custom fields": "Egna fält", + "The values of the project fields an admin defined, keyed by the field's key.": "Värdena i de projektfält som en administratör har definierat, efter fältets nyckel.", + "Project fields": "Projektfält", + "Related": "Relaterade", + "Remove link": "Ta bort länk", + "Link type": "Länktyp", + "Relates to": "Relaterar till", + "Duplicates": "Duplicerar", + "Project key": "Projektnyckel", + "Every task number starts with it, such as VERG-42.": "Varje uppgiftsnummer börjar med den, till exempel VERG-42.", + "This key is already used by another project.": "Den här nyckeln används redan av ett annat projekt.", + "Use 2 to 10 letters and digits, starting with a letter.": "Använd 2 till 10 bokstäver och siffror som börjar med en bokstav.", + "The key cannot change once tasks carry it.": "Nyckeln kan inte ändras när uppgifter bär den.", + "Project saved. The existing tasks get their numbers in the background.": "Projektet sparat. De befintliga uppgifterna får sina nummer i bakgrunden.", + "Next task number": "Nästa uppgiftsnummer", + "The number the next task of this project gets in its key. Only the system writes it.": "Numret som nästa uppgift i det här projektet får i sin nyckel. Bara systemet skriver det.", + "Restore {title}": "Återställ {title}", + "Restore": "Återställ", + "Project restored": "Projektet har återställts", + "Could not restore the project": "Det gick inte att återställa projektet", + "Bring this project back to the active list.": "Flytta tillbaka projektet till listan över aktiva projekt.", + "Restore project": "Återställ projekt", + "Request reason": "Skäl för begäran", + "Why the requester needs this project. Filled in when the project is requested.": "Varför den som begär projektet behöver det. Fylls i vid begäran.", + "Reviewed by": "Granskad av", + "The user who approved or rejected the request.": "Användaren som godkände eller avslog begäran.", + "Reviewed at": "Granskad", + "When the request was approved or rejected.": "När begäran godkändes eller avslogs.", + "Review note": "Granskningsanteckning", + "The reviewer's reason, shown to the requester when a request is not approved.": "Granskarens skäl, som visas för den som begärde projektet när en begäran inte godkänns.", + "Members of these groups": "Medlemmar i dessa grupper", + "Groups that may create projects": "Grupper som får skapa projekt", + "The group {group} no longer exists. Save to remove it.": "Gruppen {group} finns inte längre. Spara för att ta bort den.", + "Review project request": "Granska projektbegäran", + "Requested by": "Begärd av", + "Why it is needed": "Varför det behövs", + "Desired start date": "Önskat startdatum", + "Why is it not approved?": "Varför godkänns det inte?", + "Give a reason. The requester sees it.": "Ange ett skäl. Den som begärde ser det.", + "Approve": "Godkänn", + "Reject": "Avslå", + "Reject request": "Avslå begäran", + "The review was not saved. Try again.": "Granskningen sparades inte. Försök igen.", + "This project is waiting for review": "Projektet väntar på granskning", + "This request was not approved": "Begäran godkändes inte", + "Reason: {note}": "Skäl: {note}", + "Review request": "Granska begäran", + "Request a project": "Begär ett projekt", + "Step {step} of 2": "Steg {step} av 2", + "Why is this project needed?": "Varför behövs projektet?", + "Give a reason. The reviewer reads it.": "Ange ett skäl. Granskaren läser det.", + "Back": "Tillbaka", + "Next": "Nästa", + "Send request": "Skicka begäran", + "The request was not sent. Try again.": "Begäran skickades inte. Försök igen.", + "Requested": "Begärd", + "Not approved": "Inte godkänd", + "Your request was sent": "Din begäran har skickats", + "Let everyone else request a project": "Låt alla andra begära ett projekt", + "Add a task": "Lägg till en uppgift", + "Delete task": "Ta bort uppgift", + "Edit task": "Redigera uppgift", + "Write": "Skriv", + "Preview": "Förhandsgranska", + "Markdown works here: headings, lists and links.": "Markdown fungerar här: rubriker, listor och länkar.", + "Could not save the task. Please try again.": "Uppgiften kunde inte sparas. Försök igen.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "Det finns registrerad tid på \"{title}\", så den kan inte tas bort. Du kan avbryta den i stället: tidsposterna finns kvar.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Ta bort \"{title}\"? Dess länkar till andra uppgifter tas också bort. Detta kan inte ångras.", + "Keep task": "Behåll uppgift", + "Cancel task": "Avbryt uppgift", + "Only the reporter, the project owner or an admin can delete this task.": "Endast rapportören, projektägaren eller en administratör kan ta bort den här uppgiften.", + "Could not delete the task. Please try again.": "Uppgiften kunde inte tas bort. Försök igen.", + "Could not cancel the task. Please try again.": "Uppgiften kunde inte avbrytas. Försök igen.", + "Responsible": "Ansvarig", + "Also working on this": "Arbetar också med detta", + "Labels": "Etiketter", + "Could not change the priority. Please try again.": "Prioriteten kunde inte ändras. Försök igen.", + "Other project members who work on this task alongside the person responsible.": "Andra projektmedlemmar som arbetar med uppgiften tillsammans med den ansvariga.", + "Duplicate": "Duplicera", + "Could not copy the task. Please try again.": "Uppgiften kunde inte kopieras. Försök igen.", + "Subtasks": "Deluppgifter", + "{done} of {total} done": "{done} av {total} klara", + "Add a subtask": "Lägg till en deluppgift", + "Checklist": "Checklista", + "Checklist item actions": "Åtgärder för checklistpunkt", + "Add a checklist item": "Lägg till en checklistpunkt", + "Subtasks: {estimate} estimated, {logged} logged": "Deluppgifter: {estimate} uppskattat, {logged} registrerat", + "Total estimate: {total}": "Total uppskattning: {total}", + "Part of {title}": "Del av {title}", + "Checklist: {count} done": "Checklista: {count} klara", + "This task has subtasks: {count}.": "Den här uppgiften har deluppgifter: {count}.", + "Keep subtasks as separate tasks": "Behåll deluppgifterna som separata uppgifter", + "Delete subtasks too": "Ta bort deluppgifterna också", + "Copy of {title}": "Kopia av {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Uppgiften kopierades, men inte alla dess deluppgifter. Kontrollera kopian.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Små steg inom uppgiften. Varje punkt har ett id, en text och om den är klar.", + "Open work per person and per project.": "Öppet arbete per person och per projekt.", + "View": "Vy", + "By person": "Per person", + "By project": "Per projekt", + "Hours left": "Timmar kvar", + "Tasks without an estimate": "Uppgifter utan uppskattning", + "Due in 14 days": "Förfaller inom 14 dagar", + "Shared": "Delade", + "Unassigned": "Ej tilldelade", + "{hours} h": "{hours} h", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Visar arbete i de projekt du kan se. Timmar räknas för den ansvariga; delade uppgifter räknas utan timmar.", + "No open work in these projects.": "Inget öppet arbete i dessa projekt.", + "Open work": "Öppet arbete", + "{count} open tasks": "{count} öppna uppgifter", + "Create a project to see capacity here.": "Skapa ett projekt för att se kapaciteten här.", + "My tasks": "Mina uppgifter", + "Show all my tasks": "Visa alla mina uppgifter", + "No tasks assigned to you": "Inga uppgifter är tilldelade dig", + "Browse projects": "Bläddra bland projekt", + "Later": "Senare", + "Due {date}": "Förfaller {date}", + "Could not change the status. Please try again.": "Statusen kunde inte ändras. Försök igen.", + "Completed today": "Klara i dag", + "My open tasks": "Mina öppna uppgifter", + "My overdue tasks": "Mina försenade uppgifter", + "My tasks in progress": "Mina pågående uppgifter", + "Pin to the top": "Fäst överst", + "Unpin": "Lossa", + "Pinned": "Fäst", + "Actions for {title}": "Åtgärder för {title}", + "Could not save your project order. Please try again.": "Din projektordning kunde inte sparas. Försök igen.", + "No boards yet": "Inga tavlor än", + "Create a project to get a board.": "Skapa ett projekt för att få en tavla.", + "Use the Projects page to create and manage your projects and tasks.": "Använd sidan Projekt för att skapa och hantera dina projekt och uppgifter.", + "Go to projects": "Gå till projekt", + "You are not a member of any projects yet.": "Du är inte medlem i något projekt än.", + "Could not search for users. Please try again.": "Det gick inte att söka efter användare. Försök igen.", + "Project creation is restricted to administrators.": "Endast administratörer kan skapa projekt.", + "Only the project owner or an administrator can delete this project.": "Endast projektägaren eller en administratör kan ta bort det här projektet.", + "No projects are available to you yet. Ask an administrator to create one.": "Inga projekt är tillgängliga för dig än. Be en administratör skapa ett.", + "Due: {date}": "Förfaller: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Uppgifter med start- eller förfallodatum visas på tidslinjen. Lägg till datum för att se dem här.", + "You do not have access to this project.": "Du har inte åtkomst till det här projektet.", + "Zoom level": "Zoomnivå", + "Unscheduled": "Ej planerade", + "Start: {date}": "Start: {date}", + "Today": "I dag", + "No scheduled tasks": "Inga planerade uppgifter", + "An unexpected error occurred.": "Ett oväntat fel uppstod.", + "Column {number} name": "Namn på kolumn {number}", + "Failed to save creation policy": "Det gick inte att spara policyn för att skapa projekt", + "All authenticated users": "Alla inloggade användare", + "Control who may create new projects": "Styr vem som får skapa nya projekt", + "Administrators only": "Endast administratörer", + "Project creation": "Skapa projekt", + "Allow project creation": "Tillåt att projekt skapas", + "Creation policy saved successfully": "Policyn för att skapa projekt har sparats", + "Initializing…": "Startar…", + "e.g. 2h 30m, 90m, 1.5h": "t.ex. 2h 30m, 90m, 1.5h", + "Log time": "Registrera tid", + "Save estimate": "Spara uppskattning", + "Logged: {logged}": "Registrerat: {logged}", + "over by {amount}": "{amount} över", + "Time tracking": "Tidrapportering", + "Estimate": "Uppskattning", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Ange en giltig uppskattning (t.ex. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Ange en giltig varaktighet (t.ex. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Tidsposten kunde inte sparas. Försök igen.", + "Edit time entry": "Redigera tidspost", + "Duration": "Varaktighet", + "Date range": "Period", + "Last week": "Förra veckan", + "No time logged": "Ingen tid registrerad", + "Log time on a task to see it here.": "Registrera tid på en uppgift för att se den här.", + "To date": "Till datum", + "This week": "Den här veckan", + "Total: {total}": "Totalt: {total}", + "From date": "Från datum", + "Custom range": "Egen period", + "All time": "All tid", + "Could not delete a task, so some data may remain. Try deleting the project again.": "En uppgift kunde inte tas bort, så data kan finnas kvar. Ta bort projektet igen.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "En tidspost kunde inte tas bort, så data kan finnas kvar. Ta bort projektet igen.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "En kolumn kunde inte tas bort, så data kan finnas kvar. Ta bort projektet igen.", + "Could not delete the project. Please try again.": "Projektet kunde inte tas bort. Försök igen.", + "Notification settings": "Aviseringsinställningar", + "Configure when due-date reminders are sent": "Ange när påminnelser om förfallodatum skickas", + "Due-date reminder lead time (hours)": "Framförhållning för påminnelse (timmar)", + "Lead time must be between 1 and 336 hours": "Framförhållningen måste vara mellan 1 och 336 timmar", + "Reminder lead time saved successfully": "Framförhållningen för påminnelsen har sparats", + "Failed to save reminder lead time": "Framförhållningen för påminnelsen kunde inte sparas", + "Notifications": "Aviseringar", + "Notify me 1 day before a task's due date": "Meddela mig 1 dag före en uppgifts förfallodatum", + "Draft": "Utkast", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Om lektionen är ett utkast som bara läraren ser, blir av eller är inställd.", + "New release": "Ny version", + "Roadmap chart. The same releases and epics are listed below.": "Färdplansdiagram. Samma versioner och epics finns i listan nedan.", + "Nothing on the roadmap yet": "Inget på färdplanen än", + "Releases with a target date and epics with dated tasks appear here.": "Här visas versioner med ett måldatum och epics med daterade uppgifter.", + "Releases": "Versioner", + "No releases yet": "Inga versioner än", + "Target date: {date}": "Måldatum: {date}", + "No target date": "Inget måldatum", + "Edit {name}": "Redigera {name}", + "Mark {name} as released": "Markera {name} som släppt", + "Mark as released": "Markera som släppt", + "Epics": "Epics", + "No epics yet. Open a task to make it an epic.": "Inga epics än. Öppna en uppgift för att göra den till en epic.", + "Not scheduled yet": "Inte schemalagd än", + "Planned": "Planerad", + "Released": "Släppt", + "Edit release": "Redigera version", + "Target date": "Måldatum", + "Could not save the release. Please try again.": "Versionen kunde inte sparas. Försök igen.", + "Every task of this release is done or cancelled.": "Alla uppgifter i den här versionen är klara eller avbrutna.", + "Not finished yet: {count}": "Inte klara än: {count}", + "What happens to these tasks?": "Vad händer med de här uppgifterna?", + "Move to {name}": "Flytta till {name}", + "Remove the release": "Ta bort versionen", + "Keep it on {name}": "Behåll dem i {name}", + "Could not mark the release as released. Please try again.": "Versionen kunde inte markeras som släppt. Försök igen.", + "Roadmap": "Färdplan", + "Tasks or roadmap": "Uppgifter eller färdplan", + "Release": "Version", + "Epic": "Epic", + "This task is an epic": "Den här uppgiften är en epic", + "A named, dated delivery of a project that its tasks are planned against.": "En namngiven, daterad leverans från ett projekt som projektets uppgifter planeras mot.", + "Name of the release": "Versionens namn", + "The project this release belongs to": "Projektet som versionen hör till", + "What this release delivers": "Vad versionen levererar", + "When work on the release starts": "När arbetet med versionen börjar", + "The date the release is due": "Datumet då versionen ska vara klar", + "Whether the release is planned, released or archived": "Om versionen är planerad, släppt eller arkiverad", + "Released on": "Släppt den", + "When the release was marked as released": "När versionen markerades som släppt", + "The release this task is planned for": "Den version som uppgiften är planerad för", + "Board view options": "Visningsalternativ för tavlan", + "Colour cards": "Färglägg kort", + "No colour": "Ingen färg", + "By label": "Efter etikett", + "Swimlanes": "Simbanor", + "No swimlanes": "Inga simbanor", + "By assignee": "Efter ansvarig", + "By epic": "Efter epic", + "No assignee": "Inte tilldelad", + "No epic": "Ingen epic", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kort stannar i sin epic-rad. Byt epic på uppgiftssidan.", + "Hand over to": "Lämna över till", + "Could not save your board view. It applies until you reload.": "Din tavelvy kunde inte sparas. Den gäller tills du laddar om.", + "Timetable wish": "Schemaönskemål", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Ett önskemål som generatorn väger in. Ett hårt önskemål håller den alltid, ett mjukt där det går.", + "Whether the wish is about a teacher, a group, a room or one activity": "Om önskemålet gäller en lärare, en grupp, en sal eller en aktivitet", + "Teacher": "Lärare", + "Group": "Grupp", + "Reference": "Referens", + "The user, group, room or activity the wish is about": "Användaren, gruppen, salen eller aktiviteten som önskemålet gäller", + "What the wish asks for": "Vad önskemålet begär", + "Not on these periods": "Inte på dessa pass", + "Preferably not on these periods": "Helst inte på dessa pass", + "At most a number of lessons a day": "Högst ett antal lektioner per dag", + "No free periods between lessons": "Inga håltimmar mellan lektionerna", + "Always the same room": "Alltid samma sal", + "Periods": "Pass", + "The periods of the week the wish is about, such as wed-5": "Veckans pass som önskemålet gäller, till exempel wed-5", + "Limit": "Gräns", + "The most lessons a day, for a wish of that kind": "Flest lektioner per dag, för ett önskemål av det slaget", + "Strength": "Styrka", + "Whether the generator must keep the wish or should keep it": "Om generatorn måste eller bör hålla önskemålet", + "Hard": "Hårt", + "Soft": "Mjukt", + "Weight": "Vikt", + "How much a soft wish counts, from 1 to 3": "Hur mycket ett mjukt önskemål väger, från 1 till 3", + "Why the wish exists": "Varför önskemålet finns", + "Timetable scenario": "Schemascenario", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Ett veckomönster, gjort av generatorn eller hämtat ur det nuvarande schemat. Det sparar sin indata och hur väl det håller önskemålen.", + "The name timetablers know the scenario by": "Namnet som schemaläggarna känner scenariot under", + "Whether the generator made it or it came from the current timetable": "Om generatorn gjorde det eller om det kommer från det nuvarande schemat", + "Generated": "Genererat", + "From the current timetable": "Från det nuvarande schemat", + "Week of": "Vecka från", + "The Monday of the first week of the window": "Måndagen i periodens första vecka", + "Window start": "Periodens början", + "The first day the week pattern applies to": "Den första dagen veckomönstret gäller", + "Window end": "Periodens slut", + "The last day the week pattern applies to": "Den sista dagen veckomönstret gäller", + "Waiting, generating, done, failed, or published as draft lessons": "Väntar, genereras, klart, misslyckat eller publicerat som utkastlektioner", + "Waiting": "Väntar", + "Generating": "Genereras", + "Failed": "Misslyckat", + "Published": "Publicerat", + "Seed": "Frö", + "The number the generator starts from, so a run can be repeated": "Talet som generatorn börjar från, så att en körning kan upprepas", + "Input": "Indata", + "The periods, rooms, lessons and wishes the scenario was made from": "Passen, salarna, lektionerna och önskemålen som scenariot gjordes av", + "Placements": "Placeringar", + "Each lesson with the period and room it was given": "Varje lektion med passet och salen den fick", + "Unplaced lessons": "Oplacerade lektioner", + "Lessons without a place, each with the hard wish that blocked it": "Lektioner utan plats, var och en med det hårda önskemål som stoppade den", + "Broken wishes": "Brutna önskemål", + "The wishes this scenario breaks, with the lessons that break them": "Önskemålen som scenariot bryter, med lektionerna som bryter dem", + "Measures": "Mått", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Placerade lektioner, brutna önskemål, håltimmar, lektioner per dag och salsanvändning", + "Reason": "Orsak", + "Why the run failed": "Varför körningen misslyckades", + "Published at": "Publicerat", + "When the scenario was written out as draft lessons": "När scenariot skrevs ut som utkastlektioner", + "Edit wish": "Redigera önskemål", + "New wish": "Nytt önskemål", + "Hard: the generator always keeps it": "Hårt: generatorn följer det alltid", + "Soft: the generator keeps it where it can": "Mjukt: generatorn följer det där den kan", + "Weight (1 to 3)": "Vikt (1 till 3)", + "Most lessons a day": "Högst antal lektioner per dag", + "Period": "Lektion", + "{day} period {number}": "{day} lektion {number}", + "Teacher (user name)": "Lärare (användarnamn)", + "Activity (group:subject)": "Aktivitet (grupp:ämne)", + "Say who or what the wish is about.": "Ange vem eller vad önskemålet gäller.", + "Choose at least one period.": "Välj minst en lektion.", + "The limit is a whole number of 1 or more.": "Gränsen är ett heltal på 1 eller mer.", + "Timetable": "Schema", + "Wishes": "Önskemål", + "Timetable wishes": "Schemaönskemål", + "Generator run": "Generatorkörning", + "Generator progress": "Generatorns förlopp", + "The run failed: {reason}": "Körningen misslyckades: {reason}", + "{placed} of {lessons} lessons placed": "{placed} av {lessons} lektioner placerade", + "Generate again": "Generera igen", + "Generate": "Generera", + "Every lesson has a place.": "Varje lektion har en plats.", + "Lesson": "Lektion", + "No free period and room": "Ingen ledig lektion och sal", + "Broken soft wishes": "Brutna mjuka önskemål", + "Every soft wish is kept.": "Varje mjukt önskemål hålls.", + "Wish": "Önskemål", + "Lessons": "Lektioner", + "Generating: {percent}% of the time budget used": "Genererar: {percent} % av tiden använd", + "Waiting to start": "Väntar på start", + "Published as draft lessons": "Publicerat som utkastlektioner", + "Could not read the scenario.": "Scenariot kunde inte läsas.", + "Could not start the run.": "Körningen kunde inte startas.", + "Scenarios": "Scenarier", + "Timetable scenarios": "Schemascenarier", + "Scenario": "Scenario", + "Take the current timetable": "Använd det nuvarande schemat", + "Could not take the current timetable.": "Det gick inte att hämta det nuvarande schemat.", + "Broken hard wishes": "Brutna hårda önskemål", + "Not on a period of the week grid": "Inte på en lektion i veckoschemat", + "Compare scenarios": "Jämför scenarier", + "Scenarios to compare": "Scenarier att jämföra", + "Choose two or three scenarios to compare them.": "Välj två eller tre scenarier att jämföra.", + "Measure": "Mått", + "Best": "Bäst", + "Lessons that differ": "Lektioner som skiljer sig", + "No lesson differs.": "Ingen lektion skiljer sig.", + "Not placed": "Inte placerad", + "{period} in {room}": "{period} i {room}", + "Lessons placed": "Placerade lektioner", + "Lessons without a place": "Lektioner utan plats", + "Clashes": "Krockar", + "Hard wishes broken": "Brutna hårda önskemål", + "Soft wishes broken": "Brutna mjuka önskemål", + "Soft wishes broken, weighted": "Brutna mjuka önskemål, viktade", + "Free periods between lessons, all teachers": "Håltimmar, alla lärare", + "Most free periods of one teacher": "Flest håltimmar för en lärare", + "Most lessons of one group on a day": "Flest lektioner för en grupp en dag", + "Room use": "Salsanvändning", + "Publish as draft lessons": "Publicera som utkastlektioner", + "Draft lessons written: {count}": "Utkastlektioner skrivna: {count}", + "Could not publish the scenario.": "Det gick inte att publicera scenariot.", + "Rules": "Regler", + "Rules for {column}": "Regler för {column}", + "When a card enters this column": "När ett kort kommer in i den här kolumnen", + "Action": "Åtgärd", + "Set the priority": "Ange prioritet", + "Assign to": "Tilldela", + "Assign the person who moved the card": "Tilldela personen som flyttade kortet", + "Remove the assignee": "Ta bort ansvarig", + "Add a label": "Lägg till en etikett", + "No longer a project member": "Inte längre projektmedlem", + "This label no longer exists": "Den här etiketten finns inte längre", + "Add rule": "Lägg till regel", + "Remove rule": "Ta bort regel", + "No rules yet. Add one to change a card when it enters this column.": "Inga regler än. Lägg till en för att ändra ett kort när det kommer in i den här kolumnen.", + "Could not save the rules. Please try again.": "Reglerna kunde inte sparas. Försök igen.", + "1 rule runs when a card enters this column": "1 regel körs när ett kort kommer in i den här kolumnen", + "{count} rules run when a card enters this column": "{count} regler körs när ett kort kommer in i den här kolumnen", + "Rules applied: {changes}": "Regler tillämpade: {changes}", + "assigned to {name}": "tilldelad {name}", + "assignee removed": "ansvarig borttagen", + "priority {priority}": "prioritet {priority}", + "label {label}": "etikett {label}", + "What happens to a card when it enters this column, applied in list order.": "Vad som händer med ett kort när det kommer in i den här kolumnen, i listans ordning.", + "Value": "Värde", + "What the rule does to the card.": "Vad regeln gör med kortet.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Prioriteten, användar-id:t eller etikett-id:t som åtgärden använder; tomt för åtgärder utan värde.", + "is not": "är inte", + "{dimension} is not": "{dimension} är inte", + "Saved filters": "Sparade filter", + "No saved filters yet": "Inga sparade filter än", + "Save filter": "Spara filter", + "Rename \"{name}\"": "Byt namn på ”{name}”", + "Delete \"{name}\"": "Ta bort ”{name}”", + "Clear filters": "Rensa filter", + "Showing {shown} of {total} tasks": "Visar {shown} av {total} uppgifter", + "Me": "Jag", + "No date": "Inget datum", + "Rename saved filter": "Byt namn på sparat filter", + "Share with the project": "Dela med projektet", + "Give the filter a name": "Ge filtret ett namn", + "Could not save the filter. Please try again.": "Filtret kunde inte sparas. Försök igen.", + "Some labels in \"{name}\" no longer exist and were left out.": "Några etiketter i ”{name}” finns inte längre och har utelämnats.", + "Could not delete the filter. Please try again.": "Filtret kunde inte tas bort. Försök igen.", + "Saved filter": "Sparat filter", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Ett namngivet tavelfilter för ett projekt, privat för den som sparade det om det inte delas med projektet.", + "The project whose board the filter applies to": "Projektet vars tavla filtret gäller", + "The name the filter is listed under": "Namnet som filtret listas under", + "Saved by": "Sparat av", + "Nextcloud user id of the person who saved the filter": "Nextcloud-användar-id för den som sparade filtret", + "Shared with the project": "Delat med projektet", + "Whether every project member sees and applies the filter": "Om varje projektmedlem ser och kan använda filtret", + "Criteria": "Villkor", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtret: ansvarig, etikett, prioritet och förfallodatum, var och en med är eller är inte och sina värden", + "Cross-project view": "Projektövergripande vy", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Ett sparat urval av projekt vars uppgifter visas tillsammans i statusbanor, delat med de personer det nämner.", + "Shared with": "Delad med", + "The name the view is listed under": "Namnet som vyn listas under", + "Nextcloud user id of the person who saved the view": "Nextcloud-användar-id för personen som sparade vyn", + "Nextcloud user ids of the people the view is shared with": "Nextcloud-användar-id:n för personerna som vyn delas med", + "The projects whose tasks the view shows, at most twenty": "Projekten vars uppgifter vyn visar, högst tjugo", + "1 project in this view is hidden from you.": "1 projekt i den här vyn är dolt för dig.", + "{count} projects in this view are hidden from you.": "{count} projekt i den här vyn är dolda för dig.", + "{project} has no column for {status}.": "{project} har ingen kolumn för {status}.", + "This view does not exist or is not shared with you.": "Den här vyn finns inte eller är inte delad med dig.", + "\"{task}\" moved to {status}.": "\"{task}\" flyttad till {status}.", + "Project: {title}": "Projekt: {title}", + "Cross-project views": "Projektövergripande vyer", + "New view": "Ny vy", + "Edit view": "Redigera vy", + "Delete view": "Ta bort vy", + "Give the view a name": "Ge vyn ett namn", + "Pick at least one project": "Välj minst ett projekt", + "A view shows at most {max} projects": "En vy visar högst {max} projekt", + "Could not save the view. Please try again.": "Det gick inte att spara vyn. Försök igen.", + "Could not delete the view. Please try again.": "Det gick inte att ta bort vyn. Försök igen.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Ta bort \"{title}\"? Projekten och deras uppgifter förblir som de är.", + "People see the tasks of the projects they are in, never more.": "Var och en ser uppgifterna i de projekt de är med i, aldrig mer.", + "No views yet. A view shows the tasks of several of your projects together.": "Inga vyer än. En vy visar uppgifterna från flera av dina projekt tillsammans.", + "Projects in view: {count}": "Projekt i vyn: {count}", + "Notify me when a task is assigned to me": "Meddela mig när en uppgift tilldelas mig", + "Also send these to me by email": "Skicka dem även till mig via e-post", + "Add an email address in your Nextcloud personal settings to get mail.": "Lägg till en e-postadress i dina personliga Nextcloud-inställningar för att få e-post.", + "Code link": "Kodlänk", + "A commit, branch, merge request or issue in a code forge that works on a task.": "En commit, gren, merge request eller ett ärende i en kodplattform som arbetar med en uppgift.", + "The task the link belongs to": "Uppgiften som länken hör till", + "The project of the task": "Uppgiftens projekt", + "Task key": "Uppgiftsnyckel", + "The task key the forge text named, such as VC-12": "Uppgiftsnyckeln som texten i kodplattformen nämnde, till exempel VC-12", + "What the link points at": "Vad länken pekar på", + "Link": "Länk", + "The address of the item in the forge": "Objektets adress i kodplattformen", + "The commit message, branch name or merge request title": "Commit-meddelandet, grennamnet eller titeln på merge requesten", + "Repository": "Repository", + "The repository, such as acme/portal": "Repositoryt, till exempel acme/portal", + "Forge id": "Id i plattformen", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Objektets eget id i kodplattformen, till exempel github:acme/portal#42 eller en commit-hash", + "State": "Status", + "The state of a merge request or issue": "Status för en merge request eller ett ärende", + "Who made the commit or opened the merge request": "Vem som gjorde committen eller öppnade merge requesten", + "When the commit was made or the merge request last changed": "När committen gjordes eller merge requesten senast ändrades", + "Added by": "Tillagd av", + "Whether a person added the link or the integration wrote it": "Om en person lade till länken eller integrationen skrev den", + "Nextcloud user UIDs of project members": "Nextcloud-användar-id:n för projektmedlemmar", + "Add link": "Lägg till länk", + "Added by hand": "Tillagd för hand", + "Branch": "Gren", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Från integrationen", + "Link to a commit, branch or merge request": "Länk till en commit, gren eller merge request", + "Merge request": "Merge request", + "Merged": "Sammanfogad", + "No code linked yet. Name {key} in a commit message or paste a link.": "Ingen kod länkad än. Nämn {key} i ett commit-meddelande eller klistra in en länk.", + "No code linked yet. Paste a link to a commit or merge request.": "Ingen kod länkad än. Klistra in en länk till en commit eller merge request.", + "Paste a web address that starts with https://.": "Klistra in en webbadress som börjar med https://.", + "Remove link {title}": "Ta bort länken {title}", + "The link could not be added.": "Länken kunde inte läggas till.", + "The link could not be removed.": "Länken kunde inte tas bort.", + "This link is already on the task.": "Den här länken finns redan på uppgiften.", + "Code forges": "Kodplattformar", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Länka GitHub-commits och pull requests till uppgifter. Integriq tar emot händelserna; planninq anropar aldrig GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Ladda ner konfigurationen och importera den i Integriq. Fyll sedan i en hemlighet i regeln \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "Lägg i GitHub till en webhook i repositoryt med den här adressen och samma hemlighet. Välj innehållstypen application/json och händelserna push och pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Nämn uppgiftsnyckeln, till exempel VC-12, i ett commit-meddelande, ett grennamn eller titeln på en pull request. Länken visas då på den uppgiften.", + "Without Integriq, project members can still paste a link on the task page.": "Utan Integriq kan projektmedlemmar fortfarande klistra in en länk på uppgiftssidan.", + "Download the Integriq configuration": "Ladda ner Integriq-konfigurationen", + "Calendar": "Kalender", + "Previous": "Föregående", + "Calendar view": "Kalendervy", + "Starts:": "Börjar:", + "No tasks with a date in this month.": "Inga uppgifter med datum den här månaden.", + "Week of {start} to {end}": "Vecka från {start} till {end}", + "My calendar": "Min kalender", + "Show as list": "Visa som lista", + "Show as calendar": "Visa som kalender", + "Open my calendar": "Öppna min kalender", + "Nextcloud Tasks": "Nextcloud Uppgifter", + "Show my tasks in Nextcloud Tasks": "Visa mina uppgifter i Nextcloud Uppgifter", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Uppgifterna som tilldelats dig eller delats med dig visas i en lista \"Planninq\" i Nextcloud Uppgifter och Kalender. Ändringar du gör där ersätts vid nästa ändring i Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Den här servern kan inte skriva till Nextcloud Uppgifter, så exporten är inte tillgänglig.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Hanteras av Planninq. Ändringar du gör här ersätts vid nästa ändring i Planninq.", + "Working days and holidays": "Arbetsdagar och helgdagar", + "Dates set on the timeline skip the days that are not working days.": "Datum som sätts på tidslinjen hoppar över dagar som inte är arbetsdagar.", + "Working weekdays": "Veckans arbetsdagar", + "Non-working days": "Lediga dagar", + "No non-working days yet.": "Inga lediga dagar än.", + "Add day": "Lägg till dag", + "Year": "År", + "Add Dutch national holidays": "Lägg till nederländska helgdagar", + "Save working days": "Spara arbetsdagar", + "Choose at least one working weekday.": "Välj minst en arbetsdag.", + "Working days saved.": "Arbetsdagarna har sparats.", + "Could not save the working days.": "Arbetsdagarna kunde inte sparas.", + "New Year's Day": "Nyårsdagen", + "Easter Sunday": "Påskdagen", + "Easter Monday": "Annandag påsk", + "King's Day": "Kungens dag", + "Liberation Day": "Befrielsedagen", + "Ascension Day": "Kristi himmelfärdsdag", + "Whit Sunday": "Pingstdagen", + "Whit Monday": "Annandag pingst", + "Christmas Day": "Juldagen", + "Boxing Day": "Annandag jul", + "Dates of {title}": "Datum för {title}", + "The due date cannot be before the start date.": "Förfallodatumet kan inte ligga före startdatumet.", + "{title}, from {start} to {end}": "{title}, från {start} till {end}", + "The dates could not be saved.": "Datumen kunde inte sparas.", + "{title} now runs from {start} to {end}": "{title} pågår nu från {start} till {end}", + "Auto-scheduling": "Automatisk schemaläggning", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "När den är på erbjuder ett senare förfallodatum på tidslinjen att flytta de uppgifter den blockerar.", + "Move blocked tasks along when a task slips": "Flytta blockerade uppgifter när en uppgift blir försenad", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "På tidslinjen erbjuder ett senare förfallodatum att flytta de blockerade uppgifterna. Bara \"blockerar\"-länkar räknas, och uppgifter flyttas bara senare.", + "Move the tasks that wait for {title}?": "Flytta uppgifterna som väntar på {title}?", + "These tasks wait for it and would start after its new due date:": "De här uppgifterna väntar på den och skulle börja efter det nya förfallodatumet:", + "{count} tasks would move; the first {limit} are listed.": "{count} uppgifter skulle flyttas; de första {limit} visas.", + "Now": "Nu", + "After the move": "Efter flytten", + "Only this task": "Bara den här uppgiften", + "Move all": "Flytta alla", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Stoppade vid {title}: datumen kunde inte sparas. Uppgifterna före den flyttades.", + "Cumulative flow": "Kumulativt flöde", + "Show as chart": "Visa som diagram", + "Show as table": "Visa som tabell", + "Tasks per column per day": "Uppgifter per kolumn per dag", + "Tasks without recorded history in this period: {count}": "Uppgifter utan registrerad historik under perioden: {count}", + "Lead and cycle time": "Ledtid och cykeltid", + "No tasks were finished in this period.": "Inga uppgifter slutfördes under perioden.", + "Finished tasks": "Slutförda uppgifter", + "Cycle time, average": "Cykeltid, medel", + "Cycle time, 85th percentile": "Cykeltid, 85:e percentilen", + "Lead time, average": "Ledtid, medel", + "Tasks whose finish time was estimated from their history: {count}": "Uppgifter vars sluttid uppskattades från historiken: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Cykeltid för varje slutförd uppgift, med medelvärdet och 85:e percentilen", + "Slowest tasks": "Långsammaste uppgifterna", + "cycle {cycle}, lead {lead}": "cykel {cycle}, ledtid {lead}", + "{days} days": "{days} dagar", + "Could not load the flow of this project.": "Projektets flöde kunde inte läsas in.", + "Last {days} days": "Senaste {days} dagarna", + "Portfolio flow": "Portföljflöde", + "An admin adds portfolios under Projects, Portfolios.": "En administratör lägger till portföljer under Projekt, Portföljer.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Projekt som inte visas, eftersom högst 50 visas åt gången: {count}", + "Could not load the flow of this portfolio.": "Portföljens flöde kunde inte läsas in.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Kumulativt flöde och cykeltid över en portföljs projekt.", + "Edit report": "Redigera rapport", + "Only tasks where": "Endast uppgifter där", + "Group by": "Gruppera efter", + "Display": "Visning", + "Share with everyone who can read its projects": "Dela med alla som kan läsa dess projekt", + "The report could not be saved.": "Rapporten kunde inte sparas.", + "Number of tasks": "Antal uppgifter", + "Bar": "Stapel", + "Donut": "Ring", + "Table": "Tabell", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} av {total} projekt i rapporten är inte synliga för dig", + "No tasks match this report.": "Inga uppgifter matchar rapporten.", + "None": "Ingen", + "Could not load this report.": "Rapporten kunde inte läsas in.", + "Report": "Rapport", + "Your reports": "Dina rapporter", + "My reports": "Mina rapporter", + "Shared reports": "Delade rapporter", + "You have not built a report yet.": "Du har inte skapat någon rapport än.", + "Nobody has shared a report with you yet.": "Ingen har delat en rapport med dig än.", + "Reports you built over tasks, and the ones shared with you.": "Rapporter du har skapat över uppgifter, och de som delats med dig.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "En sparad fråga över uppgifter: vilka projekt, vilka filter, grupperad efter vad, räknad eller summerad, och visad som tabell eller diagram.", + "The name the report is listed under": "Namnet rapporten listas under", + "What the report shows and who it is for": "Vad rapporten visar och vem den är till för", + "Nextcloud user id of the person who saved the report": "Nextcloud-användar-id för den som sparade rapporten", + "Who can open the report": "Vem som kan öppna rapporten", + "Only me": "Bara jag", + "Everyone who can read its projects": "Alla som kan läsa dess projekt", + "The projects the report covers, at most fifty": "Projekten rapporten omfattar, högst femtio", + "Filters": "Filter", + "Task fields and the value each must equal": "Uppgiftsfält och värdet vart och ett ska vara lika med", + "The task field the report groups on": "Uppgiftsfältet rapporten grupperar på", + "Count the tasks, or add up a number on them": "Räkna uppgifterna, eller summera ett tal på dem", + "Sum": "Summa", + "Sum of": "Summa av", + "The number added up when the measure is a sum": "Talet som summeras när måttet är en summa", + "Story points": "Story points", + "Estimated duration": "Uppskattad varaktighet", + "How the report is shown": "Hur rapporten visas", + "Issue type": "Ärendetyp", + "Task fields and the value each must equal; empty when the report covers every task": "Uppgiftsfält och värdet vart och ett måste ha; tomt när rapporten omfattar alla uppgifter", + "The status a task must have": "Den status en uppgift måste ha", + "The priority a task must have": "Den prioritet en uppgift måste ha", + "The user a task must be assigned to": "Den användare en uppgift måste vara tilldelad", + "A label a task must carry": "En etikett en uppgift måste ha", + "The board column a task must be in": "Den tavlkolumn en uppgift måste stå i", + "The issue type a task must have": "Den ärendetyp en uppgift måste ha", + "Manager groups": "Ledargrupper", + "Member groups": "Medlemsgrupper", + "Viewer groups": "Läsargrupper", + "Viewers": "Läsare", + "Owning group": "Ägargrupp", + "Nextcloud groups whose members manage the project": "Nextcloud-grupper vars medlemmar leder projektet", + "Nextcloud groups whose members work on the project": "Nextcloud-grupper vars medlemmar arbetar i projektet", + "Nextcloud groups whose members may read the project": "Nextcloud-grupper vars medlemmar får läsa projektet", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Nextcloud-användare som leder projektet: inställningar, medlemmar och arbete", + "Nextcloud user ids who may read the project and its work but not change it": "Nextcloud-användare som får läsa projektet och dess arbete men inte ändra det", + "The Nextcloud group that owns the project with its creator, at most one": "Nextcloud-gruppen som äger projektet tillsammans med den som skapade det, högst en", + "Nextcloud user ids who may read this through the project": "Nextcloud-användare som får läsa detta via projektet", + "Nextcloud groups whose members may change this through the project": "Nextcloud-grupper vars medlemmar får ändra detta via projektet", + "Nextcloud groups whose members may read this through the project": "Nextcloud-grupper vars medlemmar får läsa detta via projektet", + "Search for a person or a group…": "Sök efter en person eller en grupp…", + "No one found. Your admin's sharing settings decide who you can find.": "Ingen hittades. Din administratörs delningsinställningar avgör vem du kan hitta.", + "Type at least two characters": "Skriv minst två tecken", + "Everyone in this group": "Alla i den här gruppen", + "Could not search for people. Please try again.": "Det gick inte att söka efter personer. Försök igen.", + "Could not remove the group": "Det gick inte att ta bort gruppen", + "Only the owner and managers change who is on this project.": "Bara ägaren och förvaltarna ändrar vem som är med i det här projektet.", + "Role of {name}": "Roll för {name}", + "Manager": "Förvaltare", + "Member": "Medlem", + "Viewer": "Läsare", + "Could not change the role": "Det gick inte att ändra rollen", + "Owned by group: {name}": "Ägs av gruppen: {name}", + "No group owns this project.": "Ingen grupp äger det här projektet.", + "Owned by group": "Ägs av grupp", + "Search for a group…": "Sök efter en grupp…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Ingen grupp hittades. Din administratörs delningsinställningar avgör vilka grupper du kan hitta.", + "No owning group": "Ingen ägargrupp", + "Could not search for groups. Please try again.": "Det gick inte att söka efter grupper. Försök igen.", + "Could not change the owning group": "Det gick inte att ändra ägargruppen", + "You can read this project. Only its members change it.": "Du kan läsa det här projektet. Bara dess medlemmar ändrar det.", + "Course": "Kurs", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Kursen som lektionen undervisar i, till exempel ett tillval, när skolans lärapp känner till den.", + "Online meeting link": "Länk till onlinelektionen", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Var eleverna ansluter till lektionen online. Knappen Anslut visas bara för en https-länk." }, "plurals": null } diff --git a/l10n/tr.js b/l10n/tr.js index aa6aacbe..0ebbac58 100644 --- a/l10n/tr.js +++ b/l10n/tr.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Etkin projeler", + "Archived projects": "Arşivlenmiş projeler", + "Boards": "Panolar", + "My projects": "Projelerim", + "Portfolio": "Portföy", + "Project board": "Proje panosu", + "Projects I am in": "Katıldığım projeler", + "Timeline": "Zaman çizelgesi", + "Timesheet": "Zaman çizelgesi kaydı", + "Features & roadmap": "Özellikler ve yol haritası", + "Flow": "Akış", + "Flows": "Akışlar", + "Reports": "Raporlar", + "Pick a report to open it.": "Açmak için bir rapor seçin.", + "In progress": "Devam ediyor", + "Date": "Tarih", + "Due": "Bitiş", + "Assignee": "Atanan", + "Who": "Kim", + "What": "Ne", + "Minutes": "Dakika", + "Entries": "Kayıtlar", + "Most recent": "En yeni", + "Per person": "Kişi başına", + "By status": "Duruma göre", + "By priority": "Önceliğe göre", + "Task status": "Görev durumu", + "Time spent": "Harcanan zaman", + "Capacity": "Kapasite", + "Due soonest": "En yakın bitiş", + "Minutes logged": "Kaydedilen dakika", + "Nothing is due": "Zamanı gelen bir şey yok", + "Nothing logged yet": "Henüz kayıt yok", + "What is open, what is blocked, and what is overdue.": "Ne açık, ne engellenmiş ve ne gecikmiş.", + "How allocation is spread across the people working on projects.": "Projelerde çalışan kişiler arasında yükün nasıl dağıldığı.", + "Hours logged, and the projects they went to.": "Kaydedilen saatler ve gittikleri projeler.", + "Billable": "Faturalandırılabilir", + "Budget: {amount}": "Bütçe: {amount}", + "Loading projects": "Projeler yükleniyor", + "No projects for this client yet": "Bu müşteri için henüz proje yok", + "Open in Planninq": "Planninq'te aç", + "This project could not be found": "Bu proje bulunamadı", + "Untitled project": "Adsız proje", + "and {count} more": "ve {count} tane daha", + "Store": "Mağaza", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Diğer kuruluşların yayımladığı kayıtları, şemaları ve akışları yükleyin.", + "Work Date": "Çalışma tarihi", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Sütun işlemleri", + "Columns": "Sütunlar", + "Could not remove the column. Please try again.": "Sütun kaldırılamadı. Lütfen tekrar deneyin.", + "Could not save the column. Please try again.": "Sütun kaydedilemedi. Lütfen tekrar deneyin.", + "Done column": "Tamamlandı sütunu", + "Edit column": "Sütunu düzenle", + "Keep the card's status": "Kartın durumunu koru", + "Move its cards to": "Kartlarını şuraya taşı", + "Move left": "Sola taşı", + "Move right": "Sağa taşı", + "Status of cards moved here": "Buraya taşınan kartların durumu", + "The last done column cannot be removed.": "Son tamamlandı sütunu kaldırılamaz.", + "WIP limit": "WIP sınırı", + "over limit": "sınırın üzerinde", + "The status a card gets when it is moved into this column.": "Bir kart bu sütuna taşındığında aldığı durum.", + "All priorities": "Tüm öncelikler", + "Could not create the task. Please try again.": "Görev oluşturulamadı. Lütfen tekrar deneyin.", + "Created": "Oluşturulma", + "Move to backlog": "Birikime taşı", + "Move to board": "Panoya taşı", + "New task": "Yeni görev", + "Nothing in the backlog": "Birikimde hiçbir şey yok", + "Rank": "Sıra", + "Sort by": "Sırala", + "Sort by rank to reorder": "Yeniden sıralamak için sıraya göre sıralayın", + "Task actions": "Görev işlemleri", + "All labels": "Tüm etiketler", + "Filter tasks by label": "Görevleri etikete göre filtrele", + "View timeline": "Zaman çizelgesini görüntüle", + "Board": "Pano", + "List": "Liste", + "Column": "Sütun", + "Board or list": "Pano veya liste", + "Log": "Günlük", + "Add entry": "Kayıt ekle", + "Show": "Göster", + "No actions yet": "Henüz eylem yok", + "Closed": "Kapalı", + "Entry actions": "Kayıt işlemleri", + "Add action": "Eylem ekle", + "by {author}": "{author} tarafından", + "saved {time}": "{time} kaydedildi", + "Attendees: {names}": "Katılımcılar: {names}", + "Add the first entry": "İlk kaydı ekle", + "Issues": "Sorunlar", + "Lessons learned": "Alınan dersler", + "Meetings": "Toplantılar", + "Decisions": "Kararlar", + "Actions": "Eylemler", + "Issue": "Sorun", + "Lesson learned": "Alınan ders", + "Meeting": "Toplantı", + "Decision": "Karar", + "About this project": "Bu proje hakkında", + "No description yet": "Henüz açıklama yok", + "Start date": "Başlangıç tarihi", + "Not set": "Ayarlanmadı", + "End date": "Bitiş tarihi", + "Progress": "İlerleme", + "No tasks yet": "Henüz görev yok", + "Open the board": "Panoyu aç", + "People": "Kişiler", + "Owner": "Sahip", + "Latest log entries": "Son kayıtlar", + "Open the log": "Günlüğü aç", + "{done} of {total} tasks done": "{total} görevden {done} tanesi tamamlandı", + "Edit entry": "Kaydı düzenle", + "Type": "Tür", + "Attendees": "Katılımcılar", + "Issue is closed": "Sorun kapatıldı", + "Could not save the entry. Please try again.": "Kayıt kaydedilemedi. Lütfen tekrar deneyin.", + "From: {title}": "Kaynak: {title}", + "What needs to happen": "Yapılması gereken", + "Could not create the action. Please try again.": "Eylem oluşturulamadı. Lütfen tekrar deneyin.", + "The action was created but could not be linked to the entry.": "Eylem oluşturuldu ancak kayda bağlanamadı.", + "Project pages": "Proje sayfaları", + "Overview": "Genel bakış", + "Risks": "Riskler", + "Log entry": "Günlük kaydı", + "A short name for the entry": "Kayıt için kısa bir ad", + "Project": "Proje", + "The project this entry belongs to": "Bu kaydın ait olduğu proje", + "What kind of entry this is": "Bunun ne tür bir kayıt olduğu", + "When it happened": "Ne zaman oldu", + "What happened, in Markdown": "Ne oldu, Markdown ile", + "Whether an issue is still open": "Bir sorunun hâlâ açık olup olmadığı", + "The people at a meeting": "Bir toplantıdaki kişiler", + "Tasks that came out of this entry": "Bu kayıttan çıkan görevler", + "Add risk": "Risk ekle", + "Risk": "Risk", + "Score": "Puan", + "Response": "Yanıt", + "Review date": "Gözden geçirme tarihi", + "no longer on the project": "artık projede değil", + "Edit {title}": "{title} düzenle", + "No risks recorded yet": "Henüz kayıtlı risk yok", + "Add the first risk": "İlk riski ekle", + "Medium": "Orta", + "Mitigating": "Azaltılıyor", + "Occurred": "Gerçekleşti", + "Avoid": "Kaçın", + "Reduce": "Azalt", + "Transfer": "Devret", + "Accept": "Kabul et", + "Highest open risks": "En yüksek açık riskler", + "No open risks": "Açık risk yok", + "Open the risk register": "Risk kaydını aç", + "Edit risk": "Riski düzenle", + "What could go wrong": "Ne ters gidebilir", + "Likelihood": "Olasılık", + "Impact": "Etki", + "Score {score}": "Puan {score}", + "Countermeasures": "Karşı önlemler", + "Could not save the risk. Please try again.": "Risk kaydedilemedi. Lütfen tekrar deneyin.", + "Risks by likelihood and impact": "Olasılık ve etkiye göre riskler", + "Risk scale": "Risk ölçeği", + "The levels every project scores its risks on, and where low turns into medium and high": "Her projenin risklerini puanladığı düzeyler ve düşüğün ortaya ve yükseğe dönüştüğü yer", + "Number of levels": "Düzey sayısı", + "Likelihood labels": "Olasılık etiketleri", + "Impact labels": "Etki etiketleri", + "Level {level}": "Düzey {level}", + "Medium from score": "Şu puandan itibaren orta", + "High from score": "Şu puandan itibaren yüksek", + "Risk scale saved": "Risk ölçeği kaydedildi", + "1 risk uses level {level}. Change it first.": "1 risk {level} düzeyini kullanıyor. Önce onu değiştirin.", + "{count} risks use level {level}. Change them first.": "{count} risk {level} düzeyini kullanıyor. Önce onları değiştirin.", + "Every level needs a label, and high must start above medium.": "Her düzeyin bir etiketi olmalı ve yüksek, ortanın üzerinde başlamalı.", + "The project this risk belongs to": "Bu riskin ait olduğu proje", + "The cause and the effect, in Markdown": "Neden ve sonuç, Markdown ile", + "Category": "Kategori", + "A free grouping, such as planning, budget or supplier": "Planlama, bütçe veya tedarikçi gibi serbest bir gruplama", + "How likely it is, on the admin's risk scale": "Yöneticinin risk ölçeğine göre ne kadar olası olduğu", + "How hard it would hit, on the admin's risk scale": "Yöneticinin risk ölçeğine göre ne kadar sert vuracağı", + "Likelihood times impact, calculated by the server": "Olasılık çarpı etki, sunucu tarafından hesaplanır", + "Where the risk stands": "Riskin durumu", + "The person who watches this risk": "Bu riski izleyen kişi", + "How the project answers the risk": "Projenin riske nasıl yanıt verdiği", + "What is done to prevent it or soften it, in Markdown": "Önlemek veya hafifletmek için yapılanlar, Markdown ile", + "When to look at this risk again": "Riskin yeniden ne zaman gözden geçirileceği", + "Very low": "Çok düşük", + "Very high": "Çok yüksek", + "All projects": "Tüm projeler", + "Project status report": "Proje durum raporu", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Bir projenin para, organizasyon, zaman, bilgi, kalite ve risk (GROTIK yönleri) açısından nasıl durduğuna dair, her biri notlu, tarihli bir rapor.", + "The project this report is about": "Raporun ilgili olduğu proje", + "Report date": "Rapor tarihi", + "The day the report describes": "Raporun anlattığı gün", + "Money": "Para", + "How the project stands on this aspect": "Projenin bu yönde nasıl durduğu", + "On track": "Yolunda", + "At risk": "Risk altında", + "Off track": "Yolundan çıkmış", + "Money note": "Para notu", + "A short explanation of this status": "Bu durumun kısa açıklaması", + "Organisation": "Organizasyon", + "Organisation note": "Organizasyon notu", + "Time": "Zaman", + "Time note": "Zaman notu", + "Information": "Bilgi", + "Information note": "Bilgi notu", + "Quality": "Kalite", + "Quality note": "Kalite notu", + "Risk note": "Risk notu", + "Overall": "Genel", + "The worst of the six statuses, calculated by the server": "Altı durumun en kötüsü, sunucu tarafından hesaplanır", + "Health: money": "Sağlık: para", + "Copied from the newest status report": "En yeni durum raporundan kopyalanır", + "Health: organisation": "Sağlık: organizasyon", + "Health: time": "Sağlık: zaman", + "Health: information": "Sağlık: bilgi", + "Health: quality": "Sağlık: kalite", + "Health: risk": "Sağlık: risk", + "Health: overall": "Sağlık: genel", + "Health: report date": "Sağlık: rapor tarihi", + "The date of the newest status report": "En yeni durum raporunun tarihi", + "New report": "Yeni rapor", + "Only the project owner writes status reports.": "Durum raporlarını yalnızca proje sahibi yazar.", + "Latest report, {date}": "Son rapor, {date}", + "Aspect": "Yön", + "Note": "Not", + "Report history": "Rapor geçmişi", + "Author": "Yazar", + "No status reports yet": "Henüz durum raporu yok", + "Write the first report": "İlk raporu yaz", + "Choose a status for every aspect to save the report.": "Raporu kaydetmek için her yön için bir durum seçin.", + "Suggested: on track.": "Öneri: yolunda.", + "Suggested: at risk.": "Öneri: risk altında.", + "Suggested: off track.": "Öneri: yolundan çıkmış.", + "1 task is past its due date.": "1 görevin son tarihi geçti.", + "{count} tasks are past their due date.": "Son tarihi geçen görevler: {count}.", + "The end date has passed with 1 open task.": "Bitiş tarihi 1 açık görevle geçti.", + "The end date has passed with {count} open tasks.": "Bitiş tarihi geçti, açık görevler: {count}.", + "No open task is past its due date.": "Hiçbir açık görevin son tarihi geçmedi.", + "The highest open risk, \"{title}\", scores {score}.": "En yüksek açık risk, \"{title}\", {score} puan alıyor.", + "There are no open risks.": "Açık risk yok.", + "Costs are at {percent}% of the budget.": "Maliyetler bütçenin %{percent} kadarında.", + "No suggestion: the project has no budget.": "Öneri yok: projenin bütçesi yok.", + "No suggestion: no costs are recorded for this project yet.": "Öneri yok: bu proje için henüz maliyet kaydedilmedi.", + "The report was not saved. Only the project owner can write status reports.": "Rapor kaydedilmedi. Durum raporlarını yalnızca proje sahibi yazabilir.", + "No report": "Rapor yok", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Aynı kişilerin yürüttüğü proje grubu, örneğin bir birim veya bir program. Sorumluları içindeki her projeyi okur.", + "The name of the portfolio": "Portföyün adı", + "What the portfolio holds and who runs it": "Portföyün neleri içerdiği ve kimin yürüttüğü", + "A colour for the portfolio's section in project lists": "Proje listelerinde portföy bölümünün rengi", + "Managers": "Sorumlular", + "Nextcloud user UIDs of the people who run the portfolio": "Portföyü yürüten kişilerin Nextcloud kullanıcı kimlikleri", + "Order": "Sıra", + "Where the portfolio comes in project lists, lowest first": "Portföyün proje listelerindeki yeri, en küçük önce", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Bu portföyün JSON biçiminde kendi risk ölçeği, uygulama geneli ölçekle aynı biçimde. Boş, uygulama geneli ölçek demektir.", + "Portfolio readers": "Portföy okuyucuları", + "Nextcloud user UIDs of the managers of the project's portfolio": "Projenin portföy sorumlularının Nextcloud kullanıcı kimlikleri", + "The portfolio this project belongs to": "Bu projenin ait olduğu portföy", + "No portfolio": "Portföy yok", + "All portfolios": "Tüm portföyler", + "You read this project as a manager of its portfolio. Only its members change it.": "Bu projeyi portföyünün sorumlusu olarak okuyorsunuz. Yalnızca üyeleri değiştirir.", + "Portfolios": "Portföyler", + "Portfolio status": "Portföy durumu", + "No portfolios yet": "Henüz portföy yok", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Bir yönetici portföyleri Projeler, Portföyler altında ekler. Bir portföyün projeleri durumlarıyla burada listelenir.", + "Roll-up": "Özet", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} yolunda, {atRisk} risk altında, {offTrack} yoldan çıkmış, {noReport} raporsuz", + "No project in this portfolio that you can read.": "Bu portföyde okuyabileceğiniz proje yok.", + "Start": "Başlangıç", + "End": "Bitiş", + "Budget": "Bütçe", + "Last report": "Son rapor", + "Out of date": "Güncel değil", + "Portfolio timeline": "Portföy zaman çizelgesi", + "Zoom": "Yakınlaştırma", + "Could not load the timeline": "Zaman çizelgesi yüklenemedi", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Bir yönetici portföyleri Projeler, Portföyler altında ekler. Bir portföyün projeleri burada tek bir zaman çizelgesinde gösterilir.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Aşamalarını ve görevlerini görmek için bir proje açın. Zaman çizelgesi salt okunurdur.", + "Phase: {title}": "Aşama: {title}", + "Left out because you cannot read them: {count} projects": "Okuyamadığınız için dışarıda bırakıldı: {count} proje", + "Week": "Hafta", + "Day": "Gün", + "Month": "Ay", + "Please try again later.": "Lütfen daha sonra yeniden deneyin.", + "Status reports": "Durum raporları", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Bir projenin son durum raporunun portföy genel bakışında kaç gün sonra güncel değil olarak işaretleneceği", + "Reporting period (days)": "Raporlama dönemi (gün)", + "The reporting period is a whole number of days from 1 to 365.": "Raporlama dönemi 1 ile 365 arasında tam sayıda gündür.", + "Reporting period saved": "Raporlama dönemi kaydedildi", + "The reporting period was not saved. Please try again.": "Raporlama dönemi kaydedilmedi. Lütfen yeniden deneyin.", + "Every project of a portfolio with its status per aspect, rolled up.": "Bir portföyün her projesi, yön başına durumuyla özetlenmiş.", + "The projects of a portfolio on one timeline.": "Bir portföyün projeleri tek bir zaman çizelgesinde.", + "Phases": "Aşamalar", + "Add phase": "Aşama ekle", + "No phases yet": "Henüz aşama yok", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Projeyi başlatma, tanımlama ve uygulama gibi aşamalara bölün. Bir aşama, kapanış belgesi yüklendiğinde kapanır.", + "{hours} hours": "{hours} saat", + "Concluding document: {title}": "Kapanış belgesi: {title}", + "Concluding document missing": "Kapanış belgesi eksik", + "Move {title} up": "{title} yukarı taşı", + "Move {title} down": "{title} aşağı taşı", + "Close phase": "Aşamayı kapat", + "Phase": "Aşama", + "Files": "Dosyalar", + "Notes": "Notlar", + "Audit trail": "Denetim izi", + "Edit phase": "Aşamayı düzenle", + "Name": "Ad", + "Budget hours": "Bütçe saatleri", + "Could not save the phase. Please try again.": "Aşama kaydedilemedi. Lütfen yeniden deneyin.", + "Close phase {title}": "{title} aşamasını kapat", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Bir aşama kapanış belgesiyle kapanır: buraya yükleyin veya aşamanın dosyalarından birini seçin.", + "Concluding document": "Kapanış belgesi", + "This phase has no files yet.": "Bu aşamanın henüz dosyası yok.", + "Upload a document": "Belge yükle", + "The document was not uploaded. Please try again.": "Belge yüklenmedi. Lütfen yeniden deneyin.", + "Upload the concluding document before you close this phase.": "Bu aşamayı kapatmadan önce kapanış belgesini yükleyin.", + "This phase cannot be closed from its current status.": "Bu aşama mevcut durumundan kapatılamaz.", + "The phase was not closed. Please try again.": "Aşama kapatılmadı. Lütfen yeniden deneyin.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Bu aşamayı kapatan, aşamadaki dosyanın kimliği. Aşama ancak bu ayarlandığında ve dosya eklendiğinde tamamlanabilir.", + "Import from Microsoft Project": "Microsoft Project'ten içe aktar", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Microsoft Project'ten XML biçiminde kaydedilmiş bir plan seçin. Siz onaylayana kadar hiçbir şey içe aktarılmaz.", + "Plan file": "Plan dosyası", + "What the import creates": "İçe aktarmanın oluşturacakları", + "Tasks": "Görevler", + "Sub-tasks": "Alt görevler", + "Milestones": "Kilometre taşları", + "Links": "Bağlantılar", + "Already imported, updated in place: {count}": "Zaten içe aktarılmış, yerinde güncellendi: {count}", + "What does not carry over": "Aktarılmayanlar", + "Tasks with resources, which are not imported: {count}": "Kaynak atanmış görevler, kaynaklar içe aktarılmaz: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Düzey 3'ten derin görevler, düzey 2 görevlerinin altına yerleştirildi: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Bitiş-başlangıç dışındaki bağlantılar, ilişkili bağlantı olarak içe aktarıldı: {count}", + "Link lags, which are dropped: {count}": "Bağlantı gecikmeleri, bunlar atılır: {count}", + "Links to a summary task, which are not imported: {count}": "Özet göreve bağlantılar, içe aktarılmaz: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Bu planın dışındaki görevlere bağlantılar, içe aktarılmaz: {count}", + "No longer in the plan": "Artık planda değil", + "These stay in the project; remove them yourself if they are no longer needed.": "Bunlar projede kalır; artık gerekmiyorsa kendiniz kaldırın.", + "Import": "İçe aktar", + "Close": "Kapat", + "The plan is imported: {created} created, {updated} updated.": "Plan içe aktarıldı: {created} oluşturuldu, {updated} güncellendi.", + "Links that would close a loop were left out: {count}": "Döngü oluşturacak bağlantılar atlandı: {count}", + "The import stopped part-way. Run it again to finish it.": "İçe aktarma yarıda durdu. Tamamlamak için yeniden çalıştırın.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Planı Microsoft Project'te Dosya, Farklı kaydet, XML biçimi ile kaydedin ve o dosyayı içe aktarın.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Bu dosya DOCTYPE veya varlıklar bildiriyor, bunlar kabul edilmez.", + "The file is larger than 10 MB.": "Dosya 10 MB'tan büyük.", + "The plan has more than 2,000 tasks, more than one import takes.": "Planda 2.000'den fazla görev var, bir içe aktarmanın alabileceğinden fazla.", + "This file is not a Microsoft Project plan in XML format.": "Bu dosya XML biçiminde bir Microsoft Project planı değil.", + "Choose a file to import.": "İçe aktarılacak bir dosya seçin.", + "Only the project owner can import a plan.": "Yalnızca proje sahibi bir plan içe aktarabilir.", + "The plan could not be read. Please try again.": "Plan okunamadı. Lütfen yeniden deneyin.", + "Linked case: {title}": "Bağlı dosya: {title}", + "Linked to a case": "Bir dosyaya bağlı", + "Hand over to case": "Dosyaya teslim et", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Projenin ve görevlerinin her dosyasını ve projeyi tanımlayan bir dosyayı değiştirmeden bağlı dosyaya kopyalar.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopyalanan dosyalar: {count}", + "Files that failed: {names}": "Başarısız dosyalar: {names}", + "The handover failed. Please try again.": "Teslim başarısız oldu. Lütfen yeniden deneyin.", + "The linked case could not be found, or you cannot open it.": "Bağlı dosya bulunamadı veya açamıyorsunuz.", + "Case handovers": "Dosyaya teslimler", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Projenin dosyalarının ve üst verilerinin dosyasına her teslimi: ne zaman, kim tarafından, hangi dosyaya, SHA-256 değeriyle kopyalanan her dosya ve başarısız dosyalar.", + "Finance": "Finans", + "Add cost line": "Maliyet satırı ekle", + "Delivery terms": "Teslim koşulları", + "Billing model": "Faturalama modeli", + "Budget in euro": "Euro cinsinden bütçe", + "Budget in hours": "Saat cinsinden bütçe", + "Hourly rate in euro": "Euro cinsinden saatlik ücret", + "Planned start": "Planlanan başlangıç", + "Planned end": "Planlanan bitiş", + "Planned dates": "Planlanan tarihler", + "Budget {amount}": "Bütçe {amount}", + "No budget agreed": "Üzerinde anlaşılmış bütçe yok", + "Hours": "Saatler", + "Only the project owner and the portfolio managers see the amounts.": "Tutarları yalnızca proje sahibi ve portföy yöneticileri görür.", + "Budget against cost per category": "Kategoriye göre bütçe ve maliyet", + "Labour (booked time)": "İşçilik (kaydedilen süre)", + "No category": "Kategori yok", + "Hours are not available": "Saatler kullanılamıyor", + "Not yet assigned to a category": "Henüz bir kategoriye atanmadı", + "Total": "Toplam", + "{spent} spent, {remaining} remaining": "{spent} harcandı, {remaining} kaldı", + "Budget against cost per phase": "Aşamaya göre bütçe ve maliyet", + "No phase": "Aşama yok", + "Cost lines": "Maliyet satırları", + "From the finance system": "Finans sisteminden", + "Edit cost line {amount}": "{amount} maliyet satırını düzenle", + "No cost lines yet": "Henüz maliyet satırı yok", + "Commitments": "Taahhütler", + "Actual cost": "Gerçekleşen maliyet", + "Forecast": "Tahmin", + "Remaining": "Kalan", + "Not planned yet": "Henüz planlanmadı", + "{start} to {end}": "{start} ile {end} arası", + "The terms were not saved. Please try again.": "Koşullar kaydedilmedi. Lütfen yeniden deneyin.", + "Terms saved": "Koşullar kaydedildi", + "Fixed price": "Sabit fiyat", + "Hourly": "Saatlik", + "Not billed": "Faturalanmıyor", + "Commitment": "Taahhüt", + "Edit cost line": "Maliyet satırını düzenle", + "Kind": "Tür", + "Amount in euro": "Euro cinsinden tutar", + "Remove": "Kaldır", + "Could not save the cost line. Only the project owner changes the money of a project.": "Maliyet satırı kaydedilemedi. Bir projenin parasını yalnızca proje sahibi değiştirir.", + "Could not remove the cost line. Please try again.": "Maliyet satırı kaldırılamadı. Lütfen yeniden deneyin.", + "{amount} over budget": "Bütçenin {amount} üzerinde", + "Cost categories": "Maliyet kategorileri", + "The categories every project splits its budget and costs into, one per line": "Her projenin bütçesini ve maliyetlerini böldüğü kategoriler, her satıra bir tane", + "Categories": "Kategoriler", + "Give at least one category, each name once.": "En az bir kategori girin, her adı bir kez.", + "Cost categories saved": "Maliyet kategorileri kaydedildi", + "The cost categories were not saved. Please try again.": "Maliyet kategorileri kaydedilmedi. Lütfen yeniden deneyin.", + "Finance line": "Finans satırı", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Bir projedeki tek bir para tutarı: bütçe, taahhüt, gerçekleşen maliyet veya tahmin; bir maliyet kategorisinde ve isteğe bağlı olarak bir aşamada. Proje sahibi girer ya da finans sistemi entegrasyon uygulaması üzerinden gönderir.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Bu tutarın ait olduğu proje. Proje numarası hiçbir projeyle eşleşmeyen finans sistemi satırları için boş.", + "The phase this amount belongs to, if any": "Bu tutarın ait olduğu aşama, varsa", + "The cost category, one of the categories the admin set up": "Maliyet kategorisi, yöneticinin tanımladığı kategorilerden biri", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Tutarın bütçe, taahhüt, gerçekleşen maliyet veya tahmin olup olmadığı", + "Amount": "Tutar", + "The amount in the reporting currency (euro)": "Raporlama para birimindeki tutar (euro)", + "The date the amount was booked or is expected": "Tutarın kaydedildiği veya beklendiği tarih", + "What the amount is for": "Tutarın ne için olduğu", + "Whether a person entered the line or the finance system sent it": "Satırı bir kişinin mi girdiği yoksa finans sisteminin mi gönderdiği", + "Entered by hand": "Elle girildi", + "Finance line id": "Finans satırı kimliği", + "The finance system's own id of this line. One imported line per id.": "Bu satırın finans sistemindeki kendi kimliği. Kimlik başına bir içe aktarılan satır.", + "Project number": "Proje numarası", + "The project number the finance system sent, matched against the project key": "Finans sisteminin gönderdiği, proje anahtarıyla karşılaştırılan proje numarası", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Satırın projesinin portföyü, portföy toplamları tek bir filtreyle alınsın diye projeden kopyalanır", + "Finance readers": "Finans okuyucuları", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Bu tutarı görebilecek kişilerin Nextcloud kullanıcı UID'leri: proje sahibi ve portföyünün yöneticileri", + "Project owner": "Proje sahibi", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Elle girilen satırları değiştirip kaldırabilen proje sahibinin Nextcloud kullanıcı UID'si", + "How the client pays: not billed, a fixed price, or by the hour.": "Müşteri nasıl öder: faturalanmıyor, sabit fiyat veya saatlik.", + "Portfolio finance": "Portföy finansı", + "You cannot see the money of any project in this portfolio": "Bu portföydeki hiçbir projenin parasını göremezsiniz", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Sunucu bu portföyün dışındaki projelerin maliyet satırlarını döndürdü, bu yüzden bu toplamlar yanlış olabilir.", + "Projects left out because you cannot see their money: {count}": "Parasını göremediğiniz için dışarıda bırakılan projeler: {count}", + "Unmatched finance lines": "Eşleşmeyen finans satırları", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Bir portföy genelinde toplanan bütçe, taahhütler, gerçekleşen maliyet ve tahmin.", + "Subprojects": "Alt projeler", + "{done} of {total}": "{done}/{total}", + "{done} of {total} tasks done, including subprojects": "{done}/{total} görev tamamlandı, alt projeler dahil", + "Show the subprojects of {title}": "{title} alt projelerini göster", + "Hide the subprojects of {title}": "{title} alt projelerini gizle", + "Part of": "Şunun parçası", + "No parent project": "Üst proje yok", + "A project cannot sit under one of its own subprojects.": "Bir proje kendi alt projelerinden birinin altında olamaz.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projeler en fazla üç düzey iç içe olabilir: program, proje ve alt proje.", + "Parent project": "Üst proje", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Bu projenin altında durduğu proje, örneğin bir program. Projeler en fazla üç düzey iç içe olabilir.", + "Yes": "Evet", + "No": "Hayır", + "{label} (required)": "{label} (zorunlu)", + "{label} is required": "{label} zorunludur", + "Project field": "Proje alanı", + "A field an admin adds to every project, such as a policy area or a contract value.": "Bir yöneticinin her projeye eklediği alan, örneğin bir politika alanı veya sözleşme değeri.", + "Key": "Anahtar", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Değerin kaydedildiği sabit ad, lower camel case biçiminde. Projeler kullandığında değiştirmeyin.", + "Label": "Etiket", + "The name people see next to the field": "Kişilerin alanın yanında gördüğü ad", + "What the field holds": "Alanın içerdiği", + "Text": "Metin", + "Number": "Sayı", + "Choice": "Seçim", + "Person": "Kişi", + "Yes or no": "Evet veya hayır", + "Options": "Seçenekler", + "The choices of a choice field": "Bir seçim alanının seçenekleri", + "Required": "Zorunlu", + "Whether a project must fill in the field": "Bir projenin alanı doldurması gerekip gerekmediği", + "Where the field appears, lowest first": "Alanın göründüğü yer, en düşük önce", + "Applies to": "Uygulandığı yer", + "What the field is added to": "Alanın eklendiği şey", + "Custom fields": "Özel alanlar", + "The values of the project fields an admin defined, keyed by the field's key.": "Bir yöneticinin tanımladığı proje alanlarının, alan anahtarına göre değerleri.", + "Project fields": "Proje alanları", + "Related": "İlgili", + "Remove link": "Bağlantıyı kaldır", + "Link type": "Bağlantı türü", + "Relates to": "İlgili olduğu", + "Duplicates": "Çoğaltır", + "Project key": "Proje anahtarı", + "Every task number starts with it, such as VERG-42.": "Her görev numarası onunla başlar, örneğin VERG-42.", + "This key is already used by another project.": "Bu anahtar zaten başka bir proje tarafından kullanılıyor.", + "Use 2 to 10 letters and digits, starting with a letter.": "Bir harfle başlayan 2 ile 10 arası harf ve rakam kullanın.", + "The key cannot change once tasks carry it.": "Görevler taşıdıktan sonra anahtar değiştirilemez.", + "Project saved. The existing tasks get their numbers in the background.": "Proje kaydedildi. Mevcut görevler numaralarını arka planda alır.", + "Next task number": "Sonraki görev numarası", + "The number the next task of this project gets in its key. Only the system writes it.": "Bu projenin bir sonraki görevinin anahtarında aldığı numara. Yalnızca sistem yazar.", + "Restore {title}": "{title} geri yükle", + "Restore": "Geri yükle", + "Project restored": "Proje geri yüklendi", + "Could not restore the project": "Proje geri yüklenemedi", + "Bring this project back to the active list.": "Bu projeyi etkin projeler listesine geri getirin.", + "Restore project": "Projeyi geri yükle", + "Request reason": "Talebin nedeni", + "Why the requester needs this project. Filled in when the project is requested.": "Talep edenin bu projeye neden ihtiyaç duyduğu. Talepte doldurulur.", + "Reviewed by": "İnceleyen", + "The user who approved or rejected the request.": "Talebi onaylayan veya reddeden kullanıcı.", + "Reviewed at": "İnceleme tarihi", + "When the request was approved or rejected.": "Talebin ne zaman onaylandığı veya reddedildiği.", + "Review note": "İnceleme notu", + "The reviewer's reason, shown to the requester when a request is not approved.": "Bir talep onaylanmadığında talep edenin gördüğü inceleyenin gerekçesi.", + "Members of these groups": "Bu grupların üyeleri", + "Groups that may create projects": "Proje oluşturabilecek gruplar", + "The group {group} no longer exists. Save to remove it.": "{group} grubu artık yok. Kaldırmak için kaydedin.", + "Review project request": "Proje talebini incele", + "Requested by": "Talep eden", + "Why it is needed": "Neden gerekli", + "Desired start date": "İstenen başlangıç tarihi", + "Why is it not approved?": "Neden onaylanmıyor?", + "Give a reason. The requester sees it.": "Bir neden yazın. Talep eden görecek.", + "Approve": "Onayla", + "Reject": "Reddet", + "Reject request": "Talebi reddet", + "The review was not saved. Try again.": "İnceleme kaydedilmedi. Yeniden deneyin.", + "This project is waiting for review": "Bu proje incelenmeyi bekliyor", + "This request was not approved": "Bu talep onaylanmadı", + "Reason: {note}": "Neden: {note}", + "Review request": "Talebi incele", + "Request a project": "Proje talep et", + "Step {step} of 2": "Adım {step}/2", + "Why is this project needed?": "Bu projeye neden ihtiyaç var?", + "Give a reason. The reviewer reads it.": "Bir neden yazın. İnceleyen okuyacak.", + "Back": "Geri", + "Next": "İleri", + "Send request": "Talebi gönder", + "The request was not sent. Try again.": "Talep gönderilmedi. Yeniden deneyin.", + "Requested": "Talep edildi", + "Not approved": "Onaylanmadı", + "Your request was sent": "Talebiniz gönderildi", + "Let everyone else request a project": "Diğer herkesin proje talep etmesine izin ver", + "Add a task": "Görev ekle", + "Delete task": "Görevi sil", + "Edit task": "Görevi düzenle", + "Write": "Yaz", + "Preview": "Önizleme", + "Markdown works here: headings, lists and links.": "Burada Markdown çalışır: başlıklar, listeler ve bağlantılar.", + "Could not save the task. Please try again.": "Görev kaydedilemedi. Lütfen yeniden deneyin.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "\"{title}\" üzerinde kayıtlı süre olduğu için silinemez. Bunun yerine iptal edebilirsiniz: süre kayıtları korunur.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "\"{title}\" silinsin mi? Diğer görevlerle bağlantıları da kaldırılır. Bu işlem geri alınamaz.", + "Keep task": "Görevi koru", + "Cancel task": "Görevi iptal et", + "Only the reporter, the project owner or an admin can delete this task.": "Bu görevi yalnızca bildiren kişi, proje sahibi veya bir yönetici silebilir.", + "Could not delete the task. Please try again.": "Görev silinemedi. Lütfen yeniden deneyin.", + "Could not cancel the task. Please try again.": "Görev iptal edilemedi. Lütfen yeniden deneyin.", + "Responsible": "Sorumlu", + "Also working on this": "Bunun üzerinde çalışan diğerleri", + "Labels": "Etiketler", + "Could not change the priority. Please try again.": "Öncelik değiştirilemedi. Lütfen yeniden deneyin.", + "Other project members who work on this task alongside the person responsible.": "Sorumlu kişiyle birlikte bu görev üzerinde çalışan diğer proje üyeleri.", + "Duplicate": "Çoğalt", + "Could not copy the task. Please try again.": "Görev kopyalanamadı. Lütfen yeniden deneyin.", + "Subtasks": "Alt görevler", + "{done} of {total} done": "{total} görevden {done} tanesi tamamlandı", + "Add a subtask": "Alt görev ekle", + "Checklist": "Kontrol listesi", + "Checklist item actions": "Liste öğesi işlemleri", + "Add a checklist item": "Kontrol listesine öğe ekle", + "Subtasks: {estimate} estimated, {logged} logged": "Alt görevler: {estimate} tahmini, {logged} kayıtlı", + "Total estimate: {total}": "Toplam tahmin: {total}", + "Part of {title}": "{title} görevinin parçası", + "Checklist: {count} done": "Kontrol listesi: {count} tamamlandı", + "This task has subtasks: {count}.": "Bu görevin alt görevleri var: {count}.", + "Keep subtasks as separate tasks": "Alt görevleri ayrı görevler olarak koru", + "Delete subtasks too": "Alt görevleri de sil", + "Copy of {title}": "{title} kopyası", + "The task was copied, but not all of its subtasks. Please check the copy.": "Görev kopyalandı, ancak tüm alt görevleri kopyalanmadı. Kopyayı kontrol edin.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Görev içindeki küçük adımlar. Her öğenin bir kimliği, bir metni ve tamamlanıp tamamlanmadığı bilgisi vardır.", + "Open work per person and per project.": "Kişi ve proje başına açık iş.", + "View": "Görünüm", + "By person": "Kişiye göre", + "By project": "Projeye göre", + "Hours left": "Kalan saat", + "Tasks without an estimate": "Tahmini olmayan görevler", + "Due in 14 days": "14 gün içinde teslim", + "Shared": "Paylaşılan", + "Unassigned": "Atanmamış", + "{hours} h": "{hours} sa", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Görebildiğiniz projelerdeki iş gösterilir. Saatler sorumlu kişiye sayılır; paylaşılan görevler saatsiz sayılır.", + "No open work in these projects.": "Bu projelerde açık iş yok.", + "Open work": "Açık iş", + "{count} open tasks": "{count} açık görev", + "Create a project to see capacity here.": "Kapasiteyi burada görmek için bir proje oluşturun.", + "My tasks": "Görevlerim", + "Show all my tasks": "Tüm görevlerimi göster", + "No tasks assigned to you": "Size atanmış görev yok", + "Browse projects": "Projelere göz atın", + "Later": "Daha sonra", + "Due {date}": "Son tarih {date}", + "Could not change the status. Please try again.": "Durum değiştirilemedi. Lütfen yeniden deneyin.", + "Completed today": "Bugün tamamlanan", + "My open tasks": "Açık görevlerim", + "My overdue tasks": "Geciken görevlerim", + "My tasks in progress": "Devam eden görevlerim", + "Pin to the top": "En üste sabitle", + "Unpin": "Sabitlemeyi kaldır", + "Pinned": "Sabitlendi", + "Actions for {title}": "{title} için işlemler", + "Could not save your project order. Please try again.": "Proje sıranız kaydedilemedi. Lütfen yeniden deneyin.", + "No boards yet": "Henüz pano yok", + "Create a project to get a board.": "Pano için bir proje oluşturun.", + "Use the Projects page to create and manage your projects and tasks.": "Projelerinizi ve görevlerinizi oluşturmak ve yönetmek için Projeler sayfasını kullanın.", + "Go to projects": "Projelere git", + "You are not a member of any projects yet.": "Henüz hiçbir projenin üyesi değilsiniz.", + "Could not search for users. Please try again.": "Kullanıcılar aranamadı. Lütfen yeniden deneyin.", + "Project creation is restricted to administrators.": "Proje oluşturma yöneticilerle sınırlıdır.", + "Only the project owner or an administrator can delete this project.": "Bu projeyi yalnızca proje sahibi veya bir yönetici silebilir.", + "No projects are available to you yet. Ask an administrator to create one.": "Henüz size açık bir proje yok. Bir yöneticiden proje oluşturmasını isteyin.", + "Due: {date}": "Son tarih: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Başlangıç veya son tarihi olan görevler zaman çizelgesinde görünür. Burada görmek için tarih ekleyin.", + "You do not have access to this project.": "Bu projeye erişiminiz yok.", + "Zoom level": "Yakınlaştırma düzeyi", + "Unscheduled": "Planlanmamış", + "Start: {date}": "Başlangıç: {date}", + "Today": "Bugün", + "No scheduled tasks": "Planlanmış görev yok", + "An unexpected error occurred.": "Beklenmeyen bir hata oluştu.", + "Column {number} name": "{number}. sütunun adı", + "Failed to save creation policy": "Oluşturma kuralı kaydedilemedi", + "All authenticated users": "Oturum açmış tüm kullanıcılar", + "Control who may create new projects": "Kimlerin yeni proje oluşturabileceğini belirleyin", + "Administrators only": "Yalnızca yöneticiler", + "Project creation": "Proje oluşturma", + "Allow project creation": "Proje oluşturmaya izin ver", + "Creation policy saved successfully": "Oluşturma kuralı kaydedildi", + "Initializing…": "Başlatılıyor…", + "e.g. 2h 30m, 90m, 1.5h": "örn. 2h 30m, 90m, 1.5h", + "Log time": "Süre kaydet", + "Save estimate": "Tahmini kaydet", + "Logged: {logged}": "Kaydedilen: {logged}", + "over by {amount}": "{amount} aşıldı", + "Time tracking": "Zaman takibi", + "Estimate": "Tahmin", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Geçerli bir tahmin girin (örn. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Geçerli bir süre girin (örn. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Zaman kaydı kaydedilemedi. Lütfen yeniden deneyin.", + "Edit time entry": "Zaman kaydını düzenle", + "Duration": "Süre", + "Date range": "Tarih aralığı", + "Last week": "Geçen hafta", + "No time logged": "Kaydedilmiş süre yok", + "Log time on a task to see it here.": "Burada görmek için bir göreve süre kaydedin.", + "To date": "Bitiş tarihi", + "This week": "Bu hafta", + "Total: {total}": "Toplam: {total}", + "From date": "Başlangıç tarihi", + "Custom range": "Özel aralık", + "All time": "Tüm zamanlar", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Bir görev silinemedi, bu yüzden veriler kalmış olabilir. Projeyi yeniden silin.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Bir zaman kaydı silinemedi, bu yüzden veriler kalmış olabilir. Projeyi yeniden silin.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Bir sütun silinemedi, bu yüzden veriler kalmış olabilir. Projeyi yeniden silin.", + "Could not delete the project. Please try again.": "Proje silinemedi. Lütfen yeniden deneyin.", + "Notification settings": "Bildirim ayarları", + "Configure when due-date reminders are sent": "Son tarih hatırlatmalarının ne zaman gönderileceğini ayarlayın", + "Due-date reminder lead time (hours)": "Son tarih hatırlatması ön süresi (saat)", + "Lead time must be between 1 and 336 hours": "Ön süre 1 ile 336 saat arasında olmalıdır", + "Reminder lead time saved successfully": "Hatırlatma ön süresi kaydedildi", + "Failed to save reminder lead time": "Hatırlatma ön süresi kaydedilemedi", + "Notifications": "Bildirimler", + "Notify me 1 day before a task's due date": "Bir görevin son tarihinden 1 gün önce bana bildir", + "Draft": "Taslak", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Dersin yalnızca öğretmeninin gördüğü bir taslak mı olduğu, yapılıp yapılmayacağı veya iptal edilip edilmediği.", + "New release": "Yeni sürüm", + "Roadmap chart. The same releases and epics are listed below.": "Yol haritası grafiği. Aynı sürümler ve epikler aşağıda listelenmiştir.", + "Nothing on the roadmap yet": "Yol haritasında henüz bir şey yok", + "Releases with a target date and epics with dated tasks appear here.": "Hedef tarihi olan sürümler ve tarihli görevleri olan epikler burada görünür.", + "Releases": "Sürümler", + "No releases yet": "Henüz sürüm yok", + "Target date: {date}": "Hedef tarih: {date}", + "No target date": "Hedef tarih yok", + "Edit {name}": "{name} düzenle", + "Mark {name} as released": "{name} yayımlandı olarak işaretle", + "Mark as released": "Yayımlandı olarak işaretle", + "Epics": "Epikler", + "No epics yet. Open a task to make it an epic.": "Henüz epik yok. Epik yapmak için bir görevi açın.", + "Not scheduled yet": "Henüz planlanmadı", + "Planned": "Planlandı", + "Released": "Yayımlandı", + "Edit release": "Sürümü düzenle", + "Target date": "Hedef tarih", + "Could not save the release. Please try again.": "Sürüm kaydedilemedi. Lütfen yeniden deneyin.", + "Every task of this release is done or cancelled.": "Bu sürümün tüm görevleri tamamlandı ya da iptal edildi.", + "Not finished yet: {count}": "Henüz bitmedi: {count}", + "What happens to these tasks?": "Bu görevlere ne olacak?", + "Move to {name}": "{name} sürümüne taşı", + "Remove the release": "Sürümü kaldır", + "Keep it on {name}": "{name} sürümünde bırak", + "Could not mark the release as released. Please try again.": "Sürüm yayımlandı olarak işaretlenemedi. Lütfen yeniden deneyin.", + "Roadmap": "Yol haritası", + "Tasks or roadmap": "Görevler veya yol haritası", + "Release": "Sürüm", + "Epic": "Epik", + "This task is an epic": "Bu görev bir epik", + "A named, dated delivery of a project that its tasks are planned against.": "Bir projenin, görevlerinin göre planlandığı adlı ve tarihli teslimatı.", + "Name of the release": "Sürümün adı", + "The project this release belongs to": "Bu sürümün ait olduğu proje", + "What this release delivers": "Bu sürümün teslim ettikleri", + "When work on the release starts": "Sürüm üzerindeki çalışmanın başladığı zaman", + "The date the release is due": "Sürümün hazır olması gereken tarih", + "Whether the release is planned, released or archived": "Sürümün planlanmış, yayımlanmış ya da arşivlenmiş olduğu", + "Released on": "Yayımlanma tarihi", + "When the release was marked as released": "Sürümün yayımlandı olarak işaretlendiği zaman", + "The release this task is planned for": "Bu görevin planlandığı sürüm", + "Board view options": "Pano görünüm seçenekleri", + "Colour cards": "Kartları renklendir", + "No colour": "Renk yok", + "By label": "Etikete göre", + "Swimlanes": "Kulvarlar", + "No swimlanes": "Kulvar yok", + "By assignee": "Atanan kişiye göre", + "By epic": "Epiğe göre", + "No assignee": "Atanmamış", + "No epic": "Epik yok", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartlar kendi epik satırında kalır. Epiği görev sayfasında değiştirin.", + "Hand over to": "Devret", + "Could not save your board view. It applies until you reload.": "Pano görünümünüz kaydedilemedi. Sayfayı yenileyene kadar geçerlidir.", + "Timetable wish": "Ders programı isteği", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Oluşturucunun dikkate aldığı bir istek. Katı isteğe her zaman uyar, esnek isteğe uyabildiği yerde.", + "Whether the wish is about a teacher, a group, a room or one activity": "İsteğin bir öğretmen, grup, derslik veya tek bir etkinlikle ilgili olup olmadığı", + "Teacher": "Öğretmen", + "Group": "Grup", + "Reference": "Referans", + "The user, group, room or activity the wish is about": "İsteğin ilgili olduğu kullanıcı, grup, derslik veya etkinlik", + "What the wish asks for": "İsteğin ne istediği", + "Not on these periods": "Bu ders saatlerinde değil", + "Preferably not on these periods": "Tercihen bu ders saatlerinde değil", + "At most a number of lessons a day": "Günde en fazla belirli sayıda ders", + "No free periods between lessons": "Dersler arasında boşluk yok", + "Always the same room": "Her zaman aynı derslik", + "Periods": "Ders saatleri", + "The periods of the week the wish is about, such as wed-5": "İsteğin ilgili olduğu haftanın ders saatleri, örneğin wed-5", + "Limit": "Sınır", + "The most lessons a day, for a wish of that kind": "Bu türde bir istek için günde en fazla ders", + "Strength": "Güç", + "Whether the generator must keep the wish or should keep it": "Oluşturucunun isteğe uyması gerekip gerekmediği ya da uyması gerektiği", + "Hard": "Katı", + "Soft": "Esnek", + "Weight": "Ağırlık", + "How much a soft wish counts, from 1 to 3": "Esnek bir isteğin ne kadar saydığı, 1 ile 3 arası", + "Why the wish exists": "İsteğin neden var olduğu", + "Timetable scenario": "Ders programı senaryosu", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Oluşturucunun yaptığı ya da mevcut programdan alınan bir haftalık desen. Girdisini ve isteklere ne kadar uyduğunu saklar.", + "The name timetablers know the scenario by": "Programı hazırlayanların senaryoyu bildiği ad", + "Whether the generator made it or it came from the current timetable": "Oluşturucunun mu yaptığı yoksa mevcut programdan mı geldiği", + "Generated": "Oluşturuldu", + "From the current timetable": "Mevcut programdan", + "Week of": "Hafta başı", + "The Monday of the first week of the window": "Dönemin ilk haftasının pazartesi günü", + "Window start": "Dönem başı", + "The first day the week pattern applies to": "Haftalık desenin geçerli olduğu ilk gün", + "Window end": "Dönem sonu", + "The last day the week pattern applies to": "Haftalık desenin geçerli olduğu son gün", + "Waiting, generating, done, failed, or published as draft lessons": "Bekliyor, oluşturuluyor, bitti, başarısız veya taslak ders olarak yayımlandı", + "Waiting": "Bekliyor", + "Generating": "Oluşturuluyor", + "Failed": "Başarısız", + "Published": "Yayımlandı", + "Seed": "Tohum", + "The number the generator starts from, so a run can be repeated": "Bir çalıştırmanın tekrarlanabilmesi için oluşturucunun başladığı sayı", + "Input": "Girdi", + "The periods, rooms, lessons and wishes the scenario was made from": "Senaryonun yapıldığı ders saatleri, derslikler, dersler ve istekler", + "Placements": "Yerleştirmeler", + "Each lesson with the period and room it was given": "Her ders, aldığı ders saati ve derslikle", + "Unplaced lessons": "Yerleştirilmemiş dersler", + "Lessons without a place, each with the hard wish that blocked it": "Yeri olmayan dersler, her biri onu engelleyen katı istekle", + "Broken wishes": "Karşılanmayan istekler", + "The wishes this scenario breaks, with the lessons that break them": "Bu senaryonun karşılamadığı istekler ve onları bozan dersler", + "Measures": "Ölçüler", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Yerleştirilen dersler, karşılanmayan istekler, öğretmen boşlukları, günlük dersler ve derslik kullanımı", + "Reason": "Neden", + "Why the run failed": "Çalıştırmanın neden başarısız olduğu", + "Published at": "Yayımlanma zamanı", + "When the scenario was written out as draft lessons": "Senaryonun taslak ders olarak ne zaman yazıldığı", + "Edit wish": "Dileği düzenle", + "New wish": "Yeni dilek", + "Hard: the generator always keeps it": "Kesin: oluşturucu her zaman uyar", + "Soft: the generator keeps it where it can": "Esnek: oluşturucu elinden geldiğince uyar", + "Weight (1 to 3)": "Ağırlık (1 ile 3 arası)", + "Most lessons a day": "Günde en fazla ders", + "Period": "Ders saati", + "{day} period {number}": "{day} {number}. ders saati", + "Teacher (user name)": "Öğretmen (kullanıcı adı)", + "Activity (group:subject)": "Etkinlik (grup:ders)", + "Say who or what the wish is about.": "Dileğin kimi veya neyi kapsadığını belirtin.", + "Choose at least one period.": "En az bir ders saati seçin.", + "The limit is a whole number of 1 or more.": "Sınır 1 veya daha büyük bir tam sayıdır.", + "Timetable": "Ders programı", + "Wishes": "Dilekler", + "Timetable wishes": "Ders programı dilekleri", + "Generator run": "Oluşturucu çalışması", + "Generator progress": "Oluşturucunun ilerlemesi", + "The run failed: {reason}": "Çalışma başarısız oldu: {reason}", + "{placed} of {lessons} lessons placed": "{lessons} dersten {placed} tanesi yerleştirildi", + "Generate again": "Yeniden oluştur", + "Generate": "Oluştur", + "Every lesson has a place.": "Her dersin bir yeri var.", + "Lesson": "Ders", + "No free period and room": "Boş ders saati ve derslik yok", + "Broken soft wishes": "Uyulmayan esnek dilekler", + "Every soft wish is kept.": "Her esnek dileğe uyuluyor.", + "Wish": "Dilek", + "Lessons": "Dersler", + "Generating: {percent}% of the time budget used": "Oluşturuluyor: sürenin %{percent} kadarı kullanıldı", + "Waiting to start": "Başlamayı bekliyor", + "Published as draft lessons": "Taslak dersler olarak yayımlandı", + "Could not read the scenario.": "Senaryo okunamadı.", + "Could not start the run.": "Çalışma başlatılamadı.", + "Scenarios": "Senaryolar", + "Timetable scenarios": "Ders programı senaryoları", + "Scenario": "Senaryo", + "Take the current timetable": "Geçerli ders programını al", + "Could not take the current timetable.": "Geçerli ders programı alınamadı.", + "Broken hard wishes": "Çiğnenen zorunlu istekler", + "Not on a period of the week grid": "Haftalık tablonun bir dersinde değil", + "Compare scenarios": "Senaryoları karşılaştır", + "Scenarios to compare": "Karşılaştırılacak senaryolar", + "Choose two or three scenarios to compare them.": "Karşılaştırmak için iki veya üç senaryo seçin.", + "Measure": "Ölçü", + "Best": "En iyi", + "Lessons that differ": "Farklı olan dersler", + "No lesson differs.": "Hiçbir ders farklı değil.", + "Not placed": "Yerleştirilmedi", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Yerleştirilen dersler", + "Lessons without a place": "Yeri olmayan dersler", + "Clashes": "Çakışmalar", + "Hard wishes broken": "Uyulmayan kesin dilekler", + "Soft wishes broken": "Uyulmayan esnek dilekler", + "Soft wishes broken, weighted": "Uyulmayan esnek dilekler, ağırlıklı", + "Free periods between lessons, all teachers": "Boş saatler, tüm öğretmenler", + "Most free periods of one teacher": "Bir öğretmenin en çok boş saati", + "Most lessons of one group on a day": "Bir grubun bir günde en çok dersi", + "Room use": "Derslik kullanımı", + "Publish as draft lessons": "Taslak ders olarak yayımla", + "Draft lessons written: {count}": "Yazılan taslak dersler: {count}", + "Could not publish the scenario.": "Senaryo yayımlanamadı.", + "Rules": "Kurallar", + "Rules for {column}": "{column} kuralları", + "When a card enters this column": "Bir kart bu sütuna girdiğinde", + "Action": "Eylem", + "Set the priority": "Önceliği ayarla", + "Assign to": "Ata", + "Assign the person who moved the card": "Kartı taşıyan kişiye ata", + "Remove the assignee": "Atanan kişiyi kaldır", + "Add a label": "Etiket ekle", + "No longer a project member": "Artık proje üyesi değil", + "This label no longer exists": "Bu etiket artık yok", + "Add rule": "Kural ekle", + "Remove rule": "Kuralı kaldır", + "No rules yet. Add one to change a card when it enters this column.": "Henüz kural yok. Bir kart bu sütuna girdiğinde onu değiştirmek için bir kural ekleyin.", + "Could not save the rules. Please try again.": "Kurallar kaydedilemedi. Lütfen tekrar deneyin.", + "1 rule runs when a card enters this column": "Bir kart bu sütuna girdiğinde 1 kural çalışır", + "{count} rules run when a card enters this column": "Bir kart bu sütuna girdiğinde {count} kural çalışır", + "Rules applied: {changes}": "Uygulanan kurallar: {changes}", + "assigned to {name}": "atanan: {name}", + "assignee removed": "atanan kişi kaldırıldı", + "priority {priority}": "öncelik {priority}", + "label {label}": "etiket {label}", + "What happens to a card when it enters this column, applied in list order.": "Bir kart bu sütuna girdiğinde ona ne olacağı, liste sırasıyla.", + "Value": "Değer", + "What the rule does to the card.": "Kuralın karta ne yaptığı.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Eylemin kullandığı öncelik, kullanıcı kimliği veya etiket kimliği; değersiz eylemler için boş.", + "is not": "değil", + "{dimension} is not": "{dimension} değil", + "Saved filters": "Kayıtlı filtreler", + "No saved filters yet": "Henüz kayıtlı filtre yok", + "Save filter": "Filtreyi kaydet", + "Rename \"{name}\"": "\"{name}\" adını değiştir", + "Delete \"{name}\"": "\"{name}\" sil", + "Clear filters": "Filtreleri temizle", + "Showing {shown} of {total} tasks": "{total} görevden {shown} tanesi gösteriliyor", + "Me": "Ben", + "No date": "Tarih yok", + "Rename saved filter": "Kayıtlı filtrenin adını değiştir", + "Share with the project": "Projeyle paylaş", + "Give the filter a name": "Filtreye bir ad verin", + "Could not save the filter. Please try again.": "Filtre kaydedilemedi. Lütfen tekrar deneyin.", + "Some labels in \"{name}\" no longer exist and were left out.": "\"{name}\" içindeki bazı etiketler artık yok ve dışarıda bırakıldı.", + "Could not delete the filter. Please try again.": "Filtre silinemedi. Lütfen tekrar deneyin.", + "Saved filter": "Kayıtlı filtre", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Bir projenin adlandırılmış pano filtresi; projeyle paylaşılmadıkça yalnızca kaydeden kişiye özeldir.", + "The project whose board the filter applies to": "Filtrenin panosuna uygulandığı proje", + "The name the filter is listed under": "Filtrenin listede göründüğü ad", + "Saved by": "Kaydeden", + "Nextcloud user id of the person who saved the filter": "Filtreyi kaydeden kişinin Nextcloud kullanıcı kimliği", + "Shared with the project": "Projeyle paylaşıldı", + "Whether every project member sees and applies the filter": "Her proje üyesinin filtreyi görüp uygulayabilip uygulayamayacağı", + "Criteria": "Ölçütler", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtre: atanan kişi, etiket, öncelik ve son tarih; her biri eşittir veya değildir ve değerleriyle", + "Cross-project view": "Projeler arası görünüm", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Görevleri durum şeritlerinde birlikte gösterilen ve adı geçen kişilerle paylaşılan kayıtlı bir proje seçimi.", + "Shared with": "Paylaşılan kişiler", + "The name the view is listed under": "Görünümün listelendiği ad", + "Nextcloud user id of the person who saved the view": "Görünümü kaydeden kişinin Nextcloud kullanıcı kimliği", + "Nextcloud user ids of the people the view is shared with": "Görünümün paylaşıldığı kişilerin Nextcloud kullanıcı kimlikleri", + "The projects whose tasks the view shows, at most twenty": "Görünümün görevlerini gösterdiği projeler, en fazla yirmi", + "1 project in this view is hidden from you.": "Bu görünümdeki 1 proje sizden gizli.", + "{count} projects in this view are hidden from you.": "Bu görünümdeki {count} proje sizden gizli.", + "{project} has no column for {status}.": "{project} projesinin {status} için sütunu yok.", + "This view does not exist or is not shared with you.": "Bu görünüm yok ya da sizinle paylaşılmamış.", + "\"{task}\" moved to {status}.": "\"{task}\" {status} durumuna taşındı.", + "Project: {title}": "Proje: {title}", + "Cross-project views": "Projeler arası görünümler", + "New view": "Yeni görünüm", + "Edit view": "Görünümü düzenle", + "Delete view": "Görünümü sil", + "Give the view a name": "Görünüme bir ad verin", + "Pick at least one project": "En az bir proje seçin", + "A view shows at most {max} projects": "Bir görünüm en fazla {max} proje gösterir", + "Could not save the view. Please try again.": "Görünüm kaydedilemedi. Lütfen yeniden deneyin.", + "Could not delete the view. Please try again.": "Görünüm silinemedi. Lütfen yeniden deneyin.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "\"{title}\" silinsin mi? Projeler ve görevleri olduğu gibi kalır.", + "People see the tasks of the projects they are in, never more.": "Herkes yalnızca içinde olduğu projelerin görevlerini görür.", + "No views yet. A view shows the tasks of several of your projects together.": "Henüz görünüm yok. Bir görünüm birkaç projenizin görevlerini birlikte gösterir.", + "Projects in view: {count}": "Görünümdeki projeler: {count}", + "Notify me when a task is assigned to me": "Bana bir görev atandığında bildir", + "Also send these to me by email": "Bunları bana e-postayla da gönder", + "Add an email address in your Nextcloud personal settings to get mail.": "E-posta almak için Nextcloud kişisel ayarlarınıza bir e-posta adresi ekleyin.", + "Code link": "Kod bağlantısı", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Bir görev üzerinde çalışan, kod platformundaki bir commit, dal, birleştirme isteği veya sorun.", + "The task the link belongs to": "Bağlantının ait olduğu görev", + "The project of the task": "Görevin projesi", + "Task key": "Görev anahtarı", + "The task key the forge text named, such as VC-12": "Kod platformu metninin andığı görev anahtarı, örneğin VC-12", + "What the link points at": "Bağlantının gösterdiği şey", + "Link": "Bağlantı", + "The address of the item in the forge": "Öğenin kod platformundaki adresi", + "The commit message, branch name or merge request title": "Commit mesajı, dal adı veya birleştirme isteğinin başlığı", + "Repository": "Depo", + "The repository, such as acme/portal": "Depo, örneğin acme/portal", + "Forge id": "Platformdaki kimlik", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Öğenin kod platformundaki kendi kimliği, örneğin github:acme/portal#42 veya bir commit özeti", + "State": "Durum", + "The state of a merge request or issue": "Bir birleştirme isteğinin veya sorunun durumu", + "Who made the commit or opened the merge request": "Commit'i kimin yaptığı veya birleştirme isteğini kimin açtığı", + "When the commit was made or the merge request last changed": "Commit'in ne zaman yapıldığı veya birleştirme isteğinin en son ne zaman değiştiği", + "Added by": "Ekleyen", + "Whether a person added the link or the integration wrote it": "Bağlantıyı bir kişinin mi eklediği yoksa entegrasyonun mu yazdığı", + "Nextcloud user UIDs of project members": "Proje üyelerinin Nextcloud kullanıcı kimlikleri", + "Add link": "Bağlantı ekle", + "Added by hand": "Elle eklendi", + "Branch": "Dal", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Entegrasyondan", + "Link to a commit, branch or merge request": "Bir commit'e, dala veya birleştirme isteğine bağlantı", + "Merge request": "Birleştirme isteği", + "Merged": "Birleştirildi", + "No code linked yet. Name {key} in a commit message or paste a link.": "Henüz bağlı kod yok. Bir commit mesajında {key} anahtarını anın veya bir bağlantı yapıştırın.", + "No code linked yet. Paste a link to a commit or merge request.": "Henüz bağlı kod yok. Bir commit'e veya birleştirme isteğine bağlantı yapıştırın.", + "Paste a web address that starts with https://.": "https:// ile başlayan bir web adresi yapıştırın.", + "Remove link {title}": "{title} bağlantısını kaldır", + "The link could not be added.": "Bağlantı eklenemedi.", + "The link could not be removed.": "Bağlantı kaldırılamadı.", + "This link is already on the task.": "Bu bağlantı görevde zaten var.", + "Code forges": "Kod platformları", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "GitHub commit'lerini ve pull request'lerini görevlere bağlayın. Olayları Integriq alır; planninq GitHub'ı hiç çağırmaz.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Yapılandırmayı indirip Integriq'e aktarın. Ardından \"Check the GitHub signature\" kuralına bir gizli anahtar girin.", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "GitHub'da depoya bu adres ve aynı gizli anahtarla bir webhook ekleyin. İçerik türü olarak application/json'u ve push ile pull request olaylarını seçin:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Görev anahtarını, örneğin VC-12, bir commit mesajında, dal adında veya pull request başlığında anın. Bağlantı o zaman o görevde görünür.", + "Without Integriq, project members can still paste a link on the task page.": "Integriq olmadan da proje üyeleri görev sayfasına bir bağlantı yapıştırabilir.", + "Download the Integriq configuration": "Integriq yapılandırmasını indir", + "Calendar": "Takvim", + "Previous": "Önceki", + "Calendar view": "Takvim görünümü", + "Starts:": "Başlangıç:", + "No tasks with a date in this month.": "Bu ay tarihi olan görev yok.", + "Week of {start} to {end}": "{start} ile {end} arasındaki hafta", + "My calendar": "Takvimim", + "Show as list": "Liste olarak göster", + "Show as calendar": "Takvim olarak göster", + "Open my calendar": "Takvimimi aç", + "Nextcloud Tasks": "Nextcloud Görevler", + "Show my tasks in Nextcloud Tasks": "Görevlerimi Nextcloud Görevler'de göster", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Size atanan veya sizinle paylaşılan görevler, Nextcloud Görevler ve Takvim'de \"Planninq\" listesinde görünür. Orada yapılan değişiklikler Planninq'teki bir sonraki değişiklikle değiştirilir.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Bu sunucu Nextcloud Görevler'e yazamıyor, bu yüzden dışa aktarma kullanılamıyor.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Planninq tarafından yönetilir. Burada yapılan değişiklikler Planninq'teki bir sonraki değişiklikle değiştirilir.", + "Working days and holidays": "Çalışma günleri ve tatiller", + "Dates set on the timeline skip the days that are not working days.": "Zaman çizelgesinde ayarlanan tarihler çalışma günü olmayan günleri atlar.", + "Working weekdays": "Haftanın çalışma günleri", + "Non-working days": "Çalışılmayan günler", + "No non-working days yet.": "Henüz çalışılmayan gün yok.", + "Add day": "Gün ekle", + "Year": "Yıl", + "Add Dutch national holidays": "Hollanda resmî tatillerini ekle", + "Save working days": "Çalışma günlerini kaydet", + "Choose at least one working weekday.": "En az bir çalışma günü seçin.", + "Working days saved.": "Çalışma günleri kaydedildi.", + "Could not save the working days.": "Çalışma günleri kaydedilemedi.", + "New Year's Day": "Yılbaşı", + "Easter Sunday": "Paskalya Pazarı", + "Easter Monday": "Paskalya Pazartesisi", + "King's Day": "Kral Günü", + "Liberation Day": "Kurtuluş Günü", + "Ascension Day": "Göğe Yükseliş Günü", + "Whit Sunday": "Pentekost Pazarı", + "Whit Monday": "Pentekost Pazartesisi", + "Christmas Day": "Noel", + "Boxing Day": "Noel'in ikinci günü", + "Dates of {title}": "{title} tarihleri", + "The due date cannot be before the start date.": "Bitiş tarihi başlangıç tarihinden önce olamaz.", + "{title}, from {start} to {end}": "{title}, {start} ile {end} arası", + "The dates could not be saved.": "Tarihler kaydedilemedi.", + "{title} now runs from {start} to {end}": "{title} artık {start} ile {end} arasında", + "Auto-scheduling": "Otomatik planlama", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Açıkken, zaman çizelgesinde bir bitiş tarihini ileri almak engellediği görevleri de kaydırmayı önerir.", + "Move blocked tasks along when a task slips": "Bir görev geciktiğinde engellenen görevleri de kaydır", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Zaman çizelgesinde daha geç bir bitiş tarihi, engellenen görevleri kaydırmayı önerir. Yalnızca \"engeller\" bağlantıları sayılır ve görevler yalnızca ileri kayar.", + "Move the tasks that wait for {title}?": "{title} görevini bekleyen görevler kaydırılsın mı?", + "These tasks wait for it and would start after its new due date:": "Bu görevler onu bekliyor ve yeni bitiş tarihinden sonra başlayacak:", + "{count} tasks would move; the first {limit} are listed.": "{count} görev kayacak; ilk {limit} tanesi listeleniyor.", + "Now": "Şimdi", + "After the move": "Kaydırmadan sonra", + "Only this task": "Yalnızca bu görev", + "Move all": "Tümünü kaydır", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "{title} görevinde durdu: tarihler kaydedilemedi. Ondan önceki görevler kaydırıldı.", + "Cumulative flow": "Kümülatif akış", + "Show as chart": "Grafik olarak göster", + "Show as table": "Tablo olarak göster", + "Tasks per column per day": "Günlük sütun başına görevler", + "Tasks without recorded history in this period: {count}": "Bu dönemde kayıtlı geçmişi olmayan görevler: {count}", + "Lead and cycle time": "Teslim süresi ve döngü süresi", + "No tasks were finished in this period.": "Bu dönemde hiçbir görev tamamlanmadı.", + "Finished tasks": "Tamamlanan görevler", + "Cycle time, average": "Döngü süresi, ortalama", + "Cycle time, 85th percentile": "Döngü süresi, 85. yüzdelik", + "Lead time, average": "Teslim süresi, ortalama", + "Tasks whose finish time was estimated from their history: {count}": "Bitiş zamanı geçmişten tahmin edilen görevler: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Tamamlanan her görevin döngü süresi, ortalama ve 85. yüzdelik ile", + "Slowest tasks": "En yavaş görevler", + "cycle {cycle}, lead {lead}": "döngü {cycle}, teslim {lead}", + "{days} days": "{days} gün", + "Could not load the flow of this project.": "Bu projenin akışı yüklenemedi.", + "Last {days} days": "Son {days} gün", + "Portfolio flow": "Portföy akışı", + "An admin adds portfolios under Projects, Portfolios.": "Bir yönetici portföyleri Projeler, Portföyler altında ekler.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Aynı anda en fazla 50 gösterildiği için gösterilmeyen projeler: {count}", + "Could not load the flow of this portfolio.": "Bu portföyün akışı yüklenemedi.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Bir portföyün projelerinde kümülatif akış ve döngü süresi.", + "Edit report": "Raporu düzenle", + "Only tasks where": "Yalnızca şu görevler", + "Group by": "Gruplama ölçütü", + "Display": "Görünüm", + "Share with everyone who can read its projects": "Projelerini okuyabilen herkesle paylaş", + "The report could not be saved.": "Rapor kaydedilemedi.", + "Number of tasks": "Görev sayısı", + "Bar": "Çubuk", + "Donut": "Halka", + "Table": "Tablo", + "{hidden} of {total} projects in this report are not visible to you": "Bu rapordaki {total} projeden {hidden} tanesi size görünmüyor", + "No tasks match this report.": "Bu rapora uyan görev yok.", + "None": "Yok", + "Could not load this report.": "Bu rapor yüklenemedi.", + "Report": "Rapor", + "Your reports": "Raporlarınız", + "My reports": "Raporlarım", + "Shared reports": "Paylaşılan raporlar", + "You have not built a report yet.": "Henüz bir rapor oluşturmadınız.", + "Nobody has shared a report with you yet.": "Henüz kimse sizinle bir rapor paylaşmadı.", + "Reports you built over tasks, and the ones shared with you.": "Görevler üzerine oluşturduğunuz raporlar ve sizinle paylaşılanlar.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Görevler üzerine kayıtlı bir sorgu: hangi projeler, hangi filtreler, neye göre gruplanmış, sayılmış ya da toplanmış, tablo ya da grafik olarak gösterilen.", + "The name the report is listed under": "Raporun listede göründüğü ad", + "What the report shows and who it is for": "Raporun ne gösterdiği ve kimin için olduğu", + "Nextcloud user id of the person who saved the report": "Raporu kaydeden kişinin Nextcloud kullanıcı kimliği", + "Who can open the report": "Raporu kimin açabileceği", + "Only me": "Yalnızca ben", + "Everyone who can read its projects": "Projelerini okuyabilen herkes", + "The projects the report covers, at most fifty": "Raporun kapsadığı projeler, en fazla elli", + "Filters": "Filtreler", + "Task fields and the value each must equal": "Görev alanları ve her birinin eşit olması gereken değer", + "The task field the report groups on": "Raporun gruplama yaptığı görev alanı", + "Count the tasks, or add up a number on them": "Görevleri say ya da üzerlerindeki bir sayıyı topla", + "Sum": "Toplam", + "Sum of": "Toplanan alan", + "The number added up when the measure is a sum": "Ölçü toplam olduğunda toplanan sayı", + "Story points": "Hikâye puanı", + "Estimated duration": "Tahmini süre", + "How the report is shown": "Raporun nasıl gösterildiği", + "Issue type": "Kayıt türü", + "Task fields and the value each must equal; empty when the report covers every task": "Görev alanları ve her birinin taşıması gereken değer; rapor tüm görevleri kapsıyorsa boş", + "The status a task must have": "Bir görevin sahip olması gereken durum", + "The priority a task must have": "Bir görevin sahip olması gereken öncelik", + "The user a task must be assigned to": "Bir görevin atanmış olması gereken kullanıcı", + "A label a task must carry": "Bir görevin taşıması gereken etiket", + "The board column a task must be in": "Bir görevin bulunması gereken pano sütunu", + "The issue type a task must have": "Bir görevin sahip olması gereken kayıt türü", + "Manager groups": "Yönetici grupları", + "Member groups": "Üye grupları", + "Viewer groups": "Okuyucu grupları", + "Viewers": "Okuyucular", + "Owning group": "Sahip grup", + "Nextcloud groups whose members manage the project": "Üyeleri projeyi yöneten Nextcloud grupları", + "Nextcloud groups whose members work on the project": "Üyeleri projede çalışan Nextcloud grupları", + "Nextcloud groups whose members may read the project": "Üyeleri projeyi okuyabilen Nextcloud grupları", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Projeyi yöneten Nextcloud kullanıcıları: ayarlar, üyeler ve iş", + "Nextcloud user ids who may read the project and its work but not change it": "Projeyi ve işini okuyabilen ama değiştiremeyen Nextcloud kullanıcıları", + "The Nextcloud group that owns the project with its creator, at most one": "Projeye oluşturanla birlikte sahip olan Nextcloud grubu, en fazla bir", + "Nextcloud user ids who may read this through the project": "Bunu proje üzerinden okuyabilen Nextcloud kullanıcıları", + "Nextcloud groups whose members may change this through the project": "Üyeleri bunu proje üzerinden değiştirebilen Nextcloud grupları", + "Nextcloud groups whose members may read this through the project": "Üyeleri bunu proje üzerinden okuyabilen Nextcloud grupları", + "Search for a person or a group…": "Bir kişi ya da grup ara…", + "No one found. Your admin's sharing settings decide who you can find.": "Kimse bulunamadı. Kimleri bulabileceğinizi yöneticinizin paylaşım ayarları belirler.", + "Type at least two characters": "En az iki karakter yazın", + "Everyone in this group": "Bu gruptaki herkes", + "Could not search for people. Please try again.": "Kişiler aranamadı. Lütfen yeniden deneyin.", + "Could not remove the group": "Grup kaldırılamadı", + "Only the owner and managers change who is on this project.": "Bu projede kimin olacağını yalnızca sahibi ve yöneticiler değiştirir.", + "Role of {name}": "{name} rolü", + "Manager": "Yönetici", + "Member": "Üye", + "Viewer": "Okuyucu", + "Could not change the role": "Rol değiştirilemedi", + "Owned by group: {name}": "Grubun sahipliğinde: {name}", + "No group owns this project.": "Bu projenin sahibi olan bir grup yok.", + "Owned by group": "Grubun sahipliğinde", + "Search for a group…": "Grup ara…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Grup bulunamadı. Yöneticinizin paylaşım ayarları hangi grupları bulabileceğinizi belirler.", + "No owning group": "Sahip grup yok", + "Could not search for groups. Please try again.": "Gruplar aranamadı. Lütfen yeniden deneyin.", + "Could not change the owning group": "Sahip grup değiştirilemedi", + "You can read this project. Only its members change it.": "Bu projeyi okuyabilirsiniz. Onu yalnızca üyeleri değiştirir.", + "Course": "Ders", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Bu derste işlenen ders, örneğin bir seçmeli ders, okulun öğrenme uygulaması onu bildiğinde.", + "Online meeting link": "Çevrimiçi ders bağlantısı", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Öğrencilerin bu derse çevrimiçi katıldığı yer. Katıl düğmesi yalnızca https bağlantısında görünür." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/tr.json b/l10n/tr.json index 5898a2fa..80b0623e 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Etkin projeler", + "Archived projects": "Arşivlenmiş projeler", + "Boards": "Panolar", + "My projects": "Projelerim", + "Portfolio": "Portföy", + "Project board": "Proje panosu", + "Projects I am in": "Katıldığım projeler", + "Timeline": "Zaman çizelgesi", + "Timesheet": "Zaman çizelgesi kaydı", + "Features & roadmap": "Özellikler ve yol haritası", + "Flow": "Akış", + "Flows": "Akışlar", + "Reports": "Raporlar", + "Pick a report to open it.": "Açmak için bir rapor seçin.", + "In progress": "Devam ediyor", + "Date": "Tarih", + "Due": "Bitiş", + "Assignee": "Atanan", + "Who": "Kim", + "What": "Ne", + "Minutes": "Dakika", + "Entries": "Kayıtlar", + "Most recent": "En yeni", + "Per person": "Kişi başına", + "By status": "Duruma göre", + "By priority": "Önceliğe göre", + "Task status": "Görev durumu", + "Time spent": "Harcanan zaman", + "Capacity": "Kapasite", + "Due soonest": "En yakın bitiş", + "Minutes logged": "Kaydedilen dakika", + "Nothing is due": "Zamanı gelen bir şey yok", + "Nothing logged yet": "Henüz kayıt yok", + "What is open, what is blocked, and what is overdue.": "Ne açık, ne engellenmiş ve ne gecikmiş.", + "How allocation is spread across the people working on projects.": "Projelerde çalışan kişiler arasında yükün nasıl dağıldığı.", + "Hours logged, and the projects they went to.": "Kaydedilen saatler ve gittikleri projeler.", + "Billable": "Faturalandırılabilir", + "Budget: {amount}": "Bütçe: {amount}", + "Loading projects": "Projeler yükleniyor", + "No projects for this client yet": "Bu müşteri için henüz proje yok", + "Open in Planninq": "Planninq'te aç", + "This project could not be found": "Bu proje bulunamadı", + "Untitled project": "Adsız proje", + "and {count} more": "ve {count} tane daha", + "Store": "Mağaza", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Diğer kuruluşların yayımladığı kayıtları, şemaları ve akışları yükleyin.", + "Work Date": "Çalışma tarihi", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Sütun işlemleri", + "Columns": "Sütunlar", + "Could not remove the column. Please try again.": "Sütun kaldırılamadı. Lütfen tekrar deneyin.", + "Could not save the column. Please try again.": "Sütun kaydedilemedi. Lütfen tekrar deneyin.", + "Done column": "Tamamlandı sütunu", + "Edit column": "Sütunu düzenle", + "Keep the card's status": "Kartın durumunu koru", + "Move its cards to": "Kartlarını şuraya taşı", + "Move left": "Sola taşı", + "Move right": "Sağa taşı", + "Status of cards moved here": "Buraya taşınan kartların durumu", + "The last done column cannot be removed.": "Son tamamlandı sütunu kaldırılamaz.", + "WIP limit": "WIP sınırı", + "over limit": "sınırın üzerinde", + "The status a card gets when it is moved into this column.": "Bir kart bu sütuna taşındığında aldığı durum.", + "All priorities": "Tüm öncelikler", + "Could not create the task. Please try again.": "Görev oluşturulamadı. Lütfen tekrar deneyin.", + "Created": "Oluşturulma", + "Move to backlog": "Birikime taşı", + "Move to board": "Panoya taşı", + "New task": "Yeni görev", + "Nothing in the backlog": "Birikimde hiçbir şey yok", + "Rank": "Sıra", + "Sort by": "Sırala", + "Sort by rank to reorder": "Yeniden sıralamak için sıraya göre sıralayın", + "Task actions": "Görev işlemleri", + "All labels": "Tüm etiketler", + "Filter tasks by label": "Görevleri etikete göre filtrele", + "View timeline": "Zaman çizelgesini görüntüle", + "Board": "Pano", + "List": "Liste", + "Column": "Sütun", + "Board or list": "Pano veya liste", + "Log": "Günlük", + "Add entry": "Kayıt ekle", + "Show": "Göster", + "No actions yet": "Henüz eylem yok", + "Closed": "Kapalı", + "Entry actions": "Kayıt işlemleri", + "Add action": "Eylem ekle", + "by {author}": "{author} tarafından", + "saved {time}": "{time} kaydedildi", + "Attendees: {names}": "Katılımcılar: {names}", + "Add the first entry": "İlk kaydı ekle", + "Issues": "Sorunlar", + "Lessons learned": "Alınan dersler", + "Meetings": "Toplantılar", + "Decisions": "Kararlar", + "Actions": "Eylemler", + "Issue": "Sorun", + "Lesson learned": "Alınan ders", + "Meeting": "Toplantı", + "Decision": "Karar", + "About this project": "Bu proje hakkında", + "No description yet": "Henüz açıklama yok", + "Start date": "Başlangıç tarihi", + "Not set": "Ayarlanmadı", + "End date": "Bitiş tarihi", + "Progress": "İlerleme", + "No tasks yet": "Henüz görev yok", + "Open the board": "Panoyu aç", + "People": "Kişiler", + "Owner": "Sahip", + "Latest log entries": "Son kayıtlar", + "Open the log": "Günlüğü aç", + "{done} of {total} tasks done": "{total} görevden {done} tanesi tamamlandı", + "Edit entry": "Kaydı düzenle", + "Type": "Tür", + "Attendees": "Katılımcılar", + "Issue is closed": "Sorun kapatıldı", + "Could not save the entry. Please try again.": "Kayıt kaydedilemedi. Lütfen tekrar deneyin.", + "From: {title}": "Kaynak: {title}", + "What needs to happen": "Yapılması gereken", + "Could not create the action. Please try again.": "Eylem oluşturulamadı. Lütfen tekrar deneyin.", + "The action was created but could not be linked to the entry.": "Eylem oluşturuldu ancak kayda bağlanamadı.", + "Project pages": "Proje sayfaları", + "Overview": "Genel bakış", + "Risks": "Riskler", + "Log entry": "Günlük kaydı", + "A short name for the entry": "Kayıt için kısa bir ad", + "Project": "Proje", + "The project this entry belongs to": "Bu kaydın ait olduğu proje", + "What kind of entry this is": "Bunun ne tür bir kayıt olduğu", + "When it happened": "Ne zaman oldu", + "What happened, in Markdown": "Ne oldu, Markdown ile", + "Whether an issue is still open": "Bir sorunun hâlâ açık olup olmadığı", + "The people at a meeting": "Bir toplantıdaki kişiler", + "Tasks that came out of this entry": "Bu kayıttan çıkan görevler", + "Add risk": "Risk ekle", + "Risk": "Risk", + "Score": "Puan", + "Response": "Yanıt", + "Review date": "Gözden geçirme tarihi", + "no longer on the project": "artık projede değil", + "Edit {title}": "{title} düzenle", + "No risks recorded yet": "Henüz kayıtlı risk yok", + "Add the first risk": "İlk riski ekle", + "Medium": "Orta", + "Mitigating": "Azaltılıyor", + "Occurred": "Gerçekleşti", + "Avoid": "Kaçın", + "Reduce": "Azalt", + "Transfer": "Devret", + "Accept": "Kabul et", + "Highest open risks": "En yüksek açık riskler", + "No open risks": "Açık risk yok", + "Open the risk register": "Risk kaydını aç", + "Edit risk": "Riski düzenle", + "What could go wrong": "Ne ters gidebilir", + "Likelihood": "Olasılık", + "Impact": "Etki", + "Score {score}": "Puan {score}", + "Countermeasures": "Karşı önlemler", + "Could not save the risk. Please try again.": "Risk kaydedilemedi. Lütfen tekrar deneyin.", + "Risks by likelihood and impact": "Olasılık ve etkiye göre riskler", + "Risk scale": "Risk ölçeği", + "The levels every project scores its risks on, and where low turns into medium and high": "Her projenin risklerini puanladığı düzeyler ve düşüğün ortaya ve yükseğe dönüştüğü yer", + "Number of levels": "Düzey sayısı", + "Likelihood labels": "Olasılık etiketleri", + "Impact labels": "Etki etiketleri", + "Level {level}": "Düzey {level}", + "Medium from score": "Şu puandan itibaren orta", + "High from score": "Şu puandan itibaren yüksek", + "Risk scale saved": "Risk ölçeği kaydedildi", + "1 risk uses level {level}. Change it first.": "1 risk {level} düzeyini kullanıyor. Önce onu değiştirin.", + "{count} risks use level {level}. Change them first.": "{count} risk {level} düzeyini kullanıyor. Önce onları değiştirin.", + "Every level needs a label, and high must start above medium.": "Her düzeyin bir etiketi olmalı ve yüksek, ortanın üzerinde başlamalı.", + "The project this risk belongs to": "Bu riskin ait olduğu proje", + "The cause and the effect, in Markdown": "Neden ve sonuç, Markdown ile", + "Category": "Kategori", + "A free grouping, such as planning, budget or supplier": "Planlama, bütçe veya tedarikçi gibi serbest bir gruplama", + "How likely it is, on the admin's risk scale": "Yöneticinin risk ölçeğine göre ne kadar olası olduğu", + "How hard it would hit, on the admin's risk scale": "Yöneticinin risk ölçeğine göre ne kadar sert vuracağı", + "Likelihood times impact, calculated by the server": "Olasılık çarpı etki, sunucu tarafından hesaplanır", + "Where the risk stands": "Riskin durumu", + "The person who watches this risk": "Bu riski izleyen kişi", + "How the project answers the risk": "Projenin riske nasıl yanıt verdiği", + "What is done to prevent it or soften it, in Markdown": "Önlemek veya hafifletmek için yapılanlar, Markdown ile", + "When to look at this risk again": "Riskin yeniden ne zaman gözden geçirileceği", + "Very low": "Çok düşük", + "Very high": "Çok yüksek", + "All projects": "Tüm projeler", + "Project status report": "Proje durum raporu", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Bir projenin para, organizasyon, zaman, bilgi, kalite ve risk (GROTIK yönleri) açısından nasıl durduğuna dair, her biri notlu, tarihli bir rapor.", + "The project this report is about": "Raporun ilgili olduğu proje", + "Report date": "Rapor tarihi", + "The day the report describes": "Raporun anlattığı gün", + "Money": "Para", + "How the project stands on this aspect": "Projenin bu yönde nasıl durduğu", + "On track": "Yolunda", + "At risk": "Risk altında", + "Off track": "Yolundan çıkmış", + "Money note": "Para notu", + "A short explanation of this status": "Bu durumun kısa açıklaması", + "Organisation": "Organizasyon", + "Organisation note": "Organizasyon notu", + "Time": "Zaman", + "Time note": "Zaman notu", + "Information": "Bilgi", + "Information note": "Bilgi notu", + "Quality": "Kalite", + "Quality note": "Kalite notu", + "Risk note": "Risk notu", + "Overall": "Genel", + "The worst of the six statuses, calculated by the server": "Altı durumun en kötüsü, sunucu tarafından hesaplanır", + "Health: money": "Sağlık: para", + "Copied from the newest status report": "En yeni durum raporundan kopyalanır", + "Health: organisation": "Sağlık: organizasyon", + "Health: time": "Sağlık: zaman", + "Health: information": "Sağlık: bilgi", + "Health: quality": "Sağlık: kalite", + "Health: risk": "Sağlık: risk", + "Health: overall": "Sağlık: genel", + "Health: report date": "Sağlık: rapor tarihi", + "The date of the newest status report": "En yeni durum raporunun tarihi", + "New report": "Yeni rapor", + "Only the project owner writes status reports.": "Durum raporlarını yalnızca proje sahibi yazar.", + "Latest report, {date}": "Son rapor, {date}", + "Aspect": "Yön", + "Note": "Not", + "Report history": "Rapor geçmişi", + "Author": "Yazar", + "No status reports yet": "Henüz durum raporu yok", + "Write the first report": "İlk raporu yaz", + "Choose a status for every aspect to save the report.": "Raporu kaydetmek için her yön için bir durum seçin.", + "Suggested: on track.": "Öneri: yolunda.", + "Suggested: at risk.": "Öneri: risk altında.", + "Suggested: off track.": "Öneri: yolundan çıkmış.", + "1 task is past its due date.": "1 görevin son tarihi geçti.", + "{count} tasks are past their due date.": "Son tarihi geçen görevler: {count}.", + "The end date has passed with 1 open task.": "Bitiş tarihi 1 açık görevle geçti.", + "The end date has passed with {count} open tasks.": "Bitiş tarihi geçti, açık görevler: {count}.", + "No open task is past its due date.": "Hiçbir açık görevin son tarihi geçmedi.", + "The highest open risk, \"{title}\", scores {score}.": "En yüksek açık risk, \"{title}\", {score} puan alıyor.", + "There are no open risks.": "Açık risk yok.", + "Costs are at {percent}% of the budget.": "Maliyetler bütçenin %{percent} kadarında.", + "No suggestion: the project has no budget.": "Öneri yok: projenin bütçesi yok.", + "No suggestion: no costs are recorded for this project yet.": "Öneri yok: bu proje için henüz maliyet kaydedilmedi.", + "The report was not saved. Only the project owner can write status reports.": "Rapor kaydedilmedi. Durum raporlarını yalnızca proje sahibi yazabilir.", + "No report": "Rapor yok", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Aynı kişilerin yürüttüğü proje grubu, örneğin bir birim veya bir program. Sorumluları içindeki her projeyi okur.", + "The name of the portfolio": "Portföyün adı", + "What the portfolio holds and who runs it": "Portföyün neleri içerdiği ve kimin yürüttüğü", + "A colour for the portfolio's section in project lists": "Proje listelerinde portföy bölümünün rengi", + "Managers": "Sorumlular", + "Nextcloud user UIDs of the people who run the portfolio": "Portföyü yürüten kişilerin Nextcloud kullanıcı kimlikleri", + "Order": "Sıra", + "Where the portfolio comes in project lists, lowest first": "Portföyün proje listelerindeki yeri, en küçük önce", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Bu portföyün JSON biçiminde kendi risk ölçeği, uygulama geneli ölçekle aynı biçimde. Boş, uygulama geneli ölçek demektir.", + "Portfolio readers": "Portföy okuyucuları", + "Nextcloud user UIDs of the managers of the project's portfolio": "Projenin portföy sorumlularının Nextcloud kullanıcı kimlikleri", + "The portfolio this project belongs to": "Bu projenin ait olduğu portföy", + "No portfolio": "Portföy yok", + "All portfolios": "Tüm portföyler", + "You read this project as a manager of its portfolio. Only its members change it.": "Bu projeyi portföyünün sorumlusu olarak okuyorsunuz. Yalnızca üyeleri değiştirir.", + "Portfolios": "Portföyler", + "Portfolio status": "Portföy durumu", + "No portfolios yet": "Henüz portföy yok", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Bir yönetici portföyleri Projeler, Portföyler altında ekler. Bir portföyün projeleri durumlarıyla burada listelenir.", + "Roll-up": "Özet", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} yolunda, {atRisk} risk altında, {offTrack} yoldan çıkmış, {noReport} raporsuz", + "No project in this portfolio that you can read.": "Bu portföyde okuyabileceğiniz proje yok.", + "Start": "Başlangıç", + "End": "Bitiş", + "Budget": "Bütçe", + "Last report": "Son rapor", + "Out of date": "Güncel değil", + "Portfolio timeline": "Portföy zaman çizelgesi", + "Zoom": "Yakınlaştırma", + "Could not load the timeline": "Zaman çizelgesi yüklenemedi", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Bir yönetici portföyleri Projeler, Portföyler altında ekler. Bir portföyün projeleri burada tek bir zaman çizelgesinde gösterilir.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Aşamalarını ve görevlerini görmek için bir proje açın. Zaman çizelgesi salt okunurdur.", + "Phase: {title}": "Aşama: {title}", + "Left out because you cannot read them: {count} projects": "Okuyamadığınız için dışarıda bırakıldı: {count} proje", + "Week": "Hafta", + "Day": "Gün", + "Month": "Ay", + "Please try again later.": "Lütfen daha sonra yeniden deneyin.", + "Status reports": "Durum raporları", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Bir projenin son durum raporunun portföy genel bakışında kaç gün sonra güncel değil olarak işaretleneceği", + "Reporting period (days)": "Raporlama dönemi (gün)", + "The reporting period is a whole number of days from 1 to 365.": "Raporlama dönemi 1 ile 365 arasında tam sayıda gündür.", + "Reporting period saved": "Raporlama dönemi kaydedildi", + "The reporting period was not saved. Please try again.": "Raporlama dönemi kaydedilmedi. Lütfen yeniden deneyin.", + "Every project of a portfolio with its status per aspect, rolled up.": "Bir portföyün her projesi, yön başına durumuyla özetlenmiş.", + "The projects of a portfolio on one timeline.": "Bir portföyün projeleri tek bir zaman çizelgesinde.", + "Phases": "Aşamalar", + "Add phase": "Aşama ekle", + "No phases yet": "Henüz aşama yok", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Projeyi başlatma, tanımlama ve uygulama gibi aşamalara bölün. Bir aşama, kapanış belgesi yüklendiğinde kapanır.", + "{hours} hours": "{hours} saat", + "Concluding document: {title}": "Kapanış belgesi: {title}", + "Concluding document missing": "Kapanış belgesi eksik", + "Move {title} up": "{title} yukarı taşı", + "Move {title} down": "{title} aşağı taşı", + "Close phase": "Aşamayı kapat", + "Phase": "Aşama", + "Files": "Dosyalar", + "Notes": "Notlar", + "Audit trail": "Denetim izi", + "Edit phase": "Aşamayı düzenle", + "Name": "Ad", + "Budget hours": "Bütçe saatleri", + "Could not save the phase. Please try again.": "Aşama kaydedilemedi. Lütfen yeniden deneyin.", + "Close phase {title}": "{title} aşamasını kapat", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Bir aşama kapanış belgesiyle kapanır: buraya yükleyin veya aşamanın dosyalarından birini seçin.", + "Concluding document": "Kapanış belgesi", + "This phase has no files yet.": "Bu aşamanın henüz dosyası yok.", + "Upload a document": "Belge yükle", + "The document was not uploaded. Please try again.": "Belge yüklenmedi. Lütfen yeniden deneyin.", + "Upload the concluding document before you close this phase.": "Bu aşamayı kapatmadan önce kapanış belgesini yükleyin.", + "This phase cannot be closed from its current status.": "Bu aşama mevcut durumundan kapatılamaz.", + "The phase was not closed. Please try again.": "Aşama kapatılmadı. Lütfen yeniden deneyin.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "Bu aşamayı kapatan, aşamadaki dosyanın kimliği. Aşama ancak bu ayarlandığında ve dosya eklendiğinde tamamlanabilir.", + "Import from Microsoft Project": "Microsoft Project'ten içe aktar", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Microsoft Project'ten XML biçiminde kaydedilmiş bir plan seçin. Siz onaylayana kadar hiçbir şey içe aktarılmaz.", + "Plan file": "Plan dosyası", + "What the import creates": "İçe aktarmanın oluşturacakları", + "Tasks": "Görevler", + "Sub-tasks": "Alt görevler", + "Milestones": "Kilometre taşları", + "Links": "Bağlantılar", + "Already imported, updated in place: {count}": "Zaten içe aktarılmış, yerinde güncellendi: {count}", + "What does not carry over": "Aktarılmayanlar", + "Tasks with resources, which are not imported: {count}": "Kaynak atanmış görevler, kaynaklar içe aktarılmaz: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Düzey 3'ten derin görevler, düzey 2 görevlerinin altına yerleştirildi: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Bitiş-başlangıç dışındaki bağlantılar, ilişkili bağlantı olarak içe aktarıldı: {count}", + "Link lags, which are dropped: {count}": "Bağlantı gecikmeleri, bunlar atılır: {count}", + "Links to a summary task, which are not imported: {count}": "Özet göreve bağlantılar, içe aktarılmaz: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Bu planın dışındaki görevlere bağlantılar, içe aktarılmaz: {count}", + "No longer in the plan": "Artık planda değil", + "These stay in the project; remove them yourself if they are no longer needed.": "Bunlar projede kalır; artık gerekmiyorsa kendiniz kaldırın.", + "Import": "İçe aktar", + "Close": "Kapat", + "The plan is imported: {created} created, {updated} updated.": "Plan içe aktarıldı: {created} oluşturuldu, {updated} güncellendi.", + "Links that would close a loop were left out: {count}": "Döngü oluşturacak bağlantılar atlandı: {count}", + "The import stopped part-way. Run it again to finish it.": "İçe aktarma yarıda durdu. Tamamlamak için yeniden çalıştırın.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Planı Microsoft Project'te Dosya, Farklı kaydet, XML biçimi ile kaydedin ve o dosyayı içe aktarın.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Bu dosya DOCTYPE veya varlıklar bildiriyor, bunlar kabul edilmez.", + "The file is larger than 10 MB.": "Dosya 10 MB'tan büyük.", + "The plan has more than 2,000 tasks, more than one import takes.": "Planda 2.000'den fazla görev var, bir içe aktarmanın alabileceğinden fazla.", + "This file is not a Microsoft Project plan in XML format.": "Bu dosya XML biçiminde bir Microsoft Project planı değil.", + "Choose a file to import.": "İçe aktarılacak bir dosya seçin.", + "Only the project owner can import a plan.": "Yalnızca proje sahibi bir plan içe aktarabilir.", + "The plan could not be read. Please try again.": "Plan okunamadı. Lütfen yeniden deneyin.", + "Linked case: {title}": "Bağlı dosya: {title}", + "Linked to a case": "Bir dosyaya bağlı", + "Hand over to case": "Dosyaya teslim et", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Projenin ve görevlerinin her dosyasını ve projeyi tanımlayan bir dosyayı değiştirmeden bağlı dosyaya kopyalar.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Kopyalanan dosyalar: {count}", + "Files that failed: {names}": "Başarısız dosyalar: {names}", + "The handover failed. Please try again.": "Teslim başarısız oldu. Lütfen yeniden deneyin.", + "The linked case could not be found, or you cannot open it.": "Bağlı dosya bulunamadı veya açamıyorsunuz.", + "Case handovers": "Dosyaya teslimler", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Projenin dosyalarının ve üst verilerinin dosyasına her teslimi: ne zaman, kim tarafından, hangi dosyaya, SHA-256 değeriyle kopyalanan her dosya ve başarısız dosyalar.", + "Finance": "Finans", + "Add cost line": "Maliyet satırı ekle", + "Delivery terms": "Teslim koşulları", + "Billing model": "Faturalama modeli", + "Budget in euro": "Euro cinsinden bütçe", + "Budget in hours": "Saat cinsinden bütçe", + "Hourly rate in euro": "Euro cinsinden saatlik ücret", + "Planned start": "Planlanan başlangıç", + "Planned end": "Planlanan bitiş", + "Planned dates": "Planlanan tarihler", + "Budget {amount}": "Bütçe {amount}", + "No budget agreed": "Üzerinde anlaşılmış bütçe yok", + "Hours": "Saatler", + "Only the project owner and the portfolio managers see the amounts.": "Tutarları yalnızca proje sahibi ve portföy yöneticileri görür.", + "Budget against cost per category": "Kategoriye göre bütçe ve maliyet", + "Labour (booked time)": "İşçilik (kaydedilen süre)", + "No category": "Kategori yok", + "Hours are not available": "Saatler kullanılamıyor", + "Not yet assigned to a category": "Henüz bir kategoriye atanmadı", + "Total": "Toplam", + "{spent} spent, {remaining} remaining": "{spent} harcandı, {remaining} kaldı", + "Budget against cost per phase": "Aşamaya göre bütçe ve maliyet", + "No phase": "Aşama yok", + "Cost lines": "Maliyet satırları", + "From the finance system": "Finans sisteminden", + "Edit cost line {amount}": "{amount} maliyet satırını düzenle", + "No cost lines yet": "Henüz maliyet satırı yok", + "Commitments": "Taahhütler", + "Actual cost": "Gerçekleşen maliyet", + "Forecast": "Tahmin", + "Remaining": "Kalan", + "Not planned yet": "Henüz planlanmadı", + "{start} to {end}": "{start} ile {end} arası", + "The terms were not saved. Please try again.": "Koşullar kaydedilmedi. Lütfen yeniden deneyin.", + "Terms saved": "Koşullar kaydedildi", + "Fixed price": "Sabit fiyat", + "Hourly": "Saatlik", + "Not billed": "Faturalanmıyor", + "Commitment": "Taahhüt", + "Edit cost line": "Maliyet satırını düzenle", + "Kind": "Tür", + "Amount in euro": "Euro cinsinden tutar", + "Remove": "Kaldır", + "Could not save the cost line. Only the project owner changes the money of a project.": "Maliyet satırı kaydedilemedi. Bir projenin parasını yalnızca proje sahibi değiştirir.", + "Could not remove the cost line. Please try again.": "Maliyet satırı kaldırılamadı. Lütfen yeniden deneyin.", + "{amount} over budget": "Bütçenin {amount} üzerinde", + "Cost categories": "Maliyet kategorileri", + "The categories every project splits its budget and costs into, one per line": "Her projenin bütçesini ve maliyetlerini böldüğü kategoriler, her satıra bir tane", + "Categories": "Kategoriler", + "Give at least one category, each name once.": "En az bir kategori girin, her adı bir kez.", + "Cost categories saved": "Maliyet kategorileri kaydedildi", + "The cost categories were not saved. Please try again.": "Maliyet kategorileri kaydedilmedi. Lütfen yeniden deneyin.", + "Finance line": "Finans satırı", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Bir projedeki tek bir para tutarı: bütçe, taahhüt, gerçekleşen maliyet veya tahmin; bir maliyet kategorisinde ve isteğe bağlı olarak bir aşamada. Proje sahibi girer ya da finans sistemi entegrasyon uygulaması üzerinden gönderir.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Bu tutarın ait olduğu proje. Proje numarası hiçbir projeyle eşleşmeyen finans sistemi satırları için boş.", + "The phase this amount belongs to, if any": "Bu tutarın ait olduğu aşama, varsa", + "The cost category, one of the categories the admin set up": "Maliyet kategorisi, yöneticinin tanımladığı kategorilerden biri", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Tutarın bütçe, taahhüt, gerçekleşen maliyet veya tahmin olup olmadığı", + "Amount": "Tutar", + "The amount in the reporting currency (euro)": "Raporlama para birimindeki tutar (euro)", + "The date the amount was booked or is expected": "Tutarın kaydedildiği veya beklendiği tarih", + "What the amount is for": "Tutarın ne için olduğu", + "Whether a person entered the line or the finance system sent it": "Satırı bir kişinin mi girdiği yoksa finans sisteminin mi gönderdiği", + "Entered by hand": "Elle girildi", + "Finance line id": "Finans satırı kimliği", + "The finance system's own id of this line. One imported line per id.": "Bu satırın finans sistemindeki kendi kimliği. Kimlik başına bir içe aktarılan satır.", + "Project number": "Proje numarası", + "The project number the finance system sent, matched against the project key": "Finans sisteminin gönderdiği, proje anahtarıyla karşılaştırılan proje numarası", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Satırın projesinin portföyü, portföy toplamları tek bir filtreyle alınsın diye projeden kopyalanır", + "Finance readers": "Finans okuyucuları", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "Bu tutarı görebilecek kişilerin Nextcloud kullanıcı UID'leri: proje sahibi ve portföyünün yöneticileri", + "Project owner": "Proje sahibi", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "Elle girilen satırları değiştirip kaldırabilen proje sahibinin Nextcloud kullanıcı UID'si", + "How the client pays: not billed, a fixed price, or by the hour.": "Müşteri nasıl öder: faturalanmıyor, sabit fiyat veya saatlik.", + "Portfolio finance": "Portföy finansı", + "You cannot see the money of any project in this portfolio": "Bu portföydeki hiçbir projenin parasını göremezsiniz", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Sunucu bu portföyün dışındaki projelerin maliyet satırlarını döndürdü, bu yüzden bu toplamlar yanlış olabilir.", + "Projects left out because you cannot see their money: {count}": "Parasını göremediğiniz için dışarıda bırakılan projeler: {count}", + "Unmatched finance lines": "Eşleşmeyen finans satırları", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Bir portföy genelinde toplanan bütçe, taahhütler, gerçekleşen maliyet ve tahmin.", + "Subprojects": "Alt projeler", + "{done} of {total}": "{done}/{total}", + "{done} of {total} tasks done, including subprojects": "{done}/{total} görev tamamlandı, alt projeler dahil", + "Show the subprojects of {title}": "{title} alt projelerini göster", + "Hide the subprojects of {title}": "{title} alt projelerini gizle", + "Part of": "Şunun parçası", + "No parent project": "Üst proje yok", + "A project cannot sit under one of its own subprojects.": "Bir proje kendi alt projelerinden birinin altında olamaz.", + "Projects nest three levels deep at most: programme, project and subproject.": "Projeler en fazla üç düzey iç içe olabilir: program, proje ve alt proje.", + "Parent project": "Üst proje", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Bu projenin altında durduğu proje, örneğin bir program. Projeler en fazla üç düzey iç içe olabilir.", + "Yes": "Evet", + "No": "Hayır", + "{label} (required)": "{label} (zorunlu)", + "{label} is required": "{label} zorunludur", + "Project field": "Proje alanı", + "A field an admin adds to every project, such as a policy area or a contract value.": "Bir yöneticinin her projeye eklediği alan, örneğin bir politika alanı veya sözleşme değeri.", + "Key": "Anahtar", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Değerin kaydedildiği sabit ad, lower camel case biçiminde. Projeler kullandığında değiştirmeyin.", + "Label": "Etiket", + "The name people see next to the field": "Kişilerin alanın yanında gördüğü ad", + "What the field holds": "Alanın içerdiği", + "Text": "Metin", + "Number": "Sayı", + "Choice": "Seçim", + "Person": "Kişi", + "Yes or no": "Evet veya hayır", + "Options": "Seçenekler", + "The choices of a choice field": "Bir seçim alanının seçenekleri", + "Required": "Zorunlu", + "Whether a project must fill in the field": "Bir projenin alanı doldurması gerekip gerekmediği", + "Where the field appears, lowest first": "Alanın göründüğü yer, en düşük önce", + "Applies to": "Uygulandığı yer", + "What the field is added to": "Alanın eklendiği şey", + "Custom fields": "Özel alanlar", + "The values of the project fields an admin defined, keyed by the field's key.": "Bir yöneticinin tanımladığı proje alanlarının, alan anahtarına göre değerleri.", + "Project fields": "Proje alanları", + "Related": "İlgili", + "Remove link": "Bağlantıyı kaldır", + "Link type": "Bağlantı türü", + "Relates to": "İlgili olduğu", + "Duplicates": "Çoğaltır", + "Project key": "Proje anahtarı", + "Every task number starts with it, such as VERG-42.": "Her görev numarası onunla başlar, örneğin VERG-42.", + "This key is already used by another project.": "Bu anahtar zaten başka bir proje tarafından kullanılıyor.", + "Use 2 to 10 letters and digits, starting with a letter.": "Bir harfle başlayan 2 ile 10 arası harf ve rakam kullanın.", + "The key cannot change once tasks carry it.": "Görevler taşıdıktan sonra anahtar değiştirilemez.", + "Project saved. The existing tasks get their numbers in the background.": "Proje kaydedildi. Mevcut görevler numaralarını arka planda alır.", + "Next task number": "Sonraki görev numarası", + "The number the next task of this project gets in its key. Only the system writes it.": "Bu projenin bir sonraki görevinin anahtarında aldığı numara. Yalnızca sistem yazar.", + "Restore {title}": "{title} geri yükle", + "Restore": "Geri yükle", + "Project restored": "Proje geri yüklendi", + "Could not restore the project": "Proje geri yüklenemedi", + "Bring this project back to the active list.": "Bu projeyi etkin projeler listesine geri getirin.", + "Restore project": "Projeyi geri yükle", + "Request reason": "Talebin nedeni", + "Why the requester needs this project. Filled in when the project is requested.": "Talep edenin bu projeye neden ihtiyaç duyduğu. Talepte doldurulur.", + "Reviewed by": "İnceleyen", + "The user who approved or rejected the request.": "Talebi onaylayan veya reddeden kullanıcı.", + "Reviewed at": "İnceleme tarihi", + "When the request was approved or rejected.": "Talebin ne zaman onaylandığı veya reddedildiği.", + "Review note": "İnceleme notu", + "The reviewer's reason, shown to the requester when a request is not approved.": "Bir talep onaylanmadığında talep edenin gördüğü inceleyenin gerekçesi.", + "Members of these groups": "Bu grupların üyeleri", + "Groups that may create projects": "Proje oluşturabilecek gruplar", + "The group {group} no longer exists. Save to remove it.": "{group} grubu artık yok. Kaldırmak için kaydedin.", + "Review project request": "Proje talebini incele", + "Requested by": "Talep eden", + "Why it is needed": "Neden gerekli", + "Desired start date": "İstenen başlangıç tarihi", + "Why is it not approved?": "Neden onaylanmıyor?", + "Give a reason. The requester sees it.": "Bir neden yazın. Talep eden görecek.", + "Approve": "Onayla", + "Reject": "Reddet", + "Reject request": "Talebi reddet", + "The review was not saved. Try again.": "İnceleme kaydedilmedi. Yeniden deneyin.", + "This project is waiting for review": "Bu proje incelenmeyi bekliyor", + "This request was not approved": "Bu talep onaylanmadı", + "Reason: {note}": "Neden: {note}", + "Review request": "Talebi incele", + "Request a project": "Proje talep et", + "Step {step} of 2": "Adım {step}/2", + "Why is this project needed?": "Bu projeye neden ihtiyaç var?", + "Give a reason. The reviewer reads it.": "Bir neden yazın. İnceleyen okuyacak.", + "Back": "Geri", + "Next": "İleri", + "Send request": "Talebi gönder", + "The request was not sent. Try again.": "Talep gönderilmedi. Yeniden deneyin.", + "Requested": "Talep edildi", + "Not approved": "Onaylanmadı", + "Your request was sent": "Talebiniz gönderildi", + "Let everyone else request a project": "Diğer herkesin proje talep etmesine izin ver", + "Add a task": "Görev ekle", + "Delete task": "Görevi sil", + "Edit task": "Görevi düzenle", + "Write": "Yaz", + "Preview": "Önizleme", + "Markdown works here: headings, lists and links.": "Burada Markdown çalışır: başlıklar, listeler ve bağlantılar.", + "Could not save the task. Please try again.": "Görev kaydedilemedi. Lütfen yeniden deneyin.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "\"{title}\" üzerinde kayıtlı süre olduğu için silinemez. Bunun yerine iptal edebilirsiniz: süre kayıtları korunur.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "\"{title}\" silinsin mi? Diğer görevlerle bağlantıları da kaldırılır. Bu işlem geri alınamaz.", + "Keep task": "Görevi koru", + "Cancel task": "Görevi iptal et", + "Only the reporter, the project owner or an admin can delete this task.": "Bu görevi yalnızca bildiren kişi, proje sahibi veya bir yönetici silebilir.", + "Could not delete the task. Please try again.": "Görev silinemedi. Lütfen yeniden deneyin.", + "Could not cancel the task. Please try again.": "Görev iptal edilemedi. Lütfen yeniden deneyin.", + "Responsible": "Sorumlu", + "Also working on this": "Bunun üzerinde çalışan diğerleri", + "Labels": "Etiketler", + "Could not change the priority. Please try again.": "Öncelik değiştirilemedi. Lütfen yeniden deneyin.", + "Other project members who work on this task alongside the person responsible.": "Sorumlu kişiyle birlikte bu görev üzerinde çalışan diğer proje üyeleri.", + "Duplicate": "Çoğalt", + "Could not copy the task. Please try again.": "Görev kopyalanamadı. Lütfen yeniden deneyin.", + "Subtasks": "Alt görevler", + "{done} of {total} done": "{total} görevden {done} tanesi tamamlandı", + "Add a subtask": "Alt görev ekle", + "Checklist": "Kontrol listesi", + "Checklist item actions": "Liste öğesi işlemleri", + "Add a checklist item": "Kontrol listesine öğe ekle", + "Subtasks: {estimate} estimated, {logged} logged": "Alt görevler: {estimate} tahmini, {logged} kayıtlı", + "Total estimate: {total}": "Toplam tahmin: {total}", + "Part of {title}": "{title} görevinin parçası", + "Checklist: {count} done": "Kontrol listesi: {count} tamamlandı", + "This task has subtasks: {count}.": "Bu görevin alt görevleri var: {count}.", + "Keep subtasks as separate tasks": "Alt görevleri ayrı görevler olarak koru", + "Delete subtasks too": "Alt görevleri de sil", + "Copy of {title}": "{title} kopyası", + "The task was copied, but not all of its subtasks. Please check the copy.": "Görev kopyalandı, ancak tüm alt görevleri kopyalanmadı. Kopyayı kontrol edin.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Görev içindeki küçük adımlar. Her öğenin bir kimliği, bir metni ve tamamlanıp tamamlanmadığı bilgisi vardır.", + "Open work per person and per project.": "Kişi ve proje başına açık iş.", + "View": "Görünüm", + "By person": "Kişiye göre", + "By project": "Projeye göre", + "Hours left": "Kalan saat", + "Tasks without an estimate": "Tahmini olmayan görevler", + "Due in 14 days": "14 gün içinde teslim", + "Shared": "Paylaşılan", + "Unassigned": "Atanmamış", + "{hours} h": "{hours} sa", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Görebildiğiniz projelerdeki iş gösterilir. Saatler sorumlu kişiye sayılır; paylaşılan görevler saatsiz sayılır.", + "No open work in these projects.": "Bu projelerde açık iş yok.", + "Open work": "Açık iş", + "{count} open tasks": "{count} açık görev", + "Create a project to see capacity here.": "Kapasiteyi burada görmek için bir proje oluşturun.", + "My tasks": "Görevlerim", + "Show all my tasks": "Tüm görevlerimi göster", + "No tasks assigned to you": "Size atanmış görev yok", + "Browse projects": "Projelere göz atın", + "Later": "Daha sonra", + "Due {date}": "Son tarih {date}", + "Could not change the status. Please try again.": "Durum değiştirilemedi. Lütfen yeniden deneyin.", + "Completed today": "Bugün tamamlanan", + "My open tasks": "Açık görevlerim", + "My overdue tasks": "Geciken görevlerim", + "My tasks in progress": "Devam eden görevlerim", + "Pin to the top": "En üste sabitle", + "Unpin": "Sabitlemeyi kaldır", + "Pinned": "Sabitlendi", + "Actions for {title}": "{title} için işlemler", + "Could not save your project order. Please try again.": "Proje sıranız kaydedilemedi. Lütfen yeniden deneyin.", + "No boards yet": "Henüz pano yok", + "Create a project to get a board.": "Pano için bir proje oluşturun.", + "Use the Projects page to create and manage your projects and tasks.": "Projelerinizi ve görevlerinizi oluşturmak ve yönetmek için Projeler sayfasını kullanın.", + "Go to projects": "Projelere git", + "You are not a member of any projects yet.": "Henüz hiçbir projenin üyesi değilsiniz.", + "Could not search for users. Please try again.": "Kullanıcılar aranamadı. Lütfen yeniden deneyin.", + "Project creation is restricted to administrators.": "Proje oluşturma yöneticilerle sınırlıdır.", + "Only the project owner or an administrator can delete this project.": "Bu projeyi yalnızca proje sahibi veya bir yönetici silebilir.", + "No projects are available to you yet. Ask an administrator to create one.": "Henüz size açık bir proje yok. Bir yöneticiden proje oluşturmasını isteyin.", + "Due: {date}": "Son tarih: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Başlangıç veya son tarihi olan görevler zaman çizelgesinde görünür. Burada görmek için tarih ekleyin.", + "You do not have access to this project.": "Bu projeye erişiminiz yok.", + "Zoom level": "Yakınlaştırma düzeyi", + "Unscheduled": "Planlanmamış", + "Start: {date}": "Başlangıç: {date}", + "Today": "Bugün", + "No scheduled tasks": "Planlanmış görev yok", + "An unexpected error occurred.": "Beklenmeyen bir hata oluştu.", + "Column {number} name": "{number}. sütunun adı", + "Failed to save creation policy": "Oluşturma kuralı kaydedilemedi", + "All authenticated users": "Oturum açmış tüm kullanıcılar", + "Control who may create new projects": "Kimlerin yeni proje oluşturabileceğini belirleyin", + "Administrators only": "Yalnızca yöneticiler", + "Project creation": "Proje oluşturma", + "Allow project creation": "Proje oluşturmaya izin ver", + "Creation policy saved successfully": "Oluşturma kuralı kaydedildi", + "Initializing…": "Başlatılıyor…", + "e.g. 2h 30m, 90m, 1.5h": "örn. 2h 30m, 90m, 1.5h", + "Log time": "Süre kaydet", + "Save estimate": "Tahmini kaydet", + "Logged: {logged}": "Kaydedilen: {logged}", + "over by {amount}": "{amount} aşıldı", + "Time tracking": "Zaman takibi", + "Estimate": "Tahmin", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Geçerli bir tahmin girin (örn. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Geçerli bir süre girin (örn. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Zaman kaydı kaydedilemedi. Lütfen yeniden deneyin.", + "Edit time entry": "Zaman kaydını düzenle", + "Duration": "Süre", + "Date range": "Tarih aralığı", + "Last week": "Geçen hafta", + "No time logged": "Kaydedilmiş süre yok", + "Log time on a task to see it here.": "Burada görmek için bir göreve süre kaydedin.", + "To date": "Bitiş tarihi", + "This week": "Bu hafta", + "Total: {total}": "Toplam: {total}", + "From date": "Başlangıç tarihi", + "Custom range": "Özel aralık", + "All time": "Tüm zamanlar", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Bir görev silinemedi, bu yüzden veriler kalmış olabilir. Projeyi yeniden silin.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Bir zaman kaydı silinemedi, bu yüzden veriler kalmış olabilir. Projeyi yeniden silin.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Bir sütun silinemedi, bu yüzden veriler kalmış olabilir. Projeyi yeniden silin.", + "Could not delete the project. Please try again.": "Proje silinemedi. Lütfen yeniden deneyin.", + "Notification settings": "Bildirim ayarları", + "Configure when due-date reminders are sent": "Son tarih hatırlatmalarının ne zaman gönderileceğini ayarlayın", + "Due-date reminder lead time (hours)": "Son tarih hatırlatması ön süresi (saat)", + "Lead time must be between 1 and 336 hours": "Ön süre 1 ile 336 saat arasında olmalıdır", + "Reminder lead time saved successfully": "Hatırlatma ön süresi kaydedildi", + "Failed to save reminder lead time": "Hatırlatma ön süresi kaydedilemedi", + "Notifications": "Bildirimler", + "Notify me 1 day before a task's due date": "Bir görevin son tarihinden 1 gün önce bana bildir", + "Draft": "Taslak", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Dersin yalnızca öğretmeninin gördüğü bir taslak mı olduğu, yapılıp yapılmayacağı veya iptal edilip edilmediği.", + "New release": "Yeni sürüm", + "Roadmap chart. The same releases and epics are listed below.": "Yol haritası grafiği. Aynı sürümler ve epikler aşağıda listelenmiştir.", + "Nothing on the roadmap yet": "Yol haritasında henüz bir şey yok", + "Releases with a target date and epics with dated tasks appear here.": "Hedef tarihi olan sürümler ve tarihli görevleri olan epikler burada görünür.", + "Releases": "Sürümler", + "No releases yet": "Henüz sürüm yok", + "Target date: {date}": "Hedef tarih: {date}", + "No target date": "Hedef tarih yok", + "Edit {name}": "{name} düzenle", + "Mark {name} as released": "{name} yayımlandı olarak işaretle", + "Mark as released": "Yayımlandı olarak işaretle", + "Epics": "Epikler", + "No epics yet. Open a task to make it an epic.": "Henüz epik yok. Epik yapmak için bir görevi açın.", + "Not scheduled yet": "Henüz planlanmadı", + "Planned": "Planlandı", + "Released": "Yayımlandı", + "Edit release": "Sürümü düzenle", + "Target date": "Hedef tarih", + "Could not save the release. Please try again.": "Sürüm kaydedilemedi. Lütfen yeniden deneyin.", + "Every task of this release is done or cancelled.": "Bu sürümün tüm görevleri tamamlandı ya da iptal edildi.", + "Not finished yet: {count}": "Henüz bitmedi: {count}", + "What happens to these tasks?": "Bu görevlere ne olacak?", + "Move to {name}": "{name} sürümüne taşı", + "Remove the release": "Sürümü kaldır", + "Keep it on {name}": "{name} sürümünde bırak", + "Could not mark the release as released. Please try again.": "Sürüm yayımlandı olarak işaretlenemedi. Lütfen yeniden deneyin.", + "Roadmap": "Yol haritası", + "Tasks or roadmap": "Görevler veya yol haritası", + "Release": "Sürüm", + "Epic": "Epik", + "This task is an epic": "Bu görev bir epik", + "A named, dated delivery of a project that its tasks are planned against.": "Bir projenin, görevlerinin göre planlandığı adlı ve tarihli teslimatı.", + "Name of the release": "Sürümün adı", + "The project this release belongs to": "Bu sürümün ait olduğu proje", + "What this release delivers": "Bu sürümün teslim ettikleri", + "When work on the release starts": "Sürüm üzerindeki çalışmanın başladığı zaman", + "The date the release is due": "Sürümün hazır olması gereken tarih", + "Whether the release is planned, released or archived": "Sürümün planlanmış, yayımlanmış ya da arşivlenmiş olduğu", + "Released on": "Yayımlanma tarihi", + "When the release was marked as released": "Sürümün yayımlandı olarak işaretlendiği zaman", + "The release this task is planned for": "Bu görevin planlandığı sürüm", + "Board view options": "Pano görünüm seçenekleri", + "Colour cards": "Kartları renklendir", + "No colour": "Renk yok", + "By label": "Etikete göre", + "Swimlanes": "Kulvarlar", + "No swimlanes": "Kulvar yok", + "By assignee": "Atanan kişiye göre", + "By epic": "Epiğe göre", + "No assignee": "Atanmamış", + "No epic": "Epik yok", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Kartlar kendi epik satırında kalır. Epiği görev sayfasında değiştirin.", + "Hand over to": "Devret", + "Could not save your board view. It applies until you reload.": "Pano görünümünüz kaydedilemedi. Sayfayı yenileyene kadar geçerlidir.", + "Timetable wish": "Ders programı isteği", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Oluşturucunun dikkate aldığı bir istek. Katı isteğe her zaman uyar, esnek isteğe uyabildiği yerde.", + "Whether the wish is about a teacher, a group, a room or one activity": "İsteğin bir öğretmen, grup, derslik veya tek bir etkinlikle ilgili olup olmadığı", + "Teacher": "Öğretmen", + "Group": "Grup", + "Reference": "Referans", + "The user, group, room or activity the wish is about": "İsteğin ilgili olduğu kullanıcı, grup, derslik veya etkinlik", + "What the wish asks for": "İsteğin ne istediği", + "Not on these periods": "Bu ders saatlerinde değil", + "Preferably not on these periods": "Tercihen bu ders saatlerinde değil", + "At most a number of lessons a day": "Günde en fazla belirli sayıda ders", + "No free periods between lessons": "Dersler arasında boşluk yok", + "Always the same room": "Her zaman aynı derslik", + "Periods": "Ders saatleri", + "The periods of the week the wish is about, such as wed-5": "İsteğin ilgili olduğu haftanın ders saatleri, örneğin wed-5", + "Limit": "Sınır", + "The most lessons a day, for a wish of that kind": "Bu türde bir istek için günde en fazla ders", + "Strength": "Güç", + "Whether the generator must keep the wish or should keep it": "Oluşturucunun isteğe uyması gerekip gerekmediği ya da uyması gerektiği", + "Hard": "Katı", + "Soft": "Esnek", + "Weight": "Ağırlık", + "How much a soft wish counts, from 1 to 3": "Esnek bir isteğin ne kadar saydığı, 1 ile 3 arası", + "Why the wish exists": "İsteğin neden var olduğu", + "Timetable scenario": "Ders programı senaryosu", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Oluşturucunun yaptığı ya da mevcut programdan alınan bir haftalık desen. Girdisini ve isteklere ne kadar uyduğunu saklar.", + "The name timetablers know the scenario by": "Programı hazırlayanların senaryoyu bildiği ad", + "Whether the generator made it or it came from the current timetable": "Oluşturucunun mu yaptığı yoksa mevcut programdan mı geldiği", + "Generated": "Oluşturuldu", + "From the current timetable": "Mevcut programdan", + "Week of": "Hafta başı", + "The Monday of the first week of the window": "Dönemin ilk haftasının pazartesi günü", + "Window start": "Dönem başı", + "The first day the week pattern applies to": "Haftalık desenin geçerli olduğu ilk gün", + "Window end": "Dönem sonu", + "The last day the week pattern applies to": "Haftalık desenin geçerli olduğu son gün", + "Waiting, generating, done, failed, or published as draft lessons": "Bekliyor, oluşturuluyor, bitti, başarısız veya taslak ders olarak yayımlandı", + "Waiting": "Bekliyor", + "Generating": "Oluşturuluyor", + "Failed": "Başarısız", + "Published": "Yayımlandı", + "Seed": "Tohum", + "The number the generator starts from, so a run can be repeated": "Bir çalıştırmanın tekrarlanabilmesi için oluşturucunun başladığı sayı", + "Input": "Girdi", + "The periods, rooms, lessons and wishes the scenario was made from": "Senaryonun yapıldığı ders saatleri, derslikler, dersler ve istekler", + "Placements": "Yerleştirmeler", + "Each lesson with the period and room it was given": "Her ders, aldığı ders saati ve derslikle", + "Unplaced lessons": "Yerleştirilmemiş dersler", + "Lessons without a place, each with the hard wish that blocked it": "Yeri olmayan dersler, her biri onu engelleyen katı istekle", + "Broken wishes": "Karşılanmayan istekler", + "The wishes this scenario breaks, with the lessons that break them": "Bu senaryonun karşılamadığı istekler ve onları bozan dersler", + "Measures": "Ölçüler", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Yerleştirilen dersler, karşılanmayan istekler, öğretmen boşlukları, günlük dersler ve derslik kullanımı", + "Reason": "Neden", + "Why the run failed": "Çalıştırmanın neden başarısız olduğu", + "Published at": "Yayımlanma zamanı", + "When the scenario was written out as draft lessons": "Senaryonun taslak ders olarak ne zaman yazıldığı", + "Edit wish": "Dileği düzenle", + "New wish": "Yeni dilek", + "Hard: the generator always keeps it": "Kesin: oluşturucu her zaman uyar", + "Soft: the generator keeps it where it can": "Esnek: oluşturucu elinden geldiğince uyar", + "Weight (1 to 3)": "Ağırlık (1 ile 3 arası)", + "Most lessons a day": "Günde en fazla ders", + "Period": "Ders saati", + "{day} period {number}": "{day} {number}. ders saati", + "Teacher (user name)": "Öğretmen (kullanıcı adı)", + "Activity (group:subject)": "Etkinlik (grup:ders)", + "Say who or what the wish is about.": "Dileğin kimi veya neyi kapsadığını belirtin.", + "Choose at least one period.": "En az bir ders saati seçin.", + "The limit is a whole number of 1 or more.": "Sınır 1 veya daha büyük bir tam sayıdır.", + "Timetable": "Ders programı", + "Wishes": "Dilekler", + "Timetable wishes": "Ders programı dilekleri", + "Generator run": "Oluşturucu çalışması", + "Generator progress": "Oluşturucunun ilerlemesi", + "The run failed: {reason}": "Çalışma başarısız oldu: {reason}", + "{placed} of {lessons} lessons placed": "{lessons} dersten {placed} tanesi yerleştirildi", + "Generate again": "Yeniden oluştur", + "Generate": "Oluştur", + "Every lesson has a place.": "Her dersin bir yeri var.", + "Lesson": "Ders", + "No free period and room": "Boş ders saati ve derslik yok", + "Broken soft wishes": "Uyulmayan esnek dilekler", + "Every soft wish is kept.": "Her esnek dileğe uyuluyor.", + "Wish": "Dilek", + "Lessons": "Dersler", + "Generating: {percent}% of the time budget used": "Oluşturuluyor: sürenin %{percent} kadarı kullanıldı", + "Waiting to start": "Başlamayı bekliyor", + "Published as draft lessons": "Taslak dersler olarak yayımlandı", + "Could not read the scenario.": "Senaryo okunamadı.", + "Could not start the run.": "Çalışma başlatılamadı.", + "Scenarios": "Senaryolar", + "Timetable scenarios": "Ders programı senaryoları", + "Scenario": "Senaryo", + "Take the current timetable": "Geçerli ders programını al", + "Could not take the current timetable.": "Geçerli ders programı alınamadı.", + "Broken hard wishes": "Çiğnenen zorunlu istekler", + "Not on a period of the week grid": "Haftalık tablonun bir dersinde değil", + "Compare scenarios": "Senaryoları karşılaştır", + "Scenarios to compare": "Karşılaştırılacak senaryolar", + "Choose two or three scenarios to compare them.": "Karşılaştırmak için iki veya üç senaryo seçin.", + "Measure": "Ölçü", + "Best": "En iyi", + "Lessons that differ": "Farklı olan dersler", + "No lesson differs.": "Hiçbir ders farklı değil.", + "Not placed": "Yerleştirilmedi", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Yerleştirilen dersler", + "Lessons without a place": "Yeri olmayan dersler", + "Clashes": "Çakışmalar", + "Hard wishes broken": "Uyulmayan kesin dilekler", + "Soft wishes broken": "Uyulmayan esnek dilekler", + "Soft wishes broken, weighted": "Uyulmayan esnek dilekler, ağırlıklı", + "Free periods between lessons, all teachers": "Boş saatler, tüm öğretmenler", + "Most free periods of one teacher": "Bir öğretmenin en çok boş saati", + "Most lessons of one group on a day": "Bir grubun bir günde en çok dersi", + "Room use": "Derslik kullanımı", + "Publish as draft lessons": "Taslak ders olarak yayımla", + "Draft lessons written: {count}": "Yazılan taslak dersler: {count}", + "Could not publish the scenario.": "Senaryo yayımlanamadı.", + "Rules": "Kurallar", + "Rules for {column}": "{column} kuralları", + "When a card enters this column": "Bir kart bu sütuna girdiğinde", + "Action": "Eylem", + "Set the priority": "Önceliği ayarla", + "Assign to": "Ata", + "Assign the person who moved the card": "Kartı taşıyan kişiye ata", + "Remove the assignee": "Atanan kişiyi kaldır", + "Add a label": "Etiket ekle", + "No longer a project member": "Artık proje üyesi değil", + "This label no longer exists": "Bu etiket artık yok", + "Add rule": "Kural ekle", + "Remove rule": "Kuralı kaldır", + "No rules yet. Add one to change a card when it enters this column.": "Henüz kural yok. Bir kart bu sütuna girdiğinde onu değiştirmek için bir kural ekleyin.", + "Could not save the rules. Please try again.": "Kurallar kaydedilemedi. Lütfen tekrar deneyin.", + "1 rule runs when a card enters this column": "Bir kart bu sütuna girdiğinde 1 kural çalışır", + "{count} rules run when a card enters this column": "Bir kart bu sütuna girdiğinde {count} kural çalışır", + "Rules applied: {changes}": "Uygulanan kurallar: {changes}", + "assigned to {name}": "atanan: {name}", + "assignee removed": "atanan kişi kaldırıldı", + "priority {priority}": "öncelik {priority}", + "label {label}": "etiket {label}", + "What happens to a card when it enters this column, applied in list order.": "Bir kart bu sütuna girdiğinde ona ne olacağı, liste sırasıyla.", + "Value": "Değer", + "What the rule does to the card.": "Kuralın karta ne yaptığı.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Eylemin kullandığı öncelik, kullanıcı kimliği veya etiket kimliği; değersiz eylemler için boş.", + "is not": "değil", + "{dimension} is not": "{dimension} değil", + "Saved filters": "Kayıtlı filtreler", + "No saved filters yet": "Henüz kayıtlı filtre yok", + "Save filter": "Filtreyi kaydet", + "Rename \"{name}\"": "\"{name}\" adını değiştir", + "Delete \"{name}\"": "\"{name}\" sil", + "Clear filters": "Filtreleri temizle", + "Showing {shown} of {total} tasks": "{total} görevden {shown} tanesi gösteriliyor", + "Me": "Ben", + "No date": "Tarih yok", + "Rename saved filter": "Kayıtlı filtrenin adını değiştir", + "Share with the project": "Projeyle paylaş", + "Give the filter a name": "Filtreye bir ad verin", + "Could not save the filter. Please try again.": "Filtre kaydedilemedi. Lütfen tekrar deneyin.", + "Some labels in \"{name}\" no longer exist and were left out.": "\"{name}\" içindeki bazı etiketler artık yok ve dışarıda bırakıldı.", + "Could not delete the filter. Please try again.": "Filtre silinemedi. Lütfen tekrar deneyin.", + "Saved filter": "Kayıtlı filtre", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Bir projenin adlandırılmış pano filtresi; projeyle paylaşılmadıkça yalnızca kaydeden kişiye özeldir.", + "The project whose board the filter applies to": "Filtrenin panosuna uygulandığı proje", + "The name the filter is listed under": "Filtrenin listede göründüğü ad", + "Saved by": "Kaydeden", + "Nextcloud user id of the person who saved the filter": "Filtreyi kaydeden kişinin Nextcloud kullanıcı kimliği", + "Shared with the project": "Projeyle paylaşıldı", + "Whether every project member sees and applies the filter": "Her proje üyesinin filtreyi görüp uygulayabilip uygulayamayacağı", + "Criteria": "Ölçütler", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Filtre: atanan kişi, etiket, öncelik ve son tarih; her biri eşittir veya değildir ve değerleriyle", + "Cross-project view": "Projeler arası görünüm", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Görevleri durum şeritlerinde birlikte gösterilen ve adı geçen kişilerle paylaşılan kayıtlı bir proje seçimi.", + "Shared with": "Paylaşılan kişiler", + "The name the view is listed under": "Görünümün listelendiği ad", + "Nextcloud user id of the person who saved the view": "Görünümü kaydeden kişinin Nextcloud kullanıcı kimliği", + "Nextcloud user ids of the people the view is shared with": "Görünümün paylaşıldığı kişilerin Nextcloud kullanıcı kimlikleri", + "The projects whose tasks the view shows, at most twenty": "Görünümün görevlerini gösterdiği projeler, en fazla yirmi", + "1 project in this view is hidden from you.": "Bu görünümdeki 1 proje sizden gizli.", + "{count} projects in this view are hidden from you.": "Bu görünümdeki {count} proje sizden gizli.", + "{project} has no column for {status}.": "{project} projesinin {status} için sütunu yok.", + "This view does not exist or is not shared with you.": "Bu görünüm yok ya da sizinle paylaşılmamış.", + "\"{task}\" moved to {status}.": "\"{task}\" {status} durumuna taşındı.", + "Project: {title}": "Proje: {title}", + "Cross-project views": "Projeler arası görünümler", + "New view": "Yeni görünüm", + "Edit view": "Görünümü düzenle", + "Delete view": "Görünümü sil", + "Give the view a name": "Görünüme bir ad verin", + "Pick at least one project": "En az bir proje seçin", + "A view shows at most {max} projects": "Bir görünüm en fazla {max} proje gösterir", + "Could not save the view. Please try again.": "Görünüm kaydedilemedi. Lütfen yeniden deneyin.", + "Could not delete the view. Please try again.": "Görünüm silinemedi. Lütfen yeniden deneyin.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "\"{title}\" silinsin mi? Projeler ve görevleri olduğu gibi kalır.", + "People see the tasks of the projects they are in, never more.": "Herkes yalnızca içinde olduğu projelerin görevlerini görür.", + "No views yet. A view shows the tasks of several of your projects together.": "Henüz görünüm yok. Bir görünüm birkaç projenizin görevlerini birlikte gösterir.", + "Projects in view: {count}": "Görünümdeki projeler: {count}", + "Notify me when a task is assigned to me": "Bana bir görev atandığında bildir", + "Also send these to me by email": "Bunları bana e-postayla da gönder", + "Add an email address in your Nextcloud personal settings to get mail.": "E-posta almak için Nextcloud kişisel ayarlarınıza bir e-posta adresi ekleyin.", + "Code link": "Kod bağlantısı", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Bir görev üzerinde çalışan, kod platformundaki bir commit, dal, birleştirme isteği veya sorun.", + "The task the link belongs to": "Bağlantının ait olduğu görev", + "The project of the task": "Görevin projesi", + "Task key": "Görev anahtarı", + "The task key the forge text named, such as VC-12": "Kod platformu metninin andığı görev anahtarı, örneğin VC-12", + "What the link points at": "Bağlantının gösterdiği şey", + "Link": "Bağlantı", + "The address of the item in the forge": "Öğenin kod platformundaki adresi", + "The commit message, branch name or merge request title": "Commit mesajı, dal adı veya birleştirme isteğinin başlığı", + "Repository": "Depo", + "The repository, such as acme/portal": "Depo, örneğin acme/portal", + "Forge id": "Platformdaki kimlik", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Öğenin kod platformundaki kendi kimliği, örneğin github:acme/portal#42 veya bir commit özeti", + "State": "Durum", + "The state of a merge request or issue": "Bir birleştirme isteğinin veya sorunun durumu", + "Who made the commit or opened the merge request": "Commit'i kimin yaptığı veya birleştirme isteğini kimin açtığı", + "When the commit was made or the merge request last changed": "Commit'in ne zaman yapıldığı veya birleştirme isteğinin en son ne zaman değiştiği", + "Added by": "Ekleyen", + "Whether a person added the link or the integration wrote it": "Bağlantıyı bir kişinin mi eklediği yoksa entegrasyonun mu yazdığı", + "Nextcloud user UIDs of project members": "Proje üyelerinin Nextcloud kullanıcı kimlikleri", + "Add link": "Bağlantı ekle", + "Added by hand": "Elle eklendi", + "Branch": "Dal", + "Code": "Kod", + "Commit": "Commit", + "From the integration": "Entegrasyondan", + "Link to a commit, branch or merge request": "Bir commit'e, dala veya birleştirme isteğine bağlantı", + "Merge request": "Birleştirme isteği", + "Merged": "Birleştirildi", + "No code linked yet. Name {key} in a commit message or paste a link.": "Henüz bağlı kod yok. Bir commit mesajında {key} anahtarını anın veya bir bağlantı yapıştırın.", + "No code linked yet. Paste a link to a commit or merge request.": "Henüz bağlı kod yok. Bir commit'e veya birleştirme isteğine bağlantı yapıştırın.", + "Paste a web address that starts with https://.": "https:// ile başlayan bir web adresi yapıştırın.", + "Remove link {title}": "{title} bağlantısını kaldır", + "The link could not be added.": "Bağlantı eklenemedi.", + "The link could not be removed.": "Bağlantı kaldırılamadı.", + "This link is already on the task.": "Bu bağlantı görevde zaten var.", + "Code forges": "Kod platformları", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "GitHub commit'lerini ve pull request'lerini görevlere bağlayın. Olayları Integriq alır; planninq GitHub'ı hiç çağırmaz.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Yapılandırmayı indirip Integriq'e aktarın. Ardından \"Check the GitHub signature\" kuralına bir gizli anahtar girin.", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "GitHub'da depoya bu adres ve aynı gizli anahtarla bir webhook ekleyin. İçerik türü olarak application/json'u ve push ile pull request olaylarını seçin:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Görev anahtarını, örneğin VC-12, bir commit mesajında, dal adında veya pull request başlığında anın. Bağlantı o zaman o görevde görünür.", + "Without Integriq, project members can still paste a link on the task page.": "Integriq olmadan da proje üyeleri görev sayfasına bir bağlantı yapıştırabilir.", + "Download the Integriq configuration": "Integriq yapılandırmasını indir", + "Calendar": "Takvim", + "Previous": "Önceki", + "Calendar view": "Takvim görünümü", + "Starts:": "Başlangıç:", + "No tasks with a date in this month.": "Bu ay tarihi olan görev yok.", + "Week of {start} to {end}": "{start} ile {end} arasındaki hafta", + "My calendar": "Takvimim", + "Show as list": "Liste olarak göster", + "Show as calendar": "Takvim olarak göster", + "Open my calendar": "Takvimimi aç", + "Nextcloud Tasks": "Nextcloud Görevler", + "Show my tasks in Nextcloud Tasks": "Görevlerimi Nextcloud Görevler'de göster", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Size atanan veya sizinle paylaşılan görevler, Nextcloud Görevler ve Takvim'de \"Planninq\" listesinde görünür. Orada yapılan değişiklikler Planninq'teki bir sonraki değişiklikle değiştirilir.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Bu sunucu Nextcloud Görevler'e yazamıyor, bu yüzden dışa aktarma kullanılamıyor.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Planninq tarafından yönetilir. Burada yapılan değişiklikler Planninq'teki bir sonraki değişiklikle değiştirilir.", + "Working days and holidays": "Çalışma günleri ve tatiller", + "Dates set on the timeline skip the days that are not working days.": "Zaman çizelgesinde ayarlanan tarihler çalışma günü olmayan günleri atlar.", + "Working weekdays": "Haftanın çalışma günleri", + "Non-working days": "Çalışılmayan günler", + "No non-working days yet.": "Henüz çalışılmayan gün yok.", + "Add day": "Gün ekle", + "Year": "Yıl", + "Add Dutch national holidays": "Hollanda resmî tatillerini ekle", + "Save working days": "Çalışma günlerini kaydet", + "Choose at least one working weekday.": "En az bir çalışma günü seçin.", + "Working days saved.": "Çalışma günleri kaydedildi.", + "Could not save the working days.": "Çalışma günleri kaydedilemedi.", + "New Year's Day": "Yılbaşı", + "Easter Sunday": "Paskalya Pazarı", + "Easter Monday": "Paskalya Pazartesisi", + "King's Day": "Kral Günü", + "Liberation Day": "Kurtuluş Günü", + "Ascension Day": "Göğe Yükseliş Günü", + "Whit Sunday": "Pentekost Pazarı", + "Whit Monday": "Pentekost Pazartesisi", + "Christmas Day": "Noel", + "Boxing Day": "Noel'in ikinci günü", + "Dates of {title}": "{title} tarihleri", + "The due date cannot be before the start date.": "Bitiş tarihi başlangıç tarihinden önce olamaz.", + "{title}, from {start} to {end}": "{title}, {start} ile {end} arası", + "The dates could not be saved.": "Tarihler kaydedilemedi.", + "{title} now runs from {start} to {end}": "{title} artık {start} ile {end} arasında", + "Auto-scheduling": "Otomatik planlama", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Açıkken, zaman çizelgesinde bir bitiş tarihini ileri almak engellediği görevleri de kaydırmayı önerir.", + "Move blocked tasks along when a task slips": "Bir görev geciktiğinde engellenen görevleri de kaydır", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "Zaman çizelgesinde daha geç bir bitiş tarihi, engellenen görevleri kaydırmayı önerir. Yalnızca \"engeller\" bağlantıları sayılır ve görevler yalnızca ileri kayar.", + "Move the tasks that wait for {title}?": "{title} görevini bekleyen görevler kaydırılsın mı?", + "These tasks wait for it and would start after its new due date:": "Bu görevler onu bekliyor ve yeni bitiş tarihinden sonra başlayacak:", + "{count} tasks would move; the first {limit} are listed.": "{count} görev kayacak; ilk {limit} tanesi listeleniyor.", + "Now": "Şimdi", + "After the move": "Kaydırmadan sonra", + "Only this task": "Yalnızca bu görev", + "Move all": "Tümünü kaydır", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "{title} görevinde durdu: tarihler kaydedilemedi. Ondan önceki görevler kaydırıldı.", + "Cumulative flow": "Kümülatif akış", + "Show as chart": "Grafik olarak göster", + "Show as table": "Tablo olarak göster", + "Tasks per column per day": "Günlük sütun başına görevler", + "Tasks without recorded history in this period: {count}": "Bu dönemde kayıtlı geçmişi olmayan görevler: {count}", + "Lead and cycle time": "Teslim süresi ve döngü süresi", + "No tasks were finished in this period.": "Bu dönemde hiçbir görev tamamlanmadı.", + "Finished tasks": "Tamamlanan görevler", + "Cycle time, average": "Döngü süresi, ortalama", + "Cycle time, 85th percentile": "Döngü süresi, 85. yüzdelik", + "Lead time, average": "Teslim süresi, ortalama", + "Tasks whose finish time was estimated from their history: {count}": "Bitiş zamanı geçmişten tahmin edilen görevler: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Tamamlanan her görevin döngü süresi, ortalama ve 85. yüzdelik ile", + "Slowest tasks": "En yavaş görevler", + "cycle {cycle}, lead {lead}": "döngü {cycle}, teslim {lead}", + "{days} days": "{days} gün", + "Could not load the flow of this project.": "Bu projenin akışı yüklenemedi.", + "Last {days} days": "Son {days} gün", + "Portfolio flow": "Portföy akışı", + "An admin adds portfolios under Projects, Portfolios.": "Bir yönetici portföyleri Projeler, Portföyler altında ekler.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Aynı anda en fazla 50 gösterildiği için gösterilmeyen projeler: {count}", + "Could not load the flow of this portfolio.": "Bu portföyün akışı yüklenemedi.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Bir portföyün projelerinde kümülatif akış ve döngü süresi.", + "Edit report": "Raporu düzenle", + "Only tasks where": "Yalnızca şu görevler", + "Group by": "Gruplama ölçütü", + "Display": "Görünüm", + "Share with everyone who can read its projects": "Projelerini okuyabilen herkesle paylaş", + "The report could not be saved.": "Rapor kaydedilemedi.", + "Number of tasks": "Görev sayısı", + "Bar": "Çubuk", + "Donut": "Halka", + "Table": "Tablo", + "{hidden} of {total} projects in this report are not visible to you": "Bu rapordaki {total} projeden {hidden} tanesi size görünmüyor", + "No tasks match this report.": "Bu rapora uyan görev yok.", + "None": "Yok", + "Could not load this report.": "Bu rapor yüklenemedi.", + "Report": "Rapor", + "Your reports": "Raporlarınız", + "My reports": "Raporlarım", + "Shared reports": "Paylaşılan raporlar", + "You have not built a report yet.": "Henüz bir rapor oluşturmadınız.", + "Nobody has shared a report with you yet.": "Henüz kimse sizinle bir rapor paylaşmadı.", + "Reports you built over tasks, and the ones shared with you.": "Görevler üzerine oluşturduğunuz raporlar ve sizinle paylaşılanlar.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Görevler üzerine kayıtlı bir sorgu: hangi projeler, hangi filtreler, neye göre gruplanmış, sayılmış ya da toplanmış, tablo ya da grafik olarak gösterilen.", + "The name the report is listed under": "Raporun listede göründüğü ad", + "What the report shows and who it is for": "Raporun ne gösterdiği ve kimin için olduğu", + "Nextcloud user id of the person who saved the report": "Raporu kaydeden kişinin Nextcloud kullanıcı kimliği", + "Who can open the report": "Raporu kimin açabileceği", + "Only me": "Yalnızca ben", + "Everyone who can read its projects": "Projelerini okuyabilen herkes", + "The projects the report covers, at most fifty": "Raporun kapsadığı projeler, en fazla elli", + "Filters": "Filtreler", + "Task fields and the value each must equal": "Görev alanları ve her birinin eşit olması gereken değer", + "The task field the report groups on": "Raporun gruplama yaptığı görev alanı", + "Count the tasks, or add up a number on them": "Görevleri say ya da üzerlerindeki bir sayıyı topla", + "Sum": "Toplam", + "Sum of": "Toplanan alan", + "The number added up when the measure is a sum": "Ölçü toplam olduğunda toplanan sayı", + "Story points": "Hikâye puanı", + "Estimated duration": "Tahmini süre", + "How the report is shown": "Raporun nasıl gösterildiği", + "Issue type": "Kayıt türü", + "Task fields and the value each must equal; empty when the report covers every task": "Görev alanları ve her birinin taşıması gereken değer; rapor tüm görevleri kapsıyorsa boş", + "The status a task must have": "Bir görevin sahip olması gereken durum", + "The priority a task must have": "Bir görevin sahip olması gereken öncelik", + "The user a task must be assigned to": "Bir görevin atanmış olması gereken kullanıcı", + "A label a task must carry": "Bir görevin taşıması gereken etiket", + "The board column a task must be in": "Bir görevin bulunması gereken pano sütunu", + "The issue type a task must have": "Bir görevin sahip olması gereken kayıt türü", + "Manager groups": "Yönetici grupları", + "Member groups": "Üye grupları", + "Viewer groups": "Okuyucu grupları", + "Viewers": "Okuyucular", + "Owning group": "Sahip grup", + "Nextcloud groups whose members manage the project": "Üyeleri projeyi yöneten Nextcloud grupları", + "Nextcloud groups whose members work on the project": "Üyeleri projede çalışan Nextcloud grupları", + "Nextcloud groups whose members may read the project": "Üyeleri projeyi okuyabilen Nextcloud grupları", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Projeyi yöneten Nextcloud kullanıcıları: ayarlar, üyeler ve iş", + "Nextcloud user ids who may read the project and its work but not change it": "Projeyi ve işini okuyabilen ama değiştiremeyen Nextcloud kullanıcıları", + "The Nextcloud group that owns the project with its creator, at most one": "Projeye oluşturanla birlikte sahip olan Nextcloud grubu, en fazla bir", + "Nextcloud user ids who may read this through the project": "Bunu proje üzerinden okuyabilen Nextcloud kullanıcıları", + "Nextcloud groups whose members may change this through the project": "Üyeleri bunu proje üzerinden değiştirebilen Nextcloud grupları", + "Nextcloud groups whose members may read this through the project": "Üyeleri bunu proje üzerinden okuyabilen Nextcloud grupları", + "Search for a person or a group…": "Bir kişi ya da grup ara…", + "No one found. Your admin's sharing settings decide who you can find.": "Kimse bulunamadı. Kimleri bulabileceğinizi yöneticinizin paylaşım ayarları belirler.", + "Type at least two characters": "En az iki karakter yazın", + "Everyone in this group": "Bu gruptaki herkes", + "Could not search for people. Please try again.": "Kişiler aranamadı. Lütfen yeniden deneyin.", + "Could not remove the group": "Grup kaldırılamadı", + "Only the owner and managers change who is on this project.": "Bu projede kimin olacağını yalnızca sahibi ve yöneticiler değiştirir.", + "Role of {name}": "{name} rolü", + "Manager": "Yönetici", + "Member": "Üye", + "Viewer": "Okuyucu", + "Could not change the role": "Rol değiştirilemedi", + "Owned by group: {name}": "Grubun sahipliğinde: {name}", + "No group owns this project.": "Bu projenin sahibi olan bir grup yok.", + "Owned by group": "Grubun sahipliğinde", + "Search for a group…": "Grup ara…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Grup bulunamadı. Yöneticinizin paylaşım ayarları hangi grupları bulabileceğinizi belirler.", + "No owning group": "Sahip grup yok", + "Could not search for groups. Please try again.": "Gruplar aranamadı. Lütfen yeniden deneyin.", + "Could not change the owning group": "Sahip grup değiştirilemedi", + "You can read this project. Only its members change it.": "Bu projeyi okuyabilirsiniz. Onu yalnızca üyeleri değiştirir.", + "Course": "Ders", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Bu derste işlenen ders, örneğin bir seçmeli ders, okulun öğrenme uygulaması onu bildiğinde.", + "Online meeting link": "Çevrimiçi ders bağlantısı", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Öğrencilerin bu derse çevrimiçi katıldığı yer. Katıl düğmesi yalnızca https bağlantısında görünür." }, "plurals": {} } diff --git a/l10n/uk.js b/l10n/uk.js index 77f1c236..378884bb 100644 --- a/l10n/uk.js +++ b/l10n/uk.js @@ -200,7 +200,1167 @@ OC.L10N.register( "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Активні проєкти", + "Archived projects": "Архівовані проєкти", + "Boards": "Дошки", + "My projects": "Мої проєкти", + "Portfolio": "Портфель", + "Project board": "Дошка проєкту", + "Projects I am in": "Проєкти, у яких я беру участь", + "Timeline": "Часова шкала", + "Timesheet": "Облік часу", + "Features & roadmap": "Функції та дорожня карта", + "Flow": "Потік", + "Flows": "Потоки", + "Reports": "Звіти", + "Pick a report to open it.": "Виберіть звіт, щоб відкрити його.", + "In progress": "У роботі", + "Date": "Дата", + "Due": "Термін", + "Assignee": "Призначено", + "Who": "Хто", + "What": "Що", + "Minutes": "Хвилини", + "Entries": "Записи", + "Most recent": "Найновіші", + "Per person": "На особу", + "By status": "За статусом", + "By priority": "За пріоритетом", + "Task status": "Статус завдань", + "Time spent": "Витрачений час", + "Capacity": "Потужність", + "Due soonest": "Найближчий термін", + "Minutes logged": "Записані хвилини", + "Nothing is due": "Немає нічого запланованого", + "Nothing logged yet": "Ще нічого не записано", + "What is open, what is blocked, and what is overdue.": "Що відкрито, що заблоковано і що прострочено.", + "How allocation is spread across the people working on projects.": "Як розподілено навантаження між людьми, що працюють над проєктами.", + "Hours logged, and the projects they went to.": "Записані години та проєкти, на які вони пішли.", + "Billable": "Оплачуване", + "Budget: {amount}": "Бюджет: {amount}", + "Loading projects": "Завантаження проєктів", + "No projects for this client yet": "Для цього клієнта ще немає проєктів", + "Open in Planninq": "Відкрити в Planninq", + "This project could not be found": "Цей проєкт не знайдено", + "Untitled project": "Проєкт без назви", + "and {count} more": "і ще {count}", + "Store": "Магазин", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Встановлюйте реєстри, схеми та потоки, опубліковані іншими організаціями.", + "Work Date": "Дата роботи", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Дії зі стовпцем", + "Columns": "Стовпці", + "Could not remove the column. Please try again.": "Не вдалося видалити стовпець. Спробуйте ще раз.", + "Could not save the column. Please try again.": "Не вдалося зберегти стовпець. Спробуйте ще раз.", + "Done column": "Стовпець виконаних", + "Edit column": "Редагувати стовпець", + "Keep the card's status": "Зберегти статус картки", + "Move its cards to": "Перемістити його картки до", + "Move left": "Перемістити ліворуч", + "Move right": "Перемістити праворуч", + "Status of cards moved here": "Статус карток, переміщених сюди", + "The last done column cannot be removed.": "Останній стовпець виконаних не можна видалити.", + "WIP limit": "Ліміт WIP", + "over limit": "понад ліміт", + "The status a card gets when it is moved into this column.": "Статус, який отримує картка, коли її переміщують у цей стовпець.", + "All priorities": "Усі пріоритети", + "Could not create the task. Please try again.": "Не вдалося створити завдання. Спробуйте ще раз.", + "Created": "Створено", + "Move to backlog": "До беклогу", + "Move to board": "На дошку", + "New task": "Нове завдання", + "Nothing in the backlog": "У беклозі нічого немає", + "Rank": "Ранг", + "Sort by": "Сортувати за", + "Sort by rank to reorder": "Сортуйте за рангом, щоб змінити порядок", + "Task actions": "Дії із завданням", + "All labels": "Усі мітки", + "Filter tasks by label": "Фільтрувати завдання за міткою", + "View timeline": "Переглянути часову шкалу", + "Board": "Дошка", + "List": "Список", + "Column": "Стовпець", + "Board or list": "Дошка або список", + "Log": "Журнал", + "Add entry": "Додати запис", + "Show": "Показати", + "No actions yet": "Дій ще немає", + "Closed": "Закрито", + "Entry actions": "Дії із записом", + "Add action": "Додати дію", + "by {author}": "автор {author}", + "saved {time}": "збережено {time}", + "Attendees: {names}": "Присутні: {names}", + "Add the first entry": "Додати перший запис", + "Issues": "Проблеми", + "Lessons learned": "Засвоєні уроки", + "Meetings": "Зустрічі", + "Decisions": "Рішення", + "Actions": "Дії", + "Issue": "Проблема", + "Lesson learned": "Засвоєний урок", + "Meeting": "Зустріч", + "Decision": "Рішення", + "About this project": "Про цей проєкт", + "No description yet": "Опису ще немає", + "Start date": "Дата початку", + "Not set": "Не встановлено", + "End date": "Дата завершення", + "Progress": "Поступ", + "No tasks yet": "Завдань ще немає", + "Open the board": "Відкрити дошку", + "People": "Люди", + "Owner": "Власник", + "Latest log entries": "Останні записи", + "Open the log": "Відкрити журнал", + "{done} of {total} tasks done": "Виконано {done} з {total} завдань", + "Edit entry": "Редагувати запис", + "Type": "Вид", + "Attendees": "Присутні", + "Issue is closed": "Проблему закрито", + "Could not save the entry. Please try again.": "Не вдалося зберегти запис. Спробуйте ще раз.", + "From: {title}": "З: {title}", + "What needs to happen": "Що треба зробити", + "Could not create the action. Please try again.": "Не вдалося створити дію. Спробуйте ще раз.", + "The action was created but could not be linked to the entry.": "Дію створено, але не вдалося пов'язати її із записом.", + "Project pages": "Сторінки проєкту", + "Overview": "Огляд", + "Risks": "Ризики", + "Log entry": "Запис журналу", + "A short name for the entry": "Коротка назва запису", + "Project": "Проєкт", + "The project this entry belongs to": "Проєкт, до якого належить цей запис", + "What kind of entry this is": "Який це вид запису", + "When it happened": "Коли це сталося", + "What happened, in Markdown": "Що сталося, у Markdown", + "Whether an issue is still open": "Чи проблема ще відкрита", + "The people at a meeting": "Люди на зустрічі", + "Tasks that came out of this entry": "Завдання, що виникли з цього запису", + "Add risk": "Додати ризик", + "Risk": "Ризик", + "Score": "Оцінка", + "Response": "Реагування", + "Review date": "Дата перегляду", + "no longer on the project": "більше не в проєкті", + "Edit {title}": "Редагувати {title}", + "No risks recorded yet": "Ризиків ще не записано", + "Add the first risk": "Додати перший ризик", + "Medium": "Середній", + "Mitigating": "Пом'якшується", + "Occurred": "Настав", + "Avoid": "Уникнути", + "Reduce": "Зменшити", + "Transfer": "Передати", + "Accept": "Прийняти", + "Highest open risks": "Найвищі відкриті ризики", + "No open risks": "Немає відкритих ризиків", + "Open the risk register": "Відкрити реєстр ризиків", + "Edit risk": "Редагувати ризик", + "What could go wrong": "Що може піти не так", + "Likelihood": "Імовірність", + "Impact": "Вплив", + "Score {score}": "Оцінка {score}", + "Countermeasures": "Контрзаходи", + "Could not save the risk. Please try again.": "Не вдалося зберегти ризик. Спробуйте ще раз.", + "Risks by likelihood and impact": "Ризики за ймовірністю та впливом", + "Risk scale": "Шкала ризиків", + "The levels every project scores its risks on, and where low turns into medium and high": "Рівні, за якими кожен проєкт оцінює свої ризики, і де низький переходить у середній та високий", + "Number of levels": "Кількість рівнів", + "Likelihood labels": "Назви ймовірності", + "Impact labels": "Назви впливу", + "Level {level}": "Рівень {level}", + "Medium from score": "Середній від оцінки", + "High from score": "Високий від оцінки", + "Risk scale saved": "Шкалу ризиків збережено", + "1 risk uses level {level}. Change it first.": "1 ризик використовує рівень {level}. Спершу змініть його.", + "{count} risks use level {level}. Change them first.": "Ризиків на рівні {level}: {count}. Спершу змініть їх.", + "Every level needs a label, and high must start above medium.": "Кожен рівень потребує назви, а високий має починатися вище за середній.", + "The project this risk belongs to": "Проєкт, до якого належить цей ризик", + "The cause and the effect, in Markdown": "Причина й наслідок, у Markdown", + "Category": "Категорія", + "A free grouping, such as planning, budget or supplier": "Вільне групування, наприклад планування, бюджет чи постачальник", + "How likely it is, on the admin's risk scale": "Наскільки це ймовірно, за шкалою ризиків адміністратора", + "How hard it would hit, on the admin's risk scale": "Наскільки сильно це вдарить, за шкалою ризиків адміністратора", + "Likelihood times impact, calculated by the server": "Імовірність помножена на вплив, обчислює сервер", + "Where the risk stands": "На якому етапі ризик", + "The person who watches this risk": "Людина, яка стежить за цим ризиком", + "How the project answers the risk": "Як проєкт реагує на ризик", + "What is done to prevent it or soften it, in Markdown": "Що робиться, щоб запобігти йому чи пом'якшити, у Markdown", + "When to look at this risk again": "Коли знову переглянути цей ризик", + "Very low": "Дуже низький", + "Very high": "Дуже високий", + "All projects": "Усі проєкти", + "Project status report": "Звіт про стан проєкту", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датований звіт про те, як проєкт стоїть щодо грошей, організації, часу, інформації, якості та ризику (аспекти GROTIK), кожен із приміткою.", + "The project this report is about": "Проєкт, якого стосується звіт", + "Report date": "Дата звіту", + "The day the report describes": "День, який описує звіт", + "Money": "Гроші", + "How the project stands on this aspect": "Як проєкт стоїть щодо цього аспекту", + "On track": "За планом", + "At risk": "Під загрозою", + "Off track": "Поза планом", + "Money note": "Примітка про гроші", + "A short explanation of this status": "Коротке пояснення цього стану", + "Organisation": "Організація", + "Organisation note": "Примітка про організацію", + "Time": "Час", + "Time note": "Примітка про час", + "Information": "Інформація", + "Information note": "Примітка про інформацію", + "Quality": "Якість", + "Quality note": "Примітка про якість", + "Risk note": "Примітка про ризик", + "Overall": "Загалом", + "The worst of the six statuses, calculated by the server": "Найгірший із шести станів, обчислюється сервером", + "Health: money": "Стан: гроші", + "Copied from the newest status report": "Скопійовано з найновішого звіту про стан", + "Health: organisation": "Стан: організація", + "Health: time": "Стан: час", + "Health: information": "Стан: інформація", + "Health: quality": "Стан: якість", + "Health: risk": "Стан: ризик", + "Health: overall": "Стан: загалом", + "Health: report date": "Стан: дата звіту", + "The date of the newest status report": "Дата найновішого звіту про стан", + "New report": "Новий звіт", + "Only the project owner writes status reports.": "Звіти про стан пише лише власник проєкту.", + "Latest report, {date}": "Останній звіт, {date}", + "Aspect": "Аспект", + "Note": "Примітка", + "Report history": "Історія звітів", + "Author": "Автор", + "No status reports yet": "Звітів про стан ще немає", + "Write the first report": "Написати перший звіт", + "Choose a status for every aspect to save the report.": "Виберіть стан для кожного аспекту, щоб зберегти звіт.", + "Suggested: on track.": "Пропозиція: за планом.", + "Suggested: at risk.": "Пропозиція: під загрозою.", + "Suggested: off track.": "Пропозиція: поза планом.", + "1 task is past its due date.": "1 завдання прострочене.", + "{count} tasks are past their due date.": "Прострочених завдань: {count}.", + "The end date has passed with 1 open task.": "Дата завершення минула, відкрите 1 завдання.", + "The end date has passed with {count} open tasks.": "Дата завершення минула, відкритих завдань: {count}.", + "No open task is past its due date.": "Жодне відкрите завдання не прострочене.", + "The highest open risk, \"{title}\", scores {score}.": "Найвищий відкритий ризик, «{title}», має оцінку {score}.", + "There are no open risks.": "Відкритих ризиків немає.", + "Costs are at {percent}% of the budget.": "Витрати становлять {percent}% бюджету.", + "No suggestion: the project has no budget.": "Немає пропозиції: у проєкту немає бюджету.", + "No suggestion: no costs are recorded for this project yet.": "Немає пропозиції: для цього проєкту ще не обліковано витрат.", + "The report was not saved. Only the project owner can write status reports.": "Звіт не збережено. Звіти про стан може писати лише власник проєкту.", + "No report": "Немає звіту", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Група проєктів, якими керують ті самі люди, наприклад відділ або програма. Її керівники читають кожен проєкт у ній.", + "The name of the portfolio": "Назва портфеля", + "What the portfolio holds and who runs it": "Що входить до портфеля і хто ним керує", + "A colour for the portfolio's section in project lists": "Колір розділу портфеля у списках проєктів", + "Managers": "Керівники", + "Nextcloud user UIDs of the people who run the portfolio": "Ідентифікатори користувачів Nextcloud, які керують портфелем", + "Order": "Порядок", + "Where the portfolio comes in project lists, lowest first": "Місце портфеля у списках проєктів, спершу найменший", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Власна шкала ризиків цього портфеля у форматі JSON, у тій самій формі, що й шкала всього застосунку. Порожньо означає шкалу застосунку.", + "Portfolio readers": "Читачі портфеля", + "Nextcloud user UIDs of the managers of the project's portfolio": "Ідентифікатори користувачів Nextcloud керівників портфеля проєкту", + "The portfolio this project belongs to": "Портфель, до якого належить проєкт", + "No portfolio": "Без портфеля", + "All portfolios": "Усі портфелі", + "You read this project as a manager of its portfolio. Only its members change it.": "Ви читаєте цей проєкт як керівник його портфеля. Змінюють його лише учасники.", + "Portfolios": "Портфелі", + "Portfolio status": "Стан портфеля", + "No portfolios yet": "Портфелів ще немає", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Адміністратор додає портфелі в розділі Проєкти, Портфелі. Проєкти портфеля наведено тут з їхнім станом.", + "Roll-up": "Зведення", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} за планом, {atRisk} під загрозою, {offTrack} поза планом, {noReport} без звіту", + "No project in this portfolio that you can read.": "У цьому портфелі немає проєкту, який ви можете читати.", + "Start": "Початок", + "End": "Кінець", + "Budget": "Бюджет", + "Last report": "Останній звіт", + "Out of date": "Застарів", + "Portfolio timeline": "Часова шкала портфеля", + "Zoom": "Масштаб", + "Could not load the timeline": "Не вдалося завантажити часову шкалу", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Адміністратор додає портфелі в розділі Проєкти, Портфелі. Проєкти портфеля показано тут на одній часовій шкалі.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Відкрийте проєкт, щоб побачити його фази та завдання. Часова шкала лише для читання.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Пропущено, бо ви не можете їх читати: {count} проєктів", + "Week": "Тиждень", + "Day": "День", + "Month": "Місяць", + "Please try again later.": "Спробуйте пізніше.", + "Status reports": "Звіти про стан", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Через скільки днів останній звіт про стан проєкту позначається як застарілий в огляді портфеля", + "Reporting period (days)": "Звітний період (дні)", + "The reporting period is a whole number of days from 1 to 365.": "Звітний період — ціле число днів від 1 до 365.", + "Reporting period saved": "Звітний період збережено", + "The reporting period was not saved. Please try again.": "Звітний період не збережено. Спробуйте ще раз.", + "Every project of a portfolio with its status per aspect, rolled up.": "Кожен проєкт портфеля зі станом за аспектами, зведено.", + "The projects of a portfolio on one timeline.": "Проєкти портфеля на одній часовій шкалі.", + "Phases": "Фази", + "Add phase": "Додати фазу", + "No phases yet": "Фаз ще немає", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Поділіть проєкт на фази, наприклад ініціація, визначення та реалізація. Фаза закривається, коли завантажено її підсумковий документ.", + "{hours} hours": "{hours} год", + "Concluding document: {title}": "Підсумковий документ: {title}", + "Concluding document missing": "Бракує підсумкового документа", + "Move {title} up": "Перемістити {title} вгору", + "Move {title} down": "Перемістити {title} вниз", + "Close phase": "Закрити фазу", + "Phase": "Фаза", + "Files": "Файли", + "Notes": "Нотатки", + "Audit trail": "Журнал аудиту", + "Edit phase": "Редагувати фазу", + "Name": "Назва", + "Budget hours": "Години за бюджетом", + "Could not save the phase. Please try again.": "Не вдалося зберегти фазу. Спробуйте ще раз.", + "Close phase {title}": "Закрити фазу {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фаза закривається підсумковим документом: завантажте його тут або виберіть один із файлів фази.", + "Concluding document": "Підсумковий документ", + "This phase has no files yet.": "У цієї фази ще немає файлів.", + "Upload a document": "Завантажити документ", + "The document was not uploaded. Please try again.": "Документ не завантажено. Спробуйте ще раз.", + "Upload the concluding document before you close this phase.": "Завантажте підсумковий документ, перш ніж закрити цю фазу.", + "This phase cannot be closed from its current status.": "Цю фазу не можна закрити з її поточного статусу.", + "The phase was not closed. Please try again.": "Фазу не закрито. Спробуйте ще раз.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID файлу цієї фази, який її закриває. Фазу можна завершити лише тоді, коли його вказано і файл прикріплено.", + "Import from Microsoft Project": "Імпорт з Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Виберіть план, збережений з Microsoft Project у форматі XML. Нічого не імпортується, доки ви не підтвердите.", + "Plan file": "Файл плану", + "What the import creates": "Що створить імпорт", + "Tasks": "Завдання", + "Sub-tasks": "Підзавдання", + "Milestones": "Віхи", + "Links": "Зв'язки", + "Already imported, updated in place: {count}": "Вже імпортовані, оновлені на місці: {count}", + "What does not carry over": "Що не переноситься", + "Tasks with resources, which are not imported: {count}": "Завдання з ресурсами, які не імпортуються: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Завдання глибше рівня 3, розміщені під своїм завданням рівня 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Зв'язки, відмінні від закінчення-початок, імпортовані як пов'язані: {count}", + "Link lags, which are dropped: {count}": "Затримки зв'язків, які відкидаються: {count}", + "Links to a summary task, which are not imported: {count}": "Зв'язки з підсумковим завданням, які не імпортуються: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Зв'язки із завданнями поза цим планом, які не імпортуються: {count}", + "No longer in the plan": "Більше немає в плані", + "These stay in the project; remove them yourself if they are no longer needed.": "Вони залишаються в проєкті; видаліть їх самі, якщо вони більше не потрібні.", + "Import": "Імпортувати", + "Close": "Закрити", + "The plan is imported: {created} created, {updated} updated.": "План імпортовано: створено {created}, оновлено {updated}.", + "Links that would close a loop were left out: {count}": "Зв'язки, які замкнули б цикл, пропущено: {count}", + "The import stopped part-way. Run it again to finish it.": "Імпорт зупинився на півдорозі. Запустіть його знову, щоб завершити.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Збережіть план у Microsoft Project через Файл, Зберегти як, формат XML, та імпортуйте цей файл.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Цей файл оголошує DOCTYPE або сутності, які не приймаються.", + "The file is larger than 10 MB.": "Файл більший за 10 МБ.", + "The plan has more than 2,000 tasks, more than one import takes.": "У плані понад 2000 завдань, більше, ніж приймає один імпорт.", + "This file is not a Microsoft Project plan in XML format.": "Цей файл не є планом Microsoft Project у форматі XML.", + "Choose a file to import.": "Виберіть файл для імпорту.", + "Only the project owner can import a plan.": "Лише власник проєкту може імпортувати план.", + "The plan could not be read. Please try again.": "Не вдалося прочитати план. Спробуйте ще раз.", + "Linked case: {title}": "Пов'язана справа: {title}", + "Linked to a case": "Пов'язано зі справою", + "Hand over to case": "Передати до справи", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Копіює без змін кожен файл проєкту та його завдань, а також файл з описом проєкту, до пов'язаної справи.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Скопійовано файлів: {count}", + "Files that failed: {names}": "Файли з помилкою: {names}", + "The handover failed. Please try again.": "Передача не вдалася. Спробуйте ще раз.", + "The linked case could not be found, or you cannot open it.": "Пов'язану справу не знайдено, або ви не можете її відкрити.", + "Case handovers": "Передачі до справи", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Кожна передача файлів і метаданих проєкту до його справи: коли, ким, до якої справи, кожен скопійований файл з його SHA-256 і файли з помилкою.", + "Finance": "Фінанси", + "Add cost line": "Додати рядок витрат", + "Delivery terms": "Умови постачання", + "Billing model": "Модель оплати", + "Budget in euro": "Бюджет у євро", + "Budget in hours": "Бюджет у годинах", + "Hourly rate in euro": "Погодинна ставка в євро", + "Planned start": "Запланований початок", + "Planned end": "Запланований кінець", + "Planned dates": "Заплановані дати", + "Budget {amount}": "Бюджет {amount}", + "No budget agreed": "Бюджет не погоджено", + "Hours": "Години", + "Only the project owner and the portfolio managers see the amounts.": "Суми бачать лише власник проєкту та менеджери портфеля.", + "Budget against cost per category": "Бюджет і витрати за категоріями", + "Labour (booked time)": "Праця (облікований час)", + "No category": "Без категорії", + "Hours are not available": "Години недоступні", + "Not yet assigned to a category": "Ще не віднесено до категорії", + "Total": "Разом", + "{spent} spent, {remaining} remaining": "{spent} витрачено, {remaining} залишилося", + "Budget against cost per phase": "Бюджет і витрати за фазами", + "No phase": "Без фази", + "Cost lines": "Рядки витрат", + "From the finance system": "З фінансової системи", + "Edit cost line {amount}": "Змінити рядок витрат {amount}", + "No cost lines yet": "Рядків витрат ще немає", + "Commitments": "Зобов'язання", + "Actual cost": "Фактичні витрати", + "Forecast": "Прогноз", + "Remaining": "Залишилося", + "Not planned yet": "Ще не заплановано", + "{start} to {end}": "з {start} по {end}", + "The terms were not saved. Please try again.": "Умови не збережено. Спробуйте ще раз.", + "Terms saved": "Умови збережено", + "Fixed price": "Фіксована ціна", + "Hourly": "Погодинно", + "Not billed": "Без рахунку", + "Commitment": "Зобов'язання", + "Edit cost line": "Змінити рядок витрат", + "Kind": "Вид", + "Amount in euro": "Сума в євро", + "Remove": "Вилучити", + "Could not save the cost line. Only the project owner changes the money of a project.": "Не вдалося зберегти рядок витрат. Гроші проєкту змінює лише власник проєкту.", + "Could not remove the cost line. Please try again.": "Не вдалося вилучити рядок витрат. Спробуйте ще раз.", + "{amount} over budget": "{amount} понад бюджет", + "Cost categories": "Категорії витрат", + "The categories every project splits its budget and costs into, one per line": "Категорії, на які кожен проєкт ділить свій бюджет і витрати, по одній у рядку", + "Categories": "Категорії", + "Give at least one category, each name once.": "Вкажіть щонайменше одну категорію, кожну назву один раз.", + "Cost categories saved": "Категорії витрат збережено", + "The cost categories were not saved. Please try again.": "Категорії витрат не збережено. Спробуйте ще раз.", + "Finance line": "Фінансовий рядок", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Одна грошова сума проєкту: бюджет, зобов'язання, фактичні витрати або прогноз, у категорії витрат і за потреби у фазі. Вводить власник проєкту або надсилає фінансова система через застосунок інтеграції.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Проєкт, до якого належить сума. Порожньо для рядка з фінансової системи, номер проєкту якого не збігається з жодним проєктом.", + "The phase this amount belongs to, if any": "Фаза, до якої належить сума, якщо є", + "The cost category, one of the categories the admin set up": "Категорія витрат, одна з категорій, заданих адміністратором", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Чи є сума бюджетом, зобов'язанням, фактичними витратами або прогнозом", + "Amount": "Сума", + "The amount in the reporting currency (euro)": "Сума у валюті звітності (євро)", + "The date the amount was booked or is expected": "Дата, коли суму проведено або очікується", + "What the amount is for": "На що ця сума", + "Whether a person entered the line or the finance system sent it": "Чи ввела рядок людина, чи його надіслала фінансова система", + "Entered by hand": "Введено вручну", + "Finance line id": "Ідентифікатор фінансового рядка", + "The finance system's own id of this line. One imported line per id.": "Власний ідентифікатор рядка у фінансовій системі. Один імпортований рядок на ідентифікатор.", + "Project number": "Номер проєкту", + "The project number the finance system sent, matched against the project key": "Номер проєкту з фінансової системи, звірений із ключем проєкту", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Портфель проєкту рядка, скопійований із проєкту, щоб підсумкам портфеля вистачало одного фільтра", + "Finance readers": "Читачі фінансів", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID користувачів Nextcloud, яким дозволено бачити суму: власник проєкту та менеджери його портфеля", + "Project owner": "Власник проєкту", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID користувача Nextcloud, власника проєкту, який може змінювати й вилучати ручні рядки", + "How the client pays: not billed, a fixed price, or by the hour.": "Як платить клієнт: без рахунку, фіксована ціна або погодинно.", + "Portfolio finance": "Фінанси портфеля", + "You cannot see the money of any project in this portfolio": "Ви не бачите грошей жодного проєкту в цьому портфелі", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Сервер повернув рядки витрат проєктів поза цим портфелем, тому підсумки можуть бути хибними.", + "Projects left out because you cannot see their money: {count}": "Пропущено проєктів, чиї гроші вам не видно: {count}", + "Unmatched finance lines": "Незіставлені фінансові рядки", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Бюджет, зобов'язання, фактичні витрати й прогноз у сумі за портфелем.", + "Subprojects": "Підпроєкти", + "{done} of {total}": "{done} з {total}", + "{done} of {total} tasks done, including subprojects": "Виконано {done} з {total} завдань, з підпроєктами", + "Show the subprojects of {title}": "Показати підпроєкти {title}", + "Hide the subprojects of {title}": "Приховати підпроєкти {title}", + "Part of": "Входить до", + "No parent project": "Без батьківського проєкту", + "A project cannot sit under one of its own subprojects.": "Проєкт не може бути під одним зі своїх підпроєктів.", + "Projects nest three levels deep at most: programme, project and subproject.": "Проєкти вкладаються не глибше трьох рівнів: програма, проєкт і підпроєкт.", + "Parent project": "Батьківський проєкт", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Проєкт, під яким розташований цей проєкт, наприклад програма. Проєкти вкладаються не глибше трьох рівнів.", + "Yes": "Так", + "No": "Ні", + "{label} (required)": "{label} (обов'язково)", + "{label} is required": "Поле «{label}» обов'язкове", + "Project field": "Поле проєкту", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поле, яке адміністратор додає до кожного проєкту, наприклад сфера політики або вартість договору.", + "Key": "Ключ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Постійна назва, під якою зберігається значення, у lower camel case. Не змінюйте її, коли проєкти її використовують.", + "Label": "Підпис", + "The name people see next to the field": "Назва біля поля", + "What the field holds": "Що містить поле", + "Text": "Текст", + "Number": "Число", + "Choice": "Вибір", + "Person": "Особа", + "Yes or no": "Так або ні", + "Options": "Варіанти", + "The choices of a choice field": "Варіанти поля вибору", + "Required": "Обов'язкове", + "Whether a project must fill in the field": "Чи має проєкт заповнити поле", + "Where the field appears, lowest first": "Де з'являється поле, менше першим", + "Applies to": "Стосується", + "What the field is added to": "До чого додається поле", + "Custom fields": "Власні поля", + "The values of the project fields an admin defined, keyed by the field's key.": "Значення полів проєкту, визначених адміністратором, за ключем поля.", + "Project fields": "Поля проєкту", + "Related": "Пов'язані", + "Remove link": "Вилучити зв'язок", + "Link type": "Тип зв'язку", + "Relates to": "Пов'язана з", + "Duplicates": "Дублює", + "Project key": "Ключ проєкту", + "Every task number starts with it, such as VERG-42.": "З нього починається кожен номер завдання, наприклад VERG-42.", + "This key is already used by another project.": "Цей ключ уже використовує інший проєкт.", + "Use 2 to 10 letters and digits, starting with a letter.": "Використовуйте від 2 до 10 літер і цифр, починаючи з літери.", + "The key cannot change once tasks carry it.": "Ключ не можна змінити, коли завдання вже його мають.", + "Project saved. The existing tasks get their numbers in the background.": "Проєкт збережено. Наявні завдання отримують номери у фоновому режимі.", + "Next task number": "Номер наступного завдання", + "The number the next task of this project gets in its key. Only the system writes it.": "Номер, який наступне завдання цього проєкту отримує у своєму ключі. Його записує лише система.", + "Restore {title}": "Відновити {title}", + "Restore": "Відновити", + "Project restored": "Проєкт відновлено", + "Could not restore the project": "Не вдалося відновити проєкт", + "Bring this project back to the active list.": "Повернути цей проєкт до списку активних проєктів.", + "Restore project": "Відновити проєкт", + "Request reason": "Причина запиту", + "Why the requester needs this project. Filled in when the project is requested.": "Навіщо заявнику цей проєкт. Заповнюється під час запиту.", + "Reviewed by": "Розглянуто", + "The user who approved or rejected the request.": "Користувач, який схвалив або відхилив запит.", + "Reviewed at": "Дата розгляду", + "When the request was approved or rejected.": "Коли запит було схвалено або відхилено.", + "Review note": "Примітка рецензента", + "The reviewer's reason, shown to the requester when a request is not approved.": "Причина рецензента, яку бачить заявник, якщо запит не схвалено.", + "Members of these groups": "Учасники цих груп", + "Groups that may create projects": "Групи, яким можна створювати проєкти", + "The group {group} no longer exists. Save to remove it.": "Групи {group} більше не існує. Збережіть, щоб прибрати її.", + "Review project request": "Розглянути запит на проєкт", + "Requested by": "Запитав", + "Why it is needed": "Навіщо він потрібен", + "Desired start date": "Бажана дата початку", + "Why is it not approved?": "Чому не схвалено?", + "Give a reason. The requester sees it.": "Вкажіть причину. Заявник її побачить.", + "Approve": "Схвалити", + "Reject": "Відхилити", + "Reject request": "Відхилити запит", + "The review was not saved. Try again.": "Рішення не збережено. Спробуйте ще раз.", + "This project is waiting for review": "Цей проєкт чекає на розгляд", + "This request was not approved": "Цей запит не схвалено", + "Reason: {note}": "Причина: {note}", + "Review request": "Розглянути запит", + "Request a project": "Запросити проєкт", + "Step {step} of 2": "Крок {step} з 2", + "Why is this project needed?": "Навіщо потрібен цей проєкт?", + "Give a reason. The reviewer reads it.": "Вкажіть причину. Рецензент її прочитає.", + "Back": "Назад", + "Next": "Далі", + "Send request": "Надіслати запит", + "The request was not sent. Try again.": "Запит не надіслано. Спробуйте ще раз.", + "Requested": "Запитано", + "Not approved": "Не схвалено", + "Your request was sent": "Ваш запит надіслано", + "Let everyone else request a project": "Дозволити всім іншим запитувати проєкт", + "Add a task": "Додати завдання", + "Delete task": "Видалити завдання", + "Edit task": "Редагувати завдання", + "Write": "Написати", + "Preview": "Попередній перегляд", + "Markdown works here: headings, lists and links.": "Тут працює Markdown: заголовки, списки та посилання.", + "Could not save the task. Please try again.": "Не вдалося зберегти завдання. Спробуйте ще раз.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "На завданні \"{title}\" обліковано час, тому його не можна видалити. Натомість його можна скасувати: записи часу залишаться.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Видалити \"{title}\"? Його зв'язки з іншими завданнями теж буде видалено. Цю дію не можна скасувати.", + "Keep task": "Залишити завдання", + "Cancel task": "Скасувати завдання", + "Only the reporter, the project owner or an admin can delete this task.": "Видалити це завдання може лише автор, власник проєкту або адміністратор.", + "Could not delete the task. Please try again.": "Не вдалося видалити завдання. Спробуйте ще раз.", + "Could not cancel the task. Please try again.": "Не вдалося скасувати завдання. Спробуйте ще раз.", + "Responsible": "Відповідальний", + "Also working on this": "Також працюють над цим", + "Labels": "Мітки", + "Could not change the priority. Please try again.": "Не вдалося змінити пріоритет. Спробуйте ще раз.", + "Other project members who work on this task alongside the person responsible.": "Інші учасники проєкту, які працюють над завданням разом із відповідальним.", + "Duplicate": "Дублювати", + "Could not copy the task. Please try again.": "Не вдалося скопіювати завдання. Спробуйте ще раз.", + "Subtasks": "Підзавдання", + "{done} of {total} done": "Виконано {done} з {total}", + "Add a subtask": "Додати підзавдання", + "Checklist": "Чек-лист", + "Checklist item actions": "Дії з пунктом чек-листа", + "Add a checklist item": "Додати пункт чек-листа", + "Subtasks: {estimate} estimated, {logged} logged": "Підзавдання: оцінка {estimate}, обліковано {logged}", + "Total estimate: {total}": "Загальна оцінка: {total}", + "Part of {title}": "Частина завдання {title}", + "Checklist: {count} done": "Чек-лист: виконано {count}", + "This task has subtasks: {count}.": "Це завдання має підзавдання: {count}.", + "Keep subtasks as separate tasks": "Залишити підзавдання окремими завданнями", + "Delete subtasks too": "Видалити й підзавдання", + "Copy of {title}": "Копія: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Завдання скопійовано, але не всі його підзавдання. Перевірте копію.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Невеликі кроки всередині завдання. Кожен пункт має id, текст і позначку про виконання.", + "Open work per person and per project.": "Відкрита робота за людьми та за проєктами.", + "View": "Вигляд", + "By person": "За людьми", + "By project": "За проєктами", + "Hours left": "Залишилось годин", + "Tasks without an estimate": "Завдання без оцінки", + "Due in 14 days": "Термін протягом 14 днів", + "Shared": "Спільні", + "Unassigned": "Не призначені", + "{hours} h": "{hours} год", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Показано роботу в проєктах, які ви можете бачити. Години враховуються для відповідальної особи; спільні завдання враховуються без годин.", + "No open work in these projects.": "У цих проєктах немає відкритої роботи.", + "Open work": "Відкрита робота", + "{count} open tasks": "Відкритих завдань: {count}", + "Create a project to see capacity here.": "Створіть проєкт, щоб побачити тут завантаження.", + "My tasks": "Мої завдання", + "Show all my tasks": "Показати всі мої завдання", + "No tasks assigned to you": "Вам не призначено жодного завдання", + "Browse projects": "Переглянути проєкти", + "Later": "Пізніше", + "Due {date}": "Термін {date}", + "Could not change the status. Please try again.": "Не вдалося змінити статус. Спробуйте ще раз.", + "Completed today": "Завершено сьогодні", + "My open tasks": "Мої відкриті завдання", + "My overdue tasks": "Мої прострочені завдання", + "My tasks in progress": "Мої завдання в роботі", + "Pin to the top": "Закріпити вгорі", + "Unpin": "Відкріпити", + "Pinned": "Закріплено", + "Actions for {title}": "Дії для {title}", + "Could not save your project order. Please try again.": "Не вдалося зберегти порядок ваших проєктів. Спробуйте ще раз.", + "No boards yet": "Дошок ще немає", + "Create a project to get a board.": "Створіть проєкт, щоб отримати дошку.", + "Use the Projects page to create and manage your projects and tasks.": "Створюйте проєкти й завдання та керуйте ними на сторінці «Проєкти».", + "Go to projects": "До проєктів", + "You are not a member of any projects yet.": "Ви ще не учасник жодного проєкту.", + "Could not search for users. Please try again.": "Не вдалося знайти користувачів. Спробуйте ще раз.", + "Project creation is restricted to administrators.": "Створювати проєкти можуть лише адміністратори.", + "Only the project owner or an administrator can delete this project.": "Видалити цей проєкт може лише власник проєкту або адміністратор.", + "No projects are available to you yet. Ask an administrator to create one.": "Вам ще не доступний жоден проєкт. Попросіть адміністратора створити проєкт.", + "Due: {date}": "Термін: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Завдання з датою початку або терміном відображаються на часовій шкалі. Додайте дати, щоб побачити їх тут.", + "You do not have access to this project.": "У вас немає доступу до цього проєкту.", + "Zoom level": "Масштаб", + "Unscheduled": "Не заплановані", + "Start: {date}": "Початок: {date}", + "Today": "Сьогодні", + "No scheduled tasks": "Немає запланованих завдань", + "An unexpected error occurred.": "Сталася неочікувана помилка.", + "Column {number} name": "Назва стовпця {number}", + "Failed to save creation policy": "Не вдалося зберегти правило створення", + "All authenticated users": "Усі користувачі, що увійшли", + "Control who may create new projects": "Визначте, хто може створювати нові проєкти", + "Administrators only": "Лише адміністратори", + "Project creation": "Створення проєктів", + "Allow project creation": "Дозволити створення проєктів", + "Creation policy saved successfully": "Правило створення збережено", + "Initializing…": "Запуск…", + "e.g. 2h 30m, 90m, 1.5h": "напр. 2h 30m, 90m, 1.5h", + "Log time": "Облікувати час", + "Save estimate": "Зберегти оцінку", + "Logged: {logged}": "Обліковано: {logged}", + "over by {amount}": "перевищено на {amount}", + "Time tracking": "Облік часу", + "Estimate": "Оцінка", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Введіть коректну оцінку (напр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Введіть коректну тривалість (напр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Не вдалося зберегти запис часу. Спробуйте ще раз.", + "Edit time entry": "Змінити запис часу", + "Duration": "Тривалість", + "Date range": "Період", + "Last week": "Минулий тиждень", + "No time logged": "Час не обліковано", + "Log time on a task to see it here.": "Облікуйте час у завданні, щоб побачити його тут.", + "To date": "По дату", + "This week": "Цей тиждень", + "Total: {total}": "Разом: {total}", + "From date": "З дати", + "Custom range": "Власний період", + "All time": "За весь час", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Не вдалося видалити завдання, тому дані могли залишитися. Видаліть проєкт ще раз.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Не вдалося видалити запис часу, тому дані могли залишитися. Видаліть проєкт ще раз.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Не вдалося видалити стовпець, тому дані могли залишитися. Видаліть проєкт ще раз.", + "Could not delete the project. Please try again.": "Не вдалося видалити проєкт. Спробуйте ще раз.", + "Notification settings": "Налаштування сповіщень", + "Configure when due-date reminders are sent": "Визначте, коли надсилаються нагадування про терміни", + "Due-date reminder lead time (hours)": "Завчасність нагадування (години)", + "Lead time must be between 1 and 336 hours": "Завчасність має бути від 1 до 336 годин", + "Reminder lead time saved successfully": "Завчасність нагадування збережено", + "Failed to save reminder lead time": "Не вдалося зберегти завчасність нагадування", + "Notifications": "Сповіщення", + "Notify me 1 day before a task's due date": "Сповіщати мене за 1 день до терміну завдання", + "Draft": "Чернетка", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Чи є урок чернеткою, яку бачить лише його вчитель, чи відбудеться він, чи скасований.", + "New release": "Новий випуск", + "Roadmap chart. The same releases and epics are listed below.": "Діаграма дорожньої карти. Ті самі випуски та епіки наведено нижче.", + "Nothing on the roadmap yet": "На дорожній карті ще нічого немає", + "Releases with a target date and epics with dated tasks appear here.": "Тут з'являються випуски з цільовою датою та епіки із задачами, що мають дату.", + "Releases": "Випуски", + "No releases yet": "Ще немає випусків", + "Target date: {date}": "Цільова дата: {date}", + "No target date": "Без цільової дати", + "Edit {name}": "Редагувати {name}", + "Mark {name} as released": "Позначити {name} як випущений", + "Mark as released": "Позначити як випущений", + "Epics": "Епіки", + "No epics yet. Open a task to make it an epic.": "Ще немає епіків. Відкрийте задачу, щоб зробити її епіком.", + "Not scheduled yet": "Ще не заплановано", + "Planned": "Заплановано", + "Released": "Випущено", + "Edit release": "Редагувати випуск", + "Target date": "Цільова дата", + "Could not save the release. Please try again.": "Не вдалося зберегти випуск. Спробуйте ще раз.", + "Every task of this release is done or cancelled.": "Кожна задача цього випуску виконана або скасована.", + "Not finished yet: {count}": "Ще не завершено: {count}", + "What happens to these tasks?": "Що буде з цими задачами?", + "Move to {name}": "Перемістити до {name}", + "Remove the release": "Прибрати випуск", + "Keep it on {name}": "Залишити їх у {name}", + "Could not mark the release as released. Please try again.": "Не вдалося позначити випуск як випущений. Спробуйте ще раз.", + "Roadmap": "Дорожня карта", + "Tasks or roadmap": "Задачі або дорожня карта", + "Release": "Випуск", + "Epic": "Епік", + "This task is an epic": "Ця задача є епіком", + "A named, dated delivery of a project that its tasks are planned against.": "Іменована поставка проєкту з датою, під яку плануються його задачі.", + "Name of the release": "Назва випуску", + "The project this release belongs to": "Проєкт, до якого належить цей випуск", + "What this release delivers": "Що постачає цей випуск", + "When work on the release starts": "Коли починається робота над випуском", + "The date the release is due": "Дата, до якої випуск має бути готовий", + "Whether the release is planned, released or archived": "Чи випуск запланований, випущений чи архівований", + "Released on": "Випущено", + "When the release was marked as released": "Коли випуск позначили як випущений", + "The release this task is planned for": "Випуск, на який заплановано цю задачу", + "Board view options": "Параметри вигляду дошки", + "Colour cards": "Розфарбувати картки", + "No colour": "Без кольору", + "By label": "За міткою", + "Swimlanes": "Доріжки", + "No swimlanes": "Без доріжок", + "By assignee": "За виконавцем", + "By epic": "За епіком", + "No assignee": "Не призначено", + "No epic": "Без епіка", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Картки залишаються в рядку свого епіка. Змініть епік на сторінці завдання.", + "Hand over to": "Передати", + "Could not save your board view. It applies until you reload.": "Вигляд дошки не збережено. Він діє до перезавантаження.", + "Timetable wish": "Побажання до розкладу", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Побажання, яке враховує генератор. Жорстке побажання він дотримує завжди, м'яке, де може.", + "Whether the wish is about a teacher, a group, a room or one activity": "Чи стосується побажання вчителя, групи, приміщення чи одного заняття", + "Teacher": "Учитель", + "Group": "Група", + "Reference": "Посилання", + "The user, group, room or activity the wish is about": "Користувач, група, приміщення чи заняття, яких стосується побажання", + "What the wish asks for": "Чого просить побажання", + "Not on these periods": "Не в ці уроки", + "Preferably not on these periods": "Краще не в ці уроки", + "At most a number of lessons a day": "Не більше певної кількості уроків на день", + "No free periods between lessons": "Без вікон між уроками", + "Always the same room": "Завжди те саме приміщення", + "Periods": "Уроки", + "The periods of the week the wish is about, such as wed-5": "Уроки тижня, яких стосується побажання, наприклад wed-5", + "Limit": "Межа", + "The most lessons a day, for a wish of that kind": "Найбільша кількість уроків на день для побажання такого виду", + "Strength": "Сила", + "Whether the generator must keep the wish or should keep it": "Чи мусить генератор дотримати побажання, чи бажано", + "Hard": "Жорстке", + "Soft": "М'яке", + "Weight": "Вага", + "How much a soft wish counts, from 1 to 3": "Скільки важить м'яке побажання, від 1 до 3", + "Why the wish exists": "Навіщо існує побажання", + "Timetable scenario": "Сценарій розкладу", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Один тижневий шаблон, створений генератором або взятий з поточного розкладу. Він зберігає свої вхідні дані й те, наскільки добре дотримує побажань.", + "The name timetablers know the scenario by": "Назва, під якою укладачі знають сценарій", + "Whether the generator made it or it came from the current timetable": "Чи створив його генератор, чи він узятий з поточного розкладу", + "Generated": "Згенеровано", + "From the current timetable": "З поточного розкладу", + "Week of": "Тиждень з", + "The Monday of the first week of the window": "Понеділок першого тижня періоду", + "Window start": "Початок періоду", + "The first day the week pattern applies to": "Перший день, до якого застосовується тижневий шаблон", + "Window end": "Кінець періоду", + "The last day the week pattern applies to": "Останній день, до якого застосовується тижневий шаблон", + "Waiting, generating, done, failed, or published as draft lessons": "Очікує, створюється, готово, не вдалося або опубліковано як чернеткові уроки", + "Waiting": "Очікує", + "Generating": "Створюється", + "Failed": "Не вдалося", + "Published": "Опубліковано", + "Seed": "Початкове число", + "The number the generator starts from, so a run can be repeated": "Число, з якого починає генератор, щоб запуск можна було повторити", + "Input": "Вхідні дані", + "The periods, rooms, lessons and wishes the scenario was made from": "Уроки, приміщення, заняття й побажання, з яких зроблено сценарій", + "Placements": "Розміщення", + "Each lesson with the period and room it was given": "Кожне заняття з отриманими уроком і приміщенням", + "Unplaced lessons": "Нерозміщені заняття", + "Lessons without a place, each with the hard wish that blocked it": "Заняття без місця, кожне з жорстким побажанням, яке його зупинило", + "Broken wishes": "Порушені побажання", + "The wishes this scenario breaks, with the lessons that break them": "Побажання, які порушує цей сценарій, із заняттями, що їх порушують", + "Measures": "Показники", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Розміщені заняття, порушені побажання, вікна вчителів, уроки на день і використання приміщень", + "Reason": "Причина", + "Why the run failed": "Чому запуск не вдався", + "Published at": "Опубліковано", + "When the scenario was written out as draft lessons": "Коли сценарій записано як чернеткові уроки", + "Edit wish": "Змінити побажання", + "New wish": "Нове побажання", + "Hard: the generator always keeps it": "Обов'язкове: генератор завжди його дотримується", + "Soft: the generator keeps it where it can": "Гнучке: генератор дотримується його, де може", + "Weight (1 to 3)": "Вага (від 1 до 3)", + "Most lessons a day": "Не більше уроків на день", + "Period": "Урок", + "{day} period {number}": "{day} урок {number}", + "Teacher (user name)": "Учитель (ім'я користувача)", + "Activity (group:subject)": "Заняття (група:предмет)", + "Say who or what the wish is about.": "Вкажіть, кого чи чого стосується побажання.", + "Choose at least one period.": "Виберіть хоча б один урок.", + "The limit is a whole number of 1 or more.": "Ліміт: ціле число від 1.", + "Timetable": "Розклад", + "Wishes": "Побажання", + "Timetable wishes": "Побажання до розкладу", + "Generator run": "Запуск генератора", + "Generator progress": "Хід генератора", + "The run failed: {reason}": "Запуск не вдався: {reason}", + "{placed} of {lessons} lessons placed": "Розміщено {placed} з {lessons} уроків", + "Generate again": "Згенерувати знову", + "Generate": "Згенерувати", + "Every lesson has a place.": "Кожен урок має місце.", + "Lesson": "Урок", + "No free period and room": "Немає вільного уроку й кабінету", + "Broken soft wishes": "Порушені гнучкі побажання", + "Every soft wish is kept.": "Кожне гнучке побажання дотримано.", + "Wish": "Побажання", + "Lessons": "Уроки", + "Generating: {percent}% of the time budget used": "Генерування: використано {percent}% часу", + "Waiting to start": "Очікує запуску", + "Published as draft lessons": "Опубліковано як чернетки уроків", + "Could not read the scenario.": "Не вдалося прочитати сценарій.", + "Could not start the run.": "Не вдалося почати запуск.", + "Scenarios": "Сценарії", + "Timetable scenarios": "Сценарії розкладу", + "Scenario": "Сценарій", + "Take the current timetable": "Взяти поточний розклад", + "Could not take the current timetable.": "Не вдалося взяти поточний розклад.", + "Broken hard wishes": "Порушені обов'язкові побажання", + "Not on a period of the week grid": "Не на уроці тижневої сітки", + "Compare scenarios": "Порівняти сценарії", + "Scenarios to compare": "Сценарії для порівняння", + "Choose two or three scenarios to compare them.": "Виберіть два або три сценарії, щоб порівняти їх.", + "Measure": "Показник", + "Best": "Найкращий", + "Lessons that differ": "Уроки, що відрізняються", + "No lesson differs.": "Жоден урок не відрізняється.", + "Not placed": "Не розміщено", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Розміщені уроки", + "Lessons without a place": "Уроки без місця", + "Clashes": "Конфлікти", + "Hard wishes broken": "Порушені обов'язкові побажання", + "Soft wishes broken": "Порушені гнучкі побажання", + "Soft wishes broken, weighted": "Порушені гнучкі побажання, зважені", + "Free periods between lessons, all teachers": "Вікна, усі вчителі", + "Most free periods of one teacher": "Найбільше вікон в одного вчителя", + "Most lessons of one group on a day": "Найбільше уроків однієї групи за день", + "Room use": "Використання кабінетів", + "Publish as draft lessons": "Опублікувати як чернетки уроків", + "Draft lessons written: {count}": "Записано чернеток уроків: {count}", + "Could not publish the scenario.": "Не вдалося опублікувати сценарій.", + "Rules": "Правила", + "Rules for {column}": "Правила для {column}", + "When a card enters this column": "Коли картка потрапляє в цю колонку", + "Action": "Дія", + "Set the priority": "Встановити пріоритет", + "Assign to": "Призначити", + "Assign the person who moved the card": "Призначити того, хто перемістив картку", + "Remove the assignee": "Зняти виконавця", + "Add a label": "Додати мітку", + "No longer a project member": "Більше не учасник проєкту", + "This label no longer exists": "Цієї мітки більше немає", + "Add rule": "Додати правило", + "Remove rule": "Видалити правило", + "No rules yet. Add one to change a card when it enters this column.": "Правил поки немає. Додайте правило, щоб змінювати картку, коли вона потрапляє в цю колонку.", + "Could not save the rules. Please try again.": "Не вдалося зберегти правила. Спробуйте ще раз.", + "1 rule runs when a card enters this column": "1 правило спрацьовує, коли картка потрапляє в цю колонку", + "{count} rules run when a card enters this column": "Кількість правил, що спрацьовують, коли картка потрапляє в цю колонку: {count}", + "Rules applied: {changes}": "Застосовані правила: {changes}", + "assigned to {name}": "призначено: {name}", + "assignee removed": "виконавця знято", + "priority {priority}": "пріоритет {priority}", + "label {label}": "мітка {label}", + "What happens to a card when it enters this column, applied in list order.": "Що відбувається з карткою, коли вона потрапляє в цю колонку, у порядку списку.", + "Value": "Значення", + "What the rule does to the card.": "Що правило робить із карткою.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Пріоритет, id користувача або id мітки, які використовує дія; порожньо для дій без значення.", + "is not": "не", + "{dimension} is not": "{dimension} не", + "Saved filters": "Збережені фільтри", + "No saved filters yet": "Збережених фільтрів поки немає", + "Save filter": "Зберегти фільтр", + "Rename \"{name}\"": "Перейменувати «{name}»", + "Delete \"{name}\"": "Видалити «{name}»", + "Clear filters": "Скинути фільтри", + "Showing {shown} of {total} tasks": "Показано {shown} з {total} завдань", + "Me": "Я", + "No date": "Без дати", + "Rename saved filter": "Перейменувати збережений фільтр", + "Share with the project": "Поділитися з проєктом", + "Give the filter a name": "Дайте фільтру назву", + "Could not save the filter. Please try again.": "Не вдалося зберегти фільтр. Спробуйте ще раз.", + "Some labels in \"{name}\" no longer exist and were left out.": "Деяких міток із «{name}» більше немає, їх пропущено.", + "Could not delete the filter. Please try again.": "Не вдалося видалити фільтр. Спробуйте ще раз.", + "Saved filter": "Збережений фільтр", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Іменований фільтр дошки одного проєкту, особистий для того, хто його зберіг, якщо ним не поділилися з проєктом.", + "The project whose board the filter applies to": "Проєкт, до дошки якого належить фільтр", + "The name the filter is listed under": "Назва, під якою фільтр показано у списку", + "Saved by": "Зберіг(ла)", + "Nextcloud user id of the person who saved the filter": "Id користувача Nextcloud того, хто зберіг фільтр", + "Shared with the project": "Спільний із проєктом", + "Whether every project member sees and applies the filter": "Чи бачить кожен учасник проєкту фільтр і чи може його застосувати", + "Criteria": "Критерії", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Фільтр: виконавець, мітка, пріоритет і термін, кожен з є або не і значеннями", + "Cross-project view": "Міжпроєктне подання", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Збережений набір проєктів, завдання яких показано разом у колонках за статусом, із доступом для вказаних людей.", + "Shared with": "Надано доступ", + "The name the view is listed under": "Назва, під якою подання вказано в списку", + "Nextcloud user id of the person who saved the view": "Ідентифікатор користувача Nextcloud того, хто зберіг подання", + "Nextcloud user ids of the people the view is shared with": "Ідентифікатори користувачів Nextcloud тих, кому надано доступ до подання", + "The projects whose tasks the view shows, at most twenty": "Проєкти, завдання яких показує подання, не більше двадцяти", + "1 project in this view is hidden from you.": "1 проєкт у цьому поданні приховано від вас.", + "{count} projects in this view are hidden from you.": "Проєкти в цьому поданні, приховані від вас: {count}.", + "{project} has no column for {status}.": "Проєкт {project} не має колонки для статусу {status}.", + "This view does not exist or is not shared with you.": "Це подання не існує або вам не надано доступу.", + "\"{task}\" moved to {status}.": "\"{task}\" переміщено до {status}.", + "Project: {title}": "Проєкт: {title}", + "Cross-project views": "Міжпроєктні подання", + "New view": "Нове подання", + "Edit view": "Змінити подання", + "Delete view": "Видалити подання", + "Give the view a name": "Дайте поданню назву", + "Pick at least one project": "Виберіть принаймні один проєкт", + "A view shows at most {max} projects": "Подання показує не більше {max} проєктів", + "Could not save the view. Please try again.": "Не вдалося зберегти подання. Спробуйте ще раз.", + "Could not delete the view. Please try again.": "Не вдалося видалити подання. Спробуйте ще раз.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Видалити «{title}»? Проєкти та їхні завдання залишаться без змін.", + "People see the tasks of the projects they are in, never more.": "Кожен бачить лише завдання проєктів, у яких бере участь.", + "No views yet. A view shows the tasks of several of your projects together.": "Подань ще немає. Подання показує завдання кількох ваших проєктів разом.", + "Projects in view: {count}": "Проєктів у поданні: {count}", + "Notify me when a task is assigned to me": "Сповіщати мене, коли мені призначають завдання", + "Also send these to me by email": "Також надсилати їх мені поштою", + "Add an email address in your Nextcloud personal settings to get mail.": "Додайте адресу електронної пошти в особистих налаштуваннях Nextcloud, щоб отримувати листи.", + "Code link": "Посилання на код", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Коміт, гілка, запит на злиття або задача в сервісі коду, пов'язані із завданням.", + "The task the link belongs to": "Завдання, до якого належить посилання", + "The project of the task": "Проєкт завдання", + "Task key": "Ключ завдання", + "The task key the forge text named, such as VC-12": "Ключ завдання, вказаний у тексті сервісу коду, наприклад VC-12", + "What the link points at": "На що вказує посилання", + "Link": "Посилання", + "The address of the item in the forge": "Адреса елемента в сервісі коду", + "The commit message, branch name or merge request title": "Повідомлення коміту, назва гілки або заголовок запиту на злиття", + "Repository": "Репозиторій", + "The repository, such as acme/portal": "Репозиторій, наприклад acme/portal", + "Forge id": "Id у сервісі", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Власний id елемента в сервісі коду, наприклад github:acme/portal#42 або хеш коміту", + "State": "Стан", + "The state of a merge request or issue": "Стан запиту на злиття або задачі", + "Who made the commit or opened the merge request": "Хто зробив коміт або відкрив запит на злиття", + "When the commit was made or the merge request last changed": "Коли зроблено коміт або востаннє змінився запит на злиття", + "Added by": "Ким додано", + "Whether a person added the link or the integration wrote it": "Чи додала посилання людина, чи його записала інтеграція", + "Nextcloud user UIDs of project members": "ID користувачів Nextcloud учасників проєкту", + "Add link": "Додати посилання", + "Added by hand": "Додано вручну", + "Branch": "Гілка", + "Code": "Код", + "Commit": "Коміт", + "From the integration": "З інтеграції", + "Link to a commit, branch or merge request": "Посилання на коміт, гілку або запит на злиття", + "Merge request": "Запит на злиття", + "Merged": "Злито", + "No code linked yet. Name {key} in a commit message or paste a link.": "Код ще не прив'язано. Вкажіть {key} у повідомленні коміту або вставте посилання.", + "No code linked yet. Paste a link to a commit or merge request.": "Код ще не прив'язано. Вставте посилання на коміт або запит на злиття.", + "Paste a web address that starts with https://.": "Вставте вебадресу, що починається з https://.", + "Remove link {title}": "Вилучити посилання {title}", + "The link could not be added.": "Не вдалося додати посилання.", + "The link could not be removed.": "Не вдалося вилучити посилання.", + "This link is already on the task.": "Це посилання вже є в завданні.", + "Code forges": "Сервіси коду", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Пов'язуйте коміти та pull request з GitHub із завданнями. Integriq отримує події; planninq ніколи не звертається до GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Завантажте конфігурацію та імпортуйте її в Integriq. Потім вкажіть секрет у правилі \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "У GitHub додайте до репозиторію webhook з цією адресою і тим самим секретом. Виберіть тип вмісту application/json та події push і pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Вкажіть ключ завдання, наприклад VC-12, у повідомленні коміту, назві гілки або заголовку pull request. Посилання тоді з'явиться в цьому завданні.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq учасники проєкту все одно можуть вставити посилання на сторінці завдання.", + "Download the Integriq configuration": "Завантажити конфігурацію Integriq", + "Calendar": "Календар", + "Previous": "Назад", + "Calendar view": "Вигляд календаря", + "Starts:": "Початок:", + "No tasks with a date in this month.": "Цього місяця немає завдань із датою.", + "Week of {start} to {end}": "Тиждень з {start} по {end}", + "My calendar": "Мій календар", + "Show as list": "Показати списком", + "Show as calendar": "Показати в календарі", + "Open my calendar": "Відкрити мій календар", + "Nextcloud Tasks": "Завдання Nextcloud", + "Show my tasks in Nextcloud Tasks": "Показувати мої завдання в Завданнях Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Завдання, призначені вам або надані вам, з'являються у списку \"Planninq\" у Завданнях і Календарі Nextcloud. Зміни, зроблені там, замінюються під час наступної зміни в Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Цей сервер не може записувати до Завдань Nextcloud, тому експорт недоступний.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Керується Planninq. Зміни, зроблені тут, замінюються під час наступної зміни в Planninq.", + "Working days and holidays": "Робочі та святкові дні", + "Dates set on the timeline skip the days that are not working days.": "Дати, задані на часовій шкалі, пропускають неробочі дні.", + "Working weekdays": "Робочі дні тижня", + "Non-working days": "Неробочі дні", + "No non-working days yet.": "Неробочих днів ще немає.", + "Add day": "Додати день", + "Year": "Рік", + "Add Dutch national holidays": "Додати державні свята Нідерландів", + "Save working days": "Зберегти робочі дні", + "Choose at least one working weekday.": "Виберіть хоча б один робочий день.", + "Working days saved.": "Робочі дні збережено.", + "Could not save the working days.": "Не вдалося зберегти робочі дні.", + "New Year's Day": "Новий рік", + "Easter Sunday": "Великдень", + "Easter Monday": "Великодній понеділок", + "King's Day": "День короля", + "Liberation Day": "День визволення", + "Ascension Day": "Вознесіння", + "Whit Sunday": "Трійця", + "Whit Monday": "Духів день", + "Christmas Day": "Різдво", + "Boxing Day": "Другий день Різдва", + "Dates of {title}": "Дати завдання {title}", + "The due date cannot be before the start date.": "Термін не може бути раніше дати початку.", + "{title}, from {start} to {end}": "{title}, з {start} по {end}", + "The dates could not be saved.": "Не вдалося зберегти дати.", + "{title} now runs from {start} to {end}": "{title} тепер триває з {start} по {end}", + "Auto-scheduling": "Автоматичне планування", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Якщо ввімкнено, перенесення терміну на часовій шкалі пізніше пропонує зсунути й заблоковані ним завдання.", + "Move blocked tasks along when a task slips": "Зсувати заблоковані завдання, коли завдання затримується", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На часовій шкалі пізніший термін пропонує зсунути заблоковані завдання. Враховуються лише зв'язки \"блокує\", і завдання зсуваються лише пізніше.", + "Move the tasks that wait for {title}?": "Зсунути завдання, які чекають {title}?", + "These tasks wait for it and would start after its new due date:": "Ці завдання чекають на нього й почнуться після нового терміну:", + "{count} tasks would move; the first {limit} are listed.": "Буде зсунуто завдань: {count}; показано перші {limit}.", + "Now": "Зараз", + "After the move": "Після зсуву", + "Only this task": "Лише це завдання", + "Move all": "Зсунути всі", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Зупинено на {title}: не вдалося зберегти дати. Завдання перед ним зсунуто.", + "Cumulative flow": "Накопичувальний потік", + "Show as chart": "Показати як діаграму", + "Show as table": "Показати як таблицю", + "Tasks per column per day": "Завдання за стовпцями за днями", + "Tasks without recorded history in this period: {count}": "Завдання без записаної історії за цей період: {count}", + "Lead and cycle time": "Час виконання і час циклу", + "No tasks were finished in this period.": "За цей період не завершено жодного завдання.", + "Finished tasks": "Завершені завдання", + "Cycle time, average": "Час циклу, середній", + "Cycle time, 85th percentile": "Час циклу, 85-й процентиль", + "Lead time, average": "Час виконання, середній", + "Tasks whose finish time was estimated from their history: {count}": "Завдання, час завершення яких оцінено з історії: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Час циклу кожного завершеного завдання із середнім і 85-м процентилем", + "Slowest tasks": "Найповільніші завдання", + "cycle {cycle}, lead {lead}": "цикл {cycle}, виконання {lead}", + "{days} days": "{days} дн.", + "Could not load the flow of this project.": "Не вдалося завантажити потік цього проєкту.", + "Last {days} days": "Останні {days} дн.", + "Portfolio flow": "Потік портфеля", + "An admin adds portfolios under Projects, Portfolios.": "Адміністратор додає портфелі в розділі Проєкти, Портфелі.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Непоказані проєкти, бо одночасно показується не більше 50: {count}", + "Could not load the flow of this portfolio.": "Не вдалося завантажити потік цього портфеля.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Накопичувальний потік і час циклу за проєктами портфеля.", + "Edit report": "Змінити звіт", + "Only tasks where": "Лише завдання, де", + "Group by": "Групувати за", + "Display": "Вигляд", + "Share with everyone who can read its projects": "Поділитися з усіма, хто може читати його проєкти", + "The report could not be saved.": "Не вдалося зберегти звіт.", + "Number of tasks": "Кількість завдань", + "Bar": "Стовпці", + "Donut": "Кільце", + "Table": "Таблиця", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} з {total} проєктів у цьому звіті вам не видно", + "No tasks match this report.": "Жодне завдання не відповідає цьому звіту.", + "None": "Немає", + "Could not load this report.": "Не вдалося завантажити цей звіт.", + "Report": "Звіт", + "Your reports": "Ваші звіти", + "My reports": "Мої звіти", + "Shared reports": "Спільні звіти", + "You have not built a report yet.": "Ви ще не створили жодного звіту.", + "Nobody has shared a report with you yet.": "З вами ще ніхто не поділився звітом.", + "Reports you built over tasks, and the ones shared with you.": "Звіти, які ви створили за завданнями, і ті, якими поділилися з вами.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Збережений запит за завданнями: які проєкти, які фільтри, групування за чим, кількість або сума, у вигляді таблиці чи діаграми.", + "The name the report is listed under": "Назва, під якою звіт показано у списку", + "What the report shows and who it is for": "Що показує звіт і для кого він", + "Nextcloud user id of the person who saved the report": "Ідентифікатор користувача Nextcloud, який зберіг звіт", + "Who can open the report": "Хто може відкрити звіт", + "Only me": "Лише я", + "Everyone who can read its projects": "Усі, хто може читати його проєкти", + "The projects the report covers, at most fifty": "Проєкти, які охоплює звіт, не більше п'ятдесяти", + "Filters": "Фільтри", + "Task fields and the value each must equal": "Поля завдання і значення, якому має дорівнювати кожне", + "The task field the report groups on": "Поле завдання, за яким групує звіт", + "Count the tasks, or add up a number on them": "Порахувати завдання або додати число за ними", + "Sum": "Сума", + "Sum of": "Сума за", + "The number added up when the measure is a sum": "Число, яке додається, коли міра це сума", + "Story points": "Бали історій", + "Estimated duration": "Орієнтовна тривалість", + "How the report is shown": "Як показується звіт", + "Issue type": "Тип завдання", + "Task fields and the value each must equal; empty when the report covers every task": "Поля завдання і значення, якому має відповідати кожне; порожньо, якщо звіт охоплює всі завдання", + "The status a task must have": "Статус, який має мати завдання", + "The priority a task must have": "Пріоритет, який має мати завдання", + "The user a task must be assigned to": "Користувач, якому має бути призначене завдання", + "A label a task must carry": "Мітка, яку має мати завдання", + "The board column a task must be in": "Стовпець дошки, у якому має бути завдання", + "The issue type a task must have": "Тип, який має мати завдання", + "Manager groups": "Групи керівників", + "Member groups": "Групи учасників", + "Viewer groups": "Групи читачів", + "Viewers": "Читачі", + "Owning group": "Група-власник", + "Nextcloud groups whose members manage the project": "Групи Nextcloud, учасники яких керують проєктом", + "Nextcloud groups whose members work on the project": "Групи Nextcloud, учасники яких працюють над проєктом", + "Nextcloud groups whose members may read the project": "Групи Nextcloud, учасники яких можуть читати проєкт", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Користувачі Nextcloud, які керують проєктом: налаштуваннями, учасниками й роботою", + "Nextcloud user ids who may read the project and its work but not change it": "Користувачі Nextcloud, які можуть читати проєкт і його роботу, але не змінювати", + "The Nextcloud group that owns the project with its creator, at most one": "Група Nextcloud, що володіє проєктом разом з його автором, не більше однієї", + "Nextcloud user ids who may read this through the project": "Користувачі Nextcloud, які можуть читати це через проєкт", + "Nextcloud groups whose members may change this through the project": "Групи Nextcloud, учасники яких можуть змінювати це через проєкт", + "Nextcloud groups whose members may read this through the project": "Групи Nextcloud, учасники яких можуть читати це через проєкт", + "Search for a person or a group…": "Знайти особу або групу…", + "No one found. Your admin's sharing settings decide who you can find.": "Нікого не знайдено. Кого ви можете знайти, визначають налаштування спільного доступу вашого адміністратора.", + "Type at least two characters": "Введіть щонайменше два символи", + "Everyone in this group": "Усі в цій групі", + "Could not search for people. Please try again.": "Не вдалося знайти людей. Спробуйте ще раз.", + "Could not remove the group": "Не вдалося вилучити групу", + "Only the owner and managers change who is on this project.": "Лише власник і керівники змінюють склад цього проєкту.", + "Role of {name}": "Роль: {name}", + "Manager": "Керівник", + "Member": "Учасник", + "Viewer": "Читач", + "Could not change the role": "Не вдалося змінити роль", + "Owned by group: {name}": "Належить групі: {name}", + "No group owns this project.": "Цей проєкт не належить жодній групі.", + "Owned by group": "Належить групі", + "Search for a group…": "Знайти групу…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Групу не знайдено. Налаштування спільного доступу вашого адміністратора визначають, які групи ви можете знайти.", + "No owning group": "Без групи-власника", + "Could not search for groups. Please try again.": "Не вдалося знайти групи. Спробуйте ще раз.", + "Could not change the owning group": "Не вдалося змінити групу-власника", + "You can read this project. Only its members change it.": "Ви можете читати цей проєкт. Змінюють його лише його учасники.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, який викладають на цьому уроці, наприклад вибірковий предмет, якщо шкільний навчальний застосунок його знає.", + "Online meeting link": "Посилання на онлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Де учні приєднуються до цього уроку онлайн. Кнопка «Приєднатися» з'являється лише для посилання https." }, "nplurals=2; plural=(n != 1);" ) diff --git a/l10n/uk.json b/l10n/uk.json index 6b1ef65d..ccfa32bd 100644 --- a/l10n/uk.json +++ b/l10n/uk.json @@ -199,7 +199,1167 @@ "Could not delete label": "Could not delete label", "Delete label \"{title}\"? It will be removed from {count} task.": "Delete label \"{title}\"? It will be removed from {count} task.", "Label deleted and removed from {count} task": "Label deleted and removed from {count} task", - "used by {count} task": "used by {count} task" + "used by {count} task": "used by {count} task", + "Active projects": "Активні проєкти", + "Archived projects": "Архівовані проєкти", + "Boards": "Дошки", + "My projects": "Мої проєкти", + "Portfolio": "Портфель", + "Project board": "Дошка проєкту", + "Projects I am in": "Проєкти, у яких я беру участь", + "Timeline": "Часова шкала", + "Timesheet": "Облік часу", + "Features & roadmap": "Функції та дорожня карта", + "Flow": "Потік", + "Flows": "Потоки", + "Reports": "Звіти", + "Pick a report to open it.": "Виберіть звіт, щоб відкрити його.", + "In progress": "У роботі", + "Date": "Дата", + "Due": "Термін", + "Assignee": "Призначено", + "Who": "Хто", + "What": "Що", + "Minutes": "Хвилини", + "Entries": "Записи", + "Most recent": "Найновіші", + "Per person": "На особу", + "By status": "За статусом", + "By priority": "За пріоритетом", + "Task status": "Статус завдань", + "Time spent": "Витрачений час", + "Capacity": "Потужність", + "Due soonest": "Найближчий термін", + "Minutes logged": "Записані хвилини", + "Nothing is due": "Немає нічого запланованого", + "Nothing logged yet": "Ще нічого не записано", + "What is open, what is blocked, and what is overdue.": "Що відкрито, що заблоковано і що прострочено.", + "How allocation is spread across the people working on projects.": "Як розподілено навантаження між людьми, що працюють над проєктами.", + "Hours logged, and the projects they went to.": "Записані години та проєкти, на які вони пішли.", + "Billable": "Оплачуване", + "Budget: {amount}": "Бюджет: {amount}", + "Loading projects": "Завантаження проєктів", + "No projects for this client yet": "Для цього клієнта ще немає проєктів", + "Open in Planninq": "Відкрити в Planninq", + "This project could not be found": "Цей проєкт не знайдено", + "Untitled project": "Проєкт без назви", + "and {count} more": "і ще {count}", + "Store": "Магазин", + "Install planning configurations that other organisations have published: a project template, a set of stages, or the flows behind them.": "Встановлюйте реєстри, схеми та потоки, опубліковані іншими організаціями.", + "Work Date": "Дата роботи", + "Zaak UUID": "Zaak UUID", + "Timetable session": "Timetable session", + "Source id": "Source id", + "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one.", + "Source": "Source", + "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "Subject": "Subject", + "The subject as the school names it.": "The subject as the school names it.", + "The name shown for this lesson. Left empty, the subject is shown.": "The name shown for this lesson. Left empty, the subject is shown.", + "Starts at": "Starts at", + "When the lesson starts.": "When the lesson starts.", + "Ends at": "Ends at", + "When the lesson ends.": "When the lesson ends.", + "Group code": "Group code", + "The code the school uses for the group or class.": "The code the school uses for the group or class.", + "Cohort": "Cohort", + "The cohort this lesson is for, when the school code is linked to one.": "The cohort this lesson is for, when the school code is linked to one.", + "Teacher code": "Teacher code", + "The code the school uses for the teacher.": "The code the school uses for the teacher.", + "Teacher account": "Teacher account", + "The Nextcloud account of the teacher, when the teacher code is linked to one.": "The Nextcloud account of the teacher, when the teacher code is linked to one.", + "Room code": "Room code", + "The code the school uses for the room.": "The code the school uses for the room.", + "Room": "Room", + "The room name shown with the lesson.": "The room name shown with the lesson.", + "Whether the lesson goes ahead or is cancelled.": "Whether the lesson goes ahead or is cancelled.", + "Scheduled": "Scheduled", + "Imported at": "Imported at", + "When this lesson was last delivered. Set by planninq.": "When this lesson was last delivered. Set by planninq.", + "Column actions": "Дії зі стовпцем", + "Columns": "Стовпці", + "Could not remove the column. Please try again.": "Не вдалося видалити стовпець. Спробуйте ще раз.", + "Could not save the column. Please try again.": "Не вдалося зберегти стовпець. Спробуйте ще раз.", + "Done column": "Стовпець виконаних", + "Edit column": "Редагувати стовпець", + "Keep the card's status": "Зберегти статус картки", + "Move its cards to": "Перемістити його картки до", + "Move left": "Перемістити ліворуч", + "Move right": "Перемістити праворуч", + "Status of cards moved here": "Статус карток, переміщених сюди", + "The last done column cannot be removed.": "Останній стовпець виконаних не можна видалити.", + "WIP limit": "Ліміт WIP", + "over limit": "понад ліміт", + "The status a card gets when it is moved into this column.": "Статус, який отримує картка, коли її переміщують у цей стовпець.", + "All priorities": "Усі пріоритети", + "Could not create the task. Please try again.": "Не вдалося створити завдання. Спробуйте ще раз.", + "Created": "Створено", + "Move to backlog": "До беклогу", + "Move to board": "На дошку", + "New task": "Нове завдання", + "Nothing in the backlog": "У беклозі нічого немає", + "Rank": "Ранг", + "Sort by": "Сортувати за", + "Sort by rank to reorder": "Сортуйте за рангом, щоб змінити порядок", + "Task actions": "Дії із завданням", + "All labels": "Усі мітки", + "Filter tasks by label": "Фільтрувати завдання за міткою", + "View timeline": "Переглянути часову шкалу", + "Board": "Дошка", + "List": "Список", + "Column": "Стовпець", + "Board or list": "Дошка або список", + "Log": "Журнал", + "Add entry": "Додати запис", + "Show": "Показати", + "No actions yet": "Дій ще немає", + "Closed": "Закрито", + "Entry actions": "Дії із записом", + "Add action": "Додати дію", + "by {author}": "автор {author}", + "saved {time}": "збережено {time}", + "Attendees: {names}": "Присутні: {names}", + "Add the first entry": "Додати перший запис", + "Issues": "Проблеми", + "Lessons learned": "Засвоєні уроки", + "Meetings": "Зустрічі", + "Decisions": "Рішення", + "Actions": "Дії", + "Issue": "Проблема", + "Lesson learned": "Засвоєний урок", + "Meeting": "Зустріч", + "Decision": "Рішення", + "About this project": "Про цей проєкт", + "No description yet": "Опису ще немає", + "Start date": "Дата початку", + "Not set": "Не встановлено", + "End date": "Дата завершення", + "Progress": "Поступ", + "No tasks yet": "Завдань ще немає", + "Open the board": "Відкрити дошку", + "People": "Люди", + "Owner": "Власник", + "Latest log entries": "Останні записи", + "Open the log": "Відкрити журнал", + "{done} of {total} tasks done": "Виконано {done} з {total} завдань", + "Edit entry": "Редагувати запис", + "Type": "Вид", + "Attendees": "Присутні", + "Issue is closed": "Проблему закрито", + "Could not save the entry. Please try again.": "Не вдалося зберегти запис. Спробуйте ще раз.", + "From: {title}": "З: {title}", + "What needs to happen": "Що треба зробити", + "Could not create the action. Please try again.": "Не вдалося створити дію. Спробуйте ще раз.", + "The action was created but could not be linked to the entry.": "Дію створено, але не вдалося пов'язати її із записом.", + "Project pages": "Сторінки проєкту", + "Overview": "Огляд", + "Risks": "Ризики", + "Log entry": "Запис журналу", + "A short name for the entry": "Коротка назва запису", + "Project": "Проєкт", + "The project this entry belongs to": "Проєкт, до якого належить цей запис", + "What kind of entry this is": "Який це вид запису", + "When it happened": "Коли це сталося", + "What happened, in Markdown": "Що сталося, у Markdown", + "Whether an issue is still open": "Чи проблема ще відкрита", + "The people at a meeting": "Люди на зустрічі", + "Tasks that came out of this entry": "Завдання, що виникли з цього запису", + "Add risk": "Додати ризик", + "Risk": "Ризик", + "Score": "Оцінка", + "Response": "Реагування", + "Review date": "Дата перегляду", + "no longer on the project": "більше не в проєкті", + "Edit {title}": "Редагувати {title}", + "No risks recorded yet": "Ризиків ще не записано", + "Add the first risk": "Додати перший ризик", + "Medium": "Середній", + "Mitigating": "Пом'якшується", + "Occurred": "Настав", + "Avoid": "Уникнути", + "Reduce": "Зменшити", + "Transfer": "Передати", + "Accept": "Прийняти", + "Highest open risks": "Найвищі відкриті ризики", + "No open risks": "Немає відкритих ризиків", + "Open the risk register": "Відкрити реєстр ризиків", + "Edit risk": "Редагувати ризик", + "What could go wrong": "Що може піти не так", + "Likelihood": "Імовірність", + "Impact": "Вплив", + "Score {score}": "Оцінка {score}", + "Countermeasures": "Контрзаходи", + "Could not save the risk. Please try again.": "Не вдалося зберегти ризик. Спробуйте ще раз.", + "Risks by likelihood and impact": "Ризики за ймовірністю та впливом", + "Risk scale": "Шкала ризиків", + "The levels every project scores its risks on, and where low turns into medium and high": "Рівні, за якими кожен проєкт оцінює свої ризики, і де низький переходить у середній та високий", + "Number of levels": "Кількість рівнів", + "Likelihood labels": "Назви ймовірності", + "Impact labels": "Назви впливу", + "Level {level}": "Рівень {level}", + "Medium from score": "Середній від оцінки", + "High from score": "Високий від оцінки", + "Risk scale saved": "Шкалу ризиків збережено", + "1 risk uses level {level}. Change it first.": "1 ризик використовує рівень {level}. Спершу змініть його.", + "{count} risks use level {level}. Change them first.": "Ризиків на рівні {level}: {count}. Спершу змініть їх.", + "Every level needs a label, and high must start above medium.": "Кожен рівень потребує назви, а високий має починатися вище за середній.", + "The project this risk belongs to": "Проєкт, до якого належить цей ризик", + "The cause and the effect, in Markdown": "Причина й наслідок, у Markdown", + "Category": "Категорія", + "A free grouping, such as planning, budget or supplier": "Вільне групування, наприклад планування, бюджет чи постачальник", + "How likely it is, on the admin's risk scale": "Наскільки це ймовірно, за шкалою ризиків адміністратора", + "How hard it would hit, on the admin's risk scale": "Наскільки сильно це вдарить, за шкалою ризиків адміністратора", + "Likelihood times impact, calculated by the server": "Імовірність помножена на вплив, обчислює сервер", + "Where the risk stands": "На якому етапі ризик", + "The person who watches this risk": "Людина, яка стежить за цим ризиком", + "How the project answers the risk": "Як проєкт реагує на ризик", + "What is done to prevent it or soften it, in Markdown": "Що робиться, щоб запобігти йому чи пом'якшити, у Markdown", + "When to look at this risk again": "Коли знову переглянути цей ризик", + "Very low": "Дуже низький", + "Very high": "Дуже високий", + "All projects": "Усі проєкти", + "Project status report": "Звіт про стан проєкту", + "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.": "Датований звіт про те, як проєкт стоїть щодо грошей, організації, часу, інформації, якості та ризику (аспекти GROTIK), кожен із приміткою.", + "The project this report is about": "Проєкт, якого стосується звіт", + "Report date": "Дата звіту", + "The day the report describes": "День, який описує звіт", + "Money": "Гроші", + "How the project stands on this aspect": "Як проєкт стоїть щодо цього аспекту", + "On track": "За планом", + "At risk": "Під загрозою", + "Off track": "Поза планом", + "Money note": "Примітка про гроші", + "A short explanation of this status": "Коротке пояснення цього стану", + "Organisation": "Організація", + "Organisation note": "Примітка про організацію", + "Time": "Час", + "Time note": "Примітка про час", + "Information": "Інформація", + "Information note": "Примітка про інформацію", + "Quality": "Якість", + "Quality note": "Примітка про якість", + "Risk note": "Примітка про ризик", + "Overall": "Загалом", + "The worst of the six statuses, calculated by the server": "Найгірший із шести станів, обчислюється сервером", + "Health: money": "Стан: гроші", + "Copied from the newest status report": "Скопійовано з найновішого звіту про стан", + "Health: organisation": "Стан: організація", + "Health: time": "Стан: час", + "Health: information": "Стан: інформація", + "Health: quality": "Стан: якість", + "Health: risk": "Стан: ризик", + "Health: overall": "Стан: загалом", + "Health: report date": "Стан: дата звіту", + "The date of the newest status report": "Дата найновішого звіту про стан", + "New report": "Новий звіт", + "Only the project owner writes status reports.": "Звіти про стан пише лише власник проєкту.", + "Latest report, {date}": "Останній звіт, {date}", + "Aspect": "Аспект", + "Note": "Примітка", + "Report history": "Історія звітів", + "Author": "Автор", + "No status reports yet": "Звітів про стан ще немає", + "Write the first report": "Написати перший звіт", + "Choose a status for every aspect to save the report.": "Виберіть стан для кожного аспекту, щоб зберегти звіт.", + "Suggested: on track.": "Пропозиція: за планом.", + "Suggested: at risk.": "Пропозиція: під загрозою.", + "Suggested: off track.": "Пропозиція: поза планом.", + "1 task is past its due date.": "1 завдання прострочене.", + "{count} tasks are past their due date.": "Прострочених завдань: {count}.", + "The end date has passed with 1 open task.": "Дата завершення минула, відкрите 1 завдання.", + "The end date has passed with {count} open tasks.": "Дата завершення минула, відкритих завдань: {count}.", + "No open task is past its due date.": "Жодне відкрите завдання не прострочене.", + "The highest open risk, \"{title}\", scores {score}.": "Найвищий відкритий ризик, «{title}», має оцінку {score}.", + "There are no open risks.": "Відкритих ризиків немає.", + "Costs are at {percent}% of the budget.": "Витрати становлять {percent}% бюджету.", + "No suggestion: the project has no budget.": "Немає пропозиції: у проєкту немає бюджету.", + "No suggestion: no costs are recorded for this project yet.": "Немає пропозиції: для цього проєкту ще не обліковано витрат.", + "The report was not saved. Only the project owner can write status reports.": "Звіт не збережено. Звіти про стан може писати лише власник проєкту.", + "No report": "Немає звіту", + "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.": "Група проєктів, якими керують ті самі люди, наприклад відділ або програма. Її керівники читають кожен проєкт у ній.", + "The name of the portfolio": "Назва портфеля", + "What the portfolio holds and who runs it": "Що входить до портфеля і хто ним керує", + "A colour for the portfolio's section in project lists": "Колір розділу портфеля у списках проєктів", + "Managers": "Керівники", + "Nextcloud user UIDs of the people who run the portfolio": "Ідентифікатори користувачів Nextcloud, які керують портфелем", + "Order": "Порядок", + "Where the portfolio comes in project lists, lowest first": "Місце портфеля у списках проєктів, спершу найменший", + "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale.": "Власна шкала ризиків цього портфеля у форматі JSON, у тій самій формі, що й шкала всього застосунку. Порожньо означає шкалу застосунку.", + "Portfolio readers": "Читачі портфеля", + "Nextcloud user UIDs of the managers of the project's portfolio": "Ідентифікатори користувачів Nextcloud керівників портфеля проєкту", + "The portfolio this project belongs to": "Портфель, до якого належить проєкт", + "No portfolio": "Без портфеля", + "All portfolios": "Усі портфелі", + "You read this project as a manager of its portfolio. Only its members change it.": "Ви читаєте цей проєкт як керівник його портфеля. Змінюють його лише учасники.", + "Portfolios": "Портфелі", + "Portfolio status": "Стан портфеля", + "No portfolios yet": "Портфелів ще немає", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are listed here with their status.": "Адміністратор додає портфелі в розділі Проєкти, Портфелі. Проєкти портфеля наведено тут з їхнім станом.", + "Roll-up": "Зведення", + "{onTrack} on track, {atRisk} at risk, {offTrack} off track, {noReport} no report": "{onTrack} за планом, {atRisk} під загрозою, {offTrack} поза планом, {noReport} без звіту", + "No project in this portfolio that you can read.": "У цьому портфелі немає проєкту, який ви можете читати.", + "Start": "Початок", + "End": "Кінець", + "Budget": "Бюджет", + "Last report": "Останній звіт", + "Out of date": "Застарів", + "Portfolio timeline": "Часова шкала портфеля", + "Zoom": "Масштаб", + "Could not load the timeline": "Не вдалося завантажити часову шкалу", + "An admin adds portfolios under Projects, Portfolios. Projects in a portfolio are shown here on one timeline.": "Адміністратор додає портфелі в розділі Проєкти, Портфелі. Проєкти портфеля показано тут на одній часовій шкалі.", + "Open a project to see its phases and tasks. The timeline is read-only.": "Відкрийте проєкт, щоб побачити його фази та завдання. Часова шкала лише для читання.", + "Phase: {title}": "Фаза: {title}", + "Left out because you cannot read them: {count} projects": "Пропущено, бо ви не можете їх читати: {count} проєктів", + "Week": "Тиждень", + "Day": "День", + "Month": "Місяць", + "Please try again later.": "Спробуйте пізніше.", + "Status reports": "Звіти про стан", + "After how many days a project's latest status report is marked out of date on the portfolio overview": "Через скільки днів останній звіт про стан проєкту позначається як застарілий в огляді портфеля", + "Reporting period (days)": "Звітний період (дні)", + "The reporting period is a whole number of days from 1 to 365.": "Звітний період — ціле число днів від 1 до 365.", + "Reporting period saved": "Звітний період збережено", + "The reporting period was not saved. Please try again.": "Звітний період не збережено. Спробуйте ще раз.", + "Every project of a portfolio with its status per aspect, rolled up.": "Кожен проєкт портфеля зі станом за аспектами, зведено.", + "The projects of a portfolio on one timeline.": "Проєкти портфеля на одній часовій шкалі.", + "Phases": "Фази", + "Add phase": "Додати фазу", + "No phases yet": "Фаз ще немає", + "Break the project into phases, such as initiation, definition and delivery. A phase closes once its concluding document is uploaded.": "Поділіть проєкт на фази, наприклад ініціація, визначення та реалізація. Фаза закривається, коли завантажено її підсумковий документ.", + "{hours} hours": "{hours} год", + "Concluding document: {title}": "Підсумковий документ: {title}", + "Concluding document missing": "Бракує підсумкового документа", + "Move {title} up": "Перемістити {title} вгору", + "Move {title} down": "Перемістити {title} вниз", + "Close phase": "Закрити фазу", + "Phase": "Фаза", + "Files": "Файли", + "Notes": "Нотатки", + "Audit trail": "Журнал аудиту", + "Edit phase": "Редагувати фазу", + "Name": "Назва", + "Budget hours": "Години за бюджетом", + "Could not save the phase. Please try again.": "Не вдалося зберегти фазу. Спробуйте ще раз.", + "Close phase {title}": "Закрити фазу {title}", + "A phase closes with its concluding document: upload it here or pick one of the phase's files.": "Фаза закривається підсумковим документом: завантажте його тут або виберіть один із файлів фази.", + "Concluding document": "Підсумковий документ", + "This phase has no files yet.": "У цієї фази ще немає файлів.", + "Upload a document": "Завантажити документ", + "The document was not uploaded. Please try again.": "Документ не завантажено. Спробуйте ще раз.", + "Upload the concluding document before you close this phase.": "Завантажте підсумковий документ, перш ніж закрити цю фазу.", + "This phase cannot be closed from its current status.": "Цю фазу не можна закрити з її поточного статусу.", + "The phase was not closed. Please try again.": "Фазу не закрито. Спробуйте ще раз.", + "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.": "ID файлу цієї фази, який її закриває. Фазу можна завершити лише тоді, коли його вказано і файл прикріплено.", + "Import from Microsoft Project": "Імпорт з Microsoft Project", + "Choose a plan saved from Microsoft Project in its XML format. Nothing is imported until you confirm.": "Виберіть план, збережений з Microsoft Project у форматі XML. Нічого не імпортується, доки ви не підтвердите.", + "Plan file": "Файл плану", + "What the import creates": "Що створить імпорт", + "Tasks": "Завдання", + "Sub-tasks": "Підзавдання", + "Milestones": "Віхи", + "Links": "Зв'язки", + "Already imported, updated in place: {count}": "Вже імпортовані, оновлені на місці: {count}", + "What does not carry over": "Що не переноситься", + "Tasks with resources, which are not imported: {count}": "Завдання з ресурсами, які не імпортуються: {count}", + "Tasks deeper than level 3, placed under their level-2 task: {count}": "Завдання глибше рівня 3, розміщені під своїм завданням рівня 2: {count}", + "Links other than finish-to-start, imported as related links: {count}": "Зв'язки, відмінні від закінчення-початок, імпортовані як пов'язані: {count}", + "Link lags, which are dropped: {count}": "Затримки зв'язків, які відкидаються: {count}", + "Links to a summary task, which are not imported: {count}": "Зв'язки з підсумковим завданням, які не імпортуються: {count}", + "Links to tasks outside this plan, which are not imported: {count}": "Зв'язки із завданнями поза цим планом, які не імпортуються: {count}", + "No longer in the plan": "Більше немає в плані", + "These stay in the project; remove them yourself if they are no longer needed.": "Вони залишаються в проєкті; видаліть їх самі, якщо вони більше не потрібні.", + "Import": "Імпортувати", + "Close": "Закрити", + "The plan is imported: {created} created, {updated} updated.": "План імпортовано: створено {created}, оновлено {updated}.", + "Links that would close a loop were left out: {count}": "Зв'язки, які замкнули б цикл, пропущено: {count}", + "The import stopped part-way. Run it again to finish it.": "Імпорт зупинився на півдорозі. Запустіть його знову, щоб завершити.", + "Save the plan in Microsoft Project with File, Save as, XML format, and import that file.": "Збережіть план у Microsoft Project через Файл, Зберегти як, формат XML, та імпортуйте цей файл.", + "This file declares a DOCTYPE or entities, which are not accepted.": "Цей файл оголошує DOCTYPE або сутності, які не приймаються.", + "The file is larger than 10 MB.": "Файл більший за 10 МБ.", + "The plan has more than 2,000 tasks, more than one import takes.": "У плані понад 2000 завдань, більше, ніж приймає один імпорт.", + "This file is not a Microsoft Project plan in XML format.": "Цей файл не є планом Microsoft Project у форматі XML.", + "Choose a file to import.": "Виберіть файл для імпорту.", + "Only the project owner can import a plan.": "Лише власник проєкту може імпортувати план.", + "The plan could not be read. Please try again.": "Не вдалося прочитати план. Спробуйте ще раз.", + "Linked case: {title}": "Пов'язана справа: {title}", + "Linked to a case": "Пов'язано зі справою", + "Hand over to case": "Передати до справи", + "Copies every file on the project and its tasks, and a file describing the project, to the linked case, unchanged.": "Копіює без змін кожен файл проєкту та його завдань, а також файл з описом проєкту, до пов'язаної справи.", + "{date} by {user}": "{date}, {user}", + "Files copied: {count}": "Скопійовано файлів: {count}", + "Files that failed: {names}": "Файли з помилкою: {names}", + "The handover failed. Please try again.": "Передача не вдалася. Спробуйте ще раз.", + "The linked case could not be found, or you cannot open it.": "Пов'язану справу не знайдено, або ви не можете її відкрити.", + "Case handovers": "Передачі до справи", + "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.": "Кожна передача файлів і метаданих проєкту до його справи: коли, ким, до якої справи, кожен скопійований файл з його SHA-256 і файли з помилкою.", + "Finance": "Фінанси", + "Add cost line": "Додати рядок витрат", + "Delivery terms": "Умови постачання", + "Billing model": "Модель оплати", + "Budget in euro": "Бюджет у євро", + "Budget in hours": "Бюджет у годинах", + "Hourly rate in euro": "Погодинна ставка в євро", + "Planned start": "Запланований початок", + "Planned end": "Запланований кінець", + "Planned dates": "Заплановані дати", + "Budget {amount}": "Бюджет {amount}", + "No budget agreed": "Бюджет не погоджено", + "Hours": "Години", + "Only the project owner and the portfolio managers see the amounts.": "Суми бачать лише власник проєкту та менеджери портфеля.", + "Budget against cost per category": "Бюджет і витрати за категоріями", + "Labour (booked time)": "Праця (облікований час)", + "No category": "Без категорії", + "Hours are not available": "Години недоступні", + "Not yet assigned to a category": "Ще не віднесено до категорії", + "Total": "Разом", + "{spent} spent, {remaining} remaining": "{spent} витрачено, {remaining} залишилося", + "Budget against cost per phase": "Бюджет і витрати за фазами", + "No phase": "Без фази", + "Cost lines": "Рядки витрат", + "From the finance system": "З фінансової системи", + "Edit cost line {amount}": "Змінити рядок витрат {amount}", + "No cost lines yet": "Рядків витрат ще немає", + "Commitments": "Зобов'язання", + "Actual cost": "Фактичні витрати", + "Forecast": "Прогноз", + "Remaining": "Залишилося", + "Not planned yet": "Ще не заплановано", + "{start} to {end}": "з {start} по {end}", + "The terms were not saved. Please try again.": "Умови не збережено. Спробуйте ще раз.", + "Terms saved": "Умови збережено", + "Fixed price": "Фіксована ціна", + "Hourly": "Погодинно", + "Not billed": "Без рахунку", + "Commitment": "Зобов'язання", + "Edit cost line": "Змінити рядок витрат", + "Kind": "Вид", + "Amount in euro": "Сума в євро", + "Remove": "Вилучити", + "Could not save the cost line. Only the project owner changes the money of a project.": "Не вдалося зберегти рядок витрат. Гроші проєкту змінює лише власник проєкту.", + "Could not remove the cost line. Please try again.": "Не вдалося вилучити рядок витрат. Спробуйте ще раз.", + "{amount} over budget": "{amount} понад бюджет", + "Cost categories": "Категорії витрат", + "The categories every project splits its budget and costs into, one per line": "Категорії, на які кожен проєкт ділить свій бюджет і витрати, по одній у рядку", + "Categories": "Категорії", + "Give at least one category, each name once.": "Вкажіть щонайменше одну категорію, кожну назву один раз.", + "Cost categories saved": "Категорії витрат збережено", + "The cost categories were not saved. Please try again.": "Категорії витрат не збережено. Спробуйте ще раз.", + "Finance line": "Фінансовий рядок", + "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.": "Одна грошова сума проєкту: бюджет, зобов'язання, фактичні витрати або прогноз, у категорії витрат і за потреби у фазі. Вводить власник проєкту або надсилає фінансова система через застосунок інтеграції.", + "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.": "Проєкт, до якого належить сума. Порожньо для рядка з фінансової системи, номер проєкту якого не збігається з жодним проєктом.", + "The phase this amount belongs to, if any": "Фаза, до якої належить сума, якщо є", + "The cost category, one of the categories the admin set up": "Категорія витрат, одна з категорій, заданих адміністратором", + "Whether the amount is a budget, a commitment, an actual cost or a forecast": "Чи є сума бюджетом, зобов'язанням, фактичними витратами або прогнозом", + "Amount": "Сума", + "The amount in the reporting currency (euro)": "Сума у валюті звітності (євро)", + "The date the amount was booked or is expected": "Дата, коли суму проведено або очікується", + "What the amount is for": "На що ця сума", + "Whether a person entered the line or the finance system sent it": "Чи ввела рядок людина, чи його надіслала фінансова система", + "Entered by hand": "Введено вручну", + "Finance line id": "Ідентифікатор фінансового рядка", + "The finance system's own id of this line. One imported line per id.": "Власний ідентифікатор рядка у фінансовій системі. Один імпортований рядок на ідентифікатор.", + "Project number": "Номер проєкту", + "The project number the finance system sent, matched against the project key": "Номер проєкту з фінансової системи, звірений із ключем проєкту", + "The portfolio of the line's project, copied from the project so portfolio totals need one filter": "Портфель проєкту рядка, скопійований із проєкту, щоб підсумкам портфеля вистачало одного фільтра", + "Finance readers": "Читачі фінансів", + "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio": "UID користувачів Nextcloud, яким дозволено бачити суму: власник проєкту та менеджери його портфеля", + "Project owner": "Власник проєкту", + "Nextcloud user UID of the project owner, who may change and remove manual lines": "UID користувача Nextcloud, власника проєкту, який може змінювати й вилучати ручні рядки", + "How the client pays: not billed, a fixed price, or by the hour.": "Як платить клієнт: без рахунку, фіксована ціна або погодинно.", + "Portfolio finance": "Фінанси портфеля", + "You cannot see the money of any project in this portfolio": "Ви не бачите грошей жодного проєкту в цьому портфелі", + "The server returned cost lines of projects outside this portfolio, so these totals may be wrong.": "Сервер повернув рядки витрат проєктів поза цим портфелем, тому підсумки можуть бути хибними.", + "Projects left out because you cannot see their money: {count}": "Пропущено проєктів, чиї гроші вам не видно: {count}", + "Unmatched finance lines": "Незіставлені фінансові рядки", + "Budget, commitments, actual cost and forecast totalled across a portfolio.": "Бюджет, зобов'язання, фактичні витрати й прогноз у сумі за портфелем.", + "Subprojects": "Підпроєкти", + "{done} of {total}": "{done} з {total}", + "{done} of {total} tasks done, including subprojects": "Виконано {done} з {total} завдань, з підпроєктами", + "Show the subprojects of {title}": "Показати підпроєкти {title}", + "Hide the subprojects of {title}": "Приховати підпроєкти {title}", + "Part of": "Входить до", + "No parent project": "Без батьківського проєкту", + "A project cannot sit under one of its own subprojects.": "Проєкт не може бути під одним зі своїх підпроєктів.", + "Projects nest three levels deep at most: programme, project and subproject.": "Проєкти вкладаються не глибше трьох рівнів: програма, проєкт і підпроєкт.", + "Parent project": "Батьківський проєкт", + "The project this project sits under, such as a programme. Projects nest three levels deep at most.": "Проєкт, під яким розташований цей проєкт, наприклад програма. Проєкти вкладаються не глибше трьох рівнів.", + "Yes": "Так", + "No": "Ні", + "{label} (required)": "{label} (обов'язково)", + "{label} is required": "Поле «{label}» обов'язкове", + "Project field": "Поле проєкту", + "A field an admin adds to every project, such as a policy area or a contract value.": "Поле, яке адміністратор додає до кожного проєкту, наприклад сфера політики або вартість договору.", + "Key": "Ключ", + "The stable name the value is stored under, in lower camel case. Keep it once projects use it.": "Постійна назва, під якою зберігається значення, у lower camel case. Не змінюйте її, коли проєкти її використовують.", + "Label": "Підпис", + "The name people see next to the field": "Назва біля поля", + "What the field holds": "Що містить поле", + "Text": "Текст", + "Number": "Число", + "Choice": "Вибір", + "Person": "Особа", + "Yes or no": "Так або ні", + "Options": "Варіанти", + "The choices of a choice field": "Варіанти поля вибору", + "Required": "Обов'язкове", + "Whether a project must fill in the field": "Чи має проєкт заповнити поле", + "Where the field appears, lowest first": "Де з'являється поле, менше першим", + "Applies to": "Стосується", + "What the field is added to": "До чого додається поле", + "Custom fields": "Власні поля", + "The values of the project fields an admin defined, keyed by the field's key.": "Значення полів проєкту, визначених адміністратором, за ключем поля.", + "Project fields": "Поля проєкту", + "Related": "Пов'язані", + "Remove link": "Вилучити зв'язок", + "Link type": "Тип зв'язку", + "Relates to": "Пов'язана з", + "Duplicates": "Дублює", + "Project key": "Ключ проєкту", + "Every task number starts with it, such as VERG-42.": "З нього починається кожен номер завдання, наприклад VERG-42.", + "This key is already used by another project.": "Цей ключ уже використовує інший проєкт.", + "Use 2 to 10 letters and digits, starting with a letter.": "Використовуйте від 2 до 10 літер і цифр, починаючи з літери.", + "The key cannot change once tasks carry it.": "Ключ не можна змінити, коли завдання вже його мають.", + "Project saved. The existing tasks get their numbers in the background.": "Проєкт збережено. Наявні завдання отримують номери у фоновому режимі.", + "Next task number": "Номер наступного завдання", + "The number the next task of this project gets in its key. Only the system writes it.": "Номер, який наступне завдання цього проєкту отримує у своєму ключі. Його записує лише система.", + "Restore {title}": "Відновити {title}", + "Restore": "Відновити", + "Project restored": "Проєкт відновлено", + "Could not restore the project": "Не вдалося відновити проєкт", + "Bring this project back to the active list.": "Повернути цей проєкт до списку активних проєктів.", + "Restore project": "Відновити проєкт", + "Request reason": "Причина запиту", + "Why the requester needs this project. Filled in when the project is requested.": "Навіщо заявнику цей проєкт. Заповнюється під час запиту.", + "Reviewed by": "Розглянуто", + "The user who approved or rejected the request.": "Користувач, який схвалив або відхилив запит.", + "Reviewed at": "Дата розгляду", + "When the request was approved or rejected.": "Коли запит було схвалено або відхилено.", + "Review note": "Примітка рецензента", + "The reviewer's reason, shown to the requester when a request is not approved.": "Причина рецензента, яку бачить заявник, якщо запит не схвалено.", + "Members of these groups": "Учасники цих груп", + "Groups that may create projects": "Групи, яким можна створювати проєкти", + "The group {group} no longer exists. Save to remove it.": "Групи {group} більше не існує. Збережіть, щоб прибрати її.", + "Review project request": "Розглянути запит на проєкт", + "Requested by": "Запитав", + "Why it is needed": "Навіщо він потрібен", + "Desired start date": "Бажана дата початку", + "Why is it not approved?": "Чому не схвалено?", + "Give a reason. The requester sees it.": "Вкажіть причину. Заявник її побачить.", + "Approve": "Схвалити", + "Reject": "Відхилити", + "Reject request": "Відхилити запит", + "The review was not saved. Try again.": "Рішення не збережено. Спробуйте ще раз.", + "This project is waiting for review": "Цей проєкт чекає на розгляд", + "This request was not approved": "Цей запит не схвалено", + "Reason: {note}": "Причина: {note}", + "Review request": "Розглянути запит", + "Request a project": "Запросити проєкт", + "Step {step} of 2": "Крок {step} з 2", + "Why is this project needed?": "Навіщо потрібен цей проєкт?", + "Give a reason. The reviewer reads it.": "Вкажіть причину. Рецензент її прочитає.", + "Back": "Назад", + "Next": "Далі", + "Send request": "Надіслати запит", + "The request was not sent. Try again.": "Запит не надіслано. Спробуйте ще раз.", + "Requested": "Запитано", + "Not approved": "Не схвалено", + "Your request was sent": "Ваш запит надіслано", + "Let everyone else request a project": "Дозволити всім іншим запитувати проєкт", + "Add a task": "Додати завдання", + "Delete task": "Видалити завдання", + "Edit task": "Редагувати завдання", + "Write": "Написати", + "Preview": "Попередній перегляд", + "Markdown works here: headings, lists and links.": "Тут працює Markdown: заголовки, списки та посилання.", + "Could not save the task. Please try again.": "Не вдалося зберегти завдання. Спробуйте ще раз.", + "\"{title}\" has logged time, so it cannot be deleted. You can cancel it instead: the time entries stay.": "На завданні \"{title}\" обліковано час, тому його не можна видалити. Натомість його можна скасувати: записи часу залишаться.", + "Delete \"{title}\"? Its links to other tasks are removed too. This cannot be undone.": "Видалити \"{title}\"? Його зв'язки з іншими завданнями теж буде видалено. Цю дію не можна скасувати.", + "Keep task": "Залишити завдання", + "Cancel task": "Скасувати завдання", + "Only the reporter, the project owner or an admin can delete this task.": "Видалити це завдання може лише автор, власник проєкту або адміністратор.", + "Could not delete the task. Please try again.": "Не вдалося видалити завдання. Спробуйте ще раз.", + "Could not cancel the task. Please try again.": "Не вдалося скасувати завдання. Спробуйте ще раз.", + "Responsible": "Відповідальний", + "Also working on this": "Також працюють над цим", + "Labels": "Мітки", + "Could not change the priority. Please try again.": "Не вдалося змінити пріоритет. Спробуйте ще раз.", + "Other project members who work on this task alongside the person responsible.": "Інші учасники проєкту, які працюють над завданням разом із відповідальним.", + "Duplicate": "Дублювати", + "Could not copy the task. Please try again.": "Не вдалося скопіювати завдання. Спробуйте ще раз.", + "Subtasks": "Підзавдання", + "{done} of {total} done": "Виконано {done} з {total}", + "Add a subtask": "Додати підзавдання", + "Checklist": "Чек-лист", + "Checklist item actions": "Дії з пунктом чек-листа", + "Add a checklist item": "Додати пункт чек-листа", + "Subtasks: {estimate} estimated, {logged} logged": "Підзавдання: оцінка {estimate}, обліковано {logged}", + "Total estimate: {total}": "Загальна оцінка: {total}", + "Part of {title}": "Частина завдання {title}", + "Checklist: {count} done": "Чек-лист: виконано {count}", + "This task has subtasks: {count}.": "Це завдання має підзавдання: {count}.", + "Keep subtasks as separate tasks": "Залишити підзавдання окремими завданнями", + "Delete subtasks too": "Видалити й підзавдання", + "Copy of {title}": "Копія: {title}", + "The task was copied, but not all of its subtasks. Please check the copy.": "Завдання скопійовано, але не всі його підзавдання. Перевірте копію.", + "Small steps inside the task. Each item has an id, a text and whether it is done.": "Невеликі кроки всередині завдання. Кожен пункт має id, текст і позначку про виконання.", + "Open work per person and per project.": "Відкрита робота за людьми та за проєктами.", + "View": "Вигляд", + "By person": "За людьми", + "By project": "За проєктами", + "Hours left": "Залишилось годин", + "Tasks without an estimate": "Завдання без оцінки", + "Due in 14 days": "Термін протягом 14 днів", + "Shared": "Спільні", + "Unassigned": "Не призначені", + "{hours} h": "{hours} год", + "Showing work in the projects you can see. Hours count for the person responsible; shared tasks are counted without hours.": "Показано роботу в проєктах, які ви можете бачити. Години враховуються для відповідальної особи; спільні завдання враховуються без годин.", + "No open work in these projects.": "У цих проєктах немає відкритої роботи.", + "Open work": "Відкрита робота", + "{count} open tasks": "Відкритих завдань: {count}", + "Create a project to see capacity here.": "Створіть проєкт, щоб побачити тут завантаження.", + "My tasks": "Мої завдання", + "Show all my tasks": "Показати всі мої завдання", + "No tasks assigned to you": "Вам не призначено жодного завдання", + "Browse projects": "Переглянути проєкти", + "Later": "Пізніше", + "Due {date}": "Термін {date}", + "Could not change the status. Please try again.": "Не вдалося змінити статус. Спробуйте ще раз.", + "Completed today": "Завершено сьогодні", + "My open tasks": "Мої відкриті завдання", + "My overdue tasks": "Мої прострочені завдання", + "My tasks in progress": "Мої завдання в роботі", + "Pin to the top": "Закріпити вгорі", + "Unpin": "Відкріпити", + "Pinned": "Закріплено", + "Actions for {title}": "Дії для {title}", + "Could not save your project order. Please try again.": "Не вдалося зберегти порядок ваших проєктів. Спробуйте ще раз.", + "No boards yet": "Дошок ще немає", + "Create a project to get a board.": "Створіть проєкт, щоб отримати дошку.", + "Use the Projects page to create and manage your projects and tasks.": "Створюйте проєкти й завдання та керуйте ними на сторінці «Проєкти».", + "Go to projects": "До проєктів", + "You are not a member of any projects yet.": "Ви ще не учасник жодного проєкту.", + "Could not search for users. Please try again.": "Не вдалося знайти користувачів. Спробуйте ще раз.", + "Project creation is restricted to administrators.": "Створювати проєкти можуть лише адміністратори.", + "Only the project owner or an administrator can delete this project.": "Видалити цей проєкт може лише власник проєкту або адміністратор.", + "No projects are available to you yet. Ask an administrator to create one.": "Вам ще не доступний жоден проєкт. Попросіть адміністратора створити проєкт.", + "Due: {date}": "Термін: {date}", + "Tasks with a start or due date appear on the timeline. Add dates to see them here.": "Завдання з датою початку або терміном відображаються на часовій шкалі. Додайте дати, щоб побачити їх тут.", + "You do not have access to this project.": "У вас немає доступу до цього проєкту.", + "Zoom level": "Масштаб", + "Unscheduled": "Не заплановані", + "Start: {date}": "Початок: {date}", + "Today": "Сьогодні", + "No scheduled tasks": "Немає запланованих завдань", + "An unexpected error occurred.": "Сталася неочікувана помилка.", + "Column {number} name": "Назва стовпця {number}", + "Failed to save creation policy": "Не вдалося зберегти правило створення", + "All authenticated users": "Усі користувачі, що увійшли", + "Control who may create new projects": "Визначте, хто може створювати нові проєкти", + "Administrators only": "Лише адміністратори", + "Project creation": "Створення проєктів", + "Allow project creation": "Дозволити створення проєктів", + "Creation policy saved successfully": "Правило створення збережено", + "Initializing…": "Запуск…", + "e.g. 2h 30m, 90m, 1.5h": "напр. 2h 30m, 90m, 1.5h", + "Log time": "Облікувати час", + "Save estimate": "Зберегти оцінку", + "Logged: {logged}": "Обліковано: {logged}", + "over by {amount}": "перевищено на {amount}", + "Time tracking": "Облік часу", + "Estimate": "Оцінка", + "Enter a valid estimate (e.g. 2h 30m, 90m, 1.5h)": "Введіть коректну оцінку (напр. 2h 30m, 90m, 1.5h)", + "Enter a valid duration (e.g. 2h 30m, 90m, 1.5h)": "Введіть коректну тривалість (напр. 2h 30m, 90m, 1.5h)", + "Could not save the time entry. Please try again.": "Не вдалося зберегти запис часу. Спробуйте ще раз.", + "Edit time entry": "Змінити запис часу", + "Duration": "Тривалість", + "Date range": "Період", + "Last week": "Минулий тиждень", + "No time logged": "Час не обліковано", + "Log time on a task to see it here.": "Облікуйте час у завданні, щоб побачити його тут.", + "To date": "По дату", + "This week": "Цей тиждень", + "Total: {total}": "Разом: {total}", + "From date": "З дати", + "Custom range": "Власний період", + "All time": "За весь час", + "Could not delete a task, so some data may remain. Try deleting the project again.": "Не вдалося видалити завдання, тому дані могли залишитися. Видаліть проєкт ще раз.", + "Could not delete a time entry, so some data may remain. Try deleting the project again.": "Не вдалося видалити запис часу, тому дані могли залишитися. Видаліть проєкт ще раз.", + "Could not delete a column, so some data may remain. Try deleting the project again.": "Не вдалося видалити стовпець, тому дані могли залишитися. Видаліть проєкт ще раз.", + "Could not delete the project. Please try again.": "Не вдалося видалити проєкт. Спробуйте ще раз.", + "Notification settings": "Налаштування сповіщень", + "Configure when due-date reminders are sent": "Визначте, коли надсилаються нагадування про терміни", + "Due-date reminder lead time (hours)": "Завчасність нагадування (години)", + "Lead time must be between 1 and 336 hours": "Завчасність має бути від 1 до 336 годин", + "Reminder lead time saved successfully": "Завчасність нагадування збережено", + "Failed to save reminder lead time": "Не вдалося зберегти завчасність нагадування", + "Notifications": "Сповіщення", + "Notify me 1 day before a task's due date": "Сповіщати мене за 1 день до терміну завдання", + "Draft": "Чернетка", + "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.": "Чи є урок чернеткою, яку бачить лише його вчитель, чи відбудеться він, чи скасований.", + "New release": "Новий випуск", + "Roadmap chart. The same releases and epics are listed below.": "Діаграма дорожньої карти. Ті самі випуски та епіки наведено нижче.", + "Nothing on the roadmap yet": "На дорожній карті ще нічого немає", + "Releases with a target date and epics with dated tasks appear here.": "Тут з'являються випуски з цільовою датою та епіки із задачами, що мають дату.", + "Releases": "Випуски", + "No releases yet": "Ще немає випусків", + "Target date: {date}": "Цільова дата: {date}", + "No target date": "Без цільової дати", + "Edit {name}": "Редагувати {name}", + "Mark {name} as released": "Позначити {name} як випущений", + "Mark as released": "Позначити як випущений", + "Epics": "Епіки", + "No epics yet. Open a task to make it an epic.": "Ще немає епіків. Відкрийте задачу, щоб зробити її епіком.", + "Not scheduled yet": "Ще не заплановано", + "Planned": "Заплановано", + "Released": "Випущено", + "Edit release": "Редагувати випуск", + "Target date": "Цільова дата", + "Could not save the release. Please try again.": "Не вдалося зберегти випуск. Спробуйте ще раз.", + "Every task of this release is done or cancelled.": "Кожна задача цього випуску виконана або скасована.", + "Not finished yet: {count}": "Ще не завершено: {count}", + "What happens to these tasks?": "Що буде з цими задачами?", + "Move to {name}": "Перемістити до {name}", + "Remove the release": "Прибрати випуск", + "Keep it on {name}": "Залишити їх у {name}", + "Could not mark the release as released. Please try again.": "Не вдалося позначити випуск як випущений. Спробуйте ще раз.", + "Roadmap": "Дорожня карта", + "Tasks or roadmap": "Задачі або дорожня карта", + "Release": "Випуск", + "Epic": "Епік", + "This task is an epic": "Ця задача є епіком", + "A named, dated delivery of a project that its tasks are planned against.": "Іменована поставка проєкту з датою, під яку плануються його задачі.", + "Name of the release": "Назва випуску", + "The project this release belongs to": "Проєкт, до якого належить цей випуск", + "What this release delivers": "Що постачає цей випуск", + "When work on the release starts": "Коли починається робота над випуском", + "The date the release is due": "Дата, до якої випуск має бути готовий", + "Whether the release is planned, released or archived": "Чи випуск запланований, випущений чи архівований", + "Released on": "Випущено", + "When the release was marked as released": "Коли випуск позначили як випущений", + "The release this task is planned for": "Випуск, на який заплановано цю задачу", + "Board view options": "Параметри вигляду дошки", + "Colour cards": "Розфарбувати картки", + "No colour": "Без кольору", + "By label": "За міткою", + "Swimlanes": "Доріжки", + "No swimlanes": "Без доріжок", + "By assignee": "За виконавцем", + "By epic": "За епіком", + "No assignee": "Не призначено", + "No epic": "Без епіка", + "{name} ({count})": "{name} ({count})", + "Cards stay in their epic row. Change the epic on the task page.": "Картки залишаються в рядку свого епіка. Змініть епік на сторінці завдання.", + "Hand over to": "Передати", + "Could not save your board view. It applies until you reload.": "Вигляд дошки не збережено. Він діє до перезавантаження.", + "Timetable wish": "Побажання до розкладу", + "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.": "Побажання, яке враховує генератор. Жорстке побажання він дотримує завжди, м'яке, де може.", + "Whether the wish is about a teacher, a group, a room or one activity": "Чи стосується побажання вчителя, групи, приміщення чи одного заняття", + "Teacher": "Учитель", + "Group": "Група", + "Reference": "Посилання", + "The user, group, room or activity the wish is about": "Користувач, група, приміщення чи заняття, яких стосується побажання", + "What the wish asks for": "Чого просить побажання", + "Not on these periods": "Не в ці уроки", + "Preferably not on these periods": "Краще не в ці уроки", + "At most a number of lessons a day": "Не більше певної кількості уроків на день", + "No free periods between lessons": "Без вікон між уроками", + "Always the same room": "Завжди те саме приміщення", + "Periods": "Уроки", + "The periods of the week the wish is about, such as wed-5": "Уроки тижня, яких стосується побажання, наприклад wed-5", + "Limit": "Межа", + "The most lessons a day, for a wish of that kind": "Найбільша кількість уроків на день для побажання такого виду", + "Strength": "Сила", + "Whether the generator must keep the wish or should keep it": "Чи мусить генератор дотримати побажання, чи бажано", + "Hard": "Жорстке", + "Soft": "М'яке", + "Weight": "Вага", + "How much a soft wish counts, from 1 to 3": "Скільки важить м'яке побажання, від 1 до 3", + "Why the wish exists": "Навіщо існує побажання", + "Timetable scenario": "Сценарій розкладу", + "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.": "Один тижневий шаблон, створений генератором або взятий з поточного розкладу. Він зберігає свої вхідні дані й те, наскільки добре дотримує побажань.", + "The name timetablers know the scenario by": "Назва, під якою укладачі знають сценарій", + "Whether the generator made it or it came from the current timetable": "Чи створив його генератор, чи він узятий з поточного розкладу", + "Generated": "Згенеровано", + "From the current timetable": "З поточного розкладу", + "Week of": "Тиждень з", + "The Monday of the first week of the window": "Понеділок першого тижня періоду", + "Window start": "Початок періоду", + "The first day the week pattern applies to": "Перший день, до якого застосовується тижневий шаблон", + "Window end": "Кінець періоду", + "The last day the week pattern applies to": "Останній день, до якого застосовується тижневий шаблон", + "Waiting, generating, done, failed, or published as draft lessons": "Очікує, створюється, готово, не вдалося або опубліковано як чернеткові уроки", + "Waiting": "Очікує", + "Generating": "Створюється", + "Failed": "Не вдалося", + "Published": "Опубліковано", + "Seed": "Початкове число", + "The number the generator starts from, so a run can be repeated": "Число, з якого починає генератор, щоб запуск можна було повторити", + "Input": "Вхідні дані", + "The periods, rooms, lessons and wishes the scenario was made from": "Уроки, приміщення, заняття й побажання, з яких зроблено сценарій", + "Placements": "Розміщення", + "Each lesson with the period and room it was given": "Кожне заняття з отриманими уроком і приміщенням", + "Unplaced lessons": "Нерозміщені заняття", + "Lessons without a place, each with the hard wish that blocked it": "Заняття без місця, кожне з жорстким побажанням, яке його зупинило", + "Broken wishes": "Порушені побажання", + "The wishes this scenario breaks, with the lessons that break them": "Побажання, які порушує цей сценарій, із заняттями, що їх порушують", + "Measures": "Показники", + "Placed lessons, broken wishes, teacher gaps, lessons a day and room use": "Розміщені заняття, порушені побажання, вікна вчителів, уроки на день і використання приміщень", + "Reason": "Причина", + "Why the run failed": "Чому запуск не вдався", + "Published at": "Опубліковано", + "When the scenario was written out as draft lessons": "Коли сценарій записано як чернеткові уроки", + "Edit wish": "Змінити побажання", + "New wish": "Нове побажання", + "Hard: the generator always keeps it": "Обов'язкове: генератор завжди його дотримується", + "Soft: the generator keeps it where it can": "Гнучке: генератор дотримується його, де може", + "Weight (1 to 3)": "Вага (від 1 до 3)", + "Most lessons a day": "Не більше уроків на день", + "Period": "Урок", + "{day} period {number}": "{day} урок {number}", + "Teacher (user name)": "Учитель (ім'я користувача)", + "Activity (group:subject)": "Заняття (група:предмет)", + "Say who or what the wish is about.": "Вкажіть, кого чи чого стосується побажання.", + "Choose at least one period.": "Виберіть хоча б один урок.", + "The limit is a whole number of 1 or more.": "Ліміт: ціле число від 1.", + "Timetable": "Розклад", + "Wishes": "Побажання", + "Timetable wishes": "Побажання до розкладу", + "Generator run": "Запуск генератора", + "Generator progress": "Хід генератора", + "The run failed: {reason}": "Запуск не вдався: {reason}", + "{placed} of {lessons} lessons placed": "Розміщено {placed} з {lessons} уроків", + "Generate again": "Згенерувати знову", + "Generate": "Згенерувати", + "Every lesson has a place.": "Кожен урок має місце.", + "Lesson": "Урок", + "No free period and room": "Немає вільного уроку й кабінету", + "Broken soft wishes": "Порушені гнучкі побажання", + "Every soft wish is kept.": "Кожне гнучке побажання дотримано.", + "Wish": "Побажання", + "Lessons": "Уроки", + "Generating: {percent}% of the time budget used": "Генерування: використано {percent}% часу", + "Waiting to start": "Очікує запуску", + "Published as draft lessons": "Опубліковано як чернетки уроків", + "Could not read the scenario.": "Не вдалося прочитати сценарій.", + "Could not start the run.": "Не вдалося почати запуск.", + "Scenarios": "Сценарії", + "Timetable scenarios": "Сценарії розкладу", + "Scenario": "Сценарій", + "Take the current timetable": "Взяти поточний розклад", + "Could not take the current timetable.": "Не вдалося взяти поточний розклад.", + "Broken hard wishes": "Порушені обов'язкові побажання", + "Not on a period of the week grid": "Не на уроці тижневої сітки", + "Compare scenarios": "Порівняти сценарії", + "Scenarios to compare": "Сценарії для порівняння", + "Choose two or three scenarios to compare them.": "Виберіть два або три сценарії, щоб порівняти їх.", + "Measure": "Показник", + "Best": "Найкращий", + "Lessons that differ": "Уроки, що відрізняються", + "No lesson differs.": "Жоден урок не відрізняється.", + "Not placed": "Не розміщено", + "{period} in {room}": "{period}, {room}", + "Lessons placed": "Розміщені уроки", + "Lessons without a place": "Уроки без місця", + "Clashes": "Конфлікти", + "Hard wishes broken": "Порушені обов'язкові побажання", + "Soft wishes broken": "Порушені гнучкі побажання", + "Soft wishes broken, weighted": "Порушені гнучкі побажання, зважені", + "Free periods between lessons, all teachers": "Вікна, усі вчителі", + "Most free periods of one teacher": "Найбільше вікон в одного вчителя", + "Most lessons of one group on a day": "Найбільше уроків однієї групи за день", + "Room use": "Використання кабінетів", + "Publish as draft lessons": "Опублікувати як чернетки уроків", + "Draft lessons written: {count}": "Записано чернеток уроків: {count}", + "Could not publish the scenario.": "Не вдалося опублікувати сценарій.", + "Rules": "Правила", + "Rules for {column}": "Правила для {column}", + "When a card enters this column": "Коли картка потрапляє в цю колонку", + "Action": "Дія", + "Set the priority": "Встановити пріоритет", + "Assign to": "Призначити", + "Assign the person who moved the card": "Призначити того, хто перемістив картку", + "Remove the assignee": "Зняти виконавця", + "Add a label": "Додати мітку", + "No longer a project member": "Більше не учасник проєкту", + "This label no longer exists": "Цієї мітки більше немає", + "Add rule": "Додати правило", + "Remove rule": "Видалити правило", + "No rules yet. Add one to change a card when it enters this column.": "Правил поки немає. Додайте правило, щоб змінювати картку, коли вона потрапляє в цю колонку.", + "Could not save the rules. Please try again.": "Не вдалося зберегти правила. Спробуйте ще раз.", + "1 rule runs when a card enters this column": "1 правило спрацьовує, коли картка потрапляє в цю колонку", + "{count} rules run when a card enters this column": "Кількість правил, що спрацьовують, коли картка потрапляє в цю колонку: {count}", + "Rules applied: {changes}": "Застосовані правила: {changes}", + "assigned to {name}": "призначено: {name}", + "assignee removed": "виконавця знято", + "priority {priority}": "пріоритет {priority}", + "label {label}": "мітка {label}", + "What happens to a card when it enters this column, applied in list order.": "Що відбувається з карткою, коли вона потрапляє в цю колонку, у порядку списку.", + "Value": "Значення", + "What the rule does to the card.": "Що правило робить із карткою.", + "The priority, the user id or the label id the action uses; empty for actions without one.": "Пріоритет, id користувача або id мітки, які використовує дія; порожньо для дій без значення.", + "is not": "не", + "{dimension} is not": "{dimension} не", + "Saved filters": "Збережені фільтри", + "No saved filters yet": "Збережених фільтрів поки немає", + "Save filter": "Зберегти фільтр", + "Rename \"{name}\"": "Перейменувати «{name}»", + "Delete \"{name}\"": "Видалити «{name}»", + "Clear filters": "Скинути фільтри", + "Showing {shown} of {total} tasks": "Показано {shown} з {total} завдань", + "Me": "Я", + "No date": "Без дати", + "Rename saved filter": "Перейменувати збережений фільтр", + "Share with the project": "Поділитися з проєктом", + "Give the filter a name": "Дайте фільтру назву", + "Could not save the filter. Please try again.": "Не вдалося зберегти фільтр. Спробуйте ще раз.", + "Some labels in \"{name}\" no longer exist and were left out.": "Деяких міток із «{name}» більше немає, їх пропущено.", + "Could not delete the filter. Please try again.": "Не вдалося видалити фільтр. Спробуйте ще раз.", + "Saved filter": "Збережений фільтр", + "A named board filter of one project, private to the person who saved it unless shared with the project.": "Іменований фільтр дошки одного проєкту, особистий для того, хто його зберіг, якщо ним не поділилися з проєктом.", + "The project whose board the filter applies to": "Проєкт, до дошки якого належить фільтр", + "The name the filter is listed under": "Назва, під якою фільтр показано у списку", + "Saved by": "Зберіг(ла)", + "Nextcloud user id of the person who saved the filter": "Id користувача Nextcloud того, хто зберіг фільтр", + "Shared with the project": "Спільний із проєктом", + "Whether every project member sees and applies the filter": "Чи бачить кожен учасник проєкту фільтр і чи може його застосувати", + "Criteria": "Критерії", + "The filter: assignee, label, priority and due date, each with is or is not and its values": "Фільтр: виконавець, мітка, пріоритет і термін, кожен з є або не і значеннями", + "Cross-project view": "Міжпроєктне подання", + "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.": "Збережений набір проєктів, завдання яких показано разом у колонках за статусом, із доступом для вказаних людей.", + "Shared with": "Надано доступ", + "The name the view is listed under": "Назва, під якою подання вказано в списку", + "Nextcloud user id of the person who saved the view": "Ідентифікатор користувача Nextcloud того, хто зберіг подання", + "Nextcloud user ids of the people the view is shared with": "Ідентифікатори користувачів Nextcloud тих, кому надано доступ до подання", + "The projects whose tasks the view shows, at most twenty": "Проєкти, завдання яких показує подання, не більше двадцяти", + "1 project in this view is hidden from you.": "1 проєкт у цьому поданні приховано від вас.", + "{count} projects in this view are hidden from you.": "Проєкти в цьому поданні, приховані від вас: {count}.", + "{project} has no column for {status}.": "Проєкт {project} не має колонки для статусу {status}.", + "This view does not exist or is not shared with you.": "Це подання не існує або вам не надано доступу.", + "\"{task}\" moved to {status}.": "\"{task}\" переміщено до {status}.", + "Project: {title}": "Проєкт: {title}", + "Cross-project views": "Міжпроєктні подання", + "New view": "Нове подання", + "Edit view": "Змінити подання", + "Delete view": "Видалити подання", + "Give the view a name": "Дайте поданню назву", + "Pick at least one project": "Виберіть принаймні один проєкт", + "A view shows at most {max} projects": "Подання показує не більше {max} проєктів", + "Could not save the view. Please try again.": "Не вдалося зберегти подання. Спробуйте ще раз.", + "Could not delete the view. Please try again.": "Не вдалося видалити подання. Спробуйте ще раз.", + "Delete \"{title}\"? The projects and their tasks stay as they are.": "Видалити «{title}»? Проєкти та їхні завдання залишаться без змін.", + "People see the tasks of the projects they are in, never more.": "Кожен бачить лише завдання проєктів, у яких бере участь.", + "No views yet. A view shows the tasks of several of your projects together.": "Подань ще немає. Подання показує завдання кількох ваших проєктів разом.", + "Projects in view: {count}": "Проєктів у поданні: {count}", + "Notify me when a task is assigned to me": "Сповіщати мене, коли мені призначають завдання", + "Also send these to me by email": "Також надсилати їх мені поштою", + "Add an email address in your Nextcloud personal settings to get mail.": "Додайте адресу електронної пошти в особистих налаштуваннях Nextcloud, щоб отримувати листи.", + "Code link": "Посилання на код", + "A commit, branch, merge request or issue in a code forge that works on a task.": "Коміт, гілка, запит на злиття або задача в сервісі коду, пов'язані із завданням.", + "The task the link belongs to": "Завдання, до якого належить посилання", + "The project of the task": "Проєкт завдання", + "Task key": "Ключ завдання", + "The task key the forge text named, such as VC-12": "Ключ завдання, вказаний у тексті сервісу коду, наприклад VC-12", + "What the link points at": "На що вказує посилання", + "Link": "Посилання", + "The address of the item in the forge": "Адреса елемента в сервісі коду", + "The commit message, branch name or merge request title": "Повідомлення коміту, назва гілки або заголовок запиту на злиття", + "Repository": "Репозиторій", + "The repository, such as acme/portal": "Репозиторій, наприклад acme/portal", + "Forge id": "Id у сервісі", + "The forge's own id for the item, such as github:acme/portal#42 or a commit hash": "Власний id елемента в сервісі коду, наприклад github:acme/portal#42 або хеш коміту", + "State": "Стан", + "The state of a merge request or issue": "Стан запиту на злиття або задачі", + "Who made the commit or opened the merge request": "Хто зробив коміт або відкрив запит на злиття", + "When the commit was made or the merge request last changed": "Коли зроблено коміт або востаннє змінився запит на злиття", + "Added by": "Ким додано", + "Whether a person added the link or the integration wrote it": "Чи додала посилання людина, чи його записала інтеграція", + "Nextcloud user UIDs of project members": "ID користувачів Nextcloud учасників проєкту", + "Add link": "Додати посилання", + "Added by hand": "Додано вручну", + "Branch": "Гілка", + "Code": "Код", + "Commit": "Коміт", + "From the integration": "З інтеграції", + "Link to a commit, branch or merge request": "Посилання на коміт, гілку або запит на злиття", + "Merge request": "Запит на злиття", + "Merged": "Злито", + "No code linked yet. Name {key} in a commit message or paste a link.": "Код ще не прив'язано. Вкажіть {key} у повідомленні коміту або вставте посилання.", + "No code linked yet. Paste a link to a commit or merge request.": "Код ще не прив'язано. Вставте посилання на коміт або запит на злиття.", + "Paste a web address that starts with https://.": "Вставте вебадресу, що починається з https://.", + "Remove link {title}": "Вилучити посилання {title}", + "The link could not be added.": "Не вдалося додати посилання.", + "The link could not be removed.": "Не вдалося вилучити посилання.", + "This link is already on the task.": "Це посилання вже є в завданні.", + "Code forges": "Сервіси коду", + "Link GitHub commits and pull requests to tasks. Integriq receives the events; planninq never calls GitHub.": "Пов'язуйте коміти та pull request з GitHub із завданнями. Integriq отримує події; planninq ніколи не звертається до GitHub.", + "Download the configuration and import it in Integriq. Then fill in a secret on the rule \"Check the GitHub signature\".": "Завантажте конфігурацію та імпортуйте її в Integriq. Потім вкажіть секрет у правилі \"Check the GitHub signature\".", + "In GitHub, add a webhook to the repository with this address and the same secret. Choose content type application/json and the push and pull request events:": "У GitHub додайте до репозиторію webhook з цією адресою і тим самим секретом. Виберіть тип вмісту application/json та події push і pull request:", + "Name the task key, such as VC-12, in a commit message, branch name or pull request title. The link then appears on that task.": "Вкажіть ключ завдання, наприклад VC-12, у повідомленні коміту, назві гілки або заголовку pull request. Посилання тоді з'явиться в цьому завданні.", + "Without Integriq, project members can still paste a link on the task page.": "Без Integriq учасники проєкту все одно можуть вставити посилання на сторінці завдання.", + "Download the Integriq configuration": "Завантажити конфігурацію Integriq", + "Calendar": "Календар", + "Previous": "Назад", + "Calendar view": "Вигляд календаря", + "Starts:": "Початок:", + "No tasks with a date in this month.": "Цього місяця немає завдань із датою.", + "Week of {start} to {end}": "Тиждень з {start} по {end}", + "My calendar": "Мій календар", + "Show as list": "Показати списком", + "Show as calendar": "Показати в календарі", + "Open my calendar": "Відкрити мій календар", + "Nextcloud Tasks": "Завдання Nextcloud", + "Show my tasks in Nextcloud Tasks": "Показувати мої завдання в Завданнях Nextcloud", + "The tasks assigned to you or shared with you appear in a \"Planninq\" list in Nextcloud Tasks and Calendar. Changes made there are replaced by the next change in Planninq.": "Завдання, призначені вам або надані вам, з'являються у списку \"Planninq\" у Завданнях і Календарі Nextcloud. Зміни, зроблені там, замінюються під час наступної зміни в Planninq.", + "This server cannot write to Nextcloud Tasks, so the export is not available.": "Цей сервер не може записувати до Завдань Nextcloud, тому експорт недоступний.", + "Managed by Planninq. Changes made here are replaced by the next change in Planninq.": "Керується Planninq. Зміни, зроблені тут, замінюються під час наступної зміни в Planninq.", + "Working days and holidays": "Робочі та святкові дні", + "Dates set on the timeline skip the days that are not working days.": "Дати, задані на часовій шкалі, пропускають неробочі дні.", + "Working weekdays": "Робочі дні тижня", + "Non-working days": "Неробочі дні", + "No non-working days yet.": "Неробочих днів ще немає.", + "Add day": "Додати день", + "Year": "Рік", + "Add Dutch national holidays": "Додати державні свята Нідерландів", + "Save working days": "Зберегти робочі дні", + "Choose at least one working weekday.": "Виберіть хоча б один робочий день.", + "Working days saved.": "Робочі дні збережено.", + "Could not save the working days.": "Не вдалося зберегти робочі дні.", + "New Year's Day": "Новий рік", + "Easter Sunday": "Великдень", + "Easter Monday": "Великодній понеділок", + "King's Day": "День короля", + "Liberation Day": "День визволення", + "Ascension Day": "Вознесіння", + "Whit Sunday": "Трійця", + "Whit Monday": "Духів день", + "Christmas Day": "Різдво", + "Boxing Day": "Другий день Різдва", + "Dates of {title}": "Дати завдання {title}", + "The due date cannot be before the start date.": "Термін не може бути раніше дати початку.", + "{title}, from {start} to {end}": "{title}, з {start} по {end}", + "The dates could not be saved.": "Не вдалося зберегти дати.", + "{title} now runs from {start} to {end}": "{title} тепер триває з {start} по {end}", + "Auto-scheduling": "Автоматичне планування", + "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along.": "Якщо ввімкнено, перенесення терміну на часовій шкалі пізніше пропонує зсунути й заблоковані ним завдання.", + "Move blocked tasks along when a task slips": "Зсувати заблоковані завдання, коли завдання затримується", + "On the timeline, a later due date offers to move the tasks it blocks. Only \"blocks\" links count, and tasks only move later.": "На часовій шкалі пізніший термін пропонує зсунути заблоковані завдання. Враховуються лише зв'язки \"блокує\", і завдання зсуваються лише пізніше.", + "Move the tasks that wait for {title}?": "Зсунути завдання, які чекають {title}?", + "These tasks wait for it and would start after its new due date:": "Ці завдання чекають на нього й почнуться після нового терміну:", + "{count} tasks would move; the first {limit} are listed.": "Буде зсунуто завдань: {count}; показано перші {limit}.", + "Now": "Зараз", + "After the move": "Після зсуву", + "Only this task": "Лише це завдання", + "Move all": "Зсунути всі", + "Stopped at {title}: its dates could not be saved. The tasks before it were moved.": "Зупинено на {title}: не вдалося зберегти дати. Завдання перед ним зсунуто.", + "Cumulative flow": "Накопичувальний потік", + "Show as chart": "Показати як діаграму", + "Show as table": "Показати як таблицю", + "Tasks per column per day": "Завдання за стовпцями за днями", + "Tasks without recorded history in this period: {count}": "Завдання без записаної історії за цей період: {count}", + "Lead and cycle time": "Час виконання і час циклу", + "No tasks were finished in this period.": "За цей період не завершено жодного завдання.", + "Finished tasks": "Завершені завдання", + "Cycle time, average": "Час циклу, середній", + "Cycle time, 85th percentile": "Час циклу, 85-й процентиль", + "Lead time, average": "Час виконання, середній", + "Tasks whose finish time was estimated from their history: {count}": "Завдання, час завершення яких оцінено з історії: {count}", + "Cycle time of each finished task, with the average and the 85th percentile": "Час циклу кожного завершеного завдання із середнім і 85-м процентилем", + "Slowest tasks": "Найповільніші завдання", + "cycle {cycle}, lead {lead}": "цикл {cycle}, виконання {lead}", + "{days} days": "{days} дн.", + "Could not load the flow of this project.": "Не вдалося завантажити потік цього проєкту.", + "Last {days} days": "Останні {days} дн.", + "Portfolio flow": "Потік портфеля", + "An admin adds portfolios under Projects, Portfolios.": "Адміністратор додає портфелі в розділі Проєкти, Портфелі.", + "Projects not shown, because at most 50 are shown at a time: {count}": "Непоказані проєкти, бо одночасно показується не більше 50: {count}", + "Could not load the flow of this portfolio.": "Не вдалося завантажити потік цього портфеля.", + "Cumulative flow and cycle time across the projects of a portfolio.": "Накопичувальний потік і час циклу за проєктами портфеля.", + "Edit report": "Змінити звіт", + "Only tasks where": "Лише завдання, де", + "Group by": "Групувати за", + "Display": "Вигляд", + "Share with everyone who can read its projects": "Поділитися з усіма, хто може читати його проєкти", + "The report could not be saved.": "Не вдалося зберегти звіт.", + "Number of tasks": "Кількість завдань", + "Bar": "Стовпці", + "Donut": "Кільце", + "Table": "Таблиця", + "{hidden} of {total} projects in this report are not visible to you": "{hidden} з {total} проєктів у цьому звіті вам не видно", + "No tasks match this report.": "Жодне завдання не відповідає цьому звіту.", + "None": "Немає", + "Could not load this report.": "Не вдалося завантажити цей звіт.", + "Report": "Звіт", + "Your reports": "Ваші звіти", + "My reports": "Мої звіти", + "Shared reports": "Спільні звіти", + "You have not built a report yet.": "Ви ще не створили жодного звіту.", + "Nobody has shared a report with you yet.": "З вами ще ніхто не поділився звітом.", + "Reports you built over tasks, and the ones shared with you.": "Звіти, які ви створили за завданнями, і ті, якими поділилися з вами.", + "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.": "Збережений запит за завданнями: які проєкти, які фільтри, групування за чим, кількість або сума, у вигляді таблиці чи діаграми.", + "The name the report is listed under": "Назва, під якою звіт показано у списку", + "What the report shows and who it is for": "Що показує звіт і для кого він", + "Nextcloud user id of the person who saved the report": "Ідентифікатор користувача Nextcloud, який зберіг звіт", + "Who can open the report": "Хто може відкрити звіт", + "Only me": "Лише я", + "Everyone who can read its projects": "Усі, хто може читати його проєкти", + "The projects the report covers, at most fifty": "Проєкти, які охоплює звіт, не більше п'ятдесяти", + "Filters": "Фільтри", + "Task fields and the value each must equal": "Поля завдання і значення, якому має дорівнювати кожне", + "The task field the report groups on": "Поле завдання, за яким групує звіт", + "Count the tasks, or add up a number on them": "Порахувати завдання або додати число за ними", + "Sum": "Сума", + "Sum of": "Сума за", + "The number added up when the measure is a sum": "Число, яке додається, коли міра це сума", + "Story points": "Бали історій", + "Estimated duration": "Орієнтовна тривалість", + "How the report is shown": "Як показується звіт", + "Issue type": "Тип завдання", + "Task fields and the value each must equal; empty when the report covers every task": "Поля завдання і значення, якому має відповідати кожне; порожньо, якщо звіт охоплює всі завдання", + "The status a task must have": "Статус, який має мати завдання", + "The priority a task must have": "Пріоритет, який має мати завдання", + "The user a task must be assigned to": "Користувач, якому має бути призначене завдання", + "A label a task must carry": "Мітка, яку має мати завдання", + "The board column a task must be in": "Стовпець дошки, у якому має бути завдання", + "The issue type a task must have": "Тип, який має мати завдання", + "Manager groups": "Групи керівників", + "Member groups": "Групи учасників", + "Viewer groups": "Групи читачів", + "Viewers": "Читачі", + "Owning group": "Група-власник", + "Nextcloud groups whose members manage the project": "Групи Nextcloud, учасники яких керують проєктом", + "Nextcloud groups whose members work on the project": "Групи Nextcloud, учасники яких працюють над проєктом", + "Nextcloud groups whose members may read the project": "Групи Nextcloud, учасники яких можуть читати проєкт", + "Nextcloud user ids who manage the project: its settings, its members and its work": "Користувачі Nextcloud, які керують проєктом: налаштуваннями, учасниками й роботою", + "Nextcloud user ids who may read the project and its work but not change it": "Користувачі Nextcloud, які можуть читати проєкт і його роботу, але не змінювати", + "The Nextcloud group that owns the project with its creator, at most one": "Група Nextcloud, що володіє проєктом разом з його автором, не більше однієї", + "Nextcloud user ids who may read this through the project": "Користувачі Nextcloud, які можуть читати це через проєкт", + "Nextcloud groups whose members may change this through the project": "Групи Nextcloud, учасники яких можуть змінювати це через проєкт", + "Nextcloud groups whose members may read this through the project": "Групи Nextcloud, учасники яких можуть читати це через проєкт", + "Search for a person or a group…": "Знайти особу або групу…", + "No one found. Your admin's sharing settings decide who you can find.": "Нікого не знайдено. Кого ви можете знайти, визначають налаштування спільного доступу вашого адміністратора.", + "Type at least two characters": "Введіть щонайменше два символи", + "Everyone in this group": "Усі в цій групі", + "Could not search for people. Please try again.": "Не вдалося знайти людей. Спробуйте ще раз.", + "Could not remove the group": "Не вдалося вилучити групу", + "Only the owner and managers change who is on this project.": "Лише власник і керівники змінюють склад цього проєкту.", + "Role of {name}": "Роль: {name}", + "Manager": "Керівник", + "Member": "Учасник", + "Viewer": "Читач", + "Could not change the role": "Не вдалося змінити роль", + "Owned by group: {name}": "Належить групі: {name}", + "No group owns this project.": "Цей проєкт не належить жодній групі.", + "Owned by group": "Належить групі", + "Search for a group…": "Знайти групу…", + "No group found. Your admin's sharing settings decide which groups you can find.": "Групу не знайдено. Налаштування спільного доступу вашого адміністратора визначають, які групи ви можете знайти.", + "No owning group": "Без групи-власника", + "Could not search for groups. Please try again.": "Не вдалося знайти групи. Спробуйте ще раз.", + "Could not change the owning group": "Не вдалося змінити групу-власника", + "You can read this project. Only its members change it.": "Ви можете читати цей проєкт. Змінюють його лише його учасники.", + "Course": "Курс", + "The course this lesson teaches, such as an elective, when the school's learning app knows it.": "Курс, який викладають на цьому уроці, наприклад вибірковий предмет, якщо шкільний навчальний застосунок його знає.", + "Online meeting link": "Посилання на онлайн-урок", + "Where pupils join this lesson online. Pupils see a Join button only for an https link.": "Де учні приєднуються до цього уроку онлайн. Кнопка «Приєднатися» з'являється лише для посилання https." }, "plurals": {} } diff --git a/lib/AppInfo/Application.php b/lib/AppInfo/Application.php index 519395ab..a47e2a1e 100644 --- a/lib/AppInfo/Application.php +++ b/lib/AppInfo/Application.php @@ -21,23 +21,40 @@ namespace OCA\Planninq\AppInfo; +use OCA\OpenRegister\AppHost\Bootstrap; use OCA\OpenRegister\Event\ObjectCreatedEvent; use OCA\OpenRegister\Event\ObjectDeletedEvent; use OCA\OpenRegister\Event\ObjectUpdatedEvent; +use OCA\Planninq\Event\TimetableSessionsQueryEvent; +use OCA\Planninq\Event\TimetableUpsertRequestedEvent; use OCA\Planninq\Listener\DeepLinkRegistrationListener; +use OCA\Planninq\Listener\ProjectPrincipalCleanupListener; +use OCA\Planninq\Listener\RegisterProjectsLeafListener; use OCA\Planninq\Listener\TaskActivityListener; +use OCA\Planninq\Listener\TimetableSessionsQueryListener; +use OCA\Planninq\Listener\TimetableUpsertRequestedListener; +use OCA\Planninq\Service\CurrentUserGroupsState; use OCA\Planninq\Settings\AdminSettings; +use OCA\Planninq\Timetabling\LocalSearchSolver; +use OCA\Planninq\Timetabling\TimetableSolver; use OCP\AppFramework\App; use OCP\AppFramework\Bootstrap\IBootContext; use OCP\AppFramework\Bootstrap\IBootstrap; use OCP\AppFramework\Bootstrap\IRegistrationContext; use OCP\EventDispatcher\IEventDispatcher; +use OCP\Group\Events\GroupDeletedEvent; +use OCP\User\Events\UserDeletedEvent; use Psr\Container\ContainerInterface; /** * Main application class for the Planninq Nextcloud app. * * @spec openspec/specs/app-metadata/spec.md + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) This IS the composition + * root: its job is to name every class the app wires together, so the count + * measures the size of the app rather than a design fault. The wiring is + * already split into per-concern register* methods one layer down. */ class Application extends App implements IBootstrap { public const APP_ID = 'planninq'; @@ -87,6 +104,28 @@ public function register(IRegistrationContext $context): void { // import, the kanban Project/Dependency/Label controllers) are kept. $this->registerAppHost(context: $context); + // The timetable generator's engine (timetabling-generator design decision 1, DECISIONS row 21): + // the PHP local search now; a CP-SAT sidecar can be bound here per instance later. + $context->registerServiceAlias(TimetableSolver::class, LocalSearchSolver::class); + + // The caller's group ids for the browser's role helper (projects-members-and-roles task 4.1). + $context->registerInitialStateProvider(CurrentUserGroupsState::class); + + // Publish the projects leaf on OpenRegister's integration registry, so + // sibling apps render planninq's projects instead of querying for them. + $this->registerProjectsLeaf(context: $context); + + // The school timetable doors (ADR-041, school-timetable-target): the + // integriq rostering adapter delivers a batch, learniq reads sessions. + // Both events are planninq's own classes, so no load-order hazard. + $context->registerEventListener(event: TimetableUpsertRequestedEvent::class, listener: TimetableUpsertRequestedListener::class); + $context->registerEventListener(event: TimetableSessionsQueryEvent::class, listener: TimetableSessionsQueryListener::class); + + // A deleted account or group leaves every project (projects-members-and-roles task 5.3). + // Both are OCP events, so no load-order hazard. + $context->registerEventListener(event: UserDeletedEvent::class, listener: ProjectPrincipalCleanupListener::class); + $context->registerEventListener(event: GroupDeletedEvent::class, listener: ProjectPrincipalCleanupListener::class); + // NOTE: the task-lifecycle Activity listener is subscribed from boot(), // not here — see registerFilteredObjectListener(). // @@ -161,6 +200,13 @@ private function registerFilteredObjectListener( */ private const OR_DEEPLINK_REGISTRATION_EVENT = 'OCA\\OpenRegister\\Event\\DeepLinkRegistrationEvent'; + /** + * OpenRegister's leaf-provider collect-event name (ADR-066). + * + * @var string + */ + private const OR_LEAF_REGISTRATION_EVENT = 'OCA\\OpenRegister\\Event\\RegisterLeafProvidersEvent'; + /** * Leaf DI service id for the AppHost dashboard SPA controller. * @@ -239,8 +285,62 @@ private function registerAppHost(IRegistrationContext $context): void { $this->registerAppHostObservability(context: $context); $this->registerAppHostSettings(context: $context); $this->registerAppHostDeepLinks(context: $context); + $this->registerAppHostStore(context: $context); }//end registerAppHost() + /** + * Bind the store controller the adopted route table already declares. + * + * 🔴 THIS ROUTE ARRIVES WHETHER THE APP WANTS IT OR NOT. + * + * `Routes::standard()`, which appinfo/routes.php adopts, declares + * `/api/store/items`. The binding normally comes from + * `Bootstrap::register()`, and planninq does not call that: it aliases the + * plumbing classes it wants, one at a time, and keeps its own settings and + * kanban controllers. The store controller was never on that list. + * + * So the route matched a controller class that does not exist, and every + * request to it returned HTTP 500 rather than 404. Measured on a running + * instance 2026-09-03, alongside decidiq and filinq. + * + * The engine owns the controller's constructor argument list, which is why + * this calls the shared helper rather than adding a ninth hand-written + * factory beside the others: that argument list gained a parameter the + * same day this defect was found, and a hand-written copy would have + * broken instead of adapting. + * + * @param IRegistrationContext $context The registration context. + * + * @return void + * + * @SuppressWarnings(PHPMD.StaticAccess) OCA\OpenRegister\AppHost\Bootstrap + * is a cross-app static entry point in a SIBLING app that may be absent or + * unloadable here — the call is guarded by class_exists() and wrapped in a + * catch(\Throwable) for exactly that reason. It cannot be injected: this + * runs at the composition root, so there is no container to resolve an + * adapter from. + */ + private function registerAppHostStore(IRegistrationContext $context): void { + // The class_exists() guard MUST stay in this method: it is also the + // assertion psalm relies on to accept the Bootstrap call below, and + // psalm does not carry that narrowing across a call. register() has + // already run OpenRegisterAutoloader::register() above. + if (class_exists(Bootstrap::class) === true) { + try { + Bootstrap::aliasStoreController( + context: $context, + appId: self::APP_ID, + controllerNs: 'OCA\\Planninq\\Controller' + ); + } catch (\Throwable) { + // An OpenRegister older than the helper, or present but + // unloadable. The store route is then no worse off than it is + // today, and every registration around this one still runs. + } + } + + }//end registerAppHostStore() + /** * Alias the dashboard SPA and per-user preferences controllers. * @@ -397,6 +497,40 @@ private function registerAppHostDeepLinks(IRegistrationContext $context): void { ); }//end registerAppHostDeepLinks() + /** + * Subscribe the `planninq-projects` leaf to OpenRegister's collect-event. + * + * Planninq owns the project entity, so sibling apps render it through this + * leaf rather than reading planninq's register from their own manifests. + * Pipelinq did the latter and, on an install without the owning app, showed + * an empty table that looked exactly like a client with no projects. + * + * The event NAME is a plain string for the same reason every OpenRegister + * FQCN in this class is: IEventDispatcher keys on the string, so nothing + * here needs OpenRegister to be autoloadable at bootstrap. The listener + * class itself is only constructed when OpenRegister dispatches, which it + * can only do when it is installed. + * + * @param IRegistrationContext $context The registration context. + * + * @return void + * + * @spec openspec/specs/project-delivery/spec.md#requirement-both-halves-of-the-projects-leaf-agree + */ + private function registerProjectsLeaf(IRegistrationContext $context): void { + $context->registerService( + RegisterProjectsLeafListener::class, + static fn (ContainerInterface $c): RegisterProjectsLeafListener => new RegisterProjectsLeafListener( + l10n: $c->get('OCP\\IL10N'), + logger: $c->get('Psr\\Log\\LoggerInterface') + ) + ); + $context->registerEventListener( + event: self::OR_LEAF_REGISTRATION_EVENT, + listener: RegisterProjectsLeafListener::class + ); + }//end registerProjectsLeaf() + /** * Boot the application. * @@ -437,6 +571,9 @@ public function boot(IBootContext $context): void { ); } + // The reporter guard first: a delete it refuses must not lose the edges. + $this->registerTaskGuardListeners(dispatcher: $dispatcher); + // Dependency-edge cascade, on the PRE-delete event. // // ADR-078 / gate-61 forbid a synchronous write in a POST-event listener @@ -458,5 +595,252 @@ public function boot(IBootContext $context): void { registers: ['planninq'], schemas: ['task'] ); + + $this->registerMembershipListeners(dispatcher: $dispatcher); + $this->registerBoardColumnListeners(dispatcher: $dispatcher); + $this->registerWorkItemKeyListeners(dispatcher: $dispatcher); }//end boot() + + /** + * Register the two board-column listeners (boards-configurable-columns). + * + * TaskCompletionListener stamps `completedAt` in the save that moves a task + * to `done`, whichever client moved it. ColumnOwnerGuardListener keeps + * column create, update and delete to the project owner and admins, a rule + * OpenRegister cannot express because it matches no field across schemas. + * ColumnAutomationListener runs the rules of the column a task enters, in + * the same save (boards-column-automation). BoardFilterOwnerListener + * stamps and keeps the owner of a saved board filter (boards-filters). + * Class names are literal strings for the same coupling reason as above. + * + * @param IEventDispatcher $dispatcher The event dispatcher. + * + * @return void + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-3.2b + * @spec openspec/changes/archive/2026-09-30-boards-column-automation/tasks.md#task-1.2 + * @spec openspec/changes/archive/2026-09-30-boards-filters/tasks.md#task-3.1 + * @spec openspec/changes/archive/2026-09-30-integration-code-forge-links/tasks.md#task-1.2 + */ + private function registerBoardColumnListeners(IEventDispatcher $dispatcher): void { + foreach (['ObjectCreatingEvent', 'ObjectUpdatingEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\TaskCompletionListener', + registers: ['planninq'], + schemas: ['task'] + ); + + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\ColumnAutomationListener', + registers: ['planninq'], + schemas: ['task'] + ); + } + + foreach (['ObjectCreatingEvent', 'ObjectUpdatingEvent', 'ObjectDeletingEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\ColumnOwnerGuardListener', + registers: ['planninq'], + schemas: ['column'] + ); + } + + foreach (['ObjectCreatingEvent', 'ObjectUpdatingEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\BoardFilterOwnerListener', + registers: ['planninq'], + schemas: \OCA\Planninq\Listener\BoardFilterOwnerListener::OWNED_SCHEMAS + ); + } + + // A new code link finds its task by key or id and takes the task's + // project; a repeat of the same forge item is refused + // (integration-code-forge-links). + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\ObjectCreatingEvent', + listener: 'OCA\\Planninq\\Listener\\ForgeLinkResolveListener', + registers: ['planninq'], + schemas: ['forgeLink'] + ); + + // Every task change rewrites the task's VTODO in the "Planninq" task + // list of each person on it who switched the export on + // (planning-calendar). Post-events: the save has happened. + foreach (['ObjectCreatedEvent', 'ObjectUpdatedEvent', 'ObjectDeletedEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\TaskCalendarExportListener', + registers: ['planninq'], + schemas: ['task'] + ); + } + }//end registerBoardColumnListeners() + + /** + * Register the task reporter guard (tasks-create-edit-delete). + * + * TaskReporterGuardListener stamps the creator as `reporter`, keeps it on + * every update, and holds a task delete to the reporter, the project owner + * and admins, refusing a task with logged time. It is subscribed before + * TaskDependencyCleanupListener, so a refused delete stops before the + * edges are removed. The class name is a literal string for the coupling + * reason given in boot(). + * + * @param IEventDispatcher $dispatcher The event dispatcher. + * + * @return void + * + * @spec openspec/changes/tasks-create-edit-delete/tasks.md#task-5.1 + */ + private function registerTaskGuardListeners(IEventDispatcher $dispatcher): void { + foreach (['ObjectCreatingEvent', 'ObjectUpdatingEvent', 'ObjectDeletingEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\TaskReporterGuardListener', + registers: ['planninq'], + schemas: ['task'] + ); + } + }//end registerTaskGuardListeners() + + /** + * Register the key listener (tasks-readable-keys). + * + * WorkItemKeyListener gives a new task the next key of its project and + * holds project writes to the key rules. It must be a pre-event listener + * to set the key in the same save and to refuse a used key. The class + * name is a literal string for the coupling reason given in boot(). + * + * @param IEventDispatcher $dispatcher The event dispatcher. + * + * @return void + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.2 + */ + private function registerWorkItemKeyListeners(IEventDispatcher $dispatcher): void { + foreach (['ObjectCreatingEvent', 'ObjectUpdatingEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\WorkItemKeyListener', + registers: ['planninq'], + schemas: ['project', 'task'] + ); + } + + // Project requests (projects-lifecycle-policy): a review is stamped in + // its own save, and an approved request gets its board afterwards. + foreach (['ObjectUpdatingEvent', 'ObjectUpdatedEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\ProjectReviewListener', + registers: ['planninq'], + schemas: ['project'] + ); + } + }//end registerWorkItemKeyListeners() + + /** + * Subscribe the listeners that keep project membership on project objects (planninq#681). + * + * `task`, `column`, `projectPhase` and `plannedTimeEntry` are scoped by + * their own `members` list. ProjectMemberAccessListener writes it on every + * create and update, and refuses a create or a move into a project the + * caller is not a member of; it has to be a PRE-event listener to change + * the data and to veto. ProjectMembershipSyncListener copies a project's + * changed membership to its objects after the project is saved. + * ProjectStatusListener keeps status reports to the project owner and + * copies the newest one onto its project. + * + * Class names are literal strings for the reason given in boot(): each + * import adds to this class's PHPMD coupling count. + * + * @param IEventDispatcher $dispatcher The live event dispatcher. + * + * @return void + * + * @spec openspec/specs/projects.md + */ + private function registerMembershipListeners(IEventDispatcher $dispatcher): void { + foreach (['ObjectCreatingEvent', 'ObjectUpdatingEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\ProjectMemberAccessListener', + registers: ['planninq'], + // Must equal ProjectMembershipService::SCOPED_SCHEMAS (asserted by + // BoardColumnWiringTest): a schema missing here is never stamped. + schemas: [ + 'task', + 'column', + 'projectPhase', + 'plannedTimeEntry', + 'projectLogEntry', + 'risk', + 'projectStatusReport', + 'projectRelease', + 'boardFilter', + 'forgeLink', + ] + ); + } + + // Portfolios: a project's readers are the managers of its portfolio, + // derived on every project write and pushed out when a portfolio's + // managers change or it is deleted (projects-grouping-hierarchy-fields). + foreach (['ObjectCreatingEvent', 'ObjectUpdatingEvent', 'ObjectDeletingEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\ProjectHierarchyGuardListener', + registers: ['planninq'], + schemas: ['project', 'projectPortfolio'] + ); + } + + // Status reports: owner-only writes, and the newest report copied onto + // its project inside the report's own save (portfolio-status-overview). + foreach (['ObjectCreatingEvent', 'ObjectUpdatingEvent', 'ObjectDeletingEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\ProjectStatusListener', + registers: ['planninq'], + schemas: ['project', 'projectStatusReport'] + ); + } + + // Finance lines: hand-entered money is the project owner's, imported + // money the finance import's, and each line carries who may read it + // (portfolio-finance). + foreach (['ObjectCreatingEvent', 'ObjectUpdatingEvent', 'ObjectDeletingEvent'] as $event) { + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\' . $event, + listener: 'OCA\\Planninq\\Listener\\FinanceLineListener', + registers: ['planninq'], + schemas: ['financeLine'] + ); + } + + $this->registerFilteredObjectListener( + dispatcher: $dispatcher, + event: 'OCA\\OpenRegister\\Event\\ObjectUpdatedEvent', + listener: 'OCA\\Planninq\\Listener\\ProjectMembershipSyncListener', + registers: ['planninq'], + schemas: ['project'] + ); + }//end registerMembershipListeners() }//end class diff --git a/lib/BackgroundJob/GenerateTimetableScenario.php b/lib/BackgroundJob/GenerateTimetableScenario.php new file mode 100644 index 00000000..810357b1 --- /dev/null +++ b/lib/BackgroundJob/GenerateTimetableScenario.php @@ -0,0 +1,92 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\BackgroundJob; + +use OCA\Planninq\Service\TimetableGenerationService; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\IJobList; +use OCP\BackgroundJob\QueuedJob; + +/** + * Runs one step of a timetable scenario run. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ +class GenerateTimetableScenario extends QueuedJob { + + /** + * Constructor. + * + * @param ITimeFactory $time The clock. + * @param TimetableGenerationService $generation Runs a step. + * @param IJobList $jobList Queues the next step. + * + * @return void + */ + public function __construct( + ITimeFactory $time, + private readonly TimetableGenerationService $generation, + private readonly IJobList $jobList, + ) { + parent::__construct(time: $time); + }//end __construct() + + /** + * Run the step. + * + * @param mixed $argument `['scenario' => id]`. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ + protected function run($argument): void { + $this->runStep(argument: $argument); + }//end run() + + /** + * Run one step and queue the next one when the run should go on; whether it was queued. + * + * @param mixed $argument `['scenario' => id]`. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ + public function runStep(mixed $argument): bool { + $id = ''; + if (is_array($argument) === true) { + $id = (string)($argument['scenario'] ?? ''); + } + + if ($id === '' || $this->generation->step(id: $id) === false) { + return false; + } + + $this->jobList->add(self::class, ['scenario' => $id]); + return true; + }//end runStep() +}//end class diff --git a/lib/BackgroundJob/NumberProjectTasks.php b/lib/BackgroundJob/NumberProjectTasks.php new file mode 100644 index 00000000..8dd58ca0 --- /dev/null +++ b/lib/BackgroundJob/NumberProjectTasks.php @@ -0,0 +1,86 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.3 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\BackgroundJob; + +use OCA\Planninq\Service\WorkItemKeyService; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\QueuedJob; + +/** + * Numbers the existing tasks of a project that just got a key. + */ +class NumberProjectTasks extends QueuedJob { + + /** + * Constructor. + * + * @param ITimeFactory $time The time factory the job base needs. + * @param WorkItemKeyService $keys The counter. + */ + public function __construct( + ITimeFactory $time, + private WorkItemKeyService $keys, + ) { + parent::__construct(time: $time); + }//end __construct() + + /** + * Number the project named in the argument. + * + * @param mixed $argument ['project' => uuid]. + * + * @return void + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.3 + */ + protected function run($argument): void { + $this->numberProject(argument: $argument); + }//end run() + + /** + * Number the project named in the argument; a second run finds nothing to number. + * + * @param mixed $argument ['project' => uuid]. + * + * @return int The number of tasks numbered. + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.3 + */ + public function numberProject(mixed $argument): int { + $projectId = ''; + if (is_array($argument) === true) { + $projectId = (string)($argument['project'] ?? ''); + } + + if ($projectId === '') { + return 0; + } + + return $this->keys->numberTasks(projectId: $projectId); + }//end numberProject() +}//end class diff --git a/lib/BackgroundJob/TaskCalendarBackfillJob.php b/lib/BackgroundJob/TaskCalendarBackfillJob.php new file mode 100644 index 00000000..d5f810dc --- /dev/null +++ b/lib/BackgroundJob/TaskCalendarBackfillJob.php @@ -0,0 +1,82 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.4 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\BackgroundJob; + +use OCA\Planninq\Service\TaskCalendarExportService; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\BackgroundJob\QueuedJob; + +/** + * Exports one user's assigned tasks once. + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.4 + */ +class TaskCalendarBackfillJob extends QueuedJob { + + /** + * Constructor. + * + * @param ITimeFactory $time The clock. + * @param TaskCalendarExportService $export The export. + */ + public function __construct( + ITimeFactory $time, + private TaskCalendarExportService $export, + ) { + parent::__construct(time: $time); + }//end __construct() + + /** + * Run the backfill. + * + * @param mixed $argument ['userId' => the user]. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.4 + */ + protected function run($argument): void { + $this->backfill(argument: $argument); + }//end run() + + /** + * Export the user's assigned tasks. + * + * @param mixed $argument ['userId' => the user]. + * + * @return int How many tasks were written. + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.4 + */ + public function backfill(mixed $argument): int { + $userId = ''; + if (is_array($argument) === true) { + $userId = (string)($argument['userId'] ?? ''); + } + + return $this->export->backfill(userId: $userId); + }//end backfill() +}//end class diff --git a/lib/Controller/CaseHandoverController.php b/lib/Controller/CaseHandoverController.php new file mode 100644 index 00000000..0eff5a43 --- /dev/null +++ b/lib/Controller/CaseHandoverController.php @@ -0,0 +1,153 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Controller; + +use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\Exception\CaseHandoverException; +use OCA\Planninq\Service\CaseHandoverService; +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IGroupManager; +use OCP\IRequest; +use OCP\IUserSession; +use Psr\Log\LoggerInterface; + +/** + * Case handover endpoints. + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.2 + */ +class CaseHandoverController extends Controller { + + /** + * Constructor. + * + * @param IRequest $request The request. + * @param CaseHandoverService $handoverService Copies the record to the case. + * @param ProjectMembershipService $membership Reads the project's owner. + * @param IUserSession $userSession The caller. + * @param IGroupManager $groupManager Tells an admin. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + IRequest $request, + private CaseHandoverService $handoverService, + private ProjectMembershipService $membership, + private IUserSession $userSession, + private IGroupManager $groupManager, + private LoggerInterface $logger, + ) { + parent::__construct(appName: Application::APP_ID, request: $request); + }//end __construct() + + /** + * Whether a handover is possible here, and the handovers made so far. + * + * @param string $projectId The project UUID. + * + * @return JSONResponse 200 with available and handovers; 401, 403 or 404 otherwise. + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.3 + */ + #[NoAdminRequired] + public function status(string $projectId): JSONResponse { + $refusal = $this->refusal(projectId: $projectId); + if ($refusal !== null) { + return $refusal; + } + + return new JSONResponse( + [ + 'available' => $this->handoverService->isAvailable(), + 'handovers' => $this->handoverService->handovers(projectId: $projectId), + ] + ); + }//end status() + + /** + * Hand the project over to its case. + * + * @param string $projectId The project UUID. + * + * @return JSONResponse 200 with the handover record; 409 without the case app; 422 without a case link; 404 for an unreadable case. + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.2 + */ + #[NoAdminRequired] + public function handOver(string $projectId): JSONResponse { + $refusal = $this->refusal(projectId: $projectId); + if ($refusal !== null) { + return $refusal; + } + + try { + return new JSONResponse($this->handoverService->handOver(projectId: $projectId)); + } catch (CaseHandoverException $e) { + $status = match ($e->getReason()) { + CaseHandoverException::NO_CASE_APP => Http::STATUS_CONFLICT, + CaseHandoverException::CASE_NOT_FOUND => Http::STATUS_NOT_FOUND, + default => Http::STATUS_UNPROCESSABLE_ENTITY, + }; + return new JSONResponse(['error' => $e->getMessage(), 'reason' => $e->getReason()], $status); + } catch (\Throwable $e) { + $this->logger->error('Planninq: case handover failed', ['project' => $projectId, 'exception' => $e->getMessage()]); + return new JSONResponse(['error' => 'The handover failed. Please try again.'], Http::STATUS_INTERNAL_SERVER_ERROR); + } + }//end handOver() + + /** + * Why the caller may not hand this project over, or null when they may. + * + * Owner-or-admin guard (IDOR): any other caller is refused. + * + * @param string $projectId The project UUID. + * + * @return JSONResponse|null + */ + private function refusal(string $projectId): ?JSONResponse { + $user = $this->userSession->getUser(); + if ($user === null) { + return new JSONResponse(['error' => 'Authentication required.'], Http::STATUS_UNAUTHORIZED); + } + + $owner = $this->membership->ownerOfProject(projectId: $projectId); + if ($owner === null) { + return new JSONResponse(['error' => 'Project not found.'], Http::STATUS_NOT_FOUND); + } + + $uid = $user->getUID(); + if ($owner !== $uid && $this->groupManager->isAdmin($uid) === false) { + return new JSONResponse(['error' => 'Only the project owner can hand a project over to its case.'], Http::STATUS_FORBIDDEN); + } + + return null; + }//end refusal() +}//end class diff --git a/lib/Controller/DependencyController.php b/lib/Controller/DependencyController.php index 135f93bb..eacce6d4 100644 --- a/lib/Controller/DependencyController.php +++ b/lib/Controller/DependencyController.php @@ -95,15 +95,17 @@ private function toResponse(DependencyValidationException $e): JSONResponse { * * @param string|null $blocker UUID of the blocking task. * @param string|null $blocked UUID of the blocked task. + * @param string|null $type The link type; `blocks` when omitted. * * @return JSONResponse 201 with the created edge; 4xx/5xx on failure. * * @spec openspec/changes/task-dependencies/specs/task-dependencies/spec.md + * @spec openspec/changes/planning-dependencies-on-task-page/tasks.md#task-3.1 */ #[NoAdminRequired] - public function create(?string $blocker = null, ?string $blocked = null): JSONResponse { + public function create(?string $blocker = null, ?string $blocked = null, ?string $type = null): JSONResponse { try { - $edge = $this->dependencyService->create(blocker: (string)$blocker, blocked: (string)$blocked); + $edge = $this->dependencyService->create(blocker: (string)$blocker, blocked: (string)$blocked, type: ($type ?? 'blocks')); return new JSONResponse($edge, Http::STATUS_CREATED); } catch (DependencyValidationException $e) { // Project-membership guard (IDOR): a non-member caller is rejected by diff --git a/lib/Controller/FlowController.php b/lib/Controller/FlowController.php new file mode 100644 index 00000000..9dea776f --- /dev/null +++ b/lib/Controller/FlowController.php @@ -0,0 +1,255 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Controller; + +use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\Service\FlowHistoryService; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IRequest; +use OCP\IUserSession; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * The flow of a project or a portfolio. + * + * Both methods are `#[NoAdminRequired]` reads. The guard is the RBAC find: + * the project (or portfolio) is read through ObjectService with RBAC on, and + * a caller who cannot read it gets 403 before any task or history is read + * (gate-7 no-admin-idor). A portfolio covers only the projects the caller + * can read, because those are found with RBAC on as well. + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.2 + */ +class FlowController extends Controller { + + /** + * Most projects in one portfolio request, like the portfolio timeline. + * + * @var int + */ + public const MAX_PROJECTS = 50; + + private const REGISTER = 'planninq'; + + private const OR_OBJECT_SERVICE = 'OCA\\OpenRegister\\Service\\ObjectService'; + + /** + * Constructor. + * + * @param IRequest $request The request + * @param IUserSession $userSession The signed-in user + * @param ContainerInterface $container Resolves OpenRegister's ObjectService + * @param FlowHistoryService $flow The flow reader + * @param LoggerInterface $logger Logger + */ + public function __construct( + IRequest $request, + private IUserSession $userSession, + private ContainerInterface $container, + private FlowHistoryService $flow, + private LoggerInterface $logger, + ) { + parent::__construct(appName: Application::APP_ID, request: $request); + }//end __construct() + + /** + * The flow of one project: `GET /api/projects/{projectId}/flow?from=&to=`. + * + * @param string $projectId The project's UUID + * @param string|null $from First day, Y-m-d (default: 29 days before `to`) + * @param string|null $to Last day, Y-m-d (default: today) + * + * @return JSONResponse 200 with the flow; 400 on a bad or too long window; + * 401 signed out; 403 when the project is not readable; + * 503 without OpenRegister. + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.2 + */ + #[NoAdminRequired] + #[NoCSRFRequired] + public function forProject(string $projectId, ?string $from = null, ?string $to = null): JSONResponse { + $objectService = $this->begin(); + if ($objectService instanceof JSONResponse) { + return $objectService; + } + + $window = $this->flow->window(from: $from, to: $to); + if ($window === null) { + return $this->badWindow(); + } + + if ($this->canReadObject(objectService: $objectService, schema: 'project', id: $projectId) === null) { + return new JSONResponse(['error' => 'Project not found or not accessible.'], Http::STATUS_FORBIDDEN); + } + + $flow = $this->flow->forProject(objectService: $objectService, projectId: $projectId, from: $window[0], to: $window[1]); + $flow['window'] = ['from' => $window[0]->format('Y-m-d'), 'to' => $window[1]->format('Y-m-d')]; + + return new JSONResponse($flow); + }//end forProject() + + /** + * The flow of every project in a portfolio the caller can read: + * `GET /api/portfolios/{portfolioId}/flow?from=&to=`. + * + * @param string $portfolioId The portfolio's UUID + * @param string|null $from First day, Y-m-d + * @param string|null $to Last day, Y-m-d + * + * @return JSONResponse 200 with per-project flows and one combined + * summary; 400, 401, 403 and 503 as forProject(). + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.2 + */ + #[NoAdminRequired] + #[NoCSRFRequired] + public function forPortfolio(string $portfolioId, ?string $from = null, ?string $to = null): JSONResponse { + $objectService = $this->begin(); + if ($objectService instanceof JSONResponse) { + return $objectService; + } + + $window = $this->flow->window(from: $from, to: $to); + if ($window === null) { + return $this->badWindow(); + } + + if ($this->canReadObject(objectService: $objectService, schema: 'projectPortfolio', id: $portfolioId) === null) { + return new JSONResponse(['error' => 'Portfolio not found or not accessible.'], Http::STATUS_FORBIDDEN); + } + + $projects = $this->portfolioProjects(objectService: $objectService, portfolioId: $portfolioId); + $flows = []; + $finished = []; + foreach (array_slice($projects, 0, self::MAX_PROJECTS) as $project) { + $flow = $this->flow->forProject(objectService: $objectService, projectId: $project['id'], from: $window[0], to: $window[1]); + $flow['title'] = $project['title']; + $finished = array_merge($finished, $flow['finished']); + $flows[] = $flow; + } + + return new JSONResponse( + [ + 'portfolioId' => $portfolioId, + 'window' => ['from' => $window[0]->format('Y-m-d'), 'to' => $window[1]->format('Y-m-d')], + 'projects' => $flows, + 'skipped' => max(0, count($projects) - self::MAX_PROJECTS), + 'summary' => $this->flow->summarise(finished: $finished), + ] + ); + }//end forPortfolio() + + /** + * A signed-in user and OpenRegister's ObjectService, or the error answer. + * + * @return object|JSONResponse + */ + private function begin(): object { + if ($this->userSession->getUser() === null) { + return new JSONResponse(['error' => 'Authentication required.'], Http::STATUS_UNAUTHORIZED); + } + + try { + $objectService = $this->container->get(self::OR_OBJECT_SERVICE); + } catch (\Throwable $e) { + $this->logger->error('Planninq: OpenRegister ObjectService unavailable', ['exception' => $e->getMessage()]); + return new JSONResponse(['error' => 'OpenRegister is not available.'], Http::STATUS_SERVICE_UNAVAILABLE); + } + + // Drop a register or schema an earlier caller left on the shared + // service (openregister#2820), as TimelineController does. + if (method_exists($objectService, 'clearCurrents') === true) { + $objectService->clearCurrents(); + } + + return $objectService; + }//end begin() + + /** + * Whether the caller can read an object: the object read with RBAC on, or + * null when it is missing or not readable. + * + * @param object $objectService OpenRegister's ObjectService + * @param string $schema Schema slug + * @param string $id The object's UUID + * + * @return mixed + */ + private function canReadObject(object $objectService, string $schema, string $id): mixed { + try { + return $objectService->find(id: $id, register: self::REGISTER, schema: $schema, _rbac: true); + } catch (\Throwable $e) { + return null; + } + }//end canReadObject() + + /** + * The portfolio's projects the caller can read, as id and title. + * + * @param object $objectService OpenRegister's ObjectService + * @param string $portfolioId The portfolio + * + * @return array + */ + private function portfolioProjects(object $objectService, string $portfolioId): array { + $results = $objectService->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: 'project', + filters: ['portfolio' => $portfolioId, '_limit' => FlowHistoryService::MAX_ROWS] + ); + if (is_array($results) === true && array_key_exists('results', $results) === true) { + $results = (array)$results['results']; + } + + $projects = []; + foreach ((array)$results as $row) { + $project = $this->flow->plainRow(result: $row); + if ($project['id'] !== '') { + $projects[] = ['id' => $project['id'], 'title' => (string)($project['title'] ?? '')]; + } + } + + return $projects; + }//end portfolioProjects() + + /** + * The answer to a bad window. + * + * @return JSONResponse + */ + private function badWindow(): JSONResponse { + return new JSONResponse( + ['error' => 'Give from and to as YYYY-MM-DD, from before to, at most ' . FlowHistoryService::MAX_DAYS . ' days apart.'], + Http::STATUS_BAD_REQUEST + ); + }//end badWindow() +}//end class diff --git a/lib/Controller/ProjectController.php b/lib/Controller/ProjectController.php index f8fa6fa8..ea19a064 100644 --- a/lib/Controller/ProjectController.php +++ b/lib/Controller/ProjectController.php @@ -25,7 +25,10 @@ namespace OCA\Planninq\Controller; use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\Service\BoardColumnService; +use OCA\Planninq\Service\ProjectRoles; use OCA\Planninq\Service\SettingsService; +use OCA\Planninq\Service\WorkItemKeyService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; @@ -103,6 +106,8 @@ class ProjectController extends Controller { * @param IUserSession $userSession The user session * @param ContainerInterface $container The DI container * @param LoggerInterface $logger The logger + * @param BoardColumnService $boardColumns Creates a new project's default columns + * @param WorkItemKeyService $keys The project key rules (tasks-readable-keys). * * @return void */ @@ -112,6 +117,8 @@ public function __construct( private IUserSession $userSession, private ContainerInterface $container, private LoggerInterface $logger, + private BoardColumnService $boardColumns, + private WorkItemKeyService $keys, ) { parent::__construct(appName: Application::APP_ID, request: $request); @@ -226,8 +233,11 @@ public function create(): JSONResponse { // Server-side enforcement of the allow_project_creation admin setting (C1). // Delegate to the dedicated policy-check endpoint so the gate logic stays in one place. + // Someone who may not create may still REQUEST a project when requests + // are on (projects-lifecycle-policy): it is stored as `requested`. $policyCheck = $this->checkCreatePolicy(); - if ($policyCheck->getStatus() === Http::STATUS_FORBIDDEN) { + $requesting = ($policyCheck->getStatus() === Http::STATUS_FORBIDDEN); + if ($requesting === true && $this->settingsService->canCurrentUserRequestProject() === false) { return $policyCheck; } @@ -238,17 +248,11 @@ public function create(): JSONResponse { return new JSONResponse(['error' => 'OpenRegister is not available.'], Http::STATUS_SERVICE_UNAVAILABLE); } - $uid = $user->getUID(); - $body = $this->request->getParams(); - - // Strip framework-injected routing params. - unset($body['_route'], $body['_format']); - - // Ensure owner + initial membership are set server-side so the client - // cannot spoof a different owner. - $body['owner'] = $uid; - $body['members'] = array_values(array_unique(array_merge([$uid], (array)($body['members'] ?? [])))); - $body['status'] = ($body['status'] ?? 'active'); + $uid = $user->getUID(); + $body = $this->createBody(uid: $uid, requesting: $requesting); + if ($body instanceof JSONResponse) { + return $body; + } try { // SB1 fix: pass _rbac: false so that the schema-level "create": ["admin"] @@ -266,7 +270,17 @@ public function create(): JSONResponse { $this->logger->info('Planninq: project created', ['uid' => $uid]); - return new JSONResponse($saved->jsonSerialize(), Http::STATUS_CREATED); + $project = $saved->jsonSerialize(); + + // The board runs on the project's own columns, so a project is + // created with them: the admin's default titles, the last one the + // done column (boards-configurable-columns, decision 6). + // A request gets its columns when it is approved (ProjectReviewListener). + if ($requesting === false) { + $this->boardColumns->createDefaultColumns(projectId: (string)($project['id'] ?? ($project['@self']['id'] ?? ''))); + } + + return new JSONResponse($project, Http::STATUS_CREATED); } catch (\Throwable $e) { return $this->classifyObjectServiceException( e: $e, @@ -277,6 +291,122 @@ public function create(): JSONResponse { }//end create() + /** + * The body a create saves: routing params stripped, the key normalised and + * checked, owner and members set by the server, a request marked as one. + * + * @param string $uid The caller. + * @param bool $requesting Whether the caller may only request. + * + * @return array|JSONResponse The body, or the refusal of its key. + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.2 + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.1 + */ + private function createBody(string $uid, bool $requesting): array|JSONResponse { + $body = $this->request->getParams(); + + // Strip framework-injected routing params. + unset($body['_route'], $body['_format']); + + // The project key (tasks-readable-keys): stored uppercase, refused + // here with a clear status when it is malformed or taken. The key + // listener holds every other project write to the same rules. + $body['key'] = $this->keys->normalise(key: ($body['key'] ?? null)); + if ($body['key'] === '') { + unset($body['key']); + } + + $keyRefusal = $this->checkKey(key: ($body['key'] ?? '')); + if ($keyRefusal !== null) { + return $keyRefusal; + } + + // Ensure owner + initial membership are set server-side so the client + // cannot spoof a different owner. + $body['owner'] = $uid; + $body['members'] = array_values(array_unique(array_merge([$uid], (array)($body['members'] ?? [])))); + $body['status'] = ($body['status'] ?? 'active'); + if ($requesting === true) { + return $this->asRequest(body: $body, uid: $uid); + } + + return $body; + }//end createBody() + + /** + * A create body turned into a project request: status requested, the requester its only member, no review filled in. + * + * @param array $body The create body. + * @param string $uid The requester. + * + * @return array + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.1 + */ + private function asRequest(array $body, string $uid): array { + unset($body['reviewedBy'], $body['reviewedAt'], $body['reviewNote']); + $body['status'] = 'requested'; + $body['members'] = [$uid]; + + return $body; + }//end asRequest() + + /** + * Whether a project key is well formed and free, without saying which project has it. + * + * @param string $key The key to check. + * + * @NoAdminRequired + * + * @return JSONResponse {valid, available}; 401 when not logged in. + * + * @no-admin-idor-exempt Takes no object id and returns no object: only whether a key + * string is free, which the New project dialog needs before any + * project exists. + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.2 + */ + public function keyAvailable(string $key = ''): JSONResponse { + if ($this->userSession->getUser() === null) { + return new JSONResponse(['error' => 'Authentication required.'], Http::STATUS_UNAUTHORIZED); + } + + $key = $this->keys->normalise(key: $key); + $valid = $this->keys->isValidFormat(key: $key); + + return new JSONResponse(['valid' => $valid, 'available' => ($valid === true && $this->keys->isTaken(key: $key) === false)]); + }//end keyAvailable() + + /** + * The refusal for a malformed or taken key on create, or null. + * + * @param string $key The normalised key, empty for none. + * + * @return JSONResponse|null + */ + private function checkKey(string $key): ?JSONResponse { + if ($key === '') { + return null; + } + + if ($this->keys->isValidFormat(key: $key) === false) { + return new JSONResponse( + ['error' => 'A key has 2 to 10 letters and digits and starts with a letter.', 'code' => 'planninq-project-key-format'], + Http::STATUS_BAD_REQUEST + ); + } + + if ($this->keys->isTaken(key: $key) === true) { + return new JSONResponse( + ['error' => 'This key is already used by another project.', 'code' => 'planninq-project-key-used'], + Http::STATUS_CONFLICT + ); + } + + return null; + }//end checkKey() + /** * Allow a non-owner member to leave a project (C3 fix, WF2 fix). * @@ -331,40 +461,33 @@ public function leaveProject(string $projectId): JSONResponse { } $project = $entity->getObject(); - $members = (array)($project['members'] ?? []); - // Guard: caller must be a member. - if (in_array($uid, $members, strict: true) === false) { + $roles = new ProjectRoles(); + + // Guard: the caller must be on the project, in any role. + if ($roles->holdsUser(project: $project, uid: $uid) === false) { return new JSONResponse( ['error' => 'You are not a member of this project.'], Http::STATUS_FORBIDDEN ); } + // Off every user list; an owner who leaves hands over to a manager first, else a member + // (projects-members-and-roles task 5.2), so the project is never owner-less. + $updated = $roles->withoutUser(project: $project, uid: $uid); + // Guard: refuse to orphan the project. - $remainingMembers = array_values(array_filter($members, static fn ($member) => $member !== $uid)); - if (count($remainingMembers) === 0) { + if ($roles->hasWriters(project: $updated) === false) { return new JSONResponse( ['error' => 'Cannot leave a project with no remaining members. Delete the project instead.'], Http::STATUS_UNPROCESSABLE_ENTITY ); } - // WF2 fix: when the owner leaves, transfer ownership to the alphabetically - // first remaining member so the project is never in an owner-less state. - // Alphabetical sort is deterministic and requires no extra user input. - $updated = $project; - $updated['members'] = $remainingMembers; - - $currentOwner = ($project['owner'] ?? ''); - if ($currentOwner === $uid) { - $candidateMembers = $remainingMembers; - sort($candidateMembers); - $newOwner = $candidateMembers[0]; - $updated['owner'] = $newOwner; + if (($project['owner'] ?? '') === $uid) { $this->logger->info( 'Planninq: ownership transferred on owner leave', - ['fromUid' => $uid, 'toUid' => $newOwner, 'projectId' => $projectId] + ['fromUid' => $uid, 'toUid' => ($updated['owner'] ?? ''), 'projectId' => $projectId] ); } diff --git a/lib/Controller/ProjectImportController.php b/lib/Controller/ProjectImportController.php new file mode 100644 index 00000000..b2bd7c36 --- /dev/null +++ b/lib/Controller/ProjectImportController.php @@ -0,0 +1,186 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-2.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Controller; + +use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\Exception\MsProjectImportException; +use OCA\Planninq\Service\MsProjectImportService; +use OCA\Planninq\Service\MsProjectPlanParser; +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IGroupManager; +use OCP\IRequest; +use OCP\IUserSession; +use Psr\Log\LoggerInterface; + +/** + * Microsoft Project import endpoints. + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-2.1 + */ +class ProjectImportController extends Controller { + + /** + * Constructor. + * + * @param IRequest $request The request. + * @param MsProjectImportService $importService Previews and writes the plan. + * @param ProjectMembershipService $membership Reads the project's owner. + * @param IUserSession $userSession The caller. + * @param IGroupManager $groupManager Tells an admin. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + IRequest $request, + private MsProjectImportService $importService, + private ProjectMembershipService $membership, + private IUserSession $userSession, + private IGroupManager $groupManager, + private LoggerInterface $logger, + ) { + parent::__construct(appName: Application::APP_ID, request: $request); + }//end __construct() + + /** + * Preview importing the uploaded plan into the project; writes nothing. + * + * @param string $projectId The project UUID. + * + * @return JSONResponse 200 with counts, sample, losses, updates and missing titles; 401, 403, 404, 400 or 422 otherwise. + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-2.1 + */ + #[NoAdminRequired] + public function preview(string $projectId): JSONResponse { + $refusal = $this->refusal(projectId: $projectId); + if ($refusal !== null) { + return $refusal; + } + + return $this->withUpload( + run: fn (string $content, string $name): JSONResponse => new JSONResponse( + $this->importService->preview(projectId: $projectId, content: $content, fileName: $name) + ) + ); + }//end preview() + + /** + * Import the uploaded plan into the project. + * + * @param string $projectId The project UUID. + * + * @return JSONResponse 200 with what was created and updated; 500 with how far it got when it stopped; 401, 403, 404, 400 or 422 otherwise. + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-2.2 + */ + #[NoAdminRequired] + public function import(string $projectId): JSONResponse { + $refusal = $this->refusal(projectId: $projectId); + if ($refusal !== null) { + return $refusal; + } + + return $this->withUpload( + run: function (string $content, string $name) use ($projectId): JSONResponse { + $result = $this->importService->import(projectId: $projectId, content: $content, fileName: $name); + if (isset($result['error']) === true) { + $result['error'] = 'The import stopped part-way. Run it again to finish it.'; + return new JSONResponse($result, Http::STATUS_INTERNAL_SERVER_ERROR); + } + + return new JSONResponse($result); + } + ); + }//end import() + + /** + * Why the caller may not import into this project, or null when they may. + * + * Owner-or-admin guard (IDOR): a project member who is not the owner, and + * anyone else, is refused. + * + * @param string $projectId The project UUID. + * + * @return JSONResponse|null + */ + private function refusal(string $projectId): ?JSONResponse { + $user = $this->userSession->getUser(); + if ($user === null) { + return new JSONResponse(['error' => 'Authentication required.'], Http::STATUS_UNAUTHORIZED); + } + + $owner = $this->membership->ownerOfProject(projectId: $projectId); + if ($owner === null) { + return new JSONResponse(['error' => 'Project not found.'], Http::STATUS_NOT_FOUND); + } + + $uid = $user->getUID(); + if ($owner !== $uid && $this->groupManager->isAdmin($uid) === false) { + $this->logger->info('Planninq: refused a plan import by someone who is not the project owner', ['project' => $projectId]); + return new JSONResponse(['error' => 'Only the project owner can import a plan.'], Http::STATUS_FORBIDDEN); + } + + return null; + }//end refusal() + + /** + * Read the uploaded file and run the preview or import on it. + * + * @param callable(string,string):JSONResponse $run What to do with the content and file name. + * + * @return JSONResponse + */ + private function withUpload(callable $run): JSONResponse { + $file = $this->request->getUploadedFile('file'); + if (is_array($file) === false + || (int)($file['error'] ?? UPLOAD_ERR_NO_FILE) !== UPLOAD_ERR_OK + || is_readable((string)($file['tmp_name'] ?? '')) === false + ) { + return new JSONResponse(['error' => 'Choose a file to import.', 'reason' => 'noFile'], Http::STATUS_BAD_REQUEST); + } + + if ((int)($file['size'] ?? 0) > MsProjectPlanParser::MAX_BYTES) { + return new JSONResponse( + ['error' => 'The file is larger than 10 MB.', 'reason' => MsProjectImportException::TOO_LARGE], + Http::STATUS_UNPROCESSABLE_ENTITY + ); + } + + try { + return $run((string)file_get_contents((string)$file['tmp_name']), (string)($file['name'] ?? '')); + } catch (MsProjectImportException $e) { + return new JSONResponse(['error' => $e->getMessage(), 'reason' => $e->getReason()], Http::STATUS_UNPROCESSABLE_ENTITY); + } catch (\Throwable $e) { + $this->logger->error('Planninq: Microsoft Project import failed', ['exception' => $e->getMessage()]); + return new JSONResponse(['error' => 'The plan could not be read. Please try again.'], Http::STATUS_INTERNAL_SERVER_ERROR); + } + }//end withUpload() +}//end class diff --git a/lib/Controller/SettingsController.php b/lib/Controller/SettingsController.php index 8c485ddf..e8f097bd 100644 --- a/lib/Controller/SettingsController.php +++ b/lib/Controller/SettingsController.php @@ -25,8 +25,13 @@ namespace OCA\Planninq\Controller; use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\Service\NotificationSwitchService; +use OCA\Planninq\Service\TaskCalendarExportService; +use OCA\Planninq\Service\WorkingCalendarService; use OCA\Planninq\Service\RegisterImportService; +use OCA\Planninq\Service\RiskScaleService; use OCA\Planninq\Service\SettingsService; +use OCA\Planninq\Service\TimetableGridService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\JSONResponse; @@ -46,6 +51,11 @@ class SettingsController extends Controller { * @param SettingsService $settingsService The settings service * @param RegisterImportService $registerImport The register import service * @param IUserSession $userSession The user session + * @param RiskScaleService $riskScale Finds the risks a smaller risk scale would strand + * @param TimetableGridService $timetableGrid The timetable week grid and generator budget + * @param NotificationSwitchService $switches The user's notification switches (collaboration-notifications) + * @param TaskCalendarExportService $taskExport The user's export to Nextcloud Tasks (planning-calendar) + * @param WorkingCalendarService $workingCalendar The working weekdays and non-working days (planning-timeline-editing) * * @return void */ @@ -54,6 +64,11 @@ public function __construct( private SettingsService $settingsService, private RegisterImportService $registerImport, private IUserSession $userSession, + private RiskScaleService $riskScale, + private TimetableGridService $timetableGrid, + private NotificationSwitchService $switches, + private TaskCalendarExportService $taskExport, + private WorkingCalendarService $workingCalendar, ) { parent::__construct(appName: Application::APP_ID, request: $request); }//end __construct() @@ -69,14 +84,25 @@ public function __construct( * @return JSONResponse * * @spec openspec/changes/retrofit-2026-05-24-annotate-planix/tasks.md#task-4 + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-1.2 + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-1.2 + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.1 + * @spec openspec/changes/archive/2026-09-30-planning-timeline-editing/tasks.md#task-1.1 */ public function index(): JSONResponse { - if ($this->userSession->getUser() === null) { + $user = $this->userSession->getUser(); + if ($user === null) { return new JSONResponse(['error' => 'Not authenticated.'], Http::STATUS_UNAUTHORIZED); } return new JSONResponse( - $this->settingsService->getSettings() + array_merge( + $this->settingsService->getSettings(), + $this->timetableGrid->settings(), + $this->workingCalendar->settings(), + $this->switches->values($user->getUID()), + $this->taskExport->values(userId: $user->getUID()) + ) ); }//end index() @@ -89,6 +115,8 @@ public function index(): JSONResponse { * @return JSONResponse * * @spec openspec/changes/retrofit-2026-05-24-annotate-planix/tasks.md#task-4 + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-1.2 + * @spec openspec/changes/archive/2026-09-30-planning-timeline-editing/tasks.md#task-1.1 */ public function create(): JSONResponse { if ($this->settingsService->isCurrentUserAdmin() === false) { @@ -99,7 +127,20 @@ public function create(): JSONResponse { } $data = $this->request->getParams(); - $config = $this->settingsService->updateSettings($data); + if (array_key_exists(RiskScaleService::CONFIG_KEY, $data) === true) { + $scale = $this->riskScale->normalise(raw: (string)$data[RiskScaleService::CONFIG_KEY]); + $refused = $this->refuseRiskScale(scale: $scale); + if ($refused !== null) { + return $refused; + } + + // Store the normalised form: trimmed labels, integer levels. + $data[RiskScaleService::CONFIG_KEY] = (string)json_encode($scale); + } + + $this->timetableGrid->save(data: $data); + $this->workingCalendar->save(data: $data); + $config = array_merge($this->settingsService->updateSettings($data), $this->timetableGrid->settings(), $this->workingCalendar->settings()); return new JSONResponse( [ @@ -109,6 +150,39 @@ public function create(): JSONResponse { ); }//end create() + /** + * The refusal of a risk scale that is malformed or that risks still exceed, or null to go on. + * + * @param array|null $scale The normalised scale, or null when it did not parse. + * + * @return JSONResponse|null + * + * @spec openspec/changes/projects-overview-logs-risks/tasks.md#task-3.4 + */ + private function refuseRiskScale(?array $scale): ?JSONResponse { + if ($scale === null) { + return new JSONResponse( + ['error' => 'risk-scale-invalid', 'message' => 'The risk scale is not valid.'], + Http::STATUS_BAD_REQUEST + ); + } + + $conflict = $this->riskScale->conflict(levels: (int)$scale['levels']); + if ($conflict === null) { + return null; + } + + return new JSONResponse( + [ + 'error' => 'risk-scale-in-use', + 'message' => $this->riskScale->refusal(count: $conflict['count'], level: $conflict['level']), + 'count' => $conflict['count'], + 'level' => $conflict['level'], + ], + Http::STATUS_CONFLICT + ); + }//end refuseRiskScale() + /** * Update app settings (PUT /api/settings). * @@ -143,6 +217,8 @@ public function update(): JSONResponse { * @return JSONResponse * * @spec openspec/changes/due-date-reminder-dispatch/tasks.md#1 + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-1.2 + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.1 */ public function updateUser(): JSONResponse { $user = $this->userSession->getUser(); @@ -151,7 +227,13 @@ public function updateUser(): JSONResponse { } $data = $this->request->getParams(); - $config = $this->settingsService->updateUserSettings($user->getUID(), $data); + $this->switches->apply(userId: $user->getUID(), data: $data); + $this->taskExport->apply(userId: $user->getUID(), data: $data); + $config = array_merge( + $this->settingsService->updateUserSettings($user->getUID(), $data), + $this->switches->values($user->getUID()), + $this->taskExport->values(userId: $user->getUID()) + ); return new JSONResponse( [ diff --git a/lib/Controller/SetupController.php b/lib/Controller/SetupController.php index ad995c9e..334b9a77 100644 --- a/lib/Controller/SetupController.php +++ b/lib/Controller/SetupController.php @@ -65,6 +65,19 @@ class SetupController extends Controller { */ private const DEMO_DECIDED_KEY = 'demo_data_decided'; + /** + * App-config key holding the dataset the operator picked. + * + * The wizard's `choice` step writes it through `POST /api/setup/config`, and + * the `run-action` step that follows reads it back. Two steps rather than + * one because `CnSetupWizard::runAction()` posts to + * `/api/setup/action/{action}` with no body: an action cannot carry the + * answer, so the answer has to be stored before the action runs. + * + * @var string + */ + private const DATASET_KEY = 'demo_dataset'; + /** * Constructor. * @@ -99,19 +112,77 @@ public function __construct( #[AuthorizedAdminSetting(AdminSettings::class)] public function status(): JSONResponse { $demoDecided = $this->appConfig->getValueString(Application::APP_ID, self::DEMO_DECIDED_KEY, '') !== ''; + $picked = $this->appConfig->getValueString(Application::APP_ID, self::DATASET_KEY, ''); return new JSONResponse( data: [ 'version' => self::SETUP_VERSION, 'completed' => true, + // The choice step reads its options from here: it declares + // `optionsSource: datasets` and no options of its own, so a + // dataset missing from this list is a dataset nobody can pick. + 'datasets' => $this->demoDataService->listChoices(), 'steps' => [ - 'demo-data' => ['done' => $demoDecided], + 'demo-data' => ['done' => ($picked !== '')], + // "None" is an ANSWER, so the load step is finished the moment + // it is chosen: there is nothing left for the operator to run. + 'load-demo-data' => [ + 'done' => ($demoDecided === true || $picked === DemoDataService::NONE_DATASET), + ], ], ] ); }//end status() + /** + * Persist the wizard's `choice` answer. + * + * @return JSONResponse `{ success, config }`. + * + * @spec exclude Setup config write; ADR-042 contract, no per-app behavioural spec. + */ + #[AuthorizedAdminSetting(AdminSettings::class)] + public function saveConfig(): JSONResponse { + // 🔴 ONE NAMED KEY, NEVER A CALLER-SUPPLIED ONE. The body arrives from + // the browser and this app's own settings share the appconfig namespace, + // so looping over the posted keys would let this endpoint write any of + // them. The key is written in the source; only its value comes from the + // request. + $value = $this->request->getParam(self::DATASET_KEY); + if ($value === null) { + return new JSONResponse(data: ['success' => true, 'config' => []]); + } + + // The step is not `multiple`, but the wizard's contract allows a list, so + // both shapes are read rather than one of them reaching `(string)`. + $submitted = $value; + if (is_array($value) === true) { + $submitted = ($value[0] ?? null); + } + + if (is_scalar($submitted) === false) { + return new JSONResponse( + data: ['success' => false, 'message' => 'A dataset is named by a string.'], + statusCode: Http::STATUS_BAD_REQUEST, + ); + } + + $datasetId = (string)$submitted; + $known = array_column($this->demoDataService->listChoices(), 'id'); + if (in_array($datasetId, $known, true) === false) { + return new JSONResponse( + data: ['success' => false, 'message' => 'No dataset is called "' . $datasetId . '".'], + statusCode: Http::STATUS_BAD_REQUEST, + ); + } + + $this->appConfig->setValueString(Application::APP_ID, self::DATASET_KEY, $datasetId); + + return new JSONResponse(data: ['success' => true, 'config' => [self::DATASET_KEY => $datasetId]]); + + }//end saveConfig() + /** * Run a privileged server-side setup action. * @@ -125,15 +196,23 @@ public function status(): JSONResponse { */ #[AuthorizedAdminSetting(AdminSettings::class)] public function runAction(string $actionId): JSONResponse { - if ($actionId === 'install-demo-data') { - return $this->installDemoData(); + // `install-demo-data` is the id the step used before it asked WHICH + // dataset, and it still means "import the one this app ships". Kept so + // an older manifest, a runbook or a script that posts it keeps working. + if ($actionId === 'load-demo-data' || $actionId === 'install-demo-data') { + return $this->loadDataset(actionId: $actionId); } // DECLINING IS AN ANSWER — see DEMO_DECIDED_KEY. + // + // 🔴 AND IT ANSWERS *BOTH* STEPS. The wizard now has a choice step and a + // run-action step; closing only the second leaves the first outstanding, + // and CnAppRoot opens the wizard while ANY optional step is outstanding. if ($actionId === 'skip-demo-data') { + $this->appConfig->setValueString(Application::APP_ID, self::DATASET_KEY, DemoDataService::NONE_DATASET); $this->appConfig->setValueString(Application::APP_ID, self::DEMO_DECIDED_KEY, 'skipped'); - return new JSONResponse(data: ['success' => true, 'message' => 'Demo data skipped.']); + return new JSONResponse(data: ['success' => true, 'message' => 'No example data was loaded.']); } return new JSONResponse( @@ -144,7 +223,10 @@ public function runAction(string $actionId): JSONResponse { }//end runAction() /** - * Import the shipped demo dataset. + * Import the dataset the operator picked in the previous step. + * + * @param string $actionId The action that asked, which decides whether an + * unanswered choice is refused or means the shipped set. * * Reports the FAILURE rather than a quiet success: an operator who asked for * demo data and got none must be told, which is why DemoDataService::install() @@ -152,7 +234,31 @@ public function runAction(string $actionId): JSONResponse { * * @return JSONResponse `{ success, message }`. */ - private function installDemoData(): JSONResponse { + private function loadDataset(string $actionId): JSONResponse { + $picked = $this->appConfig->getValueString(Application::APP_ID, self::DATASET_KEY, ''); + + // The legacy id carries no answer, so it means the shipped dataset. A + // caller that posts it has said which one by posting it. + if ($actionId === 'install-demo-data' && $picked === '') { + $picked = DemoDataService::DEMO_DATASET; + } + + // 🔴 NO SILENT DEFAULT. Importing here because the operator clicked Run + // one step early would plant example objects nobody asked for, which is + // the failure this whole step exists to avoid. + if ($picked === '') { + return new JSONResponse( + data: ['success' => false, 'message' => 'Pick a dataset first.'], + statusCode: Http::STATUS_BAD_REQUEST, + ); + } + + if ($picked === DemoDataService::NONE_DATASET) { + $this->appConfig->setValueString(Application::APP_ID, self::DEMO_DECIDED_KEY, 'skipped'); + + return new JSONResponse(data: ['success' => true, 'message' => 'No example data was loaded.']); + } + try { $imported = $this->demoDataService->install(); } catch (\Throwable $e) { @@ -176,5 +282,5 @@ private function installDemoData(): JSONResponse { ] ); - }//end installDemoData() + }//end loadDataset() }//end class diff --git a/lib/Controller/TimelineController.php b/lib/Controller/TimelineController.php index e8a6d330..ed5d354a 100644 --- a/lib/Controller/TimelineController.php +++ b/lib/Controller/TimelineController.php @@ -79,6 +79,13 @@ class TimelineController extends Controller { */ private const OR_OBJECT_SERVICE = 'OCA\\OpenRegister\\Service\\ObjectService'; + /** + * The most projects one multi-project timeline read accepts. + * + * @var integer + */ + private const MAX_PROJECTS = 50; + /** * Constructor for the TimelineController. * @@ -203,6 +210,204 @@ public function forProject(string $projectId, ?string $from = null, ?string $to }//end forProject() + /** + * Return several projects on one time axis, for the portfolio timeline. + * + * Each id is read through the same RBAC-scoped find as `forProject()`. A + * project the caller cannot read is listed under `skipped` and none of its + * tasks are read. Every readable project comes back with its summary span + * (its planned dates, else the earliest start and latest due date of its + * tasks), its phases and its task rows. `dependencies` holds every stored + * edge whose two ends are tasks in the answer, across projects too. + * + * @param string $projects Comma-separated project UUIDs, at most MAX_PROJECTS. + * + * @return JSONResponse 200 with {projects, dependencies, skipped}; 400 over the + * limit; 401 if unauthenticated; 503 if OR is unavailable. + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-3.1 + */ + #[NoAdminRequired] + #[NoCSRFRequired] + public function forProjects(string $projects = ''): JSONResponse { + if ($this->userSession->getUser() === null) { + return new JSONResponse(['error' => 'Authentication required.'], Http::STATUS_UNAUTHORIZED); + } + + $ids = array_values(array_unique(array_filter(array_map('trim', explode(',', $projects)), static fn (string $id): bool => $id !== ''))); + if (count($ids) > self::MAX_PROJECTS) { + return new JSONResponse( + ['error' => 'At most '.self::MAX_PROJECTS.' projects can be read at once.'], + Http::STATUS_BAD_REQUEST + ); + } + + if ($ids === []) { + return new JSONResponse(['projects' => [], 'dependencies' => [], 'skipped' => []]); + } + + try { + $objectService = $this->container->get(self::OR_OBJECT_SERVICE); + } catch (\Throwable $e) { + $this->logger->error('Planninq: OpenRegister ObjectService unavailable', ['exception' => $e->getMessage()]); + return new JSONResponse(['error' => 'OpenRegister is not available.'], Http::STATUS_SERVICE_UNAVAILABLE); + } + + $answer = ['projects' => [], 'skipped' => []]; + $taskIdSet = []; + foreach ($ids as $projectId) { + $entry = $this->projectEntry(objectService: $objectService, projectId: $projectId); + if ($entry === null) { + $answer['skipped'][] = $projectId; + continue; + } + + foreach (array_merge($entry['tasks'], $entry['unscheduled']) as $row) { + $taskIdSet[$row['id']] = true; + } + + $answer['projects'][] = $entry; + } + + $edges = $this->fetchProjectDependencies(objectService: $objectService, taskIdSet: $taskIdSet); + + return new JSONResponse( + [ + 'projects' => $answer['projects'], + 'dependencies' => array_values(array_filter($edges, static fn (array $edge): bool => isset($taskIdSet[$edge['blocked']]))), + 'skipped' => $answer['skipped'], + ] + ); + + }//end forProjects() + + /** + * One project of the multi-project answer, or null when the caller cannot read it. + * + * @param object $objectService The OR ObjectService. + * @param string $projectId UUID of the project. + * + * @return array|null + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-3.1 + */ + private function projectEntry(object $objectService, string $projectId): ?array { + // The shared service keeps resolution state between callers (see forProject()). + if (method_exists($objectService, 'clearCurrents') === true) { + $objectService->clearCurrents(); + } + + $objectService->setRegister(self::REGISTER); + $objectService->setSchema('project'); + $project = $objectService->find(id: $projectId); + if ($project === null) { + return null; + } + + $data = $this->extractData(row: $project); + $scheduled = []; + $unscheduled = []; + foreach ($this->fetchProjectTasks(objectService: $objectService, projectId: $projectId) as $task) { + $row = $this->timelineRow(task: $task); + if ($row['startDate'] === null && $row['dueDate'] === null) { + unset($row['startDate'], $row['dueDate'], $row['duration']); + $unscheduled[] = $row; + continue; + } + + $scheduled[] = $row; + } + + $span = $this->summarySpan(project: $data, tasks: $scheduled); + + return [ + 'id' => $projectId, + 'title' => (string)($data['title'] ?? ''), + 'status' => (string)($data['status'] ?? ''), + 'spanStart' => $span[0], + 'spanEnd' => $span[1], + 'phases' => $this->fetchProjectPhases(objectService: $objectService, projectId: $projectId), + 'tasks' => $scheduled, + 'unscheduled' => $unscheduled, + ]; + + }//end projectEntry() + + /** + * A project's summary span: its planned dates, else the earliest start and + * the latest due date of its dated tasks, else [null, null]. + * + * @param array $project The project data. + * @param array> $tasks The project's scheduled timeline rows. + * + * @return array{0: string|null, 1: string|null} + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-3.1 + */ + private function summarySpan(array $project, array $tasks): array { + $firstStart = null; + $lastDue = null; + foreach ($tasks as $row) { + $first = ($row['startDate'] ?? $row['dueDate']); + $last = ($row['dueDate'] ?? $row['startDate']); + if ($firstStart === null || $first < $firstStart) { + $firstStart = $first; + } + + if ($lastDue === null || $last > $lastDue) { + $lastDue = $last; + } + } + + return [ + ($this->nullableDate(value: ($project['startDate'] ?? null)) ?? $firstStart), + ($this->nullableDate(value: ($project['endDate'] ?? null)) ?? $lastDue), + ]; + + }//end summarySpan() + + /** + * A project's phases as {id, title, status, startDate, endDate}, in phase order. + * + * @param object $objectService The OR ObjectService. + * @param string $projectId UUID of the project. + * + * @return array> + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-3.1 + */ + private function fetchProjectPhases(object $objectService, string $projectId): array { + $results = $objectService->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: 'projectPhase', + filters: ['project' => $projectId] + ); + + $phases = []; + foreach ($this->normaliseResults(results: $results) as $row) { + $data = $this->extractData(row: $row); + $phases[] = [ + 'order' => (int)($data['order'] ?? 0), + 'id' => $this->extractId(row: $row), + 'title' => (string)($data['title'] ?? ''), + 'status' => (string)($data['status'] ?? ''), + 'startDate' => $this->nullableDate(value: ($data['startDate'] ?? null)), + 'endDate' => $this->nullableDate(value: ($data['endDate'] ?? null)), + ]; + } + + usort($phases, static fn (array $one, array $two): int => $one['order'] <=> $two['order']); + + return array_map( + static function (array $phase): array { + unset($phase['order']); + return $phase; + }, + $phases + ); + + }//end fetchProjectPhases() + /** * Fetch every task in a project as a plain data array. * @@ -259,7 +464,7 @@ private function fetchProjectTasks(object $objectService, string $projectId): ar * @param object $objectService The OR ObjectService. * @param array $taskIdSet Set of the project's task UUIDs. * - * @return array> Edges as {id, blocker, blocked}. + * @return array> Edges as {id, blocker, blocked, type}. */ private function fetchProjectDependencies(object $objectService, array $taskIdSet): array { if ($taskIdSet === []) { @@ -290,6 +495,7 @@ private function fetchProjectDependencies(object $objectService, array $taskIdSe 'id' => $this->extractId(row: $row), 'blocker' => $blocker, 'blocked' => $blocked, + 'type' => (string)($data['type'] ?? 'blocks'), ]; } diff --git a/lib/Controller/TimetableController.php b/lib/Controller/TimetableController.php new file mode 100644 index 00000000..89be3e8c --- /dev/null +++ b/lib/Controller/TimetableController.php @@ -0,0 +1,218 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-License-Identifier: EUPL-1.2 + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-signed-in-users-read-sessions-over-http-only-admins-upsert-req-006 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Controller; + +use InvalidArgumentException; +use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\Service\SettingsService; +use OCA\Planninq\Service\TimetableSessionService; +use OCA\Planninq\Settings\AdminSettings; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting; +use OCP\AppFramework\Http\Attribute\NoAdminRequired; +use OCP\AppFramework\Http\Attribute\NoCSRFRequired; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IRequest; +use OCP\IUserSession; +use RuntimeException; + +/** + * Reads and upserts timetable sessions over HTTP. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-signed-in-users-read-sessions-over-http-only-admins-upsert-req-006 + */ +class TimetableController extends Controller { + + /** + * Constructor. + * + * @param IRequest $request The request. + * @param IUserSession $userSession The current user session. + * @param TimetableSessionService $sessions The timetable rules. + * @param SettingsService $settingsService Answers whether the caller is an admin. + * + * @return void + */ + public function __construct( + IRequest $request, + private readonly IUserSession $userSession, + private readonly TimetableSessionService $sessions, + private readonly SettingsService $settingsService, + ) { + parent::__construct(appName: Application::APP_ID, request: $request); + }//end __construct() + + /** + * List the sessions of a cohort, group or teacher, optionally in a window. + * + * @param string|null $cohortId Fleet cohort id. + * @param string|null $groupReference The school's group code. + * @param string|null $teacherUserId The teacher's Nextcloud user id. + * @param string|null $teacherReference The school's teacher code. + * @param string|null $from ISO 8601 window start. + * @param string|null $to ISO 8601 window end. + * @param int|null $limit Maximum rows (default 500, capped at 1,000). + * @param bool|null $includeDrafts Include draft lessons the caller may read (default false). + * + * @return JSONResponse 200 with results; 400 on bad criteria; 401 without a user; 503 without OpenRegister. + * + * @no-admin-idor-exempt TimetableSessionService::list() reads through OpenRegister with RBAC on, + * so the timetableSession read rule answers the per-row question for this caller: admins read + * every lesson, the planninq-timetable group every published one, a teacher reads the lessons whose + * teacherUserId is their own, and any other signed-in user gets an empty list (planninq#711). + * The mandatory identity filter bounds the read. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-signed-in-users-read-sessions-over-http-only-admins-upsert-req-006 + * @spec openspec/changes/timetable-draft-review/specs/timetable-draft-review/spec.md#requirement-drafts-are-returned-only-when-the-caller-asks-for-them + */ + #[NoAdminRequired] + #[NoCSRFRequired] + public function sessions( + ?string $cohortId = null, + ?string $groupReference = null, + ?string $teacherUserId = null, + ?string $teacherReference = null, + ?string $from = null, + ?string $to = null, + ?int $limit = null, + ?bool $includeDrafts = null, + ): JSONResponse { + if ($this->userSession->getUser() === null) { + return new JSONResponse(['error' => 'Authentication required.'], Http::STATUS_UNAUTHORIZED); + } + + $criteria = array_filter( + [ + 'cohortId' => $cohortId, + 'groupReference' => $groupReference, + 'teacherUserId' => $teacherUserId, + 'teacherReference' => $teacherReference, + 'from' => $from, + 'to' => $to, + 'limit' => $limit, + 'includeDrafts' => $includeDrafts, + ], + static fn (mixed $value): bool => $value !== null && $value !== '' + ); + + try { + $results = $this->sessions->list(criteria: $criteria); + } catch (InvalidArgumentException $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST); + } catch (RuntimeException $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_SERVICE_UNAVAILABLE); + } + + return new JSONResponse( + [ + 'results' => $results, + 'total' => count($results), + 'window' => ['from' => $from, 'to' => $to], + ] + ); + }//end sessions() + + /** + * Upsert one batch of sessions from one source. Admins only. + * + * Nextcloud's admin middleware refuses everyone else before this runs; the + * explicit check below is defence in depth, as in LabelController. + * + * @return JSONResponse 200 with the upsert result; 400 on a bad body; 403 for a non-admin; 503 without OpenRegister. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-signed-in-users-read-sessions-over-http-only-admins-upsert-req-006 + */ + #[AuthorizedAdminSetting(settings: AdminSettings::class)] + public function upsert(): JSONResponse { + if ($this->settingsService->isCurrentUserAdmin() === false) { + return new JSONResponse(['error' => 'Only an admin can load a timetable by hand.'], Http::STATUS_FORBIDDEN); + } + + $sourceSystem = $this->request->getParam('sourceSystem'); + $rows = $this->request->getParam('sessions'); + + if (is_string($sourceSystem) === false || trim($sourceSystem) === '') { + return new JSONResponse(['error' => 'Name the source system of this delivery.'], Http::STATUS_BAD_REQUEST); + } + + if (is_array($rows) === false || array_is_list($rows) === false) { + return new JSONResponse(['error' => 'Send the lessons as a list under sessions.'], Http::STATUS_BAD_REQUEST); + } + + try { + $result = $this->sessions->upsert(sourceSystem: $sourceSystem, sessions: $rows); + } catch (InvalidArgumentException $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST); + } catch (RuntimeException $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_SERVICE_UNAVAILABLE); + } + + return new JSONResponse($result); + }//end upsert() + + /** + * Publish the drafts of one source in a window. Admins only. + * + * Nextcloud's admin middleware refuses everyone else before this runs; the + * explicit check below is defence in depth, as in upsert(). + * + * @return JSONResponse 200 with contractVersion, published and failed; 400 on a bad body; 403 for a non-admin; 503 without OpenRegister. + * + * @spec openspec/changes/timetable-draft-review/specs/timetable-draft-review/spec.md#requirement-an-admin-publishes-the-drafts-of-one-source-in-a-date-window + */ + #[AuthorizedAdminSetting(settings: AdminSettings::class)] + public function publish(): JSONResponse { + if ($this->settingsService->isCurrentUserAdmin() === false) { + return new JSONResponse(['error' => 'Only an admin can publish a timetable.'], Http::STATUS_FORBIDDEN); + } + + $sourceSystem = $this->request->getParam('sourceSystem'); + $from = $this->request->getParam('from'); + $to = $this->request->getParam('to'); + if (is_string($sourceSystem) === false || is_string($from) === false || is_string($to) === false) { + return new JSONResponse(['error' => 'Send sourceSystem, from and to.'], Http::STATUS_BAD_REQUEST); + } + + try { + $result = $this->sessions->publish(sourceSystem: $sourceSystem, from: $from, to: $to); + } catch (InvalidArgumentException $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST); + } catch (RuntimeException $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_SERVICE_UNAVAILABLE); + } + + return new JSONResponse($result); + }//end publish() +}//end class diff --git a/lib/Controller/TimetableInputController.php b/lib/Controller/TimetableInputController.php new file mode 100644 index 00000000..8cd5cca3 --- /dev/null +++ b/lib/Controller/TimetableInputController.php @@ -0,0 +1,109 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Controller; + +use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\Service\SettingsService; +use OCA\Planninq\Service\TimetableCsvParser; +use OCA\Planninq\Service\TimetableInputBuilder; +use OCA\Planninq\Settings\AdminSettings; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting; +use OCP\AppFramework\Http\JSONResponse; +use OCP\IRequest; + +/** + * Takes the uploaded rooms and activities sheets. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ +class TimetableInputController extends Controller { + + /** + * Constructor. + * + * @param IRequest $request The request. + * @param TimetableCsvParser $parser Reads the sheets. + * @param TimetableInputBuilder $inputBuilder Keeps the parsed sheets. + * @param SettingsService $settingsService Answers whether the caller is an admin. + * + * @return void + */ + public function __construct( + IRequest $request, + private readonly TimetableCsvParser $parser, + private readonly TimetableInputBuilder $inputBuilder, + private readonly SettingsService $settingsService, + ) { + parent::__construct(appName: Application::APP_ID, request: $request); + }//end __construct() + + /** + * Parse and keep the rooms and activities sheets. Admins only. + * + * Nextcloud's admin middleware refuses everyone else before this runs; the + * explicit check is defence in depth, as in TimetableController::upsert(). + * Nothing is kept when either sheet has a refused line. + * + * @return JSONResponse 200 with the counts; 400 with the refused lines; 403 for a non-admin. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + #[AuthorizedAdminSetting(settings: AdminSettings::class)] + public function upload(): JSONResponse { + if ($this->settingsService->isCurrentUserAdmin() === false) { + return new JSONResponse(['error' => 'Only an admin can upload timetable activities.'], Http::STATUS_FORBIDDEN); + } + + $roomsCsv = $this->request->getParam('rooms'); + $activitiesCsv = $this->request->getParam('activities'); + if (is_string($roomsCsv) === false || is_string($activitiesCsv) === false) { + return new JSONResponse(['error' => 'Send the rooms and the activities sheet as text.'], Http::STATUS_BAD_REQUEST); + } + + $rooms = $this->parser->parseRooms(csv: $roomsCsv); + $types = array_values(array_unique(array_column($rooms['rows'], 'type'))); + $activities = $this->parser->parseActivities(csv: $activitiesCsv, roomTypes: $types); + $errors = [ + 'rooms' => $rooms['errors'], + 'activities' => $activities['errors'], + ]; + if ($rooms['errors'] !== [] || $activities['errors'] !== []) { + return new JSONResponse(['error' => 'Some lines were refused. Nothing was kept.', 'errors' => $errors], Http::STATUS_BAD_REQUEST); + } + + $this->inputBuilder->storeUpload(rooms: $rooms['rows'], activities: $activities['rows']); + + return new JSONResponse( + [ + 'rooms' => count($rooms['rows']), + 'activities' => count($activities['rows']), + 'lessons' => array_sum(array_column($activities['rows'], 'lessonsPerWeek')), + ] + ); + }//end upload() +}//end class diff --git a/lib/Controller/TimetableScenarioController.php b/lib/Controller/TimetableScenarioController.php new file mode 100644 index 00000000..5c6aa3a4 --- /dev/null +++ b/lib/Controller/TimetableScenarioController.php @@ -0,0 +1,145 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Controller; + +use InvalidArgumentException; +use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\BackgroundJob\GenerateTimetableScenario; +use OCA\Planninq\Service\SettingsService; +use OCA\Planninq\Service\TimetableGenerationService; +use OCA\Planninq\Service\TimetableScenarioImporter; +use OCA\Planninq\Service\TimetableScenarioPublisher; +use OCA\Planninq\Settings\AdminSettings; +use OCP\AppFramework\Controller; +use OCP\AppFramework\Http; +use OCP\AppFramework\Http\Attribute\AuthorizedAdminSetting; +use OCP\AppFramework\Http\JSONResponse; +use OCP\BackgroundJob\IJobList; +use OCP\IRequest; + +/** + * The generate, import and publish endpoints of timetable scenarios. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-6.1 + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-8.1 + */ +class TimetableScenarioController extends Controller { + + /** + * Constructor. + * + * @param IRequest $request The request. + * @param TimetableGenerationService $generation Queues the run. + * @param IJobList $jobList Runs it in the background. + * @param SettingsService $settingsService Tells whether the user is an admin. + * @param TimetableScenarioImporter $importer Takes the current timetable into a scenario. + * @param TimetableScenarioPublisher $publisher Writes a scenario as draft lessons. + * + * @return void + */ + public function __construct( + IRequest $request, + private readonly TimetableGenerationService $generation, + private readonly IJobList $jobList, + private readonly SettingsService $settingsService, + private readonly TimetableScenarioImporter $importer, + private readonly TimetableScenarioPublisher $publisher, + ) { + parent::__construct(appName: Application::APP_ID, request: $request); + }//end __construct() + + /** + * Queue a generator run for a scenario; the page follows its progress on the stored scenario. + * + * @param string $id The scenario id. + * + * @return JSONResponse + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ + #[AuthorizedAdminSetting(settings: AdminSettings::class)] + public function generate(string $id): JSONResponse { + if ($this->settingsService->isCurrentUserAdmin() === false) { + return new JSONResponse(['error' => 'Only an admin can generate a timetable.'], Http::STATUS_FORBIDDEN); + } + + try { + $scenario = $this->generation->queue(id: $id); + } catch (InvalidArgumentException $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST); + } + + $this->jobList->add(GenerateTimetableScenario::class, ['scenario' => $id]); + + return new JSONResponse(['id' => $id, 'status' => $scenario['status'], 'lessons' => count($scenario['input']['lessons'])], Http::STATUS_ACCEPTED); + }//end generate() + /** + * Fill an imported scenario from the scheduled lessons of its week, scored like a generated one. + * + * @param string $id The scenario id. + * + * @return JSONResponse + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-6.1 + */ + #[AuthorizedAdminSetting(settings: AdminSettings::class)] + public function importCurrent(string $id): JSONResponse { + if ($this->settingsService->isCurrentUserAdmin() === false) { + return new JSONResponse(['error' => 'Only an admin can take the current timetable into a scenario.'], Http::STATUS_FORBIDDEN); + } + + try { + $scenario = $this->importer->importInto(id: $id); + } catch (InvalidArgumentException $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST); + } + + return new JSONResponse(['id' => $id, 'status' => $scenario['status'], 'metrics' => $scenario['metrics']]); + }//end importCurrent() + /** + * Write a finished scenario's placements as draft lessons for every week of its window. + * + * @param string $id The scenario id. + * + * @return JSONResponse + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-8.1 + */ + #[AuthorizedAdminSetting(settings: AdminSettings::class)] + public function publishDrafts(string $id): JSONResponse { + if ($this->settingsService->isCurrentUserAdmin() === false) { + return new JSONResponse(['error' => 'Only an admin can publish a timetable scenario.'], Http::STATUS_FORBIDDEN); + } + + try { + $result = $this->publisher->publishDrafts(id: $id); + } catch (InvalidArgumentException $e) { + return new JSONResponse(['error' => $e->getMessage()], Http::STATUS_BAD_REQUEST); + } + + return new JSONResponse(array_merge(['id' => $id], $result)); + }//end publishDrafts() +}//end class diff --git a/lib/Event/TimetableActivitiesQueryEvent.php b/lib/Event/TimetableActivitiesQueryEvent.php new file mode 100644 index 00000000..72b74d83 --- /dev/null +++ b/lib/Event/TimetableActivitiesQueryEvent.php @@ -0,0 +1,148 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Event; + +use OCP\EventDispatcher\Event; + +/** + * A request for the activities and rooms of one academic year. + * + * An activity row: group, subject, teacher (a Nextcloud user id), lessonsPerWeek, + * lessonLength (in periods) and roomType. A room row: reference, capacity, type. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ +class TimetableActivitiesQueryEvent extends Event { + + /** + * Contract version of this event and its answer. + * + * @var integer + */ + public const CONTRACT_VERSION = 1; + + /** + * The activities, once an app answered. + * + * @var array>|null + */ + private ?array $activities = null; + + /** + * The rooms, once an app answered. + * + * @var array> + */ + private array $rooms = []; + + /** + * The app that answered. + * + * @var string|null + */ + private ?string $answeredBy = null; + + /** + * Constructor. + * + * @param string $academicYear The academic year asked for, such as `2026-2027`. + * + * @return void + */ + public function __construct( + private readonly string $academicYear, + ) { + parent::__construct(); + }//end __construct() + + /** + * The academic year asked for. + * + * @return string + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ + public function getAcademicYear(): string { + return $this->academicYear; + }//end getAcademicYear() + + /** + * Answer the event with the year's activities and rooms. + * + * @param string $app The answering app, such as `learniq`. + * @param array> $activities Activity rows. + * @param array> $rooms Room rows. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ + public function answer(string $app, array $activities, array $rooms): void { + $this->answeredBy = $app; + $this->activities = array_values($activities); + $this->rooms = array_values($rooms); + }//end answer() + + /** + * The activities, or null when no app answered. + * + * @return array>|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ + public function getActivities(): ?array { + return $this->activities; + }//end getActivities() + + /** + * The rooms the answering app sent. + * + * @return array> + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ + public function getRooms(): array { + return $this->rooms; + }//end getRooms() + + /** + * The app that answered, or null. + * + * @return string|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ + public function getAnsweredBy(): ?string { + return $this->answeredBy; + }//end getAnsweredBy() +}//end class diff --git a/lib/Event/TimetableSessionsQueryEvent.php b/lib/Event/TimetableSessionsQueryEvent.php new file mode 100644 index 00000000..f1247498 --- /dev/null +++ b/lib/Event/TimetableSessionsQueryEvent.php @@ -0,0 +1,173 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-License-Identifier: EUPL-1.2 + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Event; + +use OCP\EventDispatcher\Event; + +/** + * A request to list timetable sessions by cohort, group or teacher. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ +class TimetableSessionsQueryEvent extends Event { + + /** + * Contract version of this event and its result. + * + * Version 2 (DECISIONS row 53): a query may name only a `courseId`, and + * every lesson carries `courseId` and `onlineMeetingUrl`. + * + * @var int + * + * @spec openspec/changes/timetable-course-query/specs/school-timetable/spec.md#requirement-another-app-reads-a-courses-lessons-and-their-online-link-req-007 + */ + public const CONTRACT_VERSION = 2; + + /** + * The sessions found, once planninq handled the event successfully. + * + * @var array>|null + */ + private ?array $sessions = null; + + /** + * Why the query was refused, once planninq handled it unsuccessfully. + * + * @var string|null + */ + private ?string $error = null; + + /** + * Constructor. + * + * @param string $sourceApp The app asking, e.g. `learniq`. + * @param array $criteria cohortId, groupReference, teacherUserId, teacherReference, + * from, to, limit, includeCancelled. + * + * @return void + */ + public function __construct( + private readonly string $sourceApp, + private readonly array $criteria, + ) { + parent::__construct(); + }//end __construct() + + /** + * The app asking. + * + * @return string + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function getSourceApp(): string { + return $this->sourceApp; + }//end getSourceApp() + + /** + * The query criteria. + * + * @return array + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function getCriteria(): array { + return $this->criteria; + }//end getCriteria() + + /** + * Record the sessions found; this also marks the event handled. + * + * @param array> $sessions Sessions in the contract's read shape. + * + * @return void + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function setSessions(array $sessions): void { + $this->sessions = $sessions; + $this->error = null; + }//end setSessions() + + /** + * Record why the query was refused; this also marks the event handled. + * + * @param string $error A readable reason. + * + * @return void + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function setError(string $error): void { + $this->error = $error; + $this->sessions = null; + }//end setError() + + /** + * The sessions found, or null when refused or unhandled. + * + * @return array>|null + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function getSessions(): ?array { + return $this->sessions; + }//end getSessions() + + /** + * Why the query was refused, or null. + * + * @return string|null + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function getError(): ?string { + return $this->error; + }//end getError() + + /** + * Whether planninq answered the query, with sessions or with an error. + * + * @return bool + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function isHandled(): bool { + return $this->sessions !== null || $this->error !== null; + }//end isHandled() +}//end class diff --git a/lib/Event/TimetableUpsertRequestedEvent.php b/lib/Event/TimetableUpsertRequestedEvent.php new file mode 100644 index 00000000..fc651192 --- /dev/null +++ b/lib/Event/TimetableUpsertRequestedEvent.php @@ -0,0 +1,158 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-License-Identifier: EUPL-1.2 + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Event; + +use OCP\EventDispatcher\Event; + +/** + * A request to upsert one batch of timetable sessions from one source. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ +class TimetableUpsertRequestedEvent extends Event { + + /** + * Contract version of this event and its result. + * + * @var int + */ + public const CONTRACT_VERSION = 1; + + /** + * The upsert result, once planninq handled the event. + * + * @var array|null + */ + private ?array $result = null; + + /** + * Constructor. + * + * @param string $sourceApp The app dispatching the request, e.g. `integriq`. + * @param string $sourceSystem The source every row is stored under, e.g. `roster-zermelo`. + * @param array $sessions Rows in the contract's session shape. + * @param string $correlationId The caller's job or run id, for its own logs. + * + * @return void + */ + public function __construct( + private readonly string $sourceApp, + private readonly string $sourceSystem, + private readonly array $sessions, + private readonly string $correlationId = '', + ) { + parent::__construct(); + }//end __construct() + + /** + * The app dispatching the request. + * + * @return string + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ + public function getSourceApp(): string { + return $this->sourceApp; + }//end getSourceApp() + + /** + * The source every row is stored under. + * + * @return string + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ + public function getSourceSystem(): string { + return $this->sourceSystem; + }//end getSourceSystem() + + /** + * The rows to upsert. + * + * @return array + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ + public function getSessions(): array { + return $this->sessions; + }//end getSessions() + + /** + * The caller's job or run id. + * + * @return string + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ + public function getCorrelationId(): string { + return $this->correlationId; + }//end getCorrelationId() + + /** + * Record the upsert result; this also marks the event handled. + * + * @param array $result The contract's upsert result. + * + * @return void + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ + public function setResult(array $result): void { + $this->result = $result; + }//end setResult() + + /** + * The upsert result, or null when nothing handled the event. + * + * @return array|null + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ + public function getResult(): ?array { + return $this->result; + }//end getResult() + + /** + * Whether planninq handled the event. + * + * @return bool + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ + public function isHandled(): bool { + return $this->result !== null; + }//end isHandled() +}//end class diff --git a/lib/Exception/CaseHandoverException.php b/lib/Exception/CaseHandoverException.php new file mode 100644 index 00000000..30e3f7c3 --- /dev/null +++ b/lib/Exception/CaseHandoverException.php @@ -0,0 +1,79 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Exception; + +/** + * A refused handover. + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.1 + */ +class CaseHandoverException extends \RuntimeException { + + /** + * The case app (Dossiq) is not installed. + * + * @var string + */ + public const NO_CASE_APP = 'noCaseApp'; + + /** + * The project has no case link. + * + * @var string + */ + public const NO_CASE = 'noCase'; + + /** + * The linked case does not exist or the user cannot read it. + * + * @var string + */ + public const CASE_NOT_FOUND = 'caseNotFound'; + + /** + * Constructor. + * + * @param string $reason One of the reason constants. + * @param string $message What happened, for the log. + */ + public function __construct( + private string $reason, + string $message, + ) { + parent::__construct(message: $message); + }//end __construct() + + /** + * The reason code. + * + * @return string + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.1 + */ + public function getReason(): string { + return $this->reason; + }//end getReason() +}//end class diff --git a/lib/Exception/MsProjectImportException.php b/lib/Exception/MsProjectImportException.php new file mode 100644 index 00000000..2d9b9a12 --- /dev/null +++ b/lib/Exception/MsProjectImportException.php @@ -0,0 +1,93 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-1.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Exception; + +/** + * A refused Microsoft Project file. + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-1.1 + */ +class MsProjectImportException extends \RuntimeException { + + /** + * The binary .mpp format: save the plan as XML instead. + * + * @var string + */ + public const MPP = 'mpp'; + + /** + * A DOCTYPE or entity declaration. + * + * @var string + */ + public const UNSAFE = 'unsafe'; + + /** + * Larger than 10 MB. + * + * @var string + */ + public const TOO_LARGE = 'tooLarge'; + + /** + * More than 2,000 tasks. + * + * @var string + */ + public const TOO_MANY_TASKS = 'tooManyTasks'; + + /** + * Not XML, or XML that is not a Microsoft Project plan. + * + * @var string + */ + public const NOT_A_PLAN = 'notAPlan'; + + /** + * Constructor. + * + * @param string $reason One of the reason constants. + * @param string $message What happened, for the log. + */ + public function __construct( + private string $reason, + string $message, + ) { + parent::__construct(message: $message); + }//end __construct() + + /** + * The reason code. + * + * @return string + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-1.1 + */ + public function getReason(): string { + return $this->reason; + }//end getReason() +}//end class diff --git a/lib/Lifecycle/PhaseConcludingDocumentGuard.php b/lib/Lifecycle/PhaseConcludingDocumentGuard.php new file mode 100644 index 00000000..4081ea98 --- /dev/null +++ b/lib/Lifecycle/PhaseConcludingDocumentGuard.php @@ -0,0 +1,111 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/planning-phase-gate-document/tasks.md#task-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Lifecycle; + +use OCA\OpenRegister\Lifecycle\GuardResult; +use OCA\OpenRegister\Lifecycle\LifecycleGuardInterface; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Allows closing a phase only with an attached concluding document. + * + * The register names this class in the `requires` of the phase's `complete` + * transition; OpenRegister's LifecycleGuardRegistry resolves it by class name + * through the server container. It reads one file and never writes. + * + * @spec openspec/changes/planning-phase-gate-document/tasks.md#task-1.2 + */ +class PhaseConcludingDocumentGuard implements LifecycleGuardInterface { + + /** + * The refusal every client shows when a phase cannot close yet. + * + * @var string + */ + public const MESSAGE = 'Upload the concluding document before you close this phase.'; + + /** + * OpenRegister's FileService, resolved at runtime (ADR-022). + * + * @var string + */ + private const OR_FILE_SERVICE = 'OCA\\OpenRegister\\Service\\FileService'; + + /** + * Constructor. + * + * @param ContainerInterface $container Resolves OpenRegister's FileService. + * @param LoggerInterface $logger The logger. + * + * @return void + */ + public function __construct( + private ContainerInterface $container, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Allow the transition when `concludingDocument` names a file attached to this phase. + * + * @param array $object The phase as it would be saved. + * @param string $action The transition action. + * @param string $userId The caller. + * + * @return GuardResult + * + * @SuppressWarnings(PHPMD.StaticAccess) GuardResult::allow() and ::deny() are + * OpenRegister's only constructors for the value the interface returns. + * + * @spec openspec/changes/planning-phase-gate-document/tasks.md#task-1.2 + */ + public function check(array $object, string $action, string $userId): GuardResult { + $document = trim((string)($object['concludingDocument'] ?? '')); + $phaseId = (string)($object['id'] ?? ''); + if ($document === '' || $phaseId === '') { + return GuardResult::deny(message: self::MESSAGE); + } + + try { + $file = $this->container->get(self::OR_FILE_SERVICE)->getFile(object: $phaseId, file: $document); + } catch (\Throwable $e) { + // Fail closed: a phase whose document cannot be checked does not close. + $this->logger->warning( + 'Planninq: the concluding document of a phase could not be checked', + ['phase' => $phaseId, 'action' => $action, 'user' => $userId, 'exception' => $e->getMessage()] + ); + return GuardResult::deny(message: self::MESSAGE); + } + + if ($file === null) { + return GuardResult::deny(message: self::MESSAGE); + } + + return GuardResult::allow(); + + }//end check() +}//end class diff --git a/lib/Listener/BoardFilterOwnerListener.php b/lib/Listener/BoardFilterOwnerListener.php new file mode 100644 index 00000000..419d1b7e --- /dev/null +++ b/lib/Listener/BoardFilterOwnerListener.php @@ -0,0 +1,124 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-boards-filters/tasks.md#task-3.1 + * @spec openspec/changes/archive/2026-09-30-boards-cross-project-board/tasks.md#task-1.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\IUserSession; + +/** + * Stamps and keeps the owner of a saved board filter or cross-project view. + * + * @template-implements IEventListener + * + * @spec openspec/changes/archive/2026-09-30-boards-filters/tasks.md#task-3.1 + * @spec openspec/changes/archive/2026-09-30-boards-cross-project-board/tasks.md#task-1.1 + */ +class BoardFilterOwnerListener implements IEventListener { + + /** + * The planninq schemas whose objects belong to the person who saved them. + */ + public const OWNED_SCHEMAS = ['boardFilter', 'boardView', 'taskReport']; + + /** + * Constructor. + * + * @param TaskScopeResolver $scopeResolver Tells a planninq saved filter or view from any other object. + * @param IUserSession $userSession The caller. + */ + public function __construct( + private TaskScopeResolver $scopeResolver, + private IUserSession $userSession, + ) { + }//end __construct() + + /** + * Handle a pre-save event. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-boards-filters/tasks.md#task-3.1 + * @spec openspec/changes/archive/2026-09-30-boards-cross-project-board/tasks.md#task-1.1 + */ + public function handle(Event $event): void { + if ($event instanceof ObjectCreatingEvent === true) { + $user = $this->userSession->getUser(); + if ($user !== null && $this->isOwnedObject(object: $event->getObject()) === true) { + $event->setModifiedData(array_merge($event->getModifiedData(), ['owner' => $user->getUID()])); + } + + return; + } + + if ($event instanceof ObjectUpdatingEvent === true) { + $this->keepOwner(event: $event); + } + }//end handle() + + /** + * Put the stored owner back when an update sends another one. + * + * @param ObjectUpdatingEvent $event The event. + * + * @return void + */ + private function keepOwner(ObjectUpdatingEvent $event): void { + $old = $event->getOldObject(); + if ($old === null || $this->isOwnedObject(object: $event->getNewObject()) === false) { + return; + } + + $stored = (((array)$old->getObject())['owner'] ?? null); + $sent = (((array)$event->getNewObject()->getObject())['owner'] ?? null); + if (is_string($stored) === true && $stored !== '' && $sent !== $stored) { + $event->setModifiedData(array_merge($event->getModifiedData(), ['owner' => $stored])); + } + }//end keepOwner() + + /** + * Whether the object is a planninq saved filter or cross-project view. + * + * @param object $object The object. + * + * @return bool + */ + private function isOwnedObject(object $object): bool { + $slug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + + return in_array($slug, self::OWNED_SCHEMAS, true); + }//end isOwnedObject() +}//end class diff --git a/lib/Listener/ColumnAutomationListener.php b/lib/Listener/ColumnAutomationListener.php new file mode 100644 index 00000000..ab1a47e6 --- /dev/null +++ b/lib/Listener/ColumnAutomationListener.php @@ -0,0 +1,324 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-boards-column-automation/tasks.md#task-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\IUserSession; +use Psr\Log\LoggerInterface; + +/** + * Applies a column's "when a card enters this column" rules. + * + * @template-implements IEventListener + * + * @spec openspec/changes/archive/2026-09-30-boards-column-automation/tasks.md#task-1.2 + */ +class ColumnAutomationListener implements IEventListener { + + /** + * The task schema's priority values (lib/Settings/planninq_register.json). + * + * @var array + */ + public const PRIORITIES = ['low', 'normal', 'high', 'urgent']; + + /** + * The rule actions the column schema allows, in its order. + * + * @var array + */ + public const ACTIONS = ['setPriority', 'assign', 'assignMover', 'unassign', 'addLabel']; + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Reads the column, the project's members and labels as the system. + * @param TaskScopeResolver $scopeResolver Tells a planninq task from any other object. + * @param IUserSession $userSession The person who moved the card. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectMembershipService $membership, + private TaskScopeResolver $scopeResolver, + private IUserSession $userSession, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Handle a pre-save event. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-boards-column-automation/tasks.md#task-1.2 + */ + public function handle(Event $event): void { + if ($event instanceof ObjectCreatingEvent === true) { + $this->apply(event: $event, object: $event->getObject(), oldColumn: ''); + return; + } + + if ($event instanceof ObjectUpdatingEvent === true) { + $old = $event->getOldObject(); + $oldColumn = ''; + if ($old !== null) { + $oldColumn = $this->referenceId(value: (((array)$old->getObject())['column'] ?? null)); + } + + $this->apply(event: $event, object: $event->getNewObject(), oldColumn: $oldColumn); + } + }//end handle() + + /** + * Merge the entered column's rule results into the save. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param object $object The task being saved. + * @param string $oldColumn The stored column, '' on create or from the backlog. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-boards-column-automation/tasks.md#task-1.2 + */ + private function apply(ObjectCreatingEvent|ObjectUpdatingEvent $event, object $object, string $oldColumn): void { + $slug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + if ($slug !== 'task') { + return; + } + + $task = array_merge((array)$object->getObject(), $event->getModifiedData()); + $newColumn = $this->referenceId(value: ($task['column'] ?? null)); + if ($newColumn === '' || $newColumn === $oldColumn) { + return; + } + + $rules = ($this->membership->objectData(schema: 'column', id: $newColumn)['automation'] ?? []); + if (is_array($rules) === false || $rules === []) { + return; + } + + $changes = $this->run(rules: array_values($rules), task: $task, column: $newColumn); + if ($changes !== []) { + $event->setModifiedData(array_merge($event->getModifiedData(), $changes)); + } + }//end apply() + + /** + * Turn the rules into field values, in list order, a later rule winning. + * + * @param array $rules The column's rules. + * @param array $task The task as it will be saved so far. + * @param string $column The column UUID, for the log. + * + * @return array The fields to merge; only those whose value changes. + * + * @spec openspec/changes/archive/2026-09-30-boards-column-automation/tasks.md#task-1.3 + */ + private function run(array $rules, array $task, string $column): array { + $changes = []; + foreach ($rules as $index => $rule) { + $action = ''; + if (is_array($rule) === true && is_string($rule['action'] ?? null) === true) { + $action = $rule['action']; + } + + $value = ''; + if (is_array($rule) === true && is_scalar($rule['value'] ?? null) === true) { + $value = (string)$rule['value']; + } + + $change = $this->ruleChange(action: $action, value: $value, task: array_merge($task, $changes)); + if ($change === null) { + $this->logger->warning( + 'Planninq: skipped a column rule whose value is not valid', + ['column' => $column, 'rule' => $index, 'action' => $action] + ); + continue; + } + + $changes = array_merge($changes, $change); + } + + $changes = $this->keepResponsibleOutOfShared(changes: $changes, task: $task); + + foreach ($changes as $field => $newValue) { + if (($task[$field] ?? null) === $newValue) { + unset($changes[$field]); + } + } + + return $changes; + }//end run() + + /** + * The responsible person is never also in `sharedWith` (tasks-assignment-priority-labels). + * + * @param array $changes The changes so far. + * @param array $task The task as it will be saved without them. + * + * @return array + */ + private function keepResponsibleOutOfShared(array $changes, array $task): array { + $responsible = ($changes['assignedTo'] ?? ''); + $shared = ($task['sharedWith'] ?? []); + if ($responsible === '' || is_array($shared) === false || in_array($responsible, $shared, true) === false) { + return $changes; + } + + $changes['sharedWith'] = array_values(array_filter($shared, static fn ($uid): bool => $uid !== $responsible)); + + return $changes; + }//end keepResponsibleOutOfShared() + + /** + * The field one rule sets, or null when the rule cannot run. + * + * @param string $action The rule's action. + * @param string $value The rule's value, '' when it has none. + * @param array $task The task as it will be saved so far. + * + * @return array|null + * + * @spec openspec/changes/archive/2026-09-30-boards-column-automation/tasks.md#task-1.3 + */ + private function ruleChange(string $action, string $value, array $task): ?array { + return match ($action) { + 'setPriority' => $this->when(valid: in_array($value, self::PRIORITIES, true), change: ['priority' => $value]), + 'assign' => $this->when(valid: $this->isProjectMember(task: $task, uid: $value), change: ['assignedTo' => $value]), + 'assignMover' => $this->moverChange(), + 'unassign' => ['assignedTo' => ''], + 'addLabel' => $this->labelChange(labelId: $value, task: $task), + default => null, + }; + }//end ruleChange() + + /** + * The change when the check passed, null otherwise. + * + * @param bool $valid Whether the rule's value passed its check. + * @param array $change The change. + * + * @return array|null + */ + private function when(bool $valid, array $change): ?array { + if ($valid === false) { + return null; + } + + return $change; + }//end when() + + /** + * Assign the person who moved the card; nothing without a session (a background job). + * + * @return array|null + */ + private function moverChange(): ?array { + $user = $this->userSession->getUser(); + if ($user === null) { + return null; + } + + return ['assignedTo' => $user->getUID()]; + }//end moverChange() + + /** + * Append an existing label once. + * + * @param string $labelId The label UUID. + * @param array $task The task as it will be saved so far. + * + * @return array|null + */ + private function labelChange(string $labelId, array $task): ?array { + if ($this->membership->objectData(schema: 'label', id: $labelId) === null) { + return null; + } + + $labels = ($task['labels'] ?? []); + if (is_array($labels) === false) { + $labels = []; + } + + $labels = array_values($labels); + if (in_array($labelId, $labels, true) === false) { + $labels[] = $labelId; + } + + return ['labels' => $labels]; + }//end labelChange() + + /** + * Whether a user is a member (or the owner) of the task's project. + * + * @param array $task The task. + * @param string $uid The user id. + * + * @return bool + */ + private function isProjectMember(array $task, string $uid): bool { + if ($uid === '') { + return false; + } + + $projectId = $this->membership->projectIdFor(schemaSlug: 'task', data: $task); + $members = $this->membership->membersOfProject(projectId: $projectId); + + return (is_array($members) === true && in_array($uid, $members, true) === true); + }//end isProjectMember() + + /** + * A reference as a UUID string: a plain string, or an object carrying `id` or `uuid`. + * + * @param mixed $value The stored reference. + * + * @return string + */ + private function referenceId(mixed $value): string { + if (is_array($value) === true) { + $value = ($value['id'] ?? ($value['uuid'] ?? null)); + } + + if (is_string($value) === false) { + return ''; + } + + return $value; + }//end referenceId() +}//end class diff --git a/lib/Listener/ColumnOwnerGuardListener.php b/lib/Listener/ColumnOwnerGuardListener.php new file mode 100644 index 00000000..cf4c0167 --- /dev/null +++ b/lib/Listener/ColumnOwnerGuardListener.php @@ -0,0 +1,195 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-1.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\OpenRegister\Event\ObjectDeletingEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\IGroupManager; +use OCP\IUserSession; +use Psr\Log\LoggerInterface; + +/** + * Refuses column writes by anyone but the project owner or an admin. + * + * @template-implements IEventListener + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-1.1 + */ +class ColumnOwnerGuardListener implements IEventListener { + + /** + * Error code put on a refused write. + * + * @var string + */ + public const ERROR_CODE = 'planninq-not-the-project-owner'; + + /** + * OpenRegister's system-operation flag, set during imports. + * + * @var string + */ + private const OR_SYSTEM_CONTEXT = 'OCA\\OpenRegister\\Service\\SystemOperationContext'; + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Reads the project's owner. + * @param TaskScopeResolver $scopeResolver Tells a planninq column from any other object. + * @param IUserSession $userSession The caller. + * @param IGroupManager $groupManager Tells an admin. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectMembershipService $membership, + private TaskScopeResolver $scopeResolver, + private IUserSession $userSession, + private IGroupManager $groupManager, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Handle a pre-save or pre-delete event. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-1.1 + */ + public function handle(Event $event): void { + if ($event instanceof ObjectCreatingEvent === true || $event instanceof ObjectDeletingEvent === true) { + $this->guard(event: $event, object: $event->getObject(), oldData: null); + return; + } + + if ($event instanceof ObjectUpdatingEvent === true) { + $old = $event->getOldObject(); + $oldData = null; + if ($old !== null) { + $oldData = (array)$old->getObject(); + } + + $this->guard(event: $event, object: $event->getNewObject(), oldData: $oldData); + } + }//end handle() + + /** + * Stop the event when the caller may not manage this column. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event The event. + * @param object $object The column. + * @param array|null $oldData The stored column, on update. + * + * @return void + */ + private function guard(ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event, object $object, ?array $oldData): void { + $slug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + if ($slug !== 'column') { + return; + } + + $data = (array)$object->getObject(); + if ($oldData !== null && $this->withoutMembers(data: $data) === $this->withoutMembers(data: $oldData)) { + return; + } + + $projectId = $this->membership->projectIdFor(schemaSlug: 'column', data: $data); + if ($this->mayManage(projectId: $projectId) === true) { + return; + } + + $event->setErrors( + [ + 'message' => 'Only the project owner can change the board columns.', + 'code' => self::ERROR_CODE, + 'project' => $projectId, + ] + ); + $event->stopPropagation(); + $this->logger->info('Planninq: refused a column change by someone who is not the project owner', ['project' => $projectId]); + }//end guard() + + /** + * Whether the caller may manage the columns of this project. + * + * @param string $projectId The project UUID. + * + * @return bool + */ + private function mayManage(string $projectId): bool { + $user = $this->userSession->getUser(); + if ($user === null || $this->isSystemOperation() === true) { + // No session (occ, cron, a repair step) or an OpenRegister system import. + return true; + } + + $uid = $user->getUID(); + if ($this->groupManager->isAdmin($uid) === true) { + return true; + } + + return ($this->membership->ownerOfProject(projectId: $projectId) === $uid); + }//end mayManage() + + /** + * A column's data without the planninq-kept members list, key order ignored. + * + * @param array $data The column data. + * + * @return array + */ + private function withoutMembers(array $data): array { + unset($data['members'], $data['@self'], $data['id']); + ksort($data); + return $data; + }//end withoutMembers() + + /** + * Whether OpenRegister is running a system operation (an import). + * + * @return bool + */ + private function isSystemOperation(): bool { + $class = self::OR_SYSTEM_CONTEXT; + return (class_exists($class) === true && $class::isActive() === true); + }//end isSystemOperation() +}//end class diff --git a/lib/Listener/FinanceLineListener.php b/lib/Listener/FinanceLineListener.php new file mode 100644 index 00000000..2682ad40 --- /dev/null +++ b/lib/Listener/FinanceLineListener.php @@ -0,0 +1,366 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-1.1 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\OpenRegister\Event\ObjectDeletingEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCA\Planninq\Service\FinanceLineService; +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\IGroupManager; +use OCP\IUserSession; +use Psr\Log\LoggerInterface; + +/** + * Guards finance line writes and keeps their access copies. + * + * @template-implements IEventListener + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-1.1 + */ +class FinanceLineListener implements IEventListener { + + /** + * Error code of a manual line write by someone who is not the project owner. + * + * @var string + */ + public const ERROR_NOT_OWNER = 'planninq-not-the-project-owner'; + + /** + * Error code of a write to a line from the finance system by anyone but the import. + * + * @var string + */ + public const ERROR_IMPORTED = 'planninq-finance-line-imported'; + + /** + * Error code of a second imported line with a finance line id already held. + * + * @var string + */ + public const ERROR_DUPLICATE = 'planninq-finance-line-exists'; + + /** + * Constructor. + * + * @param FinanceLineService $finance Access copies, project matching and duplicates. + * @param ProjectMembershipService $membership Resolves a line's project and its owner. + * @param TaskScopeResolver $scopeResolver Tells a planninq schema from any other object. + * @param IUserSession $userSession The caller. + * @param IGroupManager $groupManager Tells an admin and the import group. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private FinanceLineService $finance, + private ProjectMembershipService $membership, + private TaskScopeResolver $scopeResolver, + private IUserSession $userSession, + private IGroupManager $groupManager, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Guard and stamp a pre-save or pre-delete event on a finance line. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-1.1 + */ + public function handle(Event $event): void { + if ($event instanceof ObjectCreatingEvent === true || $event instanceof ObjectDeletingEvent === true) { + $this->route(event: $event, object: $event->getObject(), oldData: null); + return; + } + + if ($event instanceof ObjectUpdatingEvent === true) { + $old = $event->getOldObject(); + $oldData = []; + if ($old !== null) { + $oldData = (array)$old->getObject(); + } + + $this->route(event: $event, object: $event->getNewObject(), oldData: $oldData); + } + }//end handle() + + /** + * Send a finance line to the delete guard or the write guard. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event The event. + * @param object $object The line. + * @param array|null $oldData The stored line on an update. + * + * @return void + */ + private function route(ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event, object $object, ?array $oldData): void { + $slug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + if ($slug !== FinanceLineService::SCHEMA) { + return; + } + + $data = (array)$object->getObject(); + if ($event instanceof ObjectDeletingEvent === true) { + $this->guard(event: $event, data: $data, oldData: null); + return; + } + + if ($oldData !== null && $this->withoutKept(data: $data) === $this->withoutKept(data: $oldData)) { + // Only the kept copies changed: the sync after a project change. + return; + } + + $data = $this->resolveProject(event: $event, data: $data); + if ($this->guard(event: $event, data: $data, oldData: $oldData) === false) { + return; + } + + if ($this->refuseDuplicate(event: $event, data: $data, ownUuid: (string)($object->getUuid() ?? '')) === true) { + return; + } + + $projectId = $this->membership->projectIdFor(schemaSlug: FinanceLineService::SCHEMA, data: $data); + $kept = $this->finance->keptFieldsFor(projectId: $projectId); + if ($this->finance->inStep(data: $data, kept: $kept) === false) { + $event->setModifiedData(array_merge($event->getModifiedData(), $kept)); + } + }//end route() + + /** + * Refuse the write when the caller may not make it. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event The event. + * @param array $data The line's new data, or the line being deleted. + * @param array|null $oldData The stored line on an update. + * + * @return bool True when the write may go ahead. + */ + private function guard(ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event, array $data, ?array $oldData): bool { + $imported = ($this->isImported(data: $data) === true || ($oldData !== null && $this->isImported(data: $oldData) === true)); + if ($imported === true) { + if ($this->callerImports() === true) { + return true; + } + + return $this->refuse( + event: $event, + code: self::ERROR_IMPORTED, + message: 'Lines from the finance system are changed by the finance system only.', + data: $data + ); + } + + $projectId = $this->membership->projectIdFor(schemaSlug: FinanceLineService::SCHEMA, data: $data); + $oldProject = ''; + if ($oldData !== null) { + $oldProject = $this->membership->projectIdFor(schemaSlug: FinanceLineService::SCHEMA, data: $oldData); + } + + if ($this->mayWrite(projectId: $projectId) === true && ($oldProject === '' || $this->mayWrite(projectId: $oldProject) === true)) { + return true; + } + + return $this->refuse( + event: $event, + code: self::ERROR_NOT_OWNER, + message: 'Only the project owner can change the money of this project.', + data: $data + ); + }//end guard() + + /** + * Fill in the project of an imported line from its project number. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param array $data The line's new data. + * + * @return array The data with the resolved project, if any. + */ + private function resolveProject(ObjectCreatingEvent|ObjectUpdatingEvent $event, array $data): array { + if ($this->isImported(data: $data) === false + || $this->membership->projectIdFor(schemaSlug: FinanceLineService::SCHEMA, data: $data) !== '' + ) { + return $data; + } + + $projectId = $this->finance->projectIdForKey(projectKey: (string)($data['projectKey'] ?? '')); + if ($projectId === '') { + return $data; + } + + $event->setModifiedData(array_merge($event->getModifiedData(), ['project' => $projectId])); + $data['project'] = $projectId; + + return $data; + }//end resolveProject() + + /** + * Refuse a second imported line with a finance line id another line holds. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param array $data The line's new data. + * @param string $ownUuid The line's own UUID. + * + * @return bool True when the write was refused. + */ + private function refuseDuplicate(ObjectCreatingEvent|ObjectUpdatingEvent $event, array $data, string $ownUuid): bool { + if ($this->isImported(data: $data) === false) { + return false; + } + + $other = $this->finance->importedLineWith(externalRef: trim((string)($data['externalRef'] ?? '')), ownUuid: $ownUuid); + if ($other === '') { + return false; + } + + $this->refuse( + event: $event, + code: self::ERROR_DUPLICATE, + message: 'A line with this finance line id already exists. Update that line instead.', + data: $data + ['conflictingObject' => $other] + ); + + return true; + }//end refuseDuplicate() + + /** + * Stop the event with an error a client can branch on. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event The event. + * @param string $code The error code. + * @param string $message The message. + * @param array $data The line. + * + * @return bool Always false. + */ + private function refuse(ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event, string $code, string $message, array $data): bool { + $projectId = $this->membership->projectIdFor(schemaSlug: FinanceLineService::SCHEMA, data: $data); + $error = ['message' => $message, 'code' => $code, 'project' => $projectId]; + if (isset($data['conflictingObject']) === true) { + $error['conflictingObject'] = $data['conflictingObject']; + } + + $event->setErrors($error); + $event->stopPropagation(); + $this->logger->info('Planninq: refused a finance line write', ['code' => $code, 'project' => $error['project']]); + + return false; + }//end refuse() + + /** + * Whether the caller writes lines from the finance system. + * + * @return bool + */ + private function callerImports(): bool { + $user = $this->userSession->getUser(); + if ($user === null || $this->finance->isSystemOperation() === true) { + return true; + } + + $uid = $user->getUID(); + + return ($this->groupManager->isAdmin($uid) === true || $this->groupManager->isInGroup($uid, FinanceLineService::IMPORT_GROUP) === true); + }//end callerImports() + + /** + * Whether the caller may write the hand-entered money of this project. + * + * @param string $projectId The project UUID. + * + * @return bool + */ + private function mayWrite(string $projectId): bool { + $user = $this->userSession->getUser(); + if ($user === null || $this->finance->isSystemOperation() === true) { + // No session (occ, cron, a repair step) or an OpenRegister system import. + return true; + } + + $uid = $user->getUID(); + if ($this->groupManager->isAdmin($uid) === true) { + return true; + } + + return ($projectId !== '' && $this->membership->ownerOfProject(projectId: $projectId) === $uid); + }//end mayWrite() + + /** + * Whether a line came from the finance system. + * + * @param array $data The line. + * + * @return bool + */ + private function isImported(array $data): bool { + return (($data['source'] ?? '') === FinanceLineService::SOURCE_IMPORT); + }//end isImported() + + /** + * A line without the kept copies and metadata, key order ignored. + * + * @param array $data The line. + * + * @return array + */ + private function withoutKept(array $data): array { + foreach (FinanceLineService::KEPT_FIELDS as $field) { + unset($data[$field]); + } + + unset($data['@self'], $data['id']); + ksort($data); + + return $data; + }//end withoutKept() +}//end class diff --git a/lib/Listener/ForgeLinkResolveListener.php b/lib/Listener/ForgeLinkResolveListener.php new file mode 100644 index 00000000..290dab3d --- /dev/null +++ b/lib/Listener/ForgeLinkResolveListener.php @@ -0,0 +1,169 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-integration-code-forge-links/tasks.md#task-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\Planninq\Service\ForgeLinkService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use Psr\Log\LoggerInterface; + +/** + * Resolves the task and project of a new code link, or refuses it. + * + * @template-implements IEventListener + * + * @spec openspec/changes/archive/2026-09-30-integration-code-forge-links/tasks.md#task-1.2 + */ +class ForgeLinkResolveListener implements IEventListener { + + /** + * Error code of a link whose task does not resolve. + * + * @var string + */ + public const ERROR_NO_TASK = 'planninq-forge-link-no-task'; + + /** + * Error code of a second link to the same forge item on one task. + * + * @var string + */ + public const ERROR_DUPLICATE = 'planninq-forge-link-duplicate'; + + /** + * The schema this listener acts on. + * + * @var string + */ + private const SCHEMA = ForgeLinkService::SCHEMA; + + /** + * The `source` of a link the integration writes. + * + * @var string + */ + private const INTEGRATION = 'integriq'; + + /** + * Constructor. + * + * @param ForgeLinkService $forgeLinks Finds the task and the repeats of a link. + * @param TaskScopeResolver $scopeResolver Tells a code link from any other object. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ForgeLinkService $forgeLinks, + private TaskScopeResolver $scopeResolver, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Resolve or refuse a new code link. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-integration-code-forge-links/tasks.md#task-1.2 + */ + public function handle(Event $event): void { + if ($event instanceof ObjectCreatingEvent === false) { + return; + } + + $object = $event->getObject(); + $slug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + if ($slug !== self::SCHEMA) { + return; + } + + $data = (array)$object->getObject(); + $task = $this->forgeLinks->linkedTask(data: $data); + if ($task === null) { + $this->refuse(event: $event, message: 'No task has this key.', code: self::ERROR_NO_TASK, data: $data); + return; + } + + $repeats = $this->forgeLinks->repeats(taskId: $task['id'], externalId: trim((string)($data['externalId'] ?? ''))); + if ($repeats !== [] && ($data['source'] ?? '') !== self::INTEGRATION) { + $this->refuse(event: $event, message: 'This link is already on the task.', code: self::ERROR_DUPLICATE, data: $data); + return; + } + + // A later forge event about the same item replaces the integration's + // link, so its state follows the forge and no second link appears. + foreach ($repeats as $repeat) { + $this->forgeLinks->remove(id: $repeat['id']); + } + + $changes = [ + 'task' => $task['id'], + 'project' => $task['project'], + 'taskKey' => (string)($task['data']['key'] ?? ''), + ]; + if (in_array(($data['source'] ?? null), ['manual', self::INTEGRATION], true) === false) { + $changes['source'] = 'manual'; + } + + $event->setModifiedData(array_merge($event->getModifiedData(), $changes)); + }//end handle() + + /** + * Refuse the create; OpenRegister answers it with HTTP 422. + * + * @param ObjectCreatingEvent $event The event. + * @param string $message What went wrong. + * @param string $code The error code a client branches on. + * @param array $data The link as sent. + * + * @return void + */ + private function refuse(ObjectCreatingEvent $event, string $message, string $code, array $data): void { + $event->setErrors(['message' => $message, 'code' => $code, 'taskKey' => (string)($data['taskKey'] ?? '')]); + $event->stopPropagation(); + $this->logger->info('Planninq: refused a code link', ['code' => $code, 'taskKey' => ($data['taskKey'] ?? null)]); + }//end refuse() +}//end class diff --git a/lib/Listener/ProjectHierarchyGuardListener.php b/lib/Listener/ProjectHierarchyGuardListener.php new file mode 100644 index 00000000..475cb400 --- /dev/null +++ b/lib/Listener/ProjectHierarchyGuardListener.php @@ -0,0 +1,410 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-1.3 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\OpenRegister\Event\ObjectDeletingEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCA\Planninq\Service\FinanceLineService; +use OCA\Planninq\Service\ProjectMembershipService; +use OCA\Planninq\Service\ProjectRulesService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Derives portfolio readers on projects and keeps them in step with the portfolio. + * + * @template-implements IEventListener + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-1.3 + */ +class ProjectHierarchyGuardListener implements IEventListener { + + /** + * Slug of the portfolio schema. + * + * @var string + */ + public const PORTFOLIO_SCHEMA = 'projectPortfolio'; + + /** + * OpenRegister's system-operation scope, by name. + * + * @var string + */ + private const OR_SYSTEM_CONTEXT = 'OCA\\OpenRegister\\Service\\SystemOperationContext'; + + /** + * Error code of a parent that makes a project its own ancestor. + * + * @var string + */ + public const ERROR_CYCLE = 'planninq-project-cycle'; + + /** + * Error code of a parent that makes the chain deeper than three levels. + * + * @var string + */ + public const ERROR_DEPTH = 'planninq-project-too-deep'; + + /** + * Error code of a custom field value that does not fit its field. + * + * @var string + */ + public const ERROR_FIELD = 'planninq-project-field'; + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Reads portfolios and projects, writes as the system. + * @param FinanceLineService $finance Keeps the access copies on the projects' finance lines. + * @param ProjectRulesService $rules Checks a new parent and custom field values. + * @param TaskScopeResolver $scopeResolver Tells a planninq schema from any other object. + * @param ContainerInterface $container Resolves OpenRegister's ObjectService for the system write. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectMembershipService $membership, + private FinanceLineService $finance, + private ProjectRulesService $rules, + private TaskScopeResolver $scopeResolver, + private ContainerInterface $container, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Route a pre-save or pre-delete event. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-1.3 + */ + public function handle(Event $event): void { + if ($this->isSystemOperation() === true) { + return; + } + + if ($event instanceof ObjectUpdatingEvent === true) { + $oldData = []; + $old = $event->getOldObject(); + if ($old !== null) { + $oldData = (array)$old->getObject(); + } + + $this->route(event: $event, object: $event->getNewObject(), oldData: $oldData); + return; + } + + if ($event instanceof ObjectCreatingEvent === true || $event instanceof ObjectDeletingEvent === true) { + $this->route(event: $event, object: $event->getObject(), oldData: null); + } + }//end handle() + + /** + * Send a project write to the reader derivation and a portfolio write to the fan-out. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event The event. + * @param object $object The object. + * @param array|null $oldData The stored object on an update. + * + * @return void + */ + private function route(ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event, object $object, ?array $oldData): void { + $slug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + $data = (array)$object->getObject(); + + if ($slug === ProjectMembershipService::PROJECT_SCHEMA && $event instanceof ObjectDeletingEvent === false) { + if ($this->refuseParent(event: $event, projectId: (string)($object->getUuid() ?? ''), data: $data, oldData: $oldData) === true) { + return; + } + + if ($this->refuseFields(event: $event, data: $data, oldData: $oldData) === true) { + return; + } + + $this->deriveReaders(event: $event, data: $data); + return; + } + + if ($slug !== self::PORTFOLIO_SCHEMA) { + return; + } + + $portfolioId = (string)($object->getUuid() ?? ''); + if ($event instanceof ObjectDeletingEvent === true) { + $this->releaseProjects(portfolioId: $portfolioId); + return; + } + + if ($oldData !== null) { + $this->onManagersChange(portfolioId: $portfolioId, data: $data, oldData: $oldData); + } + }//end route() + + /** + * Refuse custom field values that do not fit their fields, when the write changes them. + * + * A write that leaves the values alone is not held to a field added later, + * so creating or renaming a project never fails on a new required field. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param array $data The project's new data. + * @param array|null $oldData The stored project on an update. + * + * @return bool True when the write was refused. + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-3.2 + */ + private function refuseFields(ObjectCreatingEvent|ObjectUpdatingEvent $event, array $data, ?array $oldData): bool { + $values = ($data['customFields'] ?? null); + if (is_array($values) === false || $values === ($oldData['customFields'] ?? null)) { + return false; + } + + $stored = ($oldData['customFields'] ?? []); + if (is_array($stored) === false) { + $stored = []; + } + + $problem = $this->rules->problem(values: $values, stored: $stored); + if ($problem === null) { + return false; + } + + $event->setErrors(['code' => self::ERROR_FIELD, 'message' => $problem]); + $event->stopPropagation(); + + return true; + }//end refuseFields() + + /** + * Refuse a new parent that makes a cycle or a chain deeper than three levels. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param string $projectId The project UUID. + * @param array $data The project's new data. + * @param array|null $oldData The stored project on an update. + * + * @return bool True when the write was refused. + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-2.1 + */ + private function refuseParent(ObjectCreatingEvent|ObjectUpdatingEvent $event, string $projectId, array $data, ?array $oldData): bool { + $parentId = $this->referenceId(value: ($data['parent'] ?? null)); + if ($parentId === '' || ($oldData !== null && $this->referenceId(value: ($oldData['parent'] ?? null)) === $parentId)) { + return false; + } + + if ($event instanceof ObjectCreatingEvent === true) { + $projectId = ''; + } + + $refusal = $this->rules->refusal(projectId: $projectId, parentId: $parentId); + if ($refusal === null) { + return false; + } + + $error = ['code' => self::ERROR_DEPTH, 'message' => 'Projects nest three levels deep at most: programme, project and subproject.']; + if ($refusal === ProjectRulesService::CYCLE) { + $error = ['code' => self::ERROR_CYCLE, 'message' => 'A project cannot sit under one of its own subprojects.']; + } + + $event->setErrors($error + ['project' => $projectId, 'parent' => $parentId]); + $event->stopPropagation(); + $this->logger->info('Planninq: refused a project parent', ['code' => $error['code'], 'project' => $projectId]); + + return true; + }//end refuseParent() + + /** + * Set a project's readers to the managers of its portfolio. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param array $data The project's new data. + * + * @return void + */ + private function deriveReaders(ObjectCreatingEvent|ObjectUpdatingEvent $event, array $data): void { + $readers = $this->managersOf(portfolioId: $this->referenceId(value: ($data['portfolio'] ?? null))); + if ($this->membership->normalise(members: ($data[ProjectMembershipService::READERS_FIELD] ?? [])) === $readers) { + return; + } + + $event->setModifiedData(array_merge($event->getModifiedData(), [ProjectMembershipService::READERS_FIELD => $readers])); + }//end deriveReaders() + + /** + * Hand a portfolio's new managers to every project in it and to their objects. + * + * @param string $portfolioId The portfolio UUID. + * @param array $data The portfolio's new data. + * @param array $oldData The stored portfolio. + * + * @return void + */ + private function onManagersChange(string $portfolioId, array $data, array $oldData): void { + $managers = $this->membership->normalise(members: ($data['managers'] ?? [])); + if ($this->membership->normalise(members: ($oldData['managers'] ?? [])) === $managers) { + return; + } + + foreach ($this->membership->rows(schema: ProjectMembershipService::PROJECT_SCHEMA, filters: ['portfolio' => $portfolioId]) as $project) { + $this->writeProject(projectId: $project['id'], data: array_merge($project['data'], [ProjectMembershipService::READERS_FIELD => $managers])); + } + }//end onManagersChange() + + /** + * Take every project out of a portfolio that is being deleted. + * + * @param string $portfolioId The portfolio UUID. + * + * @return void + */ + private function releaseProjects(string $portfolioId): void { + foreach ($this->membership->rows(schema: ProjectMembershipService::PROJECT_SCHEMA, filters: ['portfolio' => $portfolioId]) as $project) { + $this->writeProject( + projectId: $project['id'], + data: array_merge($project['data'], ['portfolio' => null, ProjectMembershipService::READERS_FIELD => []]) + ); + } + }//end releaseProjects() + + /** + * Write a project as the system and copy its readers onto its objects. + * + * The system write raises no post-event, so the objects are brought in step here. + * + * @param string $projectId The project UUID. + * @param array $data The project's new data. + * + * @return void + */ + private function writeProject(string $projectId, array $data): void { + $class = self::OR_SYSTEM_CONTEXT; + if (class_exists($class) === false) { + $this->logger->warning('Planninq: OpenRegister has no system-operation scope; portfolio readers were not updated', ['project' => $projectId]); + return; + } + + try { + $objectService = $this->container->get('OCA\\OpenRegister\\Service\\ObjectService'); + $class::run( + static fn () => $objectService->saveObject( + object: $data, + register: ProjectMembershipService::REGISTER, + schema: ProjectMembershipService::PROJECT_SCHEMA, + uuid: $projectId, + _rbac: false, + _multitenancy: false, + silent: true, + _validation: false + ) + ); + } catch (\Throwable $e) { + $this->logger->error('Planninq: could not update the portfolio readers of a project', ['project' => $projectId, 'exception' => $e->getMessage()]); + return; + } + + $field = ProjectMembershipService::READERS_FIELD; + $written = $this->membership->syncProjectMembers(projectId: $projectId, members: ($data[$field] ?? []), field: $field); + $written += $this->finance->syncProject(projectId: $projectId); + $this->logger->info('Planninq: portfolio readers updated on a project and its objects', ['project' => $projectId, 'written' => $written]); + }//end writeProject() + + /** + * The managers of a portfolio, sorted and distinct; empty for none or an unknown portfolio. + * + * @param string $portfolioId The portfolio UUID. + * + * @return array + */ + private function managersOf(string $portfolioId): array { + $portfolio = $this->membership->objectData(schema: self::PORTFOLIO_SCHEMA, id: $portfolioId); + + return $this->membership->normalise(members: ($portfolio['managers'] ?? [])); + }//end managersOf() + + /** + * A reference value as a UUID string. + * + * @param mixed $value A UUID string or a resolved object. + * + * @return string + */ + private function referenceId(mixed $value): string { + if (is_array($value) === true) { + $value = ($value['id'] ?? ($value['@self']['id'] ?? '')); + } + + if (is_string($value) === false) { + return ''; + } + + return trim($value); + }//end referenceId() + + /** + * Whether OpenRegister runs this write as a trusted system operation. + * + * @return bool + */ + private function isSystemOperation(): bool { + $class = self::OR_SYSTEM_CONTEXT; + + return (class_exists($class) === true && $class::isActive() === true); + }//end isSystemOperation() +}//end class diff --git a/lib/Listener/ProjectMemberAccessListener.php b/lib/Listener/ProjectMemberAccessListener.php new file mode 100644 index 00000000..dc5c7afd --- /dev/null +++ b/lib/Listener/ProjectMemberAccessListener.php @@ -0,0 +1,289 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/specs/tasks.md + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\IGroupManager; +use OCP\IUserSession; +use Psr\Log\LoggerInterface; + +/** + * Keeps the `members` list of project-scoped objects in step, and gates writes into a project. + * + * @template-implements IEventListener + * + * @spec openspec/specs/tasks.md + */ +class ProjectMemberAccessListener implements IEventListener { + + /** + * Error code of a refused write, so a client can branch on it. + * + * @var string + */ + public const ERROR_CODE = 'planninq-not-a-project-member'; + + /** + * Schemas whose writes into a project need membership of that project. + * + * @var array + */ + private const GATED_SCHEMAS = ['task', 'column', 'projectPhase', 'projectLogEntry', 'risk', 'projectRelease', 'boardFilter', 'forgeLink']; + + /** + * OpenRegister's ambient system-operation marker, by name. + * + * @var string + */ + private const OR_SYSTEM_CONTEXT = 'OCA\\OpenRegister\\Service\\SystemOperationContext'; + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Resolves projects and members. + * @param TaskScopeResolver $scopeResolver Tells whether an object is a planninq schema. + * @param IUserSession $userSession The acting user. + * @param IGroupManager $groupManager Tells whether the acting user is an admin. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectMembershipService $membership, + private TaskScopeResolver $scopeResolver, + private IUserSession $userSession, + private IGroupManager $groupManager, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Stamp and gate a pre-create or pre-update of a project-scoped object. + * + * @param Event $event The dispatched event. + * + * @return void + * + * @spec openspec/specs/tasks.md + */ + public function handle(Event $event): void { + if ($event instanceof ObjectCreatingEvent === true) { + $this->apply(event: $event, object: $event->getObject(), oldData: null); + return; + } + + if ($event instanceof ObjectUpdatingEvent === true) { + $oldData = []; + $old = $event->getOldObject(); + if ($old !== null) { + $oldData = (array)$old->getObject(); + } + + $this->apply(event: $event, object: $event->getNewObject(), oldData: $oldData); + } + }//end handle() + + /** + * Stamp the members list, or refuse the write. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The pre-save event. + * @param object $object The object being written. + * @param array|null $oldData The stored data on an update, null on a create. + * + * @return void + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-2.3 + */ + private function apply(ObjectCreatingEvent|ObjectUpdatingEvent $event, object $object, ?array $oldData): void { + $schemaSlug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + if (in_array($schemaSlug, ProjectMembershipService::SCOPED_SCHEMAS, true) === false) { + return; + } + + $data = (array)$object->getObject(); + $projectId = $this->membership->projectIdFor(schemaSlug: $schemaSlug, data: $data); + $project = null; + if ($projectId !== '') { + $project = $this->membership->objectData(schema: ProjectMembershipService::PROJECT_SCHEMA, id: $projectId); + } + + $lists = null; + if ($project !== null) { + $lists = $this->membership->childLists(project: $project); + } + + if ($this->mayWrite(schemaSlug: $schemaSlug, projectId: $projectId, lists: $lists, oldData: $oldData) === false) { + $event->setErrors( + [ + 'message' => 'You are not a member of this project.', + 'code' => self::ERROR_CODE, + 'project' => $projectId, + ] + ); + $event->stopPropagation(); + $this->logger->info( + 'Planninq: refused a write into a project the caller is not a member of', + ['schema' => $schemaSlug, 'project' => $projectId] + ); + return; + } + + $lists = ($lists ?? ['members' => []]); + $lists[ProjectMembershipService::READERS_FIELD] = $this->membership->normalise( + members: ($project[ProjectMembershipService::READERS_FIELD] ?? []) + ); + $changes = $this->changedLists(data: $data, lists: $lists); + if ($changes !== []) { + $event->setModifiedData(array_merge($event->getModifiedData(), $changes)); + } + }//end apply() + + /** + * The lists that are not yet in step on the object. + * + * @param array $data The object data. + * @param array> $lists Field to the project's list. + * + * @return array> The fields to write. + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-2.3 + */ + private function changedLists(array $data, array $lists): array { + $changes = []; + foreach ($lists as $field => $values) { + // Leave a list that is already in step untouched: OpenRegister's + // batched soft delete falls back to a full-row save for every + // object a pre-update hook modifies. A missing readers or role list reads + // as empty, so objects outside any portfolio or role are never rewritten. + $inStep = $this->membership->normalise(members: ($data[$field] ?? null)) === $values; + if ($field === 'members') { + $inStep = (array_key_exists('members', $data) === true && $inStep === true); + } + + if ($inStep === false) { + $changes[$field] = $values; + } + } + + return $changes; + }//end changedLists() + + /** + * Whether the acting user may put this object in its project. + * + * Asked on a create, and on an update that changes the project. An update + * inside the same project was already checked by OpenRegister against the + * stored members list. + * + * @param string $schemaSlug The schema slug. + * @param string $projectId The target project uuid. + * @param array>|null $lists The target project's role lists, null when it does not resolve. + * @param array|null $oldData The stored data on an update, null on a create. + * + * @return bool + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-2.3 + */ + private function mayWrite(string $schemaSlug, string $projectId, ?array $lists, ?array $oldData): bool { + if (in_array($schemaSlug, self::GATED_SCHEMAS, true) === false) { + return true; + } + + if ($oldData !== null + && $this->membership->projectIdFor(schemaSlug: $schemaSlug, data: $oldData) === $projectId + ) { + return true; + } + + $user = $this->userSession->getUser(); + if ($user === null || $this->isSystemOperation() === true) { + // No session (occ, cron, a repair step) or an OpenRegister system import. + return true; + } + + $uid = $user->getUID(); + if ($this->groupManager->isAdmin($uid) === true) { + return true; + } + + if ($lists === null) { + return false; + } + + if (in_array($uid, $lists['members'], true) === true) { + return true; + } + + // A member through a group: the owning, manager or member groups. + return array_intersect($this->groupManager->getUserGroupIds($user), $lists['memberGroups']) !== []; + }//end mayWrite() + + /** + * Whether OpenRegister runs this write as a trusted system operation. + * + * The class is named as a string so planninq keeps no compile-time + * dependency on OpenRegister. + * + * @return bool + */ + private function isSystemOperation(): bool { + $class = self::OR_SYSTEM_CONTEXT; + + return (class_exists($class) === true && $class::isActive() === true); + }//end isSystemOperation() +}//end class diff --git a/lib/Listener/ProjectMembershipSyncListener.php b/lib/Listener/ProjectMembershipSyncListener.php new file mode 100644 index 00000000..142a5834 --- /dev/null +++ b/lib/Listener/ProjectMembershipSyncListener.php @@ -0,0 +1,197 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/specs/projects.md + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectUpdatedEvent; +use OCA\Planninq\Service\FinanceLineService; +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use Psr\Log\LoggerInterface; + +/** + * Copies a project's changed membership to the objects of that project. + * + * @template-implements IEventListener + * + * @spec openspec/specs/projects.md + */ +class ProjectMembershipSyncListener implements IEventListener { + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Computes and writes the members list. + * @param FinanceLineService $finance Keeps the access copies on the project's finance lines. + * @param TaskScopeResolver $scopeResolver Tells whether an object is a planninq project. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectMembershipService $membership, + private FinanceLineService $finance, + private TaskScopeResolver $scopeResolver, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Copy a changed project membership to the project's objects. + * + * @param Event $event The dispatched event. + * + * @listener-placement inline correctness: the members list IS the access + * rule of every task, column, phase and time entry of the project. Deferred + * to a job, a removed member keeps reading and editing the project's tasks + * until cron runs, and an added member sees an empty board. The spec requires + * access to change immediately. The work is bounded by the size of one + * project and runs only when members or owner actually changed. + * + * @return void + * + * @spec openspec/specs/projects.md + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-2.3 + */ + public function handle(Event $event): void { + if ($event instanceof ObjectUpdatedEvent === false) { + return; + } + + try { + $project = $event->getNewObject(); + $schemaSlug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($project->getRegister() ?? ''), + schemaId: (string)($project->getSchema() ?? '') + ); + if ($schemaSlug !== ProjectMembershipService::PROJECT_SCHEMA) { + return; + } + + $data = (array)$project->getObject(); + $old = $event->getOldObject(); + $oldData = null; + $projectId = (string)($project->getUuid() ?? ''); + if ($old !== null) { + $oldData = (array)$old->getObject(); + } + + $this->syncRoleLists(projectId: $projectId, data: $data, oldData: $oldData); + + $field = ProjectMembershipService::READERS_FIELD; + $readers = $this->membership->normalise(members: ($data[$field] ?? [])); + if ($oldData === null || $this->membership->normalise(members: ($oldData[$field] ?? [])) !== $readers) { + $this->membership->syncProjectMembers(projectId: $projectId, members: $readers, field: $field); + } + + $this->syncFinance(projectId: $projectId, data: $data, oldData: $oldData); + } catch (\Throwable $e) { + // The project write already happened and must not turn into an + // error. The objects keep the previous list until the next change + // or the repair step, and the residue is logged at error level. + $this->logger->error( + 'Planninq: could not copy a project membership change to its objects', + ['exception' => $e->getMessage()] + ); + }//end try + }//end handle() + + /** + * Copy each role list that changed (members, viewers, member and viewer + * groups) to every object of the project. + * + * @param string $projectId The project. + * @param array $data The saved project. + * @param array|null $oldData The stored project, null when unknown. + * + * @return void + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-2.3 + */ + private function syncRoleLists(string $projectId, array $data, ?array $oldData): void { + $before = []; + if ($oldData !== null) { + $before = $this->membership->childLists(project: $oldData); + } + + foreach ($this->membership->childLists(project: $data) as $field => $values) { + if ($oldData !== null && $before[$field] === $values) { + continue; + } + + $written = $this->membership->syncProjectMembers(projectId: $projectId, members: $values, field: $field); + $this->logger->info( + 'Planninq: project roles changed; a role list updated on its objects', + ['project' => $projectId, 'field' => $field, 'written' => $written] + ); + } + }//end syncRoleLists() + + /** + * Copy the owner, portfolio and portfolio managers onto the project's finance lines when they changed. + * + * @param string $projectId The project UUID. + * @param array $data The saved project. + * @param array|null $oldData The stored project before the change. + * + * @return void + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-3.3 + */ + private function syncFinance(string $projectId, array $data, ?array $oldData): void { + if ($oldData === null || $this->financeCopiesChanged(data: $data, oldData: $oldData) === true) { + $this->finance->syncProject(projectId: $projectId); + } + }//end syncFinance() + + /** + * Whether a project change touches what its finance lines copy. + * + * @param array $data The saved project. + * @param array $oldData The stored project before the change. + * + * @return bool + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-3.3 + */ + private function financeCopiesChanged(array $data, array $oldData): bool { + $field = ProjectMembershipService::READERS_FIELD; + if ($this->membership->normalise(members: ($data[$field] ?? [])) !== $this->membership->normalise(members: ($oldData[$field] ?? []))) { + return true; + } + + $now = json_encode([($data['owner'] ?? null), ($data['portfolio'] ?? null)]); + $before = json_encode([($oldData['owner'] ?? null), ($oldData['portfolio'] ?? null)]); + + return $now !== $before; + }//end financeCopiesChanged() +}//end class diff --git a/lib/Listener/ProjectPrincipalCleanupListener.php b/lib/Listener/ProjectPrincipalCleanupListener.php new file mode 100644 index 00000000..cc9cfa12 --- /dev/null +++ b/lib/Listener/ProjectPrincipalCleanupListener.php @@ -0,0 +1,134 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.3 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\Planninq\Service\ProjectMembershipService; +use OCA\Planninq\Service\ProjectRoles; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\Group\Events\GroupDeletedEvent; +use OCP\User\Events\UserDeletedEvent; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Removes a deleted account or group from every project. + * + * @template-implements IEventListener + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.3 + */ +class ProjectPrincipalCleanupListener implements IEventListener { + + /** + * Constructor. + * + * @param ProjectMembershipService $membership The project reader. + * @param ProjectRoles $roles The project schema's roles. + * @param ContainerInterface $container Resolves OpenRegister's ObjectService. + * @param LoggerInterface $logger The logger. + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.3 + */ + public function __construct( + private ProjectMembershipService $membership, + private ProjectRoles $roles, + private ContainerInterface $container, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Take the deleted account or group off every project that lists it. + * + * @param Event $event UserDeletedEvent or GroupDeletedEvent. + * + * @return void + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.3 + */ + public function handle(Event $event): void { + if ($event instanceof UserDeletedEvent) { + $uid = $event->getUser()->getUID(); + $this->cleanUp( + change: fn (array $project): array => $this->roles->withoutUser(project: $project, uid: $uid), + principal: 'user ' . $uid + ); + return; + } + + if ($event instanceof GroupDeletedEvent) { + $gid = $event->getGroup()->getGID(); + $this->cleanUp( + change: fn (array $project): array => $this->roles->withoutGroup(project: $project, gid: $gid), + principal: 'group ' . $gid + ); + } + }//end handle() + + /** + * Apply a change to every project it alters, and save those. + * + * @param callable $change Maps a project's data to its new data. + * @param string $principal Who was deleted, for the log. + * + * @return void + */ + private function cleanUp(callable $change, string $principal): void { + if ($this->membership->isAvailable() === false) { + return; + } + + $objectService = null; + foreach ($this->membership->rows(schema: ProjectMembershipService::PROJECT_SCHEMA, filters: []) as $row) { + $updated = $change($row['data']); + if ($updated === $row['data']) { + continue; + } + + $objectService = ($objectService ?? $this->container->get('OCA\\OpenRegister\\Service\\ObjectService')); + try { + $objectService->saveObject( + object: $updated, + register: ProjectMembershipService::REGISTER, + schema: ProjectMembershipService::PROJECT_SCHEMA, + uuid: $row['id'], + _rbac: false, + _multitenancy: false + ); + } catch (\Throwable $e) { + $this->logger->error( + 'Planninq: could not take a deleted account or group off a project', + ['principal' => $principal, 'project' => $row['id'], 'exception' => $e->getMessage()] + ); + } + }//end foreach + }//end cleanUp() +}//end class diff --git a/lib/Listener/ProjectReviewListener.php b/lib/Listener/ProjectReviewListener.php new file mode 100644 index 00000000..614d4ab9 --- /dev/null +++ b/lib/Listener/ProjectReviewListener.php @@ -0,0 +1,165 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.4 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectUpdatedEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCA\Planninq\Service\BoardColumnService; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\IUserSession; +use Psr\Log\LoggerInterface; + +/** + * Records reviews of project requests and gives approved ones their board. + * + * @template-implements IEventListener + */ +class ProjectReviewListener implements IEventListener { + + /** + * OpenRegister's system-operation scope. + * + * @var string + */ + private const OR_SYSTEM_CONTEXT = 'OCA\\OpenRegister\\Service\\SystemOperationContext'; + + /** + * Constructor. + * + * @param TaskScopeResolver $scopeResolver Tells a planninq schema from any other object. + * @param BoardColumnService $columns Creates the default columns. + * @param IUserSession $userSession The reviewer. + * @param ITimeFactory $timeFactory The review time. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private TaskScopeResolver $scopeResolver, + private BoardColumnService $columns, + private IUserSession $userSession, + private ITimeFactory $timeFactory, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Stamp a review before the save; create the board after an approval. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.4 + */ + public function handle(Event $event): void { + if ($event instanceof ObjectUpdatingEvent === false && $event instanceof ObjectUpdatedEvent === false) { + return; + } + + $new = $event->getNewObject(); + $old = $event->getOldObject(); + if ($old === null || $this->isProject(object: $new) === false) { + return; + } + + $from = ((array)$old->getObject())['status'] ?? null; + $to = ((array)$new->getObject())['status'] ?? null; + if ($from !== 'requested' || in_array($to, ['active', 'rejected'], true) === false) { + return; + } + + if ($event instanceof ObjectUpdatingEvent === true) { + $this->stampReview(event: $event); + return; + } + + if ($to === 'active') { + $this->createBoard(projectId: (string)($new->getUuid() ?? '')); + } + }//end handle() + + /** + * Whether the object is a planninq project. + * + * @param object $object The object. + * + * @return bool + */ + private function isProject(object $object): bool { + return $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ) === 'project'; + }//end isProject() + + /** + * Record the reviewer and the time in the reviewing save. + * + * @param ObjectUpdatingEvent $event The event. + * + * @return void + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.4 + */ + private function stampReview(ObjectUpdatingEvent $event): void { + $event->setModifiedData( + array_merge( + $event->getModifiedData(), + [ + 'reviewedBy' => ($this->userSession->getUser()?->getUID() ?? null), + 'reviewedAt' => $this->timeFactory->getDateTime()->format(\DateTimeInterface::ATOM), + ] + ) + ); + }//end stampReview() + + /** + * Create the default columns of an approved project, as the system. + * + * @param string $projectId The project UUID. + * + * @return void + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.4 + */ + private function createBoard(string $projectId): void { + $class = self::OR_SYSTEM_CONTEXT; + if ($projectId === '' || class_exists($class) === false) { + $this->logger->warning('Planninq: approved project got no board columns', ['project' => $projectId]); + return; + } + + $columns = $this->columns; + $class::run(static fn () => $columns->createDefaultColumns(projectId: $projectId)); + }//end createBoard() +}//end class diff --git a/lib/Listener/ProjectStatusListener.php b/lib/Listener/ProjectStatusListener.php new file mode 100644 index 00000000..9004d519 --- /dev/null +++ b/lib/Listener/ProjectStatusListener.php @@ -0,0 +1,277 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-1.2 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\OpenRegister\Event\ObjectDeletingEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCA\Planninq\Service\ProjectHealthService; +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\IGroupManager; +use OCP\IUserSession; +use Psr\Log\LoggerInterface; + +/** + * Copies the newest status report onto its project and guards who writes reports and health. + * + * @template-implements IEventListener + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-1.2 + */ +class ProjectStatusListener implements IEventListener { + + /** + * Error code of a refused report write. + * + * @var string + */ + public const ERROR_CODE = 'planninq-not-the-project-owner'; + + /** + * Constructor. + * + * @param ProjectHealthService $health Works out and writes the project's health. + * @param ProjectMembershipService $membership Resolves a report's project and its owner. + * @param TaskScopeResolver $scopeResolver Tells a planninq schema from any other object. + * @param IUserSession $userSession The caller. + * @param IGroupManager $groupManager Tells an admin. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectHealthService $health, + private ProjectMembershipService $membership, + private TaskScopeResolver $scopeResolver, + private IUserSession $userSession, + private IGroupManager $groupManager, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Guard and copy on a pre-save or pre-delete event. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-1.2 + */ + public function handle(Event $event): void { + if ($event instanceof ObjectCreatingEvent === true || $event instanceof ObjectDeletingEvent === true) { + $this->route(event: $event, object: $event->getObject(), oldData: null); + return; + } + + if ($event instanceof ObjectUpdatingEvent === true) { + $old = $event->getOldObject(); + $oldData = []; + if ($old !== null) { + $oldData = (array)$old->getObject(); + } + + $this->route(event: $event, object: $event->getNewObject(), oldData: $oldData); + } + }//end handle() + + /** + * Send the event to the report handler or the project guard. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event The event. + * @param object $object The object being written or deleted. + * @param array|null $oldData The stored data on an update. + * + * @return void + */ + private function route(ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event, object $object, ?array $oldData): void { + $slug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + + if ($slug === ProjectMembershipService::PROJECT_SCHEMA && $event instanceof ObjectDeletingEvent === false) { + $this->guardHealth(event: $event, data: (array)$object->getObject(), oldData: $oldData); + return; + } + + if ($slug === ProjectHealthService::REPORT_SCHEMA) { + $this->onReport(event: $event, object: $object, oldData: $oldData); + } + }//end route() + + /** + * Keep the stored health on a project written by anyone but the system. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param array $data The project's new data. + * @param array|null $oldData The stored project, null on a create. + * + * @return void + */ + private function guardHealth(ObjectCreatingEvent|ObjectUpdatingEvent $event, array $data, ?array $oldData): void { + if ($this->health->isSystemOperation() === true) { + return; + } + + $stored = $this->health->healthOf(project: ($oldData ?? [])); + if ($this->health->healthOf(project: $data) === $stored) { + return; + } + + $event->setModifiedData(array_merge($event->getModifiedData(), $stored)); + }//end guardHealth() + + /** + * Refuse a report write by anyone but the owner, else copy the newest report onto the project. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event The event. + * @param object $object The report. + * @param array|null $oldData The stored report on an update. + * + * @return void + */ + private function onReport(ObjectCreatingEvent|ObjectUpdatingEvent|ObjectDeletingEvent $event, object $object, ?array $oldData): void { + $data = (array)$object->getObject(); + if ($oldData !== null && $this->withoutMembers(data: $data) === $this->withoutMembers(data: $oldData)) { + // A members-only rewrite by the membership sync: nothing to check or copy. + return; + } + + $projectId = $this->membership->projectIdFor(schemaSlug: ProjectHealthService::REPORT_SCHEMA, data: $data); + $oldProject = ''; + if ($oldData !== null) { + $oldProject = $this->membership->projectIdFor(schemaSlug: ProjectHealthService::REPORT_SCHEMA, data: $oldData); + } + + if ($this->mayWriteBoth(projectId: $projectId, oldProject: $oldProject) === false) { + $event->setErrors( + [ + 'message' => 'Only the project owner can write a status report.', + 'code' => self::ERROR_CODE, + 'project' => $projectId, + ] + ); + $event->stopPropagation(); + $this->logger->info('Planninq: refused a status report by someone who is not the project owner', ['project' => $projectId]); + return; + } + + $saving = $data; + if ($event instanceof ObjectDeletingEvent === true) { + $saving = null; + } + + $this->copy(reportId: (string)($object->getUuid() ?? ''), projectId: $projectId, oldProject: $oldProject, saving: $saving); + }//end onReport() + + /** + * Copy the newest report onto the report's project, and onto the project it left. + * + * @param string $reportId The report UUID. + * @param string $projectId The report's project. + * @param string $oldProject The project it was in before this update, or ''. + * @param array|null $saving The report's new data, null when it is being deleted. + * + * @return void + */ + private function copy(string $reportId, string $projectId, string $oldProject, ?array $saving): void { + $this->health->refresh(projectId: $projectId, reportId: $reportId, saving: $saving); + if ($oldProject !== '' && $oldProject !== $projectId) { + $this->health->refresh(projectId: $oldProject, reportId: $reportId, saving: null); + } + }//end copy() + + /** + * Whether the caller may write reports of the report's project and of the project it leaves. + * + * @param string $projectId The report's project. + * @param string $oldProject The project it was in before this update, or ''. + * + * @return bool + */ + private function mayWriteBoth(string $projectId, string $oldProject): bool { + if ($this->mayWrite(projectId: $projectId) === false) { + return false; + } + + return ($oldProject === '' || $this->mayWrite(projectId: $oldProject) === true); + }//end mayWriteBoth() + + /** + * Whether the caller may write status reports of this project. + * + * @param string $projectId The project UUID. + * + * @return bool + */ + private function mayWrite(string $projectId): bool { + $user = $this->userSession->getUser(); + if ($user === null || $this->health->isSystemOperation() === true) { + // No session (occ, cron, a repair step) or an OpenRegister system import. + return true; + } + + $uid = $user->getUID(); + if ($this->groupManager->isAdmin($uid) === true) { + return true; + } + + return ($this->membership->ownerOfProject(projectId: $projectId) === $uid); + }//end mayWrite() + + /** + * A report's data without the planninq-kept members list and metadata, key order ignored. + * + * @param array $data The report data. + * + * @return array + */ + private function withoutMembers(array $data): array { + unset($data['members'], $data['@self'], $data['id']); + ksort($data); + return $data; + }//end withoutMembers() +}//end class diff --git a/lib/Listener/RegisterProjectsLeafListener.php b/lib/Listener/RegisterProjectsLeafListener.php new file mode 100644 index 00000000..bc271aaf --- /dev/null +++ b/lib/Listener/RegisterProjectsLeafListener.php @@ -0,0 +1,275 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\RegisterLeafProvidersEvent; +use OCA\OpenRegister\Service\Integration\LeafDescriptor; +use OCA\Planninq\AppInfo\Application; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\IL10N; +use Psr\Log\LoggerInterface; +use ReflectionClass; +use Throwable; + +/** + * Contributes the `planninq-projects` leaf descriptor to OpenRegister. + * + * @spec openspec/specs/project-delivery/spec.md#requirement-both-halves-of-the-projects-leaf-agree + * + * @template-implements IEventListener + */ +class RegisterProjectsLeafListener implements IEventListener { + + /** + * The leaf id, equal to `PROJECTS_INTEGRATION_ID` in the JS half. + * + * The two halves are bound by this shared string; a mismatch is an orphan + * registration on both sides rather than an error on either. + * + * @var string + */ + public const LEAF_ID = 'planninq-projects'; + + /** + * The l10n SOURCE string for the label, equal to the string the JS half + * passes to its own translate call. + * + * Both halves must translate the SAME key or the two render different + * labels for one leaf depending on which side the reader is looking at. + * + * @var string + */ + public const LABEL_SOURCE = 'Projects'; + + /** + * Material Design Icons name, equal to the JS half's `icon`. + * + * The same glyph the `project` schema carries, so the leaf and the schema + * it renders are recognisably the same thing. + * + * @var string + */ + public const ICON = 'FolderOutline'; + + /** + * Admin-UI grouping, equal to the JS half's `group`. + * + * @var string + */ + public const GROUP = 'workflow'; + + /** + * AD-18 marker: a schema property carrying this `referenceType` renders + * this leaf's single-entity surface instead of a plain value. It is what + * turns shillinq's `ProjectAssignment.projectId` from a bare uuid into the + * project itself. + * + * IT IS THE INTEGRATION ID, not a loose semantic word like 'project'. + * `PropertyReferenceTypeValidator::validate()` resolves the marker through + * `IntegrationRegistry::isValidIntegrationId()`, which is a lookup in the + * provider map keyed by leaf id, and THROWS on a miss. Nothing calls that + * validator today — it is registered as a service and wired into no import + * path — so a bare word is currently inert rather than fatal, which is + * exactly the shape of thing that is fine until the day it is wired. + * humaniq's leaf carries the same latent problem with 'hours'. + * + * Using the id also makes the render-layer match unambiguous: the property + * and the descriptor that claims it spell the same string. + * + * Written as a LITERAL equal to LEAF_ID rather than as `self::LEAF_ID`: + * scripts/check-integration-parity.js reads this constant with a regex over + * the source, so a constant expression reads as an EMPTY value and the gate + * reports the half as unreadable. + * + * @var string + */ + public const REFERENCE_TYPE = 'planninq-projects'; + + /** + * The render surfaces this leaf targets — the SAME set, in the same order, + * as `SURFACES` in the JS half. + * + * Written out on both halves rather than left to a default, because that is + * what gives gate-24 two explicit sets to compare. A half that declares its + * surfaces by omission is how hermiq's two halves drifted apart unnoticed. + * + * @var string[] + */ + public const SURFACES = [ + 'user-dashboard', + 'app-dashboard', + 'detail-page', + 'single-entity', + ]; + + /** + * Constructor. + * + * @param IL10N $l10n Localisation for the human-readable label. + * @param LoggerInterface $logger PSR-3 logger; a throwing listener must cost only its own leaf. + */ + public function __construct( + private readonly IL10N $l10n, + private readonly LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Contribute the `planninq-projects` leaf descriptor. + * + * @param Event $event The dispatched event. + * + * @return void + * + * @spec openspec/specs/project-delivery/spec.md#requirement-both-halves-of-the-projects-leaf-agree + */ + public function handle(Event $event): void { + if ($event instanceof RegisterLeafProvidersEvent === false) { + return; + } + + try { + $arguments = [ + 'id' => self::LEAF_ID, + 'label' => $this->l10n->t(self::LABEL_SOURCE), + 'icon' => self::ICON, + 'kinds' => [LeafDescriptor::KIND_RENDER_SURFACE], + 'requiredApp' => Application::APP_ID, + 'group' => self::GROUP, + 'surfaces' => self::SURFACES, + 'referenceType' => self::REFERENCE_TYPE, + // Planninq is Vue 3 and a consuming host may still be Vue 2.7, + // so the JS half renders through a mount/unmount DOM hand-off. + // The server descriptor MUST declare the same render mode under + // the shared id or the surface blanks. + 'renderMode' => LeafDescriptor::RENDER_MODE_MOUNT, + ]; + + if ($this->descriptorSupportsLoadStrategy() === true) { + // Planninq builds `js/planninq-leaves.js` from a dedicated + // `leaves` webpack entry, and OpenRegister's + // `LeafScriptListener` puts it on the consuming pages. That is + // the one convention the platform can VERIFY, so declaring it + // opts this leaf into being checked: openregister#3956 refuses a + // leaf that claims the shared entry and ships no bundle, which + // turns a missing build into a loud refusal instead of a surface + // that renders nothing while every check reports success. + $arguments['loadStrategy'] = LeafDescriptor::LOADS_VIA_SHARED_ENTRY; + } + + $descriptor = new LeafDescriptor(...$arguments); + + // Render-only leaf: no IntegrationProvider. The widget reads projects + // through OpenRegister's object API in the browser, so there is no + // app-local store to serve behind this leaf. + $event->registerLeaf($descriptor, null); + } catch (Throwable $e) { + // Never take the leaf catalogue down: log and skip our own leaf only. + $this->logger->warning( + 'Planninq could not register the planninq-projects leaf: ' . $e->getMessage(), + ['exception' => $e] + ); + }//end try + + }//end handle() + + /** + * Whether the OpenRegister beside us understands the `loadStrategy` argument. + * + * 🔴 A DECLARATION ABOUT HOW A LEAF LOADS MUST NEVER BE WHY IT DOES NOT LOAD. + * + * `loadStrategy` and the `LOADS_*` constants arrived together in + * openregister#3956. Planninq cannot choose which OpenRegister an admin runs + * it beside, and passing a named argument a constructor does not declare is + * an `Error`. The catch in `handle()` would then swallow it and the leaf + * would simply be absent, with nothing anywhere saying so. + * + * That is not hypothetical: it turned all six PHPUnit cells red on + * development for planninq#625 while the summary blamed seven assertions, + * and the same shape in production is a projects surface that renders + * nothing on an instance whose OpenRegister predates the feature. + * + * Both halves are checked rather than one standing in for the other: the + * constant is what this listener reads, the parameter is what it passes, and + * a stub or a partial backport can carry one without the other. + * + * @return bool Whether the descriptor accepts a load strategy. + * + * @spec openspec/specs/project-delivery/spec.md#requirement-both-halves-of-the-projects-leaf-agree + */ + protected function descriptorSupportsLoadStrategy(): bool { + if (defined(LeafDescriptor::class.'::LOADS_VIA_SHARED_ENTRY') === false) { + return false; + } + + $constructor = (new ReflectionClass(LeafDescriptor::class))->getConstructor(); + if ($constructor === null) { + return false; + } + + foreach ($constructor->getParameters() as $parameter) { + if ($parameter->getName() === 'loadStrategy') { + return true; + } + } + + return false; + + }//end descriptorSupportsLoadStrategy() +}//end class diff --git a/lib/Listener/TaskActivityListener.php b/lib/Listener/TaskActivityListener.php index ed5ad3b7..b493750a 100644 --- a/lib/Listener/TaskActivityListener.php +++ b/lib/Listener/TaskActivityListener.php @@ -215,12 +215,14 @@ private function selectSubject(array $data, ?array $old, bool $deleted): ?array * * Falls back to the task's assignee when the project cannot be resolved, so * a member still gets the entry; returns an empty list (silently) when there - * is no resolvable audience. + * is no resolvable audience. The people in `sharedWith` are added too. * - * @param array $taskData The task data (carries `project` UUID + `assignedTo`). + * @param array $taskData The task data (carries `project` UUID, `assignedTo` and `sharedWith`). * @param string $actor The acting user id (excluded from the result). * * @return string[] Distinct affected user ids. + * + * @spec openspec/changes/tasks-assignment-priority-labels/tasks.md#task-2.3 */ private function resolveAudience(array $taskData, string $actor): array { $members = $this->scopeResolver->projectMembers( @@ -232,6 +234,11 @@ private function resolveAudience(array $taskData, string $actor): array { $members[] = $assignee; } + // The people the task is shared with (tasks-assignment-priority-labels). + foreach ((array)($taskData['sharedWith'] ?? []) as $sharer) { + $members[] = $this->stringify(value: $sharer); + } + $distinct = []; foreach ($members as $member) { $member = (string)$member; diff --git a/lib/Listener/TaskCalendarExportListener.php b/lib/Listener/TaskCalendarExportListener.php new file mode 100644 index 00000000..11f12fd4 --- /dev/null +++ b/lib/Listener/TaskCalendarExportListener.php @@ -0,0 +1,205 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatedEvent; +use OCA\OpenRegister\Event\ObjectDeletedEvent; +use OCA\OpenRegister\Event\ObjectUpdatedEvent; +use OCA\Planninq\Service\TaskCalendarExportService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use Psr\Log\LoggerInterface; + +/** + * Writes and removes task VTODOs on OpenRegister's task events. + * + * @template-implements IEventListener + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ +class TaskCalendarExportListener implements IEventListener { + + /** + * Constructor. + * + * @param TaskScopeResolver $scopeResolver Tells planninq tasks apart. + * @param TaskCalendarExportService $export Writes the VTODOs. + * @param LoggerInterface $logger Diagnostics. + */ + public function __construct( + private TaskScopeResolver $scopeResolver, + private TaskCalendarExportService $export, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Handle a created, updated or deleted object. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + public function handle(Event $event): void { + try { + if ($event instanceof ObjectCreatedEvent === true) { + $this->onChange(object: $event->getObject(), old: null); + return; + } + + if ($event instanceof ObjectUpdatedEvent === true) { + $old = null; + if ($event->getOldObject() !== null) { + $old = $event->getOldObject()->getObject(); + } + + $this->onChange(object: $event->getNewObject(), old: $old); + return; + } + + if ($event instanceof ObjectDeletedEvent === true) { + $this->onDelete(object: $event->getObject()); + } + } catch (\Throwable $e) { + // OpenRegister's save must never fail because the export did. + $this->logger->warning('Planninq: the task calendar export skipped an event', ['exception' => $e->getMessage()]); + }//end try + }//end handle() + + /** + * Rewrite the VTODO for the people on the task, remove it for the people who left. + * + * @param object $object The task object. + * @param array|null $old The task data before, or null on create. + * + * @return void + */ + private function onChange(object $object, ?array $old): void { + $data = $this->taskData(object: $object); + if ($data === null) { + return; + } + + if ($old !== null && $this->onlyUidChanged(old: $old, new: $data) === true) { + return; + } + + $taskId = (string)($object->getUuid() ?? ''); + $now = $this->export->recipients(task: $data); + if ($old !== null) { + $left = array_values(array_diff($this->export->recipients(task: $old), $now)); + if ($left !== []) { + $this->export->removeTask(taskId: $taskId, users: $left); + } + } + + $this->export->exportTask(taskId: $taskId, task: $data, users: $now); + }//end onChange() + + /** + * Remove a deleted task's VTODO from every list that holds it. + * + * @param object $object The task object. + * + * @return void + */ + private function onDelete(object $object): void { + $data = $this->taskData(object: $object); + if ($data === null) { + return; + } + + $this->export->removeTask(taskId: (string)($object->getUuid() ?? ''), users: $this->export->recipients(task: $data)); + }//end onDelete() + + /** + * The task's data, or null when the object is not a planninq task. + * + * @param object $object The object. + * + * @return array|null + */ + private function taskData(object $object): ?array { + $registerId = (string)($object->getRegister() ?? ''); + $schemaId = (string)($object->getSchema() ?? ''); + if ($this->scopeResolver->isPlanninqTask(registerId: $registerId, schemaId: $schemaId) === false) { + return null; + } + + $data = $object->getObject(); + if (is_array($data) === false) { + return null; + } + + return $data; + }//end taskData() + + /** + * Whether an update changed nothing but calendarEventUid (the export's own write-back). + * + * @param array $old The data before. + * @param array $new The data after. + * + * @return bool + */ + private function onlyUidChanged(array $old, array $new): bool { + if (($old['calendarEventUid'] ?? null) === ($new['calendarEventUid'] ?? null)) { + return false; + } + + unset($old['calendarEventUid'], $new['calendarEventUid'], $old['@self'], $new['@self']); + + return $this->canonical(value: $old) === $this->canonical(value: $new); + }//end onlyUidChanged() + + /** + * A value as JSON with its object keys sorted, so key order does not count as a change. + * + * @param mixed $value The value. + * + * @return string + */ + private function canonical(mixed $value): string { + $sort = static function (mixed $item) use (&$sort): mixed { + if (is_array($item) === false) { + return $item; + } + + if (array_is_list($item) === false) { + ksort($item); + } + + return array_map($sort, $item); + }; + + return (string)json_encode($sort($value)); + }//end canonical() +}//end class diff --git a/lib/Listener/TaskCompletionListener.php b/lib/Listener/TaskCompletionListener.php new file mode 100644 index 00000000..bf2ab71b --- /dev/null +++ b/lib/Listener/TaskCompletionListener.php @@ -0,0 +1,115 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-3.2b + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; + +/** + * Keeps `completedAt` in step with a task's `done` status. + * + * @template-implements IEventListener + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-3.2b + */ +class TaskCompletionListener implements IEventListener { + + /** + * Constructor. + * + * @param TaskScopeResolver $scopeResolver Tells a planninq task from any other object. + * @param ITimeFactory $timeFactory The clock. + */ + public function __construct( + private TaskScopeResolver $scopeResolver, + private ITimeFactory $timeFactory, + ) { + }//end __construct() + + /** + * Handle a pre-save event. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-3.2b + */ + public function handle(Event $event): void { + if ($event instanceof ObjectCreatingEvent === true) { + $this->apply(event: $event, object: $event->getObject(), oldStatus: null); + return; + } + + if ($event instanceof ObjectUpdatingEvent === true) { + $old = $event->getOldObject(); + $oldStatus = null; + if ($old !== null) { + $oldStatus = (((array)$old->getObject())['status'] ?? null); + } + + $this->apply(event: $event, object: $event->getNewObject(), oldStatus: $oldStatus); + } + }//end handle() + + /** + * Merge `completedAt` into the save when the status crosses `done`. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param object $object The object being saved. + * @param mixed $oldStatus The stored status, null on create. + * + * @return void + */ + private function apply(ObjectCreatingEvent|ObjectUpdatingEvent $event, object $object, mixed $oldStatus): void { + $slug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + if ($slug !== 'task') { + return; + } + + $newStatus = (((array)$object->getObject())['status'] ?? null); + $wasDone = ($oldStatus === 'done'); + $isDone = ($newStatus === 'done'); + if ($wasDone === $isDone) { + return; + } + + $completedAt = null; + if ($isDone === true) { + $completedAt = $this->timeFactory->getDateTime()->format(\DateTimeInterface::ATOM); + } + + $event->setModifiedData(array_merge($event->getModifiedData(), ['completedAt' => $completedAt])); + }//end apply() +}//end class diff --git a/lib/Listener/TaskReporterGuardListener.php b/lib/Listener/TaskReporterGuardListener.php new file mode 100644 index 00000000..7653f811 --- /dev/null +++ b/lib/Listener/TaskReporterGuardListener.php @@ -0,0 +1,241 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/tasks-create-edit-delete/tasks.md#task-5.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\OpenRegister\Event\ObjectDeletingEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\IGroupManager; +use OCP\IUserSession; +use Psr\Log\LoggerInterface; + +/** + * Stamps and keeps a task's reporter, and holds task deletes to the reporter, the owner and admins. + * + * @template-implements IEventListener + * + * @spec openspec/changes/tasks-create-edit-delete/tasks.md#task-5.1 + */ +class TaskReporterGuardListener implements IEventListener { + + /** + * Error code of a delete by someone who is not the reporter, the owner or an admin. + * + * @var string + */ + public const ERROR_NOT_ALLOWED = 'planninq-task-delete-not-allowed'; + + /** + * Error code of a delete of a task with logged time. + * + * @var string + */ + public const ERROR_HAS_TIME = 'planninq-task-has-logged-time'; + + /** + * OpenRegister's system-operation flag, set during imports. + * + * @var string + */ + private const OR_SYSTEM_CONTEXT = 'OCA\\OpenRegister\\Service\\SystemOperationContext'; + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Reads the project owner and the time entries. + * @param TaskScopeResolver $scopeResolver Tells a planninq task from any other object. + * @param IUserSession $userSession The caller. + * @param IGroupManager $groupManager Tells an admin. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectMembershipService $membership, + private TaskScopeResolver $scopeResolver, + private IUserSession $userSession, + private IGroupManager $groupManager, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Handle a pre-save or pre-delete event. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/tasks-create-edit-delete/tasks.md#task-5.1 + */ + public function handle(Event $event): void { + $uid = $this->callerUid(); + if ($uid === null) { + return; + } + + if ($event instanceof ObjectCreatingEvent === true && $this->isTask(object: $event->getObject()) === true) { + $event->setModifiedData(array_merge($event->getModifiedData(), ['reporter' => $uid])); + return; + } + + if ($event instanceof ObjectUpdatingEvent === true && $this->isTask(object: $event->getNewObject()) === true) { + $this->keepReporter(event: $event); + return; + } + + if ($event instanceof ObjectDeletingEvent === true && $this->isTask(object: $event->getObject()) === true) { + $this->guardDelete(event: $event, uid: $uid); + } + }//end handle() + + /** + * Restore the stored reporter when the new data differs from it. + * + * @param ObjectUpdatingEvent $event The event. + * + * @return void + */ + private function keepReporter(ObjectUpdatingEvent $event): void { + $old = $event->getOldObject(); + if ($old === null) { + return; + } + + $stored = ((array)$old->getObject())['reporter'] ?? null; + $sent = ((array)$event->getNewObject()->getObject())['reporter'] ?? null; + if ($sent === $stored) { + return; + } + + $event->setModifiedData(array_merge($event->getModifiedData(), ['reporter' => $stored])); + }//end keepReporter() + + /** + * Stop a delete by someone who may not, or of a task with logged time. + * + * @param ObjectDeletingEvent $event The event. + * @param string $uid The caller. + * + * @return void + */ + private function guardDelete(ObjectDeletingEvent $event, string $uid): void { + $task = $event->getObject(); + $data = (array)$task->getObject(); + $projectId = $this->membership->projectIdFor(schemaSlug: 'task', data: $data); + + if ($this->mayDelete(uid: $uid, reporter: $data['reporter'] ?? null, projectId: $projectId) === false) { + $this->refuse( + event: $event, + code: self::ERROR_NOT_ALLOWED, + status: 403, + message: 'Only the reporter, the project owner or an admin can delete this task.' + ); + return; + } + + $taskId = (string)($task->getUuid() ?? ''); + if ($taskId !== '' && $this->membership->rows(schema: 'plannedTimeEntry', filters: ['task' => $taskId]) !== []) { + $this->refuse(event: $event, code: self::ERROR_HAS_TIME, status: 409, message: 'This task has logged time. Cancel it instead.'); + } + }//end guardDelete() + + /** + * Whether the caller is the reporter, the project owner or an admin. + * + * @param string $uid The caller. + * @param mixed $reporter The task's reporter. + * @param string $projectId The task's project. + * + * @return bool + */ + private function mayDelete(string $uid, mixed $reporter, string $projectId): bool { + if ($this->groupManager->isAdmin($uid) === true || $reporter === $uid) { + return true; + } + + return ($projectId !== '' && $this->membership->ownerOfProject(projectId: $projectId) === $uid); + }//end mayDelete() + + /** + * Stop the event with an error the API returns; OpenRegister answers with its `status`. + * + * @param ObjectDeletingEvent $event The event. + * @param string $code The error code. + * @param int $status The HTTP status OpenRegister answers with. + * @param string $message The message. + * + * @return void + */ + private function refuse(ObjectDeletingEvent $event, string $code, int $status, string $message): void { + $event->setErrors(['message' => $message, 'code' => $code, 'status' => $status]); + $event->stopPropagation(); + $this->logger->info('Planninq: refused a task delete', ['code' => $code]); + }//end refuse() + + /** + * Whether the object is a planninq task. + * + * @param object $object The object. + * + * @return bool + */ + private function isTask(object $object): bool { + $slug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + return ($slug === 'task'); + }//end isTask() + + /** + * The signed-in caller, or null for occ, cron, repair steps and system imports. + * + * @return string|null + */ + private function callerUid(): ?string { + $user = $this->userSession->getUser(); + $class = self::OR_SYSTEM_CONTEXT; + if ($user === null || (class_exists($class) === true && $class::isActive() === true)) { + return null; + } + + return $user->getUID(); + }//end callerUid() +}//end class diff --git a/lib/Listener/TaskScopeResolver.php b/lib/Listener/TaskScopeResolver.php index f4b0c529..83899aa0 100644 --- a/lib/Listener/TaskScopeResolver.php +++ b/lib/Listener/TaskScopeResolver.php @@ -63,6 +63,18 @@ class TaskScopeResolver { */ public const PROJECT_SCHEMA_SLUG = 'project'; + /** + * Schema slugs already resolved in this request, keyed `registerId:schemaId`. + * + * An empty string means "not a planninq schema". ObjectUpdatingEvent has no + * `getObject()`, so OpenRegister's subscription proxy cannot narrow it by + * schema and a pre-update listener sees every update on the instance; this + * keeps the answer for a pair it has already seen to one lookup. + * + * @var array + */ + private array $schemaSlugCache = []; + /** * Constructor. * @@ -97,6 +109,34 @@ public function isPlanninqTask(string $registerId, string $schemaId): bool { return $this->resolveSlug(service: 'OCA\\OpenRegister\\Db\\SchemaMapper', id: $schemaId) === self::TASK_SCHEMA_SLUG; }//end isPlanninqTask() + /** + * The schema slug of a register/schema id pair, when the register is planninq. + * + * @param string $registerId The OR register id from the event object. + * @param string $schemaId The OR schema id from the event object. + * + * @return string The schema slug, or '' for another register or an unresolvable pair. + * + * @spec openspec/specs/tasks.md + */ + public function planninqSchemaSlug(string $registerId, string $schemaId): string { + if ($registerId === '' || $schemaId === '') { + return ''; + } + + $key = $registerId . ':' . $schemaId; + if (array_key_exists($key, $this->schemaSlugCache) === false) { + $slug = ''; + if ($this->resolveSlug(service: 'OCA\\OpenRegister\\Db\\RegisterMapper', id: $registerId) === self::REGISTER_SLUG) { + $slug = $this->resolveSlug(service: 'OCA\\OpenRegister\\Db\\SchemaMapper', id: $schemaId); + } + + $this->schemaSlugCache[$key] = $slug; + } + + return $this->schemaSlugCache[$key]; + }//end planninqSchemaSlug() + /** * Fetch the member ids of a project (plus its owner) from OpenRegister. * diff --git a/lib/Listener/TimetableSessionsQueryListener.php b/lib/Listener/TimetableSessionsQueryListener.php new file mode 100644 index 00000000..534f885e --- /dev/null +++ b/lib/Listener/TimetableSessionsQueryListener.php @@ -0,0 +1,90 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-License-Identifier: EUPL-1.2 + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\Planninq\Event\TimetableSessionsQueryEvent; +use OCA\Planninq\Service\TimetableSessionService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use Psr\Log\LoggerInterface; +use Throwable; + +/** + * Reads timetable sessions for the requesting app. + * + * @template-implements IEventListener + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ +class TimetableSessionsQueryListener implements IEventListener { + + /** + * Constructor. + * + * @param TimetableSessionService $sessions The timetable rules. + * @param LoggerInterface $logger PSR logger. + * + * @return void + */ + public function __construct( + private readonly TimetableSessionService $sessions, + private readonly LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Handle the event. + * + * @param Event $event The dispatched event. + * + * @return void + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function handle(Event $event): void { + if (($event instanceof TimetableSessionsQueryEvent) === false) { + return; + } + + try { + $event->setSessions($this->sessions->listForApp(criteria: $event->getCriteria())); + } catch (Throwable $e) { + $this->logger->info( + '[TimetableSessionsQueryListener] Query from {app} refused: {message}', + ['app' => $event->getSourceApp(), 'message' => $e->getMessage()] + ); + $event->setError($e->getMessage()); + } + }//end handle() +}//end class diff --git a/lib/Listener/TimetableUpsertRequestedListener.php b/lib/Listener/TimetableUpsertRequestedListener.php new file mode 100644 index 00000000..29c3b24c --- /dev/null +++ b/lib/Listener/TimetableUpsertRequestedListener.php @@ -0,0 +1,115 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-License-Identifier: EUPL-1.2 + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\Planninq\Event\TimetableUpsertRequestedEvent; +use OCA\Planninq\Service\TimetableSessionService; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use Psr\Log\LoggerInterface; +use Throwable; + +/** + * Upserts a delivered timetable batch and answers the requesting app. + * + * @template-implements IEventListener + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ +class TimetableUpsertRequestedListener implements IEventListener { + + /** + * Constructor. + * + * @param TimetableSessionService $sessions The timetable rules. + * @param LoggerInterface $logger PSR logger. + * + * @return void + */ + public function __construct( + private readonly TimetableSessionService $sessions, + private readonly LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Handle the event. + * + * @param Event $event The dispatched event. + * + * @return void + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004 + */ + public function handle(Event $event): void { + if (($event instanceof TimetableUpsertRequestedEvent) === false) { + return; + } + + try { + $result = $this->sessions->upsert(sourceSystem: $event->getSourceSystem(), sessions: $event->getSessions()); + } catch (Throwable $e) { + $this->logger->warning( + '[TimetableUpsertRequestedListener] Batch from {app} ({source}) refused: {message}', + ['app' => $event->getSourceApp(), 'source' => $event->getSourceSystem(), 'message' => $e->getMessage()] + ); + $result = [ + 'contractVersion' => TimetableUpsertRequestedEvent::CONTRACT_VERSION, + 'sourceSystem' => $event->getSourceSystem(), + 'processed' => count($event->getSessions()), + 'created' => 0, + 'updated' => 0, + 'unchanged' => 0, + 'rejected' => [], + 'sessionIds' => [], + 'error' => $e->getMessage(), + ]; + } + + $this->logger->info( + '[TimetableUpsertRequestedListener] {app} delivered {n} row(s) from {source} ({correlation}): ' + . '{created} created, {updated} updated, {unchanged} unchanged, {rejected} rejected.', + [ + 'app' => $event->getSourceApp(), + 'n' => $result['processed'], + 'source' => $event->getSourceSystem(), + 'correlation' => $event->getCorrelationId(), + 'created' => $result['created'], + 'updated' => $result['updated'], + 'unchanged' => $result['unchanged'], + 'rejected' => count($result['rejected']), + ] + ); + + $event->setResult($result); + }//end handle() +}//end class diff --git a/lib/Listener/WorkItemKeyListener.php b/lib/Listener/WorkItemKeyListener.php new file mode 100644 index 00000000..19aaaf73 --- /dev/null +++ b/lib/Listener/WorkItemKeyListener.php @@ -0,0 +1,352 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.2 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Listener; + +use OCA\OpenRegister\Event\ObjectCreatingEvent; +use OCA\OpenRegister\Event\ObjectUpdatingEvent; +use OCA\Planninq\BackgroundJob\NumberProjectTasks; +use OCA\Planninq\Service\WorkItemKeyService; +use OCP\BackgroundJob\IJobList; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventListener; +use OCP\Lock\LockedException; +use Psr\Log\LoggerInterface; + +/** + * Assigns task keys and guards project keys. + * + * @template-implements IEventListener + */ +class WorkItemKeyListener implements IEventListener { + + /** + * Error code: the key has the wrong format. + * + * @var string + */ + public const ERROR_FORMAT = 'planninq-project-key-format'; + + /** + * Error code: another project uses the key. + * + * @var string + */ + public const ERROR_USED = 'planninq-project-key-used'; + + /** + * Error code: tasks carry the key, so it stays. + * + * @var string + */ + public const ERROR_FIXED = 'planninq-project-key-fixed'; + + /** + * Error code: the task counter stayed locked. + * + * @var string + */ + public const ERROR_BUSY = 'planninq-task-key-busy'; + + /** + * OpenRegister's system-operation scope. + * + * @var string + */ + private const OR_SYSTEM_CONTEXT = 'OCA\\OpenRegister\\Service\\SystemOperationContext'; + + /** + * Constructor. + * + * @param WorkItemKeyService $keys The key rules and the counter. + * @param TaskScopeResolver $scopeResolver Tells a planninq schema from any other object. + * @param IJobList $jobList Queues the numbering of existing tasks. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private WorkItemKeyService $keys, + private TaskScopeResolver $scopeResolver, + private IJobList $jobList, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Route a pre-save event to the task or the project rules. + * + * @param Event $event The event. + * + * @return void + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.2 + */ + public function handle(Event $event): void { + if ($event instanceof ObjectCreatingEvent === true) { + $this->route(event: $event, object: $event->getObject(), oldData: null); + return; + } + + if ($event instanceof ObjectUpdatingEvent === true) { + $old = $event->getOldObject(); + $oldData = []; + if ($old !== null) { + $oldData = (array)$old->getObject(); + } + + $this->route(event: $event, object: $event->getNewObject(), oldData: $oldData); + } + }//end handle() + + /** + * Send a task create to the numbering and a project write to the key rules. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param object $object The object being saved. + * @param array|null $oldData The stored object on an update. + * + * @return void + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.2 + */ + private function route(ObjectCreatingEvent|ObjectUpdatingEvent $event, object $object, ?array $oldData): void { + $slug = $this->scopeResolver->planninqSchemaSlug( + registerId: (string)($object->getRegister() ?? ''), + schemaId: (string)($object->getSchema() ?? '') + ); + $data = (array)$object->getObject(); + + if ($slug === 'task' && $event instanceof ObjectCreatingEvent === true) { + $this->assignTaskKey(event: $event, data: $data); + return; + } + + if ($slug === 'project' && $this->isSystemOperation() === false) { + $this->guardProject(event: $event, projectId: (string)($object->getUuid() ?? ''), data: $data, oldData: $oldData); + } + }//end route() + + /** + * Give a keyless new task the next key of its project. + * + * @param ObjectCreatingEvent $event The event. + * @param array $data The task data. + * + * @return void + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.2 + */ + private function assignTaskKey(ObjectCreatingEvent $event, array $data): void { + $projectId = $data['project'] ?? ''; + if (is_array($projectId) === true) { + $projectId = ($projectId['id'] ?? ''); + } + + if (trim((string)($data['key'] ?? '')) !== '' || is_string($projectId) === false || $projectId === '') { + return; + } + + try { + $key = $this->keys->nextTaskKey(projectId: $projectId); + } catch (LockedException $e) { + $event->setErrors(['code' => self::ERROR_BUSY, 'message' => 'Could not number the task. Try again.']); + $event->stopPropagation(); + $this->logger->warning('Planninq: task counter stayed locked', ['project' => $projectId]); + return; + } + + if ($key !== null) { + $event->setModifiedData(array_merge($event->getModifiedData(), ['key' => $key])); + } + }//end assignTaskKey() + + /** + * Hold a project write to the key rules and keep the counter to the system. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param string $projectId The project UUID. + * @param array $data The new project data. + * @param array|null $oldData The stored project on an update. + * + * @return void + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.2 + */ + private function guardProject(ObjectCreatingEvent|ObjectUpdatingEvent $event, string $projectId, array $data, ?array $oldData): void { + $stored = ($oldData ?? []); + $this->keepCounter(event: $event, data: $data, stored: $stored); + + $key = $this->keys->normalise(key: ($data['key'] ?? null)); + $oldKey = $this->keys->normalise(key: ($stored['key'] ?? null)); + + // A write that leaves the key out keeps it. OpenRegister's PUT fills a + // property it was not sent with null, so an empty key on a project + // whose tasks carry its key is read the same way: kept, not cleared. + if ($this->keyLeftOut(data: $data, key: $key, stored: $stored) === true) { + $this->keepKey(event: $event, stored: $stored); + return; + } + + if ($key === $oldKey) { + return; + } + + $refusal = $this->keyRefusal(key: $key, oldKey: $oldKey, projectId: $projectId, stored: $stored); + if ($refusal !== null) { + $event->setErrors($refusal); + $event->stopPropagation(); + return; + } + + $this->storeKey(event: $event, key: $key, sent: $data['key']); + + if ($oldData !== null && $oldKey === '' && $key !== '' && $projectId !== '') { + $this->jobList->add(NumberProjectTasks::class, ['project' => $projectId]); + } + }//end guardProject() + + /** + * Whether a write left the key out: not sent, or nulled by a PUT on a numbered project. + * + * @param array $data The new project data. + * @param string $key The normalised new key. + * @param array $stored The stored project. + * + * @return bool + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.3 + */ + private function keyLeftOut(array $data, string $key, array $stored): bool { + if (array_key_exists('key', $data) === false) { + return true; + } + + return $key === '' && $this->keys->hasNumberedTasks(project: $stored) === true; + }//end keyLeftOut() + + /** + * Replace a client value of the counter with the stored one. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param array $data The new project data. + * @param array $stored The stored project, empty on a create. + * + * @return void + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.1 + */ + private function keepCounter(ObjectCreatingEvent|ObjectUpdatingEvent $event, array $data, array $stored): void { + $counter = ($stored[WorkItemKeyService::COUNTER] ?? null); + if (($data[WorkItemKeyService::COUNTER] ?? null) !== $counter) { + $event->setModifiedData(array_merge($event->getModifiedData(), [WorkItemKeyService::COUNTER => $counter])); + } + }//end keepCounter() + + /** + * Keep the stored key on a write that left it out. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param array $stored The stored project, empty on a create. + * + * @return void + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.3 + */ + private function keepKey(ObjectCreatingEvent|ObjectUpdatingEvent $event, array $stored): void { + if ($this->keys->normalise(key: ($stored['key'] ?? null)) !== '') { + $event->setModifiedData(array_merge($event->getModifiedData(), ['key' => $stored['key']])); + } + }//end keepKey() + + /** + * Store an accepted key uppercase, or no key for an empty one. + * + * @param ObjectCreatingEvent|ObjectUpdatingEvent $event The event. + * @param string $key The normalised key. + * @param mixed $sent The key as sent. + * + * @return void + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.2 + */ + private function storeKey(ObjectCreatingEvent|ObjectUpdatingEvent $event, string $key, mixed $sent): void { + $value = null; + if ($key !== '') { + $value = $key; + } + + if ($value !== $sent) { + $event->setModifiedData(array_merge($event->getModifiedData(), ['key' => $value])); + } + }//end storeKey() + + /** + * Why a key change is refused, or null when it is allowed. + * + * @param string $key The new normalised key. + * @param string $oldKey The stored normalised key. + * @param string $projectId The project UUID. + * @param array $stored The stored project. + * + * @return array{code:string,message:string}|null + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.3 + */ + private function keyRefusal(string $key, string $oldKey, string $projectId, array $stored): ?array { + if ($oldKey !== '' && $this->keys->hasNumberedTasks(project: $stored) === true) { + return ['code' => self::ERROR_FIXED, 'message' => 'The key cannot change once tasks carry it.']; + } + + if ($key === '') { + return null; + } + + if ($this->keys->isValidFormat(key: $key) === false) { + return ['code' => self::ERROR_FORMAT, 'message' => 'A key has 2 to 10 letters and digits and starts with a letter.']; + } + + if ($this->keys->isTaken(key: $key, projectId: $projectId) === true) { + return ['code' => self::ERROR_USED, 'message' => 'This key is already used by another project.']; + } + + return null; + }//end keyRefusal() + + /** + * Whether OpenRegister runs this write as a trusted system operation. + * + * @return bool + */ + private function isSystemOperation(): bool { + $class = self::OR_SYSTEM_CONTEXT; + + return (class_exists($class) === true && $class::isActive() === true); + }//end isSystemOperation() +}//end class diff --git a/lib/Notification/AssignmentEmailRecipientResolver.php b/lib/Notification/AssignmentEmailRecipientResolver.php new file mode 100644 index 00000000..8345ea8e --- /dev/null +++ b/lib/Notification/AssignmentEmailRecipientResolver.php @@ -0,0 +1,44 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Notification; + +use OCA\Planninq\Service\NotificationSwitchService; + +/** + * The assignee of `taskAssignedOnCreateEmail` and `taskAssignedEmail`. + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.2 + */ +final class AssignmentEmailRecipientResolver extends EmailOptInRecipientResolver { + + /** + * @return string + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.2 + */ + protected function inAppSwitch(): string { + return NotificationSwitchService::ASSIGNED_KEY; + }//end inAppSwitch() +}//end class diff --git a/lib/Notification/DueSoonEmailRecipientResolver.php b/lib/Notification/DueSoonEmailRecipientResolver.php new file mode 100644 index 00000000..e7d93efa --- /dev/null +++ b/lib/Notification/DueSoonEmailRecipientResolver.php @@ -0,0 +1,44 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Notification; + +use OCA\Planninq\Service\NotificationSwitchService; + +/** + * The assignee of `taskDueSoonEmail`. + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.2 + */ +final class DueSoonEmailRecipientResolver extends EmailOptInRecipientResolver { + + /** + * @return string + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.2 + */ + protected function inAppSwitch(): string { + return NotificationSwitchService::DUE_REMINDER_KEY; + }//end inAppSwitch() +}//end class diff --git a/lib/Notification/EmailOptInRecipientResolver.php b/lib/Notification/EmailOptInRecipientResolver.php new file mode 100644 index 00000000..5be2252a --- /dev/null +++ b/lib/Notification/EmailOptInRecipientResolver.php @@ -0,0 +1,95 @@ +}`, so the switch is checked + * each time, not when the rule was written. + * + * @category Notification + * @package OCA\Planninq\Notification + * + * @author Conduction Development Team + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Notification; + +use OCA\OpenRegister\Db\ObjectEntity; +use OCA\OpenRegister\Service\Notification\RecipientResolverInterface; +use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\Service\NotificationSwitchService; +use OCP\IConfig; +use OCP\IUserManager; + +/** + * The assignee, when they asked for mail about this kind of notification. + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.2 + */ +abstract class EmailOptInRecipientResolver implements RecipientResolverInterface { + + /** + * Constructor. + * + * @param IConfig $config The per-user switches. + * @param IUserManager $userManager The assignee's account, for the email address. + */ + public function __construct( + private IConfig $config, + private IUserManager $userManager, + ) { + }//end __construct() + + /** + * The user value of the in-app switch this mail follows; `false` silences the mail. + * + * @return string + */ + abstract protected function inAppSwitch(): string; + + /** + * The assignee's uid, or nobody. + * + * @param ObjectEntity $object The task. + * @param array $context Trigger extras (unused). + * + * @return array + * + * @SuppressWarnings(PHPMD.UnusedFormalParameter) The interface passes the trigger extras; the switches alone decide. + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.2 + */ + public function resolve(ObjectEntity $object, array $context): array { + $uid = ($object->getObject()['assignedTo'] ?? null); + if (is_string($uid) === false || $uid === '') { + return []; + } + + $byEmail = $this->config->getUserValue($uid, Application::APP_ID, NotificationSwitchService::EMAIL_KEY, 'false'); + $inApp = $this->config->getUserValue($uid, Application::APP_ID, $this->inAppSwitch(), 'true'); + if ($byEmail !== 'true' || $inApp === 'false') { + return []; + } + + $user = $this->userManager->get($uid); + if ($user === null || (string)$user->getEMailAddress() === '') { + return []; + } + + return [$uid]; + }//end resolve() +}//end class diff --git a/lib/Portal/PortalContributionProvider.php b/lib/Portal/PortalContributionProvider.php index e55a8057..88c80166 100644 --- a/lib/Portal/PortalContributionProvider.php +++ b/lib/Portal/PortalContributionProvider.php @@ -183,7 +183,7 @@ private function externalEmployeeContribution(): array { [ 'id' => 'contractorTimeEntries', 'register' => self::REGISTER, - 'schema' => 'timeEntry', + 'schema' => 'plannedTimeEntry', 'scopeField' => 'contractorRef', 'scopeClaim' => 'contractorRef', 'label' => 'My time entries', @@ -219,7 +219,7 @@ private function externalEmployeeContribution(): array { 'type' => 'create', 'label' => 'Log time', 'register' => self::REGISTER, - 'schema' => 'timeEntry', + 'schema' => 'plannedTimeEntry', 'fields' => [ 'task', 'date', diff --git a/lib/Repair/ApplyProjectPolicy.php b/lib/Repair/ApplyProjectPolicy.php new file mode 100644 index 00000000..b360ce15 --- /dev/null +++ b/lib/Repair/ApplyProjectPolicy.php @@ -0,0 +1,77 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.2 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Repair; + +use OCA\Planninq\Service\ProjectPolicySchemaService; +use OCA\Planninq\Service\CreationPolicyService; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; + +/** + * Re-applies the project reviewers after the register import. + */ +class ApplyProjectPolicy implements IRepairStep { + + /** + * Constructor. + * + * @param CreationPolicyService $policy Knows the reviewer groups. + * @param ProjectPolicySchemaService $policySchema Writes them into the live schema. + */ + public function __construct( + private CreationPolicyService $policy, + private ProjectPolicySchemaService $policySchema, + ) { + }//end __construct() + + /** + * The step's name. + * + * @return string + */ + public function getName(): string { + return 'Write the reviewers of Planninq project requests into the project schema'; + }//end getName() + + /** + * Write the reviewers; never throws. + * + * @param IOutput $output The output. + * + * @return void + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.2 + */ + public function run(IOutput $output): void { + if ($this->policySchema->apply(groups: $this->policy->reviewerGroups()) === false) { + $output->warning('Planninq project reviewers were not written; admins still review project requests.'); + } + }//end run() +}//end class diff --git a/lib/Repair/AssignBoardColumns.php b/lib/Repair/AssignBoardColumns.php new file mode 100644 index 00000000..860dc907 --- /dev/null +++ b/lib/Repair/AssignBoardColumns.php @@ -0,0 +1,102 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-2.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Repair; + +use OCA\Planninq\Service\BoardColumnService; +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; +use Psr\Log\LoggerInterface; + +/** + * Places every column-less task of every project into a board column. + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-2.1 + */ +class AssignBoardColumns implements IRepairStep { + + /** + * Constructor. + * + * @param BoardColumnService $columns Creates columns and places tasks. + * @param ProjectMembershipService $membership Tells whether OpenRegister is installed. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private BoardColumnService $columns, + private ProjectMembershipService $membership, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * The step's name, shown by occ. + * + * @return string + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-2.1 + */ + public function getName(): string { + return 'Put every Planninq task that has no board column into the column matching its status'; + }//end getName() + + /** + * Run the placement over every project; never throws. + * + * @param IOutput $output The repair output. + * + * @return void + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-2.1 + */ + public function run(IOutput $output): void { + if ($this->membership->isAvailable() === false) { + $output->warning('OpenRegister is not installed; skipping the Planninq board column placement.'); + return; + } + + try { + $result = $this->columns->assignAll(); + $output->info( + sprintf( + 'Placed %d task(s) in a board column across %d project(s); created %d column(s).', + $result['assigned'], + $result['projects'], + $result['created'] + ) + ); + } catch (\Throwable $e) { + $output->warning('Could not place Planninq tasks in board columns: ' . $e->getMessage()); + $this->logger->error( + 'Planninq: board column placement failed; tasks without a column stay off the board until it runs again', + ['exception' => $e->getMessage()] + ); + } + }//end run() +}//end class diff --git a/lib/Repair/BackfillProjectMembers.php b/lib/Repair/BackfillProjectMembers.php new file mode 100644 index 00000000..fc71ffdf --- /dev/null +++ b/lib/Repair/BackfillProjectMembers.php @@ -0,0 +1,105 @@ +` and + * ``: the register import that adds the property has to run first, + * and `` is the block that ran for the planix to planninq rename. + * Idempotent: an object already in step is not written. It never throws, since + * an exception under `` aborts the install. + * + * @category Repair + * @package OCA\Planninq\Repair + * + * @author Conduction Development Team + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/specs/projects.md + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Repair; + +use OCA\Planninq\Service\ProjectMembershipService; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; +use Psr\Log\LoggerInterface; + +/** + * Back-fills the denormalised members list on existing project objects. + * + * @spec openspec/specs/projects.md + */ +class BackfillProjectMembers implements IRepairStep { + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Computes and writes the members list. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectMembershipService $membership, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * The name shown while the step runs. + * + * @return string + * + * @spec openspec/specs/projects.md + */ + public function getName(): string { + return 'Fill the members list of Planninq tasks, columns, phases and time entries from their project'; + }//end getName() + + /** + * Bring every project's objects in step. + * + * @param IOutput $output Progress output. + * + * @return void + * + * @spec openspec/specs/projects.md + */ + public function run(IOutput $output): void { + if ($this->membership->isAvailable() === false) { + $output->warning('OpenRegister is not installed; skipping the Planninq members back-fill.'); + return; + } + + try { + $result = $this->membership->syncAll(); + $output->info( + sprintf( + 'Filled the members list on %d object(s) across %d project(s).', + $result['written'], + $result['projects'] + ) + ); + } catch (\Throwable $e) { + $output->warning('Could not fill the Planninq members lists: ' . $e->getMessage()); + $this->logger->error( + 'Planninq: members back-fill failed; members may not see existing tasks until it runs again', + ['exception' => $e->getMessage()] + ); + } + }//end run() +}//end class diff --git a/lib/Repair/RenameTimeEntrySchemaSlug.php b/lib/Repair/RenameTimeEntrySchemaSlug.php new file mode 100644 index 00000000..25aeb6d3 --- /dev/null +++ b/lib/Repair/RenameTimeEntrySchemaSlug.php @@ -0,0 +1,206 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + * + * @version GIT: + * + * @link https://planninq.nl + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Repair; + +use OCP\DB\Exception; +use OCP\IDBConnection; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; +use Psr\Log\LoggerInterface; + +/** + * Renames the time-entry schema slug in place, ahead of the register import. + * + * @spec exclude No canonical spec covers the fleet-wide slug collision + * migration. Pointing this at an existing spec would report conformance to a + * requirement that says nothing about it. + */ +class RenameTimeEntrySchemaSlug implements IRepairStep { + /** + * The slug this step migrates away from. + * + * @var string + */ + private const OLD_SLUG = 'timeEntry'; + + /** + * The namespaced slug the register fragment now declares. + * + * @var string + */ + private const NEW_SLUG = 'plannedTimeEntry'; + + /** + * The owning application, as stored on the schema row. + * + * @var string + */ + private const APPLICATION = 'planninq'; + + /** + * Constructor. + * + * @param IDBConnection $db Database connection. + * @param LoggerInterface $logger Logger. + */ + public function __construct( + private readonly IDBConnection $db, + private readonly LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Human-readable step name. + * + * @return string + * + * @spec exclude No canonical spec covers the fleet-wide slug collision + * migration. Pointing this at an existing spec would report conformance to a + * requirement that says nothing about it. + */ + public function getName(): string { + return 'Namespace the planninq time-entry schema slug'; + }//end getName() + + /** + * Rename the slug, unless doing so would be ambiguous. + * + * @param IOutput $output Repair output. + * + * @return void + * + * @spec exclude No canonical spec covers the fleet-wide slug collision + * migration. Pointing this at an existing spec would report conformance to a + * requirement that says nothing about it. + */ + public function run(IOutput $output): void { + $old = $this->schemaIds(slug: self::OLD_SLUG); + $new = $this->schemaIds(slug: self::NEW_SLUG); + + if ($old === null || $new === null) { + $output->info('RenameTimeEntrySchemaSlug: schema table unreadable; leaving the slug alone.'); + return; + } + + if ($old === []) { + $output->info('RenameTimeEntrySchemaSlug: no time-entry schema on this install; nothing to do.'); + return; + } + + if ($new !== []) { + // Both slugs present: each may own objects, and renaming would collide + // with the English row. Abandoning either set of objects is not a call + // a repair step gets to make without being asked. + $this->logger->warning( + 'RenameTimeEntrySchemaSlug: both slugs exist; refusing to merge them.', + ['old' => $old, 'new' => $new] + ); + $output->warning( + 'RenameTimeEntrySchemaSlug: both `' . self::OLD_SLUG . '` and `' . self::NEW_SLUG + . '` exist; refusing to merge them. Resolve by hand.' + ); + return; + } + + if (count($old) > 1) { + $this->logger->warning( + 'RenameTimeEntrySchemaSlug: duplicate time-entry slugs; refusing to guess.', + ['ids' => $old] + ); + $output->warning('RenameTimeEntrySchemaSlug: duplicate `' . self::OLD_SLUG . '` schemas; refusing to guess.'); + return; + } + + try { + $this->db->executeStatement( + 'UPDATE `*PREFIX*openregister_schemas` SET slug = ? WHERE id = ?', + [self::NEW_SLUG, $old[0]] + ); + } catch (Exception $e) { + // A failure here is safe: the import then creates a new schema rather + // than updating this one, which is the pre-existing behaviour. Loud, + // because the objects on the old schema stop being reachable. + $this->logger->error( + 'RenameTimeEntrySchemaSlug: slug rename failed; the import will create a second schema.', + ['id' => $old[0], 'exception' => $e->getMessage()] + ); + $output->warning('RenameTimeEntrySchemaSlug: slug rename failed; see the log.'); + return; + } + + $output->info( + 'RenameTimeEntrySchemaSlug: schema ' . $old[0] . ' renamed `' + . self::OLD_SLUG . '` -> `' . self::NEW_SLUG . '`; its objects stay attached.' + ); + }//end run() + + /** + * Ids of this application's schemas carrying the given slug. + * + * @param string $slug The schema slug to look for. + * + * @return array|null The ids, or null when the table cannot be read. + */ + private function schemaIds(string $slug): ?array { + try { + $rows = $this->db->executeQuery( + 'SELECT id FROM `*PREFIX*openregister_schemas` WHERE slug = ? AND application = ?', + [$slug, self::APPLICATION] + )->fetchAll(\PDO::FETCH_COLUMN); + + return array_values((array)$rows); + } catch (Exception $e) { + $this->logger->warning( + 'RenameTimeEntrySchemaSlug: could not read the schema table; skipping.', + ['exception' => $e->getMessage()] + ); + return null; + } + }//end schemaIds() +}//end class diff --git a/lib/Service/BoardColumnService.php b/lib/Service/BoardColumnService.php new file mode 100644 index 00000000..3724d283 --- /dev/null +++ b/lib/Service/BoardColumnService.php @@ -0,0 +1,310 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCP\App\IAppManager; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Creates default columns and places column-less tasks into a column. + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-2.1 + */ +class BoardColumnService { + + /** + * The register every planninq object lives in. + * + * @var string + */ + private const REGISTER = 'planninq'; + + /** + * Fallback column titles when the admin setting is empty or unreadable. + * + * @var array + */ + public const FALLBACK_TITLES = ['To do', 'In progress', 'Review', 'Done']; + + /** + * Constructor. + * + * @param ContainerInterface $container Resolves OpenRegister's ObjectService at runtime. + * @param ProjectMembershipService $membership Reads planninq objects with RBAC off. + * @param SettingsService $settings Holds the admin's default column titles. + * @param LoggerInterface $logger The logger. + * @param IAppManager $appManager Tells whether OpenRegister is installed. + */ + public function __construct( + private ContainerInterface $container, + private ProjectMembershipService $membership, + private SettingsService $settings, + private LoggerInterface $logger, + private IAppManager $appManager, + ) { + }//end __construct() + + /** + * Map a list of column titles to column objects. + * + * Every column is active except the last, which is the done column. The + * mapped status follows the position: the first column opens a task, the + * last finishes it, every column between puts it in progress. + * + * @param array $titles The column titles, left to right. + * @param string $projectId The project the columns belong to. + * + * @return array> + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-1.2 + */ + public function columnObjects(array $titles, string $projectId): array { + $titles = array_values( + array_filter( + array_map(static fn (mixed $title): string => trim((string)$title), $titles), + static fn (string $title): bool => $title !== '' + ) + ); + if ($titles === []) { + $titles = self::FALLBACK_TITLES; + } + + $last = (count($titles) - 1); + $columns = []; + foreach ($titles as $index => $title) { + $status = 'in_progress'; + $type = 'active'; + if ($index === $last) { + $status = 'done'; + $type = 'done'; + } else if ($index === 0) { + $status = 'open'; + } + + $columns[] = [ + 'title' => $title, + 'project' => $projectId, + 'order' => $index, + 'type' => $type, + 'status' => $status, + ]; + } + + return $columns; + }//end columnObjects() + + /** + * The admin's default column titles, or the fallback when the setting is unusable. + * + * @return array + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-1.2 + */ + public function defaultTitles(): array { + $raw = (string)($this->settings->getAdminSettings()['default_columns'] ?? ''); + $decoded = json_decode($raw, true); + if (is_array($decoded) === false || $decoded === []) { + return self::FALLBACK_TITLES; + } + + return array_values(array_map(static fn (mixed $title): string => (string)$title, $decoded)); + }//end defaultTitles() + + /** + * Create a project's default columns from the admin setting. + * + * Writes with RBAC off: the caller has already been allowed to create the + * project (the policy gate in ProjectController) or is a repair step. + * + * @param string $projectId The new project's UUID. + * + * @return array> The saved columns, id included. + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-1.2 + */ + public function createDefaultColumns(string $projectId): array { + if ($projectId === '' || $this->appManager->isInstalled('openregister') === false) { + return []; + } + + $objectService = $this->container->get('OCA\\OpenRegister\\Service\\ObjectService'); + $saved = []; + foreach ($this->columnObjects(titles: $this->defaultTitles(), projectId: $projectId) as $column) { + try { + $entity = $objectService->saveObject( + object: $column, + register: self::REGISTER, + schema: 'column', + _rbac: false, + _multitenancy: false + ); + } catch (\Throwable $e) { + $this->logger->error( + 'Planninq: could not create a default column', + ['project' => $projectId, 'column' => $column['title'], 'exception' => $e->getMessage()] + ); + continue; + } + + $saved[] = ['id' => (string)($entity?->getUuid() ?? '')] + $column; + }//end foreach + + return $saved; + }//end createDefaultColumns() + + /** + * Give every task of a project that has no column, and is not cancelled, a column. + * + * Creates the default columns first when the project has none. Tasks that + * already carry a column are never touched, so a second run writes nothing. + * + * @param string $projectId The project UUID. + * + * @return array{created:int,assigned:int} + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-2.1 + */ + public function assignColumns(string $projectId): array { + $columns = array_map( + static fn (array $row): array => ['id' => $row['id']] + $row['data'], + $this->membership->rows(schema: 'column', filters: ['project' => $projectId]) + ); + $created = 0; + if ($columns === []) { + $columns = $this->createDefaultColumns(projectId: $projectId); + $created = count($columns); + } + + usort($columns, static fn (array $a, array $b): int => ((int)($a['order'] ?? 0) <=> (int)($b['order'] ?? 0))); + + if ($this->appManager->isInstalled('openregister') === false) { + return ['created' => $created, 'assigned' => 0]; + } + + $objectService = $this->container->get('OCA\\OpenRegister\\Service\\ObjectService'); + $assigned = 0; + foreach ($this->membership->rows(schema: 'task', filters: ['project' => $projectId]) as $task) { + $status = (string)($task['data']['status'] ?? 'open'); + if (empty($task['data']['column']) === false || $status === 'cancelled') { + continue; + } + + $column = $this->columnForStatus(columns: $columns, status: $status); + if ($column === null || $column['id'] === '') { + continue; + } + + $assigned += $this->writeColumn(objectService: $objectService, task: $task, columnId: $column['id']); + } + + return ['created' => $created, 'assigned' => $assigned]; + }//end assignColumns() + + /** + * Run assignColumns() over every project. + * + * @return array{projects:int,created:int,assigned:int} + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-2.1 + */ + public function assignAll(): array { + $totals = ['projects' => 0, 'created' => 0, 'assigned' => 0]; + foreach ($this->membership->rows(schema: 'project', filters: []) as $project) { + $result = $this->assignColumns(projectId: $project['id']); + $totals['projects']++; + $totals['created'] += $result['created']; + $totals['assigned'] += $result['assigned']; + } + + return $totals; + }//end assignAll() + + /** + * The column a task with this status belongs in. + * + * A done task goes to the done column. Any other task goes to the first + * column mapped to its status, else the first active column. + * + * @param array> $columns The project's columns, in order. + * @param string $status The task status. + * + * @return array|null + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-2.1 + */ + public function columnForStatus(array $columns, string $status): ?array { + $wanted = [ + static fn (array $column): bool => ($status === 'done' && ($column['type'] ?? 'active') === 'done'), + static fn (array $column): bool => (($column['status'] ?? null) === $status), + static fn (array $column): bool => ($status !== 'done' && ($column['type'] ?? 'active') !== 'done'), + ]; + foreach ($wanted as $match) { + foreach ($columns as $column) { + if ($match($column) === true) { + return $column; + } + } + } + + return ($columns[0] ?? null); + }//end columnForStatus() + + /** + * Store a task's column, logging and counting nothing on failure. + * + * @param object $objectService OpenRegister's ObjectService. + * @param array{id:string,data:array} $task The task row. + * @param string $columnId The column UUID. + * + * @return int 1 when written, 0 when not. + */ + private function writeColumn(object $objectService, array $task, string $columnId): int { + $data = $task['data']; + $data['column'] = $columnId; + try { + $objectService->saveObject( + object: $data, + register: self::REGISTER, + schema: 'task', + uuid: $task['id'], + _rbac: false, + _multitenancy: false, + silent: true + ); + } catch (\Throwable $e) { + $this->logger->error( + 'Planninq: could not place a task in a board column', + ['task' => $task['id'], 'exception' => $e->getMessage()] + ); + return 0; + } + + return 1; + }//end writeColumn() +}//end class diff --git a/lib/Service/BoardViewPreferenceService.php b/lib/Service/BoardViewPreferenceService.php new file mode 100644 index 00000000..59c59aac --- /dev/null +++ b/lib/Service/BoardViewPreferenceService.php @@ -0,0 +1,151 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCA\Planninq\AppInfo\Application; +use OCP\IConfig; + +/** + * Stores each person's board view (card colour and swimlanes) per project. + * + * One user value holds a map of project id to {colour, group}; an unknown + * colour or grouping is stored as `none`, so a stored view is always valid. + * + * @spec openspec/changes/boards-card-display/tasks.md#task-3.1 + */ +class BoardViewPreferenceService { + + /** + * The user value holding the map of project id to view. + * + * @var string + */ + public const KEY = 'board_views'; + + /** + * The most project views one person keeps; the least recently saved go first. + * + * @var int + */ + public const MAX = 100; + + /** + * Card colour modes. + * + * @var array + */ + public const COLOURS = ['none', 'label', 'priority']; + + /** + * Swimlane fields. + * + * @var array + */ + public const GROUPS = ['none', 'assignee', 'priority', 'epic']; + + /** + * Constructor. + * + * @param IConfig $config Per-user values. + */ + public function __construct( + private IConfig $config, + ) { + }//end __construct() + + /** + * A person's board views, by project id. + * + * @param string $userId The user UID. + * + * @return array + * + * @spec openspec/changes/boards-card-display/tasks.md#task-3.1 + */ + public function views(string $userId): array { + $raw = $this->config->getUserValue($userId, Application::APP_ID, self::KEY, '{}'); + $decoded = json_decode((string) $raw, true); + if (is_array($decoded) === false) { + return []; + } + + $views = []; + foreach ($decoded as $projectId => $view) { + if (is_string($projectId) === true && $projectId !== '' && is_array($view) === true) { + $views[$projectId] = $this->normalise(view: $view); + } + } + + return $views; + }//end views() + + /** + * Store a person's view of one project board. + * + * @param string $userId The user UID. + * @param string $projectId The project id. + * @param array $view The choice: colour and group. + * + * @return void + * + * @spec openspec/changes/boards-card-display/tasks.md#task-3.1 + */ + public function save(string $userId, string $projectId, array $view): void { + if ($projectId === '') { + return; + } + + $views = $this->views(userId: $userId); + unset($views[$projectId]); + $views[$projectId] = $this->normalise(view: $view); + $views = array_slice($views, -self::MAX, null, true); + + $this->config->setUserValue($userId, Application::APP_ID, self::KEY, (string) json_encode($views)); + }//end save() + + /** + * A valid view, whatever was given. + * + * @param array $view The view as given. + * + * @return array{colour:string,group:string} + * + * @spec openspec/changes/boards-card-display/tasks.md#task-3.1 + */ + private function normalise(array $view): array { + $colour = ($view['colour'] ?? 'none'); + $group = ($view['group'] ?? 'none'); + if (in_array($colour, self::COLOURS, true) === false) { + $colour = 'none'; + } + + if (in_array($group, self::GROUPS, true) === false) { + $group = 'none'; + } + + return ['colour' => $colour, 'group' => $group]; + }//end normalise() +}//end class diff --git a/lib/Service/CaseHandoverService.php b/lib/Service/CaseHandoverService.php new file mode 100644 index 00000000..febe07a7 --- /dev/null +++ b/lib/Service/CaseHandoverService.php @@ -0,0 +1,374 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use DateTimeImmutable; +use OCA\Planninq\Exception\CaseHandoverException; +use OCP\App\IAppManager; +use OCP\Files\File; +use OCP\IUserSession; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Copies a project's files and metadata to its case. + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.1 + */ +class CaseHandoverService { + + /** + * The case app's id, as Dossiq declares it in appinfo/info.xml. + * + * @var string + */ + public const CASE_APP = 'dossiq'; + + /** + * Dossiq's register slug. + * + * @var string + */ + private const CASE_REGISTER = 'dossiq'; + + /** + * Dossiq's case schema slug. + * + * @var string + */ + private const CASE_SCHEMA = 'case'; + + /** + * Planninq's register slug. + * + * @var string + */ + private const REGISTER = 'planninq'; + + /** + * The metadata file's name. + * + * @var string + */ + private const METADATA_FILE = 'project-metadata.json'; + + /** + * Constructor. + * + * @param ContainerInterface $container Resolves OpenRegister's ObjectService and FileService. + * @param IAppManager $appManager Tells whether the case app is installed. + * @param IUserSession $userSession The acting user. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ContainerInterface $container, + private IAppManager $appManager, + private IUserSession $userSession, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Whether a handover can run on this instance: OpenRegister and the case app are installed. + * + * @return bool + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.3 + */ + public function isAvailable(): bool { + return $this->appManager->isInstalled('openregister') === true && $this->appManager->isInstalled(self::CASE_APP) === true; + }//end isAvailable() + + /** + * The handovers recorded on a project, read with the acting user's rights. + * + * @param string $projectId The project UUID. + * + * @return list> + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.3 + */ + public function handovers(string $projectId): array { + if ($this->appManager->isInstalled('openregister') === false) { + return []; + } + + $project = $this->find(schema: 'project', id: $projectId, register: self::REGISTER); + + return array_values((array)($project['data']['caseHandovers'] ?? [])); + }//end handovers() + + /** + * Hand the project over to its case and record it on the project. + * + * @param string $projectId The project UUID. + * + * @return array The handover record. + * + * @throws CaseHandoverException When there is no case app, no case link or no readable case. + * + * @spec openspec/changes/integration-case-bridge/tasks.md#task-3.1 + */ + public function handOver(string $projectId): array { + if ($this->isAvailable() === false) { + throw new CaseHandoverException(reason: CaseHandoverException::NO_CASE_APP, message: 'The case app is not installed.'); + } + + $project = $this->find(schema: 'project', id: $projectId, register: self::REGISTER); + if ($project === null) { + throw new CaseHandoverException(reason: CaseHandoverException::NO_CASE, message: 'The project cannot be read.'); + } + + $caseId = (string)($project['data']['caseReference'] ?? ''); + if ($caseId === '') { + throw new CaseHandoverException(reason: CaseHandoverException::NO_CASE, message: 'The project is not linked to a case.'); + } + + $case = $this->find(schema: self::CASE_SCHEMA, id: $caseId, register: self::CASE_REGISTER); + if ($case === null) { + throw new CaseHandoverException(reason: CaseHandoverException::CASE_NOT_FOUND, message: 'The linked case was not found or cannot be read.'); + } + + $tasks = $this->tasks(projectId: $projectId); + $record = [ + 'date' => (new DateTimeImmutable())->format(DATE_ATOM), + 'by' => (string)($this->userSession->getUser()?->getUID() ?? ''), + 'case' => $caseId, + 'files' => [], + 'failures' => [], + ]; + + $sources = [['entity' => $project['entity'], 'prefix' => '']]; + foreach ($tasks as $task) { + $sources[] = ['entity' => $task['entity'], 'prefix' => $this->taskPrefix(task: $task['data'])]; + } + + foreach ($sources as $source) { + foreach ($this->fileService()->getFiles($source['entity']) as $file) { + if ($file instanceof File === false) { + // A folder in the object's folder is not a document of the record. + continue; + } + + $name = $source['prefix'] . $file->getName(); + $this->copy(case: $case['entity'], name: $name, content: (string)$file->getContent(), record: $record); + } + } + + $flags = (JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + $metadata = (string)json_encode($this->metadata(project: $project, tasks: $tasks), $flags); + $this->copy(case: $case['entity'], name: self::METADATA_FILE, content: $metadata, record: $record); + + $data = $project['data']; + unset($data['@self'], $data['id']); + $data['caseHandovers'] = array_values((array)($data['caseHandovers'] ?? [])); + $data['caseHandovers'][] = $record; + $this->objectService()->saveObject(object: $data, register: self::REGISTER, schema: 'project', uuid: $projectId); + + $this->logger->info( + 'Planninq: project handed over to its case', + ['project' => $projectId, 'case' => $caseId, 'files' => count($record['files']), 'failures' => count($record['failures'])] + ); + + return $record; + }//end handOver() + + /** + * Copy one file to the case and check it reads back unchanged. + * + * @param object $case The case entity. + * @param string $name The file name wanted. + * @param string $content The bytes. + * @param array $record The handover record, updated. + * + * @return void + */ + private function copy(object $case, string $name, string $content, array &$record): void { + $before = hash('sha256', $content); + $target = $this->freeName(case: $case, name: $name); + + try { + $written = $this->fileService()->addFile(objectEntity: $case, fileName: $target, content: $content); + $after = hash('sha256', (string)$written->getContent()); + } catch (\Throwable $e) { + $this->logger->warning('Planninq: a file was not handed over', ['name' => $name, 'exception' => $e->getMessage()]); + $record['failures'][] = ['name' => $name, 'reason' => 'write']; + return; + } + + if ($after !== $before) { + $record['failures'][] = ['name' => $name, 'reason' => 'checksum']; + return; + } + + $record['files'][] = ['name' => $target, 'sha256' => $before, 'size' => strlen($content)]; + }//end copy() + + /** + * A name not yet taken on the case: "plan.pdf", else "plan (1).pdf", and so on. + * + * @param object $case The case entity. + * @param string $name The name wanted. + * + * @return string + */ + private function freeName(object $case, string $name): string { + $dot = strrpos($name, '.'); + $stem = $name; + $ext = ''; + if ($dot !== false && $dot > 0) { + $stem = substr($name, 0, $dot); + $ext = substr($name, $dot); + } + + $candidate = $name; + for ($i = 1; $i < 1000 && $this->fileService()->getFile($case, $candidate) !== null; $i++) { + $candidate = $stem . ' (' . $i . ')' . $ext; + } + + return $candidate; + }//end freeName() + + /** + * The prefix a task's files get on the case: its key and title. + * + * @param array $task The task data. + * + * @return string + */ + private function taskPrefix(array $task): string { + $label = trim(trim((string)($task['key'] ?? '')) . ' ' . trim((string)($task['title'] ?? ''))); + $label = str_replace(['/', '\\'], '-', $label); + if ($label === '') { + return ''; + } + + return $label . ' - '; + }//end taskPrefix() + + /** + * What the metadata file says about the project and its tasks. + * + * @param array{data:array} $project The project. + * @param list}> $tasks Its tasks. + * + * @return array + */ + private function metadata(array $project, array $tasks): array { + $data = $project['data']; + unset($data['@self'], $data['caseHandovers'], $data['portfolioReaders']); + + $rows = []; + foreach ($tasks as $task) { + $rows[] = [ + 'id' => $task['id'], + 'key' => ($task['data']['key'] ?? null), + 'title' => ($task['data']['title'] ?? null), + 'status' => ($task['data']['status'] ?? null), + 'startDate' => ($task['data']['startDate'] ?? null), + 'dueDate' => ($task['data']['dueDate'] ?? null), + 'assignedTo' => ($task['data']['assignedTo'] ?? null), + ]; + } + + return ['source' => 'planninq', 'project' => $data, 'tasks' => $rows]; + }//end metadata() + + /** + * The project's tasks, read with the acting user's rights. + * + * @param string $projectId The project UUID. + * + * @return list,entity:object}> + */ + private function tasks(string $projectId): array { + $rows = $this->objectService()->searchObjectsBySlug(registerSlug: self::REGISTER, schemaSlug: 'task', filters: ['project' => $projectId]); + if (is_array($rows) === true && array_key_exists('results', $rows) === true) { + $rows = (array)$rows['results']; + } + + $tasks = []; + foreach ((array)$rows as $row) { + if (is_object($row) === false) { + continue; + } + + $tasks[] = ['id' => (string)$row->getUuid(), 'data' => (array)$row->getObject(), 'entity' => $row]; + } + + return $tasks; + }//end tasks() + + /** + * One object read with the acting user's rights, or null when it is missing or unreadable. + * + * @param string $schema The schema slug. + * @param string $id The UUID. + * @param string $register The register slug. + * + * @return array{entity:object,data:array}|null + */ + private function find(string $schema, string $id, string $register): ?array { + try { + $entity = $this->objectService()->find(id: $id, register: $register, schema: $schema); + } catch (\Throwable $e) { + $this->logger->info('Planninq: handover could not read an object', ['schema' => $schema, 'id' => $id, 'exception' => $e->getMessage()]); + return null; + } + + if ($entity === null) { + return null; + } + + return ['entity' => $entity, 'data' => (array)$entity->getObject()]; + }//end find() + + /** + * OpenRegister's ObjectService. + * + * @return object + */ + private function objectService(): object { + return $this->container->get('OCA\\OpenRegister\\Service\\ObjectService'); + }//end objectService() + + /** + * OpenRegister's FileService. + * + * @return object + */ + private function fileService(): object { + return $this->container->get('OCA\\OpenRegister\\Service\\FileService'); + }//end fileService() +}//end class diff --git a/lib/Service/CreationPolicyService.php b/lib/Service/CreationPolicyService.php new file mode 100644 index 00000000..b21cd3eb --- /dev/null +++ b/lib/Service/CreationPolicyService.php @@ -0,0 +1,219 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-2.1 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCA\Planninq\AppInfo\Application; +use OCP\IAppConfig; +use OCP\IGroupManager; +use OCP\IUserSession; + +/** + * The project creation policy. + */ +class CreationPolicyService { + + /** + * Constructor. + * + * @param IAppConfig $appConfig The stored policy. + * @param IGroupManager $groupManager Group membership and existence. + * @param IUserSession $userSession The current user. + */ + public function __construct( + private IAppConfig $appConfig, + private IGroupManager $groupManager, + private IUserSession $userSession, + ) { + }//end __construct() + + /** + * Whether the current user may create a project under the stored policy; admins always may. + * + * @return bool + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-2.1 + */ + public function canCreate(): bool { + $policy = $this->appConfig->getValueString(Application::APP_ID, 'allow_project_creation', 'all'); + if ($policy === 'admins') { + return $this->isAdmin(); + } + + if ($policy === 'groups') { + return $this->isAdmin() === true || $this->isInCreationGroup() === true; + } + + // Default ('all'): any authenticated user may create. + return $this->userSession->getUser() !== null; + }//end canCreate() + + /** + * Whether the current user may request a project: requests are on and the user may not create one. + * + * @return bool + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.1 + */ + public function canRequest(): bool { + return $this->userSession->getUser() !== null + && $this->appConfig->getValueString(Application::APP_ID, SettingsService::REQUESTS_KEY, 'off') === 'on' + && $this->canCreate() === false; + }//end canRequest() + + /** + * Whether the current user is a Nextcloud admin. + * + * @return bool + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-2.1 + */ + public function isAdmin(): bool { + $user = $this->userSession->getUser(); + + return ($user !== null && $this->groupManager->isAdmin($user->getUID())); + }//end isAdmin() + + /** + * Whether the current user is in one of the groups that may create projects. + * + * @return bool + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-2.1 + */ + private function isInCreationGroup(): bool { + $user = $this->userSession->getUser(); + if ($user === null) { + return false; + } + + foreach ($this->creationGroups() as $group) { + if ($this->groupManager->isInGroup($user->getUID(), $group) === true) { + return true; + } + } + + return false; + }//end isInCreationGroup() + + /** + * The groups besides admins who review project requests: the creation groups under the `groups` policy. + * + * @return array + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.2 + */ + public function reviewerGroups(): array { + if ($this->appConfig->getValueString(Application::APP_ID, 'allow_project_creation', 'all') !== 'groups') { + return []; + } + + return $this->creationGroups(); + }//end reviewerGroups() + + /** + * The stored group ids of the `groups` creation policy. + * + * @return array + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-2.1 + */ + public function creationGroups(): array { + $groups = json_decode($this->appConfig->getValueString(Application::APP_ID, SettingsService::CREATION_GROUPS_KEY, '[]'), true); + if (is_array($groups) === false) { + return []; + } + + return array_values(array_filter($groups, static fn ($group): bool => is_string($group) === true && $group !== '')); + }//end creationGroups() + + /** + * A creation policy setting as it is stored, or null to refuse it; any other setting unchanged. + * + * @param string $key The setting key. + * @param string $value The submitted value. + * + * @return string|null The value unchanged for other keys; the policy or the cleaned group list; null when refused. + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-2.1 + */ + public function normalise(string $key, string $value): ?string { + if ($key === 'allow_project_creation') { + if (in_array($value, SettingsService::CREATION_POLICIES, true) === false) { + return null; + } + + return $value; + } + + if ($key === SettingsService::REQUESTS_KEY) { + if (in_array($value, ['on', 'off'], true) === false) { + return null; + } + + return $value; + } + + if ($key !== SettingsService::CREATION_GROUPS_KEY) { + return $value; + } + + $groups = json_decode($value, true); + if (is_array($groups) === false) { + return null; + } + + $known = array_filter( + $groups, + fn ($group): bool => is_string($group) === true && $this->groupManager->groupExists($group) === true + ); + + return (string)json_encode(array_values(array_unique($known))); + }//end normalise() + + /** + * For an admin: the listed creation groups that no longer exist. + * + * @return array> + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-2.2 + */ + public function missingGroups(): array { + if ($this->isAdmin() === false) { + return []; + } + + return [ + 'creationGroupsMissing' => array_values( + array_filter($this->creationGroups(), fn (string $group): bool => $this->groupManager->groupExists($group) === false) + ), + ]; + }//end missingGroups() +}//end class diff --git a/lib/Service/CurrentUserGroupsState.php b/lib/Service/CurrentUserGroupsState.php new file mode 100644 index 00000000..6d803b88 --- /dev/null +++ b/lib/Service/CurrentUserGroupsState.php @@ -0,0 +1,79 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-4.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCP\AppFramework\Services\InitialStateProvider; +use OCP\IGroupManager; +use OCP\IUserSession; + +/** + * The initial state `planninq/groups`: the caller's group ids. + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-4.1 + */ +class CurrentUserGroupsState extends InitialStateProvider { + /** + * Constructor. + * + * @param IUserSession $userSession The session of the signed-in user. + * @param IGroupManager $groupManager Nextcloud's group manager. + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-4.1 + */ + public function __construct( + private readonly IUserSession $userSession, + private readonly IGroupManager $groupManager, + ) { + }//end __construct() + + /** + * The initial-state key the browser reads with loadState('planninq', 'groups'). + * + * @return string + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-4.1 + */ + public function getKey(): string { + return 'groups'; + }//end getKey() + + /** + * The signed-in user's group ids, or an empty list without a session. + * + * @return array + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-4.1 + */ + public function getData(): array { + $user = $this->userSession->getUser(); + if ($user === null) { + return []; + } + + return array_values(array_map('strval', $this->groupManager->getUserGroupIds($user))); + }//end getData() +}//end class diff --git a/lib/Service/DemoDataService.php b/lib/Service/DemoDataService.php index 747b669a..ec087fb4 100644 --- a/lib/Service/DemoDataService.php +++ b/lib/Service/DemoDataService.php @@ -2,10 +2,11 @@ /** * Planninq DemoDataService. * - * Imports `lib/Settings/planninq_mock_register.json` — a `type: mock` descriptor generated from this - * app's own schemas by `hydra-gates/scripts/lib/generate_mock_register.py`, so - * every value is conformant BY CONSTRUCTION rather than written to look - * plausible. + * Imports `lib/Settings/planninq_mock_register.json`, a `type: mock` descriptor + * of curated example objects with fixed ids (platform-demo-data). The ADR-111 + * generator keeps them (`--keep`) and validates them (`--check`), and + * DemoDatasetTest resolves every reference. Before the import the descriptor is + * fitted to the admin who loads it and to the load day, see prepare(). * * 🔴 ON DEMAND ONLY, NEVER ON INSTALL. A mock register has no Repair step: demo * data is something an operator asks for from the setup wizard, and an install @@ -27,7 +28,10 @@ namespace OCA\Planninq\Service; use OCA\Planninq\AppInfo\Application; +use DateTimeImmutable; use OCP\App\IAppManager; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\IUserSession; use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; use RuntimeException; @@ -35,7 +39,7 @@ /** * Imports the shipped demo dataset on request. * - * @spec exclude Demo-data import; ADR-111 rule 1, no per-app behavioural spec. + * @spec openspec/changes/platform-demo-data/tasks.md#task-2.1 */ class DemoDataService { /** @@ -57,12 +61,21 @@ class DemoDataService { */ private const CONFIG_APP_ID = Application::APP_ID . '.demo'; + /** + * The value the descriptor writes wherever a user id belongs. + * + * @var string + */ + public const OPERATOR_PLACEHOLDER = '@operator'; + /** * Constructor. * - * @param IAppManager $appManager Resolves this app's path and version. - * @param ContainerInterface $container Resolves OpenRegister's importer. - * @param LoggerInterface $logger Records what was imported. + * @param IAppManager $appManager Resolves this app's path and version. + * @param ContainerInterface $container Resolves OpenRegister's importer. + * @param LoggerInterface $logger Records what was imported. + * @param IUserSession $userSession The admin who loads the example data. + * @param ITimeFactory $timeFactory The load day. * * @return void */ @@ -70,6 +83,8 @@ public function __construct( private readonly IAppManager $appManager, private readonly ContainerInterface $container, private readonly LoggerInterface $logger, + private readonly IUserSession $userSession, + private readonly ITimeFactory $timeFactory, ) { }//end __construct() @@ -84,6 +99,108 @@ public function isAvailable(): bool { return is_file($this->descriptorPath()) === true; }//end isAvailable() + /** + * The answer that means "plant nothing". + * + * 🔴 NOT THE ABSENCE OF AN ANSWER. An operator who declines has FINISHED the + * step; a step that can never be marked done reopens the wizard over every + * page (nextcloud-vue#806). + * + * @var string + */ + public const NONE_DATASET = 'none'; + + /** + * The id of the dataset this app ships. + * + * @var string + */ + public const DEMO_DATASET = 'demo'; + + /** + * Every answer the wizard's choice step may offer, declining included. + * + * 🔴 THE SERVER OWNS THIS LIST, AND THAT IS THE POINT. The step declares + * `optionsSource: datasets` and no options of its own, so the label, the + * description and the object count come from the descriptor that will + * actually be imported. A manifest that restated them could disagree with + * what lands, and nothing would notice. + * + * @return array The answers. + * + * @spec openspec/changes/platform-demo-data/tasks.md#task-2.1 + */ + public function listChoices(): array { + $choices = [ + [ + 'id' => self::NONE_DATASET, + 'label' => 'None, I will set this up myself', + 'description' => 'Nothing is imported. You start with an empty app and add your own data.', + 'objectCount' => 0, + 'icon' => 'CloseCircleOutline', + ], + ]; + + $objects = $this->shippedObjectCount(); + if ($objects !== null) { + $choices[] = [ + 'id' => self::DEMO_DATASET, + 'label' => 'Example data', + // 🔴 NO NUMBER IN THIS SENTENCE. The wizard runs a card's + // description through the app's translation function, which is a + // literal lookup, so an interpolated count would make the string + // untranslatable and leave a Dutch operator reading English. The + // count travels as `objectCount` and the card renders it as a + // stat, with a label the library translates. + 'description' => ( + 'Three example projects with boards, phases, tasks, dependencies, logged time, ' + . 'risks, status reports and portfolios. You become their owner and the person ' + . 'the tasks are assigned to, and the dates fall around today. Safe to run more ' + . 'than once, and you can delete it afterwards.' + ), + 'objectCount' => $objects, + 'icon' => 'DatabaseOutline', + ]; + } + + return $choices; + + }//end listChoices() + + /** + * How many objects the shipped descriptor carries, or null when it ships none. + * + * Counted from the FILE, so the card promises the number that will actually + * be imported. A missing or malformed descriptor returns null and the app + * then offers only "None" — honest, rather than an import that cannot run. + * + * @return integer|null The object count, or null when there is no usable descriptor. + */ + private function shippedObjectCount(): ?int { + $path = $this->descriptorPath(); + if (is_file($path) === false) { + return null; + } + + $raw = file_get_contents($path); + if ($raw === false) { + return null; + } + + $data = json_decode($raw, true); + if (is_array($data) === false) { + return null; + } + + $components = ($data['components'] ?? []); + if (is_array($components) === false || is_array(($components['objects'] ?? null)) === false) { + return 0; + } + + return count($components['objects']); + + }//end shippedObjectCount() + /** * Import the demo dataset. * @@ -93,9 +210,9 @@ public function isAvailable(): bool { * * @return array{objects: integer, registers: integer, schemas: integer} What was imported. * - * @throws RuntimeException When the descriptor is missing, unreadable, or OpenRegister is absent. + * @throws RuntimeException When the descriptor is missing, unreadable, OpenRegister is absent, or nobody is signed in. * - * @spec exclude Demo-data import; ADR-111 rule 1 has no per-app behavioural spec. + * @spec openspec/changes/platform-demo-data/tasks.md#task-2.1 */ public function install(): array { $path = $this->descriptorPath(); @@ -123,6 +240,14 @@ public function install(): array { $objects = count($components['objects']); } + $operator = $this->userSession->getUser(); + if ($operator === null) { + throw new RuntimeException('Example data is loaded by a signed-in admin, and nobody is signed in.'); + } + + $today = $this->timeFactory->now(); + $data = $this->prepare(data: $data, operator: $operator->getUID(), today: new DateTimeImmutable($today->format('Y-m-d'))); + $result = $this->configurationService()->importFromApp( appId: self::CONFIG_APP_ID, data: $data, @@ -147,6 +272,100 @@ public function install(): array { return $imported; }//end install() + /** + * Fit the shipped descriptor to the admin who loads it and to the load day. + * + * Every `@operator` value, alone or inside a list, becomes the admin's uid, so + * the example projects are theirs and show up on their pages; no invented + * account is written. Every date and date-time moves by the days between the + * descriptor's `x-openregister.anchorDate` and today, so a task due three + * days after the anchor is due three days after loading. Without an anchor + * the dates stay as written. + * + * @param array $data The decoded descriptor. + * @param string $operator The uid of the admin who loads it. + * @param DateTimeImmutable $today The load day (time of day ignored). + * + * @return array The descriptor to import. + * + * @spec openspec/changes/platform-demo-data/tasks.md#task-2.1 + */ + public function prepare(array $data, string $operator, DateTimeImmutable $today): array { + $days = 0; + $anchor = ($data['x-openregister']['anchorDate'] ?? null); + if (is_string($anchor) === true && preg_match('/^\d{4}-\d{2}-\d{2}$/', $anchor) === 1) { + $from = new DateTimeImmutable($anchor); + $to = new DateTimeImmutable($today->format('Y-m-d')); + $days = (int)$from->diff($to)->format('%r%a'); + } + + $objects = ($data['components']['objects'] ?? null); + if (is_array($objects) === true) { + $data['components']['objects'] = $this->fitValue(value: $objects, operator: $operator, days: $days); + } + + return $data; + }//end prepare() + + /** + * Replace the placeholder and shift dates in one value, recursing into arrays. + * + * The `@self` block is left alone: its slug and id are the object's identity. + * + * @param mixed $value The value. + * @param string $operator The admin's uid. + * @param integer $days Days to add to every date. + * + * @return mixed The fitted value. + */ + private function fitValue(mixed $value, string $operator, int $days): mixed { + if (is_array($value) === true) { + $out = []; + foreach ($value as $key => $item) { + if ($key === '@self') { + $out[$key] = $item; + continue; + } + + $out[$key] = $this->fitValue(value: $item, operator: $operator, days: $days); + } + + if (array_is_list($out) === true && in_array($operator, $out, true) === true) { + $out = array_values(array_unique($out, SORT_REGULAR)); + } + + return $out; + } + + if (is_string($value) === false) { + return $value; + } + + return $this->fitString(value: $value, operator: $operator, days: $days); + }//end fitValue() + + /** + * Replace the placeholder, or shift a date or date-time, in one string. + * + * @param string $value The string. + * @param string $operator The admin's uid. + * @param integer $days Days to add to a date. + * + * @return string The fitted string. + */ + private function fitString(string $value, string $operator, int $days): string { + if ($value === self::OPERATOR_PLACEHOLDER) { + return $operator; + } + + if ($days !== 0 && preg_match('/^(\d{4}-\d{2}-\d{2})(T.*)?$/', $value, $match) === 1) { + $shifted = (new DateTimeImmutable($match[1]))->modify(sprintf('%+d days', $days))->format('Y-m-d'); + return $shifted . ($match[2] ?? ''); + } + + return $value; + }//end fitString() + /** * Absolute path to the shipped descriptor. * diff --git a/lib/Service/DependencyGraph.php b/lib/Service/DependencyGraph.php index 49805737..61c426c9 100644 --- a/lib/Service/DependencyGraph.php +++ b/lib/Service/DependencyGraph.php @@ -119,7 +119,7 @@ private function buildAdjacency(array $edges): array { foreach ($edges as $edge) { $from = (string)($edge['blocker'] ?? ''); $to = (string)($edge['blocked'] ?? ''); - if ($from === '' || $to === '') { + if ($from === '' || $to === '' || $this->isBlocking(edge: $edge) === false) { continue; } @@ -167,7 +167,7 @@ public function deriveBlockedTaskIds(array $edges, array $statusById): array { foreach ($edges as $edge) { $blockerId = (string)($edge['blocker'] ?? ''); $blockedId = (string)($edge['blocked'] ?? ''); - if ($blockerId === '' || $blockedId === '') { + if ($blockerId === '' || $blockedId === '' || $this->isBlocking(edge: $edge) === false) { continue; } @@ -186,4 +186,20 @@ public function deriveBlockedTaskIds(array $edges, array $statusById): array { return $ids; }//end deriveBlockedTaskIds() + + /** + * Whether an edge blocks: one without a type (every edge made before types + * were used) or of type `blocks`. A related link, such as an imported + * start-to-start link, is drawn but never blocks. + * + * @param array $edge The edge. + * + * @return bool + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-1.2 + */ + private function isBlocking(array $edge): bool { + $type = (string)($edge['type'] ?? ''); + return ($type === '' || $type === 'blocks'); + }//end isBlocking() }//end class diff --git a/lib/Service/DependencyService.php b/lib/Service/DependencyService.php index 20b0394f..33ec44a3 100644 --- a/lib/Service/DependencyService.php +++ b/lib/Service/DependencyService.php @@ -31,6 +31,7 @@ namespace OCA\Planninq\Service; use OCA\Planninq\Exception\DependencyValidationException; +use OCP\IGroupManager; use OCP\IUserSession; use Psr\Log\LoggerInterface; @@ -70,6 +71,13 @@ class DependencyService { */ private const SCHEMA = 'dependency'; + /** + * The link types the dependency schema allows; only `blocks` blocks. + * + * @var array + */ + public const LINK_TYPES = ['blocks', 'relates', 'duplicates', 'clones', 'splits', 'causes']; + /** * Constructor for the DependencyService. * @@ -77,6 +85,7 @@ class DependencyService { * @param DependencyGraph $graph The pure cycle-detection algorithms. * @param IUserSession $userSession The current user session (membership guard). * @param LoggerInterface $logger The logger. + * @param IGroupManager|null $groupManager The caller's groups, for a project shared with a group. * * @return void */ @@ -85,6 +94,7 @@ public function __construct( private DependencyGraph $graph, private IUserSession $userSession, private LoggerInterface $logger, + private ?IGroupManager $groupManager=null, ) { }//end __construct() @@ -100,16 +110,28 @@ public function __construct( * 5. adding it would not close a cycle (DFS over the project's edges). * Only after all five pass is the edge saved through ObjectService. * + * A link that is not `blocks` (relates, duplicates and the other types the + * schema names) does not block and so is not checked for a cycle. + * * @param string $blocker UUID of the blocking task. * @param string $blocked UUID of the blocked task. + * @param string $type The link type, `blocks` by default. * * @return array The serialised stored edge. * * @throws DependencyValidationException On any validation failure (carries an HTTP-mappable code). * * @spec openspec/changes/task-dependencies/specs/task-dependencies/spec.md + * @spec openspec/changes/planning-dependencies-on-task-page/tasks.md#task-3.1 */ - public function create(string $blocker, string $blocked): array { + public function create(string $blocker, string $blocked, string $type='blocks'): array { + if (in_array($type, self::LINK_TYPES, true) === false) { + throw new DependencyValidationException( + message: 'Unknown link type.', + code: DependencyValidationException::CODE_VALIDATION + ); + } + // 1. No self-edge. $this->assertDistinctTasks(blocker: $blocker, blocked: $blocked); @@ -123,10 +145,13 @@ public function create(string $blocker, string $blocked): array { // 4. + 5. No duplicate edge; no cycle. Loads the project edges once. $edges = $this->repository->fetchProjectEdges(objectService: $objectService, projectId: $projectId); - $this->assertEdgeIsValid(objectService: $objectService, edges: $edges, blocker: $blocker, blocked: $blocked); + $this->assertNotDuplicate(edges: $edges, blocker: $blocker, blocked: $blocked); + if ($type === 'blocks') { + $this->assertNoCycle(objectService: $objectService, edges: $edges, blocker: $blocker, blocked: $blocked); + } $saved = $objectService->saveObject( - object: ['blocker' => $blocker, 'blocked' => $blocked], + object: ['blocker' => $blocker, 'blocked' => $blocked, 'type' => $type], register: self::REGISTER, schema: self::SCHEMA, _rbac: false @@ -140,6 +165,73 @@ public function create(string $blocker, string $blocked): array { return $saved->jsonSerialize(); }//end create() + /** + * Create the links of an imported plan in one project, with the same checks as create(). + * + * The project's edges are read once and every accepted link joins them, so + * a plan's links are checked against each other too. A self link or one + * that would close a cycle of blocking links is refused and counted; an + * edge that already exists is counted as existing and not written again, + * which makes a rerun of the same import safe. The caller has already + * checked that the acting user may restructure this project (its owner or + * an admin), and every task id is one it created or matched in that + * project, so the membership step of create() is not repeated here. + * + * @param string $projectId The project UUID. + * @param list $links The links. + * + * @return array{created:int,existing:int,refused:int} + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-2.1 + */ + public function createImported(string $projectId, array $links): array { + $objectService = $this->repository->objectService(); + $edges = $this->repository->fetchProjectEdges(objectService: $objectService, projectId: $projectId); + $result = ['created' => 0, 'existing' => 0, 'refused' => 0]; + + foreach ($links as $link) { + $edge = ['blocker' => $link['blocker'], 'blocked' => $link['blocked'], 'type' => $link['type']]; + if ($this->hasEdge(edges: $edges, blocker: $edge['blocker'], blocked: $edge['blocked']) === true) { + $result['existing']++; + continue; + } + + if ($edge['blocker'] === '' || $edge['blocker'] === $edge['blocked'] + || ($edge['type'] === 'blocks' && $this->graph->cyclePath(edges: $edges, blocker: $edge['blocker'], blocked: $edge['blocked']) !== null) + ) { + $result['refused']++; + continue; + } + + $objectService->saveObject(object: $edge, register: self::REGISTER, schema: self::SCHEMA, _rbac: false); + $edges[] = $edge; + $result['created']++; + } + + $this->logger->info('Planninq: imported dependency links', ['project' => $projectId] + $result); + + return $result; + }//end createImported() + + /** + * Whether the edge list already holds blocker → blocked. + * + * @param array> $edges The edges. + * @param string $blocker The blocking task. + * @param string $blocked The blocked task. + * + * @return bool + */ + private function hasEdge(array $edges, string $blocker, string $blocked): bool { + foreach ($edges as $edge) { + if ((string)($edge['blocker'] ?? '') === $blocker && (string)($edge['blocked'] ?? '') === $blocked) { + return true; + } + } + + return false; + }//end hasEdge() + /** * Assert the two task ids are both present and distinct (no self-edge). * @@ -201,18 +293,19 @@ private function resolveSharedProjectId(object $objectService, string $blocker, }//end resolveSharedProjectId() /** - * Assert the proposed edge is neither a duplicate nor cycle-forming. + * Assert the proposed edge does not already exist. * - * @param object $objectService The OR ObjectService (for path rendering). * @param array> $edges The project's existing edges. * @param string $blocker UUID of the blocking task. * @param string $blocked UUID of the blocked task. * * @return void * - * @throws DependencyValidationException On a duplicate or a cycle (message names the path). + * @throws DependencyValidationException On a duplicate. + * + * @spec openspec/changes/planning-dependencies-on-task-page/tasks.md#task-3.1 */ - private function assertEdgeIsValid(object $objectService, array $edges, string $blocker, string $blocked): void { + private function assertNotDuplicate(array $edges, string $blocker, string $blocked): void { foreach ($edges as $edge) { if ((string)($edge['blocker'] ?? '') === $blocker && (string)($edge['blocked'] ?? '') === $blocked @@ -224,6 +317,23 @@ private function assertEdgeIsValid(object $objectService, array $edges, string $ } } + }//end assertNotDuplicate() + + /** + * Assert a blocking edge would not close a cycle. + * + * @param object $objectService The OR ObjectService (for path rendering). + * @param array> $edges The project's existing edges. + * @param string $blocker UUID of the blocking task. + * @param string $blocked UUID of the blocked task. + * + * @return void + * + * @throws DependencyValidationException On a cycle (message names the path). + * + * @spec openspec/changes/planning-dependencies-on-task-page/tasks.md#task-3.1 + */ + private function assertNoCycle(object $objectService, array $edges, string $blocker, string $blocked): void { $path = $this->graph->cyclePath(edges: $edges, blocker: $blocker, blocked: $blocked); if ($path !== null) { $rendered = $this->renderPath(objectService: $objectService, path: $path); @@ -233,7 +343,7 @@ private function assertEdgeIsValid(object $objectService, array $edges, string $ ); } - }//end assertEdgeIsValid() + }//end assertNoCycle() /** * Delete a dependency edge after a project-membership guard. @@ -331,7 +441,8 @@ public function removeEdgesForTask(string $taskId): int { }//end removeEdgesForTask() /** - * Assert the current user is a member of the given project; throw otherwise. + * Assert the current user may change the given project's work (owner, + * manager or member, in person or through a group); throw otherwise. * * @param object $objectService The OR ObjectService. * @param string $projectId UUID of the project. @@ -339,6 +450,8 @@ public function removeEdgesForTask(string $taskId): int { * @return void * * @throws DependencyValidationException When unauthenticated or not a member. + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.4 */ private function assertProjectMember(object $objectService, string $projectId): void { $user = $this->userSession->getUser(); @@ -361,9 +474,13 @@ private function assertProjectMember(object $objectService, string $projectId): ); } - $project = $entity->getObject(); - $members = (array)($project['members'] ?? []); - if (in_array($uid, $members, true) === false) { + $project = $entity->getObject(); + $groupIds = []; + if ($this->groupManager !== null) { + $groupIds = $this->groupManager->getUserGroupIds($user); + } + + if ((new ProjectRoles())->mayWrite(project: $project, uid: $uid, groupIds: $groupIds) === false) { throw new DependencyValidationException( message: 'You are not a member of this project.', code: DependencyValidationException::CODE_FORBIDDEN diff --git a/lib/Service/FinanceLineService.php b/lib/Service/FinanceLineService.php new file mode 100644 index 00000000..971fc7c4 --- /dev/null +++ b/lib/Service/FinanceLineService.php @@ -0,0 +1,311 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-1.1 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Access copies and project matching for finance lines. + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-1.1 + */ +class FinanceLineService { + + /** + * The finance line schema slug. + * + * @var string + */ + public const SCHEMA = 'financeLine'; + + /** + * The Nextcloud group whose members write lines from the finance system. + * + * @var string + */ + public const IMPORT_GROUP = 'planninq-finance-import'; + + /** + * The `source` of a line from the finance system. + * + * @var string + */ + public const SOURCE_IMPORT = 'import'; + + /** + * The fields planninq keeps on a line; no person writes them. + * + * @var array + */ + public const KEPT_FIELDS = ['financeReaders', 'projectOwner', 'portfolio']; + + /** + * OpenRegister's ambient system-operation marker, by name. + * + * @var string + */ + private const OR_SYSTEM_CONTEXT = 'OCA\\OpenRegister\\Service\\SystemOperationContext'; + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Reads projects and lines as the system. + * @param ContainerInterface $container Resolves OpenRegister's ObjectService for the system write. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectMembershipService $membership, + private ContainerInterface $container, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * The kept fields a line of this project carries. + * + * A line without a project (from the finance system, matching no project) + * carries empty copies, so only admins and the import group read it. + * + * @param string $projectId The project UUID, or ''. + * + * @return array{financeReaders: array, projectOwner: string|null, portfolio: string|null} + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-1.1 + */ + public function keptFieldsFor(string $projectId): array { + $project = $this->membership->objectData(schema: ProjectMembershipService::PROJECT_SCHEMA, id: $projectId); + if ($project === null) { + return ['financeReaders' => [], 'projectOwner' => null, 'portfolio' => null]; + } + + $owner = $this->text(value: ($project['owner'] ?? null)); + $readers = $this->membership->normalise(members: ($project[ProjectMembershipService::READERS_FIELD] ?? [])); + if ($owner !== '') { + $readers = $this->membership->normalise(members: array_merge($readers, [$owner])); + } + + return [ + 'financeReaders' => $readers, + 'projectOwner' => $this->nullIfEmpty(value: $owner), + 'portfolio' => $this->nullIfEmpty(value: $this->text(value: ($project['portfolio'] ?? null))), + ]; + }//end keptFieldsFor() + + /** + * The project whose key equals a finance project number, or '' when none or more than one does. + * + * @param string $projectKey The project number the finance system sent. + * + * @return string The project UUID, or ''. + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-3.1 + */ + public function projectIdForKey(string $projectKey): string { + $projectKey = trim($projectKey); + if ($projectKey === '') { + return ''; + } + + $rows = $this->membership->rows(schema: ProjectMembershipService::PROJECT_SCHEMA, filters: ['key' => $projectKey]); + if (count($rows) !== 1) { + // None, or an ambiguous key: the line waits in the unmatched list. + return ''; + } + + return $rows[0]['id']; + }//end projectIdForKey() + + /** + * The imported line that already holds a finance line id, other than the line being written. + * + * @param string $externalRef The finance system's line id. + * @param string $ownUuid The UUID of the line being written, '' on a create. + * + * @return string The UUID of the other line, or ''. + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-3.1 + */ + public function importedLineWith(string $externalRef, string $ownUuid): string { + if ($externalRef === '') { + return ''; + } + + $filters = ['source' => self::SOURCE_IMPORT, 'externalRef' => $externalRef]; + foreach ($this->membership->rows(schema: self::SCHEMA, filters: $filters) as $row) { + if ($row['id'] !== $ownUuid) { + return $row['id']; + } + } + + return ''; + }//end importedLineWith() + + /** + * Bring the kept fields of every line of a project in step with the project. + * + * Called after a project changes owner, portfolio or portfolio managers. + * Writes run as the system, silent and without validation, like the + * members list on the other project objects. + * + * @param string $projectId The project UUID. + * + * @return int The number of lines written. + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-3.3 + */ + public function syncProject(string $projectId): int { + if ($projectId === '') { + return 0; + } + + $kept = $this->keptFieldsFor(projectId: $projectId); + $written = 0; + foreach ($this->membership->rows(schema: self::SCHEMA, filters: ['project' => $projectId]) as $line) { + if ($this->inStep(data: $line['data'], kept: $kept) === true) { + continue; + } + + $written += $this->write(uuid: $line['id'], data: array_merge($line['data'], $kept)); + } + + return $written; + }//end syncProject() + + /** + * Whether a line's kept fields already equal the given ones. + * + * @param array $data The line data. + * @param array{financeReaders: array, projectOwner: string|null, portfolio: string|null} $kept The kept fields. + * + * @return bool + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-1.1 + */ + public function inStep(array $data, array $kept): bool { + return $this->membership->normalise(members: ($data['financeReaders'] ?? null)) === $kept['financeReaders'] + && ($this->text(value: ($data['projectOwner'] ?? null)) === (string)$kept['projectOwner']) + && ($this->text(value: ($data['portfolio'] ?? null)) === (string)$kept['portfolio']); + }//end inStep() + + /** + * Whether OpenRegister runs this write as a trusted system operation. + * + * @return bool + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-1.1 + */ + public function isSystemOperation(): bool { + $class = self::OR_SYSTEM_CONTEXT; + + return (class_exists($class) === true && $class::isActive() === true); + }//end isSystemOperation() + + /** + * Write one line as the system. + * + * @param string $uuid The line UUID. + * @param array $data The line's new data. + * + * @return int 1 when written, 0 when the write failed. + */ + private function write(string $uuid, array $data): int { + $class = self::OR_SYSTEM_CONTEXT; + try { + $objectService = $this->container->get('OCA\\OpenRegister\\Service\\ObjectService'); + $save = static fn () => $objectService->saveObject( + object: $data, + register: ProjectMembershipService::REGISTER, + schema: self::SCHEMA, + uuid: $uuid, + _rbac: false, + _multitenancy: false, + silent: true, + _validation: false + ); + if (class_exists($class) === true) { + $class::run($save); + return 1; + } + + $save(); + } catch (\Throwable $e) { + $this->logger->error( + 'Planninq: could not bring a finance line in step with its project; the wrong people may see it', + ['line' => $uuid, 'exception' => $e->getMessage()] + ); + return 0; + }//end try + + return 1; + }//end write() + + /** + * A string, or null when it is empty. + * + * @param string $value The value. + * + * @return string|null + */ + private function nullIfEmpty(string $value): ?string { + if ($value === '') { + return null; + } + + return $value; + }//end nullIfEmpty() + + /** + * A stored reference or uid as a plain string. + * + * @param mixed $value The stored value. + * + * @return string + */ + private function text(mixed $value): string { + if (is_array($value) === true) { + $value = ($value['id'] ?? ($value['uuid'] ?? '')); + } + + if (is_scalar($value) === false) { + return ''; + } + + return (string)$value; + }//end text() +}//end class diff --git a/lib/Service/FlowHistoryService.php b/lib/Service/FlowHistoryService.php new file mode 100644 index 00000000..34231677 --- /dev/null +++ b/lib/Service/FlowHistoryService.php @@ -0,0 +1,460 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use DateTimeImmutable; +use DateTimeInterface; +use DateTimeZone; +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\ICache; +use OCP\ICacheFactory; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Cumulative flow and task timings of a project, from its audit trail. + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.1 + */ +class FlowHistoryService { + + /** + * The longest window, in days. + * + * @var int + */ + public const MAX_DAYS = 180; + + /** + * Most tasks or columns read per project. + * + * @var int + */ + public const MAX_ROWS = 5000; + + /** + * Most audit rows read per task. + * + * @var int + */ + public const MAX_HISTORY = 1000; + + /** + * Days in the window when none is given. + * + * @var int + */ + public const DEFAULT_DAYS = 30; + + private const REGISTER = 'planninq'; + + private const AUDIT_MAPPER = 'OCA\\OpenRegister\\Db\\AuditTrailMapper'; + + private const CACHE_TTL = 30 * 86400; + + /** + * Constructor. + * + * @param ContainerInterface $container Resolves OpenRegister's audit trail mapper + * @param ICacheFactory $cacheFactory Cache for finished days + * @param ITimeFactory $timeFactory The current moment + * @param FlowReplay $replay The pure replay + * @param LoggerInterface $logger Logger + */ + public function __construct( + private ContainerInterface $container, + private ICacheFactory $cacheFactory, + private ITimeFactory $timeFactory, + private FlowReplay $replay, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * The flow of one project over the days `$from` to `$to` (UTC midnights). + * + * @param object $objectService OpenRegister's ObjectService + * @param string $projectId The project's UUID (already read with RBAC on) + * @param DateTimeImmutable $from First day + * @param DateTimeImmutable $to Last day + * + * @return array columns, days, finished, summary, withoutHistory, fromCache + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.1 + */ + public function forProject(object $objectService, string $projectId, DateTimeImmutable $from, DateTimeImmutable $to): array { + $now = $this->timeFactory->now(); + $now = new DateTimeImmutable('@' . $now->getTimestamp()); + $today = $now->setTime(0, 0); + $columns = $this->rows(objectService: $objectService, schema: 'column', projectId: $projectId); + $tasks = $this->rows(objectService: $objectService, schema: 'task', projectId: $projectId); + + $cache = $this->cacheFactory->createDistributed('planninq-flow'); + $pastDays = $this->pastDays(from: $from, to: $to, today: $today); + $cached = $this->cachedDays(cache: $cache, projectId: $projectId, days: $pastDays); + + if (count($cached) === count($pastDays)) { + $days = $cached; + if ($to >= $today) { + $days = array_merge($days, $this->today(columns: $columns, tasks: $tasks, today: $today, now: $now, previous: end($cached))); + } + + return $this->shape(projectId: $projectId, columns: $columns, days: $days, fromCache: count($cached)); + } + + $histories = $this->histories(tasks: $tasks); + $days = $this->replay->replay(columns: $columns, tasks: $tasks, histories: $histories, from: $from, to: $to, now: $now); + $this->storeDays(cache: $cache, projectId: $projectId, days: $days, today: $today); + + return $this->shape(projectId: $projectId, columns: $columns, days: $days, fromCache: 0); + }//end forProject() + + /** + * The window as two UTC midnights, or null when a date is unreadable, the + * window is reversed or it is longer than MAX_DAYS days. Without dates it + * is the last DEFAULT_DAYS days up to today. + * + * @param string|null $from First day, Y-m-d + * @param string|null $to Last day, Y-m-d + * + * @return DateTimeImmutable[]|null + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.2 + */ + public function window(?string $from, ?string $to): ?array { + $today = (new DateTimeImmutable('@' . $this->timeFactory->now()->getTimestamp()))->setTime(0, 0); + $end = $this->date(value: $to, fallback: $today); + $start = null; + if ($end !== null) { + $start = $this->date(value: $from, fallback: $end->modify('-' . (self::DEFAULT_DAYS - 1) . ' days')); + } + + if ($start === null || $end === null || $start > $end) { + return null; + } + + if ((int)$start->diff($end)->days + 1 > self::MAX_DAYS) { + return null; + } + + return [$start, $end]; + }//end window() + + /** + * A Y-m-d date as a UTC midnight; the fallback when empty; null when it + * is not a calendar date. + * + * @param string|null $value The value + * @param DateTimeImmutable $fallback Used when the value is empty + * + * @return DateTimeImmutable|null + */ + private function date(?string $value, DateTimeImmutable $fallback): ?DateTimeImmutable { + if ($value === null || $value === '') { + return $fallback; + } + + $parts = []; + if (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $value, $parts) !== 1) { + return null; + } + + if (checkdate((int)$parts[2], (int)$parts[3], (int)$parts[1]) === false) { + return null; + } + + return new DateTimeImmutable($value . ' 00:00:00', new DateTimeZone('UTC')); + }//end date() + + /** + * Average, 85th percentile and slowest tasks over several projects' finished tasks. + * + * @param array> $finished Finished rows from forProject() + * + * @return array + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.2 + */ + public function summarise(array $finished): array { + return $this->replay->summarise(finished: $finished); + }//end summarise() + + /** + * The response for one project. + * + * @param string $projectId The project + * @param array> $columns Its columns + * @param array $days Day entries keyed by Y-m-d + * @param int $fromCache Days served from the cache + * + * @return array + */ + private function shape(string $projectId, array $columns, array $days, int $fromCache): array { + usort($columns, static fn (array $a, array $b): int => ((int)($a['order'] ?? 0)) <=> ((int)($b['order'] ?? 0))); + $finished = []; + $withoutHistory = 0; + $list = []; + foreach ($days as $date => $entry) { + $list[] = ['date' => $date, 'counts' => $entry['counts']]; + $withoutHistory = max($withoutHistory, (int)$entry['withoutHistory']); + foreach ($entry['finished'] as $row) { + $row['finishedAt'] = gmdate('c', (int)$row['finishedAt']); + $finished[] = $row; + } + } + + return [ + 'projectId' => $projectId, + 'columns' => array_map( + static fn (array $column): array => [ + 'id' => (string)$column['id'], + 'title' => (string)($column['title'] ?? ''), + 'color' => ($column['color'] ?? null), + ], + $columns + ), + 'days' => $list, + 'finished' => $finished, + 'summary' => $this->replay->summarise(finished: $finished), + 'withoutHistory' => $withoutHistory, + 'fromCache' => $fromCache, + ]; + }//end shape() + + /** + * Today, when every past day is cached: tasks per column now, and the + * tasks that may have finished today, whose histories alone are read. + * + * A task "may have finished today" when its completedAt is today or it + * is done without completedAt. Tasks without history do not change + * between yesterday and today, so yesterday's count of them carries over. + * + * @param array> $columns The columns + * @param array> $tasks The tasks + * @param DateTimeImmutable $today Today's midnight + * @param DateTimeImmutable $now Now + * @param array|false $previous Yesterday's cached entry, if any + * + * @return array + */ + private function today(array $columns, array $tasks, DateTimeImmutable $today, DateTimeImmutable $now, array|false $previous): array { + $start = $today->getTimestamp(); + $candidates = array_values( + array_filter( + $tasks, + function (array $task) use ($start): bool { + $completed = $this->replay->seconds(value: $task['completedAt'] ?? null); + return ($completed !== null && $completed >= $start) || ($completed === null && ($task['status'] ?? null) === 'done'); + } + ) + ); + $histories = $this->histories(tasks: $candidates); + $days = $this->replay->replay(columns: $columns, tasks: $tasks, histories: $histories, from: $today, to: $today, now: $now); + $date = $today->format('Y-m-d'); + $days[$date]['withoutHistory'] = (int)($previous['withoutHistory'] ?? 0); + + return $days; + }//end today() + + /** + * The past days of the window, as Y-m-d. + * + * @param DateTimeImmutable $from First day + * @param DateTimeImmutable $to Last day + * @param DateTimeImmutable $today Today's midnight + * + * @return string[] + */ + private function pastDays(DateTimeImmutable $from, DateTimeImmutable $to, DateTimeImmutable $today): array { + $days = []; + for ($day = $from; $day <= $to && $day < $today; $day = $day->modify('+1 day')) { + $days[] = $day->format('Y-m-d'); + } + + return $days; + }//end pastDays() + + /** + * The cached entries of the given days; a missing day is left out. + * + * @param ICache $cache The cache + * @param string $projectId The project + * @param string[] $days Y-m-d dates + * + * @return array + */ + private function cachedDays(ICache $cache, string $projectId, array $days): array { + $found = []; + foreach ($days as $date) { + $value = $cache->get($projectId . ':' . $date); + if (is_string($value) === false) { + continue; + } + + $entry = json_decode($value, true); + if (is_array($entry) === true) { + $found[$date] = $entry; + } + } + + return $found; + }//end cachedDays() + + /** + * Cache every finished day of a replay. + * + * @param ICache $cache The cache + * @param string $projectId The project + * @param array $days Day entries keyed by Y-m-d + * @param DateTimeImmutable $today Today's midnight + * + * @return void + */ + private function storeDays(ICache $cache, string $projectId, array $days, DateTimeImmutable $today): void { + foreach ($days as $date => $entry) { + if ($date < $today->format('Y-m-d')) { + $cache->set($projectId . ':' . $date, json_encode($entry, JSON_PRESERVE_ZERO_FRACTION), self::CACHE_TTL); + } + } + }//end storeDays() + + /** + * The audit rows of each task, read server-side from OpenRegister. + * + * @param array> $tasks The tasks + * + * @return array>> Task id to rows, oldest first + */ + private function histories(array $tasks): array { + if ($tasks === []) { + return []; + } + + try { + $mapper = $this->container->get(self::AUDIT_MAPPER); + } catch (\Throwable $e) { + $this->logger->warning('Planninq flow: the audit trail is not available', ['exception' => $e->getMessage()]); + return []; + } + + $histories = []; + foreach ($tasks as $task) { + $histories[(string)$task['id']] = $mapper->findChangesForObject((string)$task['id'], self::MAX_HISTORY); + } + + return $histories; + }//end histories() + + /** + * A project's rows of one schema, read with RBAC on, as plain arrays with + * `id` and `created` set. + * + * @param object $objectService OpenRegister's ObjectService + * @param string $schema `task` or `column` + * @param string $projectId The project + * + * @return array> + */ + private function rows(object $objectService, string $schema, string $projectId): array { + $results = $objectService->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: $schema, + filters: ['project' => $projectId, '_limit' => self::MAX_ROWS] + ); + if (is_array($results) === true && array_key_exists('results', $results) === true) { + $results = (array)$results['results']; + } + + $rows = []; + foreach ((array)$results as $result) { + $row = $this->plainRow(result: $result); + if ($row['id'] !== '') { + $rows[] = $row; + } + } + + return $rows; + }//end rows() + + /** + * An ObjectEntity or array row as a plain array with `id` and `created`. + * + * ObjectEntity's accessors are magic (`__call`), so they are tested with + * is_callable(), not method_exists(). + * + * @param mixed $result The row + * + * @return array + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.2 + */ + public function plainRow(mixed $result): array { + if (is_object($result) === true) { + return $this->plainEntity(entity: $result); + } + + $data = (array)$result; + $data['id'] = (string)($data['@self']['id'] ?? ($data['id'] ?? '')); + $data['created'] = ($data['@self']['created'] ?? null); + + return $data; + }//end plainRow() + + /** + * An ObjectEntity as a plain array with `id` and `created`. + * + * @param object $entity The entity + * + * @return array + */ + private function plainEntity(object $entity): array { + $data = []; + if (is_callable([$entity, 'getObject']) === true) { + $data = (array)$entity->getObject(); + } + + $data['id'] = (string)($data['id'] ?? ''); + if (is_callable([$entity, 'getUuid']) === true) { + $data['id'] = (string)$entity->getUuid(); + } + + $data['created'] = null; + $created = null; + if (is_callable([$entity, 'getCreated']) === true) { + $created = $entity->getCreated(); + } + + if ($created instanceof DateTimeInterface) { + $data['created'] = $created->format('c'); + } + + return $data; + }//end plainEntity() +}//end class diff --git a/lib/Service/FlowReplay.php b/lib/Service/FlowReplay.php new file mode 100644 index 00000000..788ec7c6 --- /dev/null +++ b/lib/Service/FlowReplay.php @@ -0,0 +1,465 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use DateTimeImmutable; +use DateTimeZone; + +/** + * Replays task histories into daily column counts and task timings. + * + * A history is the list OpenRegister's AuditTrailMapper::findChangesForObject() + * returns: rows `{created: 'Y-m-d H:i:s', changed: {field: {old, new}}}`, + * oldest first. Only `column`, `status` and `completedAt` are read. + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.1 + */ +class FlowReplay { + + /** + * The fields a flow reads from a history row. + * + * @var string[] + */ + public const FIELDS = ['column', 'status', 'completedAt']; + + /** + * How many of the slowest tasks a summary lists. + * + * @var int + */ + public const SLOWEST = 10; + + private const DAY = 86400; + + /** + * Replay a project's tasks over the days `$from` to `$to` (inclusive). + * + * Each returned day holds the tasks per column at the end of that day (or + * at `$now` for today), and the timings of the tasks that finished on it. + * + * @param array> $columns The project's columns (id, order) + * @param array> $tasks Tasks: id, title, key, created, column, status, completedAt + * @param array> $histories Task id to its audit rows, oldest first + * @param DateTimeImmutable $from First day (UTC midnight) + * @param DateTimeImmutable $to Last day (UTC midnight) + * @param DateTimeImmutable $now The current moment; later days are not replayed + * + * @return array, finished: array>, withoutHistory: int}> Keyed by Y-m-d + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.1 + */ + public function replay( + array $columns, + array $tasks, + array $histories, + DateTimeImmutable $from, + DateTimeImmutable $to, + DateTimeImmutable $now + ): array { + $columnIds = $this->orderedColumnIds(columns: $columns); + $firstColumn = ($columnIds[0] ?? null); + $timelines = []; + $timings = []; + foreach ($tasks as $task) { + $history = ($histories[(string)$task['id']] ?? []); + $timelines[] = [ + 'states' => $this->states(task: $task, history: $history), + 'noHistory' => ($history === []), + ]; + $timing = $this->timing(task: $task, history: $history, firstColumn: $firstColumn); + if ($timing !== null) { + $timings[] = $timing; + } + } + + $days = []; + for ($day = $from; $day <= $to && $day <= $now; $day = $day->modify('+1 day')) { + $end = min($day->getTimestamp() + self::DAY - 1, $now->getTimestamp()); + $days[$day->format('Y-m-d')] = $this->dayAt( + columnIds: $columnIds, + timelines: $timelines, + timings: $timings, + start: $day->getTimestamp(), + end: $end + ); + } + + return $days; + }//end replay() + + /** + * Average, 85th percentile and the slowest tasks of a set of timings. + * + * @param array> $finished Timings from replay() + * + * @return array finished, estimated, lead and cycle (average, p85), slowest + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.1 + */ + public function summarise(array $finished): array { + $lead = array_map(static fn (array $row): float => (float)$row['leadDays'], $finished); + $cycle = array_map(static fn (array $row): float => (float)$row['cycleDays'], $finished); + $slowest = $finished; + usort($slowest, static fn (array $a, array $b): int => $b['cycleDays'] <=> $a['cycleDays']); + + return [ + 'finished' => count($finished), + 'estimated' => count(array_filter($finished, static fn (array $row): bool => $row['estimated'] === true)), + 'lead' => ['average' => $this->average(values: $lead), 'p85' => $this->percentile(values: $lead, rank: 0.85)], + 'cycle' => ['average' => $this->average(values: $cycle), 'p85' => $this->percentile(values: $cycle, rank: 0.85)], + 'slowest' => array_slice($slowest, 0, self::SLOWEST), + ]; + }//end summarise() + + /** + * Parse a timestamp from OpenRegister (`Y-m-d H:i:s` in UTC, or ISO 8601). + * + * @param mixed $value The raw value + * + * @return int|null Unix seconds, or null when empty or unreadable + * + * @spec openspec/changes/archive/2026-10-01-portfolio-flow-reports/tasks.md#task-1.1 + */ + public function seconds(mixed $value): ?int { + if (is_string($value) === false || trim($value) === '') { + return null; + } + + try { + return (new DateTimeImmutable($value, new DateTimeZone('UTC')))->getTimestamp(); + } catch (\Exception $e) { + return null; + } + }//end seconds() + + /** + * The project's column ids in board order. + * + * @param array> $columns The columns + * + * @return string[] + */ + private function orderedColumnIds(array $columns): array { + usort($columns, static fn (array $a, array $b): int => ((int)($a['order'] ?? 0)) <=> ((int)($b['order'] ?? 0))); + + return array_values(array_map(static fn (array $column): string => (string)$column['id'], $columns)); + }//end orderedColumnIds() + + /** + * One day: tasks per column at `$end`, and the tasks finished in the day. + * + * @param string[] $columnIds The columns in board order + * @param array> $timelines Per task: states and noHistory + * @param array> $timings Finished tasks' timings + * @param int $start Day start (unix seconds) + * @param int $end Day end or now (unix seconds) + * + * @return array{counts: array, finished: array>, withoutHistory: int} + */ + private function dayAt(array $columnIds, array $timelines, array $timings, int $start, int $end): array { + $counts = array_fill_keys($columnIds, 0); + $withoutHistory = 0; + foreach ($timelines as $timeline) { + $column = $this->valueAt(states: $timeline['states'], field: 'column', moment: $end); + if ($column === false || isset($counts[$column]) === false) { + continue; + } + + $counts[$column]++; + if ($timeline['noHistory'] === true) { + $withoutHistory++; + } + } + + $finished = array_values( + array_filter( + $timings, + static fn (array $row): bool => $row['finishedAt'] >= $start && $row['finishedAt'] <= $end + ) + ); + + return ['counts' => $counts, 'finished' => $finished, 'withoutHistory' => $withoutHistory]; + }//end dayAt() + + /** + * A field's value at a moment, or false when the task did not exist yet. + * + * @param array}> $states The task's states, oldest first + * @param string $field The field + * @param int $moment Unix seconds + * + * @return mixed + */ + private function valueAt(array $states, string $field, int $moment): mixed { + $value = false; + foreach ($states as $state) { + if ($state['at'] > $moment) { + break; + } + + $value = ($state['values'][$field] ?? null); + } + + return $value; + }//end valueAt() + + /** + * A task's states over time: the first at its creation, then one per + * audit row that changed a flow field. + * + * The state before the first change of a field is that change's `old` + * value, so a history that starts after creation still replays. A task + * without any history keeps its current values from its creation on. + * + * @param array $task The task + * @param array> $history Its audit rows, oldest first + * + * @return array}> + */ + private function states(array $task, array $history): array { + $created = $this->createdAt(task: $task, history: $history); + if ($history === []) { + return [['at' => $created, 'values' => $this->flowValues(source: $task)]]; + } + + $values = array_fill_keys(self::FIELDS, null); + $seen = []; + foreach ($history as $row) { + foreach (self::FIELDS as $field) { + if (isset($seen[$field]) === false && is_array($row['changed'][$field] ?? null) === true) { + $values[$field] = ($row['changed'][$field]['old'] ?? null); + $seen[$field] = true; + } + } + } + + $states = [['at' => $created, 'values' => $values]]; + foreach ($history as $row) { + $changes = $this->flowChanges(changed: (array)($row['changed'] ?? [])); + if ($changes === []) { + continue; + } + + $values = array_merge($values, $changes); + $states[] = ['at' => max($created, (int)$this->seconds(value: $row['created'] ?? null)), 'values' => $values]; + } + + return $states; + }//end states() + + /** + * The new values of the flow fields an audit row changed. + * + * @param array $changed The row's `changed` map + * + * @return array + */ + private function flowChanges(array $changed): array { + $changes = []; + foreach (self::FIELDS as $field) { + if (is_array($changed[$field] ?? null) === true) { + $changes[$field] = ($changed[$field]['new'] ?? null); + } + } + + return $changes; + }//end flowChanges() + + /** + * The flow fields of a task as they are now. + * + * @param array $source The task + * + * @return array + */ + private function flowValues(array $source): array { + $values = []; + foreach (self::FIELDS as $field) { + $values[$field] = ($source[$field] ?? null); + } + + return $values; + }//end flowValues() + + /** + * When the task was created: its own `created`, else its first audit row. + * + * @param array $task The task + * @param array> $history Its audit rows + * + * @return int Unix seconds + */ + private function createdAt(array $task, array $history): int { + $created = $this->seconds(value: $task['created'] ?? null); + if ($created === null) { + $created = $this->seconds(value: $history[0]['created'] ?? null); + } + + return (int)$created; + }//end createdAt() + + /** + * Lead and cycle time of a finished task, or null when it is not finished. + * + * Finish is `completedAt`; on a done task without it, the last change to + * `done` in the history, and the task is "estimated". Cycle time starts + * when the task first sat in a column other than the project's first, or + * else first became `in_progress`; a task that went straight to done has + * a cycle time of zero. + * + * @param array $task The task + * @param array> $history Its audit rows + * @param string|null $firstColumn The project's first column + * + * @return array|null + */ + private function timing(array $task, array $history, ?string $firstColumn): ?array { + $states = $this->states(task: $task, history: $history); + $finished = $this->seconds(value: $task['completedAt'] ?? null); + $estimated = false; + if ($finished === null && ($task['status'] ?? null) === 'done') { + $finished = $this->lastMomentWhere(states: $states, test: static fn (array $values): bool => $values['status'] === 'done'); + $estimated = true; + } + + if ($finished === null) { + return null; + } + + $created = $this->createdAt(task: $task, history: $history); + $started = $this->firstMomentWhere( + states: $states, + test: static fn (array $values): bool => $values['column'] !== null && $values['column'] !== $firstColumn + ); + if ($started === null) { + $started = $this->firstMomentWhere(states: $states, test: static fn (array $values): bool => $values['status'] === 'in_progress'); + } + + $started = min(($started ?? $finished), $finished); + + return [ + 'id' => (string)$task['id'], + 'projectId' => (string)($task['project'] ?? ''), + 'title' => (string)($task['title'] ?? ''), + 'key' => ($task['key'] ?? null), + 'createdAt' => gmdate('c', $created), + 'startedAt' => gmdate('c', $started), + 'finishedAt' => $finished, + 'leadDays' => round(max(0, $finished - $created) / self::DAY, 2), + 'cycleDays' => round(max(0, $finished - $started) / self::DAY, 2), + 'estimated' => $estimated, + ]; + }//end timing() + + /** + * The moment of the first state where the test turned true after being false. + * + * @param array}> $states The states + * @param callable $test Test on a state's values + * + * @return int|null + */ + private function firstMomentWhere(array $states, callable $test): ?int { + return ($this->momentsWhere(states: $states, test: $test)[0] ?? null); + }//end firstMomentWhere() + + /** + * The moment of the last state where the test turned true after being false. + * + * @param array}> $states The states + * @param callable $test Test on a state's values + * + * @return int|null + */ + private function lastMomentWhere(array $states, callable $test): ?int { + $moments = $this->momentsWhere(states: $states, test: $test); + if ($moments === []) { + return null; + } + + return $moments[count($moments) - 1]; + }//end lastMomentWhere() + + /** + * Every moment at which the test turned true after being false. + * + * @param array}> $states The states + * @param callable $test Test on a state's values + * + * @return int[] + */ + private function momentsWhere(array $states, callable $test): array { + $moments = []; + $before = false; + foreach ($states as $state) { + $now = (bool)$test($state['values']); + if ($now === true && $before === false) { + $moments[] = $state['at']; + } + + $before = $now; + } + + return $moments; + }//end momentsWhere() + + /** + * The mean of a list, two decimals; 0 for an empty list. + * + * @param float[] $values The values + * + * @return float + */ + private function average(array $values): float { + if ($values === []) { + return 0.0; + } + + return round(array_sum($values) / count($values), 2); + }//end average() + + /** + * The nearest-rank percentile of a list; 0 for an empty list. + * + * @param float[] $values The values + * @param float $rank The rank, 0 to 1 + * + * @return float + */ + private function percentile(array $values, float $rank): float { + if ($values === []) { + return 0.0; + } + + sort($values); + $index = max(0, (int)ceil($rank * count($values)) - 1); + + return round($values[$index], 2); + }//end percentile() +}//end class diff --git a/lib/Service/ForgeLinkService.php b/lib/Service/ForgeLinkService.php new file mode 100644 index 00000000..8fb85871 --- /dev/null +++ b/lib/Service/ForgeLinkService.php @@ -0,0 +1,170 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-integration-code-forge-links/tasks.md#task-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use RuntimeException; + +/** + * Task lookup and repeat handling for code links. + * + * @spec openspec/changes/archive/2026-09-30-integration-code-forge-links/tasks.md#task-1.2 + */ +class ForgeLinkService { + + /** + * The code link schema slug. + * + * @var string + */ + public const SCHEMA = 'forgeLink'; + + /** + * A task key in forge text: a project key (a letter, then one to nine + * letters or digits), a hyphen and a number (tasks-readable-keys). + * + * @var string + */ + private const TASK_KEY_PATTERN = '/(? $data The link data. + * + * @return array{id:string,data:array,project:string}|null The task, or null when none resolves. + * + * @spec openspec/changes/archive/2026-09-30-integration-code-forge-links/tasks.md#task-1.2 + */ + public function linkedTask(array $data): ?array { + $membership = $this->membership(); + $task = null; + + $taskId = ''; + if (is_string($data['task'] ?? null) === true) { + $taskId = trim($data['task']); + } + if ($taskId !== '') { + $found = $membership->objectData(schema: 'task', id: $taskId); + if ($found !== null) { + $task = ['id' => $taskId, 'data' => $found]; + } + } + + if ($taskId === '') { + preg_match_all(self::TASK_KEY_PATTERN, strtoupper((string)($data['taskKey'] ?? '')), $matches); + foreach (array_unique($matches[0]) as $key) { + $task = ($membership->rows(schema: 'task', filters: ['key' => $key])[0] ?? null); + if ($task !== null) { + break; + } + } + } + + if ($task === null) { + return null; + } + + $task['project'] = $membership->projectIdFor(schemaSlug: 'task', data: $task['data']); + + return $task; + }//end linkedTask() + + /** + * The links on a task that already point at a forge item. + * + * @param string $taskId The task UUID. + * @param string $externalId The forge's id for the item. + * + * @return array}> + * + * @spec openspec/changes/archive/2026-09-30-integration-code-forge-links/tasks.md#task-1.2 + */ + public function repeats(string $taskId, string $externalId): array { + if ($externalId === '') { + return []; + } + + return $this->membership()->rows(schema: self::SCHEMA, filters: ['task' => $taskId, 'externalId' => $externalId]); + }//end repeats() + + /** + * Delete a code link as the system; false when OpenRegister refuses. + * + * @param string $id The link UUID. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-integration-code-forge-links/tasks.md#task-1.2 + */ + public function remove(string $id): bool { + try { + return (bool)$this->container->get('OCA\\OpenRegister\\Service\\ObjectService')->deleteObject( + uuid: $id, + register: ProjectMembershipService::REGISTER, + schema: self::SCHEMA, + _rbac: false, + _multitenancy: false + ); + } catch (\Throwable $e) { + $this->logger->warning('Planninq: could not replace a code link', ['object' => $id, 'exception' => $e->getMessage()]); + return false; + } + }//end remove() + + /** + * The membership service, resolved when needed: it reads links through this class. + * + * @return ProjectMembershipService + */ + private function membership(): ProjectMembershipService { + $service = $this->container->get(ProjectMembershipService::class); + if ($service instanceof ProjectMembershipService === false) { + throw new RuntimeException('ProjectMembershipService is not available.'); + } + + return $service; + }//end membership() +}//end class diff --git a/lib/Service/MsProjectImportService.php b/lib/Service/MsProjectImportService.php new file mode 100644 index 00000000..ba22c7f9 --- /dev/null +++ b/lib/Service/MsProjectImportService.php @@ -0,0 +1,343 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-2.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCA\Planninq\Exception\MsProjectImportException; +use Psr\Log\LoggerInterface; + +/** + * Previews and writes a Microsoft Project plan. + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-2.1 + */ +class MsProjectImportService { + + /** + * The planninq register slug. + * + * @var string + */ + private const REGISTER = 'planninq'; + + /** + * How many tasks the preview lists. + * + * @var int + */ + private const SAMPLE_SIZE = 50; + + /** + * Constructor. + * + * @param MsProjectPlanParser $parser Reads the XML. + * @param MsProjectPlanMapper $mapper Maps the plan onto planninq's model. + * @param DependencyRepository $repository Resolves OpenRegister's ObjectService. + * @param DependencyService $dependencies Checks and writes the links. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private MsProjectPlanParser $parser, + private MsProjectPlanMapper $mapper, + private DependencyRepository $repository, + private DependencyService $dependencies, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * What importing this file into the project would do; writes nothing. + * + * @param string $projectId The project UUID. + * @param string $content The file content. + * @param string $fileName The uploaded file name. + * + * @return array{counts:array,losses:array,sample:list>,updates:int,missing:list} + * + * @throws MsProjectImportException When the file is refused. + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-2.1 + */ + public function preview(string $projectId, string $content, string $fileName): array { + $mapped = $this->mapper->map(plan: $this->parser->parse(content: $content, fileName: $fileName)); + $existing = $this->existing(objectService: $this->repository->objectService(), projectId: $projectId); + $uids = $this->uidsOf(mapped: $mapped); + + $sample = []; + foreach (array_slice(array_merge($mapped['tasks'], $mapped['subtasks']), 0, self::SAMPLE_SIZE) as $task) { + $sample[] = [ + 'title' => $task['data']['title'], + 'kind' => $this->kind(task: $task), + 'startDate' => ($task['data']['startDate'] ?? null), + 'dueDate' => ($task['data']['dueDate'] ?? null), + ]; + } + + return [ + 'counts' => $mapped['counts'], + 'losses' => $mapped['losses'], + 'sample' => $sample, + 'updates' => count(array_intersect_key($existing['projectPhase'] + $existing['task'], $uids)), + 'missing' => $this->missing(existing: $existing, uids: $uids), + ]; + }//end preview() + + /** + * Import this file into the project. + * + * @param string $projectId The project UUID. + * @param string $content The file content. + * @param string $fileName The uploaded file name. + * + * @return array Counts created and updated, the missing titles, refused links and losses; `error` when the import stopped part-way. + * + * @throws MsProjectImportException When the file is refused. + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-2.2 + */ + public function import(string $projectId, string $content, string $fileName): array { + $mapped = $this->mapper->map(plan: $this->parser->parse(content: $content, fileName: $fileName)); + $objectService = $this->repository->objectService(); + $existing = $this->existing(objectService: $objectService, projectId: $projectId); + $result = [ + 'created' => ['phases' => 0, 'tasks' => 0, 'subtasks' => 0, 'links' => 0], + 'updated' => ['phases' => 0, 'tasks' => 0, 'subtasks' => 0], + 'missing' => $this->missing(existing: $existing, uids: $this->uidsOf(mapped: $mapped)), + 'refusedLinks' => 0, + 'losses' => $mapped['losses'], + ]; + + try { + $ids = []; + foreach (['phases' => 'projectPhase', 'tasks' => 'task', 'subtasks' => 'task'] as $kind => $schema) { + foreach ($mapped[$kind] as $object) { + $data = ($object['data'] + ['project' => $projectId]); + $data = $this->withReferences(data: $data, object: $object, ids: $ids); + + $match = ($existing[$schema][$object['uid']] ?? null); + $ids[$object['uid']] = $this->write(objectService: $objectService, schema: $schema, data: $data, match: $match); + $outcome = 'updated'; + if ($match === null) { + $outcome = 'created'; + } + + $result[$outcome][$kind]++; + } + } + + $links = []; + foreach ($mapped['links'] as $link) { + $links[] = ['blocker' => $ids[$link['blockerUid']], 'blocked' => $ids[$link['blockedUid']], 'type' => $link['type']]; + } + + $linked = $this->dependencies->createImported(projectId: $projectId, links: $links); + $result['created']['links'] = $linked['created']; + $result['refusedLinks'] = $linked['refused']; + } catch (\Throwable $e) { + $this->logger->error('Planninq: Microsoft Project import stopped part-way', ['project' => $projectId, 'exception' => $e->getMessage()]); + $result['error'] = $e->getMessage(); + }//end try + + return $result; + }//end import() + + /** + * Set the phase and parent references from the UIDs already written. + * + * @param array $data The payload. + * @param array $object The mapped object. + * @param array $ids Written UUIDs by Project UID. + * + * @return array + */ + private function withReferences(array $data, array $object, array $ids): array { + $phase = ($object['phaseUid'] ?? null); + if ($phase !== null && isset($ids[$phase]) === true) { + $data['phase'] = $ids[$phase]; + } + + $parent = ($object['parentUid'] ?? null); + if ($parent !== null && isset($ids[$parent]) === true) { + $data['parent'] = $ids[$parent]; + } + + return $data; + }//end withReferences() + + /** + * Create an object, or update the one an earlier import made. + * + * An update changes only what the plan owns; status, column, assignee and + * everything else a member set in planninq stays. + * + * @param object $objectService OpenRegister's ObjectService. + * @param string $schema The schema slug. + * @param array $data The mapped payload. + * @param array{id:string,data:array}|null $match The earlier object. + * + * @return string The object's UUID. + */ + private function write(object $objectService, string $schema, array $data, ?array $match): string { + $uuid = null; + if ($match !== null) { + $uuid = $match['id']; + unset($data['status'], $match['data']['@self'], $match['data']['id']); + $data = array_merge($match['data'], $data); + } + + $saved = $objectService->saveObject(object: $data, register: self::REGISTER, schema: $schema, uuid: $uuid); + + return $this->idOf(row: $saved, fallback: (string)$uuid); + }//end write() + + /** + * The project's phases and tasks an earlier import created, by Project UID. + * + * @param object $objectService OpenRegister's ObjectService. + * @param string $projectId The project UUID. + * + * @return array{projectPhase:array}>,task:array}>} + */ + private function existing(object $objectService, string $projectId): array { + $existing = ['projectPhase' => [], 'task' => []]; + foreach (array_keys($existing) as $schema) { + $rows = $objectService->searchObjectsBySlug(registerSlug: self::REGISTER, schemaSlug: $schema, filters: ['project' => $projectId]); + if (is_array($rows) === true && array_key_exists('results', $rows) === true) { + $rows = (array)$rows['results']; + } + + foreach ((array)$rows as $row) { + $data = $this->dataOf(row: $row); + $uid = (string)($data['metadata']['msProjectUid'] ?? ''); + if ($uid !== '') { + $existing[$schema][$uid] = ['id' => $this->idOf(row: $row, fallback: ''), 'data' => $data]; + } + } + } + + return $existing; + }//end existing() + + /** + * The titles of imported objects whose UID is not in the new plan. + * + * @param array}>> $existing The earlier objects. + * @param array $uids The new plan's UIDs. + * + * @return list + */ + private function missing(array $existing, array $uids): array { + $titles = []; + foreach ($existing as $objects) { + foreach (array_diff_key($objects, $uids) as $object) { + $titles[] = (string)($object['data']['title'] ?? ''); + } + } + + return $titles; + }//end missing() + + /** + * Every Project UID the mapped plan writes. + * + * @param array $mapped The mapping. + * + * @return array + */ + private function uidsOf(array $mapped): array { + $uids = []; + foreach (['phases', 'tasks', 'subtasks'] as $kind) { + foreach ($mapped[$kind] as $object) { + $uids[(string)$object['uid']] = true; + } + } + + return $uids; + }//end uidsOf() + + /** + * How the preview names a mapped task. + * + * @param array $task The mapped task. + * + * @return string task, subtask or milestone + */ + private function kind(array $task): string { + if (($task['data']['issueType'] ?? '') === 'milestone') { + return 'milestone'; + } + + if ($task['parentUid'] !== null) { + return 'subtask'; + } + + return 'task'; + }//end kind() + + /** + * The UUID of an entity or array row. + * + * @param mixed $row The row. + * @param string $fallback The value when none is found. + * + * @return string + */ + private function idOf(mixed $row, string $fallback): string { + // Use is_callable, not method_exists: an OpenRegister entity serves getUuid() through __call(). + if (is_object($row) === true && is_callable([$row, 'getUuid']) === true) { + return (string)($row->getUuid() ?? $fallback); + } + + if (is_array($row) === true) { + return (string)($row['@self']['id'] ?? ($row['id'] ?? $fallback)); + } + + return $fallback; + }//end idOf() + + /** + * The data of an entity or array row. + * + * @param mixed $row The row. + * + * @return array + */ + private function dataOf(mixed $row): array { + if (is_object($row) === true && is_callable([$row, 'getObject']) === true) { + return (array)$row->getObject(); + } + + if (is_array($row) === true) { + return $row; + } + + return []; + }//end dataOf() +}//end class diff --git a/lib/Service/MsProjectPlanMapper.php b/lib/Service/MsProjectPlanMapper.php new file mode 100644 index 00000000..46a0c336 --- /dev/null +++ b/lib/Service/MsProjectPlanMapper.php @@ -0,0 +1,298 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +/** + * Maps a parsed plan to phases, tasks, sub-tasks, links and losses. + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-1.2 + */ +class MsProjectPlanMapper { + + /** + * Project's link type for finish-to-start. + * + * @var int + */ + private const FINISH_TO_START = 1; + + /** + * The loss keys, in the order the preview lists them. + * + * @var list + */ + private const LOSS_KEYS = ['resources', 'collapsedLevels', 'relatedLinks', 'lags', 'phaseLinks', 'unknownLinks']; + + /** + * Map a parsed plan. + * + * @param array{name:string,saveVersion:string,tasks:list>} $plan The plan from MsProjectPlanParser. + * + * @return array{phases:list>,tasks:list>,subtasks:list>,links:list>,losses:array,counts:array} + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-1.2 + */ + public function map(array $plan): array { + $provenance = ['msProjectFile' => $plan['name'], 'msProjectSaveVersion' => $plan['saveVersion']]; + $losses = array_fill_keys(self::LOSS_KEYS, 0); + $out = ['phases' => [], 'tasks' => [], 'subtasks' => []]; + $kindByUid = []; + $phaseUid = null; + $level2Uid = null; + $path = []; + + foreach ($plan['tasks'] as $task) { + $level = (int)$task['level']; + $path = array_slice($path, 0, ($level - 1), true); + $path[$level] = $task['name']; + $losses['resources'] += (int)($task['hasResource'] === true); + + if ($level === 1 && $task['summary'] === true) { + $phaseUid = $task['uid']; + $kindByUid[$phaseUid] = 'phase'; + $out['phases'][] = ['uid' => $phaseUid, 'data' => $this->phaseData(task: $task, order: count($out['phases']), provenance: $provenance)]; + continue; + } + + if ($level <= 2) { + if ($level === 1) { + $phaseUid = null; + } + + $level2Uid = $task['uid']; + $kindByUid[$task['uid']] = 'task'; + $data = $this->taskData(task: $task, provenance: $provenance, path: null); + $out['tasks'][] = $this->mapped(task: $task, phaseUid: $phaseUid, parentUid: null, data: $data); + continue; + } + + $collapsed = null; + if ($level > 3) { + $losses['collapsedLevels']++; + $collapsed = implode(' > ', array_slice($path, 1, null)); + } + + $kindByUid[$task['uid']] = 'task'; + $data = $this->taskData(task: $task, provenance: $provenance, path: $collapsed); + $out['subtasks'][] = $this->mapped(task: $task, phaseUid: $phaseUid, parentUid: $level2Uid, data: $data); + }//end foreach + + $links = $this->links(tasks: $plan['tasks'], kindByUid: $kindByUid, losses: $losses); + + return [ + 'phases' => $out['phases'], + 'tasks' => $out['tasks'], + 'subtasks' => $out['subtasks'], + 'links' => $links, + 'losses' => array_filter($losses), + 'counts' => $this->counts(out: $out, links: $links), + ]; + }//end map() + + /** + * The dependency links between tasks, counting the ones that change or drop. + * + * @param list> $tasks The plan's tasks. + * @param array $kindByUid 'phase' or 'task' per UID. + * @param array $losses The loss counts, updated. + * + * @return list> + */ + private function links(array $tasks, array $kindByUid, array &$losses): array { + $links = []; + foreach ($tasks as $task) { + foreach ($task['predecessors'] as $link) { + $blocker = (string)$link['uid']; + if (isset($kindByUid[$blocker]) === false) { + $losses['unknownLinks']++; + continue; + } + + if ($kindByUid[$blocker] === 'phase' || $kindByUid[$task['uid']] === 'phase') { + $losses['phaseLinks']++; + continue; + } + + $type = 'blocks'; + if ((int)$link['type'] !== self::FINISH_TO_START) { + $type = 'relates'; + $losses['relatedLinks']++; + } + + $losses['lags'] += (int)((int)$link['lag'] !== 0); + $links[$blocker . '>' . $task['uid']] = ['blockerUid' => $blocker, 'blockedUid' => (string)$task['uid'], 'type' => $type]; + }//end foreach + }//end foreach + + return array_values($links); + }//end links() + + /** + * One mapped task with its references by Project UID. + * + * @param array $task The plan task. + * @param string|null $phaseUid The UID of its phase. + * @param string|null $parentUid The UID of its parent task. + * @param array $data The payload. + * + * @return array + */ + private function mapped(array $task, ?string $phaseUid, ?string $parentUid, array $data): array { + return ['uid' => $task['uid'], 'phaseUid' => $phaseUid, 'parentUid' => $parentUid, 'data' => $data]; + }//end mapped() + + /** + * A phase payload. + * + * @param array $task The summary task. + * @param int $order The phase's position. + * @param array $provenance The plan's name and version. + * + * @return array + */ + private function phaseData(array $task, int $order, array $provenance): array { + return array_filter( + [ + 'title' => $this->title(task: $task), + 'startDate' => $task['start'], + 'endDate' => $task['finish'], + 'order' => $order, + 'metadata' => (['msProjectUid' => $task['uid']] + $provenance), + ], + static fn ($value): bool => $value !== null + ); + }//end phaseData() + + /** + * A task payload. + * + * @param array $task The plan task. + * @param array $provenance The plan's name and version. + * @param string|null $path The outline path of a collapsed task. + * + * @return array + */ + private function taskData(array $task, array $provenance, ?string $path): array { + $description = trim(implode("\n\n", array_filter([$path, $task['notes']], static fn ($part): bool => $part !== null && $part !== ''))); + if ($description === '') { + $description = null; + } + + $start = $task['start']; + $issueType = null; + if ($task['milestone'] === true) { + $start = ($task['finish'] ?? $task['start']); + $issueType = 'milestone'; + } + + return array_filter( + [ + 'title' => $this->title(task: $task), + 'description' => $description, + 'status' => $this->status(percent: (int)$task['percent']), + 'startDate' => $start, + 'dueDate' => ($task['finish'] ?? $start), + 'estimatedDuration' => $task['minutes'], + 'percentComplete' => (int)$task['percent'], + 'issueType' => $issueType, + 'metadata' => (['msProjectUid' => $task['uid']] + $provenance), + ], + static fn ($value): bool => $value !== null + ); + }//end taskData() + + /** + * The status progress implies. + * + * @param int $percent Percent complete. + * + * @return string + */ + private function status(int $percent): string { + if ($percent >= 100) { + return 'done'; + } + + if ($percent > 0) { + return 'in_progress'; + } + + return 'open'; + }//end status() + + /** + * A task's title; a nameless task is called after its UID. + * + * @param array $task The plan task. + * + * @return string + */ + private function title(array $task): string { + $name = trim((string)$task['name']); + if ($name === '') { + return 'Task ' . $task['uid']; + } + + return $name; + }//end title() + + /** + * What the import creates, per kind. + * + * @param array>> $out The mapped phases, tasks and sub-tasks. + * @param list> $links The links. + * + * @return array + */ + private function counts(array $out, array $links): array { + $milestones = 0; + $tasks = 0; + $subtasks = 0; + foreach (['tasks', 'subtasks'] as $kind) { + foreach ($out[$kind] as $task) { + if (($task['data']['issueType'] ?? '') === 'milestone') { + $milestones++; + continue; + } + + $tasks += (int)($kind === 'tasks'); + $subtasks += (int)($kind === 'subtasks'); + } + } + + return [ + 'phases' => count($out['phases']), + 'tasks' => $tasks, + 'subtasks' => $subtasks, + 'milestones' => $milestones, + 'links' => count($links), + ]; + }//end counts() +}//end class diff --git a/lib/Service/MsProjectPlanParser.php b/lib/Service/MsProjectPlanParser.php new file mode 100644 index 00000000..ae6ee29f --- /dev/null +++ b/lib/Service/MsProjectPlanParser.php @@ -0,0 +1,274 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-1.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use DOMDocument; +use DOMElement; +use OCA\Planninq\Exception\MsProjectImportException; + +/** + * Parses MSPDI XML. + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-1.1 + */ +class MsProjectPlanParser { + + /** + * The largest file read, in bytes (10 MB). + * + * @var int + */ + public const MAX_BYTES = 10485760; + + /** + * The most tasks a plan may hold. + * + * @var int + */ + public const MAX_TASKS = 2000; + + /** + * The ResourceUID Project writes for an unassigned placeholder. + * + * @var int + */ + private const UNASSIGNED = -65535; + + /** + * Read a plan. + * + * @param string $content The file content. + * @param string $fileName The name the file was uploaded with. + * + * @return array{name:string,saveVersion:string,tasks:list>} + * + * @throws MsProjectImportException When the file is refused. + * + * @spec openspec/changes/integration-msproject-import/tasks.md#task-1.1 + */ + public function parse(string $content, string $fileName): array { + $this->assertAcceptable(content: $content, fileName: $fileName); + + $document = new DOMDocument(); + $previous = libxml_use_internal_errors(true); + // LIBXML_NONET: no network access. No LIBXML_NOENT or LIBXML_DTDLOAD, so + // no entity is ever substituted and no DTD is fetched; the declarations + // were refused above anyway. + $loaded = $document->loadXML($content, LIBXML_NONET); + libxml_clear_errors(); + libxml_use_internal_errors($previous); + + $root = $document->documentElement; + if ($loaded === false || $root === null || $root->localName !== 'Project' || $document->doctype !== null) { + throw new MsProjectImportException(reason: MsProjectImportException::NOT_A_PLAN, message: 'The file is not a Microsoft Project XML plan.'); + } + + $taskElements = $this->children(parent: $this->child(parent: $root, name: 'Tasks'), name: 'Task'); + if (count($taskElements) > self::MAX_TASKS) { + throw new MsProjectImportException( + reason: MsProjectImportException::TOO_MANY_TASKS, + message: 'The plan has more than ' . self::MAX_TASKS . ' tasks.' + ); + } + + $resourced = $this->resourcedTaskUids(root: $root); + $tasks = []; + foreach ($taskElements as $element) { + $task = $this->task(element: $element, resourced: $resourced); + if ($task['level'] >= 1) { + $tasks[] = $task; + } + } + + return [ + 'name' => $this->text(parent: $root, name: 'Name'), + 'saveVersion' => $this->text(parent: $root, name: 'SaveVersion'), + 'tasks' => $tasks, + ]; + }//end parse() + + /** + * Refuse a file by its name, size and declarations, before it is parsed. + * + * @param string $content The file content. + * @param string $fileName The file name. + * + * @return void + * + * @throws MsProjectImportException When the file is refused. + */ + private function assertAcceptable(string $content, string $fileName): void { + if (strtolower(pathinfo($fileName, PATHINFO_EXTENSION)) === 'mpp' || str_starts_with($content, "\xD0\xCF\x11\xE0") === true) { + throw new MsProjectImportException(reason: MsProjectImportException::MPP, message: 'Binary .mpp files cannot be read.'); + } + + if (strlen($content) > self::MAX_BYTES) { + throw new MsProjectImportException(reason: MsProjectImportException::TOO_LARGE, message: 'The file is larger than 10 MB.'); + } + + if (preg_match('/ $resourced The UIDs of tasks with a resource. + * + * @return array + */ + private function task(DOMElement $element, array $resourced): array { + $uid = $this->text(parent: $element, name: 'UID'); + $predecessors = []; + foreach ($this->children(parent: $element, name: 'PredecessorLink') as $link) { + $predecessors[] = [ + 'uid' => $this->text(parent: $link, name: 'PredecessorUID'), + 'type' => (int)($this->text(parent: $link, name: 'Type', fallback: '1')), + 'lag' => (int)$this->text(parent: $link, name: 'LinkLag', fallback: '0'), + ]; + } + + return [ + 'uid' => $uid, + 'name' => $this->text(parent: $element, name: 'Name'), + 'level' => (int)$this->text(parent: $element, name: 'OutlineLevel', fallback: '1'), + 'summary' => ($this->text(parent: $element, name: 'Summary') === '1'), + 'milestone' => ($this->text(parent: $element, name: 'Milestone') === '1'), + 'start' => $this->date(value: $this->text(parent: $element, name: 'Start')), + 'finish' => $this->date(value: $this->text(parent: $element, name: 'Finish')), + 'minutes' => $this->minutes(duration: $this->text(parent: $element, name: 'Duration')), + 'percent' => max(0, min(100, (int)$this->text(parent: $element, name: 'PercentComplete', fallback: '0'))), + 'notes' => $this->text(parent: $element, name: 'Notes'), + 'predecessors' => $predecessors, + 'hasResource' => isset($resourced[$uid]), + ]; + }//end task() + + /** + * The UIDs of tasks that have a real resource assigned. + * + * @param DOMElement $root The Project element. + * + * @return array + */ + private function resourcedTaskUids(DOMElement $root): array { + $uids = []; + foreach ($this->children(parent: $this->child(parent: $root, name: 'Assignments'), name: 'Assignment') as $assignment) { + $resource = $this->text(parent: $assignment, name: 'ResourceUID'); + if ($resource !== '' && (int)$resource !== self::UNASSIGNED) { + $uids[$this->text(parent: $assignment, name: 'TaskUID')] = true; + } + } + + return $uids; + }//end resourcedTaskUids() + + /** + * An MSPDI date-time as a date, or null. + * + * @param string $value The value, e.g. 2027-03-01T08:00:00. + * + * @return string|null + */ + private function date(string $value): ?string { + if (preg_match('/^\d{4}-\d{2}-\d{2}/', $value, $match) !== 1) { + return null; + } + + return $match[0]; + }//end date() + + /** + * An ISO 8601 duration (Project writes PT80H0M0S) in whole minutes, or null. + * + * @param string $duration The duration. + * + * @return int|null + */ + private function minutes(string $duration): ?int { + if (preg_match('/^P(?:(\d+)D)?(?:T(?:(\d+)H)?(?:(\d+)M)?(?:[\d.]+S)?)?$/', $duration, $parts) !== 1 || $duration === 'P') { + return null; + } + + return ((int)($parts[1] ?? 0) * 1440) + ((int)($parts[2] ?? 0) * 60) + (int)($parts[3] ?? 0); + }//end minutes() + + /** + * The first direct child element with this local name, or null. + * + * @param DOMElement|null $parent The parent. + * @param string $name The local name. + * + * @return DOMElement|null + */ + private function child(?DOMElement $parent, string $name): ?DOMElement { + return ($this->children(parent: $parent, name: $name)[0] ?? null); + }//end child() + + /** + * The direct child elements with this local name. + * + * @param DOMElement|null $parent The parent. + * @param string $name The local name. + * + * @return list + */ + private function children(?DOMElement $parent, string $name): array { + if ($parent === null) { + return []; + } + + $found = []; + foreach ($parent->childNodes as $node) { + if ($node instanceof DOMElement && $node->localName === $name) { + $found[] = $node; + } + } + + return $found; + }//end children() + + /** + * The trimmed text of a direct child element. + * + * @param DOMElement $parent The parent. + * @param string $name The local name. + * @param string $fallback The value when the element is missing. + * + * @return string + */ + private function text(DOMElement $parent, string $name, string $fallback = ''): string { + $child = $this->child(parent: $parent, name: $name); + if ($child === null) { + return $fallback; + } + + return trim($child->textContent); + }//end text() +}//end class diff --git a/lib/Service/NotificationSwitchService.php b/lib/Service/NotificationSwitchService.php new file mode 100644 index 00000000..959ac119 --- /dev/null +++ b/lib/Service/NotificationSwitchService.php @@ -0,0 +1,214 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCA\Planninq\AppInfo\Application; +use OCP\App\IAppManager; +use OCP\IConfig; +use OCP\IUserManager; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Reads and writes the assignment notification switch. + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-1.2 + */ +class NotificationSwitchService { + + /** + * The user value for assignment notifications, on unless `false`. + * + * @var string + */ + public const ASSIGNED_KEY = 'notify_assigned'; + + /** + * The task schema's assignment rules the switch overrides. + * + * @var array + */ + public const ASSIGNED_RULES = ['taskAssignedOnCreate', 'taskAssigned']; + + /** + * The user value for email, off unless `true` (collaboration-notifications task 2.3). + * + * @var string + */ + public const EMAIL_KEY = 'notify_by_email'; + + /** + * The due-date reminder switch (kept by SettingsService); off silences the reminder mail too. + * + * @var string + */ + public const DUE_REMINDER_KEY = 'notify_due_reminder'; + + /** + * OpenRegister's per-user notification preference service. + * + * @var string + */ + private const PREFERENCES = 'OCA\OpenRegister\Service\Notification\NotificationPreferenceService'; + + /** + * Constructor. + * + * @param IConfig $config The per-user values. + * @param IAppManager $appManager Tells whether OpenRegister is installed. + * @param ContainerInterface $container Resolves OpenRegister's preference service. + * @param LoggerInterface $logger Logs a skipped or failed override write. + * @param IUserManager $users Tells whether the account has an email address. + */ + public function __construct( + private IConfig $config, + private IAppManager $appManager, + private ContainerInterface $container, + private LoggerInterface $logger, + private IUserManager $users, + ) { + }//end __construct() + + /** + * The user's switches, for GET /api/settings. + * + * @param string $userId The user. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-1.2 + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.3 + */ + public function values(string $userId): array { + $user = $this->users->get($userId); + return [ + self::ASSIGNED_KEY => $this->isAssignedOn(userId: $userId), + self::EMAIL_KEY => $this->config->getUserValue($userId, Application::APP_ID, self::EMAIL_KEY, 'false') === 'true', + 'hasEmail' => $user !== null && (string)$user->getEMailAddress() !== '', + ]; + }//end values() + + /** + * Apply the switches present in a personal-settings save. + * + * @param string $userId The user. + * @param array $data The posted values. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-1.2 + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-2.3 + */ + public function apply(string $userId, array $data): void { + if (array_key_exists(self::ASSIGNED_KEY, $data) === true) { + $enabled = filter_var($data[self::ASSIGNED_KEY], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + $this->setAssigned(userId: $userId, enabled: ($enabled !== false)); + } + + if (array_key_exists(self::EMAIL_KEY, $data) === true) { + $byEmail = filter_var($data[self::EMAIL_KEY], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); + $stored = 'false'; + if ($byEmail === true) { + $stored = 'true'; + } + + $this->config->setUserValue($userId, Application::APP_ID, self::EMAIL_KEY, $stored); + } + }//end apply() + + /** + * Whether the user hears about tasks assigned to them (default on). + * + * @param string $userId The user. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-1.2 + */ + private function isAssignedOn(string $userId): bool { + return $this->config->getUserValue($userId, Application::APP_ID, self::ASSIGNED_KEY, 'true') !== 'false'; + }//end isAssignedOn() + + /** + * Store the switch and write it through to OpenRegister: off writes + * `{"enabled": false}` for both assignment rules, on clears the override + * so the rule's default applies. Without OpenRegister the value is still + * stored and the write-through is skipped. + * + * @param string $userId The user. + * @param bool $enabled Whether assignment notifications are on. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-collaboration-notifications/tasks.md#task-1.2 + */ + public function setAssigned(string $userId, bool $enabled): void { + $stored = 'false'; + $override = ['enabled' => false]; + if ($enabled === true) { + $stored = 'true'; + $override = null; + } + + $this->config->setUserValue($userId, Application::APP_ID, self::ASSIGNED_KEY, $stored); + $preferences = $this->preferences(); + if ($preferences === null) { + $this->logger->info('Planninq: OpenRegister unavailable, notify_assigned override skipped', ['user' => $userId]); + return; + } + + foreach (self::ASSIGNED_RULES as $rule) { + try { + $preferences->setOverride(userId: $userId, schemaSlug: 'task', notificationKey: $rule, override: $override); + } catch (\Throwable $e) { + $this->logger->warning( + 'Planninq: failed to write the notify_assigned override', + ['user' => $userId, 'rule' => $rule, 'exception' => $e->getMessage()] + ); + } + } + }//end setAssigned() + + /** + * OpenRegister's preference service, or null without OpenRegister. + * + * @return object|null + */ + private function preferences(): ?object { + if ($this->appManager->isInstalled('openregister') === false) { + return null; + } + + try { + return $this->container->get(self::PREFERENCES); + } catch (\Throwable $e) { + $this->logger->info('Planninq: NotificationPreferenceService unavailable', ['exception' => $e->getMessage()]); + return null; + } + }//end preferences() +}//end class diff --git a/lib/Service/ProjectHealthService.php b/lib/Service/ProjectHealthService.php new file mode 100644 index 00000000..9da69ebc --- /dev/null +++ b/lib/Service/ProjectHealthService.php @@ -0,0 +1,279 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use Throwable; + +/** + * Copies the newest status report of a project onto the project. + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-1.2 + */ +class ProjectHealthService { + + /** + * Slug of the status report schema. + * + * @var string + */ + public const REPORT_SCHEMA = 'projectStatusReport'; + + /** + * The six aspects, as the suffix of `status` on a report and `health` on a project. + * + * @var array + */ + public const ASPECTS = ['Money', 'Organisation', 'Time', 'Information', 'Quality', 'Risk']; + + /** + * The statuses from best to worst. + * + * @var array + */ + public const STATUSES = ['onTrack', 'atRisk', 'offTrack']; + + /** + * OpenRegister's system-operation scope, by name, so planninq has no compile-time dependency on it. + * + * @var string + */ + private const OR_SYSTEM_CONTEXT = 'OCA\\OpenRegister\\Service\\SystemOperationContext'; + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Reads reports and projects as the system. + * @param ContainerInterface $container Resolves OpenRegister's ObjectService for the write. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectMembershipService $membership, + private ContainerInterface $container, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * The health fields of a project, empty statuses when it has no report. + * + * @param array $project The project data. + * + * @return array Keyed `health`, `healthOverall` and `healthDate`. + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-1.2 + */ + public function healthOf(array $project): array { + $health = []; + foreach ($this->healthKeys() as $key) { + $value = ($project[$key] ?? null); + $health[$key] = null; + if (is_string($value) === true && $value !== '') { + $health[$key] = $value; + } + } + + return $health; + }//end healthOf() + + /** + * The health fields a report hands to its project. + * + * The overall status is worked out here as well as by OpenRegister's + * calculation, so the copy never depends on the order of save listeners. + * + * @param array|null $report The report data, null for none. + * + * @return array + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-1.2 + */ + public function healthFromReport(?array $report): array { + $health = array_fill_keys($this->healthKeys(), null); + if ($report === null) { + return $health; + } + + $worst = -1; + foreach (self::ASPECTS as $aspect) { + $status = ($report['status' . $aspect] ?? null); + $rank = array_search($status, self::STATUSES, true); + if ($rank === false) { + continue; + } + + $health['health' . $aspect] = $status; + $worst = max($worst, $rank); + } + + if ($worst >= 0) { + $health['healthOverall'] = self::STATUSES[$worst]; + } + + $date = ($report['reportDate'] ?? null); + if (is_string($date) === true && $date !== '') { + $health['healthDate'] = substr($date, 0, 10); + } + + return $health; + }//end healthFromReport() + + /** + * The newest report among the stored ones, with one report replaced or left out. + * + * Newest is the latest `reportDate`. On a tie the report being saved wins, + * then the stored one listed last. + * + * @param string $projectId The project UUID. + * @param string $reportId The report being saved or deleted. + * @param array|null $saving The report's new data, null when it is being deleted. + * + * @return array|null + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-1.2 + */ + public function newestReport(string $projectId, string $reportId, ?array $saving): ?array { + $newest = null; + foreach ($this->membership->rows(schema: self::REPORT_SCHEMA, filters: ['project' => $projectId]) as $row) { + if ($row['id'] === $reportId) { + continue; + } + + if ($newest === null || $this->dateOf(report: $row['data']) >= $this->dateOf(report: $newest)) { + $newest = $row['data']; + } + } + + if ($saving !== null && ($newest === null || $this->dateOf(report: $saving) >= $this->dateOf(report: $newest))) { + $newest = $saving; + } + + return $newest; + }//end newestReport() + + /** + * Write the newest report's statuses onto its project, when they differ. + * + * The write runs in OpenRegister's system-operation scope: the person who + * saves a report may not update the project itself, and the project guard + * lets only such a write change the health fields. + * + * @param string $projectId The project UUID. + * @param string $reportId The report being saved or deleted. + * @param array|null $saving The report's new data, null when it is being deleted. + * + * @return bool True when the project was written. + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-1.2 + */ + public function refresh(string $projectId, string $reportId, ?array $saving): bool { + $project = $this->membership->objectData(schema: ProjectMembershipService::PROJECT_SCHEMA, id: $projectId); + if ($project === null) { + return false; + } + + $health = $this->healthFromReport(report: $this->newestReport(projectId: $projectId, reportId: $reportId, saving: $saving)); + if ($this->healthOf(project: $project) === $health) { + return false; + } + + $class = self::OR_SYSTEM_CONTEXT; + if (class_exists($class) === false) { + $this->logger->warning('Planninq: OpenRegister has no system-operation scope, so a project status was not copied', ['project' => $projectId]); + return false; + } + + try { + $objectService = $this->container->get('OCA\\OpenRegister\\Service\\ObjectService'); + $class::run( + static fn () => $objectService->saveObject( + object: array_merge($project, $health), + register: ProjectMembershipService::REGISTER, + schema: ProjectMembershipService::PROJECT_SCHEMA, + uuid: $projectId, + _rbac: false, + _multitenancy: false, + silent: true, + _validation: false + ) + ); + } catch (Throwable $e) { + $this->logger->error( + 'Planninq: could not copy the newest status report onto its project', + ['project' => $projectId, 'exception' => $e->getMessage()] + ); + return false; + } + + return true; + }//end refresh() + + /** + * Whether OpenRegister is running a system operation, such as this service's own copy or an import. + * + * @return bool + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-1.2 + */ + public function isSystemOperation(): bool { + $class = self::OR_SYSTEM_CONTEXT; + + return (class_exists($class) === true && $class::isActive() === true); + }//end isSystemOperation() + + /** + * The keys of the health fields on a project. + * + * @return array + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-1.2 + */ + public function healthKeys(): array { + $keys = []; + foreach (self::ASPECTS as $aspect) { + $keys[] = 'health' . $aspect; + } + + $keys[] = 'healthOverall'; + $keys[] = 'healthDate'; + + return $keys; + }//end healthKeys() + + /** + * A report's date, for ordering. + * + * @param array $report The report data. + * + * @return string + */ + private function dateOf(array $report): string { + return substr((string)($report['reportDate'] ?? ''), 0, 10); + }//end dateOf() +}//end class diff --git a/lib/Service/ProjectMembershipService.php b/lib/Service/ProjectMembershipService.php new file mode 100644 index 00000000..6c1e87cd --- /dev/null +++ b/lib/Service/ProjectMembershipService.php @@ -0,0 +1,671 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/specs/projects.md + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCP\App\IAppManager; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use RuntimeException; + +/** + * Computes and writes the denormalised `members` list of project-scoped objects. + * + * @spec openspec/specs/projects.md + */ +class ProjectMembershipService { + + /** + * OpenRegister register slug of the planninq schemas. + * + * @var string + */ + public const REGISTER = 'planninq'; + + /** + * Schema slug of the project, whose membership is copied. + * + * @var string + */ + public const PROJECT_SCHEMA = 'project'; + + /** + * The field holding the managers of a project's portfolio, copied like `members`. + * + * @var string + */ + public const READERS_FIELD = 'portfolioReaders'; + + /** + * The role lists every project-scoped object carries besides `members` + * (projects-members-and-roles): users who only read, the groups who + * write (owning, manager and member groups) and the groups who only read. + */ + public const ROLE_FIELDS = ['viewers', 'memberGroups', 'viewerGroups']; + + /** + * Schemas that carry a copy of their project's members. + * + * @var array + */ + public const SCOPED_SCHEMAS = [ + 'task', + 'column', + 'projectPhase', + 'plannedTimeEntry', + 'projectLogEntry', + 'risk', + 'projectStatusReport', + 'projectRelease', + 'boardFilter', + 'forgeLink', + ]; + + /** + * The one scoped schema that may name its project only through its task. + * + * @var string + */ + private const TIME_ENTRY_SCHEMA = 'plannedTimeEntry'; + + /** + * The scoped schema whose project is always its task's (integration-code-forge-links). + * + * @var string + */ + private const FORGE_LINK_SCHEMA = 'forgeLink'; + + /** + * Largest `IN` list sent in one search, below the 1000-item cap some databases enforce. + * + * @var integer + */ + private const IN_CHUNK = 500; + + + /** + * Members per project id for this request; null for a project that did not resolve. + * + * @var array|null> + */ + private array $membersCache = []; + + /** + * Constructor. + * + * @param ContainerInterface $container Resolves OpenRegister's ObjectService at runtime. + * @param IAppManager $appManager Tells whether OpenRegister is installed. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ContainerInterface $container, + private IAppManager $appManager, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Whether OpenRegister is installed, so there is anything to read or write. + * + * @return bool + * + * @spec openspec/specs/projects.md + */ + public function isAvailable(): bool { + return $this->appManager->isInstalled('openregister'); + }//end isAvailable() + + /** + * The members list a project hands down: the people who write its work, + * its members, its managers and its owner, sorted and distinct. + * + * @param array $project The project data. + * + * @return array The user ids. + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-2.3 + */ + private function membersFromProject(array $project): array { + $members = $this->listOf(project: $project, field: 'members'); + $members = array_merge($members, $this->listOf(project: $project, field: 'managers')); + $members[] = ($project['owner'] ?? ''); + + return $this->normalise(members: $members); + }//end membersFromProject() + + /** + * Every list a project hands down to its objects, keyed by the field the + * objects carry it in: `members` (users who write), `viewers` (users who + * read), `memberGroups` (the owning, manager and member groups, who write) + * and `viewerGroups` (groups who read). + * + * @param array $project The project data. + * + * @return array> Field to sorted, distinct ids. + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-2.3 + */ + public function childLists(array $project): array { + $writerGroups = array_merge( + $this->listOf(project: $project, field: 'ownerGroups'), + $this->listOf(project: $project, field: 'managerGroups'), + $this->listOf(project: $project, field: 'memberGroups') + ); + + return [ + 'members' => $this->membersFromProject(project: $project), + 'viewers' => $this->normalise(members: $this->listOf(project: $project, field: 'viewers')), + 'memberGroups' => $this->normalise(members: $writerGroups), + 'viewerGroups' => $this->normalise(members: $this->listOf(project: $project, field: 'viewerGroups')), + ]; + }//end childLists() + + /** + * One list field of a project, or none when it is missing or not a list. + * + * @param array $project The project data. + * @param string $field The list field. + * + * @return array + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-2.3 + */ + private function listOf(array $project, string $field): array { + $values = ($project[$field] ?? []); + if (is_array($values) === false) { + return []; + } + + return $values; + }//end listOf() + + /** + * A stored `members` value as a sorted, distinct list, for comparison. + * + * @param mixed $members The stored value. + * + * @return array The user ids. + * + * @spec openspec/specs/projects.md + */ + public function normalise(mixed $members): array { + if (is_array($members) === false) { + return []; + } + + $ids = []; + foreach ($members as $member) { + if (is_scalar($member) === true && (string)$member !== '') { + $ids[(string)$member] = true; + } + } + + $ids = array_map('strval', array_keys($ids)); + sort($ids); + + return $ids; + }//end normalise() + + /** + * The project an object of a scoped schema belongs to. + * + * A planned time entry may name only its task; its project is then the task's. + * + * @param string $schemaSlug The object's schema slug. + * @param array $data The object data. + * + * @return string The project uuid, or '' when none resolves. + * + * @spec openspec/specs/projects.md + */ + public function projectIdFor(string $schemaSlug, array $data): string { + if ($schemaSlug === self::FORGE_LINK_SCHEMA) { + // Always the task's project: a code link may not claim another one. + return (string)($this->container->get('OCA\\Planninq\\Service\\ForgeLinkService')->linkedTask(data: $data)['project'] ?? ''); + } + + $projectId = $this->referenceId(value: ($data['project'] ?? null)); + if ($projectId !== '' || $schemaSlug !== self::TIME_ENTRY_SCHEMA) { + return $projectId; + } + + $taskId = $this->referenceId(value: ($data['task'] ?? null)); + if ($taskId === '') { + return ''; + } + + $task = $this->findData(schema: 'task', id: $taskId); + + return $this->referenceId(value: ($task['project'] ?? null)); + }//end projectIdFor() + + /** + * The members list of a project, cached for the request. + * + * @param string $projectId The project uuid. + * + * @return array|null The user ids, or null when the project does not resolve. + * + * @spec openspec/specs/projects.md + */ + public function membersOfProject(string $projectId): ?array { + if ($projectId === '') { + return null; + } + + if (array_key_exists($projectId, $this->membersCache) === false) { + $project = $this->findData(schema: self::PROJECT_SCHEMA, id: $projectId); + $members = null; + if ($project !== null) { + $members = $this->membersFromProject(project: $project); + } + + $this->membersCache[$projectId] = $members; + } + + return $this->membersCache[$projectId]; + }//end membersOfProject() + + /** + * The owner of a project, or null when the project does not resolve. + * + * @param string $projectId The project UUID. + * + * @return string|null + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-1.1 + */ + public function ownerOfProject(string $projectId): ?string { + if ($projectId === '') { + return null; + } + + $owner = ($this->findData(schema: self::PROJECT_SCHEMA, id: $projectId)['owner'] ?? null); + if (is_string($owner) === false || $owner === '') { + return null; + } + + return $owner; + }//end ownerOfProject() + + /** + * One planninq object's stored data, read as the system, or null when it does not resolve. + * + * @param string $schema The schema slug. + * @param string $id The UUID. + * + * @return array|null + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-1.3 + */ + public function objectData(string $schema, string $id): ?array { + if ($id === '') { + return null; + } + + return $this->findData(schema: $schema, id: $id); + }//end objectData() + + /** + * Every planninq object of one schema matching the filters, read with RBAC off. + * + * @param string $schema The schema slug. + * @param array $filters OpenRegister search filters. + * + * @return array}> + * + * @spec openspec/changes/boards-configurable-columns/tasks.md#task-2.1 + */ + public function rows(string $schema, array $filters): array { + return $this->search(objectService: $this->objectService(), schema: $schema, filters: $filters); + }//end rows() + + /** + * Write a project's members list to every object of that project that is out of step. + * + * Writes run as the system (`_rbac: false`, all organisations), silent (no + * audit row, event or notification per object) and without validation: the + * acting user changed the project, and only `members` changes on the object. + * One object that refuses the write is logged and does not stop the rest. + * + * The same writes keep `portfolioReaders` in step: pass that field and the + * managers of the project's portfolio. + * + * @param string $projectId The project uuid. + * @param array $members The list, for `members` from membersFromProject(). + * @param string $field `members`, or READERS_FIELD for the portfolio readers. + * + * @return int The number of objects written. + * + * @spec openspec/specs/projects.md + */ + public function syncProjectMembers(string $projectId, array $members, string $field = 'members'): int { + $members = $this->normalise(members: $members); + if ($field === 'members') { + $this->membersCache[$projectId] = $members; + } + + return $this->syncField(projectId: $projectId, field: $field, values: $members); + }//end syncProjectMembers() + + /** + * Write one access list to every object of a project that is out of step. + * + * @param string $projectId The project uuid. + * @param string $field `members` or `portfolioReaders`. + * @param array $values The normalised list. + * + * @return int The number of objects written. + */ + private function syncField(string $projectId, string $field, array $values): int { + if ($projectId === '') { + return 0; + } + + $objectService = $this->objectService(); + $written = 0; + foreach ($this->childrenOf(objectService: $objectService, projectId: $projectId) as $child) { + if ($this->normalise(members: ($child['data'][$field] ?? null)) === $values) { + continue; + } + + $written += $this->writeField(objectService: $objectService, child: $child, field: $field, values: $values); + } + + return $written; + }//end syncField() + + /** + * Bring every project's objects in step: the upgrade back-fill. + * + * An object whose project no longer exists is left as it is, so it stays + * visible to admins only. + * + * @return array{projects: int, written: int} Projects visited and objects written. + * + * @spec openspec/specs/projects.md + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-2.3 + */ + public function syncAll(): array { + $objectService = $this->objectService(); + $projects = 0; + $written = 0; + foreach ($this->search(objectService: $objectService, schema: self::PROJECT_SCHEMA, filters: []) as $project) { + $projects++; + foreach ($this->childLists(project: $project['data']) as $field => $values) { + $written += $this->syncProjectMembers(projectId: $project['id'], members: $values, field: $field); + } + + $written += $this->syncProjectMembers( + projectId: $project['id'], + members: $this->normalise(members: ($project['data'][self::READERS_FIELD] ?? [])), + field: self::READERS_FIELD + ); + } + + return ['projects' => $projects, 'written' => $written]; + }//end syncAll() + + /** + * Every object of a project across the scoped schemas, each once. + * + * Planned time entries are found by their own `project` and, for those that + * name only a task, by the project's task ids. + * + * @param object $objectService OpenRegister's ObjectService. + * @param string $projectId The project uuid. + * + * @return array}> Keyed `schema/id`. + */ + private function childrenOf(object $objectService, string $projectId): array { + $children = []; + $taskIds = []; + foreach (self::SCOPED_SCHEMAS as $schema) { + foreach ($this->search(objectService: $objectService, schema: $schema, filters: ['project' => $projectId]) as $row) { + $children[$schema . '/' . $row['id']] = ['schema' => $schema] + $row; + if ($schema === 'task') { + $taskIds[] = $row['id']; + } + } + } + + foreach (array_chunk($taskIds, self::IN_CHUNK) as $chunk) { + $entries = $this->search(objectService: $objectService, schema: self::TIME_ENTRY_SCHEMA, filters: ['task' => $chunk]); + foreach ($entries as $row) { + $children[self::TIME_ENTRY_SCHEMA . '/' . $row['id']] = ['schema' => self::TIME_ENTRY_SCHEMA] + $row; + } + } + + return $children; + }//end childrenOf() + + /** + * Write one access list onto one object. + * + * @param object $objectService OpenRegister's ObjectService. + * @param array{schema: string, id: string, data: array} $child The object. + * @param string $field `members` or `portfolioReaders`. + * @param array $values The list. + * + * @return int 1 when written, 0 when the write was refused. + */ + private function writeField(object $objectService, array $child, string $field, array $values): int { + $data = $child['data']; + $data[$field] = $values; + + try { + $objectService->saveObject( + object: $data, + register: self::REGISTER, + schema: $child['schema'], + uuid: $child['id'], + _rbac: false, + _multitenancy: false, + silent: true, + _validation: false + ); + } catch (\Throwable $e) { + $this->logger->error( + 'Planninq: could not write an access list of a project object; people may not see it', + ['schema' => $child['schema'], 'object' => $child['id'], 'field' => $field, 'exception' => $e->getMessage()] + ); + return 0; + } + + return 1; + }//end writeField() + + /** + * Search one planninq schema as the system. + * + * @param object $objectService OpenRegister's ObjectService. + * @param string $schema The schema slug. + * @param array $filters Filters: a scalar is equality, a list is IN. + * + * @return array}> The rows found. + */ + private function search(object $objectService, string $schema, array $filters): array { + // `searchObjectsBySlug()`, not setters plus `searchObjects()`: the latter + // ignores the register and schema the setters leave behind (see + // DependencyRepository::fetchProjectTaskIds()). + $results = $objectService->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: $schema, + filters: $filters, + _rbac: false, + _multitenancy: false + ); + + if (is_array($results) === true && array_key_exists('results', $results) === true) { + $results = (array)$results['results']; + } + + $rows = []; + foreach ((array)$results as $row) { + $id = $this->rowId(row: $row); + if ($id !== '') { + $rows[] = ['id' => $id, 'data' => $this->rowData(row: $row)]; + } + } + + return $rows; + }//end search() + + /** + * Read one planninq object as the system. + * + * The membership check must not depend on what the acting user may read, + * and an upgrade has no user at all. + * + * @param string $schema The schema slug. + * @param string $id The uuid. + * + * @return array|null The object data, or null when it does not resolve. + */ + private function findData(string $schema, string $id): ?array { + try { + $entity = $this->objectService()->find( + id: $id, + register: self::REGISTER, + schema: $schema, + _rbac: false, + _multitenancy: false, + _render: false, + _audit: false + ); + } catch (\Throwable $e) { + $this->logger->debug( + 'Planninq: could not read a planninq object for membership', + ['schema' => $schema, 'object' => $id, 'exception' => $e->getMessage()] + ); + return null; + } + + if ($entity === null) { + return null; + } + + return $this->rowData(row: $entity); + }//end findData() + + /** + * OpenRegister's ObjectService. + * + * @return object The service. + * + * @throws RuntimeException When OpenRegister is not installed. + */ + private function objectService(): object { + if ($this->isAvailable() === false) { + throw new RuntimeException('OpenRegister is not installed.'); + } + + return $this->container->get('OCA\\OpenRegister\\Service\\ObjectService'); + }//end objectService() + + /** + * The uuid of a search row, entity or array. + * + * @param mixed $row The row. + * + * @return string The uuid, or ''. + */ + private function rowId(mixed $row): string { + // `is_callable()`, not `method_exists()`: an OpenRegister entity serves + // getUuid() through `__call()` (see LabelService::extractId()). + if (is_object($row) === true && is_callable([$row, 'getUuid']) === true) { + return (string)($row->getUuid() ?? ''); + } + + if (is_array($row) === true) { + return (string)($row['@self']['id'] ?? ($row['id'] ?? '')); + } + + return ''; + }//end rowId() + + /** + * The data of a search row, entity or array. + * + * @param mixed $row The row. + * + * @return array The object data. + */ + private function rowData(mixed $row): array { + if (is_object($row) === true && method_exists($row, 'getObject') === true) { + return (array)$row->getObject(); + } + + if (is_array($row) === true) { + unset($row['@self']); + return $row; + } + + return []; + }//end rowData() + + /** + * A reference value as a uuid string. + * + * A relation arrives as a uuid string, or resolved as an object carrying it. + * + * @param mixed $value The reference. + * + * @return string The uuid, or ''. + */ + private function referenceId(mixed $value): string { + if (is_string($value) === true) { + return trim($value); + } + + if (is_array($value) === true) { + $candidate = ($value['id'] ?? ($value['uuid'] ?? ($value['value'] ?? ($value['@self']['id'] ?? '')))); + if (is_string($candidate) === true) { + return trim($candidate); + } + } + + return ''; + }//end referenceId() +}//end class diff --git a/lib/Service/ProjectPolicySchemaService.php b/lib/Service/ProjectPolicySchemaService.php new file mode 100644 index 00000000..72d2a2fb --- /dev/null +++ b/lib/Service/ProjectPolicySchemaService.php @@ -0,0 +1,182 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.2 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCP\App\IAppManager; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Keeps the live project schema in step with the creation policy. + */ +class ProjectPolicySchemaService { + + /** + * The transitions reviewers run. + * + * @var array + */ + private const REVIEW_TRANSITIONS = ['approve', 'reject']; + + /** + * The object rights reviewers get on a requested project. + * + * @var array + */ + private const REVIEW_OPERATIONS = ['read', 'update']; + + /** + * The match that marks a reviewer rule. + * + * @var array + */ + private const REQUESTED = ['status' => 'requested']; + + /** + * Constructor. + * + * @param IAppManager $appManager Tells whether OpenRegister is installed. + * @param ContainerInterface $container Resolves OpenRegister's mappers. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private IAppManager $appManager, + private ContainerInterface $container, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Make these groups (and admins) the reviewers of project requests. + * + * @param array $groups The reviewer group ids; empty for admins only. + * + * @return bool Whether the live schema was written. + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.2 + */ + public function apply(array $groups): bool { + if ($this->appManager->isInstalled('openregister') === false) { + $this->logger->info('Planninq: OpenRegister unavailable, project reviewers not written'); + return false; + } + + try { + $schemaMapper = $this->container->get('OCA\\OpenRegister\\Db\\SchemaMapper'); + $schema = $this->liveSchema(schemaMapper: $schemaMapper); + if ($schema === null) { + $this->logger->warning('Planninq: project schema or its lifecycle not found, project reviewers not written'); + return false; + } + + $groups = array_values(array_unique(array_filter($groups, static fn ($group): bool => is_string($group) === true && $group !== ''))); + $schema->setConfiguration($this->withReviewTransitions(configuration: $schema->getConfiguration(), groups: $groups)); + $schema->setAuthorization($this->withReviewRules(authorization: ($schema->getAuthorization() ?? []), groups: $groups)); + $schemaMapper->update($schema); + $this->logger->info('Planninq: project reviewers written to the live schema', ['groups' => $groups]); + + return true; + } catch (\Throwable $e) { + $this->logger->warning('Planninq: failed to write the project reviewers', ['exception' => $e->getMessage()]); + return false; + }//end try + }//end apply() + + /** + * Planninq's own live project schema, carrying the lifecycle block; null when absent. + * + * Another app may have a `project` schema too, so the slug alone is not + * enough: the schema must belong to the planninq register. + * + * @param object $schemaMapper OpenRegister's SchemaMapper. + * + * @return object|null + */ + private function liveSchema(object $schemaMapper): ?object { + $register = $this->container->get('OCA\\OpenRegister\\Db\\RegisterMapper')->find(ProjectMembershipService::REGISTER); + $ids = array_map('intval', (array)($register->getSchemas() ?? [])); + foreach ((array)$schemaMapper->findBySlug(ProjectMembershipService::PROJECT_SCHEMA) as $schema) { + $lifecycle = (($schema->getConfiguration() ?? [])['x-openregister-lifecycle'] ?? null); + if (in_array((int)$schema->getId(), $ids, true) === true && is_array($lifecycle) === true) { + return $schema; + } + } + + return null; + }//end liveSchema() + + /** + * The configuration with approve and reject open to admins and the groups. + * + * @param array $configuration The live configuration. + * @param array $groups The reviewer groups. + * + * @return array + */ + private function withReviewTransitions(array $configuration, array $groups): array { + foreach (self::REVIEW_TRANSITIONS as $action) { + if (isset($configuration['x-openregister-lifecycle']['transitions'][$action]) === true) { + $configuration['x-openregister-lifecycle']['transitions'][$action]['authorization'] = array_values(array_unique(array_merge(['admin'], $groups))); + } + } + + return $configuration; + }//end withReviewTransitions() + + /** + * The authorization with this app's reviewer rules replaced by one read and update rule per group. + * + * @param array $authorization The live authorization. + * @param array $groups The reviewer groups. + * + * @return array + */ + private function withReviewRules(array $authorization, array $groups): array { + foreach (self::REVIEW_OPERATIONS as $operation) { + $rules = array_values( + array_filter( + (array)($authorization[$operation] ?? []), + static fn ($rule): bool => is_array($rule) === false || ($rule['match'] ?? null) !== self::REQUESTED + ) + ); + foreach ($groups as $group) { + $rules[] = ['group' => $group, 'match' => self::REQUESTED]; + } + + $authorization[$operation] = $rules; + } + + return $authorization; + }//end withReviewRules() +}//end class diff --git a/lib/Service/ProjectRoles.php b/lib/Service/ProjectRoles.php new file mode 100644 index 00000000..fddcfb39 --- /dev/null +++ b/lib/Service/ProjectRoles.php @@ -0,0 +1,237 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.4 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +/** + * Who may write a project's work, by user and by group. + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.4 + */ +class ProjectRoles { + + /** + * The user lists whose people write the project's work. + * + * @var array + */ + public const WRITER_USERS = ['managers', 'members']; + + /** + * The group lists whose members write the project's work. + * + * @var array + */ + public const WRITER_GROUPS = ['ownerGroups', 'managerGroups', 'memberGroups']; + + /** + * Whether a person may change the project's tasks, columns, phases and links. + * + * @param array $project The project's data. + * @param string $uid The user id. + * @param array $groupIds The user's group ids. + * + * @return bool + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.4 + */ + public function mayWrite(array $project, string $uid, array $groupIds): bool { + if ($uid === '') { + return false; + } + + if (($project['owner'] ?? null) === $uid) { + return true; + } + + foreach (self::WRITER_USERS as $field) { + if (in_array($uid, $this->listOf(project: $project, field: $field), true) === true) { + return true; + } + } + + foreach (self::WRITER_GROUPS as $field) { + if (array_intersect($this->listOf(project: $project, field: $field), $groupIds) !== []) { + return true; + } + } + + return false; + }//end mayWrite() + + /** + * The user lists a person can be on. + * + * @var array + */ + public const USER_LISTS = ['managers', 'members', 'viewers']; + + /** + * Whether a person is on the project at all: its owner or on a user list. + * + * @param array $project The project's data. + * @param string $uid The user id. + * + * @return bool + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.2 + */ + public function holdsUser(array $project, string $uid): bool { + if ($uid === '') { + return false; + } + + if (($project['owner'] ?? null) === $uid) { + return true; + } + + foreach (self::USER_LISTS as $field) { + if (in_array($uid, $this->listOf(project: $project, field: $field), true) === true) { + return true; + } + } + + return false; + }//end holdsUser() + + /** + * The project without one person: off every user list, and when they owned + * it, ownership passes to the first remaining manager in alphabetical + * order, else to the first remaining member. With nobody left in person + * but an owning group, `owner` becomes empty and the group carries on. + * Only the lists that held the person, and `owner` when it moves, are + * returned changed. + * + * @param array $project The project's data. + * @param string $uid The user id. + * + * @return array + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.2 + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.1 + */ + public function withoutUser(array $project, string $uid): array { + foreach (self::USER_LISTS as $field) { + $list = $this->listOf(project: $project, field: $field); + if (in_array($uid, $list, true) === true) { + $project[$field] = array_values(array_filter($list, static fn (string $entry): bool => $entry !== $uid)); + } + } + + if (($project['owner'] ?? null) !== $uid) { + return $project; + } + + foreach (['managers', 'members'] as $field) { + $candidates = $this->listOf(project: $project, field: $field); + if ($candidates !== []) { + sort($candidates); + $project['owner'] = $candidates[0]; + return $project; + } + } + + // Nobody to hand over to, but a group owns the project: the person keeps + // no owner rights, the owning group carries on (task 5.1). + if ($this->listOf(project: $project, field: 'ownerGroups') !== []) { + $project['owner'] = ''; + } + + return $project; + }//end withoutUser() + + /** + * Whether the project is still looked after: a group owns it, or anyone + * who writes the project's work is left in person. + * + * @param array $project The project's data. + * + * @return bool + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.2 + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.1 + */ + public function hasWriters(array $project): bool { + // An owning group keeps the project managed without any one person (task 5.1). + if ($this->listOf(project: $project, field: 'ownerGroups') !== []) { + return true; + } + + foreach (self::WRITER_USERS as $field) { + if ($this->listOf(project: $project, field: $field) !== []) { + return true; + } + } + + return false; + }//end hasWriters() + + /** + * The group lists a group can be on. + * + * @var array + */ + public const GROUP_LISTS = ['ownerGroups', 'managerGroups', 'memberGroups', 'viewerGroups']; + + /** + * The project without one group: off every group list it was on. + * + * @param array $project The project's data. + * @param string $gid The group id. + * + * @return array + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-5.3 + */ + public function withoutGroup(array $project, string $gid): array { + foreach (self::GROUP_LISTS as $field) { + $list = $this->listOf(project: $project, field: $field); + if (in_array($gid, $list, true) === true) { + $project[$field] = array_values(array_filter($list, static fn (string $entry): bool => $entry !== $gid)); + } + } + + return $project; + }//end withoutGroup() + + /** + * One list of a project as strings, or an empty list. + * + * @param array $project The project's data. + * @param string $field The property. + * + * @return array + */ + private function listOf(array $project, string $field): array { + $value = ($project[$field] ?? []); + if (is_array($value) === false) { + return []; + } + + return array_values(array_filter($value, 'is_string')); + }//end listOf() +}//end class diff --git a/lib/Service/ProjectRulesService.php b/lib/Service/ProjectRulesService.php new file mode 100644 index 00000000..2484a6c8 --- /dev/null +++ b/lib/Service/ProjectRulesService.php @@ -0,0 +1,293 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-2.1 + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-3.2 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +/** + * Parent chain checks for projects. + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-2.1 + */ + +/** + * Parent chain and custom field checks for project writes. + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-2.1 + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-3.2 + */ +class ProjectRulesService { + + + /** + * The deepest a chain may be: programme, project, subproject. + * + * @var int + */ + public const MAX_DEPTH = 3; + + /** + * The answer when the new parent is the project or one of its descendants. + * + * @var string + */ + public const CYCLE = 'cycle'; + + /** + * The answer when the chain would grow deeper than MAX_DEPTH. + * + * @var string + */ + public const TOO_DEEP = 'tooDeep'; + + /** + * The schema slug of a field definition. + * + * @var string + */ + public const FIELD_SCHEMA = 'projectField'; + + /** + * A guard against a chain that already loops in stored data. + * + * @var int + */ + private const WALK_LIMIT = 50; + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Reads projects and field definitions as the system. + */ + public function __construct( + private ProjectMembershipService $membership, + ) { + }//end __construct() + + /** + * Why a project may not sit under a parent, or null when it may. + * + * @param string $projectId The project, '' for one being created. + * @param string $parentId The new parent. + * + * @return string|null CYCLE, TOO_DEEP or null. + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-2.1 + */ + public function refusal(string $projectId, string $parentId): ?string { + if ($parentId === '') { + return null; + } + + $ancestors = $this->ancestors(parentId: $parentId); + if ($projectId !== '' && ($parentId === $projectId || in_array($projectId, $ancestors, true) === true)) { + return self::CYCLE; + } + + // The parent's chain plus the project with the levels below it. + $depth = count($ancestors) + $this->height(projectId: $projectId); + if ($depth > self::MAX_DEPTH) { + return self::TOO_DEEP; + } + + return null; + }//end refusal() + + /** + * The parent and its ancestors, nearest first. + * + * @param string $parentId The parent project. + * + * @return array + */ + private function ancestors(string $parentId): array { + $chain = []; + $current = $parentId; + $steps = 0; + while ($current !== '' && in_array($current, $chain, true) === false && $steps < self::WALK_LIMIT) { + $steps++; + $chain[] = $current; + $project = $this->membership->objectData(schema: ProjectMembershipService::PROJECT_SCHEMA, id: $current); + $current = $this->referenceId(value: ($project['parent'] ?? null)); + } + + return $chain; + }//end ancestors() + + /** + * How many levels sit below a project, the project itself counted as one. + * + * @param string $projectId The project, '' for one being created. + * @param int $guard The walk depth so far. + * + * @return int + */ + private function height(string $projectId, int $guard=0): int { + if ($projectId === '' || $guard > self::MAX_DEPTH) { + return 1; + } + + $below = 0; + foreach ($this->membership->rows(schema: ProjectMembershipService::PROJECT_SCHEMA, filters: ['parent' => $projectId]) as $child) { + $below = max($below, $this->height(projectId: $child['id'], guard: ($guard + 1))); + } + + return (1 + $below); + }//end height() + + /** + * A reference value as a UUID string. + * + * @param mixed $value A UUID string or a resolved object. + * + * @return string + */ + private function referenceId(mixed $value): string { + if (is_array($value) === true) { + $value = ($value['id'] ?? ($value['@self']['id'] ?? '')); + } + + if (is_string($value) === false) { + return ''; + } + + return trim($value); + }//end referenceId() + + /** + * The first problem with a set of values, or null when they fit their fields. + * + * A value whose field an admin removed may stay as it is stored, so a + * removed field that comes back finds its values again (design, risks). + * + * @param array $values The project's customFields. + * @param array $stored The stored customFields, [] on a create. + * + * @return string|null A message naming the field. + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-3.2 + */ + public function problem(array $values, array $stored=[]): ?string { + $fields = $this->definitions(); + $unknown = $this->unknownKey(values: $values, stored: $stored, fields: $fields); + if ($unknown !== null) { + return sprintf('There is no project field "%s".', $unknown); + } + + foreach ($fields as $key => $field) { + $problem = $this->valueProblem(field: $field, value: ($values[$key] ?? null), label: (string)($field['label'] ?? $key)); + if ($problem !== null) { + return $problem; + } + } + + return null; + }//end problem() + + /** + * The first key no field defines, unless it is stored unchanged. + * + * @param array $values The new values. + * @param array $stored The stored values. + * @param array> $fields The definitions by key. + * + * @return string|null + */ + private function unknownKey(array $values, array $stored, array $fields): ?string { + foreach ($values as $key => $value) { + $kept = (array_key_exists($key, $stored) === true && $stored[$key] === $value); + if (isset($fields[(string)$key]) === false && $kept === false) { + return (string)$key; + } + } + + return null; + }//end unknownKey() + + /** + * What is wrong with one field's value, or null. + * + * @param array $field The field definition. + * @param mixed $value The value. + * @param string $label The field's label. + * + * @return string|null + */ + private function valueProblem(array $field, mixed $value, string $label): ?string { + if ($value === null || $value === '') { + if (($field['required'] ?? false) === true) { + return sprintf('%s is required.', $label); + } + + return null; + } + + if ($this->fits(field: $field, value: $value) === false) { + return sprintf('%s does not take this value.', $label); + } + + return null; + }//end valueProblem() + + /** + * Whether a non-empty value fits its field's type. + * + * @param array $field The field definition. + * @param mixed $value The value. + * + * @return bool + */ + private function fits(array $field, mixed $value): bool { + return match ((string)($field['type'] ?? 'text')) { + 'number' => (is_int($value) === true || is_float($value) === true), + 'date' => (is_string($value) === true && preg_match('/^\d{4}-\d{2}-\d{2}$/', $value) === 1), + 'choice' => (is_string($value) === true && in_array($value, (array)($field['options'] ?? []), true) === true), + 'boolean' => is_bool($value), + default => is_string($value), + }; + }//end fits() + + /** + * The project field definitions keyed by their key. + * + * @return array> + */ + private function definitions(): array { + $fields = []; + foreach ($this->membership->rows(schema: self::FIELD_SCHEMA, filters: []) as $row) { + $data = $row['data']; + $key = (string)($data['key'] ?? ''); + if ($key !== '' && (($data['appliesTo'] ?? 'project') === 'project')) { + $fields[$key] = $data; + } + } + + return $fields; + }//end definitions() +}//end class diff --git a/lib/Service/RegisterImportService.php b/lib/Service/RegisterImportService.php index 9be1c1f3..3ee61f7f 100644 --- a/lib/Service/RegisterImportService.php +++ b/lib/Service/RegisterImportService.php @@ -176,6 +176,8 @@ private function import(bool $force): array { force: $force ); + $this->forgetCachedRegister(); + if (empty($result) === false) { $this->logger->info('Planninq: register configuration imported successfully'); return [ @@ -201,4 +203,35 @@ private function import(bool $force): array { }//end try }//end import() + + /** + * Drop OpenRegister's request-scoped copies of the planninq register. + * + * RegisterMapper::find() caches a register per slug and RBAC/tenancy flags + * for the rest of the request, and the import updates the register through + * another copy. A step that reads the register later in the same request + * (the members back-fill during `occ upgrade`) then got the pre-import + * schema list and refused every new schema (live pass P1, 2 Oct). + * Never throws: the import already succeeded. + * + * @return void + * + * @spec openspec/changes/projects-members-and-roles/tasks.md#task-2.3 + */ + private function forgetCachedRegister(): void { + try { + $mapper = $this->container->get('OCA\OpenRegister\Db\RegisterMapper'); + if (is_object($mapper) === false || method_exists($mapper, 'clearFindCache') === false) { + return; + } + + $register = $mapper->find(id: ProjectMembershipService::REGISTER, _rbac: false, _multitenancy: false); + $mapper->clearFindCache(registerId: (int)$register->getId()); + } catch (\Throwable $e) { + $this->logger->warning( + 'Planninq: could not refresh the cached register after the import', + ['exception' => $e->getMessage()] + ); + } + }//end forgetCachedRegister() }//end class diff --git a/lib/Service/RiskScaleService.php b/lib/Service/RiskScaleService.php new file mode 100644 index 00000000..b558674e --- /dev/null +++ b/lib/Service/RiskScaleService.php @@ -0,0 +1,258 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCP\App\IAppManager; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use Throwable; + +/** + * Validates the risk scale and finds the risks a smaller scale would strand. + * + * @spec openspec/changes/projects-overview-logs-risks/tasks.md#task-3.4 + */ +class RiskScaleService { + + /** + * App config key of the scale. + * + * @var string + */ + public const CONFIG_KEY = 'risk_scale'; + + /** + * The scale an install starts with: five levels. + * + * @var string + */ + public const DEFAULT_SCALE = '{"levels":5,' + . '"likelihood":["Very low","Low","Medium","High","Very high"],' + . '"impact":["Very low","Low","Medium","High","Very high"],' + . '"thresholds":{"medium":5,"high":12}}'; + + /** + * Fewest levels a scale may have. + * + * @var integer + */ + public const MIN_LEVELS = 3; + + /** + * Most levels a scale may have; the risk schema caps likelihood and impact at it. + * + * @var integer + */ + public const MAX_LEVELS = 5; + + /** + * Constructor. + * + * @param ContainerInterface $container Resolves OpenRegister's ObjectService at runtime. + * @param IAppManager $appManager Tells whether OpenRegister is installed. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ContainerInterface $container, + private IAppManager $appManager, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Parse and check a submitted scale. + * + * @param string $raw The JSON the admin page sends. + * + * @return array{levels: int, likelihood: array, impact: array, thresholds: array{medium: int, high: int}}|null + * The scale, or null when it is not valid. + * + * @spec openspec/changes/projects-overview-logs-risks/tasks.md#task-3.4 + */ + public function normalise(string $raw): ?array { + $decoded = json_decode($raw, true); + if (is_array($decoded) === false) { + return null; + } + + $levels = ($decoded['levels'] ?? null); + if (is_int($levels) === false || $levels < self::MIN_LEVELS || $levels > self::MAX_LEVELS) { + return null; + } + + $likelihood = $this->labels(value: ($decoded['likelihood'] ?? null), levels: $levels); + $impact = $this->labels(value: ($decoded['impact'] ?? null), levels: $levels); + $thresholds = $this->thresholds(value: ($decoded['thresholds'] ?? null), levels: $levels); + if ($likelihood === null || $impact === null || $thresholds === null) { + return null; + } + + return [ + 'levels' => $levels, + 'likelihood' => $likelihood, + 'impact' => $impact, + 'thresholds' => $thresholds, + ]; + }//end normalise() + + /** + * The two thresholds, when medium starts above 1 and high above medium and within the top score. + * + * @param mixed $value The submitted thresholds. + * @param int $levels The number of levels. + * + * @return array{medium: int, high: int}|null + */ + private function thresholds(mixed $value, int $levels): ?array { + $medium = ($value['medium'] ?? null); + $high = ($value['high'] ?? null); + if (is_int($medium) === false || is_int($high) === false) { + return null; + } + + if ($medium < 2 || $high <= $medium || $high > ($levels * $levels)) { + return null; + } + + return ['medium' => $medium, 'high' => $high]; + }//end thresholds() + + /** + * The risks a scale of this many levels would strand, and the highest level they use. + * + * @param int $levels The number of levels the admin wants. + * + * @return array{count: int, level: int}|null Null when no risk is in the way. + * + * @spec openspec/changes/projects-overview-logs-risks/tasks.md#task-3.4 + */ + public function conflict(int $levels): ?array { + if ($levels >= self::MAX_LEVELS || $this->appManager->isInstalled('openregister') === false) { + return null; + } + + $above = range($levels + 1, self::MAX_LEVELS); + $stranded = []; + foreach (['likelihood', 'impact'] as $axis) { + foreach ($this->search(filters: [$axis => $above]) as $id => $data) { + $stranded[$id] = max((int)($data['likelihood'] ?? 0), (int)($data['impact'] ?? 0)); + } + } + + if ($stranded === []) { + return null; + } + + return ['count' => count($stranded), 'level' => max($stranded)]; + }//end conflict() + + /** + * The refusal an admin reads. + * + * @param int $count How many risks are in the way. + * @param int $level The highest level they use. + * + * @return string + * + * @spec openspec/changes/projects-overview-logs-risks/tasks.md#task-3.4 + */ + public function refusal(int $count, int $level): string { + if ($count === 1) { + return sprintf('1 risk uses level %d. Change it first.', $level); + } + + return sprintf('%d risks use level %d. Change them first.', $count, $level); + }//end refusal() + + /** + * A trimmed list of exactly `$levels` non-empty labels. + * + * @param mixed $value The submitted labels. + * @param int $levels The number of levels. + * + * @return array|null + */ + private function labels(mixed $value, int $levels): ?array { + if (is_array($value) === false || count($value) !== $levels) { + return null; + } + + $labels = []; + foreach (array_values($value) as $label) { + if (is_string($label) === false || trim($label) === '') { + return null; + } + + $labels[] = trim($label); + } + + return $labels; + }//end labels() + + /** + * Risks matching the filters, read as the system: the check must see every + * risk, not only the ones the saving admin is a member of. + * + * @param array $filters Property filters. + * + * @return array> Data keyed by uuid. + */ + private function search(array $filters): array { + try { + $objectService = $this->container->get('OCA\\OpenRegister\\Service\\ObjectService'); + $results = $objectService->searchObjectsBySlug( + registerSlug: ProjectMembershipService::REGISTER, + schemaSlug: 'risk', + filters: $filters, + _rbac: false, + _multitenancy: false + ); + } catch (Throwable $e) { + $this->logger->warning('Planninq: could not read risks for the risk scale check', ['exception' => $e->getMessage()]); + return []; + } + + if (is_array($results) === true && array_key_exists('results', $results) === true) { + $results = (array)$results['results']; + } + + $rows = []; + foreach ((array)$results as $row) { + if (is_object($row) === true && is_callable([$row, 'getUuid']) === true) { + $rows[(string)$row->getUuid()] = (array)$row->getObject(); + continue; + } + + if (is_array($row) === true) { + $rows[(string)($row['@self']['id'] ?? ($row['id'] ?? ''))] = $row; + } + } + + return $rows; + }//end search() +}//end class diff --git a/lib/Service/SettingsService.php b/lib/Service/SettingsService.php index 7d89e5fe..4aea0466 100644 --- a/lib/Service/SettingsService.php +++ b/lib/Service/SettingsService.php @@ -31,7 +31,6 @@ use OCP\App\IAppManager; use OCP\IAppConfig; use OCP\IConfig; -use OCP\IGroupManager; use OCP\IUserSession; use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; @@ -58,11 +57,66 @@ class SettingsService { * @var array */ private const ADMIN_CONFIG_DEFAULTS = [ - 'default_columns' => '["To Do","In Progress","Review","Done"]', + 'default_columns' => '["To do","In progress","Review","Done"]', 'allow_project_creation' => 'all', 'due_reminder_lead_hours' => '24', + RiskScaleService::CONFIG_KEY => RiskScaleService::DEFAULT_SCALE, + self::REPORT_PERIOD_KEY => '30', + self::FINANCE_CATEGORIES_KEY => '["Personnel","Hired staff","Materials","Other"]', + self::CREATION_GROUPS_KEY => '[]', + self::REQUESTS_KEY => 'off', ]; + /** + * Whether people who may not create a project may request one: `on` or `off`. + * + * @var string + */ + public const REQUESTS_KEY = 'project_requests'; + + /** + * The groups whose members may create projects under the `groups` policy, a JSON list of group ids. + * + * @var string + */ + public const CREATION_GROUPS_KEY = 'project_creation_groups'; + + /** + * The values of `allow_project_creation`. + * + * @var array + */ + public const CREATION_POLICIES = ['all', 'admins', 'groups']; + + /** + * The user value holding a user's own order of pinned projects on the + * dashboard, a JSON list of project ids (portfolio-my-work-dashboard). + * + * @var string + */ + public const DASHBOARD_ORDER_KEY = 'dashboard_project_order'; + + /** + * The most projects a user can pin on the dashboard. + * + * @var integer + */ + public const DASHBOARD_ORDER_MAX = 50; + + /** + * Days after which a project's latest status report counts as out of date. + * + * @var string + */ + public const REPORT_PERIOD_KEY = 'status_report_period_days'; + + /** + * The cost categories every project's money is split into (portfolio-finance). + * + * @var string + */ + public const FINANCE_CATEGORIES_KEY = 'finance_categories'; + /** * Slug of the OpenRegister schema carrying the due-soon reminder rule. * @@ -99,10 +153,11 @@ class SettingsService { * @param IConfig $config The user config interface * @param IAppManager $appManager The app manager * @param ContainerInterface $container The container - * @param IGroupManager $groupManager The group manager * @param IUserSession $userSession The user session * @param LoggerInterface $logger The logger * @param DueReminderWindowService $dueReminderWindow The live-schema due-reminder window patcher + * @param ProjectPolicySchemaService $policySchema Writes the reviewers of project requests into the live schema. + * @param CreationPolicyService $creationPolicy Who may create and who may request a project. * * @return void */ @@ -111,10 +166,11 @@ public function __construct( private IConfig $config, private IAppManager $appManager, private ContainerInterface $container, - private IGroupManager $groupManager, private IUserSession $userSession, private LoggerInterface $logger, private DueReminderWindowService $dueReminderWindow, + private ProjectPolicySchemaService $policySchema, + private CreationPolicyService $creationPolicy, ) { }//end __construct() @@ -137,8 +193,7 @@ public function isOpenRegisterAvailable(): bool { * @spec openspec/changes/retrofit-2026-05-24-annotate-planix/tasks.md#task-4 */ public function isCurrentUserAdmin(): bool { - $user = $this->userSession->getUser(); - return ($user !== null && $this->groupManager->isAdmin($user->getUID())); + return $this->creationPolicy->isAdmin(); }//end isCurrentUserAdmin() /** @@ -156,19 +211,42 @@ public function isCurrentUserAdmin(): bool { * @spec openspec/changes/retrofit-2026-05-24-annotate-planix/tasks.md#task-4 */ public function canCurrentUserCreateProject(): bool { - $policy = $this->appConfig->getValueString( - Application::APP_ID, - 'allow_project_creation', - 'all' - ); + return $this->creationPolicy->canCreate(); + }//end canCurrentUserCreateProject() + + /** + * Whether the current user may request a project: requests are on and the user may not create one. + * + * @return bool + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-3.1 + */ + public function canCurrentUserRequestProject(): bool { + return $this->creationPolicy->canRequest(); + }//end canCurrentUserRequestProject() - if ($policy === 'admins') { - return $this->isCurrentUserAdmin(); + /** + * A submitted setting as it is stored: name lists and creation policy checked; null to refuse it. + * + * @param string $key The setting key. + * @param string $value The submitted value. + * + * @return string|null + * + * @spec openspec/changes/projects-lifecycle-policy/tasks.md#task-2.1 + */ + private function normalisedValue(string $key, string $value): ?string { + $listed = $this->validatedNameList(key: $key, raw: $value); + if ($listed === false) { + return null; } - // Default ('all'): any authenticated user may create. - return $this->userSession->getUser() !== null; - }//end canCurrentUserCreateProject() + if ($listed !== null) { + $value = $listed; + } + + return $this->creationPolicy->normalise(key: $key, value: $value); + }//end normalisedValue() /** * Retrieve all admin settings with defaults applied. @@ -223,6 +301,55 @@ public function validateDefaultColumns(string $raw): ?string { return json_encode($normalised); }//end validateDefaultColumns() + /** + * Validate a list of finance category names: a non-empty JSON array of + * non-empty strings, none repeated (case and spaces ignored). + * + * @param string $raw Raw value submitted by the client + * + * @return string|null Normalised JSON string, or null when the list is refused + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-1.2 + */ + public function validateCategoryNames(string $raw): ?string { + $normalised = $this->validateDefaultColumns(raw: $raw); + if ($normalised === null) { + return null; + } + + $names = (array)json_decode($normalised, true); + $seen = array_unique(array_map(static fn (string $name): string => mb_strtolower($name), $names)); + if (count($seen) !== count($names)) { + return null; + } + + return $normalised; + }//end validateCategoryNames() + + /** + * The normalised value of a setting that holds a list of names, false when + * the list is refused, null when the key holds no list of names. + * + * @param string $key The setting key. + * @param string $raw The submitted value. + * + * @return string|false|null + * + * @spec openspec/changes/portfolio-finance/tasks.md#task-1.2 + */ + private function validatedNameList(string $key, string $raw): string|false|null { + $validated = match ($key) { + 'default_columns' => $this->validateDefaultColumns(raw: $raw), + self::FINANCE_CATEGORIES_KEY => $this->validateCategoryNames(raw: $raw), + default => '', + }; + if ($validated === '') { + return null; + } + + return ($validated ?? false); + }//end validatedNameList() + /** * Store admin settings. Unknown keys are silently ignored. * Validates default_columns JSON shape before persisting; rejects malformed values. @@ -244,17 +371,22 @@ private function setAdminSettings(array $settings): void { $value = (string)$settings[$key]; - if ($key === 'default_columns') { - $validated = $this->validateDefaultColumns(raw: $value); - if ($validated === null) { - $this->logger->warning( - 'Planninq: invalid default_columns value rejected', - ['raw' => $value] - ); + $normalised = $this->normalisedValue(key: $key, value: $value); + if ($normalised === null) { + $this->logger->warning('Planninq: invalid ' . $key . ' value rejected', ['raw' => $value]); + continue; + } + + $value = $normalised; + + if ($key === self::REPORT_PERIOD_KEY) { + $days = $this->validateWholeNumber(raw: $value, min: 1, max: 365); + if ($days === null) { + $this->logger->warning('Planninq: invalid status_report_period_days value rejected', ['raw' => $value]); continue; } - $value = $validated; + $value = (string)$days; } if ($key === 'due_reminder_lead_hours') { @@ -292,18 +424,33 @@ private function setAdminSettings(array $settings): void { * @spec openspec/changes/due-date-reminder-dispatch/tasks.md#3 */ public function validateLeadHours(string $raw): ?int { + return $this->validateWholeNumber(raw: $raw, min: self::LEAD_HOURS_MIN, max: self::LEAD_HOURS_MAX); + }//end validateLeadHours() + + /** + * A whole number from a settings form within [min, max], or null. + * + * @param string $raw The submitted value. + * @param int $min Lowest accepted value. + * @param int $max Highest accepted value. + * + * @return int|null + * + * @spec openspec/changes/portfolio-status-overview/tasks.md#task-2.2 + */ + private function validateWholeNumber(string $raw, int $min, int $max): ?int { $trimmed = trim($raw); if ($trimmed === '' || preg_match('/^\d+$/', $trimmed) !== 1) { return null; } - $hours = (int)$trimmed; - if ($hours < self::LEAD_HOURS_MIN || $hours > self::LEAD_HOURS_MAX) { + $number = (int)$trimmed; + if ($number < $min || $number > $max) { return null; } - return $hours; - }//end validateLeadHours() + return $number; + }//end validateWholeNumber() /** * Resolve the effective due-reminder lead time in hours. @@ -347,6 +494,8 @@ public function getSettings(): array { $userSettings = []; if ($user !== null) { $userSettings['notify_due_reminder'] = $this->isNotifyDueReminderEnabled(userId: $user->getUID()); + $userSettings[self::DASHBOARD_ORDER_KEY] = $this->getDashboardProjectOrder(userId: $user->getUID()); + $userSettings[BoardViewPreferenceService::KEY] = $this->boardViews()->views(userId: $user->getUID()); } return array_merge( @@ -356,7 +505,10 @@ public function getSettings(): array { [ 'openregisters' => $this->isOpenRegisterAvailable(), 'isAdmin' => $this->isCurrentUserAdmin(), - ] + 'canCreateProject' => $this->canCurrentUserCreateProject(), + 'canRequestProject' => $this->canCurrentUserRequestProject(), + ], + $this->creationPolicy->missingGroups() ); }//end getSettings() @@ -372,6 +524,7 @@ public function getSettings(): array { * @return array The updated settings. * * @spec openspec/changes/due-date-reminder-dispatch/tasks.md#1 + * @spec openspec/changes/boards-card-display/tasks.md#task-3.1 */ public function updateUserSettings(string $userId, array $data): array { if (array_key_exists('notify_due_reminder', $data) === true) { @@ -379,9 +532,94 @@ public function updateUserSettings(string $userId, array $data): array { $this->setNotifyDueReminder(userId: $userId, enabled: ($enabled !== false)); } + if (array_key_exists(self::DASHBOARD_ORDER_KEY, $data) === true) { + $order = $data[self::DASHBOARD_ORDER_KEY]; + if (is_string($order) === true) { + $order = json_decode($order, true); + } + + if (is_array($order) === true) { + $this->setDashboardProjectOrder(userId: $userId, order: $order); + } + } + + $view = ($data['board_view'] ?? null); + if (is_array($view) === true && is_string($view['project'] ?? null) === true) { + $this->boardViews()->save(userId: $userId, projectId: $view['project'], view: $view); + } + return $this->getSettings(); }//end updateUserSettings() + /** + * The per-person board view store, on this service's IConfig. + * + * @return BoardViewPreferenceService + * + * @spec openspec/changes/boards-card-display/tasks.md#task-3.1 + */ + private function boardViews(): BoardViewPreferenceService { + return new BoardViewPreferenceService(config: $this->config); + }//end boardViews() + + /** + * A user's own order of pinned dashboard projects. + * + * @param string $userId The user UID. + * + * @return array Project ids, pinned first to last. + * + * @spec openspec/changes/portfolio-my-work-dashboard/tasks.md#task-3.1 + */ + public function getDashboardProjectOrder(string $userId): array { + $raw = $this->config->getUserValue($userId, Application::APP_ID, self::DASHBOARD_ORDER_KEY, '[]'); + $decoded = json_decode((string) $raw, true); + if (is_array($decoded) === false) { + return []; + } + + return $this->cleanProjectOrder(order: $decoded); + }//end getDashboardProjectOrder() + + /** + * Store a user's own order of pinned dashboard projects. + * + * @param string $userId The user UID. + * @param array $order Project ids, pinned first to last. + * + * @return void + * + * @spec openspec/changes/portfolio-my-work-dashboard/tasks.md#task-3.1 + */ + public function setDashboardProjectOrder(string $userId, array $order): void { + $this->config->setUserValue( + $userId, + Application::APP_ID, + self::DASHBOARD_ORDER_KEY, + (string) json_encode($this->cleanProjectOrder(order: $order)) + ); + }//end setDashboardProjectOrder() + + /** + * Non-empty string ids, first occurrence kept, at most DASHBOARD_ORDER_MAX. + * + * @param array $order The ids as given. + * + * @return array + * + * @spec openspec/changes/portfolio-my-work-dashboard/tasks.md#task-3.1 + */ + private function cleanProjectOrder(array $order): array { + $clean = []; + foreach ($order as $id) { + if (is_string($id) === true && $id !== '' && in_array($id, $clean, true) === false) { + $clean[] = $id; + } + } + + return array_slice($clean, 0, self::DASHBOARD_ORDER_MAX); + }//end cleanProjectOrder() + /** * Update settings with the provided data. * @@ -400,6 +638,11 @@ public function updateSettings(array $data): array { $this->setAdminSettings(settings: $data); + // The reviewers of project requests follow the creation policy. + if (array_key_exists('allow_project_creation', $data) === true || array_key_exists(self::CREATION_GROUPS_KEY, $data) === true) { + $this->policySchema->apply(groups: $this->creationPolicy->reviewerGroups()); + } + return $this->getSettings(); }//end updateSettings() diff --git a/lib/Service/TaskCalendarExportService.php b/lib/Service/TaskCalendarExportService.php new file mode 100644 index 00000000..bb5f81b1 --- /dev/null +++ b/lib/Service/TaskCalendarExportService.php @@ -0,0 +1,445 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\BackgroundJob\TaskCalendarBackfillJob; +use OCP\BackgroundJob\IJobList; +use OCP\IConfig; +use OCP\IL10N; +use OCP\IURLGenerator; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Writes and removes the VTODOs of the "Planninq" task list. + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.2 + */ +class TaskCalendarExportService { + + /** + * The per-user switch, a Nextcloud user value, off unless set to 'true'. + */ + public const SWITCH_KEY = 'export_tasks_to_caldav'; + + /** + * The task list's URI in the user's calendar home. + */ + public const LIST_URI = 'planninq'; + + /** + * The DAV app's CalDAV backend, by name so it is never a hard dependency. + */ + private const DAV_BACKEND = 'OCA\\DAV\\CalDAV\\CalDavBackend'; + + /** + * The backend calls the export needs. + */ + private const DAV_METHODS = [ + 'getCalendarByUri', + 'createCalendar', + 'deleteCalendar', + 'getCalendarObject', + 'createCalendarObject', + 'updateCalendarObject', + 'deleteCalendarObject', + ]; + + /** + * Constructor. + * + * @param IConfig $config User values and the instance id. + * @param ContainerInterface $container Lazy DAV backend resolution. + * @param IURLGenerator $urls The task's address for the VTODO URL. + * @param IJobList $jobs Queues the backfill on switch-on. + * @param IL10N $l10n The managed note. + * @param TaskVtodoBuilder $builder Task to VTODO. + * @param TaskCalendarTaskStore $store Task and project reads, and the UID write-back. + * @param LoggerInterface $logger Diagnostics. + */ + public function __construct( + private IConfig $config, + private ContainerInterface $container, + private IURLGenerator $urls, + private IJobList $jobs, + private IL10N $l10n, + private TaskVtodoBuilder $builder, + private TaskCalendarTaskStore $store, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * The switch and whether this server can export at all. + * + * @param string $userId The user. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.1 + */ + public function values(string $userId): array { + return [ + self::SWITCH_KEY => $this->isOn(userId: $userId), + 'caldavAvailable' => $this->davBackend() !== null, + ]; + }//end values() + + /** + * Apply the switch from a settings write: on queues the backfill, off removes the list. + * + * @param string $userId The user. + * @param array $data The posted settings. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.4 + */ + public function apply(string $userId, array $data): void { + if (array_key_exists(self::SWITCH_KEY, $data) === false) { + return; + } + + $wanted = filter_var($data[self::SWITCH_KEY], FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) === true; + $was = $this->isOn(userId: $userId); + $stored = 'false'; + if ($wanted === true) { + $stored = 'true'; + } + + $this->config->setUserValue($userId, Application::APP_ID, self::SWITCH_KEY, $stored); + if ($wanted === true && $was === false) { + $this->jobs->add(TaskCalendarBackfillJob::class, ['userId' => $userId]); + return; + } + + if ($wanted === false && $was === true) { + $this->removeList(userId: $userId); + } + }//end apply() + + /** + * Whether a user switched the export on. + * + * @param string $userId The user. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.1 + */ + public function isOn(string $userId): bool { + return $this->config->getUserValue($userId, Application::APP_ID, self::SWITCH_KEY, 'false') === 'true'; + }//end isOn() + + /** + * The people a task's VTODO belongs to: its assignee and everyone it is shared with. + * + * @param array $task The task data. + * + * @return array Distinct user ids. + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + public function recipients(array $task): array { + $people = array_merge([($task['assignedTo'] ?? '')], (array)($task['sharedWith'] ?? [])); + $found = []; + foreach ($people as $person) { + if (is_scalar($person) === true && (string)$person !== '') { + $found[(string)$person] = true; + } + } + + return array_keys($found); + }//end recipients() + + /** + * Write a task's VTODO into the list of every given user who switched the export on. + * + * The first export stores the UID on the task as a system write. + * + * @param string $taskId The task uuid. + * @param array $task The task data. + * @param array $users The people to write for. + * + * @return int How many lists were written. + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + public function exportTask(string $taskId, array $task, array $users): int { + $users = array_values(array_filter($users, fn (string $user): bool => $this->isOn(userId: $user))); + $backend = $this->davBackend(); + if ($users === [] || $backend === null || $taskId === '') { + return 0; + } + + $stored = $task['calendarEventUid'] ?? null; + $uid = $this->uidOf(taskId: $taskId, stored: $stored); + $project = $this->store->text(value: ($task['project'] ?? '')); + $ics = $this->builder->build( + task: $task, + uid: $uid, + projectTitle: $this->store->projectTitle(projectId: $project), + url: $this->taskUrl(projectId: $project, taskId: $taskId), + managedNote: $this->l10n->t('Managed by Planninq. Changes made here are replaced by the next change in Planninq.'), + stamp: gmdate('Ymd\THis\Z') + ); + + $written = 0; + foreach ($users as $user) { + $written += $this->writeFor(backend: $backend, userId: $user, taskId: $taskId, ics: $ics); + } + + if ($written > 0 && $uid !== $stored) { + $this->store->storeUid(taskId: $taskId, task: $task, uid: $uid); + } + + return $written; + }//end exportTask() + + /** + * Remove a task's VTODO from the list of every given user who has one. + * + * @param string $taskId The task uuid. + * @param array $users The people to remove it for. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + public function removeTask(string $taskId, array $users): void { + $backend = $this->davBackend(); + if ($backend === null || $taskId === '') { + return; + } + + foreach ($users as $user) { + $listId = $this->listId(backend: $backend, userId: $user, create: false); + if ($listId !== null && $backend->getCalendarObject($listId, $this->objectUri(taskId: $taskId)) !== null) { + $backend->deleteCalendarObject($listId, $this->objectUri(taskId: $taskId)); + } + } + }//end removeTask() + + /** + * Delete a user's "Planninq" list, when there is one. + * + * @param string $userId The user. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.4 + */ + public function removeList(string $userId): void { + $backend = $this->davBackend(); + if ($backend === null) { + return; + } + + $listId = $this->listId(backend: $backend, userId: $userId, create: false); + if ($listId !== null) { + $backend->deleteCalendar($listId, true); + } + }//end removeList() + + /** + * Export every task assigned to or shared with a user once (the switch-on backfill). + * + * OpenRegister filters a property by equality, so a list property such as + * `sharedWith` cannot be searched for a member: the job reads the tasks as + * the system and picks the user's own, as the My tasks page does. + * + * @param string $userId The user. + * + * @return int How many tasks were written. + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.4 + */ + public function backfill(string $userId): int { + if ($userId === '' || $this->isOn(userId: $userId) === false || $this->davBackend() === null) { + return 0; + } + + $written = 0; + foreach ($this->store->tasksOf(userId: $userId) as $taskId => $task) { + if (in_array($userId, $this->recipients(task: $task), true) === false) { + continue; + } + + $written += $this->exportTask(taskId: $taskId, task: $task, users: [$userId]); + } + + return $written; + }//end backfill() + + /** + * The UID a task's VTODO carries: planninq-task-@. + * + * @param string $taskId The task uuid. + * + * @return string + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + public function uidFor(string $taskId): string { + return 'planninq-task-' . $taskId . '@' . $this->config->getSystemValueString('instanceid', 'planninq'); + }//end uidFor() + + /** + * Resolve the DAV app's CalDAV backend, or null when absent or drifted. + * + * Public and overridable so tests substitute a double: the class exists + * only inside a Nextcloud server. + * + * @return object|null + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.2 + */ + public function davBackend(): ?object { + if (class_exists(self::DAV_BACKEND) === false) { + return null; + } + + try { + $backend = $this->container->get(self::DAV_BACKEND); + } catch (\Throwable $e) { + $this->logger->debug('Planninq: the CalDAV backend could not be resolved', ['exception' => $e->getMessage()]); + return null; + } + + foreach (self::DAV_METHODS as $method) { + if (is_object($backend) === false || method_exists($backend, $method) === false) { + $this->logger->warning('Planninq: the CalDAV backend lacks {method}; task export is off', ['method' => $method]); + return null; + } + } + + return $backend; + }//end davBackend() + + /** + * The UID to use: the stored one, or a new one for a first export. + * + * @param string $taskId The task uuid. + * @param mixed $stored The task's calendarEventUid. + * + * @return string + */ + private function uidOf(string $taskId, mixed $stored): string { + if (is_string($stored) === true && $stored !== '') { + return $stored; + } + + return $this->uidFor(taskId: $taskId); + }//end uidOf() + + /** + * Create or replace the VTODO in one user's list. + * + * @param object $backend The CalDAV backend. + * @param string $userId The user. + * @param string $taskId The task uuid. + * @param string $ics The VCALENDAR text. + * + * @return int 1 when written, 0 when the list could not be made. + */ + private function writeFor(object $backend, string $userId, string $taskId, string $ics): int { + $listId = $this->listId(backend: $backend, userId: $userId, create: true); + if ($listId === null) { + return 0; + } + + $uri = $this->objectUri(taskId: $taskId); + if ($backend->getCalendarObject($listId, $uri) === null) { + $backend->createCalendarObject($listId, $uri, $ics); + return 1; + } + + $backend->updateCalendarObject($listId, $uri, $ics); + + return 1; + }//end writeFor() + + /** + * The id of a user's "Planninq" list, created on demand as a VTODO-only list. + * + * @param object $backend The CalDAV backend. + * @param string $userId The user. + * @param bool $create Whether to create it when missing. + * + * @return int|string|null + */ + private function listId(object $backend, string $userId, bool $create): int|string|null { + $principal = 'principals/users/' . $userId; + $list = $backend->getCalendarByUri($principal, self::LIST_URI); + if (is_array($list) === true && isset($list['id']) === true) { + return $list['id']; + } + + if ($create === false) { + return null; + } + + $properties = ['components' => 'VTODO', '{DAV:}displayname' => 'Planninq']; + + return $backend->createCalendar($principal, self::LIST_URI, $properties); + }//end listId() + + /** + * The object's name in the list. + * + * @param string $taskId The task uuid. + * + * @return string + */ + private function objectUri(string $taskId): string { + return 'planninq-task-' . $taskId . '.ics'; + }//end objectUri() + + /** + * The task's page, absolute. + * + * @param string $projectId The project uuid. + * @param string $taskId The task uuid. + * + * @return string + */ + private function taskUrl(string $projectId, string $taskId): string { + if ($projectId === '') { + return ''; + } + + return $this->urls->getAbsoluteURL('/index.php/apps/planninq/projects/' . rawurlencode($projectId) . '/tasks/' . rawurlencode($taskId)); + }//end taskUrl() + +}//end class diff --git a/lib/Service/TaskCalendarTaskStore.php b/lib/Service/TaskCalendarTaskStore.php new file mode 100644 index 00000000..f835dd21 --- /dev/null +++ b/lib/Service/TaskCalendarTaskStore.php @@ -0,0 +1,216 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Task and project reads and the UID write-back for the export. + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ +class TaskCalendarTaskStore { + + /** + * OpenRegister's system scope for the calendarEventUid write-back. + */ + private const OR_SYSTEM_CONTEXT = 'OCA\\OpenRegister\\Service\\SystemOperationContext'; + + /** + * OpenRegister's object service. + */ + private const OBJECT_SERVICE = 'OCA\\OpenRegister\\Service\\ObjectService'; + + /** + * The planninq register slug. + */ + private const REGISTER = 'planninq'; + + /** + * Constructor. + * + * @param ContainerInterface $container Lazy OpenRegister resolution. + * @param LoggerInterface $logger Diagnostics. + */ + public function __construct( + private ContainerInterface $container, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * A project's title, read as the system; '' when it does not resolve. + * + * @param string $projectId The project uuid. + * + * @return string + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + public function projectTitle(string $projectId): string { + if ($projectId === '') { + return ''; + } + + try { + $entity = $this->container->get(self::OBJECT_SERVICE)->find( + id: $projectId, + register: self::REGISTER, + schema: 'project', + _rbac: false, + _multitenancy: false + ); + } catch (\Throwable $e) { + return ''; + } + + $data = $this->rowData(row: $entity); + + return $this->text(value: ($data['title'] ?? '')); + }//end projectTitle() + + /** + * Every planninq task, keyed by uuid, read as the system (the backfill picks the user's own). + * + * OpenRegister filters a property by equality, so a list property such as + * `sharedWith` cannot be searched for a member. + * + * @param string $userId The user. + * + * @return array> + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + public function tasksOf(string $userId): array { + try { + $results = $this->container->get(self::OBJECT_SERVICE)->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: 'task', + filters: [], + _rbac: false, + _multitenancy: false + ); + } catch (\Throwable $e) { + $this->logger->warning('Planninq: the task export backfill could not read tasks', ['user' => $userId, 'exception' => $e->getMessage()]); + return []; + } + + if (is_array($results) === true && array_key_exists('results', $results) === true) { + $results = $results['results']; + } + + $tasks = []; + foreach ((array)$results as $row) { + $data = $this->rowData(row: $row); + $id = $this->text(value: ($data['id'] ?? ($data['@self']['id'] ?? ''))); + if (is_object($row) === true && is_callable([$row, 'getUuid']) === true) { + $id = (string)$row->getUuid(); + } + + if ($id !== '') { + $tasks[$id] = $data; + } + } + + return $tasks; + }//end tasksOf() + + /** + * Store the VTODO UID on the task as a silent system write, so it raises no event. + * + * @param string $taskId The task uuid. + * @param array $task The task data. + * @param string $uid The UID. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + public function storeUid(string $taskId, array $task, string $uid): void { + $class = self::OR_SYSTEM_CONTEXT; + if (class_exists($class) === false) { + return; + } + + unset($task['@self'], $task['id']); + $task['calendarEventUid'] = $uid; + try { + $objectService = $this->container->get(self::OBJECT_SERVICE); + $class::run( + static fn () => $objectService->saveObject( + object: $task, + register: self::REGISTER, + schema: 'task', + uuid: $taskId, + _rbac: false, + _multitenancy: false, + silent: true + ) + ); + } catch (\Throwable $e) { + $this->logger->warning('Planninq: could not store the calendar UID on a task', ['task' => $taskId, 'exception' => $e->getMessage()]); + } + }//end storeUid() + + /** + * The data of a search row or entity. + * + * @param mixed $row The row. + * + * @return array + */ + private function rowData(mixed $row): array { + if (is_object($row) === true && is_callable([$row, 'getObject']) === true) { + return (array)$row->getObject(); + } + + if (is_object($row) === true && method_exists($row, 'jsonSerialize') === true) { + return (array)$row->jsonSerialize(); + } + + return (array)$row; + }//end rowData() + + /** + * A scalar as a string; anything else as ''. + * + * @param mixed $value The value. + * + * @return string + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.3 + */ + public function text(mixed $value): string { + if (is_scalar($value) === true) { + return (string)$value; + } + + return ''; + }//end text() +}//end class diff --git a/lib/Service/TaskVtodoBuilder.php b/lib/Service/TaskVtodoBuilder.php new file mode 100644 index 00000000..ada2defe --- /dev/null +++ b/lib/Service/TaskVtodoBuilder.php @@ -0,0 +1,245 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use DateTimeImmutable; +use DateTimeZone; + +/** + * Builds the VTODO text for a task. + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.2 + */ +class TaskVtodoBuilder { + + /** + * Planninq status to VTODO STATUS. + */ + private const STATUS = [ + 'open' => 'NEEDS-ACTION', + 'blocked' => 'NEEDS-ACTION', + 'in_progress' => 'IN-PROCESS', + 'done' => 'COMPLETED', + 'cancelled' => 'CANCELLED', + ]; + + /** + * Planninq priority to VTODO PRIORITY (1 highest, 9 lowest). + */ + private const PRIORITY = [ + 'urgent' => 1, + 'high' => 3, + 'normal' => 5, + 'low' => 9, + ]; + + /** + * The VCALENDAR text holding the task's VTODO. + * + * @param array $task The task data. + * @param string $uid The VTODO UID. + * @param string $projectTitle The project's title, or ''. + * @param string $url The task's address, or ''. + * @param string $managedNote The line that says planninq overwrites edits. + * @param string $stamp DTSTAMP as a UTC date-time (Ymd\THis\Z). + * + * @return string The iCalendar text, CRLF line ends, folded at 75 octets. + * + * @spec openspec/changes/archive/2026-09-30-planning-calendar/tasks.md#task-2.2 + */ + public function build(array $task, string $uid, string $projectTitle, string $url, string $managedNote, string $stamp): string { + $lines = [ + 'BEGIN:VCALENDAR', + 'VERSION:2.0', + 'PRODID:-//Conduction//Planninq//EN', + 'BEGIN:VTODO', + 'UID:' . $this->escape(value: $uid), + 'DTSTAMP:' . $stamp, + 'SUMMARY:' . $this->escape(value: $this->text(value: ($task['title'] ?? ''))), + 'DESCRIPTION:' . $this->escape(value: $this->description(task: $task, managedNote: $managedNote)), + 'STATUS:' . (self::STATUS[$this->text(value: ($task['status'] ?? ''))] ?? 'NEEDS-ACTION'), + ]; + + $priority = $this->text(value: ($task['priority'] ?? '')); + if (isset(self::PRIORITY[$priority]) === true) { + $lines[] = 'PRIORITY:' . self::PRIORITY[$priority]; + } + + $lines = array_merge($lines, $this->dates(task: $task)); + + if ($projectTitle !== '') { + $lines[] = 'CATEGORIES:' . $this->escape(value: $projectTitle); + } + + if ($url !== '') { + $lines[] = 'URL:' . $url; + } + + $lines[] = 'END:VTODO'; + $lines[] = 'END:VCALENDAR'; + + return implode("\r\n", array_map(fn (string $line): string => $this->fold(line: $line), $lines)) . "\r\n"; + }//end build() + + /** + * DUE, DTSTART, PERCENT-COMPLETE and COMPLETED, each only when the task has it. + * + * @param array $task The task data. + * + * @return array The property lines. + */ + private function dates(array $task): array { + $lines = []; + $due = $this->day(value: ($task['dueDate'] ?? null)); + if ($due !== '') { + $lines[] = 'DUE;VALUE=DATE:' . $due; + } + + $start = $this->day(value: ($task['startDate'] ?? null)); + if ($start !== '') { + $lines[] = 'DTSTART;VALUE=DATE:' . $start; + } + + if (is_numeric($task['percentComplete'] ?? null) === true) { + $lines[] = 'PERCENT-COMPLETE:' . max(0, min(100, (int)$task['percentComplete'])); + } + + $completed = $this->utc(value: ($task['completedAt'] ?? null)); + if ($completed !== '') { + $lines[] = 'COMPLETED:' . $completed; + } + + return $lines; + }//end dates() + + /** + * The description followed by the managed note. + * + * @param array $task The task data. + * @param string $managedNote The note. + * + * @return string The text. + */ + private function description(array $task, string $managedNote): string { + $text = trim($this->text(value: ($task['description'] ?? ''))); + if ($text === '') { + return $managedNote; + } + + return $text . "\n\n" . $managedNote; + }//end description() + + /** + * The leading date of an ISO date or date-time as it is written, as Ymd. + * + * @param mixed $value The value. + * + * @return string The date, or '' when there is none. + */ + private function day(mixed $value): string { + if (preg_match('/^(\d{4})-(\d{2})-(\d{2})/', $this->text(value: $value), $match) !== 1) { + return ''; + } + + return $match[1] . $match[2] . $match[3]; + }//end day() + + /** + * A date-time in UTC as Ymd\THis\Z. + * + * @param mixed $value The value. + * + * @return string The UTC date-time, or '' when it does not parse. + */ + private function utc(mixed $value): string { + $text = $this->text(value: $value); + if ($text === '') { + return ''; + } + + try { + $moment = new DateTimeImmutable($text); + } catch (\Exception $e) { + return ''; + } + + return $moment->setTimezone(new DateTimeZone('UTC'))->format('Ymd\THis\Z'); + }//end utc() + + /** + * A scalar as a string; anything else as ''. + * + * @param mixed $value The value. + * + * @return string The text. + */ + private function text(mixed $value): string { + if (is_scalar($value) === true) { + return (string)$value; + } + + return ''; + }//end text() + + /** + * Escape a TEXT value (RFC 5545 section 3.3.11). + * + * @param string $value The value. + * + * @return string The escaped value. + */ + private function escape(string $value): string { + $value = str_replace(["\r\n", "\r"], "\n", $value); + + return str_replace(['\\', ';', ',', "\n"], ['\\\\', '\;', '\\,', '\\n'], $value); + }//end escape() + + /** + * Fold a content line at 75 octets without splitting a character. + * + * @param string $line The line. + * + * @return string The folded line. + */ + private function fold(string $line): string { + $parts = []; + $limit = 75; + while (strlen($line) > $limit) { + $cut = $limit; + while ($cut > 0 && (ord($line[$cut]) & 0xC0) === 0x80) { + $cut--; + } + + $parts[] = substr($line, 0, $cut); + $line = ' ' . substr($line, $cut); + $limit = 75; + } + + $parts[] = $line; + + return implode("\r\n", $parts); + }//end fold() +}//end class diff --git a/lib/Service/TimetableCsvParser.php b/lib/Service/TimetableCsvParser.php new file mode 100644 index 00000000..6cf3e5fe --- /dev/null +++ b/lib/Service/TimetableCsvParser.php @@ -0,0 +1,265 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +/** + * Parses the rooms and activities sheets into the rows the input builder reads. + * + * A result is {rows, errors}; an error is {line, field, code, message}. Codes: + * `header`, `empty`, `whole-number`, `unknown-room-type`. The header check + * ignores case and surrounding spaces; a comma or a semicolon separates columns. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ +class TimetableCsvParser { + + /** + * The rooms sheet columns, in order. + * + * @var array + */ + public const ROOM_COLUMNS = ['reference', 'capacity', 'type']; + + /** + * The activities sheet columns, in order. + * + * @var array + */ + public const ACTIVITY_COLUMNS = ['group', 'subject', 'teacher', 'lessons per week', 'lesson length', 'room type']; + + /** + * The row key each activities column is stored under. + * + * @var array + */ + private const ACTIVITY_KEYS = [ + 'group' => 'group', + 'subject' => 'subject', + 'teacher' => 'teacher', + 'lessons per week' => 'lessonsPerWeek', + 'lesson length' => 'lessonLength', + 'room type' => 'roomType', + ]; + + /** + * Parse the rooms sheet. + * + * @param string $csv The sheet as text. + * + * @return array{rows:array,errors:array} + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + public function parseRooms(string $csv): array { + $rows = []; + $errors = []; + foreach ($this->records(csv: $csv, columns: self::ROOM_COLUMNS, errors: $errors) as $line => $cells) { + $capacity = $this->wholeNumber(value: $cells['capacity'], line: $line, field: 'capacity', errors: $errors); + if ($this->filled(cells: $cells, line: $line, errors: $errors) === false || $capacity === null) { + continue; + } + + $rows[] = ['reference' => $cells['reference'], 'capacity' => $capacity, 'type' => $cells['type']]; + } + + return ['rows' => $rows, 'errors' => $errors]; + }//end parseRooms() + + /** + * Parse the activities sheet; every room type must be one of the rooms' types. + * + * @param string $csv The sheet as text. + * @param array $roomTypes The room types the rooms sheet holds. + * + * @return array{rows:array>,errors:array} + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + public function parseActivities(string $csv, array $roomTypes): array { + $rows = []; + $errors = []; + foreach ($this->records(csv: $csv, columns: self::ACTIVITY_COLUMNS, errors: $errors) as $line => $cells) { + $lessons = $this->wholeNumber(value: $cells['lessons per week'], line: $line, field: 'lessons per week', errors: $errors); + $length = $this->wholeNumber(value: $cells['lesson length'], line: $line, field: 'lesson length', errors: $errors); + $filled = $this->filled(cells: $cells, line: $line, errors: $errors); + $known = $this->knownRoomType(type: $cells['room type'], roomTypes: $roomTypes, line: $line, errors: $errors); + if ($filled === false || $known === false || $lessons === null || $length === null) { + continue; + } + + $row = []; + foreach (self::ACTIVITY_KEYS as $column => $key) { + $row[$key] = $cells[$column]; + } + + $row['lessonsPerWeek'] = $lessons; + $row['lessonLength'] = $length; + $rows[] = $row; + } + + return ['rows' => $rows, 'errors' => $errors]; + }//end parseActivities() + + /** + * The data lines by line number, cells keyed by column; a wrong header adds one error and yields nothing. + * + * @param string $csv The sheet. + * @param array $columns The expected columns. + * @param array $errors Errors, appended to. + * + * @return array> + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + private function records(string $csv, array $columns, array &$errors): array { + $lines = preg_split('/\r\n|\r|\n/', trim($csv)); + if ($lines === false) { + $lines = []; + } + + $head = array_map(static fn (string $cell): string => mb_strtolower(trim($cell)), $this->cells(line: (string)($lines[0] ?? ''))); + if ($head !== $columns) { + $errors[] = $this->error(line: 1, field: '', code: 'header', message: 'The first line must be: '.implode(', ', $columns).'.'); + return []; + } + + $records = []; + foreach (array_slice($lines, 1, null, true) as $index => $line) { + if (trim($line) === '') { + continue; + } + + $cells = array_pad(array_map('trim', $this->cells(line: $line)), count($columns), ''); + $records[$index + 1] = array_combine($columns, array_slice($cells, 0, count($columns))); + } + + return $records; + }//end records() + + /** + * The cells of one line, split on the separator the line uses. + * + * @param string $line One line. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + private function cells(string $line): array { + $separator = ','; + if (substr_count($line, ';') > substr_count($line, ',')) { + $separator = ';'; + } + + return array_map('strval', str_getcsv($line, $separator, '"', '')); + }//end cells() + + /** + * Whether no cell is empty; each empty cell adds an error. + * + * @param array $cells The line's cells. + * @param int $line The line number. + * @param array $errors Errors, appended to. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + private function filled(array $cells, int $line, array &$errors): bool { + $filled = true; + foreach ($cells as $field => $value) { + if ($value === '') { + $errors[] = $this->error(line: $line, field: $field, code: 'empty', message: "Line {$line}: {$field} is empty."); + $filled = false; + } + } + + return $filled; + }//end filled() + + /** + * A whole number of 1 or more, or null with an error; an empty cell is left to filled(). + * + * @param string $value The cell. + * @param int $line The line number. + * @param string $field The column. + * @param array $errors Errors, appended to. + * + * @return int|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + private function wholeNumber(string $value, int $line, string $field, array &$errors): ?int { + if (preg_match('/^\d+$/', $value) === 1 && (int)$value >= 1) { + return (int)$value; + } + + if ($value !== '') { + $errors[] = $this->error(line: $line, field: $field, code: 'whole-number', message: "Line {$line}: {$field} must be a whole number of 1 or more."); + } + + return null; + }//end wholeNumber() + + /** + * Whether a room type is one of the rooms' types; an unknown one adds an error. + * + * @param string $type The cell. + * @param array $roomTypes The known types. + * @param int $line The line number. + * @param array $errors Errors, appended to. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + private function knownRoomType(string $type, array $roomTypes, int $line, array &$errors): bool { + if ($type === '' || in_array($type, $roomTypes, true) === true) { + return true; + } + + $message = "Line {$line}: room type {$type} is not on the rooms sheet."; + $errors[] = $this->error(line: $line, field: 'room type', code: 'unknown-room-type', message: $message); + return false; + }//end knownRoomType() + + /** + * One refusal. + * + * @param int $line The line number. + * @param string $field The column, empty for the header. + * @param string $code The refusal code. + * @param string $message A readable refusal. + * + * @return array{line:int,field:string,code:string,message:string} + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + private function error(int $line, string $field, string $code, string $message): array { + return ['line' => $line, 'field' => $field, 'code' => $code, 'message' => $message]; + }//end error() +}//end class diff --git a/lib/Service/TimetableGenerationService.php b/lib/Service/TimetableGenerationService.php new file mode 100644 index 00000000..40624231 --- /dev/null +++ b/lib/Service/TimetableGenerationService.php @@ -0,0 +1,242 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use InvalidArgumentException; +use OCA\Planninq\Timetabling\SolverInput; +use OCA\Planninq\Timetabling\TimetableSolver; +use Throwable; + +/** + * Queue and step a generated timetable scenario. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ +class TimetableGenerationService { + + /** + * The longest one step runs, in seconds. + */ + public const STEP_SECONDS = 60; + + /** + * Statuses a run may be queued from. + */ + private const QUEUEABLE = ['queued', 'done', 'failed']; + + /** + * Constructor. + * + * @param TimetableScenarioStore $store Reads and writes scenarios and wishes. + * @param TimetableInputBuilder $inputBuilder Builds the input from learniq or the uploaded sheets. + * @param TimetableGridService $grid Holds the time budget. + * @param TimetableSolver $solver Places the lessons. + * + * @return void + */ + public function __construct( + private readonly TimetableScenarioStore $store, + private readonly TimetableInputBuilder $inputBuilder, + private readonly TimetableGridService $grid, + private readonly TimetableSolver $solver, + ) { + }//end __construct() + + /** + * Make a scenario ready for a run: snapshot the input, pick a seed, clear the last run, status queued. + * + * @param string $id The scenario id. + * + * @return array The stored scenario. + * + * @throws InvalidArgumentException When the scenario does not exist, is imported or published, or has no activities. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ + public function queue(string $id): array { + $scenario = $this->store->load(id: $id); + if ($scenario === null) { + throw new InvalidArgumentException('There is no timetable scenario with this id.'); + } + + if (($scenario['source'] ?? '') !== 'generated' || in_array(($scenario['status'] ?? 'queued'), self::QUEUEABLE, true) === false) { + throw new InvalidArgumentException('Only a generated scenario that is not running or published can be generated.'); + } + + $input = $this->inputBuilder->build( + academicYear: $this->academicYear(date: (string)($scenario['windowFrom'] ?? '')), + wishes: $this->store->wishes() + ); + if ($input->isEmpty() === true) { + throw new InvalidArgumentException((string)$input->reason); + } + + $scenario = array_merge( + $scenario, + [ + 'status' => 'queued', + 'seed' => ($scenario['seed'] ?? random_int(1, 2147483646)), + 'input' => $input->toArray(), + 'placements' => [], + 'unplaced' => [], + 'brokenWishes' => [], + 'metrics' => ['secondsSpent' => 0, 'steps' => 0, 'budgetSeconds' => $this->budgetSeconds()], + 'reason' => '', + ] + ); + $this->store->save(id: $id, data: $scenario); + + return $scenario; + }//end queue() + + /** + * Run one step and store the result; whether the job should run another step. + * + * @param string $id The scenario id. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ + public function step(string $id): bool { + $scenario = $this->store->load(id: $id); + if ($scenario === null || in_array(($scenario['status'] ?? ''), ['queued', 'running'], true) === false) { + return false; + } + + try { + return $this->runStep(id: $id, scenario: $scenario); + } catch (Throwable $e) { + $this->store->save(id: $id, data: array_merge($scenario, ['status' => 'failed', 'reason' => $e->getMessage()])); + return false; + } + }//end step() + + /** + * One step: solve from the best placements so far for at most a minute of the budget left. + * + * @param string $id The scenario id. + * @param array $scenario The stored scenario. + * + * @return bool Whether another step should run. + */ + private function runStep(string $id, array $scenario): bool { + $metrics = (array)($scenario['metrics'] ?? []); + $budget = (int)($metrics['budgetSeconds'] ?? $this->budgetSeconds()); + $spent = (int)($metrics['secondsSpent'] ?? 0); + $input = $this->inputOf(scenario: $scenario); + $seconds = min(self::STEP_SECONDS, max(1, ($budget - $spent))); + $began = microtime(true); + $result = $this->solver->solve( + input: $input, + seconds: $seconds, + seed: ((int)($scenario['seed'] ?? 1) + (int)($metrics['steps'] ?? 0)), + start: (array)($scenario['placements'] ?? []) + ); + + $spent += max(1, (int)ceil(microtime(true) - $began)); + $previous = ($metrics['cost'] ?? null); + $improved = ($previous === null || $result->cost < (int)$previous); + $more = ($improved === true && $spent < $budget && $result->cost > 0); + + $status = 'done'; + if ($more === true) { + $status = 'running'; + } + + $this->store->save( + id: $id, + data: array_merge( + $scenario, + $result->toScenario(), + [ + 'status' => $status, + 'metrics' => array_merge( + $result->metrics, + ['cost' => $result->cost, 'secondsSpent' => $spent, 'steps' => ((int)($metrics['steps'] ?? 0) + 1), 'budgetSeconds' => $budget] + ), + ] + ) + ); + + return $more; + }//end runStep() + + /** + * The solver input a scenario keeps. + * + * @param array $scenario The scenario. + * + * @return SolverInput + * + * @throws InvalidArgumentException When the scenario has no lessons. + */ + private function inputOf(array $scenario): SolverInput { + $input = (array)($scenario['input'] ?? []); + if (($input['lessons'] ?? []) === []) { + throw new InvalidArgumentException('The scenario has no lessons to place.'); + } + + return new SolverInput( + periods: (array)($input['periods'] ?? []), + rooms: (array)($input['rooms'] ?? []), + lessons: (array)$input['lessons'], + wishes: (array)($input['wishes'] ?? []), + source: (string)($input['source'] ?? 'none') + ); + }//end inputOf() + + /** + * The time budget of a run in seconds. + * + * @return int + */ + private function budgetSeconds(): int { + return ((int)($this->grid->settings()[TimetableGridService::BUDGET_KEY] ?? TimetableGridService::DEFAULT_BUDGET) * 60); + }//end budgetSeconds() + + /** + * The academic year a date falls in: from August on it is this year and the next. + * + * @param string $date A date, as in `2026-10-05`. + * + * @return string As in `2026-2027`. + */ + private function academicYear(string $date): string { + $time = strtotime($date); + if ($time === false) { + $time = time(); + } + + $start = (int)date('Y', $time); + if ((int)date('n', $time) < 8) { + $start--; + } + + return $start.'-'.($start + 1); + }//end academicYear() +}//end class diff --git a/lib/Service/TimetableGridService.php b/lib/Service/TimetableGridService.php new file mode 100644 index 00000000..e3878a8c --- /dev/null +++ b/lib/Service/TimetableGridService.php @@ -0,0 +1,309 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCA\Planninq\AppInfo\Application; +use OCP\IAppConfig; + +/** + * Reads, validates and stores the week grid and the generator time budget. + * The settings page reads and writes them through SettingsController, next to + * the other admin settings. + * + * A grid is JSON: {"days": ["mon", ...], "periods": [{"start": "08:30", "end": "09:20"}, ...]}. + * A period key is the day and the period number from 1, as in `mon-3`. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-1.2 + */ +class TimetableGridService { + + /** + * Admin setting holding the week grid. + * + * @var string + */ + public const GRID_KEY = 'timetable_period_grid'; + + /** + * Admin setting holding the generator time budget in minutes. + * + * @var string + */ + public const BUDGET_KEY = 'timetable_generator_budget_minutes'; + + /** + * The default budget: ten minutes. + * + * @var string + */ + public const DEFAULT_BUDGET = '10'; + + /** + * The longest budget an admin may set, in minutes. + * + * @var integer + */ + public const BUDGET_MAX = 120; + + /** + * The days a grid may use, in week order. + * + * @var array + */ + public const WEEK_DAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']; + + /** + * Monday to Friday, eight periods of 50 minutes from 08:30. + * + * @var string + */ + public const DEFAULT_GRID = '{"days":["mon","tue","wed","thu","fri"],"periods":[' + .'{"start":"08:30","end":"09:20"},{"start":"09:20","end":"10:10"},' + .'{"start":"10:10","end":"11:00"},{"start":"11:00","end":"11:50"},' + .'{"start":"11:50","end":"12:40"},{"start":"12:40","end":"13:30"},' + .'{"start":"13:30","end":"14:20"},{"start":"14:20","end":"15:10"}]}'; + + /** + * Constructor. + * + * @param IAppConfig $appConfig Holds the two settings. + * + * @return void + */ + public function __construct( + private readonly IAppConfig $appConfig, + ) { + }//end __construct() + + /** + * Both settings, the defaults where nothing is stored. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-1.2 + */ + public function settings(): array { + return [ + self::GRID_KEY => $this->appConfig->getValueString(Application::APP_ID, self::GRID_KEY, self::DEFAULT_GRID), + self::BUDGET_KEY => $this->appConfig->getValueString(Application::APP_ID, self::BUDGET_KEY, self::DEFAULT_BUDGET), + ]; + }//end settings() + + /** + * Store the grid and budget found in submitted settings; a refused value is not stored. + * + * @param array $data The submitted settings. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-1.2 + */ + public function save(array $data): void { + $normalised = [ + self::GRID_KEY => $this->normaliseGrid(raw: (string)($data[self::GRID_KEY] ?? '')), + self::BUDGET_KEY => $this->normaliseBudget(raw: (string)($data[self::BUDGET_KEY] ?? '')), + ]; + foreach ($normalised as $key => $value) { + if (array_key_exists($key, $data) === true && $value !== null) { + $this->appConfig->setValueString(Application::APP_ID, $key, $value); + } + } + }//end save() + + /** + * The period keys of the stored grid, day by day, as in `mon-1`. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ + public function periodKeys(): array { + $grid = (array)json_decode(($this->normaliseGrid(raw: $this->settings()[self::GRID_KEY]) ?? self::DEFAULT_GRID), true); + $keys = []; + foreach ((array)$grid['days'] as $day) { + $count = count((array)$grid['periods']); + for ($number = 1; $number <= $count; $number++) { + $keys[] = $day.'-'.$number; + } + } + + return $keys; + }//end periodKeys() + + /** + * Every period of the stored grid with its key, day, number, start and end, day by day. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-6.1 + */ + public function periodTimes(): array { + $grid = (array)json_decode(($this->normaliseGrid(raw: $this->settings()[self::GRID_KEY]) ?? self::DEFAULT_GRID), true); + $times = []; + foreach ((array)$grid['days'] as $day) { + foreach (array_values((array)$grid['periods']) as $index => $period) { + $times[] = [ + 'key' => $day.'-'.($index + 1), + 'day' => (string)$day, + 'number' => ($index + 1), + 'start' => (string)$period['start'], + 'end' => (string)$period['end'], + ]; + } + } + + return $times; + }//end periodTimes() + + /** + * A submitted grid as it is stored, or null to refuse it. + * + * Refused: not JSON, no days, a day that is not a week day or is listed + * twice, no periods, a time that is not HH:MM, a period that ends before + * it starts, and a period that starts before the previous one ends. + * + * @param string $raw The submitted value. + * + * @return string|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-1.2 + */ + public function normaliseGrid(string $raw): ?string { + $grid = json_decode($raw, true); + if (is_array($grid) === false) { + return null; + } + + $days = $this->days(value: ($grid['days'] ?? null)); + $periods = $this->periods(value: ($grid['periods'] ?? null)); + if ($days === null || $periods === null) { + return null; + } + + return (string)json_encode(['days' => $days, 'periods' => $periods]); + }//end normaliseGrid() + + /** + * A submitted budget in whole minutes from 1 to BUDGET_MAX, or null to refuse it. + * + * @param string $raw The submitted value. + * + * @return string|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-1.2 + */ + public function normaliseBudget(string $raw): ?string { + $trimmed = trim($raw); + if (preg_match('/^\d+$/', $trimmed) !== 1) { + return null; + } + + $minutes = (int)$trimmed; + if ($minutes < 1 || $minutes > self::BUDGET_MAX) { + return null; + } + + return (string)$minutes; + }//end normaliseBudget() + + /** + * The listed days in week order, or null when the list is refused. + * + * @param mixed $value The submitted days. + * + * @return array|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-1.2 + */ + private function days(mixed $value): ?array { + if (is_array($value) === false || $value === []) { + return null; + } + + foreach ($value as $day) { + if (in_array($day, self::WEEK_DAYS, true) === false) { + return null; + } + } + + if (count(array_unique($value)) !== count($value)) { + return null; + } + + return array_values(array_intersect(self::WEEK_DAYS, $value)); + }//end days() + + /** + * The periods with trimmed times, or null when one is malformed or overlaps the one before. + * + * @param mixed $value The submitted periods. + * + * @return array|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-1.2 + */ + private function periods(mixed $value): ?array { + if (is_array($value) === false || $value === []) { + return null; + } + + $periods = []; + $previous = '00:00'; + foreach (array_values($value) as $period) { + if (is_array($period) === false) { + return null; + } + + $start = $this->time(value: ($period['start'] ?? null)); + $end = $this->time(value: ($period['end'] ?? null)); + if ($start === null || $end === null || $end <= $start || $start < $previous) { + return null; + } + + $periods[] = ['start' => $start, 'end' => $end]; + $previous = $end; + } + + return $periods; + }//end periods() + + /** + * A time of day as HH:MM, or null. + * + * @param mixed $value The submitted time. + * + * @return string|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-1.2 + */ + private function time(mixed $value): ?string { + if (is_string($value) === false || preg_match('/^([01]\d|2[0-3]):[0-5]\d$/', trim($value)) !== 1) { + return null; + } + + return trim($value); + }//end time() +}//end class diff --git a/lib/Service/TimetableInputBuilder.php b/lib/Service/TimetableInputBuilder.php new file mode 100644 index 00000000..adfa99a8 --- /dev/null +++ b/lib/Service/TimetableInputBuilder.php @@ -0,0 +1,204 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCA\Planninq\AppInfo\Application; +use OCA\Planninq\Event\TimetableActivitiesQueryEvent; +use OCA\Planninq\Timetabling\SolverInput; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\IAppConfig; + +/** + * Builds the SolverInput of a generator run. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ +class TimetableInputBuilder { + + /** + * App config key holding the uploaded rooms sheet, parsed. + * + * @var string + */ + public const CSV_ROOMS_KEY = 'timetable_csv_rooms'; + + /** + * App config key holding the uploaded activities sheet, parsed. + * + * @var string + */ + public const CSV_ACTIVITIES_KEY = 'timetable_csv_activities'; + + /** + * Why an input is empty when nothing supplied activities. + * + * @var string + */ + public const NO_ACTIVITIES = 'No activities: learniq did not answer and no CSV was uploaded'; + + /** + * The wish fields the solver reads. + * + * @var array + */ + private const WISH_FIELDS = ['appliesTo', 'reference', 'kind', 'periods', 'limit', 'strength', 'weight']; + + /** + * Constructor. + * + * @param IEventDispatcher $dispatcher Dispatches the activities query. + * @param IAppConfig $appConfig Holds the uploaded sheets. + * @param TimetableGridService $grid The week grid. + * + * @return void + */ + public function __construct( + private readonly IEventDispatcher $dispatcher, + private readonly IAppConfig $appConfig, + private readonly TimetableGridService $grid, + ) { + }//end __construct() + + /** + * The input of a run for one academic year and the given wishes. + * + * @param string $academicYear The academic year, such as `2026-2027`. + * @param array> $wishes timetableWish objects. + * + * @return SolverInput + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ + public function build(string $academicYear, array $wishes): SolverInput { + $periods = $this->grid->periodKeys(); + $wishes = array_map(fn (array $wish): array => $this->solverWish(wish: $wish), array_values($wishes)); + + $event = new TimetableActivitiesQueryEvent(academicYear: $academicYear); + $this->dispatcher->dispatchTyped($event); + + $activities = ($event->getActivities() ?? []); + $rooms = $event->getRooms(); + $source = (string)$event->getAnsweredBy(); + if ($activities === []) { + $activities = $this->stored(key: self::CSV_ACTIVITIES_KEY); + $rooms = $this->stored(key: self::CSV_ROOMS_KEY); + $source = 'csv'; + } + + if ($activities === []) { + return new SolverInput(periods: $periods, rooms: [], lessons: [], wishes: $wishes, source: 'none', reason: self::NO_ACTIVITIES); + } + + $lessons = $this->lessons(activities: $activities); + return new SolverInput(periods: $periods, rooms: array_values($rooms), lessons: $lessons, wishes: $wishes, source: $source); + }//end build() + + /** + * Keep an uploaded rooms and activities sheet as the input for runs no app answers. + * + * @param array> $rooms Parsed room rows. + * @param array> $activities Parsed activity rows. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + public function storeUpload(array $rooms, array $activities): void { + $this->appConfig->setValueString(Application::APP_ID, self::CSV_ROOMS_KEY, (string)json_encode(array_values($rooms)), lazy: true); + $this->appConfig->setValueString(Application::APP_ID, self::CSV_ACTIVITIES_KEY, (string)json_encode(array_values($activities)), lazy: true); + }//end storeUpload() + + /** + * One lesson per weekly lesson of each activity, keyed `{group}:{subject}:{n}`. + * + * @param array> $activities Activity rows. + * + * @return array> + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ + private function lessons(array $activities): array { + $lessons = []; + foreach ($activities as $activity) { + $key = ((string)($activity['group'] ?? '')).':'.((string)($activity['subject'] ?? '')); + $count = max(0, (int)($activity['lessonsPerWeek'] ?? 0)); + for ($number = 1; $number <= $count; $number++) { + $lessons[] = [ + 'key' => $key.':'.$number, + 'activity' => $key, + 'group' => (string)($activity['group'] ?? ''), + 'subject' => (string)($activity['subject'] ?? ''), + 'teacher' => (string)($activity['teacher'] ?? ''), + 'roomType' => (string)($activity['roomType'] ?? ''), + 'length' => max(1, (int)($activity['lessonLength'] ?? 1)), + ]; + } + } + + return $lessons; + }//end lessons() + + /** + * A wish as the solver reads it: its id and the fields that constrain. + * + * @param array $wish A timetableWish object. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-6.1 + */ + public function solverWish(array $wish): array { + $out = ['id' => (string)($wish['id'] ?? ($wish['@self']['id'] ?? ''))]; + foreach (self::WISH_FIELDS as $field) { + if (array_key_exists($field, $wish) === true) { + $out[$field] = $wish[$field]; + } + } + + return $out; + }//end solverWish() + + /** + * A stored sheet, or an empty list. + * + * @param string $key The app config key. + * + * @return array> + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.2 + */ + private function stored(string $key): array { + $rows = json_decode($this->appConfig->getValueString(Application::APP_ID, $key, '[]', lazy: true), true); + if (is_array($rows) === false) { + return []; + } + + return array_values(array_filter($rows, 'is_array')); + }//end stored() +}//end class diff --git a/lib/Service/TimetableScenarioImporter.php b/lib/Service/TimetableScenarioImporter.php new file mode 100644 index 00000000..f5bbb649 --- /dev/null +++ b/lib/Service/TimetableScenarioImporter.php @@ -0,0 +1,209 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use DateTimeImmutable; +use InvalidArgumentException; +use OCA\Planninq\Timetabling\SolverInput; +use OCA\Planninq\Timetabling\TimetableScorer; +use Throwable; + +/** + * Snapshot the current timetable into a scenario. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-6.1 + */ +class TimetableScenarioImporter { + + /** + * Constructor. + * + * @param TimetableScenarioStore $store Reads the lessons and wishes, writes the scenario. + * @param TimetableGridService $grid The week grid. + * @param TimetableInputBuilder $inputBuilder Shapes the wishes as the solver reads them. + * @param TimetableScorer $scorer Scores the week. + * + * @return void + */ + public function __construct( + private readonly TimetableScenarioStore $store, + private readonly TimetableGridService $grid, + private readonly TimetableInputBuilder $inputBuilder, + private readonly TimetableScorer $scorer=new TimetableScorer(), + ) { + }//end __construct() + + /** + * Fill an imported scenario from the scheduled lessons of its first week, and store it as done. + * + * @param string $id The scenario id. + * + * @return array The stored scenario. + * + * @throws InvalidArgumentException When the scenario does not exist, is not imported, or its week has no lessons. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-6.1 + */ + public function importInto(string $id): array { + $scenario = $this->store->load(id: $id); + if ($scenario === null || ($scenario['source'] ?? '') !== 'imported' || ($scenario['status'] ?? '') === 'published') { + throw new InvalidArgumentException('Only an imported scenario that is not published can take the current timetable.'); + } + + $monday = $this->monday(date: (string)($scenario['weekOf'] ?? '')); + $sessions = $this->store->scheduledLessons( + from: $monday->format(DATE_ATOM), + to: $monday->modify('+7 days')->modify('-1 second')->format(DATE_ATOM) + ); + if ($sessions === []) { + throw new InvalidArgumentException('The week of this scenario has no scheduled lessons.'); + } + + $week = $this->weekOf(sessions: $sessions); + $wishes = array_map(fn (array $wish): array => $this->inputBuilder->solverWish(wish: $wish), $this->store->wishes()); + $input = new SolverInput( + periods: $this->grid->periodKeys(), + rooms: $week['rooms'], + lessons: $week['lessons'], + wishes: $wishes, + source: 'imported' + ); + $score = $this->scorer->score(input: $input, placements: $week['placements']); + + $scenario = array_merge( + $scenario, + [ + 'status' => 'done', + 'input' => $input->toArray(), + 'placements' => $week['placements'], + 'unplaced' => $week['unplaced'], + 'brokenWishes' => $score['brokenWishes'], + 'metrics' => array_merge($score['metrics'], ['cost' => $this->scorer->costOf(metrics: $score['metrics'])]), + 'reason' => '', + ] + ); + $this->store->save(id: $id, data: $scenario); + + return $scenario; + }//end importInto() + + /** + * The lessons, rooms and placements of one week of stored lessons; a lesson whose times + * are not periods of the grid is kept as unplaced with the reason `offGrid`. + * + * @param array> $sessions The stored lessons. + * + * @return array{lessons:array>,rooms:array>,placements:array>,unplaced:array>} + */ + private function weekOf(array $sessions): array { + $periods = $this->grid->periodTimes(); + $counts = []; + $week = ['lessons' => [], 'rooms' => [], 'placements' => [], 'unplaced' => []]; + foreach ($sessions as $session) { + $group = (string)($session['groupReference'] ?? ($session['cohortId'] ?? '')); + $subject = (string)($session['subject'] ?? ''); + $activity = $group.':'.$subject; + $counts[$activity] = (($counts[$activity] ?? 0) + 1); + $slot = $this->slotOf(session: $session, periods: $periods); + $room = (string)($session['roomReference'] ?? ''); + $week['lessons'][] = [ + 'key' => $activity.':'.$counts[$activity], + 'activity' => $activity, + 'group' => $group, + 'subject' => $subject, + 'teacher' => (string)($session['teacherUserId'] ?? ($session['teacherReference'] ?? '')), + 'roomType' => '', + 'length' => ($slot['length'] ?? 1), + ]; + $week['rooms'][$room] = ['reference' => $room, 'capacity' => 0, 'type' => '']; + if ($slot === null) { + $week['unplaced'][] = ['lesson' => $activity.':'.$counts[$activity], 'wish' => null, 'reason' => 'offGrid']; + continue; + } + + $week['placements'][] = ['lesson' => $activity.':'.$counts[$activity], 'period' => $slot['period'], 'room' => $room]; + }//end foreach + + $week['rooms'] = array_values($week['rooms']); + return $week; + }//end weekOf() + + /** + * The period key and length of a stored lesson, or null when it does not start and end on period times. + * + * @param array $session The stored lesson. + * @param array $periods The grid's periods. + * + * @return array{period:string,length:int}|null + */ + private function slotOf(array $session, array $periods): ?array { + try { + $starts = new DateTimeImmutable((string)($session['startsAt'] ?? '')); + $ends = new DateTimeImmutable((string)($session['endsAt'] ?? '')); + } catch (Throwable) { + return null; + } + + $day = strtolower($starts->format('D')); + $first = null; + $length = 0; + foreach ($periods as $period) { + if ($period['day'] !== substr($day, 0, 3) || $period['start'] < $starts->format('H:i') || $period['end'] > $ends->format('H:i')) { + continue; + } + + $first = ($first ?? $period); + $length++; + } + + if ($first === null || $first['start'] !== $starts->format('H:i')) { + return null; + } + + return ['period' => $first['day'].'-'.$first['number'], 'length' => $length]; + }//end slotOf() + + /** + * The Monday of a date's week, at midnight. + * + * @param string $date A date. + * + * @return DateTimeImmutable + * + * @throws InvalidArgumentException When it is not a date. + */ + private function monday(string $date): DateTimeImmutable { + try { + $day = new DateTimeImmutable($date); + } catch (Throwable) { + throw new InvalidArgumentException('The scenario has no week to take the lessons from.'); + } + + return $day->modify('monday this week')->setTime(0, 0); + }//end monday() +}//end class diff --git a/lib/Service/TimetableScenarioPublisher.php b/lib/Service/TimetableScenarioPublisher.php new file mode 100644 index 00000000..0d972b89 --- /dev/null +++ b/lib/Service/TimetableScenarioPublisher.php @@ -0,0 +1,221 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use DateTimeImmutable; +use InvalidArgumentException; + +/** + * Publish a scenario as draft lessons. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-8.1 + */ +class TimetableScenarioPublisher { + + /** + * The source system the generator's lessons are stored under. + */ + public const SOURCE = 'planninq-generator'; + + /** + * The days of the week in grid order, as offsets from Monday. + */ + private const DAY_OFFSETS = ['mon' => 0, 'tue' => 1, 'wed' => 2, 'thu' => 3, 'fri' => 4, 'sat' => 5, 'sun' => 6]; + + /** + * Constructor. + * + * @param TimetableScenarioStore $store Reads the scenario and the generator's lessons. + * @param TimetableSessionService $sessions Upserts the draft lessons. + * @param TimetableGridService $grid The period times. + * + * @return void + */ + public function __construct( + private readonly TimetableScenarioStore $store, + private readonly TimetableSessionService $sessions, + private readonly TimetableGridService $grid, + ) { + }//end __construct() + + /** + * Write the scenario's placements as draft lessons for every week of the window. + * + * Drafts from the generator in the window that belong to another scenario + * are removed first; a lesson of the window the generator already + * published refuses the whole publish. + * + * @param string $id The scenario id. + * + * @return array{created:int,updated:int,unchanged:int,removed:int,rejected:int} + * + * @throws InvalidArgumentException When the scenario cannot be published. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-8.1 + */ + public function publishDrafts(string $id): array { + $scenario = $this->store->load(id: $id); + if ($scenario === null + || ($scenario['source'] ?? '') !== 'generated' + || in_array(($scenario['status'] ?? ''), ['done', 'published'], true) === false + || ($scenario['placements'] ?? []) === [] + ) { + throw new InvalidArgumentException('Only a finished generated scenario with placements can be published.'); + } + + [$from, $to] = $this->window(scenario: $scenario); + $existing = $this->store->lessonsFrom(source: self::SOURCE, from: $from->format(DATE_ATOM), to: $to->format(DATE_ATOM)); + foreach ($existing as $lesson) { + if (($lesson['status'] ?? '') === 'scheduled') { + throw new InvalidArgumentException('Lessons of this window are already published from the generator. Nothing was written.'); + } + } + + $removed = 0; + foreach ($existing as $lesson) { + if (str_starts_with((string)($lesson['externalRef'] ?? ''), $id.':') === false) { + $this->store->deleteLesson(id: (string)$lesson['id']); + $removed++; + } + } + + $result = $this->sessions->upsert(sourceSystem: self::SOURCE, sessions: $this->rows(id: $id, scenario: $scenario, from: $from, to: $to)); + $this->store->save(id: $id, data: array_merge($scenario, ['status' => 'published', 'publishedAt' => (new DateTimeImmutable())->format(DATE_ATOM)])); + + return [ + 'created' => (int)($result['created'] ?? 0), + 'updated' => (int)($result['updated'] ?? 0), + 'unchanged' => (int)($result['unchanged'] ?? 0), + 'removed' => $removed, + 'rejected' => count((array)($result['rejected'] ?? [])), + ]; + }//end publishDrafts() + + /** + * The draft lesson rows of every week of the window, in the upsert contract's shape. + * + * @param string $id The scenario id. + * @param array $scenario The scenario. + * @param DateTimeImmutable $from The first day of the window. + * @param DateTimeImmutable $to The end of the last day of the window. + * + * @return array> + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-8.1 + */ + public function rows(string $id, array $scenario, DateTimeImmutable $from, DateTimeImmutable $to): array { + $lessons = array_column((array)($scenario['input']['lessons'] ?? []), null, 'key'); + $times = array_column($this->grid->periodTimes(), null, 'key'); + $rows = []; + for ($monday = $this->monday(date: $from); $monday <= $to; $monday = $monday->modify('+7 days')) { + foreach ((array)$scenario['placements'] as $placement) { + $row = $this->row(id: $id, lesson: ($lessons[$placement['lesson']] ?? null), placement: $placement, monday: $monday, times: $times); + if ($row !== null && $row['startsAt'] >= $from->format(DATE_ATOM) && $row['startsAt'] <= $to->format(DATE_ATOM)) { + $rows[] = $row; + } + } + } + + return $rows; + }//end rows() + + /** + * One draft lesson, or null when the lesson or its period is unknown. + * + * @param string $id The scenario id. + * @param array|null $lesson The lesson. + * @param array $placement The placement. + * @param DateTimeImmutable $monday The Monday of the week. + * @param array $times Period times by key. + * + * @return array|null + */ + private function row(string $id, ?array $lesson, array $placement, DateTimeImmutable $monday, array $times): ?array { + $first = ($times[$placement['period']] ?? null); + if ($lesson === null || $first === null) { + return null; + } + + [$day, $number] = explode('-', $placement['period'], 2); + $last = ($times[$day.'-'.((int)$number + max(1, (int)($lesson['length'] ?? 1)) - 1)] ?? $first); + $date = $monday->modify('+'.self::DAY_OFFSETS[$day].' days'); + $row = [ + 'externalRef' => $id.':'.$lesson['key'].':'.$date->format('Y-m-d'), + 'subject' => (string)$lesson['subject'], + 'title' => (string)$lesson['subject'].' '.(string)$lesson['group'], + 'startsAt' => $this->atTime(date: $date, time: $first['start']), + 'endsAt' => $this->atTime(date: $date, time: $last['end']), + 'groupReference' => (string)$lesson['group'], + 'teacherUserId' => (string)$lesson['teacher'], + 'roomReference' => (string)$placement['room'], + 'status' => 'draft', + ]; + + return array_filter($row, static fn (string $value): bool => $value !== ''); + }//end row() + + /** + * A date at a time of day, as ISO 8601 in the server's time zone. + * + * @param DateTimeImmutable $date The date. + * @param string $time The time, as in `08:30`. + * + * @return string + */ + private function atTime(DateTimeImmutable $date, string $time): string { + [$hour, $minute] = array_map('intval', explode(':', $time, 2)); + return $date->setTime($hour, $minute)->format(DATE_ATOM); + }//end atTime() + + /** + * The window of a scenario: its first day at midnight and its last day just before midnight. + * + * @param array $scenario The scenario. + * + * @return array{0:DateTimeImmutable,1:DateTimeImmutable} + */ + private function window(array $scenario): array { + $from = (string)($scenario['windowFrom'] ?? ''); + $to = (string)($scenario['windowTo'] ?? ''); + if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $from) !== 1 || preg_match('/^\d{4}-\d{2}-\d{2}$/', $to) !== 1 || $to < $from) { + throw new InvalidArgumentException('The scenario needs a window with a start before its end.'); + } + + return [new DateTimeImmutable($from.' 00:00:00'), new DateTimeImmutable($to.' 23:59:59')]; + }//end window() + + /** + * The Monday of a date's week, at midnight. + * + * @param DateTimeImmutable $date The date. + * + * @return DateTimeImmutable + */ + private function monday(DateTimeImmutable $date): DateTimeImmutable { + return $date->modify('monday this week')->setTime(0, 0); + }//end monday() +}//end class diff --git a/lib/Service/TimetableScenarioStore.php b/lib/Service/TimetableScenarioStore.php new file mode 100644 index 00000000..74eeb501 --- /dev/null +++ b/lib/Service/TimetableScenarioStore.php @@ -0,0 +1,265 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use Psr\Container\ContainerInterface; +use RuntimeException; +use Throwable; + +/** + * The generator's access to its scenarios and wishes. + * + * Written with RBAC off: the store is reached only from the admin-only + * generate endpoint and from the queued job, which runs without a user. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ +class TimetableScenarioStore { + + /** + * The register slug. + */ + public const REGISTER = 'planninq'; + + /** + * The scenario schema slug. + */ + public const SCENARIO = 'timetableScenario'; + + /** + * The wish schema slug. + */ + public const WISH = 'timetableWish'; + + /** + * The lesson schema slug. + */ + public const SESSION = 'timetableSession'; + + /** + * The most wishes one run reads. + */ + private const MAX_WISHES = 1000; + + /** + * OpenRegister ObjectService FQCN. + */ + private const OR_OBJECT_SERVICE = 'OCA\\OpenRegister\\Service\\ObjectService'; + + /** + * Constructor. + * + * @param ContainerInterface $container Resolves OpenRegister's ObjectService by name. + * + * @return void + */ + public function __construct( + private readonly ContainerInterface $container, + ) { + }//end __construct() + + /** + * One scenario's data, or null when it does not exist. + * + * @param string $id The scenario id. + * + * @return array|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ + public function load(string $id): ?array { + try { + $object = $this->objectService()->find(id: $id, register: self::REGISTER, schema: self::SCENARIO, _rbac: false); + } catch (Throwable) { + return null; + } + + return $this->dataOf(object: $object); + }//end load() + + /** + * Store a scenario's data under its id. + * + * @param string $id The scenario id. + * @param array $data The complete scenario. + * + * @return void + * + * @throws RuntimeException When OpenRegister refuses it. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ + public function save(string $id, array $data): void { + unset($data['@self'], $data['id']); + $saved = $this->objectService()->saveObject(object: $data, register: self::REGISTER, schema: self::SCENARIO, uuid: $id, _rbac: false); + if ($saved === null) { + throw new RuntimeException('OpenRegister did not store the scenario.'); + } + }//end save() + + /** + * Every wish. + * + * @return array> + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.2 + */ + public function wishes(): array { + $results = $this->objectService()->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: self::WISH, + filters: ['_limit' => self::MAX_WISHES], + _rbac: false + ); + $wishes = []; + foreach ((new TimetableSessionRows())->listOf(results: $results) as $row) { + $data = $this->dataOf(object: $row); + if ($data !== null) { + $wishes[] = $data; + } + } + + return $wishes; + }//end wishes() + + /** + * The scheduled lessons that start in a window, as stored. + * + * @param string $from The first moment, ISO 8601. + * @param string $to The last moment, ISO 8601. + * + * @return array> + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-6.1 + */ + public function scheduledLessons(string $from, string $to): array { + $results = $this->objectService()->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: self::SESSION, + filters: ['status' => 'scheduled', 'startsAt' => ['gte' => $from, 'lte' => $to], '_limit' => TimetableSessionQuery::MAX_LIMIT], + _rbac: false + ); + $first = strtotime($from); + $last = strtotime($to); + $lessons = []; + foreach ((new TimetableSessionRows())->listOf(results: $results) as $row) { + $data = (array)$this->dataOf(object: $row); + $starts = strtotime((string)($data['startsAt'] ?? '')); + // Re-checked here, so the snapshot never depends on OpenRegister applying every filter. + if (($data['status'] ?? '') === 'scheduled' && $starts !== false && $starts >= $first && $starts <= $last) { + $lessons[] = $data; + } + } + + return $lessons; + }//end scheduledLessons() + + /** + * The lessons from one source that start in a window, drafts and scheduled, with their ids. + * + * @param string $source The source system. + * @param string $from The first moment, ISO 8601. + * @param string $to The last moment, ISO 8601. + * + * @return array> + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-8.1 + */ + public function lessonsFrom(string $source, string $from, string $to): array { + $results = $this->objectService()->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: self::SESSION, + filters: ['sourceSystem' => $source, 'startsAt' => ['gte' => $from, 'lte' => $to], '_limit' => TimetableSessionQuery::MAX_LIMIT], + _rbac: false + ); + $lessons = []; + foreach ((new TimetableSessionRows())->listOf(results: $results) as $row) { + $data = (array)$this->dataOf(object: $row); + $starts = strtotime((string)($data['startsAt'] ?? '')); + if (($data['sourceSystem'] ?? '') === $source && $starts !== false && $starts >= strtotime($from) && $starts <= strtotime($to)) { + $lessons[] = $data; + } + } + + return $lessons; + }//end lessonsFrom() + + /** + * Delete one lesson. + * + * @param string $id The lesson id. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-8.1 + */ + public function deleteLesson(string $id): void { + $this->objectService()->deleteObject(uuid: $id, register: self::REGISTER, schema: self::SESSION, _rbac: false); + }//end deleteLesson() + + /** + * An object's data with its id, from an ObjectEntity or an array; null for anything else. + * + * @param mixed $object The object. + * + * @return array|null + */ + private function dataOf(mixed $object): ?array { + if (is_object($object) === false && is_array($object) === false) { + return null; + } + + $rows = new TimetableSessionRows(); + $data = $rows->dataOf(row: $object); + $id = $rows->idOf(row: $object); + if ($id !== '') { + $data['id'] = $id; + } + + return $data; + }//end dataOf() + + /** + * OpenRegister's ObjectService, cleared of any earlier caller's scope. + * + * @return object + * + * @throws RuntimeException When OpenRegister is not available. + */ + private function objectService(): object { + try { + $objectService = $this->container->get(self::OR_OBJECT_SERVICE); + } catch (Throwable $e) { + throw new RuntimeException('OpenRegister is not available.', 0, $e); + } + + if (method_exists($objectService, 'clearCurrents') === true) { + $objectService->clearCurrents(); + } + + return $objectService; + }//end objectService() +}//end class diff --git a/lib/Service/TimetableSessionQuery.php b/lib/Service/TimetableSessionQuery.php new file mode 100644 index 00000000..83a372b2 --- /dev/null +++ b/lib/Service/TimetableSessionQuery.php @@ -0,0 +1,310 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-License-Identifier: EUPL-1.2 + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use InvalidArgumentException; + +/** + * A validated, bounded timetable read. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ +class TimetableSessionQuery { + + /** + * Rows a read returns when the caller names no limit. + * + * @var int + */ + public const DEFAULT_LIMIT = 500; + + /** + * Hard ceiling on the rows one read returns (ADR-058 bounded queries). + * + * @var int + */ + public const MAX_LIMIT = 1000; + + /** + * The criteria keys that name whose timetable is read. At least one is required. + * + * @var string[] + */ + public const IDENTITY_KEYS = ['cohortId', 'groupReference', 'teacherUserId', 'teacherReference', 'courseId']; + + /** + * Seconds the window is widened by in the OpenRegister prefilter. + * + * @var int + */ + private const WINDOW_MARGIN = 86400; + + /** + * The identity filters, by criteria key. + * + * @var array + */ + private array $identity; + + /** + * Window start as a Unix timestamp, or null when open. + * + * @var int|null + */ + private ?int $from; + + /** + * Window end as a Unix timestamp, or null when open. + * + * @var int|null + */ + private ?int $to; + + /** + * The row limit. + * + * @var int + */ + private int $limit; + + /** + * Whether cancelled lessons are included. + * + * @var bool + */ + private bool $includeCancelled; + + /** + * Whether draft lessons are included (default false). + * + * @var bool + */ + private bool $includeDrafts; + + /** + * Validate the contract's criteria. + * + * @param array $criteria cohortId, groupReference, teacherUserId, teacherReference, + * from, to, limit, includeCancelled, includeDrafts. + * + * @return void + * + * @throws InvalidArgumentException When no identity filter is given or the window is invalid. + * + * @spec openspec/changes/timetable-draft-review/specs/timetable-draft-review/spec.md#requirement-drafts-are-returned-only-when-the-caller-asks-for-them + */ + public function __construct(array $criteria) { + $this->identity = $this->parseIdentity(criteria: $criteria); + $this->from = $this->parseMoment(value: ($criteria['from'] ?? null), name: 'from'); + $this->to = $this->parseMoment(value: ($criteria['to'] ?? null), name: 'to'); + if ($this->from !== null && $this->to !== null && $this->from > $this->to) { + throw new InvalidArgumentException('The window starts after it ends.'); + } + + $this->limit = $this->parseLimit(value: ($criteria['limit'] ?? null)); + $this->includeCancelled = true; + if (array_key_exists('includeCancelled', $criteria) === true) { + $this->includeCancelled = filter_var($criteria['includeCancelled'], FILTER_VALIDATE_BOOLEAN); + } + + $this->includeDrafts = filter_var(($criteria['includeDrafts'] ?? false), FILTER_VALIDATE_BOOLEAN); + }//end __construct() + + /** + * The row limit. + * + * @return int + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function limit(): int { + return $this->limit; + }//end limit() + + /** + * The bounded OpenRegister filter for this read. + * + * The window goes to OpenRegister one day wider on each side. A stored time + * keeps the offset it was delivered with and a column compares strings, so + * `09:30+02:00` and `07:30Z` would disagree by the offset at the edges. The + * wide window is a coarse prefilter; matches() applies the exact one. + * + * @return array + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function filters(): array { + $filters = $this->identity; + if ($this->to !== null) { + $filters['startsAt'] = ['lte' => date(DATE_ATOM, ($this->to + self::WINDOW_MARGIN))]; + } + + if ($this->from !== null) { + $filters['endsAt'] = ['gte' => date(DATE_ATOM, ($this->from - self::WINDOW_MARGIN))]; + } + + $filters['_limit'] = $this->limit; + $filters['_order'] = ['startsAt' => 'ASC']; + + return $filters; + }//end filters() + + /** + * Whether a session in read shape belongs in this read. + * + * @param array $session The session. + * + * @return bool + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + * @spec openspec/changes/timetable-draft-review/specs/timetable-draft-review/spec.md#requirement-drafts-are-returned-only-when-the-caller-asks-for-them + */ + public function matches(array $session): bool { + if ($this->matchesIdentity(session: $session) === false) { + return false; + } + + if ($this->includeCancelled === false && ($session['status'] ?? '') === 'cancelled') { + return false; + } + + if ($this->includeDrafts === false && ($session['status'] ?? '') === 'draft') { + return false; + } + + return $this->overlapsWindow(start: strtotime((string)($session['startsAt'] ?? '')), end: strtotime((string)($session['endsAt'] ?? ''))); + }//end matches() + + /** + * Whether the session carries every identity filter of this read. + * + * @param array $session The session. + * + * @return bool + */ + private function matchesIdentity(array $session): bool { + foreach ($this->identity as $key => $value) { + if ((string)($session[$key] ?? '') !== $value) { + return false; + } + } + + return true; + }//end matchesIdentity() + + /** + * Whether a lesson between two moments overlaps the window. + * + * @param int|false $start Lesson start, or false when unreadable. + * @param int|false $end Lesson end, or false when unreadable. + * + * @return bool + */ + private function overlapsWindow(int|false $start, int|false $end): bool { + if ($start === false || $end === false) { + return false; + } + + if ($this->to !== null && $start > $this->to) { + return false; + } + + return $this->from === null || $end >= $this->from; + }//end overlapsWindow() + + /** + * Collect the identity filters the criteria name. + * + * @param array $criteria The criteria. + * + * @return array + * + * @throws InvalidArgumentException When none is named. + */ + private function parseIdentity(array $criteria): array { + $identity = []; + foreach (self::IDENTITY_KEYS as $key) { + $value = $criteria[$key] ?? null; + if (is_scalar($value) === true && trim((string)$value) !== '') { + $identity[$key] = trim((string)$value); + } + } + + if ($identity === []) { + throw new InvalidArgumentException('Name a cohortId, groupReference, teacherUserId, teacherReference or courseId to read a timetable.'); + } + + return $identity; + }//end parseIdentity() + + /** + * Parse the limit, defaulting and capping it. + * + * @param mixed $value The raw limit. + * + * @return int + */ + private function parseLimit(mixed $value): int { + if (is_numeric($value) === false) { + return self::DEFAULT_LIMIT; + } + + return max(1, min(self::MAX_LIMIT, (int)$value)); + }//end parseLimit() + + /** + * Parse an optional ISO 8601 moment. + * + * @param mixed $value The raw value. + * @param string $name The criteria key, for the error message. + * + * @return int|null The Unix timestamp, or null when absent. + * + * @throws InvalidArgumentException When the value is present and unparseable. + */ + private function parseMoment(mixed $value, string $name): ?int { + if ($value === null || $value === '') { + return null; + } + + $stamp = false; + if (is_string($value) === true) { + $stamp = strtotime($value); + } + + if ($stamp === false) { + throw new InvalidArgumentException("The {$name} value is not a date and time."); + } + + return $stamp; + }//end parseMoment() +}//end class diff --git a/lib/Service/TimetableSessionRows.php b/lib/Service/TimetableSessionRows.php new file mode 100644 index 00000000..0ede6ee2 --- /dev/null +++ b/lib/Service/TimetableSessionRows.php @@ -0,0 +1,288 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-License-Identifier: EUPL-1.2 + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use Throwable; + +/** + * Normalises ObjectService rows and shapes sessions for reading. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ +class TimetableSessionRows { + + /** + * Fields returned as strings, empty when unset. + * + * @var string[] + */ + private const TEXT_FIELDS = ['externalRef', 'sourceSystem', 'subject', 'title', 'startsAt', 'endsAt']; + + /** + * Fields returned as strings, null when unset. + * + * @var string[] + */ + private const OPTIONAL_FIELDS = [ + 'groupReference', + 'cohortId', + 'teacherReference', + 'teacherUserId', + 'roomReference', + 'roomLabel', + 'courseId', + 'onlineMeetingUrl', + ]; + + /** + * Optional fields an empty value clears (stored as null) rather than + * storing an empty string their format would refuse (contract v2). + * + * @var string[] + */ + private const CLEARABLE_FIELDS = ['courseId', 'onlineMeetingUrl']; + + /** + * Normalise an ObjectService result set to a plain list of rows. + * + * @param mixed $results The raw ObjectService return value. + * + * @return array + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function listOf(mixed $results): array { + if (is_array($results) === true && array_key_exists('results', $results) === true) { + return array_values((array)$results['results']); + } + + if (is_array($results) === true) { + return array_values($results); + } + + return []; + }//end listOf() + + /** + * Extract the object id from an ObjectService row (entity or array). + * + * `is_callable()` rather than `method_exists()`: OpenRegister's entity + * answers its accessors through `__call()` (see TimelineController). + * + * @param mixed $row An entity object or a plain array row. + * + * @return string + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function idOf(mixed $row): string { + if (is_object($row) === true) { + return $this->entityId(entity: $row); + } + + if (is_array($row) === true && isset($row['@self']['id']) === true) { + return (string)$row['@self']['id']; + } + + if (is_array($row) === true) { + return (string)($row['id'] ?? ''); + } + + return ''; + }//end idOf() + + /** + * Extract the data array from an ObjectService row (entity or array). + * + * @param mixed $row An entity object or a plain array row. + * + * @return array + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function dataOf(mixed $row): array { + if (is_object($row) === true && is_callable([$row, 'getObject']) === true) { + return (array)$row->getObject(); + } + + if (is_array($row) === true) { + return $row; + } + + return []; + }//end dataOf() + + /** + * Whether stored lesson data is a draft that overlaps a window, comparing moments rather than strings. + * + * @param array $data The stored session data. + * @param int $start Window start as a Unix timestamp. + * @param int $end Window end as a Unix timestamp. + * + * @return bool + * + * @spec openspec/changes/timetable-draft-review/specs/timetable-draft-review/spec.md#requirement-an-admin-publishes-the-drafts-of-one-source-in-a-date-window + */ + public function isDraftInWindow(array $data, int $start, int $end): bool { + if (($data['status'] ?? null) !== 'draft') { + return false; + } + + $lessonStart = strtotime((string)($data['startsAt'] ?? '')); + $lessonEnd = strtotime((string)($data['endsAt'] ?? '')); + + return $lessonStart !== false && $lessonEnd !== false && $lessonStart <= $end && $lessonEnd >= $start; + }//end isDraftInWindow() + + /** + * Project a stored row onto the contract's read shape. + * + * @param mixed $row An ObjectEntity or a plain array row. + * + * @return array|null The session, or null when it has no id. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + * @spec openspec/changes/timetable-draft-review/specs/timetable-draft-review/spec.md#requirement-a-draft-lesson-is-readable-only-by-the-teacher-it-names-and-by-admins + */ + public function toReadShape(mixed $row): ?array { + $id = $this->idOf(row: $row); + if ($id === '') { + return null; + } + + $data = $this->dataOf(row: $row); + $session = ['id' => $id]; + foreach (self::TEXT_FIELDS as $field) { + $session[$field] = (string)($data[$field] ?? ''); + } + + foreach (self::OPTIONAL_FIELDS as $field) { + $session[$field] = $this->optionalText(value: ($data[$field] ?? null)); + } + + if ($session['title'] === '') { + $session['title'] = $session['subject']; + } + + $session['status'] = 'scheduled'; + if (in_array(($data['status'] ?? 'scheduled'), ['cancelled', 'draft'], true) === true) { + $session['status'] = $data['status']; + } + + return $session; + }//end toReadShape() + + /** + * A scalar as a non-empty string, else null. + * + * @param mixed $value The raw value. + * + * @return string|null + */ + private function optionalText(mixed $value): ?string { + if (is_scalar($value) === true && (string)$value !== '') { + return (string)$value; + } + + return null; + }//end optionalText() + + /** + * Read an entity's id through its magic accessors. + * + * @param object $entity The entity. + * + * @return string + */ + private function entityId(object $entity): string { + foreach (['getUuid', 'getId'] as $getter) { + if (is_callable([$entity, $getter]) === false) { + continue; + } + + try { + $value = $entity->$getter(); + } catch (Throwable $e) { + continue; + } + + if (is_scalar($value) === true && (string)$value !== '') { + return (string)$value; + } + } + + return ''; + }//end entityId() + + /** + * Set a clearable field the caller sent empty (or null) to null. + * + * @param array $row The normalised row. + * @param array $raw The row as delivered. + * + * @return array The row. + * + * @spec openspec/changes/timetable-course-query/specs/school-timetable/spec.md#requirement-another-app-reads-a-courses-lessons-and-their-online-link-req-007 + */ + public function withClearedFields(array $row, array $raw): array { + foreach (self::CLEARABLE_FIELDS as $field) { + if (array_key_exists($field, $raw) === true && ($row[$field] ?? '') === '') { + $row[$field] = null; + } + } + + return $row; + }//end withClearedFields() + + /** + * Check a row's course id and online link, which the schema stores as a + * uuid and an address: a value OpenRegister would refuse is rejected + * before anything is written, with its own code. + * + * @param array $row The normalised row. + * + * @return array{code:string,message:string}|null The problem, or null. + * + * @spec openspec/changes/timetable-course-query/specs/school-timetable/spec.md#requirement-another-app-reads-a-courses-lessons-and-their-online-link-req-007 + */ + public function courseOrLinkError(array $row): ?array { + $course = $row['courseId'] ?? null; + if ($course !== null && preg_match('/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i', (string)$course) !== 1) { + return ['code' => 'invalid-course-id', 'message' => 'The course id must be the uuid of a course.']; + } + + $link = $row['onlineMeetingUrl'] ?? null; + if ($link !== null && (filter_var((string)$link, FILTER_VALIDATE_URL) === false || parse_url((string)$link, PHP_URL_HOST) === null)) { + return ['code' => 'invalid-link', 'message' => 'The online meeting link must be a full web address.']; + } + + return null; + }//end courseOrLinkError() +}//end class diff --git a/lib/Service/TimetableSessionService.php b/lib/Service/TimetableSessionService.php new file mode 100644 index 00000000..1e990374 --- /dev/null +++ b/lib/Service/TimetableSessionService.php @@ -0,0 +1,708 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-License-Identifier: EUPL-1.2 + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-upsert-is-idempotent-by-source-and-occurrence-id-req-002 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use DateTimeImmutable; +use InvalidArgumentException; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; +use RuntimeException; +use Throwable; + +/** + * Upserts and lists `timetableSession` rows in the planninq register. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-upsert-is-idempotent-by-source-and-occurrence-id-req-002 + */ +class TimetableSessionService { + + /** + * Contract version of the upsert result and the session shape. + * + * @var int + */ + public const CONTRACT_VERSION = 1; + + /** + * OpenRegister register slug owning the planninq schemas. + * + * @var string + */ + public const REGISTER = 'planninq'; + + /** + * Schema slug of a timetable session. + * + * @var string + */ + public const SCHEMA = 'timetableSession'; + + /** + * OpenRegister ObjectService FQCN, resolved at runtime so planninq carries no + * compile-time dependency on the openregister package (ADR-022). + * + * @var string + */ + private const OR_OBJECT_SERVICE = 'OCA\\OpenRegister\\Service\\ObjectService'; + + /** + * Fields a row must carry, besides the batch's own source system. + * + * @var string[] + */ + private const REQUIRED_FIELDS = ['externalRef', 'subject', 'startsAt', 'endsAt']; + + /** + * Every field a caller may set. `sourceSystem` comes from the batch and + * `importedAt` from planninq, so neither is copied from a row. + * + * @var string[] + */ + private const WRITABLE_FIELDS = [ + 'externalRef', + 'subject', + 'title', + 'startsAt', + 'endsAt', + 'groupReference', + 'cohortId', + 'teacherReference', + 'teacherUserId', + 'roomReference', + 'roomLabel', + 'status', + 'courseId', + 'onlineMeetingUrl', + ]; + + /** + * The fields compared as moments in time rather than as strings. + * + * @var string[] + */ + private const DATE_FIELDS = ['startsAt', 'endsAt']; + + /** + * The two states a lesson can be in. + * + * @var string[] + */ + private const STATUSES = ['draft', 'scheduled', 'cancelled']; + + /** + * Seconds a publish window is widened by in the OpenRegister prefilter (offsets differ at the edges). + * + * @var int + */ + private const DAY = 86400; + + /** + * Reads ObjectService rows and shapes sessions. + * + * @var TimetableSessionRows + */ + private readonly TimetableSessionRows $rows; + + /** + * Constructor. + * + * @param ContainerInterface $container Resolves OpenRegister's ObjectService by name. + * @param LoggerInterface $logger PSR logger. + * + * @return void + */ + public function __construct( + private readonly ContainerInterface $container, + private readonly LoggerInterface $logger, + ) { + $this->rows = new TimetableSessionRows(); + }//end __construct() + + /** + * Upsert one batch of lessons from one source. + * + * A row matches a stored session only when both `sourceSystem` and + * `externalRef` are equal. An unchanged match is counted and not saved, a + * changed match is updated in place, and no match creates a session. Rows + * are validated before anything is written; a key that appears again later + * in the batch is rejected for its earlier occurrences, so the last wins. + * + * @param string $sourceSystem The source every row is stored under. + * @param array $sessions Rows in the contract's session shape. + * + * @return array The contract's upsert result. + * + * @throws InvalidArgumentException When the source system is empty. + * @throws RuntimeException When OpenRegister is not available. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-upsert-is-idempotent-by-source-and-occurrence-id-req-002 + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-upsert-validates-before-it-writes-req-003 + */ + public function upsert(string $sourceSystem, array $sessions): array { + $sourceSystem = trim($sourceSystem); + if ($sourceSystem === '') { + throw new InvalidArgumentException('A timetable delivery needs a source system.'); + } + + $result = [ + 'contractVersion' => self::CONTRACT_VERSION, + 'sourceSystem' => $sourceSystem, + 'processed' => count($sessions), + 'created' => 0, + 'updated' => 0, + 'unchanged' => 0, + 'rejected' => [], + 'sessionIds' => [], + ]; + + $accepted = $this->acceptRows(sessions: array_values($sessions), sourceSystem: $sourceSystem, result: $result); + if ($accepted === []) { + return $result; + } + + $objectService = $this->objectService(); + foreach ($accepted as $row) { + $this->upsertRow(objectService: $objectService, row: $row, result: $result); + } + + return $result; + }//end upsert() + + /** + * Publish the drafts of one source that overlap a window: each becomes scheduled. + * + * Each draft is saved whole (its stored fields with the new status), so no + * field is nulled on the way. Reached only through the admin endpoint. + * + * @param string $sourceSystem The source whose drafts are published. + * @param string $from ISO 8601 window start. + * @param string $to ISO 8601 window end. + * + * @return array{contractVersion:int,sourceSystem:string,published:int,failed:array} + * + * @throws InvalidArgumentException When the source is empty or the window is missing or reversed. + * @throws RuntimeException When OpenRegister is not available. + * + * @spec openspec/changes/timetable-draft-review/specs/timetable-draft-review/spec.md#requirement-an-admin-publishes-the-drafts-of-one-source-in-a-date-window + */ + public function publish(string $sourceSystem, string $from, string $to): array { + $sourceSystem = trim($sourceSystem); + if ($sourceSystem === '') { + throw new InvalidArgumentException('Name the source system whose drafts to publish.'); + } + + $start = strtotime($from); + $end = strtotime($to); + if ($start === false || $end === false || $start > $end) { + throw new InvalidArgumentException('Give the window to publish as from and to, the start before the end.'); + } + + $result = ['contractVersion' => self::CONTRACT_VERSION, 'sourceSystem' => $sourceSystem, 'published' => 0, 'failed' => []]; + + $objectService = $this->objectService(); + $results = $objectService->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: self::SCHEMA, + filters: [ + 'sourceSystem' => $sourceSystem, + 'status' => 'draft', + 'startsAt' => ['lte' => date(DATE_ATOM, ($end + self::DAY))], + 'endsAt' => ['gte' => date(DATE_ATOM, ($start - self::DAY))], + '_limit' => TimetableSessionQuery::MAX_LIMIT, + ], + _rbac: false + ); + + foreach ($this->rows->listOf(results: $results) as $row) { + $data = $this->rows->dataOf(row: $row); + $id = $this->rows->idOf(row: $row); + if ($id === '' || $this->rows->isDraftInWindow(data: $data, start: $start, end: $end) === false) { + continue; + } + + $lesson = array_merge($this->storedFields(data: $data), ['status' => 'scheduled', 'importedAt' => (new DateTimeImmutable())->format(DATE_ATOM)]); + if ($this->save(objectService: $objectService, data: $lesson, uuid: $id) === null) { + $result['failed'][] = $id; + continue; + } + + $result['published']++; + } + + return $result; + }//end publish() + + /** + * List the sessions of a cohort, group or teacher for the signed-in caller. + * + * The read runs with OpenRegister RBAC on, as the current user, so the + * schema's read rule decides which rows come back: the timetable group and + * admins read every lesson, a teacher reads the lessons that name them, and + * nobody else reads any (planninq#711). This is the HTTP path. + * + * @param array $criteria The contract's query criteria. + * + * @return array> Sessions in the contract's read shape. + * + * @throws InvalidArgumentException When no identity filter is given or the window is invalid. + * @throws RuntimeException When OpenRegister is not available. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-signed-in-users-read-sessions-over-http-only-admins-upsert-req-006 + */ + public function list(array $criteria): array { + return $this->read(criteria: $criteria, rbac: true); + }//end list() + + /** + * List the sessions of a cohort, group or teacher for another app. + * + * Reached only through {@see \OCA\Planninq\Listener\TimetableSessionsQueryListener}, + * which answers an in-process PHP event that only server code can + * dispatch. The read runs with RBAC off: the requesting app has already + * decided that its user may see this cohort or teacher (learniq resolves a + * learner's cohorts from its own membership before it asks), and planninq + * holds no membership it could check that against. Reading as the caller + * here would take a learner's own lessons away once the schema no longer + * grants every signed-in user (planninq#711). + * + * @param array $criteria The contract's query criteria. + * + * @return array> Sessions in the contract's read shape. + * + * @throws InvalidArgumentException When no identity filter is given or the window is invalid. + * @throws RuntimeException When OpenRegister is not available. + * + * @spec openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005 + */ + public function listForApp(array $criteria): array { + return $this->read(criteria: $criteria, rbac: false); + }//end listForApp() + + /** + * Read, re-check, sort and bound the sessions matching the criteria. + * + * A session is included when it overlaps the window. Results are sorted by + * start time and bounded by the limit. + * + * @param array $criteria The contract's query criteria. + * @param bool $rbac Whether OpenRegister applies the schema's read rule for the current user. + * + * @return array> Sessions in the contract's read shape. + * + * @throws InvalidArgumentException When no identity filter is given or the window is invalid. + * @throws RuntimeException When OpenRegister is not available. + */ + private function read(array $criteria, bool $rbac): array { + $query = new TimetableSessionQuery(criteria: $criteria); + + $objectService = $this->objectService(); + $results = $objectService->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: self::SCHEMA, + filters: $query->filters(), + _rbac: $rbac + ); + + $sessions = []; + foreach ($this->rows->listOf(results: $results) as $row) { + $session = $this->rows->toReadShape(row: $row); + if ($session !== null && $query->matches(session: $session) === true) { + $sessions[] = $session; + } + } + + usort( + $sessions, + static fn (array $left, array $right): int => ((int)strtotime((string)$left['startsAt'])) <=> ((int)strtotime((string)$right['startsAt'])) + ); + + return array_slice($sessions, 0, $query->limit()); + }//end read() + + /** + * Validate every row and drop the earlier occurrences of a repeated key. + * + * Rejections are appended to the result as they are found; the rows that + * survive are returned in batch order, already normalised. + * + * @param array $sessions The raw rows. + * @param string $sourceSystem The batch's source system. + * @param array $result The result being built (by reference). + * + * @return array> The normalised rows to write. + */ + private function acceptRows(array $sessions, string $sourceSystem, array &$result): array { + $valid = []; + $lastIndexByRef = []; + + foreach ($sessions as $index => $raw) { + if (is_array($raw) === false) { + $result['rejected'][] = $this->rejection(externalRef: null, code: 'missing-fields', message: 'The row is not an object.'); + continue; + } + + $row = $this->normalise(raw: $raw, sourceSystem: $sourceSystem); + $error = $this->validate(row: $row); + if ($error !== null) { + $result['rejected'][] = $this->rejection(externalRef: ($row['externalRef'] ?? null), code: $error['code'], message: $error['message']); + continue; + } + + $valid[$index] = $row; + $lastIndexByRef[$row['externalRef']] = $index; + }//end foreach + + $accepted = []; + foreach ($valid as $index => $row) { + if ($lastIndexByRef[$row['externalRef']] !== $index) { + $result['rejected'][] = $this->rejection( + externalRef: $row['externalRef'], + code: 'duplicate-external-ref', + message: 'The same source id appears again later in this delivery; the later row is used.' + ); + continue; + } + + $accepted[] = $row; + } + + return $accepted; + }//end acceptRows() + + /** + * Create, update or skip one validated row. + * + * @param object $objectService The OpenRegister ObjectService. + * @param array $row The normalised row. + * @param array $result The result being built (by reference). + * + * @return void + */ + private function upsertRow(object $objectService, array $row, array &$result): void { + $existing = $this->findExisting(objectService: $objectService, sourceSystem: $row['sourceSystem'], externalRef: $row['externalRef']); + + if ($existing !== null && $this->wouldUnpublish(stored: $existing['data'], incoming: $row) === true) { + $result['rejected'][] = $this->rejection( + externalRef: $row['externalRef'], + code: 'already-published', + message: 'This lesson is already published; a later delivery cannot turn it back into a draft.' + ); + return; + } + + if ($existing !== null && $this->isUnchanged(stored: $existing['data'], incoming: $row) === true) { + $result['unchanged']++; + $result['sessionIds'][] = $existing['id']; + return; + } + + $data = $row; + $uuid = null; + $counter = 'created'; + if ($existing !== null) { + $data = array_merge($this->storedFields(data: $existing['data']), $row); + $uuid = $existing['id']; + $counter = 'updated'; + } + + if (($data['title'] ?? '') === '') { + $data['title'] = $data['subject']; + } + + $data['status'] = ($data['status'] ?? 'scheduled'); + $data['importedAt'] = (new DateTimeImmutable())->format(DATE_ATOM); + + $savedId = $this->save(objectService: $objectService, data: $data, uuid: $uuid); + if ($savedId === null) { + $result['rejected'][] = $this->rejection( + externalRef: $row['externalRef'], + code: 'save-failed', + message: 'OpenRegister did not store this lesson.' + ); + return; + } + + $result[$counter]++; + $result['sessionIds'][] = $savedId; + }//end upsertRow() + + /** + * Whether a delivery would turn a published (scheduled or cancelled) lesson back into a draft. + * + * @param array $stored The stored session data. + * @param array $incoming The normalised incoming row. + * + * @return bool + * + * @spec openspec/changes/timetable-draft-review/specs/timetable-draft-review/spec.md#requirement-a-later-delivery-never-turns-a-published-lesson-into-a-draft + */ + private function wouldUnpublish(array $stored, array $incoming): bool { + return ($incoming['status'] ?? null) === 'draft' && ($stored['status'] ?? 'scheduled') !== 'draft'; + }//end wouldUnpublish() + + /** + * Copy the writable fields a row carries, trimmed, under the batch's source. + * + * Only keys present in the row are copied, so a later delivery that omits a + * field keeps the stored value. A row's own `sourceSystem` is ignored. + * + * @param array $raw The raw row. + * @param string $sourceSystem The batch's source system. + * + * @return array The normalised row. + */ + private function normalise(array $raw, string $sourceSystem): array { + $row = ['sourceSystem' => $sourceSystem]; + + foreach (self::WRITABLE_FIELDS as $field) { + $value = $raw[$field] ?? null; + if (is_scalar($value) === true) { + $row[$field] = trim((string)$value); + } + } + + return $this->rows->withClearedFields(row: $row, raw: $raw); + }//end normalise() + + /** + * Check a normalised row against the contract's row rules. + * + * @param array $row The normalised row. + * + * @return array{code:string,message:string}|null The first problem found, or null. + */ + private function validate(array $row): ?array { + $missing = array_values( + array_filter( + self::REQUIRED_FIELDS, + static fn (string $field): bool => ($row[$field] ?? '') === '' + ) + ); + + if ($missing !== []) { + return ['code' => 'missing-fields', 'message' => 'Missing required field(s): ' . implode(', ', $missing)]; + } + + $start = strtotime($row['startsAt']); + $end = strtotime($row['endsAt']); + if ($start === false || $end === false || $end <= $start) { + return ['code' => 'invalid-dates', 'message' => 'The lesson times cannot be read, or the lesson does not end after it starts.']; + } + + if (isset($row['status']) === true && in_array($row['status'], self::STATUSES, true) === false) { + return ['code' => 'invalid-status', 'message' => 'Status must be draft, scheduled or cancelled.']; + } + + return $this->rows->courseOrLinkError(row: $row); + }//end validate() + + /** + * Find the stored session for a (source, occurrence id) pair. + * + * The filter is re-checked in PHP: a stored row only counts as the match + * when both key fields are equal, so an ignored filter can never make the + * upsert overwrite another lesson. + * + * @param object $objectService The OpenRegister ObjectService. + * @param string $sourceSystem The source system. + * @param string $externalRef The occurrence id. + * + * @return array{id:string,data:array}|null The match, or null. + */ + private function findExisting(object $objectService, string $sourceSystem, string $externalRef): ?array { + $results = $objectService->searchObjectsBySlug( + registerSlug: self::REGISTER, + schemaSlug: self::SCHEMA, + filters: [ + 'externalRef' => $externalRef, + 'sourceSystem' => $sourceSystem, + '_limit' => 2, + ], + _rbac: false + ); + + $matches = []; + foreach ($this->rows->listOf(results: $results) as $row) { + $data = $this->rows->dataOf(row: $row); + $id = $this->rows->idOf(row: $row); + if ($id !== '' && ($data['externalRef'] ?? null) === $externalRef && ($data['sourceSystem'] ?? null) === $sourceSystem) { + $matches[] = ['id' => $id, 'data' => $data]; + } + } + + if (count($matches) > 1) { + $this->logger->warning( + '[TimetableSessionService] More than one session stored for {source}/{ref}; updating the first.', + ['source' => $sourceSystem, 'ref' => $externalRef] + ); + } + + return ($matches[0] ?? null); + }//end findExisting() + + /** + * Whether every field the incoming row carries already holds that value. + * + * Times are compared as moments, so the same lesson written with another + * offset or format is still unchanged. + * + * @param array $stored The stored session data. + * @param array $incoming The normalised incoming row. + * + * @return bool + */ + private function isUnchanged(array $stored, array $incoming): bool { + foreach ($incoming as $field => $value) { + if ($this->fieldIsUnchanged(field: $field, current: ($stored[$field] ?? null), value: (string)$value) === false) { + return false; + } + } + + return true; + }//end isUnchanged() + + /** + * Whether one stored field already holds the incoming value. + * + * @param string $field The field name. + * @param mixed $current The stored value. + * @param string $value The incoming value. + * + * @return bool + */ + private function fieldIsUnchanged(string $field, mixed $current, string $value): bool { + if (in_array($field, self::DATE_FIELDS, true) === true) { + return is_string($current) === true && strtotime($current) === strtotime($value); + } + + if ($field === 'status') { + return ($current ?? 'scheduled') === $value; + } + + return is_scalar($current ?? '') === true && (string)($current ?? '') === $value; + }//end fieldIsUnchanged() + + /** + * Keep only the session fields of a stored row, dropping OpenRegister metadata. + * + * @param array $data The stored data. + * + * @return array + */ + private function storedFields(array $data): array { + $fields = array_merge(self::WRITABLE_FIELDS, ['sourceSystem', 'importedAt']); + return array_intersect_key($data, array_flip($fields)); + }//end storedFields() + + /** + * Save one session and return its id, or null when OpenRegister refused. + * + * Written with RBAC off: this service is reached only through planninq's + * own listener (in-process server code) or the admin-only endpoint. + * + * @param object $objectService The OpenRegister ObjectService. + * @param array $data The session data. + * @param string|null $uuid The stored id to update, or null to create. + * + * @return string|null + */ + private function save(object $objectService, array $data, ?string $uuid): ?string { + try { + $saved = $objectService->saveObject( + object: $data, + register: self::REGISTER, + schema: self::SCHEMA, + uuid: $uuid, + _rbac: false + ); + } catch (Throwable $e) { + $this->logger->error( + '[TimetableSessionService] Saving {ref} failed: {message}', + ['ref' => ($data['externalRef'] ?? ''), 'message' => $e->getMessage()] + ); + return null; + } + + if ($saved === null) { + return null; + } + + $id = $this->rows->idOf(row: $saved); + if ($id !== '') { + return $id; + } + + return $uuid; + }//end save() + + /** + * Resolve OpenRegister's ObjectService, cleared of any earlier caller's scope. + * + * @return object + * + * @throws RuntimeException When OpenRegister is not available. + */ + private function objectService(): object { + try { + $objectService = $this->container->get(self::OR_OBJECT_SERVICE); + } catch (Throwable $e) { + throw new RuntimeException('OpenRegister is not available.', 0, $e); + } + + // The ObjectService is shared per request; drop any register or schema + // an earlier caller left on it (openregister#2820, see TimelineController). + if (method_exists($objectService, 'clearCurrents') === true) { + $objectService->clearCurrents(); + } + + return $objectService; + }//end objectService() + + /** + * Build one rejection entry. + * + * @param mixed $externalRef The row's occurrence id, when it has one. + * @param string $code The contract's rejection code. + * @param string $message A readable reason. + * + * @return array{externalRef:string|null,errorCode:string,errorMessage:string} + */ + private function rejection(mixed $externalRef, string $code, string $message): array { + $ref = null; + if (is_scalar($externalRef) === true && (string)$externalRef !== '') { + $ref = (string)$externalRef; + } + + return ['externalRef' => $ref, 'errorCode' => $code, 'errorMessage' => $message]; + }//end rejection() +}//end class diff --git a/lib/Service/WorkItemKeyService.php b/lib/Service/WorkItemKeyService.php new file mode 100644 index 00000000..375697a0 --- /dev/null +++ b/lib/Service/WorkItemKeyService.php @@ -0,0 +1,348 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.2 + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCP\Lock\ILockingProvider; +use OCP\Lock\LockedException; +use Psr\Container\ContainerInterface; +use Psr\Log\LoggerInterface; + +/** + * Project keys and the task numbers drawn from them. + */ +class WorkItemKeyService { + + /** + * Prefix of the per-project lock around the counter. + * + * @var string + */ + public const LOCK_PREFIX = 'planninq/task-key/'; + + /** + * The project field that holds the next task number. + * + * @var string + */ + public const COUNTER = 'nextTaskNumber'; + + /** + * Attempts to take the lock before a create is refused. + * + * @var integer + */ + private const LOCK_ATTEMPTS = 50; + + /** + * Microseconds between two lock attempts. + * + * @var integer + */ + private const LOCK_WAIT = 20000; + + /** + * OpenRegister's system-operation scope. + * + * @var string + */ + private const OR_SYSTEM_CONTEXT = 'OCA\\OpenRegister\\Service\\SystemOperationContext'; + + /** + * Constructor. + * + * @param ProjectMembershipService $membership Reads projects and tasks as the system. + * @param ContainerInterface $container Resolves OpenRegister's ObjectService. + * @param ILockingProvider $locking The per-project counter lock. + * @param LoggerInterface $logger The logger. + */ + public function __construct( + private ProjectMembershipService $membership, + private ContainerInterface $container, + private ILockingProvider $locking, + private LoggerInterface $logger, + ) { + }//end __construct() + + /** + * A key as it is stored: trimmed and uppercase. + * + * @param mixed $key The key as sent. + * + * @return string + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.2 + */ + public function normalise(mixed $key): string { + if (is_string($key) === false) { + return ''; + } + + return strtoupper(trim($key)); + }//end normalise() + + /** + * Whether a stored key has the project key format. + * + * @param string $key The normalised key. + * + * @return bool + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.2 + */ + public function isValidFormat(string $key): bool { + return preg_match('/^[A-Z][A-Z0-9]{1,9}$/', $key) === 1; + }//end isValidFormat() + + /** + * Whether another project already uses a key, whether or not the caller can read it. + * + * @param string $key The normalised key. + * @param string $projectId The project that may keep its own key. + * + * @return bool + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.2 + */ + public function isTaken(string $key, string $projectId = ''): bool { + foreach ($this->membership->rows(schema: ProjectMembershipService::PROJECT_SCHEMA, filters: ['key' => $key]) as $row) { + if ($row['id'] !== $projectId) { + return true; + } + } + + return false; + }//end isTaken() + + /** + * Whether a project has numbered any task, after which its key stays. + * + * @param array $project The stored project. + * + * @return bool + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-1.3 + */ + public function hasNumberedTasks(array $project): bool { + return (int)($project[self::COUNTER] ?? 0) > 1; + }//end hasNumberedTasks() + + /** + * The key for a new task in a project, or null when the project has no key. + * + * @param string $projectId The project UUID. + * + * @return string|null + * + * @throws LockedException When the counter stays locked by other creates. + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.2 + */ + public function nextTaskKey(string $projectId): ?string { + $keys = $this->reserve(projectId: $projectId, count: 1); + + return ($keys[0] ?? null); + }//end nextTaskKey() + + /** + * Give a project's keyless tasks keys, oldest first; tasks with a key keep it. + * + * @param string $projectId The project UUID. + * + * @return int The number of tasks numbered. + * + * @throws LockedException When the counter stays locked by other creates. + * + * @spec openspec/changes/tasks-readable-keys/tasks.md#task-2.3 + */ + public function numberTasks(string $projectId): int { + $tasks = array_values( + array_filter( + $this->tasksOf(projectId: $projectId), + static fn (array $task): bool => trim((string)($task['data']['key'] ?? '')) === '' + ) + ); + if ($tasks === []) { + return 0; + } + + $keys = $this->reserve(projectId: $projectId, count: count($tasks)); + foreach ($keys as $index => $key) { + $task = $tasks[$index]; + $this->writeAsSystem(schema: 'task', uuid: $task['id'], data: array_merge($task['data'], ['key' => $key])); + } + + return count($keys); + }//end numberTasks() + + /** + * Take a run of numbers from a project's counter under its lock. + * + * @param string $projectId The project UUID. + * @param int $count How many numbers. + * + * @return array The keys, empty when the project has no key. + * + * @throws LockedException When the counter stays locked. + */ + private function reserve(string $projectId, int $count): array { + $path = self::LOCK_PREFIX . $projectId; + $this->lock(path: $path); + + try { + $project = $this->membership->objectData(schema: ProjectMembershipService::PROJECT_SCHEMA, id: $projectId); + $key = $this->normalise(key: ($project['key'] ?? null)); + if ($project === null || $key === '') { + return []; + } + + $next = (int)($project[self::COUNTER] ?? 0); + if ($next < 1) { + $next = ($this->highestNumber(projectId: $projectId, key: $key) + 1); + } + + $keys = []; + for ($offset = 0; $offset < $count; $offset++) { + $keys[] = $key . '-' . ($next + $offset); + } + + $this->writeAsSystem( + schema: ProjectMembershipService::PROJECT_SCHEMA, + uuid: $projectId, + data: array_merge($project, [self::COUNTER => ($next + $count)]) + ); + + return $keys; + } finally { + $this->locking->releaseLock($path, ILockingProvider::LOCK_EXCLUSIVE); + } + }//end reserve() + + /** + * Take the lock, waiting a moment for a create that holds it. + * + * @param string $path The lock path. + * + * @return void + * + * @throws LockedException When it stays held. + */ + private function lock(string $path): void { + for ($attempt = 1; $attempt <= self::LOCK_ATTEMPTS; $attempt++) { + try { + $this->locking->acquireLock($path, ILockingProvider::LOCK_EXCLUSIVE, 'planninq task numbers'); + return; + } catch (LockedException $e) { + if ($attempt === self::LOCK_ATTEMPTS) { + throw $e; + } + + usleep(self::LOCK_WAIT); + } + } + }//end lock() + + /** + * The highest number among the project's task keys that start with its key. + * + * @param string $projectId The project UUID. + * @param string $key The project key. + * + * @return int + */ + private function highestNumber(string $projectId, string $key): int { + $highest = 0; + $pattern = '/^' . preg_quote($key, '/') . '-(\d+)$/'; + foreach ($this->tasksOf(projectId: $projectId) as $task) { + if (preg_match($pattern, (string)($task['data']['key'] ?? ''), $match) === 1) { + $highest = max($highest, (int)$match[1]); + } + } + + return $highest; + }//end highestNumber() + + /** + * The tasks of a project, in the order the register returns them (creation order). + * + * @param string $projectId The project UUID. + * + * @return array}> + */ + private function tasksOf(string $projectId): array { + return $this->membership->rows(schema: 'task', filters: ['project' => $projectId]); + }//end tasksOf() + + /** + * Write an object as the system: no RBAC, no events, so the counter guard lets it through. + * + * @param string $schema The schema slug. + * @param string $uuid The object UUID. + * @param array $data The full object data. + * + * @return void + */ + private function writeAsSystem(string $schema, string $uuid, array $data): void { + if ($this->openRegisterAvailable() === false) { + $this->logger->warning('Planninq: OpenRegister is not installed; task numbers not written', ['schema' => $schema]); + return; + } + + $objectService = $this->container->get('OCA\\OpenRegister\\Service\\ObjectService'); + $write = static fn () => $objectService->saveObject( + object: $data, + register: ProjectMembershipService::REGISTER, + schema: $schema, + uuid: $uuid, + _rbac: false, + _multitenancy: false, + silent: true, + _validation: false + ); + + $class = self::OR_SYSTEM_CONTEXT; + if (class_exists($class) === false) { + $this->logger->warning('Planninq: OpenRegister has no system-operation scope; task numbers written without it', ['schema' => $schema]); + $write(); + return; + } + + $class::run($write); + }//end writeAsSystem() + + /** + * Whether OpenRegister is installed, so there is anything to write. + * + * @return bool + */ + private function openRegisterAvailable(): bool { + return $this->membership->isAvailable(); + }//end openRegisterAvailable() +}//end class diff --git a/lib/Service/WorkingCalendarService.php b/lib/Service/WorkingCalendarService.php new file mode 100644 index 00000000..ca6b0ece --- /dev/null +++ b/lib/Service/WorkingCalendarService.php @@ -0,0 +1,216 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * @spec openspec/changes/archive/2026-09-30-planning-timeline-editing/tasks.md#task-1.1 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Service; + +use OCA\Planninq\AppInfo\Application; +use OCP\IAppConfig; +use Psr\Log\LoggerInterface; + +/** + * Reads, validates and stores the working weekdays and non-working days. + * + * @spec openspec/changes/archive/2026-09-30-planning-timeline-editing/tasks.md#task-1.1 + */ +class WorkingCalendarService { + + /** + * The working weekdays, a JSON list of ISO weekday numbers (1 Monday to 7 Sunday). + */ + public const WEEKDAYS_KEY = 'working_weekdays'; + + /** + * The non-working days, a JSON list of {date: YYYY-MM-DD, name}. + */ + public const DAYS_KEY = 'non_working_days'; + + /** + * Monday to Friday. + */ + public const DEFAULT_WEEKDAYS = '[1,2,3,4,5]'; + + /** + * The longest name a non-working day may carry. + */ + private const NAME_MAX = 100; + + /** + * Constructor. + * + * @param IAppConfig $appConfig The app config. + * @param LoggerInterface $logger Logs a rejected value. + */ + public function __construct( + private readonly IAppConfig $appConfig, + private readonly LoggerInterface $logger, + ) { + }//end __construct() + + /** + * Both keys, as stored or their defaults. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-planning-timeline-editing/tasks.md#task-1.1 + */ + public function settings(): array { + return [ + self::WEEKDAYS_KEY => $this->appConfig->getValueString(Application::APP_ID, self::WEEKDAYS_KEY, self::DEFAULT_WEEKDAYS), + self::DAYS_KEY => $this->appConfig->getValueString(Application::APP_ID, self::DAYS_KEY, '[]'), + ]; + }//end settings() + + /** + * Store the keys present in an admin settings write; a malformed value is logged and not stored. + * + * @param array $data The posted settings. + * + * @return void + * + * @spec openspec/changes/archive/2026-09-30-planning-timeline-editing/tasks.md#task-1.1 + */ + public function save(array $data): void { + $checks = [ + self::WEEKDAYS_KEY => fn (mixed $raw): ?string => $this->normaliseWeekdays(raw: $raw), + self::DAYS_KEY => fn (mixed $raw): ?string => $this->normaliseDays(raw: $raw), + ]; + foreach ($checks as $key => $check) { + if (array_key_exists($key, $data) === false) { + continue; + } + + $value = $check($data[$key]); + if ($value === null) { + $this->logger->warning('Planninq: invalid ' . $key . ' value rejected', ['raw' => $data[$key]]); + continue; + } + + $this->appConfig->setValueString(Application::APP_ID, $key, $value); + } + }//end save() + + /** + * The weekdays as a sorted JSON list, or null when malformed. + * + * @param mixed $raw JSON text or a list. + * + * @return string|null + * + * @spec openspec/changes/archive/2026-09-30-planning-timeline-editing/tasks.md#task-1.1 + */ + public function normaliseWeekdays(mixed $raw): ?string { + $days = $this->decode(raw: $raw); + if ($days === null || $days === [] || array_is_list($days) === false) { + return null; + } + + foreach ($days as $day) { + if (is_int($day) === false || $day < 1 || $day > 7) { + return null; + } + } + + $days = array_values(array_unique($days)); + sort($days); + + return (string)json_encode($days); + }//end normaliseWeekdays() + + /** + * The non-working days as a JSON list sorted by date, or null when malformed. + * + * @param mixed $raw JSON text or a list. + * + * @return string|null + * + * @spec openspec/changes/archive/2026-09-30-planning-timeline-editing/tasks.md#task-1.1 + */ + public function normaliseDays(mixed $raw): ?string { + $days = $this->decode(raw: $raw); + if ($days === null || array_is_list($days) === false) { + return null; + } + + $clean = []; + foreach ($days as $day) { + $entry = $this->entry(day: $day); + if ($entry === null) { + return null; + } + + $clean[$entry['date']] = $entry; + } + + ksort($clean); + + return (string)json_encode(array_values($clean), JSON_UNESCAPED_UNICODE); + }//end normaliseDays() + + /** + * One non-working day, or null when it is not a real date with a short name. + * + * @param mixed $day The entry. + * + * @return array{date: string, name: string}|null + */ + private function entry(mixed $day): ?array { + if (is_array($day) === false || is_string($day['date'] ?? null) === false) { + return null; + } + + $date = $day['date']; + if (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $date, $parts) !== 1 || checkdate((int)$parts[2], (int)$parts[3], (int)$parts[1]) === false) { + return null; + } + + $name = $day['name'] ?? ''; + if (is_string($name) === false || mb_strlen($name) > self::NAME_MAX) { + return null; + } + + return ['date' => $date, 'name' => trim($name)]; + }//end entry() + + /** + * JSON text or an array as an array, or null. + * + * @param mixed $raw The value. + * + * @return array|null + */ + private function decode(mixed $raw): ?array { + if (is_string($raw) === true) { + $raw = json_decode($raw, true); + } + + if (is_array($raw) === false) { + return null; + } + + return $raw; + }//end decode() +}//end class diff --git a/lib/Settings/integriq/planninq-code-forge.json b/lib/Settings/integriq/planninq-code-forge.json new file mode 100644 index 00000000..f985c6a5 --- /dev/null +++ b/lib/Settings/integriq/planninq-code-forge.json @@ -0,0 +1,68 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "Planninq code forge links", + "description": "Links GitHub commits and pull requests to planninq tasks. Import it in integriq, then add the webhook URL and secret in GitHub. Integriq writes a forgeLink with the forge text in taskKey; planninq finds the task key in it. See planninq's admin settings, Code forges.", + "version": "1.0.0", + "x-planninq-change": "openspec/changes/archive/2026-09-30-integration-code-forge-links" + }, + "components": { + "mappings": { + "planninq-github-forge-link": { + "name": "GitHub event to planninq code link", + "slug": "planninq-github-forge-link", + "description": "A push (its head commit) or a pull request event becomes one planninq forgeLink. A later event about the same pull request carries the same externalId, and planninq replaces the older link.", + "version": "1.0.0", + "mapping": { + "taskKey": "{% if pull_request is defined %}{{ pull_request.title }} {{ pull_request.head.ref }}{% else %}{{ head_commit.message }} {{ ref }}{% endif %}", + "kind": "{% if pull_request is defined %}mergeRequest{% else %}commit{% endif %}", + "url": "{% if pull_request is defined %}{{ pull_request.html_url }}{% else %}{{ head_commit.url }}{% endif %}", + "title": "{% if pull_request is defined %}{{ pull_request.title }}{% else %}{{ head_commit.message|split(\"\\n\")|first }}{% endif %}", + "repository": "{{ repository.full_name }}", + "externalId": "{% if pull_request is defined %}github:{{ repository.full_name }}#{{ pull_request.number }}{% else %}{{ head_commit.id }}{% endif %}", + "state": "{% if pull_request is defined %}{% if pull_request.merged %}merged{% else %}{{ pull_request.state }}{% endif %}{% endif %}", + "author": "{% if pull_request is defined %}{{ pull_request.user.login }}{% else %}{{ head_commit.author.username|default(head_commit.author.name) }}{% endif %}", + "occurredAt": "{% if pull_request is defined %}{{ pull_request.updated_at }}{% else %}{{ head_commit.timestamp }}{% endif %}", + "source": "integriq" + }, + "unset": [], + "cast": {}, + "passThrough": false + } + }, + "rules": { + "planninq-github-signature": { + "name": "Check the GitHub signature", + "slug": "planninq-github-signature", + "description": "Refuses a delivery whose X-Hub-Signature-256 does not match the secret. Fill in the secret after the import; it is the one you enter in GitHub.", + "version": "1.0.0", + "type": "webhook_signature", + "action": "verify", + "timing": "before", + "order": 0, + "conditions": {}, + "configuration": { + "scheme": "github", + "header": "X-Hub-Signature-256", + "secret": "" + } + } + }, + "endpoints": { + "planninq-github-webhook": { + "name": "GitHub webhook for planninq", + "slug": "planninq-github-webhook", + "description": "Receives GitHub push and pull request events and writes planninq code links.", + "version": "1.0.0", + "endpoint": "planninq/code-forge/github", + "method": "POST", + "targetType": "register/schema", + "targetId": "planninq/forgeLink", + "inputMapping": "planninq-github-forge-link", + "rules": [ + "planninq-github-signature" + ] + } + } + } +} diff --git a/lib/Settings/planninq_mock_register.json b/lib/Settings/planninq_mock_register.json index 60637a1b..e0dd3ac7 100644 --- a/lib/Settings/planninq_mock_register.json +++ b/lib/Settings/planninq_mock_register.json @@ -3,12 +3,14 @@ "info": { "title": "planninq demo data", "version": "1.0.0", - "description": "Demo data covering every schema this app supplies, offered as the first step of the app's setup walkthrough. Generated from the schemas themselves, so every object satisfies the schema that will validate it." + "description": "Example data for planninq: three projects with their boards, phases, tasks, dependencies, logged time, risks, status reports, finance lines and portfolios, plus a few timetable sessions. Every person in it is the admin who loads it, and every date is placed around the day it is loaded." }, "x-openregister": { "type": "mock", "app": "planninq", - "description": "Demo data for planninq. NOT installed automatically — a mock register is imported on demand, from the setup walkthrough or `occ openregister:descriptors:list --app=planninq --import=`." + "description": "Demo data for planninq. NOT installed automatically — a mock register is imported on demand, from the setup walkthrough or `occ openregister:descriptors:list --app=planninq --import=`.", + "anchorDate": "2026-10-01", + "operatorPlaceholder": "@operator" }, "paths": {}, "components": { @@ -20,1168 +22,1829 @@ "description": "Demo data for Planninq. Generated from the register's own schemas — see hydra-gates/scripts/lib/generate_mock_register.py." } }, - "schemas": { - "column": { - "slug": "column", - "icon": "ViewColumnOutline", - "version": "0.1.2", - "title": "Column", - "description": "A kanban column belonging to a project. Maps to schema:DefinedTerm.", - "x-schema-org": "schema:DefinedTerm", - "type": "object", - "required": [ - "title", - "project", - "order" - ], - "authorization": { - "read": [ - { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - }, - { - "group": "admin" - } - ], - "create": [ - { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - }, - { - "group": "admin" - } - ], - "update": [ - { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - }, - { - "group": "admin" - } - ], - "delete": [ - { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - }, - { - "group": "admin" - } - ] + "objects": [ + { + "@self": { + "register": "planninq", + "schema": "projectPortfolio", + "slug": "demo-digital-services", + "id": "0000de00-0000-4000-8000-000c00000001" + }, + "title": "Digital services", + "description": "Projects that change how residents and clients reach us online.", + "color": "#4376FC", + "managers": [ + "@operator" + ], + "order": 0 + }, + { + "@self": { + "register": "planninq", + "schema": "projectPortfolio", + "slug": "demo-infrastructure", + "id": "0000de00-0000-4000-8000-000c00000002" + }, + "title": "Infrastructure", + "description": "Hosting, networks and the platforms other projects run on.", + "color": "#F39C12", + "managers": [ + "@operator" + ], + "order": 1 + }, + { + "@self": { + "register": "planninq", + "schema": "projectPortfolio", + "slug": "demo-internal-operations", + "id": "0000de00-0000-4000-8000-000c00000003" + }, + "title": "Internal operations", + "description": "Work that makes our own teams faster.", + "color": "#27AE60", + "managers": [ + "@operator" + ], + "order": 2 + }, + { + "@self": { + "register": "planninq", + "schema": "label", + "slug": "demo-accessibility", + "id": "0000de00-0000-4000-8000-000700000001" + }, + "title": "Accessibility", + "color": "#8E44AD", + "description": "Needed to meet WCAG 2.2 AA" + }, + { + "@self": { + "register": "planninq", + "schema": "label", + "slug": "demo-security", + "id": "0000de00-0000-4000-8000-000700000002" + }, + "title": "Security", + "color": "#C0392B", + "description": "Affects login, access or data protection" + }, + { + "@self": { + "register": "planninq", + "schema": "label", + "slug": "demo-tech-debt", + "id": "0000de00-0000-4000-8000-000700000003" + }, + "title": "Tech debt", + "color": "#7F8C8D", + "description": "Cleanup that keeps later work cheap" + }, + { + "@self": { + "register": "planninq", + "schema": "projectField", + "slug": "demo-field-department", + "id": "0000de00-0000-4000-8000-000e00000001" + }, + "key": "department", + "label": "Department", + "type": "text", + "order": 0 + }, + { + "@self": { + "register": "planninq", + "schema": "projectField", + "slug": "demo-field-contract-type", + "id": "0000de00-0000-4000-8000-000e00000002" + }, + "key": "contractType", + "label": "Contract type", + "type": "choice", + "options": [ + "In-house", + "Supplier", + "Mixed" + ], + "order": 1 + }, + { + "@self": { + "register": "planninq", + "schema": "projectField", + "slug": "demo-field-go-live", + "id": "0000de00-0000-4000-8000-000e00000003" + }, + "key": "goLiveDate", + "label": "Go-live date", + "type": "date", + "order": 2 + }, + { + "@self": { + "register": "planninq", + "schema": "project", + "slug": "demo-client-portal-v2", + "id": "0000de00-0000-4000-8000-000100000001" + }, + "title": "Client Portal v2", + "description": "Redesign and rebuild the self-service client portal with NL Design System components.", + "status": "active", + "color": "#4376FC", + "icon": "Web", + "owner": "@operator", + "members": [ + "@operator" + ], + "portfolio": "0000de00-0000-4000-8000-000c00000001", + "key": "EXPORTAL", + "defaultAssignee": "@operator", + "startDate": "2026-09-01", + "endDate": "2026-11-05", + "budgetHours": 600, + "budgetAmount": 120000, + "customFields": { + "department": "Customer contact", + "contractType": "Mixed", + "goLiveDate": "2026-11-05" + } + }, + { + "@self": { + "register": "planninq", + "schema": "project", + "slug": "demo-infrastructure-migration", + "id": "0000de00-0000-4000-8000-000100000002" + }, + "title": "Infrastructure Migration", + "description": "Move the on-premise services to a managed Kubernetes cluster.", + "status": "active", + "color": "#F39C12", + "icon": "CloudUpload", + "owner": "@operator", + "members": [ + "@operator" + ], + "portfolio": "0000de00-0000-4000-8000-000c00000002", + "key": "EXINFRA", + "startDate": "2026-09-17", + "endDate": "2026-11-30", + "budgetHours": 400, + "budgetAmount": 80000, + "customFields": { + "department": "IT operations", + "contractType": "Supplier", + "goLiveDate": "2026-11-30" + } + }, + { + "@self": { + "register": "planninq", + "schema": "project", + "slug": "demo-onboarding-automation", + "id": "0000de00-0000-4000-8000-000100000003" + }, + "title": "Onboarding Automation", + "description": "Automate the onboarding of new colleagues with n8n and Nextcloud.", + "status": "active", + "color": "#27AE60", + "icon": "AccountMultiplePlus", + "owner": "@operator", + "members": [ + "@operator" + ], + "portfolio": "0000de00-0000-4000-8000-000c00000003", + "key": "EXONBOARD", + "startDate": "2026-09-24", + "endDate": "2026-11-15", + "budgetHours": 160, + "budgetAmount": 20000, + "customFields": { + "department": "HR", + "contractType": "In-house" + } + }, + { + "@self": { + "register": "planninq", + "schema": "projectPhase", + "slug": "demo-portal-design", + "id": "0000de00-0000-4000-8000-000400000001" + }, + "title": "Design", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "status": "completed", + "order": 0, + "startDate": "2026-09-01", + "endDate": "2026-09-26", + "budgetHours": 120, + "concludingDocument": "Design sign-off" + }, + { + "@self": { + "register": "planninq", + "schema": "projectPhase", + "slug": "demo-portal-build", + "id": "0000de00-0000-4000-8000-000400000002" + }, + "title": "Build", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "status": "in_progress", + "order": 1, + "startDate": "2026-09-27", + "endDate": "2026-10-21", + "budgetHours": 380 + }, + { + "@self": { + "register": "planninq", + "schema": "projectPhase", + "slug": "demo-portal-launch", + "id": "0000de00-0000-4000-8000-000400000003" + }, + "title": "Launch", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "status": "open", + "order": 2, + "startDate": "2026-10-22", + "endDate": "2026-11-05", + "budgetHours": 100 + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-portal-to-do", + "id": "0000de00-0000-4000-8000-000200000001" + }, + "title": "To do", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "order": 0, + "wipLimit": null, + "type": "active", + "status": "open" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-portal-in-progress", + "id": "0000de00-0000-4000-8000-000200000002" + }, + "title": "In progress", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "order": 1, + "wipLimit": 3, + "type": "active", + "status": "in_progress" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-portal-review", + "id": "0000de00-0000-4000-8000-000200000003" + }, + "title": "Review", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "order": 2, + "wipLimit": 2, + "type": "active", + "status": "in_progress" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-portal-done", + "id": "0000de00-0000-4000-8000-000200000004" + }, + "title": "Done", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "order": 3, + "wipLimit": null, + "type": "done", + "status": "done" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-infra-to-do", + "id": "0000de00-0000-4000-8000-000200000005" + }, + "title": "To do", + "project": "0000de00-0000-4000-8000-000100000002", + "members": [ + "@operator" + ], + "order": 0, + "wipLimit": null, + "type": "active", + "status": "open" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-infra-in-progress", + "id": "0000de00-0000-4000-8000-000200000006" + }, + "title": "In progress", + "project": "0000de00-0000-4000-8000-000100000002", + "members": [ + "@operator" + ], + "order": 1, + "wipLimit": 3, + "type": "active", + "status": "in_progress" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-infra-review", + "id": "0000de00-0000-4000-8000-000200000007" + }, + "title": "Review", + "project": "0000de00-0000-4000-8000-000100000002", + "members": [ + "@operator" + ], + "order": 2, + "wipLimit": 2, + "type": "active", + "status": "in_progress" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-infra-done", + "id": "0000de00-0000-4000-8000-000200000008" + }, + "title": "Done", + "project": "0000de00-0000-4000-8000-000100000002", + "members": [ + "@operator" + ], + "order": 3, + "wipLimit": null, + "type": "done", + "status": "done" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-onboard-to-do", + "id": "0000de00-0000-4000-8000-000200000009" + }, + "title": "To do", + "project": "0000de00-0000-4000-8000-000100000003", + "members": [ + "@operator" + ], + "order": 0, + "wipLimit": null, + "type": "active", + "status": "open" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-onboard-in-progress", + "id": "0000de00-0000-4000-8000-000200000010" + }, + "title": "In progress", + "project": "0000de00-0000-4000-8000-000100000003", + "members": [ + "@operator" + ], + "order": 1, + "wipLimit": 3, + "type": "active", + "status": "in_progress" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-onboard-review", + "id": "0000de00-0000-4000-8000-000200000011" + }, + "title": "Review", + "project": "0000de00-0000-4000-8000-000100000003", + "members": [ + "@operator" + ], + "order": 2, + "wipLimit": 2, + "type": "active", + "status": "in_progress" + }, + { + "@self": { + "register": "planninq", + "schema": "column", + "slug": "demo-onboard-done", + "id": "0000de00-0000-4000-8000-000200000012" + }, + "title": "Done", + "project": "0000de00-0000-4000-8000-000100000003", + "members": [ + "@operator" + ], + "order": 3, + "wipLimit": null, + "type": "done", + "status": "done" + }, + { + "@self": { + "register": "planninq", + "schema": "projectRelease", + "slug": "demo-release-portal-2-0", + "id": "0000de00-0000-4000-8000-000f00000001" + }, + "title": "Client Portal 2.0", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "description": "The new dashboard and the documented REST API.", + "startDate": "2026-09-21", + "releaseDate": "2026-10-30", + "status": "planned" + }, + { + "@self": { + "register": "planninq", + "schema": "projectRelease", + "slug": "demo-release-migration-cutover", + "id": "0000de00-0000-4000-8000-000f00000002" + }, + "title": "Cluster cutover", + "project": "0000de00-0000-4000-8000-000100000002", + "members": [ + "@operator" + ], + "description": "Every service runs on the new cluster.", + "startDate": "2026-09-14", + "releaseDate": "2026-11-13", + "status": "planned" + }, + { + "@self": { + "register": "planninq", + "schema": "projectRelease", + "slug": "demo-release-onboarding-pilot", + "id": "0000de00-0000-4000-8000-000f00000003" + }, + "title": "Onboarding pilot", + "project": "0000de00-0000-4000-8000-000100000003", + "members": [ + "@operator" + ], + "description": "The automated onboarding flow for the first department.", + "startDate": "2026-09-28", + "releaseDate": "2026-10-23", + "status": "planned" + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-design-dashboard-widgets", + "id": "0000de00-0000-4000-8000-000300000001" + }, + "project": "0000de00-0000-4000-8000-000100000001", + "column": "0000de00-0000-4000-8000-000200000004", + "columnOrder": 0, + "key": "EXPORTAL-1", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Design the dashboard widget layout", + "description": "Mock-ups for the widget dashboard, using NL Design System tokens.", + "status": "done", + "assignedTo": "@operator", + "phase": "0000de00-0000-4000-8000-000400000001", + "startDate": "2026-09-11", + "dueDate": "2026-09-23", + "completedAt": "2026-09-23T15:30:00+00:00", + "percentComplete": 100, + "labels": [ + "0000de00-0000-4000-8000-000700000001" + ], + "estimatedDuration": 480, + "priority": "normal", + "issueType": "task" + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-fix-login-redirect", + "id": "0000de00-0000-4000-8000-000300000002" + }, + "project": "0000de00-0000-4000-8000-000100000001", + "column": "0000de00-0000-4000-8000-000200000002", + "columnOrder": 0, + "key": "EXPORTAL-2", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Fix the redirect after login", + "description": "After signing in, people land on the start page instead of the page they asked for.", + "status": "in_progress", + "priority": "high", + "issueType": "bug", + "assignedTo": "@operator", + "phase": "0000de00-0000-4000-8000-000400000002", + "startDate": "2026-09-27", + "dueDate": "2026-09-29", + "percentComplete": 40, + "labels": [ + "0000de00-0000-4000-8000-000700000002" + ], + "estimatedDuration": 240 + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-build-dashboard-widgets", + "id": "0000de00-0000-4000-8000-000300000003" + }, + "project": "0000de00-0000-4000-8000-000100000001", + "column": "0000de00-0000-4000-8000-000200000001", + "columnOrder": 0, + "key": "EXPORTAL-3", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Build the dashboard widgets", + "description": "Build the four widgets from the approved layout.", + "status": "open", + "assignedTo": "@operator", + "phase": "0000de00-0000-4000-8000-000400000002", + "startDate": "2026-10-02", + "dueDate": "2026-10-08", + "labels": [ + "0000de00-0000-4000-8000-000700000001" + ], + "estimatedDuration": 960, + "checklist": [ + { + "id": "demo-1", + "text": "Open cases widget", + "done": true + }, + { + "id": "demo-2", + "text": "Appointments widget", + "done": false + }, + { + "id": "demo-3", + "text": "Messages widget", + "done": false + } + ], + "priority": "normal", + "issueType": "task", + "release": "0000de00-0000-4000-8000-000f00000001" + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-write-api-docs", + "id": "0000de00-0000-4000-8000-000300000004" + }, + "project": "0000de00-0000-4000-8000-000100000001", + "column": "0000de00-0000-4000-8000-000200000001", + "columnOrder": 1, + "key": "EXPORTAL-4", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Write the REST API documentation", + "description": "Describe every public endpoint in OpenAPI 3 and publish it on the developer portal.", + "status": "open", + "phase": "0000de00-0000-4000-8000-000400000002", + "startDate": "2026-10-03", + "dueDate": "2026-10-15", + "labels": [ + "0000de00-0000-4000-8000-000700000003" + ], + "estimatedDuration": 240, + "priority": "normal", + "issueType": "task", + "release": "0000de00-0000-4000-8000-000f00000001" + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-accessibility-review", + "id": "0000de00-0000-4000-8000-000300000005" + }, + "project": "0000de00-0000-4000-8000-000100000001", + "column": "0000de00-0000-4000-8000-000200000003", + "columnOrder": 0, + "key": "EXPORTAL-5", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Review the accessibility audit findings", + "description": "Go through the audit report and turn every finding into a task.", + "status": "in_progress", + "priority": "high", + "assignedTo": "@operator", + "phase": "0000de00-0000-4000-8000-000400000002", + "startDate": "2026-10-09", + "dueDate": "2026-10-13", + "percentComplete": 20, + "labels": [ + "0000de00-0000-4000-8000-000700000001" + ], + "issueType": "task" + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-k8s-namespaces", + "id": "0000de00-0000-4000-8000-000300000006" + }, + "project": "0000de00-0000-4000-8000-000100000002", + "column": "0000de00-0000-4000-8000-000200000005", + "columnOrder": 0, + "key": "EXINFRA-1", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Set up the production namespaces", + "description": "Namespaces, resource quotas and network policies for production.", + "status": "open", + "priority": "urgent", + "assignedTo": "@operator", + "startDate": "2026-10-01", + "dueDate": "2026-10-04", + "labels": [ + "0000de00-0000-4000-8000-000700000002" + ], + "estimatedDuration": 360, + "issueType": "task" + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-backup-policy", + "id": "0000de00-0000-4000-8000-000300000007" + }, + "project": "0000de00-0000-4000-8000-000100000002", + "column": "0000de00-0000-4000-8000-000200000006", + "columnOrder": 0, + "key": "EXINFRA-2", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Agree on the backup policy", + "description": "How often we back up, how long we keep it, and who tests a restore.", + "status": "in_progress", + "assignedTo": "@operator", + "startDate": "2026-09-26", + "dueDate": "2026-10-06", + "percentComplete": 60, + "priority": "normal", + "issueType": "task" + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-retire-old-servers", + "id": "0000de00-0000-4000-8000-000300000008" + }, + "project": "0000de00-0000-4000-8000-000100000002", + "column": "0000de00-0000-4000-8000-000200000005", + "columnOrder": 1, + "key": "EXINFRA-3", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Retire the old application servers", + "description": "Switch off the three servers once every service runs on the cluster.", + "status": "open", + "priority": "low", + "startDate": "2026-10-31", + "dueDate": "2026-11-25", + "labels": [ + "0000de00-0000-4000-8000-000700000003" + ], + "issueType": "task" + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-onboarding-workflow", + "id": "0000de00-0000-4000-8000-000300000009" + }, + "project": "0000de00-0000-4000-8000-000100000003", + "column": "0000de00-0000-4000-8000-000200000010", + "columnOrder": 0, + "key": "EXONBOARD-1", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Build the onboarding workflow", + "description": "Create the account, add it to its groups, send the welcome mail.", + "status": "in_progress", + "assignedTo": "@operator", + "startDate": "2026-09-28", + "dueDate": "2026-10-11", + "percentComplete": 30, + "estimatedDuration": 180, + "priority": "normal", + "issueType": "task" + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-welcome-mail-text", + "id": "0000de00-0000-4000-8000-000300000010" + }, + "project": "0000de00-0000-4000-8000-000100000003", + "column": "0000de00-0000-4000-8000-000200000009", + "columnOrder": 0, + "key": "EXONBOARD-2", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Write the welcome mail", + "description": "A short mail that tells a new colleague where to start.", + "status": "open", + "priority": "low", + "startDate": "2026-10-05", + "dueDate": "2026-10-10", + "issueType": "task" + }, + { + "@self": { + "register": "planninq", + "schema": "task", + "slug": "demo-first-day-checklist", + "id": "0000de00-0000-4000-8000-000300000011" + }, + "project": "0000de00-0000-4000-8000-000100000003", + "column": "0000de00-0000-4000-8000-000200000012", + "columnOrder": 0, + "key": "EXONBOARD-3", + "members": [ + "@operator" + ], + "reporter": "@operator", + "title": "Agree on the first-day checklist", + "description": "What a new colleague needs on day one, agreed with HR.", + "status": "done", + "assignedTo": "@operator", + "startDate": "2026-09-24", + "dueDate": "2026-09-27", + "completedAt": "2026-09-27T11:00:00+00:00", + "percentComplete": 100, + "priority": "normal", + "issueType": "task" + }, + { + "@self": { + "register": "planninq", + "schema": "dependency", + "slug": "demo-design-blocks-build", + "id": "0000de00-0000-4000-8000-000500000001" + }, + "blocker": "0000de00-0000-4000-8000-000300000001", + "blocked": "0000de00-0000-4000-8000-000300000003", + "type": "blocks" + }, + { + "@self": { + "register": "planninq", + "schema": "dependency", + "slug": "demo-build-blocks-review", + "id": "0000de00-0000-4000-8000-000500000002" + }, + "blocker": "0000de00-0000-4000-8000-000300000003", + "blocked": "0000de00-0000-4000-8000-000300000005", + "type": "blocks" + }, + { + "@self": { + "register": "planninq", + "schema": "dependency", + "slug": "demo-login-blocks-docs", + "id": "0000de00-0000-4000-8000-000500000003" + }, + "blocker": "0000de00-0000-4000-8000-000300000002", + "blocked": "0000de00-0000-4000-8000-000300000004", + "type": "blocks" + }, + { + "@self": { + "register": "planninq", + "schema": "plannedTimeEntry", + "slug": "demo-time-login-1", + "id": "0000de00-0000-4000-8000-000600000001" + }, + "task": "0000de00-0000-4000-8000-000300000002", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "user": "@operator", + "duration": 90, + "date": "2026-09-30", + "description": "Traced the redirect to a missing state parameter." + }, + { + "@self": { + "register": "planninq", + "schema": "plannedTimeEntry", + "slug": "demo-time-login-2", + "id": "0000de00-0000-4000-8000-000600000002" + }, + "task": "0000de00-0000-4000-8000-000300000002", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "user": "@operator", + "duration": 60, + "date": "2026-10-01", + "description": "Wrote the fix and its test." + }, + { + "@self": { + "register": "planninq", + "schema": "plannedTimeEntry", + "slug": "demo-time-backup", + "id": "0000de00-0000-4000-8000-000600000003" + }, + "task": "0000de00-0000-4000-8000-000300000007", + "project": "0000de00-0000-4000-8000-000100000002", + "members": [ + "@operator" + ], + "user": "@operator", + "duration": 45, + "date": "2026-09-29", + "description": "Listed what every service backs up today." + }, + { + "@self": { + "register": "planninq", + "schema": "projectLogEntry", + "slug": "demo-log-kickoff", + "id": "0000de00-0000-4000-8000-000900000001" + }, + "title": "Kick-off", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "type": "meeting", + "date": "2026-09-01", + "body": "Scope, planning and roles agreed.", + "status": "closed", + "attendees": [ + "@operator" + ] + }, + { + "@self": { + "register": "planninq", + "schema": "projectLogEntry", + "slug": "demo-log-design-choice", + "id": "0000de00-0000-4000-8000-000900000002" + }, + "title": "Use NL Design System components", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "type": "decision", + "date": "2026-09-16", + "body": "We build on the shared components instead of our own.", + "status": "closed" + }, + { + "@self": { + "register": "planninq", + "schema": "projectLogEntry", + "slug": "demo-log-audit-delay", + "id": "0000de00-0000-4000-8000-000900000003" + }, + "title": "Accessibility audit report came in late", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "type": "issue", + "date": "2026-09-28", + "body": "The report arrived a week later than planned, so the review moved.", + "status": "open", + "actions": [ + "0000de00-0000-4000-8000-000300000005" + ] + }, + { + "@self": { + "register": "planninq", + "schema": "risk", + "slug": "demo-risk-audit", + "id": "0000de00-0000-4000-8000-000a00000001" + }, + "title": "Audit findings take longer to fix than planned", + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "category": "Planning", + "likelihood": 3, + "impact": 4, + "score": 12, + "status": "open", + "owner": "@operator", + "response": "reduce", + "countermeasures": "Fix the blocking findings first and plan the rest in the next release.", + "reviewDate": "2026-10-08" + }, + { + "@self": { + "register": "planninq", + "schema": "risk", + "slug": "demo-risk-supplier", + "id": "0000de00-0000-4000-8000-000a00000002" + }, + "title": "The cluster supplier misses the delivery date", + "project": "0000de00-0000-4000-8000-000100000002", + "members": [ + "@operator" + ], + "category": "Supplier", + "likelihood": 2, + "impact": 5, + "score": 10, + "status": "mitigating", + "owner": "@operator", + "response": "transfer", + "countermeasures": "Penalty clause in the contract; weekly check-in.", + "reviewDate": "2026-10-15" + }, + { + "@self": { + "register": "planninq", + "schema": "risk", + "slug": "demo-risk-hr-capacity", + "id": "0000de00-0000-4000-8000-000a00000003" + }, + "title": "HR has no time to test the workflow", + "project": "0000de00-0000-4000-8000-000100000003", + "members": [ + "@operator" + ], + "category": "Capacity", + "likelihood": 2, + "impact": 2, + "score": 4, + "status": "open", + "owner": "@operator", + "response": "accept", + "reviewDate": "2026-10-22" + }, + { + "@self": { + "register": "planninq", + "schema": "projectStatusReport", + "slug": "demo-report-portal", + "id": "0000de00-0000-4000-8000-000b00000001" + }, + "project": "0000de00-0000-4000-8000-000100000001", + "members": [ + "@operator" + ], + "reportDate": "2026-09-28", + "overall": "atRisk", + "statusMoney": "onTrack", + "statusOrganisation": "onTrack", + "statusTime": "atRisk", + "statusInformation": "onTrack", + "statusQuality": "onTrack", + "statusRisk": "atRisk", + "noteTime": "The audit report came in a week late.", + "noteRisk": "Audit findings may take longer to fix." + }, + { + "@self": { + "register": "planninq", + "schema": "projectStatusReport", + "slug": "demo-report-infra", + "id": "0000de00-0000-4000-8000-000b00000002" }, - "properties": { - "title": { - "title": "Column Heading", - "type": "string", - "description": "Column heading (e.g. 'In Progress')" - }, - "project": { - "title": "Project", - "type": "string", - "description": "UUID of the parent Project", - "format": "uuid", - "$ref": "project" - }, - "order": { - "title": "Display Order", - "type": "integer", - "description": "Left-to-right display order (0-based)", - "default": 0 - }, - "wipLimit": { - "title": "WIP Limit", - "type": "integer", - "description": "Work-in-progress limit (null = unlimited)", - "nullable": true - }, - "color": { - "title": "Header Colour", - "type": "string", - "description": "Hex colour code for the column header", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - "type": { - "title": "Column Type", - "type": "string", - "description": "Functional type: active columns hold in-flight work; done columns auto-complete tasks", - "enum": [ - "active", - "done" - ], - "default": "active" - } - } + "project": "0000de00-0000-4000-8000-000100000002", + "members": [ + "@operator" + ], + "reportDate": "2026-09-28", + "overall": "onTrack", + "statusMoney": "onTrack", + "statusOrganisation": "onTrack", + "statusTime": "onTrack", + "statusInformation": "onTrack", + "statusQuality": "onTrack", + "statusRisk": "onTrack" }, - "dependency": { - "slug": "dependency", - "icon": "VectorPolyline", - "version": "0.2.0", - "title": "Dependency", - "description": "A directed dependency edge between two tasks of the same project (blocker → blocked). One row per directed edge. Maps to schema:Action.", - "x-schema-org": "schema:Action", - "type": "object", - "required": [ - "blocker", - "blocked" - ], - "authorization": { - "read": [ - { - "group": "authenticated" - }, - { - "group": "admin" - } - ], - "create": [ - "admin" - ], - "update": [ - "admin" - ], - "delete": [ - "admin" - ] + { + "@self": { + "register": "planninq", + "schema": "projectStatusReport", + "slug": "demo-report-onboarding", + "id": "0000de00-0000-4000-8000-000b00000003" }, - "properties": { - "blocker": { - "title": "Blocker Task", - "type": "string", - "description": "UUID of the task that blocks (must complete before the blocked task can proceed)", - "format": "uuid", - "$ref": "task" - }, - "blocked": { - "title": "Blocked Task", - "type": "string", - "description": "UUID of the task that is blocked (waits on the blocker)", - "format": "uuid", - "$ref": "task" - }, - "type": { - "title": "Link Type", - "type": "string", - "description": "Kind of relation the edge expresses. blocks keeps the original blocker/blocked semantics; other values model non-blocking links between work items.", - "enum": [ - "blocks", - "relates", - "duplicates", - "clones", - "splits", - "causes" - ], - "default": "blocks" - } - } + "project": "0000de00-0000-4000-8000-000100000003", + "members": [ + "@operator" + ], + "reportDate": "2026-09-28", + "overall": "atRisk", + "statusMoney": "onTrack", + "statusOrganisation": "atRisk", + "statusTime": "onTrack", + "statusInformation": "onTrack", + "statusQuality": "onTrack", + "statusRisk": "onTrack", + "noteOrganisation": "HR has little time to test before the go-live." }, - "label": { - "slug": "label", - "icon": "TagOutline", - "version": "0.1.0", - "title": "Label", - "description": "A colour-coded tag applicable to tasks and projects. Maps to schema:DefinedTerm.", - "x-schema-org": "schema:DefinedTerm", - "type": "object", - "required": [ - "title", - "color" - ], - "authorization": { - "read": [ - "authenticated" - ], - "create": [ - "admin" - ], - "update": [ - "admin" - ], - "delete": [ - "admin" - ] + { + "@self": { + "register": "planninq", + "schema": "financeLine", + "slug": "demo-finance-portal-budget", + "id": "0000de00-0000-4000-8000-000d00000001" }, - "properties": { - "title": { - "title": "Label Name", - "type": "string", - "description": "Label display name" - }, - "color": { - "title": "Colour", - "type": "string", - "description": "Hex colour for the label chip", - "pattern": "^#[0-9A-Fa-f]{6}$", - "default": "#4376FC" - }, - "description": { - "title": "Usage Guidance", - "type": "string", - "description": "Optional explanation of when to use this label" - } - } + "project": "0000de00-0000-4000-8000-000100000001", + "portfolio": "0000de00-0000-4000-8000-000c00000001", + "category": "Development", + "kind": "budget", + "amount": 120000, + "date": "2026-09-01", + "description": "Approved budget", + "source": "manual", + "projectKey": "EXPORTAL", + "financeReaders": [ + "@operator" + ], + "projectOwner": "@operator" + }, + { + "@self": { + "register": "planninq", + "schema": "financeLine", + "slug": "demo-finance-portal-actual", + "id": "0000de00-0000-4000-8000-000d00000002" + }, + "project": "0000de00-0000-4000-8000-000100000001", + "phase": "0000de00-0000-4000-8000-000400000001", + "portfolio": "0000de00-0000-4000-8000-000c00000001", + "category": "Development", + "kind": "actual", + "amount": 45250, + "date": "2026-09-26", + "description": "Design phase, invoiced", + "source": "manual", + "projectKey": "EXPORTAL", + "financeReaders": [ + "@operator" + ], + "projectOwner": "@operator" + }, + { + "@self": { + "register": "planninq", + "schema": "financeLine", + "slug": "demo-finance-infra-budget", + "id": "0000de00-0000-4000-8000-000d00000003" + }, + "project": "0000de00-0000-4000-8000-000100000002", + "portfolio": "0000de00-0000-4000-8000-000c00000002", + "category": "Hosting", + "kind": "budget", + "amount": 80000, + "date": "2026-09-17", + "description": "Approved budget", + "source": "manual", + "projectKey": "EXINFRA", + "financeReaders": [ + "@operator" + ], + "projectOwner": "@operator" + }, + { + "@self": { + "register": "planninq", + "schema": "timetableSession", + "slug": "demo-session-1", + "id": "0000de00-0000-4000-8000-000800000001" + }, + "externalRef": "demo-session-1", + "sourceSystem": "demo", + "subject": "Project planning", + "title": "Project planning, group 3B", + "startsAt": "2026-10-02T09:00:00+00:00", + "endsAt": "2026-10-02T10:30:00+00:00", + "groupReference": "3B", + "teacherUserId": "@operator", + "roomReference": "B1.04", + "roomLabel": "Room B1.04", + "status": "scheduled", + "importedAt": "2026-10-01T06:00:00+00:00" + }, + { + "@self": { + "register": "planninq", + "schema": "timetableSession", + "slug": "demo-session-2", + "id": "0000de00-0000-4000-8000-000800000002" + }, + "externalRef": "demo-session-2", + "sourceSystem": "demo", + "subject": "Project planning", + "title": "Project planning, group 3B", + "startsAt": "2026-10-09T09:00:00+00:00", + "endsAt": "2026-10-09T10:30:00+00:00", + "groupReference": "3B", + "teacherUserId": "@operator", + "roomReference": "B1.04", + "roomLabel": "Room B1.04", + "status": "scheduled", + "importedAt": "2026-10-01T06:00:00+00:00" + }, + { + "@self": { + "register": "planninq", + "schema": "timetableSession", + "slug": "demo-session-3", + "id": "0000de00-0000-4000-8000-000800000003" + }, + "externalRef": "demo-session-3", + "sourceSystem": "demo", + "subject": "Agile basics", + "title": "Agile basics, group 3B", + "startsAt": "2026-10-03T09:00:00+00:00", + "endsAt": "2026-10-03T10:30:00+00:00", + "groupReference": "3B", + "teacherUserId": "@operator", + "roomReference": "A0.12", + "roomLabel": "Room A0.12", + "status": "scheduled", + "importedAt": "2026-10-01T06:00:00+00:00" + }, + { + "@self": { + "register": "planninq", + "schema": "timetableWish", + "slug": "demo-wish-wednesday-afternoon", + "id": "0000de00-0000-4000-8000-001000000001" + }, + "appliesTo": "teacher", + "reference": "@operator", + "kind": "unavailable", + "periods": [ + "wed-5", + "wed-6", + "wed-7", + "wed-8" + ], + "strength": "hard", + "note": "Works elsewhere on Wednesday afternoon." + }, + { + "@self": { + "register": "planninq", + "schema": "timetableWish", + "slug": "demo-wish-no-last-period-friday", + "id": "0000de00-0000-4000-8000-001000000002" + }, + "appliesTo": "teacher", + "reference": "@operator", + "kind": "avoid", + "periods": [ + "fri-8" + ], + "strength": "soft", + "weight": 2, + "note": "Prefers to leave early on Friday." + }, + { + "@self": { + "register": "planninq", + "schema": "timetableWish", + "slug": "demo-wish-group-3b-six-a-day", + "id": "0000de00-0000-4000-8000-001000000003" + }, + "appliesTo": "group", + "reference": "3B", + "kind": "maxPerDay", + "limit": 6, + "strength": "soft", + "weight": 1, + "note": "Group 3B has at most six lessons a day." }, - "project": { - "slug": "project", - "icon": "FolderOutline", - "version": "0.2.0", - "title": "Project", - "description": "A container grouping related tasks and kanban columns. Maps to schema:CreativeWork.", - "x-schema-org": "schema:CreativeWork", - "type": "object", - "required": [ - "title", - "status" - ], - "authorization": { - "read": [ + { + "source": "generated", + "weekOf": "2026-10-05", + "windowFrom": "2026-10-05", + "windowTo": "2026-10-30", + "input": { + "periods": [ + "mon-1", + "mon-2", + "tue-1", + "tue-2", + "wed-5", + "fri-8" + ], + "rooms": [ { - "group": "authenticated", - "match": { - "members": { - "$contains": "$userId" - } - } + "reference": "B1.04", + "capacity": 30, + "type": "classroom" }, { - "group": "admin" + "reference": "A0.12", + "capacity": 24, + "type": "classroom" } ], - "create": [ - "admin" - ], - "update": [ + "lessons": [ + { + "key": "3B-planning-1", + "activity": "3B-planning", + "group": "3B", + "teacher": "@operator", + "roomType": "classroom", + "length": 1 + }, { - "group": "authenticated", - "match": { - "owner": "$userId" - } + "key": "3B-planning-2", + "activity": "3B-planning", + "group": "3B", + "teacher": "@operator", + "roomType": "classroom", + "length": 1 }, { - "group": "admin" + "key": "3B-agile-1", + "activity": "3B-agile", + "group": "3B", + "teacher": "@operator", + "roomType": "classroom", + "length": 1 } ], - "delete": [ - { - "group": "authenticated", - "match": { - "owner": "$userId" - } - }, + "wishes": [ { - "group": "admin" + "id": "0000de00-0000-4000-8000-001000000001", + "appliesTo": "teacher", + "reference": "@operator", + "kind": "unavailable", + "periods": [ + "wed-5", + "wed-6", + "wed-7", + "wed-8" + ], + "strength": "hard" } ] }, - "properties": { - "title": { - "title": "Project Name", - "type": "string", - "description": "Project name" - }, - "description": { - "title": "Description", - "type": "string", - "description": "Purpose and scope of the project" - }, - "status": { - "title": "Status", - "type": "string", - "description": "Project lifecycle status", - "enum": [ - "active", - "archived", - "completed" - ], - "default": "active" - }, - "color": { - "title": "Colour", - "type": "string", - "description": "Hex colour code for visual identification", - "pattern": "^#[0-9A-Fa-f]{6}$" - }, - "icon": { - "title": "Icon", - "type": "string", - "description": "Emoji or MDI icon name" - }, - "owner": { - "title": "Owner", - "type": "string", - "description": "Nextcloud user UID of the project creator. Set automatically on creation; used for delete authorization and creator-based RBAC." - }, - "members": { - "title": "Members", - "type": "array", - "description": "Nextcloud user UIDs of project members", - "items": { - "type": "string" - }, - "default": [] - }, - "contractorRefs": { - "title": "Contractors", - "type": "array", - "description": "UUID references to contractor contact/domain objects with portal visibility of this project — the portal-subject scoping key; distinct from members which are Nextcloud user ids", - "items": { - "type": "string", - "format": "uuid" - }, - "default": [] - }, - "defaultAssignee": { - "title": "Default Assignee", - "type": "string", - "description": "Nextcloud user UID who receives new tasks by default" - }, - "caseReference": { - "title": "Case Reference", - "type": "string", - "description": "UUID of a linked Procest case", - "format": "uuid", - "nullable": true - }, - "labels": { - "title": "Labels", - "type": "array", - "description": "UUIDs of Label objects available within this project", - "items": { - "type": "string", - "format": "uuid" - }, - "default": [] + "@self": { + "register": "planninq", + "schema": "timetableScenario", + "slug": "demo-scenario-autumn-first", + "id": "0000de00-0000-4000-8000-001100000001" + }, + "title": "Autumn, first run", + "status": "done", + "seed": 1, + "placements": [ + { + "lesson": "3B-planning-1", + "period": "mon-1", + "room": "B1.04" }, - "key": { - "title": "Key", - "type": "string", - "description": "Short unique project key used as the prefix of task keys (e.g. PLX). Preserved from the source system on import.", - "nullable": true + { + "lesson": "3B-planning-2", + "period": "tue-1", + "room": "B1.04" }, - "metadata": { - "title": "Metadata", - "type": "object", - "description": "Declared catch-all for source-system fields and provenance keys (e.g. jiraProjectId, migratedAt). Declared explicitly so magic-table storage persists it.", - "default": {} + { + "lesson": "3B-agile-1", + "period": "mon-2", + "room": "A0.12" } + ], + "unplaced": [], + "brokenWishes": [], + "metrics": { + "placed": 3, + "unplaced": 0, + "hardBroken": 0, + "softBroken": 0, + "softPenalty": 0 } }, - "task": { - "slug": "task", - "icon": "CheckboxMarkedCircleOutline", - "version": "0.2.0", - "title": "Task", - "description": "A discrete unit of work. Maps to iCalendar VTODO (RFC 5545) and schema:PlanAction.", - "x-schema-org": "schema:PlanAction", - "type": "object", - "required": [ - "title", - "status" - ], - "authorization": { - "read": [ + { + "source": "imported", + "weekOf": "2026-10-05", + "windowFrom": "2026-10-05", + "windowTo": "2026-10-30", + "input": { + "periods": [ + "mon-1", + "mon-2", + "tue-1", + "tue-2", + "wed-5", + "fri-8" + ], + "rooms": [ { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } + "reference": "B1.04", + "capacity": 30, + "type": "classroom" }, { - "group": "admin" + "reference": "A0.12", + "capacity": 24, + "type": "classroom" } ], - "create": [ + "lessons": [ { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } + "key": "3B-planning-1", + "activity": "3B-planning", + "group": "3B", + "teacher": "@operator", + "roomType": "classroom", + "length": 1 }, { - "group": "admin" - } - ], - "update": [ - { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } + "key": "3B-planning-2", + "activity": "3B-planning", + "group": "3B", + "teacher": "@operator", + "roomType": "classroom", + "length": 1 }, { - "group": "admin" + "key": "3B-agile-1", + "activity": "3B-agile", + "group": "3B", + "teacher": "@operator", + "roomType": "classroom", + "length": 1 } ], - "delete": [ - { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - }, + "wishes": [ { - "group": "admin" + "id": "0000de00-0000-4000-8000-001000000001", + "appliesTo": "teacher", + "reference": "@operator", + "kind": "unavailable", + "periods": [ + "wed-5", + "wed-6", + "wed-7", + "wed-8" + ], + "strength": "hard" } ] }, - "x-openregister-notifications": { - "taskDueSoon": { - "trigger": { - "type": "scheduled", - "intervalSec": 3600, - "filter": { - "dueDate": { - "operator": "withinNext", - "value": "PT24H" - }, - "status": { - "operator": "notEquals", - "value": "done" - } - } - }, - "enabled": true, - "channels": [ - "nc-notification" - ], - "recipients": [ - { - "kind": "field", - "field": "assignedTo" - } - ], - "subject": { - "en": "Task \"{{title}}\" is due soon", - "nl": "Taak \"{{title}}\" moet binnenkort af" - } - } + "@self": { + "register": "planninq", + "schema": "timetableScenario", + "slug": "demo-scenario-autumn-current", + "id": "0000de00-0000-4000-8000-001100000002" }, - "properties": { - "title": { - "title": "Task Title", - "type": "string", - "description": "Short title of the task" - }, - "description": { - "title": "Description", - "type": "string", - "description": "Detailed description" + "title": "Autumn, current timetable", + "status": "done", + "placements": [ + { + "lesson": "3B-planning-1", + "period": "mon-1", + "room": "B1.04" }, - "status": { - "title": "Status", - "type": "string", - "description": "Current lifecycle status", - "enum": [ - "open", - "in_progress", - "blocked", - "done", - "cancelled" - ], - "default": "open" + { + "lesson": "3B-planning-2", + "period": "fri-8", + "room": "B1.04" }, - "priority": { - "title": "Priority", - "type": "string", - "description": "Priority level", - "enum": [ - "low", - "normal", - "high", - "urgent" + { + "lesson": "3B-agile-1", + "period": "tue-2", + "room": "A0.12" + } + ], + "unplaced": [], + "brokenWishes": [ + { + "wish": "0000de00-0000-4000-8000-001000000002", + "lessons": [ + "3B-planning-2" ], - "default": "normal" - }, - "project": { - "title": "Project", - "type": "string", - "description": "UUID of the parent Project", - "format": "uuid", - "$ref": "project" - }, - "zaakUuid": { - "title": "Zaak UUID", - "type": "string", - "description": "UUID of a linked Procest zaak", - "format": "uuid", - "nullable": true - }, - "column": { - "title": "Column", - "type": "string", - "description": "UUID of the kanban Column (null = backlog)", - "format": "uuid", - "nullable": true, - "$ref": "column" - }, - "columnOrder": { - "title": "Column Order", - "type": "integer", - "description": "Sort order within the column", - "default": 0 - }, - "assignedTo": { - "title": "Assigned To", - "type": "string", - "description": "Nextcloud user UID of the assignee" - }, - "contractorRef": { - "title": "Contractor", - "type": "string", - "description": "UUID reference to the contractor contact/domain object — the portal-subject scoping key; distinct from assignedTo which is the Nextcloud user id", - "format": "uuid", - "nullable": true, - "x-external-register": "openregister" - }, - "dueDate": { - "title": "Due Date", - "type": "string", - "description": "Due date in ISO 8601 format", - "format": "date" - }, - "startDate": { - "title": "Start Date", - "type": "string", - "description": "Start date in ISO 8601 format", - "format": "date" - }, - "estimatedDuration": { - "title": "Estimated Duration", - "type": "integer", - "description": "Estimated effort in minutes" - }, - "percentComplete": { - "title": "Percent Complete", - "type": "integer", - "description": "Completion percentage (0–100)", - "minimum": 0, - "maximum": 100, - "default": 0 - }, - "labels": { - "title": "Labels", - "type": "array", - "description": "UUIDs of linked Label objects", - "items": { - "type": "string", - "format": "uuid" - }, - "default": [] - }, - "parent": { - "title": "Parent Task", - "type": "string", - "description": "UUID of the parent Task (sub-task support)", - "format": "uuid", - "nullable": true, - "$ref": "task" - }, - "calendarEventUid": { - "title": "Calendar Event UID", - "type": "string", - "description": "UID of the linked NC Tasks / CalDAV VTODO event", - "nullable": true - }, - "completedAt": { - "title": "Completed At", - "type": "string", - "description": "ISO 8601 datetime when the task was completed", - "format": "date-time", - "nullable": true - }, - "issueType": { - "title": "Issue Type", - "type": "string", - "description": "Work-item type (e.g. task, story, bug, epic, subtask, incident). Free string so imported vocabularies survive.", - "default": "task" - }, - "key": { - "title": "Key", - "type": "string", - "description": "Human-readable unique work-item key (e.g. PLX-123). Preserved from the source system on import so historical references stay resolvable.", - "nullable": true - }, - "reporter": { - "title": "Reporter", - "type": "string", - "description": "Nextcloud user UID (or imported identity) of the person who reported or created the work item", - "nullable": true - }, - "resolution": { - "title": "Resolution", - "type": "string", - "description": "Resolution label recorded when the task is closed (e.g. done, wont-do, duplicate)", - "nullable": true - }, - "resolvedAt": { - "title": "Resolved At", - "type": "string", - "description": "ISO 8601 datetime when the task was resolved", - "format": "date-time", - "nullable": true - }, - "storyPoints": { - "title": "Story Points", - "type": "number", - "description": "Story-point estimate", - "nullable": true - }, - "remainingEstimate": { - "title": "Remaining Estimate", - "type": "integer", - "description": "Remaining effort in minutes (complements estimatedDuration)", - "nullable": true - }, - "watchers": { - "title": "Watchers", - "type": "array", - "description": "Nextcloud user UIDs watching this task for notifications", - "items": { - "type": "string" - }, - "default": [] - }, - "epic": { - "title": "Epic", - "type": "string", - "description": "UUID of the epic-level Task this task belongs to (epic hierarchy; distinct from parent, which models sub-tasks)", - "format": "uuid", - "nullable": true, - "$ref": "task" - }, - "metadata": { - "title": "Metadata", - "type": "object", - "description": "Declared catch-all for source-system fields: imported custom fields and provenance keys (e.g. jiraKey, jiraId, migratedAt). Declared explicitly so magic-table storage persists it.", - "default": {} + "weight": 2 } + ], + "metrics": { + "placed": 3, + "unplaced": 0, + "hardBroken": 0, + "softBroken": 1, + "softPenalty": 2 } }, - "timeEntry": { - "slug": "timeEntry", - "icon": "TimerOutline", - "version": "0.1.3", - "title": "Time Entry", - "description": "Time logged by a user against a task. Maps to schema:QuantitativeValue.", - "x-schema-org": "schema:QuantitativeValue", - "type": "object", - "required": [ - "task", - "user", - "duration", - "date" - ], - "authorization": { - "read": [ - { - "group": "authenticated", - "match": { - "user": "$userId" - } - }, + { + "source": "generated", + "weekOf": "2026-10-05", + "windowFrom": "2026-10-05", + "windowTo": "2026-10-30", + "input": { + "periods": [ + "mon-1", + "mon-2", + "tue-1", + "tue-2", + "wed-5", + "fri-8" + ], + "rooms": [ { - "group": "authenticated", - "match": { - "task": { - "$in": { - "$lookup": { - "schema": "task", - "field": "id", - "where": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - } - } - } - } + "reference": "B1.04", + "capacity": 30, + "type": "classroom" }, { - "group": "admin" + "reference": "A0.12", + "capacity": 24, + "type": "classroom" } ], - "create": [ + "lessons": [ { - "group": "authenticated", - "match": { - "user": "$userId" - } + "key": "3B-planning-1", + "activity": "3B-planning", + "group": "3B", + "teacher": "@operator", + "roomType": "classroom", + "length": 1 }, { - "group": "admin" - } - ], - "update": [ - { - "group": "authenticated", - "match": { - "user": "$userId" - } + "key": "3B-planning-2", + "activity": "3B-planning", + "group": "3B", + "teacher": "@operator", + "roomType": "classroom", + "length": 1 }, { - "group": "admin" + "key": "3B-agile-1", + "activity": "3B-agile", + "group": "3B", + "teacher": "@operator", + "roomType": "classroom", + "length": 1 } ], - "delete": [ - { - "group": "authenticated", - "match": { - "user": "$userId" - } - }, + "wishes": [ { - "group": "admin" + "id": "0000de00-0000-4000-8000-001000000001", + "appliesTo": "teacher", + "reference": "@operator", + "kind": "unavailable", + "periods": [ + "wed-5", + "wed-6", + "wed-7", + "wed-8" + ], + "strength": "hard" } ] }, - "properties": { - "task": { - "title": "Task", - "type": "string", - "description": "UUID of the related Task", - "format": "uuid", - "$ref": "task" - }, - "user": { - "title": "User", - "type": "string", - "description": "Nextcloud user UID of the person who logged the time" - }, - "contractorRef": { - "title": "Contractor", - "type": "string", - "description": "UUID reference to the contractor contact/domain object — the portal-subject scoping key; distinct from user which is the Nextcloud user id", - "format": "uuid", - "nullable": true, - "x-external-register": "openregister" - }, - "duration": { - "title": "Duration", - "type": "integer", - "description": "Time logged in minutes" - }, - "date": { - "title": "Work Date", - "type": "string", - "description": "Date the work was performed (ISO 8601)", - "format": "date" - }, - "description": { - "title": "Note", - "type": "string", - "description": "Optional note about the work performed" - } - } - } - }, - "objects": [ - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "column-voorbeeld-title-1-1" - }, - "title": "Voorbeeld Title 1", - "project": "00000000-0000-4000-8000-000000000000", - "order": 0, - "wipLimit": 1, - "color": "#012345", - "type": "active" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "column-voorbeeld-title-2-2" - }, - "title": "Voorbeeld Title 2", - "project": "00000000-0000-4000-8000-000000000001", - "order": 0, - "wipLimit": 2, - "color": "#123456", - "type": "done" - }, - { "@self": { "register": "planninq", - "schema": "column", - "slug": "column-voorbeeld-title-3-3" + "schema": "timetableScenario", + "slug": "demo-scenario-autumn-queued", + "id": "0000de00-0000-4000-8000-001100000003" }, - "title": "Voorbeeld Title 3", - "project": "00000000-0000-4000-8000-000000000002", - "order": 0, - "wipLimit": 3, - "color": "#234567", - "type": "active" + "title": "Autumn, second run", + "status": "queued", + "seed": 2 }, { "@self": { "register": "planninq", - "schema": "dependency", - "slug": "dependency-dependency-1-1" + "schema": "boardFilter", + "slug": "demo-filter-overdue-legal", + "id": "0000de00-0000-4000-8000-001200000001" }, - "blocker": "00000000-0000-4000-8000-000000000000", - "blocked": "00000000-0000-4000-8000-000000000000", - "type": "blocks" + "name": "Overdue legal work", + "project": "0000de00-0000-4000-8000-000100000001", + "owner": "@operator", + "shared": true, + "members": [ + "@operator" + ], + "criteria": { + "due": { + "op": "is", + "values": [ + "overdue" + ] + } + } }, { "@self": { "register": "planninq", - "schema": "dependency", - "slug": "dependency-dependency-2-2" + "schema": "boardFilter", + "slug": "demo-filter-my-urgent", + "id": "0000de00-0000-4000-8000-001200000002" }, - "blocker": "00000000-0000-4000-8000-000000000001", - "blocked": "00000000-0000-4000-8000-000000000001", - "type": "relates" + "name": "My urgent tasks", + "project": "0000de00-0000-4000-8000-000100000002", + "owner": "@operator", + "shared": false, + "members": [ + "@operator" + ], + "criteria": { + "assignee": { + "op": "is", + "values": [ + "me" + ] + }, + "priority": { + "op": "is", + "values": [ + "urgent" + ] + } + } }, { "@self": { "register": "planninq", - "schema": "dependency", - "slug": "dependency-dependency-3-3" + "schema": "boardFilter", + "slug": "demo-filter-unassigned", + "id": "0000de00-0000-4000-8000-001200000003" }, - "blocker": "00000000-0000-4000-8000-000000000002", - "blocked": "00000000-0000-4000-8000-000000000002", - "type": "duplicates" + "name": "Nobody on it yet", + "project": "0000de00-0000-4000-8000-000100000003", + "owner": "@operator", + "shared": true, + "members": [ + "@operator" + ], + "criteria": { + "assignee": { + "op": "is", + "values": [ + "unassigned" + ] + } + } }, { "@self": { "register": "planninq", - "schema": "label", - "slug": "label-voorbeeld-title-1-1" + "schema": "boardView", + "slug": "demo-view-it-operations", + "id": "0000de00-0000-4000-8000-001300000001" }, - "title": "Voorbeeld Title 1", - "color": "#4376FC", - "description": "Voorbeeld Description 1" + "title": "IT operations", + "owner": "@operator", + "members": [], + "projects": [ + "0000de00-0000-4000-8000-000100000001", + "0000de00-0000-4000-8000-000100000002" + ] }, { "@self": { "register": "planninq", - "schema": "label", - "slug": "label-voorbeeld-title-2-2" + "schema": "boardView", + "slug": "demo-view-this-week", + "id": "0000de00-0000-4000-8000-001300000002" }, - "title": "Voorbeeld Title 2", - "color": "#4376FC", - "description": "Voorbeeld Description 2" + "title": "My projects this week", + "owner": "@operator", + "members": [], + "projects": [ + "0000de00-0000-4000-8000-000100000001", + "0000de00-0000-4000-8000-000100000002", + "0000de00-0000-4000-8000-000100000003" + ] }, { "@self": { "register": "planninq", - "schema": "label", - "slug": "label-voorbeeld-title-3-3" + "schema": "boardView", + "slug": "demo-view-shared-programme", + "id": "0000de00-0000-4000-8000-001300000003" }, - "title": "Voorbeeld Title 3", - "color": "#4376FC", - "description": "Voorbeeld Description 3" + "title": "Programme overview", + "owner": "@operator", + "members": [ + "@operator" + ], + "projects": [ + "0000de00-0000-4000-8000-000100000002", + "0000de00-0000-4000-8000-000100000003" + ] }, { "@self": { "register": "planninq", - "schema": "project", - "slug": "project-voorbeeld-title-1-1" + "schema": "forgeLink", + "slug": "demo-code-login-redirect-mr", + "id": "0000de00-0000-4000-8000-001400000001" }, - "title": "Voorbeeld Title 1", - "status": "active", - "description": "Voorbeeld Description 1", - "color": "#012345", - "icon": "FolderOutline", - "owner": "Voorbeeld Owner 1", - "members": [], - "contractorRefs": [], - "defaultAssignee": "Voorbeeld Defaultassignee 1", - "caseReference": "00000000-0000-4000-8000-000000000000", - "labels": [], - "key": "Voorbeeld Key 1", - "metadata": {} - }, - { - "@self": { - "register": "planninq", - "schema": "project", - "slug": "project-voorbeeld-title-2-2" - }, - "title": "Voorbeeld Title 2", - "status": "archived", - "description": "Voorbeeld Description 2", - "color": "#123456", - "icon": "CheckboxMarkedCircleOutline", - "owner": "Voorbeeld Owner 2", - "members": [], - "contractorRefs": [], - "defaultAssignee": "Voorbeeld Defaultassignee 2", - "caseReference": "00000000-0000-4000-8000-000000000001", - "labels": [], - "key": "Voorbeeld Key 2", - "metadata": {} + "task": "0000de00-0000-4000-8000-000300000002", + "project": "0000de00-0000-4000-8000-000100000001", + "taskKey": "EXPORTAL-2", + "kind": "mergeRequest", + "url": "https://github.com/example/portal/pull/42", + "title": "EXPORTAL-2 fix the redirect after login", + "repository": "example/portal", + "externalId": "github:example/portal#42", + "state": "merged", + "author": "@operator", + "occurredAt": "2026-09-21T10:00:00+00:00", + "source": "integriq", + "members": [ + "@operator" + ] }, { "@self": { "register": "planninq", - "schema": "project", - "slug": "project-voorbeeld-title-3-3" + "schema": "forgeLink", + "slug": "demo-code-login-redirect-commit", + "id": "0000de00-0000-4000-8000-001400000002" }, - "title": "Voorbeeld Title 3", - "status": "completed", - "description": "Voorbeeld Description 3", - "color": "#234567", - "icon": "ViewColumnOutline", - "owner": "Voorbeeld Owner 3", - "members": [], - "contractorRefs": [], - "defaultAssignee": "Voorbeeld Defaultassignee 3", - "caseReference": "00000000-0000-4000-8000-000000000002", - "labels": [], - "key": "Voorbeeld Key 3", - "metadata": {} + "task": "0000de00-0000-4000-8000-000300000002", + "project": "0000de00-0000-4000-8000-000100000001", + "taskKey": "EXPORTAL-2", + "kind": "commit", + "url": "https://github.com/example/portal/commit/3f2a9c1d8e7b6a5f4c3d2e1f0a9b8c7d6e5f4a3b", + "title": "EXPORTAL-2 keep the target page through the login form", + "repository": "example/portal", + "externalId": "3f2a9c1d8e7b6a5f4c3d2e1f0a9b8c7d6e5f4a3b", + "state": "", + "author": "@operator", + "occurredAt": "2026-09-22T10:00:00+00:00", + "source": "integriq", + "members": [ + "@operator" + ] }, { "@self": { "register": "planninq", - "schema": "task", - "slug": "task-voorbeeld-title-1-1" + "schema": "forgeLink", + "slug": "demo-code-widgets-branch", + "id": "0000de00-0000-4000-8000-001400000003" }, - "title": "Voorbeeld Title 1", - "status": "open", - "description": "Voorbeeld Description 1", - "priority": "low", - "project": "00000000-0000-4000-8000-000000000000", - "zaakUuid": "00000000-0000-4000-8000-000000000000", - "column": "00000000-0000-4000-8000-000000000000", - "columnOrder": 0, - "assignedTo": "Voorbeeld Assignedto 1", - "contractorRef": "00000000-0000-4000-8000-000000000000", - "dueDate": "2026-03-01", - "startDate": "2026-03-01", - "estimatedDuration": 1, - "percentComplete": 0, - "labels": [], - "parent": "00000000-0000-4000-8000-000000000000", - "calendarEventUid": "Voorbeeld Calendareventuid 1", - "completedAt": "2026-03-01T09:00:00+00:00", - "issueType": "task", - "key": "Voorbeeld Key 1", - "reporter": "Voorbeeld Reporter 1", - "resolution": "Voorbeeld Resolution 1", - "resolvedAt": "2026-03-01T09:00:00+00:00", - "storyPoints": 1.0 + "task": "0000de00-0000-4000-8000-000300000003", + "project": "0000de00-0000-4000-8000-000100000001", + "taskKey": "EXPORTAL-3", + "kind": "branch", + "url": "https://gitlab.example.org/example/portal/-/tree/EXPORTAL-3-widgets", + "title": "EXPORTAL-3-widgets", + "repository": "example/portal", + "externalId": "gitlab.example.org:example/portal:branch:EXPORTAL-3-widgets", + "state": "", + "author": "@operator", + "occurredAt": "2026-09-23T10:00:00+00:00", + "source": "manual", + "members": [ + "@operator" + ] }, { "@self": { "register": "planninq", - "schema": "task", - "slug": "task-voorbeeld-title-2-2" + "schema": "taskReport", + "slug": "demo-report-open-work", + "id": "0000de00-0000-4000-8000-001500000001" }, - "title": "Voorbeeld Title 2", - "status": "in_progress", - "description": "Voorbeeld Description 2", - "priority": "normal", - "project": "00000000-0000-4000-8000-000000000001", - "zaakUuid": "00000000-0000-4000-8000-000000000001", - "column": "00000000-0000-4000-8000-000000000001", - "columnOrder": 0, - "assignedTo": "Voorbeeld Assignedto 2", - "contractorRef": "00000000-0000-4000-8000-000000000001", - "dueDate": "2026-03-02", - "startDate": "2026-03-02", - "estimatedDuration": 2, - "percentComplete": 0, - "labels": [], - "parent": "00000000-0000-4000-8000-000000000001", - "calendarEventUid": "Voorbeeld Calendareventuid 2", - "completedAt": "2026-03-02T09:00:00+00:00", - "issueType": "task", - "key": "Voorbeeld Key 2", - "reporter": "Voorbeeld Reporter 2", - "resolution": "Voorbeeld Resolution 2", - "resolvedAt": "2026-03-02T09:00:00+00:00", - "storyPoints": 2.0 - }, - { - "@self": { - "register": "planninq", - "schema": "task", - "slug": "task-voorbeeld-title-3-3" + "title": "Open work per person", + "owner": "@operator", + "shared": "readers", + "projects": [ + "0000de00-0000-4000-8000-000100000001", + "0000de00-0000-4000-8000-000100000002" + ], + "filters": { + "status": "open" }, - "title": "Voorbeeld Title 3", - "status": "blocked", - "description": "Voorbeeld Description 3", - "priority": "high", - "project": "00000000-0000-4000-8000-000000000002", - "zaakUuid": "00000000-0000-4000-8000-000000000002", - "column": "00000000-0000-4000-8000-000000000002", - "columnOrder": 0, - "assignedTo": "Voorbeeld Assignedto 3", - "contractorRef": "00000000-0000-4000-8000-000000000002", - "dueDate": "2026-03-03", - "startDate": "2026-03-03", - "estimatedDuration": 3, - "percentComplete": 0, - "labels": [], - "parent": "00000000-0000-4000-8000-000000000002", - "calendarEventUid": "Voorbeeld Calendareventuid 3", - "completedAt": "2026-03-03T09:00:00+00:00", - "issueType": "task", - "key": "Voorbeeld Key 3", - "reporter": "Voorbeeld Reporter 3", - "resolution": "Voorbeeld Resolution 3", - "resolvedAt": "2026-03-03T09:00:00+00:00", - "storyPoints": 3.0 + "groupBy": "assignedTo", + "metric": "count", + "display": "bar" }, { "@self": { "register": "planninq", - "schema": "timeEntry", - "slug": "timeentry-timeentry-1-1" + "schema": "taskReport", + "slug": "demo-report-priorities", + "id": "0000de00-0000-4000-8000-001500000002" }, - "task": "00000000-0000-4000-8000-000000000000", - "user": "Voorbeeld User 1", - "duration": 1, - "date": "2026-03-01", - "contractorRef": "00000000-0000-4000-8000-000000000000", - "description": "Voorbeeld Description 1" - }, - { - "@self": { - "register": "planninq", - "schema": "timeEntry", - "slug": "timeentry-timeentry-2-2" + "title": "Open tasks by priority", + "owner": "@operator", + "shared": "private", + "projects": [ + "0000de00-0000-4000-8000-000100000001", + "0000de00-0000-4000-8000-000100000002", + "0000de00-0000-4000-8000-000100000003" + ], + "filters": { + "status": "open" }, - "task": "00000000-0000-4000-8000-000000000001", - "user": "Voorbeeld User 2", - "duration": 2, - "date": "2026-03-02", - "contractorRef": "00000000-0000-4000-8000-000000000001", - "description": "Voorbeeld Description 2" + "groupBy": "priority", + "metric": "count", + "display": "donut" }, { "@self": { "register": "planninq", - "schema": "timeEntry", - "slug": "timeentry-timeentry-3-3" + "schema": "taskReport", + "slug": "demo-report-points", + "id": "0000de00-0000-4000-8000-001500000003" }, - "task": "00000000-0000-4000-8000-000000000002", - "user": "Voorbeeld User 3", - "duration": 3, - "date": "2026-03-03", - "contractorRef": "00000000-0000-4000-8000-000000000002", - "description": "Voorbeeld Description 3" + "title": "Story points per column", + "owner": "@operator", + "shared": "private", + "projects": [ + "0000de00-0000-4000-8000-000100000001" + ], + "groupBy": "column", + "metric": "sum", + "display": "table", + "sumField": "storyPoints" } ] } diff --git a/lib/Settings/planninq_register.json b/lib/Settings/planninq_register.json index 3ec61910..fef3780a 100644 --- a/lib/Settings/planninq_register.json +++ b/lib/Settings/planninq_register.json @@ -3,12 +3,12 @@ "info": { "title": "Planninq Register", "description": "Register containing all schemas for the Planninq application.", - "version": "0.4.0" + "version": "0.37.0" }, "x-openregister": { "type": "application", "app": "planninq", - "openregister": "^v0.2.10", + "openregister": ">=v1.1.7", "description": "Flow-based kanban project and task management for Nextcloud dev and IT teams" }, "paths": {}, @@ -18,14 +18,29 @@ "title": "Planninq", "description": "Planninq application data register — tasks, projects, columns, time entries, and labels.", "slug": "planninq", - "version": "0.4.0", + "version": "0.10.0", "schemas": [ "task", "project", + "projectPhase", "column", - "timeEntry", + "plannedTimeEntry", "label", - "dependency" + "dependency", + "timetableSession", + "projectLogEntry", + "risk", + "projectStatusReport", + "projectPortfolio", + "financeLine", + "projectField", + "projectRelease", + "timetableWish", + "timetableScenario", + "boardFilter", + "boardView", + "forgeLink", + "taskReport" ], "_note": "`tablePrefix` and `folder` stay on the PRE-RENAME `planix` deliberately, and are not part of this rename. They name PHYSICAL things that already exist: the folder is the Nextcloud Files node OpenRegister created for this register (RegisterService::ensureRegisterFolderExists() replaces a legacy string path with the numeric node id on first run), and moving either would strand what is already stored there rather than rename it. The slug is the only value the import resolves a register by; it is the only one that moves.", "tablePrefix": "planix", @@ -38,7 +53,7 @@ "task": { "slug": "task", "icon": "CheckboxMarkedCircleOutline", - "version": "0.2.0", + "version": "0.12.0", "title": "Task", "description": "A discrete unit of work. Maps to iCalendar VTODO (RFC 5545) and schema:PlanAction.", "x-schema-org": "schema:PlanAction", @@ -52,41 +67,40 @@ { "group": "authenticated", "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } + "members": { + "$contains": "$userId" } } }, { - "group": "admin" - } - ], - "create": [ + "group": "authenticated", + "match": { + "viewers": { + "$contains": "$userId" + } + } + }, { "group": "authenticated", "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "portfolioReaders": { + "$contains": "$userId" } } }, @@ -94,22 +108,28 @@ "group": "admin" } ], + "create": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], "update": [ { "group": "authenticated", "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" } } }, @@ -121,18 +141,16 @@ { "group": "authenticated", "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" } } }, @@ -171,6 +189,120 @@ "en": "Task \"{{title}}\" is due soon", "nl": "Taak \"{{title}}\" moet binnenkort af" } + }, + "taskAssignedOnCreate": { + "trigger": { + "type": "created" + }, + "enabled": true, + "channels": [ + "nc-notification" + ], + "recipients": [ + { + "kind": "field", + "field": "assignedTo" + } + ], + "subject": { + "en": "Task \"{{title}}\" was assigned to you", + "nl": "Taak \"{{title}}\" is aan jou toegewezen" + } + }, + "taskAssigned": { + "trigger": { + "type": "updated", + "condition": { + "field": "assignedTo", + "operator": "changed" + } + }, + "enabled": true, + "channels": [ + "nc-notification" + ], + "recipients": [ + { + "kind": "field", + "field": "assignedTo" + } + ], + "subject": { + "en": "Task \"{{title}}\" was assigned to you", + "nl": "Taak \"{{title}}\" is aan jou toegewezen" + } + }, + "taskAssignedOnCreateEmail": { + "trigger": { + "type": "created" + }, + "enabled": true, + "channels": [ + "email" + ], + "recipients": [ + { + "kind": "expression", + "resolver": "OCA\\Planninq\\Notification\\AssignmentEmailRecipientResolver" + } + ], + "subject": { + "en": "Task \"{{title}}\" was assigned to you", + "nl": "Taak \"{{title}}\" is aan jou toegewezen" + } + }, + "taskAssignedEmail": { + "trigger": { + "type": "updated", + "condition": { + "field": "assignedTo", + "operator": "changed" + } + }, + "enabled": true, + "channels": [ + "email" + ], + "recipients": [ + { + "kind": "expression", + "resolver": "OCA\\Planninq\\Notification\\AssignmentEmailRecipientResolver" + } + ], + "subject": { + "en": "Task \"{{title}}\" was assigned to you", + "nl": "Taak \"{{title}}\" is aan jou toegewezen" + } + }, + "taskDueSoonEmail": { + "trigger": { + "type": "scheduled", + "intervalSec": 3600, + "filter": { + "dueDate": { + "operator": "withinNext", + "value": "PT24H" + }, + "status": { + "operator": "notEquals", + "value": "done" + } + } + }, + "enabled": true, + "channels": [ + "email" + ], + "recipients": [ + { + "kind": "expression", + "resolver": "OCA\\Planninq\\Notification\\DueSoonEmailRecipientResolver" + } + ], + "subject": { + "en": "Task \"{{title}}\" is due soon", + "nl": "Taak \"{{title}}\" moet binnenkort af" + } } }, "properties": { @@ -182,7 +314,14 @@ "description": { "title": "Description", "type": "string", - "description": "Detailed description" + "description": "Detailed description", + "authorization": { + "read": [ + { + "group": "authenticated" + } + ] + } }, "status": { "title": "Status", @@ -216,6 +355,42 @@ "format": "uuid", "$ref": "project" }, + "members": { + "title": "Members", + "type": "array", + "description": "Nextcloud user UIDs of project members", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the project's members plus its owner. It is this object's access rule, {\"members\": {\"$contains\": \"$userId\"}}, because OpenRegister cannot match across schemas. ProjectMemberAccessListener writes it on every create and update, ProjectMembershipSyncListener when the project's membership changes, and the BackfillProjectMembers repair step on upgrade (planninq#681)." + }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the managers of the project's portfolio, who read the project and its objects without being members. ProjectPortfolioListener writes it on the project whenever the project moves or its portfolio's managers change, and ProjectMemberAccessListener copies it onto every project-scoped object (projects-grouping-hierarchy-fields, design decision 2)." + }, + "phase": { + "title": "Phase", + "type": "string", + "description": "UUID of the Project Phase this task delivers. Empty on projects that are not broken into phases.", + "format": "uuid", + "nullable": true, + "$ref": "projectPhase" + }, + "billable": { + "title": "Billable", + "type": "boolean", + "description": "Whether work on this task is billable. Leave empty to inherit from the phase, or from the project when there is no phase.", + "nullable": true + }, "zaakUuid": { "title": "Zaak UUID", "type": "string", @@ -240,7 +415,23 @@ "assignedTo": { "title": "Assigned To", "type": "string", - "description": "Nextcloud user UID of the assignee" + "description": "Nextcloud user UID of the assignee", + "authorization": { + "read": [ + { + "group": "authenticated" + } + ] + } + }, + "sharedWith": { + "title": "Also working on this", + "type": "array", + "description": "Other project members who work on this task alongside the person responsible.", + "items": { + "type": "string" + }, + "default": [] }, "contractorRef": { "title": "Contractor", @@ -248,7 +439,14 @@ "description": "UUID reference to the contractor contact/domain object — the portal-subject scoping key; distinct from assignedTo which is the Nextcloud user id", "format": "uuid", "nullable": true, - "x-external-register": "openregister" + "x-external-register": "openregister", + "authorization": { + "read": [ + { + "group": "authenticated" + } + ] + } }, "dueDate": { "title": "Due Date", @@ -293,6 +491,20 @@ "nullable": true, "$ref": "task" }, + "checklist": { + "title": "Checklist", + "type": "array", + "description": "Small steps inside the task. Each item has an id, a text and whether it is done.", + "items": { + "type": "object", + "required": [ + "id", + "text", + "done" + ] + }, + "default": [] + }, "calendarEventUid": { "title": "Calendar Event UID", "type": "string", @@ -322,7 +534,14 @@ "title": "Reporter", "type": "string", "description": "Nextcloud user UID (or imported identity) of the person who reported or created the work item", - "nullable": true + "nullable": true, + "authorization": { + "read": [ + { + "group": "authenticated" + } + ] + } }, "resolution": { "title": "Resolution", @@ -356,7 +575,14 @@ "items": { "type": "string" }, - "default": [] + "default": [], + "authorization": { + "read": [ + { + "group": "authenticated" + } + ] + } }, "epic": { "title": "Epic", @@ -366,20 +592,61 @@ "nullable": true, "$ref": "task" }, + "release": { + "title": "Release", + "type": "string", + "description": "The release this task is planned for", + "format": "uuid", + "nullable": true, + "$ref": "projectRelease" + }, "metadata": { "title": "Metadata", "type": "object", "description": "Declared catch-all for source-system fields: imported custom fields and provenance keys (e.g. jiraKey, jiraId, migratedAt). Declared explicitly so magic-table storage persists it.", "default": {} + }, + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members may change this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." } } }, "project": { "slug": "project", "icon": "FolderOutline", - "version": "0.2.0", + "version": "0.14.0", "title": "Project", - "description": "A container grouping related tasks and kanban columns. Maps to schema:CreativeWork.", + "description": "A container grouping related tasks and kanban columns, optionally delivered for a client against a budget. Maps to schema:CreativeWork.", "x-schema-org": "schema:CreativeWork", "type": "object", "required": [ @@ -397,34 +664,122 @@ } }, { - "group": "admin" - } - ], - "create": [ - "admin" - ], - "update": [ + "group": "authenticated", + "match": { + "managers": { + "$contains": "$userId" + } + } + }, { "group": "authenticated", "match": { - "owner": "$userId" + "viewers": { + "$contains": "$userId" + } } }, { - "group": "admin" - } - ], - "delete": [ + "group": "authenticated", + "match": { + "portfolioReaders": { + "$contains": "$userId" + } + } + }, { "group": "authenticated", "match": { - "owner": "$userId" + "managerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "ownerGroups": { + "$contains": "$user.groups" + } } }, { "group": "admin" } - ] + ], + "create": [ + "admin" + ], + "update": [ + { + "group": "authenticated", + "match": { + "owner": "$userId" + } + }, + { + "group": "authenticated", + "match": { + "ownerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "managers": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "managerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ], + "delete": [ + { + "group": "authenticated", + "match": { + "owner": "$userId" + } + }, + { + "group": "authenticated", + "match": { + "ownerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ] }, "properties": { "title": { @@ -440,14 +795,42 @@ "status": { "title": "Status", "type": "string", - "description": "Project lifecycle status", + "description": "Project lifecycle status. Progress within an active project is read from the board, not from this field.", "enum": [ "active", "archived", - "completed" + "completed", + "cancelled", + "requested", + "rejected" ], "default": "active" }, + "requestReason": { + "title": "Request reason", + "type": "string", + "nullable": true, + "description": "Why the requester needs this project. Filled in when the project is requested." + }, + "reviewedBy": { + "title": "Reviewed by", + "type": "string", + "nullable": true, + "description": "The user who approved or rejected the request." + }, + "reviewedAt": { + "title": "Reviewed at", + "type": "string", + "format": "date-time", + "nullable": true, + "description": "When the request was approved or rejected." + }, + "reviewNote": { + "title": "Review note", + "type": "string", + "nullable": true, + "description": "The reviewer's reason, shown to the requester when a request is not approved." + }, "color": { "title": "Colour", "type": "string", @@ -462,7 +845,36 @@ "owner": { "title": "Owner", "type": "string", - "description": "Nextcloud user UID of the project creator. Set automatically on creation; used for delete authorization and creator-based RBAC." + "description": "Nextcloud user UID of the project creator. Set automatically on creation; used for delete authorization and creator-based RBAC.", + "authorization": { + "update": [ + { + "group": "authenticated", + "match": { + "owner": "$userId" + } + }, + { + "group": "authenticated", + "match": { + "ownerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ] + } + }, + "portfolio": { + "title": "Portfolio", + "type": "string", + "description": "The portfolio this project belongs to", + "format": "uuid", + "$ref": "projectPortfolio", + "nullable": true }, "members": { "title": "Members", @@ -473,6 +885,31 @@ }, "default": [] }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the managers of the project's portfolio, who read the project and its objects without being members. ProjectPortfolioListener writes it on the project whenever the project moves or its portfolio's managers change, and ProjectMemberAccessListener copies it onto every project-scoped object (projects-grouping-hierarchy-fields, design decision 2)." + }, + "parent": { + "title": "Parent project", + "type": "string", + "description": "The project this project sits under, such as a programme. Projects nest three levels deep at most.", + "format": "uuid", + "$ref": "project", + "nullable": true + }, + "customFields": { + "title": "Custom fields", + "type": "object", + "description": "The values of the project fields an admin defined, keyed by the field's key.", + "default": {} + }, "contractorRefs": { "title": "Contractors", "type": "array", @@ -495,6 +932,22 @@ "format": "uuid", "nullable": true }, + "caseHandovers": { + "title": "Case handovers", + "type": "array", + "description": "Each time the project's files and metadata were handed over to its case: when, by whom, to which case, every file copied with its SHA-256, and the files that failed.", + "default": [], + "items": { + "type": "object", + "required": [ + "date", + "by", + "case", + "files", + "failures" + ] + } + }, "labels": { "title": "Labels", "type": "array", @@ -511,234 +964,3509 @@ "description": "Short unique project key used as the prefix of task keys (e.g. PLX). Preserved from the source system on import.", "nullable": true }, - "metadata": { - "title": "Metadata", - "type": "object", - "description": "Declared catch-all for source-system fields and provenance keys (e.g. jiraProjectId, migratedAt). Declared explicitly so magic-table storage persists it.", - "default": {} - } - } - }, - "column": { - "slug": "column", - "icon": "ViewColumnOutline", - "version": "0.1.2", - "title": "Column", - "description": "A kanban column belonging to a project. Maps to schema:DefinedTerm.", - "x-schema-org": "schema:DefinedTerm", - "type": "object", - "required": [ - "title", - "project", - "order" - ], - "authorization": { - "read": [ - { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - }, - { - "group": "admin" - } - ], - "create": [ - { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - }, - { - "group": "admin" - } - ], - "update": [ - { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - }, - { - "group": "admin" - } - ], - "delete": [ - { - "group": "authenticated", - "match": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - }, - { - "group": "admin" - } - ] - }, - "properties": { - "title": { - "title": "Column Heading", - "type": "string", - "description": "Column heading (e.g. 'In Progress')" + "nextTaskNumber": { + "title": "Next task number", + "type": "integer", + "minimum": 1, + "nullable": true, + "description": "The number the next task of this project gets in its key. Only the system writes it." }, - "project": { - "title": "Project", + "autoSchedule": { + "title": "Auto-scheduling", + "type": "boolean", + "default": false, + "description": "When on, moving a task's due date later on the timeline offers to move the tasks it blocks along." + }, + "client": { + "title": "Client", "type": "string", - "description": "UUID of the parent Project", + "description": "UUID of the client this project is delivered for. Set on projects that came in through a CRM; empty on internal work.", "format": "uuid", - "$ref": "project" + "nullable": true, + "x-external-register": "pipelinq" }, - "order": { - "title": "Display Order", - "type": "integer", - "description": "Left-to-right display order (0-based)", + "billable": { + "title": "Billable", + "type": "boolean", + "description": "Whether the work on this project is billable to the client. Phases, tasks and time entries inherit this unless they set their own value.", + "default": false + }, + "billingModel": { + "title": "Billing model", + "type": "string", + "description": "How the client pays: not billed, a fixed price, or by the hour.", + "enum": [ + "none", + "fixedPrice", + "hourly" + ], + "default": "none", + "x-enum-labels": { + "none": "Not billed", + "fixedPrice": "Fixed price", + "hourly": "Hourly" + } + }, + "budgetHours": { + "title": "Budget Hours", + "type": "number", + "description": "Budgeted hours for the whole project. Zero means no budget was agreed.", "default": 0 }, - "wipLimit": { - "title": "WIP Limit", - "type": "integer", - "description": "Work-in-progress limit (null = unlimited)", + "budgetAmount": { + "title": "Budget Amount", + "type": "number", + "description": "Budgeted amount in the reporting currency. Zero means no budget was agreed.", + "default": 0 + }, + "hourlyRate": { + "title": "Hourly Rate", + "type": "number", + "description": "Default hourly rate for the project. Time entries fall back to this when they carry no rate of their own.", + "default": 0 + }, + "startDate": { + "title": "Start Date", + "type": "string", + "description": "Planned start of the project (ISO 8601)", + "format": "date", "nullable": true }, - "color": { - "title": "Header Colour", + "endDate": { + "title": "End Date", "type": "string", - "description": "Hex colour code for the column header", - "pattern": "^#[0-9A-Fa-f]{6}$" + "description": "Planned end of the project (ISO 8601)", + "format": "date", + "nullable": true }, - "type": { - "title": "Column Type", + "healthMoney": { + "title": "Health: money", "type": "string", - "description": "Functional type: active columns hold in-flight work; done columns auto-complete tasks", + "description": "Copied from the newest status report", "enum": [ - "active", - "done" + "onTrack", + "atRisk", + "offTrack" ], - "default": "active" - } - } - }, - "timeEntry": { - "slug": "timeEntry", - "icon": "TimerOutline", - "version": "0.1.3", - "title": "Time Entry", - "description": "Time logged by a user against a task. Maps to schema:QuantitativeValue.", - "x-schema-org": "schema:QuantitativeValue", - "type": "object", - "required": [ - "task", - "user", - "duration", - "date" - ], - "authorization": { - "read": [ - { - "group": "authenticated", - "match": { - "user": "$userId" - } + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" }, - { - "group": "authenticated", - "match": { - "task": { - "$in": { - "$lookup": { - "schema": "task", - "field": "id", - "where": { - "project": { - "$in": { - "$lookup": { - "schema": "project", - "field": "id", - "where": { - "members": { - "$contains": "$userId" - } - } - } - } - } - } - } - } - } - } + "nullable": true, + "x-notes": "Copied from the newest projectStatusReport by ProjectStatusListener. A client never sets it: a create that sends it is refused and an update keeps the stored value (portfolio-status-overview, design decision 1)." + }, + "healthOrganisation": { + "title": "Health: organisation", + "type": "string", + "description": "Copied from the newest status report", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" }, - { - "group": "admin" - } + "nullable": true, + "x-notes": "Copied from the newest projectStatusReport by ProjectStatusListener. A client never sets it: a create that sends it is refused and an update keeps the stored value (portfolio-status-overview, design decision 1)." + }, + "healthTime": { + "title": "Health: time", + "type": "string", + "description": "Copied from the newest status report", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + }, + "nullable": true, + "x-notes": "Copied from the newest projectStatusReport by ProjectStatusListener. A client never sets it: a create that sends it is refused and an update keeps the stored value (portfolio-status-overview, design decision 1)." + }, + "healthInformation": { + "title": "Health: information", + "type": "string", + "description": "Copied from the newest status report", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + }, + "nullable": true, + "x-notes": "Copied from the newest projectStatusReport by ProjectStatusListener. A client never sets it: a create that sends it is refused and an update keeps the stored value (portfolio-status-overview, design decision 1)." + }, + "healthQuality": { + "title": "Health: quality", + "type": "string", + "description": "Copied from the newest status report", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + }, + "nullable": true, + "x-notes": "Copied from the newest projectStatusReport by ProjectStatusListener. A client never sets it: a create that sends it is refused and an update keeps the stored value (portfolio-status-overview, design decision 1)." + }, + "healthRisk": { + "title": "Health: risk", + "type": "string", + "description": "Copied from the newest status report", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + }, + "nullable": true, + "x-notes": "Copied from the newest projectStatusReport by ProjectStatusListener. A client never sets it: a create that sends it is refused and an update keeps the stored value (portfolio-status-overview, design decision 1)." + }, + "healthOverall": { + "title": "Health: overall", + "type": "string", + "description": "Copied from the newest status report", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + }, + "nullable": true, + "x-notes": "Copied from the newest projectStatusReport by ProjectStatusListener. A client never sets it: a create that sends it is refused and an update keeps the stored value (portfolio-status-overview, design decision 1)." + }, + "healthDate": { + "title": "Health: report date", + "type": "string", + "description": "The date of the newest status report", + "format": "date", + "nullable": true, + "x-notes": "Copied with the health statuses by ProjectStatusListener." + }, + "metadata": { + "title": "Metadata", + "type": "object", + "description": "Declared catch-all for source-system fields and provenance keys (e.g. jiraProjectId, migratedAt). Declared explicitly so magic-table storage persists it.", + "default": {} + }, + "managers": { + "title": "Managers", + "type": "array", + "description": "Nextcloud user ids who manage the project: its settings, its members and its work", + "items": { + "type": "string" + }, + "default": [] + }, + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read the project and its work but not change it", + "items": { + "type": "string" + }, + "default": [] + }, + "managerGroups": { + "title": "Manager groups", + "type": "array", + "description": "Nextcloud groups whose members manage the project", + "items": { + "type": "string" + }, + "default": [] + }, + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members work on the project", + "items": { + "type": "string" + }, + "default": [] + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read the project", + "items": { + "type": "string" + }, + "default": [] + }, + "ownerGroups": { + "title": "Owning group", + "type": "array", + "description": "The Nextcloud group that owns the project with its creator, at most one", + "items": { + "type": "string" + }, + "default": [], + "maxItems": 1, + "authorization": { + "update": [ + { + "group": "authenticated", + "match": { + "owner": "$userId" + } + }, + { + "group": "authenticated", + "match": { + "ownerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ] + }, + "x-notes": "A list of at most one, not a string: OpenRegister resolves $user.groups only under $contains on its list query ($in fails closed there), so the owning group is matched with {\"ownerGroups\": {\"$contains\": \"$user.groups\"}}." + } + }, + "x-openregister-lifecycle": { + "field": "status", + "initial": "active", + "transitions": { + "archive": { + "from": [ + "active", + "completed" + ], + "to": "archived", + "description": "Archive the project. It leaves the active list." + }, + "restore": { + "from": [ + "archived", + "completed", + "cancelled" + ], + "to": "active", + "description": "Bring the project back to the active list." + }, + "complete": { + "from": [ + "active" + ], + "to": "completed", + "description": "Mark the project as completed." + }, + "cancel": { + "from": [ + "active" + ], + "to": "cancelled", + "description": "Stop the project without completing it." + }, + "approve": { + "from": [ + "requested" + ], + "to": "active", + "authorization": [ + "admin" + ], + "description": "Approve a project request. It becomes an active project." + }, + "reject": { + "from": [ + "requested" + ], + "to": "rejected", + "authorization": [ + "admin" + ], + "description": "Reject a project request with a reason.", + "inputs": [ + { + "field": "reviewNote", + "required": true + } + ] + } + } + }, + "x-openregister-notifications": { + "projectRequestApproved": { + "trigger": { + "type": "transition", + "action": "approve" + }, + "enabled": true, + "channels": [ + "nc-notification" + ], + "recipients": [ + { + "kind": "field", + "field": "owner" + } + ], + "subject": { + "en": "Your project request \"{{title}}\" was approved", + "nl": "Je projectaanvraag \"{{title}}\" is goedgekeurd" + } + }, + "projectRequestRejected": { + "trigger": { + "type": "transition", + "action": "reject" + }, + "enabled": true, + "channels": [ + "nc-notification" + ], + "recipients": [ + { + "kind": "field", + "field": "owner" + } + ], + "subject": { + "en": "Your project request \"{{title}}\" was not approved", + "nl": "Je projectaanvraag \"{{title}}\" is niet goedgekeurd" + } + } + } + }, + "projectPhase": { + "slug": "projectPhase", + "icon": "TimelineOutline", + "version": "0.6.0", + "title": "Project Phase", + "description": "A delivery stage within a project, such as discovery, build or hypercare. Phases carry their own budget and billable flag, and tasks hang off them. Maps to schema:CreativeWork.", + "x-schema-org": "schema:CreativeWork", + "type": "object", + "required": [ + "title", + "project" + ], + "authorization": { + "read": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "viewers": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "portfolioReaders": { + "$contains": "$userId" + } + } + }, + { + "group": "admin" + } + ], + "create": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "update": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ], + "delete": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ] + }, + "x-openregister-lifecycle": { + "field": "status", + "initial": "open", + "final": [ + "completed", + "cancelled" + ], + "transitions": { + "start": { + "from": [ + "open" + ], + "to": "in_progress", + "description": "Start working on the phase." + }, + "complete": { + "from": [ + "open", + "in_progress" + ], + "to": "completed", + "requires": "OCA\\Planninq\\Lifecycle\\PhaseConcludingDocumentGuard", + "description": "Close the phase. Needs its concluding document attached." + }, + "cancel": { + "from": [ + "open", + "in_progress" + ], + "to": "cancelled", + "description": "Stop the phase without concluding it." + }, + "reopen": { + "from": [ + "completed", + "cancelled" + ], + "to": "in_progress", + "description": "Take a closed phase up again." + } + } + }, + "properties": { + "title": { + "title": "Title", + "type": "string", + "description": "Name of the phase" + }, + "project": { + "title": "Project", + "type": "string", + "description": "UUID of the parent Project", + "format": "uuid", + "$ref": "project" + }, + "members": { + "title": "Members", + "type": "array", + "description": "Nextcloud user UIDs of project members", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the project's members plus its owner. It is this object's access rule, {\"members\": {\"$contains\": \"$userId\"}}, because OpenRegister cannot match across schemas. ProjectMemberAccessListener writes it on every create and update, ProjectMembershipSyncListener when the project's membership changes, and the BackfillProjectMembers repair step on upgrade (planninq#681)." + }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the managers of the project's portfolio, who read the project and its objects without being members. ProjectPortfolioListener writes it on the project whenever the project moves or its portfolio's managers change, and ProjectMemberAccessListener copies it onto every project-scoped object (projects-grouping-hierarchy-fields, design decision 2)." + }, + "description": { + "title": "Description", + "type": "string", + "description": "What this phase delivers" + }, + "status": { + "title": "Status", + "type": "string", + "description": "Phase lifecycle status", + "enum": [ + "open", + "in_progress", + "completed", + "cancelled" + ], + "default": "open" + }, + "concludingDocument": { + "title": "Concluding document", + "type": "string", + "description": "The id of the file on this phase that concludes it. The phase can only be completed once it is set and the file is attached.", + "nullable": true + }, + "order": { + "title": "Order", + "type": "integer", + "description": "Position of the phase within the project", + "default": 0 + }, + "billable": { + "title": "Billable", + "type": "boolean", + "description": "Whether work in this phase is billable. Leave empty to inherit from the project.", + "nullable": true + }, + "budgetHours": { + "title": "Budget Hours", + "type": "number", + "description": "Budgeted hours for this phase. Zero means no separate budget was agreed.", + "default": 0 + }, + "startDate": { + "title": "Start Date", + "type": "string", + "description": "Planned start of the phase (ISO 8601)", + "format": "date", + "nullable": true + }, + "endDate": { + "title": "End Date", + "type": "string", + "description": "Planned end of the phase (ISO 8601)", + "format": "date", + "nullable": true + }, + "metadata": { + "title": "Metadata", + "type": "object", + "description": "Declared catch-all for source-system fields: imported custom fields and provenance keys (e.g. jiraKey, jiraId, migratedAt). Declared explicitly so magic-table storage persists it.", + "default": {} + }, + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members may change this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + } + } + }, + "column": { + "slug": "column", + "icon": "ViewColumnOutline", + "version": "0.6.0", + "title": "Column", + "description": "A kanban column belonging to a project. Maps to schema:DefinedTerm.", + "x-schema-org": "schema:DefinedTerm", + "type": "object", + "required": [ + "title", + "project", + "order" + ], + "authorization": { + "read": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "viewers": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "portfolioReaders": { + "$contains": "$userId" + } + } + }, + { + "group": "admin" + } + ], + "create": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "update": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ], + "delete": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ] + }, + "properties": { + "title": { + "title": "Column Heading", + "type": "string", + "description": "Column heading (e.g. 'In Progress')" + }, + "project": { + "title": "Project", + "type": "string", + "description": "UUID of the parent Project", + "format": "uuid", + "$ref": "project" + }, + "members": { + "title": "Members", + "type": "array", + "description": "Nextcloud user UIDs of project members", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the project's members plus its owner. It is this object's access rule, {\"members\": {\"$contains\": \"$userId\"}}, because OpenRegister cannot match across schemas. ProjectMemberAccessListener writes it on every create and update, ProjectMembershipSyncListener when the project's membership changes, and the BackfillProjectMembers repair step on upgrade (planninq#681)." + }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the managers of the project's portfolio, who read the project and its objects without being members. ProjectPortfolioListener writes it on the project whenever the project moves or its portfolio's managers change, and ProjectMemberAccessListener copies it onto every project-scoped object (projects-grouping-hierarchy-fields, design decision 2)." + }, + "order": { + "title": "Display Order", + "type": "integer", + "description": "Left-to-right display order (0-based)", + "default": 0 + }, + "wipLimit": { + "title": "WIP Limit", + "type": "integer", + "description": "Work-in-progress limit (null = unlimited)", + "nullable": true + }, + "color": { + "title": "Header Colour", + "type": "string", + "description": "Hex colour code for the column header", + "pattern": "^#[0-9A-Fa-f]{6}$" + }, + "type": { + "title": "Column Type", + "type": "string", + "description": "Functional type: active columns hold in-flight work; done columns auto-complete tasks", + "enum": [ + "active", + "done" + ], + "default": "active" + }, + "status": { + "title": "Status", + "type": "string", + "description": "The status a card gets when it is moved into this column.", + "enum": [ + "open", + "in_progress", + "blocked", + "done", + "cancelled" + ], + "nullable": true + }, + "automation": { + "title": "Rules", + "type": "array", + "description": "What happens to a card when it enters this column, applied in list order.", + "items": { + "type": "object", + "required": [ + "action" + ], + "properties": { + "action": { + "title": "Action", + "description": "What the rule does to the card.", + "type": "string", + "enum": [ + "setPriority", + "assign", + "assignMover", + "unassign", + "addLabel" + ] + }, + "value": { + "title": "Value", + "description": "The priority, the user id or the label id the action uses; empty for actions without one.", + "type": "string", + "nullable": true + } + } + }, + "default": [], + "x-notes": "Edited in the board's Rules dialog by the project owner (ColumnOwnerGuardListener). ColumnAutomationListener applies the rules in the same save that moves a task into this column, and checks every value itself because data merged by a pre-save listener is not validated again (boards-column-automation)." + }, + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members may change this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + } + } + }, + "plannedTimeEntry": { + "slug": "plannedTimeEntry", + "icon": "TimerOutline", + "version": "0.5.0", + "title": "Time Entry", + "description": "Time logged by a user against a task. Maps to schema:QuantitativeValue.", + "x-schema-org": "schema:QuantitativeValue", + "type": "object", + "required": [ + "task", + "user", + "duration", + "date" + ], + "authorization": { + "read": [ + { + "group": "authenticated", + "match": { + "user": "$userId" + } + }, + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "viewers": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "portfolioReaders": { + "$contains": "$userId" + } + } + }, + { + "group": "admin" + } + ], + "create": [ + { + "group": "authenticated", + "match": { + "user": "$userId" + } + }, + { + "group": "admin" + } + ], + "update": [ + { + "group": "authenticated", + "match": { + "user": "$userId" + } + }, + { + "group": "admin" + } + ], + "delete": [ + { + "group": "authenticated", + "match": { + "user": "$userId" + } + }, + { + "group": "admin" + } + ] + }, + "properties": { + "timeEntry": { + "title": "Urenboeking", + "title:en": "Time entry", + "type": "string", + "description": "De humaniq `TimeEntry` waarop deze uren geboekt zijn. Een platte uuid en geen `$ref`: humaniq's register is een ander register, en ADR-062 regel 7 geeft een doel buiten dit register geen `$ref`.", + "description:en": "The humaniq `TimeEntry` these hours are booked on. A plain uuid and not a `$ref`: humaniq's register is a different register, and ADR-062 rule 7 gives a cross-register target no `$ref`.", + "format": "uuid", + "facetable": true + }, + "task": { + "title": "Task", + "type": "string", + "description": "UUID of the related Task", + "format": "uuid", + "$ref": "task" + }, + "user": { + "title": "User", + "type": "string", + "description": "Nextcloud user UID of the person who logged the time" + }, + "contractorRef": { + "title": "Contractor", + "type": "string", + "description": "UUID reference to the contractor contact/domain object — the portal-subject scoping key; distinct from user which is the Nextcloud user id", + "format": "uuid", + "nullable": true, + "x-external-register": "openregister" + }, + "duration": { + "title": "Duration", + "type": "integer", + "description": "Time logged in minutes" + }, + "date": { + "title": "Work Date", + "type": "string", + "description": "Date the work was performed (ISO 8601)", + "format": "date" + }, + "description": { + "title": "Note", + "type": "string", + "description": "Optional note about the work performed" + }, + "project": { + "title": "Project", + "type": "string", + "description": "UUID of the Project this time was booked against. Denormalised from the task so time can be totalled per project in one query.", + "format": "uuid", + "nullable": true, + "$ref": "project" + }, + "members": { + "title": "Members", + "type": "array", + "description": "Nextcloud user UIDs of project members", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the project's members plus its owner. It is this object's access rule, {\"members\": {\"$contains\": \"$userId\"}}, because OpenRegister cannot match across schemas. ProjectMemberAccessListener writes it on every create and update, ProjectMembershipSyncListener when the project's membership changes, and the BackfillProjectMembers repair step on upgrade (planninq#681)." + }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the managers of the project's portfolio, who read the project and its objects without being members. ProjectPortfolioListener writes it on the project whenever the project moves or its portfolio's managers change, and ProjectMemberAccessListener copies it onto every project-scoped object (projects-grouping-hierarchy-fields, design decision 2)." + }, + "billable": { + "title": "Billable", + "type": "boolean", + "description": "Whether this time is billable. Leave empty to inherit from the task, phase or project.", + "nullable": true + }, + "hourlyRate": { + "title": "Hourly Rate", + "type": "number", + "description": "Rate applied to this entry. Zero or empty falls back to the project rate.", + "default": 0 + }, + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members may change this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + } + } + }, + "label": { + "slug": "label", + "icon": "TagOutline", + "version": "0.1.0", + "title": "Label", + "description": "A colour-coded tag applicable to tasks and projects. Maps to schema:DefinedTerm.", + "x-schema-org": "schema:DefinedTerm", + "type": "object", + "required": [ + "title", + "color" + ], + "authorization": { + "read": [ + "authenticated" + ], + "create": [ + "admin" + ], + "update": [ + "admin" + ], + "delete": [ + "admin" + ] + }, + "properties": { + "title": { + "title": "Label Name", + "type": "string", + "description": "Label display name" + }, + "color": { + "title": "Colour", + "type": "string", + "description": "Hex colour for the label chip", + "pattern": "^#[0-9A-Fa-f]{6}$", + "default": "#4376FC" + }, + "description": { + "title": "Usage Guidance", + "type": "string", + "description": "Optional explanation of when to use this label" + } + } + }, + "dependency": { + "slug": "dependency", + "icon": "VectorPolyline", + "version": "0.2.0", + "title": "Dependency", + "description": "A directed dependency edge between two tasks of the same project (blocker → blocked). One row per directed edge. Maps to schema:Action.", + "x-schema-org": "schema:Action", + "type": "object", + "required": [ + "blocker", + "blocked" + ], + "authorization": { + "read": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "create": [ + "admin" + ], + "update": [ + "admin" + ], + "delete": [ + "admin" + ] + }, + "properties": { + "blocker": { + "title": "Blocker Task", + "type": "string", + "description": "UUID of the task that blocks (must complete before the blocked task can proceed)", + "format": "uuid", + "$ref": "task" + }, + "blocked": { + "title": "Blocked Task", + "type": "string", + "description": "UUID of the task that is blocked (waits on the blocker)", + "format": "uuid", + "$ref": "task" + }, + "type": { + "title": "Link Type", + "type": "string", + "description": "Kind of relation the edge expresses. blocks keeps the original blocker/blocked semantics; other values model non-blocking links between work items.", + "enum": [ + "blocks", + "relates", + "duplicates", + "clones", + "splits", + "causes" + ], + "default": "blocks" + } + } + }, + "timetableSession": { + "slug": "timetableSession", + "icon": "ClockOutline", + "version": "0.4.0", + "title": "Timetable session", + "description": "One lesson in a school timetable as the rostering system knows it: when it runs, for which group, with which teacher, in which room and for which subject. Delivered by a rostering import and matched again by source and occurrence id.", + "x-schema-org": "schema:Event", + "type": "object", + "required": [ + "externalRef", + "sourceSystem", + "subject", + "startsAt", + "endsAt" + ], + "authorization": { + "read": [ + { + "group": "planninq-timetable", + "match": { + "status": { + "$in": [ + "scheduled", + "cancelled" + ] + } + } + }, + { + "group": "authenticated", + "match": { + "teacherUserId": "$userId" + } + }, + { + "group": "admin" + } + ], + "create": [ + "admin" + ], + "update": [ + "admin" + ], + "delete": [ + "admin" + ] + }, + "properties": { + "externalRef": { + "title": "Source id", + "type": "string", + "description": "The id the rostering system gives this lesson. A new delivery with the same id and source updates this lesson instead of adding one." + }, + "sourceSystem": { + "title": "Source", + "type": "string", + "description": "The system that delivered this lesson, for example roster-zermelo, or manual for a lesson typed in by hand.", + "facetable": true + }, + "subject": { + "title": "Subject", + "type": "string", + "description": "The subject as the school names it.", + "facetable": true + }, + "title": { + "title": "Title", + "type": "string", + "description": "The name shown for this lesson. Left empty, the subject is shown." + }, + "startsAt": { + "title": "Starts at", + "type": "string", + "description": "When the lesson starts.", + "format": "date-time" + }, + "endsAt": { + "title": "Ends at", + "type": "string", + "description": "When the lesson ends.", + "format": "date-time" + }, + "groupReference": { + "title": "Group code", + "type": "string", + "description": "The code the school uses for the group or class.", + "facetable": true + }, + "cohortId": { + "title": "Cohort", + "type": "string", + "description": "The cohort this lesson is for, when the school code is linked to one." + }, + "teacherReference": { + "title": "Teacher code", + "type": "string", + "description": "The code the school uses for the teacher.", + "facetable": true + }, + "teacherUserId": { + "title": "Teacher account", + "type": "string", + "description": "The Nextcloud account of the teacher, when the teacher code is linked to one." + }, + "roomReference": { + "title": "Room code", + "type": "string", + "description": "The code the school uses for the room.", + "facetable": true + }, + "roomLabel": { + "title": "Room", + "type": "string", + "description": "The room name shown with the lesson." + }, + "courseId": { + "title": "Course", + "type": "string", + "format": "uuid", + "nullable": true, + "description": "The course this lesson teaches, such as an elective, when the school's learning app knows it." + }, + "onlineMeetingUrl": { + "title": "Online meeting link", + "type": "string", + "format": "uri", + "nullable": true, + "maxLength": 2048, + "description": "Where pupils join this lesson online. Pupils see a Join button only for an https link." + }, + "status": { + "title": "Status", + "type": "string", + "description": "Whether the lesson is a draft only its teacher sees, goes ahead or is cancelled.", + "enum": [ + "draft", + "scheduled", + "cancelled" + ], + "default": "scheduled", + "x-enum-labels": { + "draft": "Draft", + "scheduled": "Scheduled", + "cancelled": "Cancelled" + } + }, + "importedAt": { + "title": "Imported at", + "type": "string", + "description": "When this lesson was last delivered. Set by planninq.", + "format": "date-time" + } + } + }, + "projectLogEntry": { + "slug": "projectLogEntry", + "icon": "NotebookOutline", + "version": "0.3.0", + "title": "Log entry", + "description": "An issue, lesson learned, meeting or decision recorded in a project's log.", + "x-schema-org": "schema:Comment", + "type": "object", + "required": [ + "title", + "project", + "type", + "date" + ], + "authorization": { + "read": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "viewers": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "portfolioReaders": { + "$contains": "$userId" + } + } + }, + { + "group": "admin" + } + ], + "create": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "update": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ], + "delete": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ] + }, + "properties": { + "title": { + "title": "Title", + "type": "string", + "description": "A short name for the entry" + }, + "project": { + "title": "Project", + "type": "string", + "description": "The project this entry belongs to", + "format": "uuid", + "$ref": "project" + }, + "members": { + "title": "Members", + "type": "array", + "description": "Nextcloud user UIDs of project members", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the project's members plus its owner. It is this object's access rule, {\"members\": {\"$contains\": \"$userId\"}}, because OpenRegister cannot match across schemas. ProjectMemberAccessListener writes it on every create and update, ProjectMembershipSyncListener when the project's membership changes, and the BackfillProjectMembers repair step on upgrade (planninq#681)." + }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the managers of the project's portfolio, who read the project and its objects without being members. ProjectPortfolioListener writes it on the project whenever the project moves or its portfolio's managers change, and ProjectMemberAccessListener copies it onto every project-scoped object (projects-grouping-hierarchy-fields, design decision 2)." + }, + "type": { + "title": "Type", + "type": "string", + "description": "What kind of entry this is", + "enum": [ + "issue", + "lesson", + "meeting", + "decision" + ], + "default": "issue", + "x-enum-labels": { + "issue": "Issue", + "lesson": "Lesson learned", + "meeting": "Meeting", + "decision": "Decision" + } + }, + "date": { + "title": "Date", + "type": "string", + "description": "When it happened", + "format": "date" + }, + "body": { + "title": "Details", + "type": "string", + "description": "What happened, in Markdown" + }, + "status": { + "title": "Status", + "type": "string", + "description": "Whether an issue is still open", + "enum": [ + "open", + "closed" + ], + "default": "open", + "x-enum-labels": { + "open": "Open", + "closed": "Closed" + } + }, + "attendees": { + "title": "Attendees", + "type": "array", + "description": "The people at a meeting", + "items": { + "type": "string" + }, + "default": [] + }, + "actions": { + "title": "Actions", + "type": "array", + "description": "Tasks that came out of this entry", + "items": { + "type": "string", + "format": "uuid" + }, + "default": [], + "x-notes": "Ids of task objects with issueType 'action' in the same project. The author and the time of an entry are OpenRegister's own object metadata (@self.owner, @self.created), so a client cannot set them (projects-overview-logs-risks, design decision 2)." + }, + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members may change this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + } + } + }, + "risk": { + "slug": "risk", + "icon": "AlertOutline", + "version": "0.3.0", + "title": "Risk", + "description": "A risk to a project, scored on likelihood and impact, with an owner, a response and its countermeasures.", + "x-schema-org": "schema:Thing", + "type": "object", + "required": [ + "title", + "project", + "likelihood", + "impact" + ], + "authorization": { + "read": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "viewers": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "portfolioReaders": { + "$contains": "$userId" + } + } + }, + { + "group": "admin" + } + ], + "create": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "update": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ], + "delete": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ] + }, + "x-openregister-calculations": { + "score": { + "type": "integer", + "materialise": true, + "expression": { + "*": [ + { + "prop": "likelihood" + }, + { + "prop": "impact" + } + ] + } + } + }, + "properties": { + "title": { + "title": "Title", + "type": "string", + "description": "What could go wrong" + }, + "project": { + "title": "Project", + "type": "string", + "description": "The project this risk belongs to", + "format": "uuid", + "$ref": "project" + }, + "members": { + "title": "Members", + "type": "array", + "description": "Nextcloud user UIDs of project members", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the project's members plus its owner. It is this object's access rule, {\"members\": {\"$contains\": \"$userId\"}}, because OpenRegister cannot match across schemas. ProjectMemberAccessListener writes it on every create and update, ProjectMembershipSyncListener when the project's membership changes, and the BackfillProjectMembers repair step on upgrade (planninq#681)." + }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the managers of the project's portfolio, who read the project and its objects without being members. ProjectPortfolioListener writes it on the project whenever the project moves or its portfolio's managers change, and ProjectMemberAccessListener copies it onto every project-scoped object (projects-grouping-hierarchy-fields, design decision 2)." + }, + "description": { + "title": "Description", + "type": "string", + "description": "The cause and the effect, in Markdown" + }, + "category": { + "title": "Category", + "type": "string", + "description": "A free grouping, such as planning, budget or supplier" + }, + "likelihood": { + "title": "Likelihood", + "type": "integer", + "description": "How likely it is, on the admin's risk scale", + "minimum": 1, + "maximum": 5 + }, + "impact": { + "title": "Impact", + "type": "integer", + "description": "How hard it would hit, on the admin's risk scale", + "minimum": 1, + "maximum": 5 + }, + "score": { + "title": "Score", + "type": "integer", + "description": "Likelihood times impact, calculated by the server", + "x-notes": "Materialised by OpenRegister from x-openregister-calculations on every save; a score a client sends is overwritten (projects-overview-logs-risks, design decision 3)." + }, + "status": { + "title": "Status", + "type": "string", + "description": "Where the risk stands", + "enum": [ + "open", + "mitigating", + "closed", + "occurred" + ], + "default": "open", + "x-enum-labels": { + "open": "Open", + "mitigating": "Mitigating", + "closed": "Closed", + "occurred": "Occurred" + } + }, + "owner": { + "title": "Owner", + "type": "string", + "description": "The person who watches this risk" + }, + "response": { + "title": "Response", + "type": "string", + "description": "How the project answers the risk", + "enum": [ + "avoid", + "reduce", + "transfer", + "accept" + ], + "default": "reduce", + "x-enum-labels": { + "avoid": "Avoid", + "reduce": "Reduce", + "transfer": "Transfer", + "accept": "Accept" + } + }, + "countermeasures": { + "title": "Countermeasures", + "type": "string", + "description": "What is done to prevent it or soften it, in Markdown" + }, + "reviewDate": { + "title": "Review date", + "type": "string", + "description": "When to look at this risk again", + "format": "date" + }, + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members may change this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + } + } + }, + "projectStatusReport": { + "slug": "projectStatusReport", + "icon": "ClipboardCheckOutline", + "version": "0.3.0", + "title": "Project status report", + "description": "A dated report on how a project stands on money, organisation, time, information, quality and risk (the GROTIK aspects), each with a note.", + "x-schema-org": "schema:Report", + "type": "object", + "required": [ + "project", + "reportDate", + "statusMoney", + "statusOrganisation", + "statusTime", + "statusInformation", + "statusQuality", + "statusRisk" + ], + "authorization": { + "read": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "viewers": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "portfolioReaders": { + "$contains": "$userId" + } + } + }, + { + "group": "admin" + } + ], + "create": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "update": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ], + "delete": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ] + }, + "x-openregister-calculations": { + "overall": { + "type": "string", + "materialise": true, + "expression": { + "if": [ + { + "or": [ + { + "eq": [ + { + "prop": "statusMoney" + }, + { + "lit": "offTrack" + } + ] + }, + { + "eq": [ + { + "prop": "statusOrganisation" + }, + { + "lit": "offTrack" + } + ] + }, + { + "eq": [ + { + "prop": "statusTime" + }, + { + "lit": "offTrack" + } + ] + }, + { + "eq": [ + { + "prop": "statusInformation" + }, + { + "lit": "offTrack" + } + ] + }, + { + "eq": [ + { + "prop": "statusQuality" + }, + { + "lit": "offTrack" + } + ] + }, + { + "eq": [ + { + "prop": "statusRisk" + }, + { + "lit": "offTrack" + } + ] + } + ] + }, + { + "lit": "offTrack" + }, + { + "if": [ + { + "or": [ + { + "eq": [ + { + "prop": "statusMoney" + }, + { + "lit": "atRisk" + } + ] + }, + { + "eq": [ + { + "prop": "statusOrganisation" + }, + { + "lit": "atRisk" + } + ] + }, + { + "eq": [ + { + "prop": "statusTime" + }, + { + "lit": "atRisk" + } + ] + }, + { + "eq": [ + { + "prop": "statusInformation" + }, + { + "lit": "atRisk" + } + ] + }, + { + "eq": [ + { + "prop": "statusQuality" + }, + { + "lit": "atRisk" + } + ] + }, + { + "eq": [ + { + "prop": "statusRisk" + }, + { + "lit": "atRisk" + } + ] + } + ] + }, + { + "lit": "atRisk" + }, + { + "lit": "onTrack" + } + ] + } + ] + } + } + }, + "properties": { + "project": { + "title": "Project", + "type": "string", + "description": "The project this report is about", + "format": "uuid", + "$ref": "project" + }, + "members": { + "title": "Members", + "type": "array", + "description": "Nextcloud user UIDs of project members", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the project's members plus its owner. It is this object's access rule, {\"members\": {\"$contains\": \"$userId\"}}, because OpenRegister cannot match across schemas. ProjectMemberAccessListener writes it on every create and update, ProjectMembershipSyncListener when the project's membership changes, and the BackfillProjectMembers repair step on upgrade (planninq#681)." + }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the managers of the project's portfolio, who read the project and its objects without being members. ProjectPortfolioListener writes it on the project whenever the project moves or its portfolio's managers change, and ProjectMemberAccessListener copies it onto every project-scoped object (projects-grouping-hierarchy-fields, design decision 2)." + }, + "reportDate": { + "title": "Report date", + "type": "string", + "description": "The day the report describes", + "format": "date" + }, + "statusMoney": { + "title": "Money", + "type": "string", + "description": "How the project stands on this aspect", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + } + }, + "noteMoney": { + "title": "Money note", + "type": "string", + "description": "A short explanation of this status" + }, + "statusOrganisation": { + "title": "Organisation", + "type": "string", + "description": "How the project stands on this aspect", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + } + }, + "noteOrganisation": { + "title": "Organisation note", + "type": "string", + "description": "A short explanation of this status" + }, + "statusTime": { + "title": "Time", + "type": "string", + "description": "How the project stands on this aspect", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + } + }, + "noteTime": { + "title": "Time note", + "type": "string", + "description": "A short explanation of this status" + }, + "statusInformation": { + "title": "Information", + "type": "string", + "description": "How the project stands on this aspect", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + } + }, + "noteInformation": { + "title": "Information note", + "type": "string", + "description": "A short explanation of this status" + }, + "statusQuality": { + "title": "Quality", + "type": "string", + "description": "How the project stands on this aspect", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + } + }, + "noteQuality": { + "title": "Quality note", + "type": "string", + "description": "A short explanation of this status" + }, + "statusRisk": { + "title": "Risk", + "type": "string", + "description": "How the project stands on this aspect", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + } + }, + "noteRisk": { + "title": "Risk note", + "type": "string", + "description": "A short explanation of this status" + }, + "overall": { + "title": "Overall", + "type": "string", + "description": "The worst of the six statuses, calculated by the server", + "enum": [ + "onTrack", + "atRisk", + "offTrack" + ], + "x-enum-labels": { + "onTrack": "On track", + "atRisk": "At risk", + "offTrack": "Off track" + }, + "x-notes": "Materialised by OpenRegister from x-openregister-calculations on every save; an overall a client sends is overwritten (portfolio-status-overview, design decision 1)." + }, + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members may change this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + } + } + }, + "projectPortfolio": { + "slug": "projectPortfolio", + "icon": "FolderMultipleOutline", + "version": "0.1.0", + "title": "Portfolio", + "description": "A group of projects run by the same people, such as a department or a programme. Its managers read every project in it.", + "x-schema-org": "schema:Collection", + "type": "object", + "required": [ + "title" + ], + "authorization": { + "read": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "create": [ + "admin" + ], + "update": [ + { + "group": "authenticated", + "match": { + "managers": { + "$contains": "$userId" + } + } + }, + { + "group": "admin" + } + ], + "delete": [ + "admin" + ] + }, + "properties": { + "title": { + "title": "Title", + "type": "string", + "description": "The name of the portfolio" + }, + "description": { + "title": "Description", + "type": "string", + "description": "What the portfolio holds and who runs it" + }, + "color": { + "title": "Color", + "type": "string", + "description": "A colour for the portfolio's section in project lists" + }, + "managers": { + "title": "Managers", + "type": "array", + "description": "Nextcloud user UIDs of the people who run the portfolio", + "items": { + "type": "string" + }, + "default": [] + }, + "order": { + "title": "Order", + "type": "integer", + "description": "Where the portfolio comes in project lists, lowest first", + "default": 0 + }, + "riskScale": { + "title": "Risk scale", + "type": "string", + "description": "This portfolio's own risk scale as JSON, in the same shape as the app-wide one. Empty means the app-wide scale." + } + } + }, + "financeLine": { + "slug": "financeLine", + "icon": "CurrencyEur", + "version": "0.1.1", + "title": "Finance line", + "description": "One amount of money on a project: a budget, a commitment, an actual cost or a forecast, in a cost category and optionally a phase. Written by the project owner, or by the finance system through the integration app.", + "x-schema-org": "schema:MonetaryAmount", + "type": "object", + "required": [ + "kind", + "amount" + ], + "authorization": { + "read": [ + { + "group": "authenticated", + "match": { + "financeReaders": { + "$contains": "$userId" + } + } + }, + { + "group": "planninq-finance-import" + }, + { + "group": "admin" + } + ], + "create": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "update": [ + { + "group": "authenticated", + "match": { + "projectOwner": "$userId" + } + }, + { + "group": "planninq-finance-import" + }, + { + "group": "admin" + } + ], + "delete": [ + { + "group": "authenticated", + "match": { + "projectOwner": "$userId" + } + }, + { + "group": "planninq-finance-import" + }, + { + "group": "admin" + } + ] + }, + "properties": { + "project": { + "title": "Project", + "type": "string", + "description": "The project this amount belongs to. Empty for a line from the finance system whose project number matches no project.", + "format": "uuid", + "$ref": "project", + "nullable": true + }, + "phase": { + "title": "Phase", + "type": "string", + "description": "The phase this amount belongs to, if any", + "format": "uuid", + "$ref": "projectPhase", + "nullable": true + }, + "category": { + "title": "Category", + "type": "string", + "description": "The cost category, one of the categories the admin set up" + }, + "kind": { + "title": "Kind", + "type": "string", + "description": "Whether the amount is a budget, a commitment, an actual cost or a forecast", + "enum": [ + "budget", + "commitment", + "actual", + "forecast" + ], + "x-enum-labels": { + "budget": "Budget", + "commitment": "Commitment", + "actual": "Actual cost", + "forecast": "Forecast" + } + }, + "amount": { + "title": "Amount", + "type": "number", + "description": "The amount in the reporting currency (euro)" + }, + "date": { + "title": "Date", + "type": "string", + "description": "The date the amount was booked or is expected", + "format": "date", + "nullable": true + }, + "description": { + "title": "Description", + "type": "string", + "description": "What the amount is for" + }, + "source": { + "title": "Source", + "type": "string", + "description": "Whether a person entered the line or the finance system sent it", + "enum": [ + "manual", + "import" + ], + "default": "manual", + "x-enum-labels": { + "manual": "Entered by hand", + "import": "From the finance system" + } + }, + "externalRef": { + "title": "Finance line id", + "type": "string", + "description": "The finance system's own id of this line. One imported line per id.", + "nullable": true + }, + "projectKey": { + "title": "Project number", + "type": "string", + "description": "The project number the finance system sent, matched against the project key", + "nullable": true + }, + "portfolio": { + "title": "Portfolio", + "type": "string", + "description": "The portfolio of the line's project, copied from the project so portfolio totals need one filter", + "format": "uuid", + "$ref": "projectPortfolio", + "nullable": true + }, + "financeReaders": { + "title": "Finance readers", + "type": "array", + "description": "Nextcloud user UIDs of the people who may see this amount: the project owner and the managers of its portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person. FinanceLineService writes it on every create and update and whenever the project's owner, portfolio or portfolio managers change (portfolio-finance, design decision 1)." + }, + "projectOwner": { + "title": "Project owner", + "type": "string", + "description": "Nextcloud user UID of the project owner, who may change and remove manual lines", + "nullable": true, + "visible": false, + "x-notes": "Kept by planninq, never edited by a person. FinanceLineService writes it on every create and update and whenever the project's owner, portfolio or portfolio managers change (portfolio-finance, design decision 1)." + } + } + }, + "projectField": { + "slug": "projectField", + "icon": "TextBoxOutline", + "version": "0.1.0", + "title": "Project field", + "description": "A field an admin adds to every project, such as a policy area or a contract value.", + "x-schema-org": "schema:PropertyValueSpecification", + "type": "object", + "required": [ + "key", + "label", + "type" + ], + "authorization": { + "read": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "create": [ + "admin" + ], + "update": [ + "admin" + ], + "delete": [ + "admin" + ] + }, + "properties": { + "key": { + "title": "Key", + "type": "string", + "description": "The stable name the value is stored under, in lower camel case. Keep it once projects use it.", + "pattern": "^[a-z][a-zA-Z0-9]*$" + }, + "label": { + "title": "Label", + "type": "string", + "description": "The name people see next to the field" + }, + "type": { + "title": "Type", + "type": "string", + "description": "What the field holds", + "enum": [ + "text", + "number", + "date", + "choice", + "person", + "boolean" + ], + "x-enum-labels": { + "text": "Text", + "number": "Number", + "date": "Date", + "choice": "Choice", + "person": "Person", + "boolean": "Yes or no" + } + }, + "options": { + "title": "Options", + "type": "array", + "description": "The choices of a choice field", + "items": { + "type": "string" + }, + "default": [] + }, + "required": { + "title": "Required", + "type": "boolean", + "description": "Whether a project must fill in the field", + "default": false + }, + "order": { + "title": "Order", + "type": "integer", + "description": "Where the field appears, lowest first", + "default": 0 + }, + "appliesTo": { + "title": "Applies to", + "type": "string", + "description": "What the field is added to", + "enum": [ + "project" + ], + "default": "project", + "x-enum-labels": { + "project": "Projects" + } + } + } + }, + "projectRelease": { + "slug": "projectRelease", + "icon": "MapMarkerPath", + "version": "0.2.0", + "title": "Release", + "description": "A named, dated delivery of a project that its tasks are planned against.", + "x-schema-org": "schema:CreativeWork", + "type": "object", + "required": [ + "title", + "project" + ], + "authorization": { + "read": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "viewers": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "portfolioReaders": { + "$contains": "$userId" + } + } + }, + { + "group": "admin" + } + ], + "create": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "update": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ], + "delete": [ + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "admin" + } + ] + }, + "properties": { + "title": { + "title": "Title", + "type": "string", + "description": "Name of the release" + }, + "project": { + "title": "Project", + "type": "string", + "description": "The project this release belongs to", + "format": "uuid", + "$ref": "project" + }, + "members": { + "title": "Members", + "type": "array", + "description": "Nextcloud user UIDs of project members", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the project's members plus its owner. It is this object's access rule, {\"members\": {\"$contains\": \"$userId\"}}, because OpenRegister cannot match across schemas. ProjectMemberAccessListener writes it on every create and update, ProjectMembershipSyncListener when the project's membership changes, and the BackfillProjectMembers repair step on upgrade (planninq#681)." + }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the managers of the project's portfolio, who read the project and its objects without being members. ProjectPortfolioListener writes it on the project whenever the project moves or its portfolio's managers change, and ProjectMemberAccessListener copies it onto every project-scoped object (projects-grouping-hierarchy-fields, design decision 2)." + }, + "description": { + "title": "Description", + "type": "string", + "description": "What this release delivers" + }, + "startDate": { + "title": "Start date", + "type": "string", + "description": "When work on the release starts", + "format": "date", + "nullable": true + }, + "releaseDate": { + "title": "Target date", + "type": "string", + "description": "The date the release is due", + "format": "date", + "nullable": true + }, + "status": { + "title": "Status", + "type": "string", + "description": "Whether the release is planned, released or archived", + "enum": [ + "planned", + "released", + "archived" + ], + "default": "planned", + "x-enum-labels": { + "planned": "Planned", + "released": "Released", + "archived": "Archived" + } + }, + "releasedAt": { + "title": "Released on", + "type": "string", + "description": "When the release was marked as released", + "format": "date-time", + "nullable": true + }, + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members may change this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + } + } + }, + "timetableWish": { + "slug": "timetableWish", + "icon": "AlertOutline", + "version": "0.1.0", + "title": "Timetable wish", + "description": "A wish the generator weighs. It always keeps a hard wish, and keeps a soft wish where it can.", + "x-schema-org": "schema:Demand", + "type": "object", + "required": [ + "appliesTo", + "reference", + "kind", + "strength" + ], + "authorization": { + "read": [ + { + "group": "planninq-timetable" + }, + { + "group": "admin" + } + ], + "create": [ + "admin" + ], + "update": [ + "admin" + ], + "delete": [ + "admin" + ] + }, + "properties": { + "appliesTo": { + "title": "Applies to", + "type": "string", + "description": "Whether the wish is about a teacher, a group, a room or one activity", + "enum": [ + "teacher", + "group", + "room", + "activity" + ], + "x-enum-labels": { + "teacher": "Teacher", + "group": "Group", + "room": "Room", + "activity": "Activity" + } + }, + "reference": { + "title": "Reference", + "type": "string", + "description": "The user, group, room or activity the wish is about", + "minLength": 1 + }, + "kind": { + "title": "Kind", + "type": "string", + "description": "What the wish asks for", + "enum": [ + "unavailable", + "avoid", + "maxPerDay", + "noGaps", + "sameRoom" + ], + "x-enum-labels": { + "unavailable": "Not on these periods", + "avoid": "Preferably not on these periods", + "maxPerDay": "At most a number of lessons a day", + "noGaps": "No free periods between lessons", + "sameRoom": "Always the same room" + } + }, + "periods": { + "title": "Periods", + "type": "array", + "description": "The periods of the week the wish is about, such as wed-5", + "items": { + "type": "string", + "pattern": "^(mon|tue|wed|thu|fri|sat|sun)-[1-9][0-9]?$" + }, + "default": [] + }, + "limit": { + "title": "Limit", + "type": "integer", + "nullable": true, + "description": "The most lessons a day, for a wish of that kind", + "minimum": 1 + }, + "strength": { + "title": "Strength", + "type": "string", + "description": "Whether the generator must keep the wish or should keep it", + "enum": [ + "hard", + "soft" + ], + "x-enum-labels": { + "hard": "Hard", + "soft": "Soft" + } + }, + "weight": { + "title": "Weight", + "type": "integer", + "nullable": true, + "description": "How much a soft wish counts, from 1 to 3", + "minimum": 1, + "maximum": 3 + }, + "note": { + "title": "Note", + "type": "string", + "description": "Why the wish exists" + } + } + }, + "timetableScenario": { + "slug": "timetableScenario", + "icon": "ChartTimeline", + "version": "0.1.0", + "title": "Timetable scenario", + "description": "One week pattern, made by the generator or taken from the current timetable. It keeps its input and how well it keeps the wishes.", + "x-schema-org": "schema:Schedule", + "type": "object", + "required": [ + "title", + "source", + "weekOf", + "windowFrom", + "windowTo", + "status" + ], + "authorization": { + "read": [ + { + "group": "planninq-timetable" + }, + { + "group": "admin" + } + ], + "create": [ + "admin" + ], + "update": [ + "admin" + ], + "delete": [ + "admin" + ] + }, + "properties": { + "title": { + "title": "Title", + "type": "string", + "description": "The name timetablers know the scenario by", + "minLength": 1 + }, + "source": { + "title": "Source", + "type": "string", + "description": "Whether the generator made it or it came from the current timetable", + "enum": [ + "generated", + "imported" + ], + "x-enum-labels": { + "generated": "Generated", + "imported": "From the current timetable" + } + }, + "weekOf": { + "title": "Week of", + "type": "string", + "format": "date", + "description": "The Monday of the first week of the window" + }, + "windowFrom": { + "title": "Window start", + "type": "string", + "format": "date", + "description": "The first day the week pattern applies to" + }, + "windowTo": { + "title": "Window end", + "type": "string", + "format": "date", + "description": "The last day the week pattern applies to" + }, + "status": { + "title": "Status", + "type": "string", + "description": "Waiting, generating, done, failed, or published as draft lessons", + "enum": [ + "queued", + "running", + "done", + "failed", + "published" + ], + "default": "queued", + "x-enum-labels": { + "queued": "Waiting", + "running": "Generating", + "done": "Done", + "failed": "Failed", + "published": "Published" + } + }, + "seed": { + "title": "Seed", + "type": "integer", + "nullable": true, + "description": "The number the generator starts from, so a run can be repeated" + }, + "input": { + "title": "Input", + "type": "object", + "description": "The periods, rooms, lessons and wishes the scenario was made from", + "required": [ + "periods", + "rooms", + "lessons", + "wishes" + ] + }, + "placements": { + "title": "Placements", + "type": "array", + "description": "Each lesson with the period and room it was given", + "items": { + "type": "object", + "required": [ + "lesson", + "period", + "room" + ] + }, + "default": [] + }, + "unplaced": { + "title": "Unplaced lessons", + "type": "array", + "description": "Lessons without a place, each with the hard wish that blocked it", + "items": { + "type": "object", + "required": [ + "lesson", + "wish" + ] + }, + "default": [] + }, + "brokenWishes": { + "title": "Broken wishes", + "type": "array", + "description": "The wishes this scenario breaks, with the lessons that break them", + "items": { + "type": "object", + "required": [ + "wish", + "lessons", + "weight" + ] + }, + "default": [] + }, + "metrics": { + "title": "Measures", + "type": "object", + "description": "Placed lessons, broken wishes, teacher gaps, lessons a day and room use" + }, + "reason": { + "title": "Reason", + "type": "string", + "description": "Why the run failed" + }, + "publishedAt": { + "title": "Published at", + "type": "string", + "nullable": true, + "format": "date-time", + "description": "When the scenario was written out as draft lessons" + } + } + }, + "boardFilter": { + "slug": "boardFilter", + "icon": "FilterVariant", + "version": "0.2.0", + "title": "Saved filter", + "description": "A named board filter of one project, private to the person who saved it unless shared with the project.", + "x-schema-org": "schema:SearchAction", + "type": "object", + "required": [ + "project", + "name" + ], + "authorization": { + "read": [ + { + "group": "authenticated", + "match": { + "owner": "$userId" + } + }, + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + }, + "shared": true + } + }, + { + "group": "authenticated", + "match": { + "viewers": { + "$contains": "$userId" + }, + "shared": true + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + }, + "shared": true + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + }, + "shared": true + } + }, + { + "group": "admin" + } ], "create": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], + "update": [ + { + "group": "authenticated", + "match": { + "owner": "$userId" + } + }, + { + "group": "admin" + } + ], + "delete": [ + { + "group": "authenticated", + "match": { + "owner": "$userId" + } + }, + { + "group": "admin" + } + ] + }, + "properties": { + "project": { + "title": "Project", + "type": "string", + "description": "The project whose board the filter applies to", + "format": "uuid", + "$ref": "project" + }, + "name": { + "title": "Name", + "type": "string", + "description": "The name the filter is listed under" + }, + "owner": { + "title": "Saved by", + "type": "string", + "description": "Nextcloud user id of the person who saved the filter", + "visible": false, + "x-notes": "Set by BoardFilterOwnerListener on create and kept on every update; it is the update and delete rule." + }, + "shared": { + "title": "Shared with the project", + "type": "boolean", + "description": "Whether every project member sees and applies the filter", + "default": false + }, + "criteria": { + "title": "Criteria", + "type": "object", + "description": "The filter: assignee, label, priority and due date, each with is or is not and its values", + "visible": false, + "x-notes": "Shape of src/utils/boardFilter.js normaliseFilter(); unknown values are dropped when applied." + }, + "members": { + "title": "Members", + "type": "array", + "description": "Nextcloud user UIDs of project members", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the project's members plus its owner. It is this object's access rule, {\"members\": {\"$contains\": \"$userId\"}}, because OpenRegister cannot match across schemas. ProjectMemberAccessListener writes it on every create and update, ProjectMembershipSyncListener when the project's membership changes, and the BackfillProjectMembers repair step on upgrade (planninq#681)." + }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the managers of the project's portfolio, who read the project and its objects without being members. ProjectPortfolioListener writes it on the project whenever the project moves or its portfolio's managers change, and ProjectMemberAccessListener copies it onto every project-scoped object (projects-grouping-hierarchy-fields, design decision 2)." + }, + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members may change this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + } + } + }, + "boardView": { + "slug": "boardView", + "icon": "ViewDashboardOutline", + "version": "0.1.0", + "title": "Cross-project view", + "description": "A saved selection of projects whose tasks are shown together in status lanes, shared with the people it names.", + "x-schema-org": "schema:ItemList", + "type": "object", + "required": [ + "title", + "projects" + ], + "authorization": { + "read": [ { "group": "authenticated", "match": { - "user": "$userId" + "owner": "$userId" + } + }, + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } } }, { "group": "admin" } ], + "create": [ + { + "group": "authenticated" + }, + { + "group": "admin" + } + ], "update": [ { "group": "authenticated", "match": { - "user": "$userId" + "owner": "$userId" } }, { @@ -749,7 +4477,7 @@ { "group": "authenticated", "match": { - "user": "$userId" + "owner": "$userId" } }, { @@ -758,149 +4486,524 @@ ] }, "properties": { - "task": { - "title": "Task", - "type": "string", - "description": "UUID of the related Task", - "format": "uuid", - "$ref": "task" - }, - "user": { - "title": "User", + "title": { + "title": "Name", "type": "string", - "description": "Nextcloud user UID of the person who logged the time" + "description": "The name the view is listed under", + "minLength": 1 }, - "contractorRef": { - "title": "Contractor", + "owner": { + "title": "Owner", "type": "string", - "description": "UUID reference to the contractor contact/domain object — the portal-subject scoping key; distinct from user which is the Nextcloud user id", - "format": "uuid", - "nullable": true, - "x-external-register": "openregister" - }, - "duration": { - "title": "Duration", - "type": "integer", - "description": "Time logged in minutes" + "description": "Nextcloud user id of the person who saved the view", + "visible": false, + "x-notes": "Set by BoardFilterOwnerListener on create and kept on every update; it is the update and delete rule." }, - "date": { - "title": "Work Date", - "type": "string", - "description": "Date the work was performed (ISO 8601)", - "format": "date" + "members": { + "title": "Shared with", + "type": "array", + "description": "Nextcloud user ids of the people the view is shared with", + "items": { + "type": "string" + }, + "default": [], + "x-notes": "Chosen by the owner. Unlike the project-scoped `members` lists this one is not kept by planninq: boardView is not project-scoped. Sharing a view shares no task: tasks are read with the viewer's own rights." }, - "description": { - "title": "Note", - "type": "string", - "description": "Optional note about the work performed" + "projects": { + "title": "Projects", + "type": "array", + "description": "The projects whose tasks the view shows, at most twenty", + "items": { + "type": "string", + "format": "uuid" + }, + "minItems": 1, + "maxItems": 20, + "x-notes": "Project ids only; the view holds no columns, card order or tasks (design decision 2)." } } }, - "label": { - "slug": "label", - "icon": "TagOutline", - "version": "0.1.0", - "title": "Label", - "description": "A colour-coded tag applicable to tasks and projects. Maps to schema:DefinedTerm.", - "x-schema-org": "schema:DefinedTerm", + "forgeLink": { + "slug": "forgeLink", + "icon": "SourceBranch", + "version": "0.2.0", + "title": "Code link", + "description": "A commit, branch, merge request or issue in a code forge that works on a task.", + "x-schema-org": "schema:SoftwareSourceCode", "type": "object", "required": [ - "title", - "color" + "url" ], "authorization": { "read": [ - "authenticated" + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "viewers": { + "$contains": "$userId" + } + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "viewerGroups": { + "$contains": "$user.groups" + } + } + }, + { + "group": "authenticated", + "match": { + "portfolioReaders": { + "$contains": "$userId" + } + } + }, + { + "group": "admin" + } ], "create": [ - "admin" + { + "group": "authenticated" + }, + { + "group": "admin" + } ], "update": [ - "admin" + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + }, + "source": "manual" + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + }, + "source": "manual" + } + }, + { + "group": "admin" + } ], "delete": [ - "admin" + { + "group": "authenticated", + "match": { + "members": { + "$contains": "$userId" + }, + "source": "manual" + } + }, + { + "group": "authenticated", + "match": { + "memberGroups": { + "$contains": "$user.groups" + }, + "source": "manual" + } + }, + { + "group": "admin" + } ] }, "properties": { + "task": { + "title": "Task", + "type": "string", + "description": "The task the link belongs to", + "format": "uuid", + "$ref": "task", + "x-notes": "Resolved by ForgeLinkResolveListener from taskKey when the integration writes the link; sent by the task page for a link added by hand." + }, + "project": { + "title": "Project", + "type": "string", + "description": "The project of the task", + "format": "uuid", + "$ref": "project", + "x-notes": "Copied from the task by ForgeLinkResolveListener; it scopes the read rule through `members`." + }, + "taskKey": { + "title": "Task key", + "type": "string", + "description": "The task key the forge text named, such as VC-12", + "maxLength": 1000, + "x-notes": "The integration may send the whole forge text (commit message, branch name or title); ForgeLinkResolveListener keeps the first key in it that belongs to a task, such as VC-12." + }, + "kind": { + "title": "Kind", + "type": "string", + "description": "What the link points at", + "enum": [ + "commit", + "branch", + "mergeRequest", + "issue", + "link" + ], + "default": "link" + }, + "url": { + "title": "Link", + "type": "string", + "description": "The address of the item in the forge", + "format": "uri", + "maxLength": 2048 + }, "title": { - "title": "Label Name", + "title": "Title", "type": "string", - "description": "Label display name" + "description": "The commit message, branch name or merge request title", + "maxLength": 500 + }, + "repository": { + "title": "Repository", + "type": "string", + "description": "The repository, such as acme/portal", + "maxLength": 255 + }, + "externalId": { + "title": "Forge id", + "type": "string", + "description": "The forge's own id for the item, such as github:acme/portal#42 or a commit hash", + "maxLength": 255, + "x-notes": "Unique per task: ForgeLinkResolveListener refuses a second link with the same id on the same task, so a webhook retry adds nothing." + }, + "state": { + "title": "State", + "type": "string", + "description": "The state of a merge request or issue", + "enum": [ + "", + "open", + "merged", + "closed" + ], + "default": "" + }, + "author": { + "title": "Author", + "type": "string", + "description": "Who made the commit or opened the merge request", + "maxLength": 255 + }, + "occurredAt": { + "title": "Date", + "type": "string", + "description": "When the commit was made or the merge request last changed", + "format": "date-time" + }, + "source": { + "title": "Added by", + "type": "string", + "description": "Whether a person added the link or the integration wrote it", + "enum": [ + "manual", + "integriq" + ], + "default": "manual", + "x-notes": "Members may change or remove a manual link only; an integration link is removed by an admin, because the next forge event would write it again." + }, + "members": { + "title": "Members", + "type": "array", + "description": "Nextcloud user UIDs of project members", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: the project's members plus its owner, written by ProjectMemberAccessListener and ProjectMembershipSyncListener. It is this object's access rule (planninq#681)." + }, + "portfolioReaders": { + "title": "Portfolio readers", + "type": "array", + "description": "Nextcloud user UIDs of the managers of the project's portfolio", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, copied from the project by ProjectMemberAccessListener (projects-grouping-hierarchy-fields)." }, - "color": { - "title": "Colour", - "type": "string", - "description": "Hex colour for the label chip", - "pattern": "^#[0-9A-Fa-f]{6}$", - "default": "#4376FC" + "viewers": { + "title": "Viewers", + "type": "array", + "description": "Nextcloud user ids who may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." }, - "description": { - "title": "Usage Guidance", - "type": "string", - "description": "Optional explanation of when to use this label" + "memberGroups": { + "title": "Member groups", + "type": "array", + "description": "Nextcloud groups whose members may change this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." + }, + "viewerGroups": { + "title": "Viewer groups", + "type": "array", + "description": "Nextcloud groups whose members may read this through the project", + "items": { + "type": "string" + }, + "default": [], + "visible": false, + "x-notes": "Kept by planninq, never edited by a person: a copy of the project's list, because OpenRegister evaluates no lookup into the project (planninq#681)." } } }, - "dependency": { - "slug": "dependency", - "icon": "VectorPolyline", - "version": "0.2.0", - "title": "Dependency", - "description": "A directed dependency edge between two tasks of the same project (blocker → blocked). One row per directed edge. Maps to schema:Action.", - "x-schema-org": "schema:Action", + "taskReport": { + "slug": "taskReport", + "icon": "ChartBar", + "version": "0.1.0", + "title": "Report", + "description": "A saved query over tasks: which projects, which filters, grouped by what, counted or summed, and shown as a table or a chart.", + "x-schema-org": "schema:Report", "type": "object", "required": [ - "blocker", - "blocked" + "title", + "groupBy", + "metric", + "display" ], "authorization": { "read": [ { - "group": "authenticated" + "group": "authenticated", + "match": { + "owner": "$userId" + } + }, + { + "group": "authenticated", + "match": { + "shared": "readers" + } }, { "group": "admin" } ], "create": [ - "admin" + { + "group": "authenticated" + }, + { + "group": "admin" + } ], "update": [ - "admin" + { + "group": "authenticated", + "match": { + "owner": "$userId" + } + }, + { + "group": "admin" + } ], "delete": [ - "admin" + { + "group": "authenticated", + "match": { + "owner": "$userId" + } + }, + { + "group": "admin" + } ] }, "properties": { - "blocker": { - "title": "Blocker Task", + "title": { + "title": "Name", "type": "string", - "description": "UUID of the task that blocks (must complete before the blocked task can proceed)", - "format": "uuid", - "$ref": "task" + "description": "The name the report is listed under", + "minLength": 1, + "maxLength": 200 }, - "blocked": { - "title": "Blocked Task", + "description": { + "title": "Description", "type": "string", - "description": "UUID of the task that is blocked (waits on the blocker)", - "format": "uuid", - "$ref": "task" + "description": "What the report shows and who it is for", + "nullable": true }, - "type": { - "title": "Link Type", + "owner": { + "title": "Owner", "type": "string", - "description": "Kind of relation the edge expresses. blocks keeps the original blocker/blocked semantics; other values model non-blocking links between work items.", + "description": "Nextcloud user id of the person who saved the report", + "visible": false, + "x-notes": "Set by BoardFilterOwnerListener on create and kept on every update; it is the update and delete rule." + }, + "shared": { + "title": "Shared", + "type": "string", + "description": "Who can open the report", "enum": [ - "blocks", - "relates", - "duplicates", - "clones", - "splits", - "causes" + "private", + "readers" ], - "default": "blocks" + "default": "private", + "x-enum-labels": { + "private": "Only me", + "readers": "Everyone who can read its projects" + }, + "x-notes": "A shared report stores a query, not results: every viewer runs it with their own rights (design decision 3)." + }, + "projects": { + "title": "Projects", + "type": "array", + "description": "The projects the report covers, at most fifty", + "items": { + "type": "string", + "format": "uuid" + }, + "default": [], + "maxItems": 50 + }, + "filters": { + "title": "Filters", + "type": "object", + "description": "Task fields and the value each must equal; empty when the report covers every task", + "additionalProperties": false, + "properties": { + "status": { + "title": "Status", + "description": "The status a task must have", + "type": "string" + }, + "priority": { + "title": "Priority", + "description": "The priority a task must have", + "type": "string" + }, + "assignedTo": { + "title": "Assignee", + "description": "The user a task must be assigned to", + "type": "string" + }, + "labels": { + "title": "Label", + "description": "A label a task must carry", + "type": "string" + }, + "column": { + "title": "Column", + "description": "The board column a task must be in", + "type": "string" + }, + "issueType": { + "title": "Issue type", + "description": "The issue type a task must have", + "type": "string" + } + }, + "x-notes": "Equality only: OpenRegister's aggregation ignores any other operator.", + "nullable": true + }, + "groupBy": { + "title": "Group by", + "type": "string", + "description": "The task field the report groups on", + "enum": [ + "status", + "priority", + "assignedTo", + "labels", + "project", + "column" + ], + "x-enum-labels": { + "status": "Status", + "priority": "Priority", + "assignedTo": "Assignee", + "labels": "Label", + "project": "Project", + "column": "Column" + } + }, + "metric": { + "title": "Measure", + "type": "string", + "description": "Count the tasks, or add up a number on them", + "enum": [ + "count", + "sum" + ], + "default": "count", + "x-enum-labels": { + "count": "Number of tasks", + "sum": "Sum" + } + }, + "sumField": { + "title": "Sum of", + "type": "string", + "description": "The number added up when the measure is a sum", + "enum": [ + "storyPoints", + "estimatedDuration" + ], + "nullable": true, + "x-enum-labels": { + "storyPoints": "Story points", + "estimatedDuration": "Estimated duration" + } + }, + "display": { + "title": "Display", + "type": "string", + "description": "How the report is shown", + "enum": [ + "table", + "bar", + "donut" + ], + "default": "bar", + "x-enum-labels": { + "table": "Table", + "bar": "Bar", + "donut": "Donut" + } } } } @@ -960,360 +5063,7 @@ "title": "Infrastructure", "color": "#F39C12", "description": "DevOps, deployment, and server work" - }, - { - "@self": { - "register": "planninq", - "schema": "project", - "slug": "client-portal-v2", - "id": "00000000-0000-4000-a000-000000000001" - }, - "title": "Client Portal v2", - "description": "Redesign and rebuild the self-service client portal using NL Design System components.", - "status": "active", - "color": "#4376FC", - "icon": "Web", - "owner": "admin", - "members": [ - "admin", - "jdoe", - "mvanderberg" - ], - "defaultAssignee": "jdoe" - }, - { - "@self": { - "register": "planninq", - "schema": "project", - "slug": "infrastructure-migration", - "id": "00000000-0000-4000-a000-000000000002" - }, - "title": "Infrastructure Migration", - "description": "Migrate on-premise services to managed Kubernetes cluster before Q3.", - "status": "active", - "color": "#F39C12", - "icon": "CloudUpload", - "owner": "admin", - "members": [ - "admin", - "ksmits" - ], - "defaultAssignee": "ksmits" - }, - { - "@self": { - "register": "planninq", - "schema": "project", - "slug": "onboarding-automation", - "id": "00000000-0000-4000-a000-000000000003" - }, - "title": "Onboarding Automation", - "description": "Automate new-employee onboarding workflows via n8n and Nextcloud.", - "status": "active", - "color": "#27AE60", - "icon": "AccountMultiplePlus", - "owner": "admin", - "members": [ - "admin", - "jdoe", - "mvanderberg", - "ksmits" - ], - "defaultAssignee": "admin" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "portal-todo", - "id": "00000000-0000-4000-b000-000000000001" - }, - "title": "To Do", - "project": "00000000-0000-4000-a000-000000000001", - "order": 0, - "wipLimit": null, - "type": "active" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "portal-in-progress", - "id": "00000000-0000-4000-b000-000000000002" - }, - "title": "In Progress", - "project": "00000000-0000-4000-a000-000000000001", - "order": 1, - "wipLimit": 3, - "type": "active" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "portal-review", - "id": "00000000-0000-4000-b000-000000000003" - }, - "title": "Review", - "project": "00000000-0000-4000-a000-000000000001", - "order": 2, - "wipLimit": 2, - "type": "active" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "portal-done", - "id": "00000000-0000-4000-b000-000000000004" - }, - "title": "Done", - "project": "00000000-0000-4000-a000-000000000001", - "order": 3, - "wipLimit": null, - "type": "done" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "infra-todo", - "id": "00000000-0000-4000-b000-000000000005" - }, - "title": "To Do", - "project": "00000000-0000-4000-a000-000000000002", - "order": 0, - "wipLimit": null, - "type": "active" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "infra-in-progress", - "id": "00000000-0000-4000-b000-000000000006" - }, - "title": "In Progress", - "project": "00000000-0000-4000-a000-000000000002", - "order": 1, - "wipLimit": 3, - "type": "active" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "infra-review", - "id": "00000000-0000-4000-b000-000000000007" - }, - "title": "Review", - "project": "00000000-0000-4000-a000-000000000002", - "order": 2, - "wipLimit": 2, - "type": "active" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "infra-done", - "id": "00000000-0000-4000-b000-000000000008" - }, - "title": "Done", - "project": "00000000-0000-4000-a000-000000000002", - "order": 3, - "wipLimit": null, - "type": "done" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "onboard-todo", - "id": "00000000-0000-4000-b000-000000000009" - }, - "title": "To Do", - "project": "00000000-0000-4000-a000-000000000003", - "order": 0, - "wipLimit": null, - "type": "active" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "onboard-in-progress", - "id": "00000000-0000-4000-b000-000000000010" - }, - "title": "In Progress", - "project": "00000000-0000-4000-a000-000000000003", - "order": 1, - "wipLimit": 3, - "type": "active" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "onboard-review", - "id": "00000000-0000-4000-b000-000000000011" - }, - "title": "Review", - "project": "00000000-0000-4000-a000-000000000003", - "order": 2, - "wipLimit": 2, - "type": "active" - }, - { - "@self": { - "register": "planninq", - "schema": "column", - "slug": "onboard-done", - "id": "00000000-0000-4000-b000-000000000012" - }, - "title": "Done", - "project": "00000000-0000-4000-a000-000000000003", - "order": 3, - "wipLimit": null, - "type": "done" - }, - { - "@self": { - "register": "planninq", - "schema": "task", - "slug": "fix-login-redirect", - "id": "00000000-0000-4000-d000-000000000001" - }, - "title": "Fix login page redirect bug", - "description": "After OAuth login the user is redirected to / instead of the originally requested page.", - "status": "in_progress", - "priority": "high", - "project": "00000000-0000-4000-a000-000000000001", - "column": "00000000-0000-4000-b000-000000000002", - "columnOrder": 0, - "assignedTo": "jdoe", - "dueDate": "2026-04-10", - "labels": [ - "00000000-0000-4000-c000-000000000001" - ], - "percentComplete": 40 - }, - { - "@self": { - "register": "planninq", - "schema": "task", - "slug": "design-dashboard-widgets", - "id": "00000000-0000-4000-d000-000000000002" - }, - "title": "Design dashboard widget layout", - "description": "Create Figma mockups for the new widget-based dashboard using NL Design System tokens.", - "status": "open", - "priority": "normal", - "project": "00000000-0000-4000-a000-000000000001", - "column": "00000000-0000-4000-b000-000000000001", - "columnOrder": 0, - "assignedTo": "mvanderberg", - "dueDate": "2026-04-18", - "labels": [ - "00000000-0000-4000-c000-000000000004" - ] - }, - { - "@self": { - "register": "planninq", - "schema": "task", - "slug": "write-api-docs", - "id": "00000000-0000-4000-d000-000000000003" - }, - "title": "Write REST API documentation", - "description": "Document all public endpoints in OpenAPI 3.0.0 format and publish to developer portal.", - "status": "open", - "priority": "normal", - "project": "00000000-0000-4000-a000-000000000001", - "column": "00000000-0000-4000-b000-000000000001", - "columnOrder": 1, - "assignedTo": "jdoe", - "labels": [ - "00000000-0000-4000-c000-000000000003" - ], - "estimatedDuration": 240 - }, - { - "@self": { - "register": "planninq", - "schema": "task", - "slug": "k8s-namespace-setup", - "id": "00000000-0000-4000-d000-000000000004" - }, - "title": "Set up production Kubernetes namespaces", - "description": "Create namespaces, resource quotas, and network policies for prod environment.", - "status": "open", - "priority": "urgent", - "project": "00000000-0000-4000-a000-000000000002", - "column": "00000000-0000-4000-b000-000000000005", - "columnOrder": 0, - "assignedTo": "ksmits", - "dueDate": "2026-04-07", - "labels": [ - "00000000-0000-4000-c000-000000000005" - ] - }, - { - "@self": { - "register": "planninq", - "schema": "task", - "slug": "onboarding-n8n-workflow", - "id": "00000000-0000-4000-d000-000000000005" - }, - "title": "Build n8n onboarding workflow", - "description": "Create the automated onboarding flow: create NC account, add to groups, send welcome email, generate Planninq project.", - "status": "open", - "priority": "normal", - "project": "00000000-0000-4000-a000-000000000003", - "column": "00000000-0000-4000-b000-000000000009", - "columnOrder": 0, - "assignedTo": "admin", - "estimatedDuration": 180, - "labels": [ - "00000000-0000-4000-c000-000000000002" - ] - }, - { - "@self": { - "register": "planninq", - "schema": "timeEntry", - "slug": "te-fix-login-2026-04-01" - }, - "task": "00000000-0000-4000-d000-000000000001", - "user": "jdoe", - "duration": 90, - "date": "2026-04-01", - "description": "Traced redirect issue to missing redirect_uri state parameter in OAuth middleware." - }, - { - "@self": { - "register": "planninq", - "schema": "timeEntry", - "slug": "te-fix-login-2026-04-02" - }, - "task": "00000000-0000-4000-d000-000000000001", - "user": "jdoe", - "duration": 60, - "date": "2026-04-02", - "description": "Implemented fix and wrote unit test." - }, - { - "@self": { - "register": "planninq", - "schema": "timeEntry", - "slug": "te-k8s-2026-04-01" - }, - "task": "00000000-0000-4000-d000-000000000004", - "user": "ksmits", - "duration": 45, - "date": "2026-04-01", - "description": "Drafted namespace YAML manifests for review." } ] } -} \ No newline at end of file +} diff --git a/lib/Timetabling/LocalSearchSolver.php b/lib/Timetabling/LocalSearchSolver.php new file mode 100644 index 00000000..b59c8910 --- /dev/null +++ b/lib/Timetabling/LocalSearchSolver.php @@ -0,0 +1,353 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Timetabling; + + +/** + * Greedy construction, simulated annealing, and a repair pass for hard wishes. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ +final class LocalSearchSolver implements TimetableSolver { + + /** + * Moves tried in one call; the job's 60-second steps repeat calls from the best state. + */ + public const STEP_ITERATIONS = 4000; + + /** + * The starting temperature, in cost units: a few soft wishes. + */ + private const START_TEMPERATURE = 40.0; + + /** + * Constructor. + * + * @param TimetableScorer $scorer The cost the search minimises. + * @param PlacementOptions $options The options per lesson. + * @param WishChecker $wishes Evaluates the wishes. + * @param int $iterations Moves per call. + * + * @return void + */ + public function __construct( + private readonly TimetableScorer $scorer=new TimetableScorer(), + private readonly PlacementOptions $options=new PlacementOptions(), + private readonly WishChecker $wishes=new WishChecker(), + private readonly int $iterations=self::STEP_ITERATIONS, + ) { + }//end __construct() + + /** + * Place the lessons. + * + * @param SolverInput $input What to place. + * @param int $seconds The most time this call may take. + * @param int $seed The seed. + * @param array $start Placements to continue from. + * + * @return SolverResult + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function solve(SolverInput $input, int $seconds, int $seed, array $start=[]): SolverResult { + $deadline = (microtime(true) + max(1, $seconds)); + $lessons = array_column($input->lessons, null, 'key'); + $built = $this->options->build(input: $input); + $state = new SearchState(lessons: $lessons); + $random = new SeededRandom(seed: $seed); + + $this->resume(state: $state, options: $built['options'], start: $start); + $this->construct(input: $input, state: $state, options: $built['options']); + [$best, $iterations] = $this->anneal(input: $input, state: $state, options: $built['options'], random: $random, deadline: $deadline); + + $state = new SearchState(lessons: $lessons); + $this->resume(state: $state, options: $built['options'], start: $best); + $repaired = $this->repair(input: $input, state: $state); + + return $this->result( + input: $input, + state: $state, + blockers: $built['blockers'], + repaired: $repaired, + iterations: $iterations + ); + }//end solve() + + /** + * Put back the placements of an earlier step that are still options and free. + * + * @param SearchState $state The state. + * @param array>> $options The options per lesson. + * @param array $start The earlier placements. + * + * @return void + */ + private function resume(SearchState $state, array $options, array $start): void { + foreach ($start as $placement) { + $key = (string)($placement['lesson'] ?? ''); + foreach (($options[$key] ?? []) as $option) { + if ($option['period'] === (string)$placement['period'] && $option['room'] === (string)$placement['room']) { + $state->place(key: $key, option: $option); + break; + } + } + } + }//end resume() + + /** + * Place every lesson not yet placed, the one with the fewest options first, on its cheapest free option. + * + * @param SolverInput $input The input. + * @param SearchState $state The state. + * @param array>> $options The options per lesson. + * + * @return void + */ + private function construct(SolverInput $input, SearchState $state, array $options): void { + $order = array_keys($options); + usort($order, static fn (string $one, string $two): int => [count($options[$one]), $one] <=> [count($options[$two]), $two]); + $lessons = array_column($input->lessons, null, 'key'); + $soft = array_values(array_filter($input->wishes, static fn (array $wish): bool => ($wish['strength'] ?? 'soft') !== 'hard')); + foreach ($order as $key) { + if ($state->option(key: (string)$key) !== null) { + continue; + } + + $choice = null; + $lowest = PHP_INT_MAX; + foreach ($options[$key] as $option) { + $price = $this->price(lesson: $lessons[$key], option: $option, soft: $soft, state: $state); + if ($price < $lowest && $state->fits(key: (string)$key, option: $option) === true) { + $choice = $option; + $lowest = $price; + } + } + + if ($choice !== null) { + $state->place(key: (string)$key, option: $choice); + } + }//end foreach + }//end construct() + + /** + * The local price of an option while constructing: the soft wishes it breaks by itself, + * then how full the day already is for the teacher and the group, so lessons spread over the week. + * + * @param array $lesson The lesson. + * @param array $option The option. + * @param array> $soft The soft wishes. + * @param SearchState $state The state. + * + * @return int + */ + private function price(array $lesson, array $option, array $soft, SearchState $state): int { + $price = 0; + foreach ($soft as $wish) { + if ($this->wishes->forbids(wish: $wish, lesson: $lesson, periods: $option['periods'], room: $option['room']) === true) { + $price += (max(1, (int)($wish['weight'] ?? 1)) * TimetableScorer::SOFT_COST * 10); + } + } + + $day = explode('-', (string)$option['period'], 2)[0]; + return $price + + $state->onDay(field: 'group', reference: (string)($lesson['group'] ?? ''), day: $day) + + $state->onDay(field: 'teacher', reference: (string)($lesson['teacher'] ?? ''), day: $day); + }//end price() + + /** + * Simulated annealing: move one lesson to another free option, keep the move when it + * costs less or, with a chance that shrinks as the search cools, when it costs a little more. + * + * @param SolverInput $input The input. + * @param SearchState $state The state. + * @param array>> $options The options per lesson. + * @param SeededRandom $random The random numbers. + * @param float $deadline When to stop, as microtime. + * + * @return array{0:array>,1:int} The best placements and the moves tried. + */ + private function anneal(SolverInput $input, SearchState $state, array $options, SeededRandom $random, float $deadline): array { + $movable = array_values(array_filter(array_keys($options), static fn ($key): bool => $options[$key] !== [])); + $cost = $this->cost(input: $input, state: $state); + $best = [$cost, $state->placements()]; + $tried = 0; + while ($movable !== [] && $tried < $this->iterations && microtime(true) < $deadline) { + $tried++; + $key = (string)$movable[$random->below(max: count($movable))]; + $target = $options[$key][$random->below(max: count($options[$key]))]; + $before = $state->remove(key: $key); + if ($state->place(key: $key, option: $target) === false) { + $this->restore(state: $state, key: $key, option: $before); + continue; + } + + $next = $this->cost(input: $input, state: $state); + if ($this->accept(delta: ($next - $cost), progress: ($tried / $this->iterations), random: $random) === false) { + $state->remove(key: $key); + $this->restore(state: $state, key: $key, option: $before); + continue; + } + + $cost = $next; + if ($cost < $best[0]) { + $best = [$cost, $state->placements()]; + } + }//end while + + return [$best[1], $tried]; + }//end anneal() + + /** + * Whether to keep a move. + * + * @param int $delta The change in cost. + * @param float $progress How far the search is, 0 to 1. + * @param SeededRandom $random The random numbers. + * + * @return bool + */ + private function accept(int $delta, float $progress, SeededRandom $random): bool { + if ($delta <= 0) { + return true; + } + + $temperature = max(0.01, (self::START_TEMPERATURE * (1.0 - $progress))); + return $random->fraction() < exp(-$delta / $temperature); + }//end accept() + + /** + * Put a lesson back on the option it had, if it had one. + * + * @param SearchState $state The state. + * @param string $key The lesson key. + * @param array|null $option The option it had. + * + * @return void + */ + private function restore(SearchState $state, string $key, ?array $option): void { + if ($option !== null) { + $state->place(key: $key, option: $option); + } + }//end restore() + + /** + * The scorer's cost of the current placements, with every lesson that breaks a hard wish + * counted as a hard breach, so the search also shrinks how badly a hard wish is broken. + * + * @param SolverInput $input The input. + * @param SearchState $state The state. + * + * @return int + */ + private function cost(SolverInput $input, SearchState $state): int { + $score = $this->scorer->score(input: $input, placements: $state->placements()); + $cost = $this->scorer->costOf(metrics: $score['metrics']); + foreach ($score['brokenWishes'] as $broken) { + if ($broken['strength'] === 'hard') { + $cost += (count($broken['lessons']) * TimetableScorer::HARD_COST); + } + } + + return $cost; + }//end cost() + + /** + * Take off the grid every lesson that still breaks a hard wish, so a generated + * scenario never breaks one; returns the wish id per lesson taken off. + * + * @param SolverInput $input The input. + * @param SearchState $state The state. + * + * @return array + */ + private function repair(SolverInput $input, SearchState $state): array { + $taken = []; + foreach ($input->wishes as $wish) { + if (($wish['strength'] ?? '') !== 'hard') { + continue; + } + + $broken = $this->scorer->score(input: $input, placements: $state->placements())['brokenWishes']; + foreach ($broken as $entry) { + if ($entry['wish'] !== (string)($wish['id'] ?? '')) { + continue; + } + + foreach ($entry['lessons'] as $key) { + $state->remove(key: (string)$key); + $taken[(string)$key] = (string)$entry['wish']; + } + } + } + + return $taken; + }//end repair() + + /** + * The result: placements, unplaced lessons with the wish that blocked them, and the score. + * + * @param SolverInput $input The input. + * @param SearchState $state The final state. + * @param array> $blockers The hard wishes that narrowed each lesson's options. + * @param array $repaired The lessons taken off by the repair, with the wish. + * @param int $iterations The moves tried. + * + * @return SolverResult + */ + private function result(SolverInput $input, SearchState $state, array $blockers, array $repaired, int $iterations): SolverResult { + $unplaced = []; + foreach ($input->lessons as $lesson) { + $key = (string)$lesson['key']; + if ($state->option(key: $key) !== null) { + continue; + } + + $wish = ($repaired[$key] ?? ($blockers[$key][0] ?? null)); + $unplaced[] = [ + 'lesson' => $key, + 'wish' => $wish, + 'reason' => match (true) { + isset($repaired[$key]) => 'hardWish', + $wish !== null => 'hardWishPeriods', + default => 'noFreePlace', + }, + ]; + } + + $placements = $state->placements(); + $score = $this->scorer->score(input: $input, placements: $placements); + return new SolverResult( + placements: $placements, + unplaced: $unplaced, + brokenWishes: $score['brokenWishes'], + metrics: $score['metrics'], + cost: $this->scorer->costOf(metrics: $score['metrics']), + iterations: $iterations + ); + }//end result() +}//end class diff --git a/lib/Timetabling/PlacementOptions.php b/lib/Timetabling/PlacementOptions.php new file mode 100644 index 00000000..7f4324b9 --- /dev/null +++ b/lib/Timetabling/PlacementOptions.php @@ -0,0 +1,148 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Timetabling; + +/** + * The options of every lesson, and the hard wishes that narrowed them. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ +final class PlacementOptions { + + /** + * Constructor. + * + * @param WishChecker $wishes Evaluates the wishes. + * + * @return void + */ + public function __construct( + private readonly WishChecker $wishes=new WishChecker(), + ) { + }//end __construct() + + /** + * The options per lesson key, and per lesson key the ids of the hard wishes that removed options. + * + * @param SolverInput $input The input. + * + * @return array{options:array}>>,blockers:array>} + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function build(SolverInput $input): array { + $grid = new WeekGrid(periods: $input->periods); + $hard = array_values(array_filter($input->wishes, static fn (array $wish): bool => ($wish['strength'] ?? '') === 'hard')); + $shared = []; + $options = []; + $blockers = []; + foreach ($input->lessons as $lesson) { + $key = (string)$lesson['key']; + $signature = (string)($lesson['roomType'] ?? '')."\n".(int)($lesson['length'] ?? 1); + $shared[$signature] ??= $this->allOptions(input: $input, grid: $grid, lesson: $lesson); + $options[$key] = []; + $blockers[$key] = []; + foreach ($shared[$signature] as $option) { + $blocking = $this->blocking(wishes: $hard, lesson: $lesson, periods: $option['periods'], room: $option['room']); + if ($blocking !== null) { + $blockers[$key][$blocking] = $blocking; + continue; + } + + $options[$key][] = $option; + } + + $blockers[$key] = array_values($blockers[$key]); + } + + return ['options' => $options, 'blockers' => $blockers]; + }//end build() + + /** + * Every start period and room of the right type a lesson of this length fits in; lessons + * with the same room type and length share this list, so a large school stays small in memory. + * + * @param SolverInput $input The input. + * @param WeekGrid $grid The week grid. + * @param array $lesson A lesson of the signature. + * + * @return array}> + */ + private function allOptions(SolverInput $input, WeekGrid $grid, array $lesson): array { + $options = []; + foreach ($this->rooms(input: $input, lesson: $lesson) as $room) { + foreach ($grid->keys() as $start) { + $periods = $grid->span(start: $start, length: (int)($lesson['length'] ?? 1)); + if ($periods !== null) { + $options[] = ['period' => $start, 'room' => $room, 'periods' => $periods]; + } + } + } + + return $options; + }//end allOptions() + + /** + * The rooms of the type the lesson needs; every room when it needs none. + * + * @param SolverInput $input The input. + * @param array $lesson The lesson. + * + * @return array + */ + private function rooms(SolverInput $input, array $lesson): array { + $needed = (string)($lesson['roomType'] ?? ''); + $rooms = []; + foreach ($input->rooms as $room) { + if ($needed === '' || (string)($room['type'] ?? '') === $needed) { + $rooms[] = (string)$room['reference']; + } + } + + return $rooms; + }//end rooms() + + /** + * The id of the first hard wish that forbids this option, or null. + * + * @param array> $wishes The hard wishes. + * @param array $lesson The lesson. + * @param array $periods The periods it would take. + * @param string $room The room. + * + * @return string|null + */ + private function blocking(array $wishes, array $lesson, array $periods, string $room): ?string { + foreach ($wishes as $wish) { + if ($this->wishes->forbids(wish: $wish, lesson: $lesson, periods: $periods, room: $room) === true) { + return (string)($wish['id'] ?? ''); + } + } + + return null; + }//end blocking() +}//end class diff --git a/lib/Timetabling/SearchState.php b/lib/Timetabling/SearchState.php new file mode 100644 index 00000000..e87d0615 --- /dev/null +++ b/lib/Timetabling/SearchState.php @@ -0,0 +1,226 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Timetabling; + + +/** + * The placements of a search and the periods they keep busy. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ +final class SearchState { + + /** + * The option each placed lesson has, by lesson key. + * + * @var array}> + */ + private array $placed = []; + + /** + * Busy teacher, group and room periods, by "kind, reference, period". + * + * @var array + */ + private array $busy = []; + + /** + * Lessons per teacher or group and day, by "field, reference, day". + * + * @var array + */ + private array $days = []; + + /** + * Constructor. + * + * @param array> $lessons The lessons by key. + * + * @return void + */ + public function __construct(private readonly array $lessons) { + }//end __construct() + + /** + * Place a lesson when the option is free for its teacher, group and room. + * + * @param string $key The lesson key. + * @param array{period:string,room:string,periods:array} $option The option. + * + * @return bool Whether it was placed. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function place(string $key, array $option): bool { + if ($this->fits(key: $key, option: $option) === false) { + return false; + } + + foreach ($this->marks(key: $key, option: $option) as $mark) { + $this->busy[$mark] = $key; + } + + $this->placed[$key] = $option; + foreach ($this->dayMarks(key: $key, option: $option) as $mark) { + $this->days[$mark] = (($this->days[$mark] ?? 0) + 1); + } + + return true; + }//end place() + + /** + * Whether the option is free for the lesson's teacher, group and room. + * + * @param string $key The lesson key. + * @param array{period:string,room:string,periods:array} $option The option. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function fits(string $key, array $option): bool { + foreach ($this->marks(key: $key, option: $option) as $mark) { + if (isset($this->busy[$mark]) === true) { + return false; + } + } + + return true; + }//end fits() + + /** + * Take a lesson off the grid. + * + * @param string $key The lesson key. + * + * @return array{period:string,room:string,periods:array}|null The option it had. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function remove(string $key): ?array { + $option = ($this->placed[$key] ?? null); + if ($option === null) { + return null; + } + + foreach ($this->marks(key: $key, option: $option) as $mark) { + unset($this->busy[$mark]); + } + + foreach ($this->dayMarks(key: $key, option: $option) as $mark) { + $this->days[$mark]--; + } + + unset($this->placed[$key]); + return $option; + }//end remove() + + /** + * The option a lesson has, or null. + * + * @param string $key The lesson key. + * + * @return array{period:string,room:string,periods:array}|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function option(string $key): ?array { + return ($this->placed[$key] ?? null); + }//end option() + + /** + * How many lessons a teacher or group already has on the day of a period. + * + * @param string $field `teacher` or `group`. + * @param string $reference The teacher or group. + * @param string $day The day, as in `mon`. + * + * @return int + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function onDay(string $field, string $reference, string $day): int { + return ($this->days[$field."\n".$reference."\n".$day] ?? 0); + }//end onDay() + + /** + * The placements as the scorer and the scenario read them, in lesson order. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function placements(): array { + $list = []; + foreach (array_keys($this->lessons) as $key) { + $option = ($this->placed[$key] ?? null); + if ($option !== null) { + $list[] = ['lesson' => (string)$key, 'period' => $option['period'], 'room' => $option['room']]; + } + } + + return $list; + }//end placements() + + /** + * The teacher and group day counters a lesson on an option adds to. + * + * @param string $key The lesson key. + * @param array{period:string,room:string,periods:array} $option The option. + * + * @return array + */ + private function dayMarks(string $key, array $option): array { + $lesson = ($this->lessons[$key] ?? []); + $day = explode('-', $option['period'], 2)[0]; + return [ + 'teacher'."\n".(string)($lesson['teacher'] ?? '')."\n".$day, + 'group'."\n".(string)($lesson['group'] ?? '')."\n".$day, + ]; + }//end dayMarks() + + /** + * The busy marks a lesson on an option makes. + * + * @param string $key The lesson key. + * @param array{period:string,room:string,periods:array} $option The option. + * + * @return array + */ + private function marks(string $key, array $option): array { + $lesson = ($this->lessons[$key] ?? []); + $owners = ['teacher' => (string)($lesson['teacher'] ?? ''), 'group' => (string)($lesson['group'] ?? ''), 'room' => $option['room']]; + $marks = []; + foreach ($option['periods'] as $period) { + foreach ($owners as $kind => $reference) { + if ($reference !== '') { + $marks[] = $kind."\n".$reference."\n".$period; + } + } + } + + return $marks; + }//end marks() +}//end class diff --git a/lib/Timetabling/SeededRandom.php b/lib/Timetabling/SeededRandom.php new file mode 100644 index 00000000..434cbb87 --- /dev/null +++ b/lib/Timetabling/SeededRandom.php @@ -0,0 +1,91 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Timetabling; + +/** + * Deterministic pseudo-random numbers from a seed. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ +final class SeededRandom { + + /** + * The modulus, 2^31 - 1. + */ + private const MODULUS = 2147483647; + + /** + * The current state, 1 to MODULUS - 1. + * + * @var integer + */ + private int $state; + + /** + * Constructor. + * + * @param int $seed Any integer. + * + * @return void + */ + public function __construct(int $seed) { + $this->state = ((abs($seed) % (self::MODULUS - 1)) + 1); + }//end __construct() + + /** + * A whole number from 0 to below the maximum. + * + * @param int $max The number of choices, 1 or more. + * + * @return int + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function below(int $max): int { + return ($this->next() % max(1, $max)); + }//end below() + + /** + * A number from 0 to below 1. + * + * @return float + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function fraction(): float { + return (($this->next() - 1) / (self::MODULUS - 1)); + }//end fraction() + + /** + * The next state. + * + * @return int + */ + private function next(): int { + $this->state = (($this->state * 48271) % self::MODULUS); + return $this->state; + }//end next() +}//end class diff --git a/lib/Timetabling/SolverInput.php b/lib/Timetabling/SolverInput.php new file mode 100644 index 00000000..e8c2fe2f --- /dev/null +++ b/lib/Timetabling/SolverInput.php @@ -0,0 +1,85 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Timetabling; + +/** + * The input of one generator run. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ +final class SolverInput { + + /** + * Constructor. + * + * @param array $periods Period keys, such as `mon-1`. + * @param array> $rooms Rooms: reference, capacity, type. + * @param array> $lessons Lessons: key, activity, group, subject, teacher, roomType, length. + * @param array> $wishes Wishes: id, appliesTo, reference, kind, periods, limit, strength, weight. + * @param string $source Where the activities came from: an app id, `csv` or `none`. + * @param string|null $reason Why the input is empty, or null. + * + * @return void + */ + public function __construct( + public readonly array $periods, + public readonly array $rooms, + public readonly array $lessons, + public readonly array $wishes, + public readonly string $source, + public readonly ?string $reason=null, + ) { + }//end __construct() + + /** + * Whether there is nothing to place. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ + public function isEmpty(): bool { + return $this->lessons === []; + }//end isEmpty() + + /** + * The shape a timetableScenario keeps under `input`. + * + * @return array{periods:array,rooms:array>,lessons:array>,wishes:array>,source:string} + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-2.1 + */ + public function toArray(): array { + return [ + 'periods' => $this->periods, + 'rooms' => $this->rooms, + 'lessons' => $this->lessons, + 'wishes' => $this->wishes, + 'source' => $this->source, + ]; + }//end toArray() +}//end class diff --git a/lib/Timetabling/SolverResult.php b/lib/Timetabling/SolverResult.php new file mode 100644 index 00000000..4da01e4c --- /dev/null +++ b/lib/Timetabling/SolverResult.php @@ -0,0 +1,72 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Timetabling; + +/** + * The outcome of one solver run. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ +final class SolverResult { + + /** + * Constructor. + * + * @param array $placements Each placed lesson with its start period and room. + * @param array $unplaced Each lesson without a place, with the hard wish that blocked it. + * @param array> $brokenWishes The wishes the placements break. + * @param array $metrics The scorer's measures. + * @param int $cost The one number the search minimised. + * @param int $iterations How many moves the search tried. + * + * @return void + */ + public function __construct( + public readonly array $placements, + public readonly array $unplaced, + public readonly array $brokenWishes, + public readonly array $metrics, + public readonly int $cost, + public readonly int $iterations, + ) { + }//end __construct() + + /** + * The fields a timetableScenario keeps of a run. + * + * @return array{placements:array>,unplaced:array>,brokenWishes:array>,metrics:array} + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function toScenario(): array { + return [ + 'placements' => $this->placements, + 'unplaced' => $this->unplaced, + 'brokenWishes' => $this->brokenWishes, + 'metrics' => $this->metrics, + ]; + }//end toScenario() +}//end class diff --git a/lib/Timetabling/TimetableScorer.php b/lib/Timetabling/TimetableScorer.php new file mode 100644 index 00000000..05bdf94e --- /dev/null +++ b/lib/Timetabling/TimetableScorer.php @@ -0,0 +1,397 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Timetabling; + +/** + * Scores placements (lesson key, first period key, room reference) against a SolverInput. + * + * Clash kinds: `teacher`, `group` and `room` (two lessons in one period), + * `roomType` (a room of another type than the lesson needs), `unknownRoom` + * and `outOfGrid` (a lesson that starts outside the grid or runs off the day). + * A broken soft wish costs its weight (1 when unset) for every lesson that breaks it. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ +final class TimetableScorer { + + /** + * Cost of one clash; above everything else, so no clash is traded for a wish. + */ + public const CLASH_COST = 1000000; + + /** + * Cost of one broken hard wish. + */ + public const HARD_COST = 100000; + + /** + * Cost of one lesson that is not placed. + */ + public const UNPLACED_COST = 10000; + + /** + * Cost of one point of soft penalty. + */ + public const SOFT_COST = 10; + + /** + * Cost of one free period between a teacher's lessons. + */ + public const GAP_COST = 1; + + /** + * Constructor. + * + * @param WishChecker $wishes Evaluates the wishes. + * + * @return void + */ + public function __construct( + private readonly WishChecker $wishes=new WishChecker(), + ) { + }//end __construct() + + /** + * The score of a week. + * + * @param SolverInput $input What was to be placed. + * @param array $placements Where the lessons are. + * + * @return array{metrics:array,brokenWishes:array>,clashes:array>} + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ + public function score(SolverInput $input, array $placements): array { + $grid = new WeekGrid(periods: $input->periods); + $clashes = []; + $slots = $this->slots(input: $input, placements: $placements, grid: $grid, clashes: $clashes); + $clashes = array_merge($clashes, $this->doubleBookings(slots: $slots)); + $broken = $this->brokenWishes(wishes: $input->wishes, slots: $slots, grid: $grid); + + $metrics = array_merge( + [ + 'lessons' => count($input->lessons), + 'placed' => count($slots), + 'unplaced' => (count($input->lessons) - count($slots)), + 'clashes' => count($clashes), + ], + $this->wishMetrics(broken: $broken), + $this->teacherGaps(slots: $slots, grid: $grid), + ['lessonsPerDayWorst' => $this->lessonsPerDayWorst(slots: $slots)], + $this->roomUse(input: $input, slots: $slots) + ); + + return ['metrics' => $metrics, 'brokenWishes' => $broken, 'clashes' => $clashes]; + }//end score() + + /** + * One number to minimise: clashes, then hard wishes, then unplaced lessons, then soft wishes, then gaps. + * + * @param array $metrics The metrics of score(). + * + * @return int + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ + public static function cost(array $metrics): int { + return ((int)$metrics['clashes'] * self::CLASH_COST) + + ((int)$metrics['hardWishesBroken'] * self::HARD_COST) + + ((int)$metrics['unplaced'] * self::UNPLACED_COST) + + ((int)$metrics['softPenalty'] * self::SOFT_COST) + + ((int)$metrics['teacherGaps'] * self::GAP_COST); + }//end cost() + + /** + * The same number as cost(), for callers that hold a scorer. + * + * @param array $metrics The metrics of score(). + * + * @return int + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function costOf(array $metrics): int { + return self::cost(metrics: $metrics); + }//end costOf() + + /** + * The placed lessons with the periods they take; a placement that cannot be laid out is a clash. + * + * @param SolverInput $input The input. + * @param array> $placements The placements. + * @param WeekGrid $grid The grid. + * @param array> $clashes Collects the clashes. + * + * @return array> + */ + private function slots(SolverInput $input, array $placements, WeekGrid $grid, array &$clashes): array { + $lessons = array_column($input->lessons, null, 'key'); + $rooms = array_column($input->rooms, null, 'reference'); + $order = array_flip($grid->keys()); + $slots = []; + foreach ($placements as $placement) { + $lesson = ($lessons[(string)$placement['lesson']] ?? null); + if ($lesson === null) { + continue; + } + + $room = (string)$placement['room']; + $periods = $grid->span(start: (string)$placement['period'], length: (int)($lesson['length'] ?? 1)); + $problem = $this->placementProblem(lesson: $lesson, room: ($rooms[$room] ?? null), periods: $periods); + if ($problem !== null) { + $clashes[] = ['kind' => $problem, 'reference' => $room, 'period' => (string)$placement['period'], 'lessons' => [(string)$lesson['key']]]; + } + + if ($periods === null) { + continue; + } + + $slots[] = [ + 'lesson' => $lesson, + 'room' => $room, + 'periods' => $periods, + 'day' => $grid->day(key: $periods[0]), + 'order' => (int)$order[$periods[0]], + ]; + }//end foreach + + return $slots; + }//end slots() + + /** + * What is wrong with one placement by itself, or null. + * + * @param array $lesson The lesson. + * @param array|null $room The room, or null when unknown. + * @param array|null $periods The periods, or null when off the grid. + * + * @return string|null + */ + private function placementProblem(array $lesson, ?array $room, ?array $periods): ?string { + if ($periods === null) { + return 'outOfGrid'; + } + + if ($room === null) { + return 'unknownRoom'; + } + + $needed = (string)($lesson['roomType'] ?? ''); + if ($needed !== '' && (string)($room['type'] ?? '') !== $needed) { + return 'roomType'; + } + + return null; + }//end placementProblem() + + /** + * Two lessons of one teacher, group or room in the same period: one clash per resource and period. + * + * @param array> $slots The placed lessons. + * + * @return array> + */ + private function doubleBookings(array $slots): array { + $taken = []; + foreach ($slots as $slot) { + $owners = ['teacher' => (string)$slot['lesson']['teacher'], 'group' => (string)$slot['lesson']['group'], 'room' => (string)$slot['room']]; + foreach ($slot['periods'] as $period) { + foreach ($owners as $kind => $reference) { + $taken[$kind."\n".$reference."\n".$period][] = (string)$slot['lesson']['key']; + } + } + } + + $clashes = []; + foreach ($taken as $at => $lessons) { + if (count($lessons) > 1 && explode("\n", $at)[1] !== '') { + [$kind, $reference, $period] = explode("\n", $at); + $clashes[] = ['kind' => $kind, 'reference' => $reference, 'period' => $period, 'lessons' => $lessons]; + } + } + + return $clashes; + }//end doubleBookings() + + /** + * Every broken wish with the lessons that break it. + * + * @param array> $wishes The wishes. + * @param array> $slots The placed lessons. + * @param WeekGrid $grid The week grid. + * + * @return array> + */ + private function brokenWishes(array $wishes, array $slots, WeekGrid $grid): array { + $broken = []; + foreach ($wishes as $wish) { + $lessons = $this->wishes->breakingLessons(wish: $wish, slots: $slots, grid: $grid); + if ($lessons === []) { + continue; + } + + $hard = ($wish['strength'] ?? 'soft') === 'hard'; + $broken[] = [ + 'wish' => (string)($wish['id'] ?? ''), + 'strength' => (string)($wish['strength'] ?? 'soft'), + 'weight' => $this->weight(wish: $wish, hard: $hard), + 'lessons' => $lessons, + ]; + } + + return $broken; + }//end brokenWishes() + + /** + * The weight of a broken wish: null for a hard wish, else 1 to 3 (1 when unset). + * + * @param array $wish The wish. + * @param bool $hard Whether it is hard. + * + * @return int|null + */ + private function weight(array $wish, bool $hard): ?int { + if ($hard === true) { + return null; + } + + return max(1, (int)($wish['weight'] ?? 1)); + }//end weight() + + /** + * Hard and soft wishes broken, and the weighted soft penalty. + * + * @param array> $broken The broken wishes. + * + * @return array{hardWishesBroken:int,softWishesBroken:int,softPenalty:int} + */ + private function wishMetrics(array $broken): array { + $metrics = ['hardWishesBroken' => 0, 'softWishesBroken' => 0, 'softPenalty' => 0]; + foreach ($broken as $wish) { + if ($wish['strength'] === 'hard') { + $metrics['hardWishesBroken']++; + continue; + } + + $metrics['softWishesBroken']++; + $metrics['softPenalty'] += ((int)$wish['weight'] * count($wish['lessons'])); + } + + return $metrics; + }//end wishMetrics() + + /** + * Free periods between a teacher's lessons on a day: in total and for the teacher with the most. + * + * @param array> $slots The placed lessons. + * @param WeekGrid $grid The week grid. + * + * @return array{teacherGaps:int,teacherGapsWorst:int} + */ + private function teacherGaps(array $slots, WeekGrid $grid): array { + $numbers = []; + foreach ($slots as $slot) { + foreach ($slot['periods'] as $period) { + $numbers[(string)$slot['lesson']['teacher']][$grid->day(key: $period)][] = $grid->number(key: $period); + } + } + + $total = 0; + $worst = 0; + foreach ($numbers as $days) { + $gaps = array_sum(array_map([$grid, 'gaps'], $days)); + $total += $gaps; + $worst = max($worst, $gaps); + } + + return ['teacherGaps' => $total, 'teacherGapsWorst' => $worst]; + }//end teacherGaps() + + /** + * The most lessons one group has on one day. + * + * @param array> $slots The placed lessons. + * + * @return int + */ + private function lessonsPerDayWorst(array $slots): int { + $counts = []; + foreach ($slots as $slot) { + $key = (string)$slot['lesson']['group']."\n".(string)$slot['day']; + $counts[$key] = (($counts[$key] ?? 0) + 1); + } + + if ($counts === []) { + return 0; + } + + return (int)max($counts); + }//end lessonsPerDayWorst() + + /** + * The share of room periods in use, overall and per room type, rounded to two decimals. + * + * @param SolverInput $input The input. + * @param array> $slots The placed lessons. + * + * @return array{roomUse:float,roomUseByType:array} + */ + private function roomUse(SolverInput $input, array $slots): array { + $types = array_column($input->rooms, 'type', 'reference'); + $used = []; + foreach ($slots as $slot) { + $type = ($types[(string)$slot['room']] ?? null); + if ($type !== null) { + $used[(string)$type] = (($used[(string)$type] ?? 0) + count($slot['periods'])); + } + } + + $periods = count($input->periods); + $byType = []; + foreach (array_count_values(array_map('strval', array_values($types))) as $type => $rooms) { + $byType[(string)$type] = $this->share(used: ($used[$type] ?? 0), available: ($rooms * $periods)); + } + + return ['roomUse' => $this->share(used: array_sum($used), available: (count($types) * $periods)), 'roomUseByType' => $byType]; + }//end roomUse() + + /** + * A share rounded to two decimals, 0.0 when nothing is available. + * + * @param int $used Used. + * @param int $available Available. + * + * @return float + */ + private function share(int $used, int $available): float { + if ($available === 0) { + return 0.0; + } + + return round($used / $available, 2); + }//end share() +}//end class diff --git a/lib/Timetabling/TimetableSolver.php b/lib/Timetabling/TimetableSolver.php new file mode 100644 index 00000000..b8027778 --- /dev/null +++ b/lib/Timetabling/TimetableSolver.php @@ -0,0 +1,48 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Timetabling; + +/** + * Places the lessons of a solver input on the week grid. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ +interface TimetableSolver { + + /** + * Place the lessons, for at most the given number of seconds. + * + * @param SolverInput $input What to place. + * @param int $seconds The most time this call may take. + * @param int $seed The number the search starts from; the same seed gives the same result. + * @param array $start Placements to continue from (the best of an earlier step). + * + * @return SolverResult + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-5.1 + */ + public function solve(SolverInput $input, int $seconds, int $seed, array $start=[]): SolverResult; +}//end interface diff --git a/lib/Timetabling/WeekGrid.php b/lib/Timetabling/WeekGrid.php new file mode 100644 index 00000000..59e9390e --- /dev/null +++ b/lib/Timetabling/WeekGrid.php @@ -0,0 +1,135 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Timetabling; + +/** + * Days and period numbers of a list of period keys such as `mon-3`. + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ +final class WeekGrid { + + /** + * The period keys, as a set. + * + * @var array + */ + private array $known = []; + + /** + * Constructor. + * + * @param array $periods The period keys of the input. + * + * @return void + */ + public function __construct(private readonly array $periods) { + foreach ($periods as $key) { + $this->known[$key] = true; + } + }//end __construct() + + /** + * The period keys, in grid order. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ + public function keys(): array { + return $this->periods; + }//end keys() + + /** + * The periods a lesson of $length periods starting at $start takes, or null when it runs off the day or starts outside the grid. + * + * @param string $start The first period key. + * @param int $length The length in periods. + * + * @return array|null + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ + public function span(string $start, int $length): ?array { + $day = $this->day(key: $start); + $number = $this->number(key: $start); + $keys = []; + for ($offset = 0; $offset < max(1, $length); $offset++) { + $key = $day.'-'.($number + $offset); + if (isset($this->known[$key]) === false) { + return null; + } + + $keys[] = $key; + } + + return $keys; + }//end span() + + /** + * The day of a period key, as in `mon`. + * + * @param string $key The period key. + * + * @return string + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ + public function day(string $key): string { + return explode('-', $key, 2)[0]; + }//end day() + + /** + * The period number of a period key, from 1. + * + * @param string $key The period key. + * + * @return int + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ + public function number(string $key): int { + return (int)(explode('-', $key, 2)[1] ?? 0); + }//end number() + + /** + * The free periods between the first and the last of a day's taken period numbers. + * + * @param array $numbers Taken period numbers of one day. + * + * @return int + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ + public function gaps(array $numbers): int { + if ($numbers === []) { + return 0; + } + + $unique = array_unique($numbers); + return (max($unique) - min($unique) + 1 - count($unique)); + }//end gaps() +}//end class diff --git a/lib/Timetabling/WishChecker.php b/lib/Timetabling/WishChecker.php new file mode 100644 index 00000000..66916ac3 --- /dev/null +++ b/lib/Timetabling/WishChecker.php @@ -0,0 +1,208 @@ + + * @copyright 2026 Conduction B.V. + * @license EUPL-1.2 https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * @version GIT: + * + * @link https://conduction.nl + * + * SPDX-FileCopyrightText: 2026 Conduction B.V. + * SPDX-License-Identifier: EUPL-1.2 + */ + +declare(strict_types=1); + +namespace OCA\Planninq\Timetabling; + +/** + * The five wish kinds, evaluated on placed lessons. + * + * A placed lesson (a slot) is: `lesson` (the input lesson), `room`, `periods` + * (the period keys it takes), `day` and `order` (the grid position of its first period). + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ +final class WishChecker { + + /** + * The lesson field a wish on each subject compares with its reference. + */ + private const LESSON_FIELDS = [ + 'teacher' => 'teacher', + 'group' => 'group', + 'activity' => 'activity', + ]; + + /** + * The keys of the lessons that break the wish, in period order; empty when it is kept. + * + * @param array $wish The wish. + * @param array> $slots All placed lessons. + * @param WeekGrid $grid The week grid. + * + * @return array + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ + public function breakingLessons(array $wish, array $slots, WeekGrid $grid): array { + $mine = array_values( + array_filter($slots, fn (array $slot): bool => $this->applies(wish: $wish, lesson: $slot['lesson'], room: (string)$slot['room'])) + ); + usort($mine, static fn (array $one, array $two): int => $one['order'] <=> $two['order']); + + $breaking = match ((string)($wish['kind'] ?? '')) { + 'unavailable', 'avoid' => array_filter($mine, fn (array $slot): bool => $this->touches(wish: $wish, periods: $slot['periods'])), + 'maxPerDay' => $this->overTheLimit(wish: $wish, slots: $mine), + 'noGaps' => $this->daysWithGaps(slots: $mine, grid: $grid), + 'sameRoom' => $this->outsideTheMainRoom(slots: $mine), + default => [], + }; + + return array_values(array_map(static fn (array $slot): string => (string)$slot['lesson']['key'], $breaking)); + }//end breakingLessons() + + /** + * Whether placing the lesson on these periods in this room breaks the wish by itself (the period kinds only). + * + * @param array $wish The wish. + * @param array $lesson The lesson. + * @param array $periods The periods it would take. + * @param string $room The room. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ + public function forbids(array $wish, array $lesson, array $periods, string $room): bool { + if (in_array(($wish['kind'] ?? ''), ['unavailable', 'avoid'], true) === false) { + return false; + } + + return $this->applies(wish: $wish, lesson: $lesson, room: $room) === true && $this->touches(wish: $wish, periods: $periods) === true; + }//end forbids() + + /** + * Whether a wish is about this lesson. + * + * @param array $wish The wish. + * @param array $lesson The lesson. + * @param string $room The room it is in. + * + * @return bool + * + * @spec openspec/changes/archive/2026-09-30-timetabling-generator/tasks.md#task-4.1 + */ + public function applies(array $wish, array $lesson, string $room): bool { + $reference = (string)($wish['reference'] ?? ''); + $appliesTo = (string)($wish['appliesTo'] ?? ''); + if ($appliesTo === 'room') { + return $room === $reference; + } + + $field = (self::LESSON_FIELDS[$appliesTo] ?? null); + return $field !== null && (string)($lesson[$field] ?? '') === $reference; + }//end applies() + + /** + * Whether the periods include one of the wish's periods. + * + * @param array $wish The wish. + * @param array $periods The periods. + * + * @return bool + */ + private function touches(array $wish, array $periods): bool { + return array_intersect($periods, (array)($wish['periods'] ?? [])) !== []; + }//end touches() + + /** + * The lessons past the wish's limit on each day. + * + * @param array $wish The wish. + * @param array> $slots Its lessons, in period order. + * + * @return array> + */ + private function overTheLimit(array $wish, array $slots): array { + $limit = (int)($wish['limit'] ?? 0); + if ($limit < 1) { + return []; + } + + $over = []; + foreach ($this->byDay(slots: $slots) as $day) { + $over = array_merge($over, array_slice($day, $limit)); + } + + return $over; + }//end overTheLimit() + + /** + * The lessons of every day that has a free period between two of them. + * + * @param array> $slots Its lessons, in period order. + * @param WeekGrid $grid The week grid. + * + * @return array> + */ + private function daysWithGaps(array $slots, WeekGrid $grid): array { + $broken = []; + foreach ($this->byDay(slots: $slots) as $day) { + $numbers = []; + foreach ($day as $slot) { + $numbers = array_merge($numbers, array_map([$grid, 'number'], $slot['periods'])); + } + + if ($grid->gaps(numbers: $numbers) > 0) { + $broken = array_merge($broken, $day); + } + } + + return $broken; + }//end daysWithGaps() + + /** + * The lessons that are not in the room most of them use. + * + * @param array> $slots Its lessons, in period order. + * + * @return array> + */ + private function outsideTheMainRoom(array $slots): array { + $counts = array_count_values(array_map(static fn (array $slot): string => (string)$slot['room'], $slots)); + if (count($counts) < 2) { + return []; + } + + arsort($counts); + $main = (string)array_key_first($counts); + return array_filter($slots, static fn (array $slot): bool => (string)$slot['room'] !== $main); + }//end outsideTheMainRoom() + + /** + * Lessons grouped by day, order kept. + * + * @param array> $slots Lessons in period order. + * + * @return array>> + */ + private function byDay(array $slots): array { + $days = []; + foreach ($slots as $slot) { + $days[(string)$slot['day']][] = $slot; + } + + return $days; + }//end byDay() +}//end class diff --git a/openspec/changes/archive/2026-09-28-backlog-list/design.md b/openspec/changes/archive/2026-09-28-backlog-list/design.md new file mode 100644 index 00000000..6a725f5a --- /dev/null +++ b/openspec/changes/archive/2026-09-28-backlog-list/design.md @@ -0,0 +1,73 @@ +# Design: turn the backlog placeholder into a working backlog + +## Context + +Read at development `de35541`: + +- `src/views/ProjectBacklog.vue:1-30` renders a breadcrumb and an `NcEmptyContent` placeholder; the + script hydrates the project on a deep link. +- `src/manifest.json:146` page `ProjectBacklog`, route `/projects/:id/backlog`, component + `ProjectBacklog`, note "an ordered task list scoped to :id". +- `openspec/specs/projects.md` requirement "Project Backlog Route" with the scenario "Placeholder + until task management is implemented" and a note to retire it when task management lands. +- Schema `task`: `column` ("null = backlog"), `columnOrder` (order within the column), `priority`, + `dueDate`; Open Register adds a created timestamp in the object's `@self` metadata. +- `src/views/ProjectBoard.vue:43-48` opens the backlog; the card action menu is at `:152-165`. +- `src/store/projects.js:775` `fetchTasks(projectId)` passes filters to Open Register. + +## Goals / non-goals + +Goals: a real backlog with create, rank, sort, filter and move to and from the board. +Non-goals: bulk actions, sprints, statistics. + +## Decisions + +### Decision 1: the backlog is the set of tasks with no column + +The page loads `fetchTasks(projectId)` and keeps tasks whose `column` is empty and whose status is +not `done`; cancelled tasks show only under the "Cancelled" filter. Alternative: a `backlog` +boolean. Rejected: the schema already defines the backlog as no column, and a second flag could +disagree with it. + +### Decision 2: rank reuses `columnOrder` + +For a task without a column, `columnOrder` is its backlog rank. Rows drag with a handle and move +with "Move up" and "Move down" in the row menu; writes use the sparse steps of the board lanes. A +new task goes to the bottom. + +### Decision 3: sort is a view, rank is data + +Sorting by priority, due date or creation date changes only the display and disables dragging with +a hint "Sort by rank to reorder". The sort choice is in the query string, like the filter. + +### Decision 4: moving between backlog and board + +"Move to board" opens a small menu of the project's columns; choosing one PATCHes `column`, +`columnOrder` (bottom of that lane) and the column's mapped status. On the board, the card menu gains +"Move to backlog", which clears `column` and sets `columnOrder` to the bottom of the backlog. + +### Decision 5: create into the backlog + +"New task" on the backlog opens `TaskFormDialog` without a column. The main spec's "Create a task" +scenario (placed in the backlog by default) is met here. + +Amended at build (28 Sep): `TaskFormDialog` does not exist at HEAD (it belongs to +`tasks-create-edit-delete`, not built yet). The backlog has an inline "New task" field and an Add +button that create the task with status open, priority normal, no column and the bottom rank. + +### Decision 6: filters without the board's filter bar + +Amended at build (28 Sep): `boards-filters` is not built yet, so the backlog carries its own two +filters: a priority choice and a "Cancelled" switch, both in the query string with the sort. When +`boards-filters` lands, its bar replaces the priority choice here. + +### Decision 7: a card taken off the board is open again + +"Move to backlog" clears `column`, puts the card last in rank and sets status `open`, so a card +taken off a done lane shows in the backlog (done tasks are hidden there) and the server clears +its `completedAt`. + +## Risks / trade-offs + +- [Done tasks without a column stay hidden] -> they are finished work; the Cancelled filter and the + board's done column cover the rest. diff --git a/openspec/changes/archive/2026-09-28-backlog-list/proposal.md b/openspec/changes/archive/2026-09-28-backlog-list/proposal.md new file mode 100644 index 00000000..7ad10dd2 --- /dev/null +++ b/openspec/changes/archive/2026-09-28-backlog-list/proposal.md @@ -0,0 +1,110 @@ +--- +kind: code +--- + +# Turn the backlog placeholder into a working backlog + +## Why + +Every project board has a Backlog button (`src/views/ProjectBoard.vue:43-48`), and it opens a page +that says "Backlog view coming soon. Task management will be available in a future update." +(`src/views/ProjectBacklog.vue:20-30`). The manifest describes "an ordered task list scoped to :id" +(`src/manifest.json:146`), and the main spec keeps the placeholder on purpose until task +management lands (`openspec/specs/projects.md`, "Project Backlog Route", note: retire it "when task +management lands"). With `tasks-create-edit-delete` and `boards-configurable-columns` in this pass, +that moment is here. + +The task schema already defines the backlog: a task whose `column` is empty ("null = backlog"). +Four matrix rows are marked `specified` although no change directory ever carried them; this change +is that directory. + +Parity rows: `bkl-backlog`, `bkl-sort-filter`, `bkl-to-board`, `bkl-rank` in planninq's +`openspec/parity/capabilities.json`. +Decision: build. The first three were marked specified with no change directory (a claim the pass +must back or retract); `bkl-backlog` and `bkl-sort-filter` have two competitors yes, `bkl-to-board` +and `bkl-rank` three. + +## What changes + +- The backlog page lists the project's tasks that are on no column, in rank order. +- A member creates a task straight into the backlog. +- A member ranks the backlog by dragging rows or with "Move up" and "Move down". +- A member sorts by rank, priority, due date or creation date, and filters with the board's filter + bar; cancelled tasks show only with the "Cancelled" filter. +- A member moves a task onto the board with "Move to board" and a column choice, and takes a card + back to the backlog from the board. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `bkl-backlog`, `bkl-sort-filter`, `bkl-to-board`, `bkl-rank`. + +### `bkl-backlog`: Keep tasks that are not yet planned in a backlog apart from the board. + +- Area `backlog`. Planninq is rated `no`, built.state `specified`, owner `ConductionNL/planninq`. +- Built evidence: "src/views/ProjectBacklog.vue:20-26 is a literal placeholder: NcEmptyContent with name 'Backlog view coming soon' and description 'Task management will be available in a future update.' Component-level comment confirms: 'Stays a placeholder until tasks#REQ-Task-CRUD lands.'" +- Demand: none recorded on the row. +- Competitors rated yes (2): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/menu-tree.md 'Inside a project > Backlogs sprints and story points'; docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:14 'record and prioritize work packages in sprints and the backlog' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:65 project backlog page and :73 backlog buckets; modules/backlogs/app/components/backlogs/inbox_component.rb:32 'Backlog inbox', modules/backlogs/config/locales/en.yml:53, of unplanned work packages; modules/backlogs/app/controllers/backlogs/backlog_controller.rb:40 show" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'The Kanban backlog shows issues in both Backlog and Selected for Development sections' and team members can 'focus on your work-in-progress on the Kanban board, without the distraction of items in planning' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'sample Kanban backlog ... with Backlog and Selected for Development as board columns'; team members focus on the Kanban board 'without the distraction' of the backlog (read 2026-09-26)" + +### `bkl-sort-filter`: Sort and filter the backlog. + +- Area `backlog`. Planninq is rated `no`, built.state `specified`, owner `ConductionNL/planninq`. +- Built evidence: "Same placeholder page, src/views/ProjectBacklog.vue:20-26; no sort or filter controls exist." +- Demand: none recorded on the row. +- Competitors rated yes (2): + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §9 IssueView filters and display_filters ; usability.md 'Layouts, filtering ... are all good' ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/filters/header/display-filters/display-filters-selection.tsx:112-118 order_by selector; apps/web/core/components/work-item-filters/filters-hoc/project-level.tsx:206 filters; apps/api/plane/utils/issue_filters.py:298-300 backlog type; apps/api/plane/utils/order_queryset.py:12 order_by allowlist" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html, https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters apply on 'a Scrum board or Kanban board' including its backlog; order is Rank (docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'the issues you're creating and ranking for your team') ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845301.html quick filters 'further filter the collection of issues appearing on a Scrum board or Kanban board'; https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'Drag and drop an issue to rank it' (read ... (shortened; full text in the matrix row)" + +### `bkl-to-board`: Move a task from the backlog onto the board. + +- Area `backlog`. Planninq is rated `no`, built.state `specified`, owner `ConductionNL/planninq`. +- Built evidence: "Same placeholder page, src/views/ProjectBacklog.vue:20-26; no task list, no move-to-board action exists at all." +- Demand: none recorded on the row. +- Competitors rated yes (3): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:234 'Your sprint is set in motion by clicking the Start sprint button ... it will open the sprint board'; basic boards add an existing work package as a card (agile-boards README:139) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/config/routes.rb:105-107 move and move_to_sprint_dialog; modules/backlogs/app/controllers/backlogs/work_packages_controller.rb:71 move to sprint, :97-103 move via Backlogs::WorkPackages::UpdateService; modules/backlogs/app/services/backlogs/sprints/start_service.rb:66 starting the sprint builds its board, which shows the moved ... (shortened; full text in the matrix row)" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §2 State group; moving a work item from a backlog-group state to an unstarted or started state is an ordinary state change (drag or state menu) ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:136,171 drop a card from a backlog-group column into another state column; apps/web/core/components/issues/issue-modal/components/default-properties.tsx:90 state_id dropdown; apps/api/plane/app/views/issue/base.py:628 partial_update; apps/api/plane/db/models/state.py:15 BACKLOG group" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'This makes it easy for you to move issues from the backlog to selected for development. Issues selected for development will then appear in your Kanban board' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'This makes it easy for you to move issues from the backlog to selected for development. Issues selected for development will then appear in your Kanban board' (read 2026-09-26)" + +### `bkl-rank`: Rank the backlog by dragging items up and down. + +- Area `backlog`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "No backlog list exists to rank (src/views/ProjectBacklog.vue:20-26 placeholder) and no ordering field/drag UI for a backlog exists anywhere." +- Demand: none recorded on the row. +- Competitors rated yes (3): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/backlogs-scrum/README.md:170 'You can prioritize work packages within the Inbox backlog, a backlog bucket, or a sprint by dragging and dropping them' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/backlogs/app/components/backlogs/work_package_card_list_component.rb:41-59 drag_and_drop on the card list; modules/backlogs/app/controllers/backlogs/work_packages_controller.rb:97-110 move stores the new position, same-list moves reorder" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §2 Issue 'sort_order float (:158)'; list and board support manual drag ordering (kanban/block.tsx:206 draggable) ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/list/block.tsx:117 draggable rows in the list layout and apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 on the board; apps/web/core/components/issues/issue-layouts/utils.tsx:491-518 new sort_order between neighbours; apps/api/plane/db/models/issue.py:158 sort_order" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'an optimized list view of the issues you're creating and ranking for your team' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'Drag and drop an issue to rank it. You can also right-click the issue to open a menu that allows you to send it to the top or the bottom of the backlog' (read 2026-09-26)" + +## Scope + +### In scope + +- `src/views/ProjectBacklog.vue` as a list with rank, sort, filter, create and move. +- "Move to backlog" on a board card. +- Retiring the placeholder scenario of the main spec's "Project Backlog Route" at archive time. + +### Out of scope + +- Bulk selection: `tasks-search-and-bulk` adds it to this list. +- Sprints and releases: `backlog-sprints` and `backlog-releases-roadmap` build on this list. +- Backlog statistics (V1 in docs/FEATURES.md, no matrix row). + +## Impact + +- `src/views/ProjectBacklog.vue`, `src/views/ProjectBoard.vue` (card action), `src/store/projects.js` + (backlog query and rank writes), `src/utils/` (sorting), `l10n/`. +- Depends on: `boards-configurable-columns` (a task with no column is the backlog; the move target + is a column), `tasks-create-edit-delete` (the task dialog), `boards-filters` (the filter bar). + +## Risks + +### Risk 1: The backlog and the board show the same task +**Severity**: Medium +**Mitigation**: the board shows tasks with a column, the backlog tasks without one; the repair step +in `boards-configurable-columns` gives every existing active task a column first, so the backlog +starts empty rather than duplicating the board. + +### Risk 2: Rank writes on every drag +**Severity**: Low +**Mitigation**: the same sparse ordering as board lanes (steps of 1000, midpoint on drop). diff --git a/openspec/changes/archive/2026-09-28-backlog-list/specs/backlog/spec.md b/openspec/changes/archive/2026-09-28-backlog-list/specs/backlog/spec.md new file mode 100644 index 00000000..358fa822 --- /dev/null +++ b/openspec/changes/archive/2026-09-28-backlog-list/specs/backlog/spec.md @@ -0,0 +1,67 @@ +# backlog delta for backlog-list + +Extends the flat main spec `openspec/specs/projects.md` ("Project Backlog Route") and replaces +its placeholder scenario. + +## ADDED Requirements + +### Requirement: The backlog lists the tasks that are not on the board + +The system MUST show on /projects/:id/backlog every task of the project that has no column and is +not done, in rank order, and MUST let a project member create a task directly into it. +Tier: MVP (docs/FEATURES.md). + +#### Scenario: Open the backlog + +- **GIVEN** project "Vergunningen" has two tasks without a column and five on the board +- **WHEN** a member opens its backlog +- **THEN** the two column-less tasks are listed and the five board tasks are not + +#### Scenario: Create into the backlog + +- **GIVEN** a member is on the backlog +- **WHEN** they choose "New task", enter "Check the zoning plan" and save +- **THEN** the task is listed last in the backlog and does not show on the board + +### Requirement: A member can rank the backlog + +The system MUST let a project member put backlog tasks in their own order by dragging or with +"Move up" and "Move down", and MUST keep that order after a reload. Tier: V1. + +#### Scenario: Rank with the keyboard + +- **GIVEN** the backlog lists A, B, C +- **WHEN** a member chooses "Move up" on C twice +- **THEN** the backlog lists C, A, B, also after a reload + +### Requirement: A member can sort and filter the backlog + +The system MUST let a project member sort the backlog by rank, priority, due date or creation date +and filter it with the board's filters, and MUST show cancelled tasks only under the "Cancelled" +filter. Tier: MVP. + +#### Scenario: Sort by due date + +@e2e exclude the backlog has no due-date field to set from the UI yet; the comparator is covered by tests/vitest/backlog.spec.js (sortBacklog) + +- **GIVEN** backlog tasks due on 3, 1 and 2 October +- **WHEN** a member sorts by due date +- **THEN** they are listed 1, 2, 3 October +- **AND** dragging is disabled with the hint "Sort by rank to reorder" + +### Requirement: A member can move tasks between the backlog and the board + +The system MUST let a project member move a backlog task to a board column of their choice, and +move a board card back to the backlog. Tier: MVP. + +#### Scenario: Plan a task + +- **GIVEN** "Check the zoning plan" is in the backlog +- **WHEN** a member chooses "Move to board" and then "In progress" +- **THEN** the task leaves the backlog and shows at the bottom of the In progress lane with that lane's status + +#### Scenario: Take a card off the board + +- **GIVEN** a card in the To do lane +- **WHEN** a member chooses "Move to backlog" in its card menu +- **THEN** the card leaves the board and is listed last in the backlog diff --git a/openspec/changes/archive/2026-09-28-backlog-list/tasks.md b/openspec/changes/archive/2026-09-28-backlog-list/tasks.md new file mode 100644 index 00000000..b4e26c0d --- /dev/null +++ b/openspec/changes/archive/2026-09-28-backlog-list/tasks.md @@ -0,0 +1,22 @@ +# Tasks: backlog-list + +## 1. List + +- [x] 1.1 Replace the placeholder in `src/views/ProjectBacklog.vue` with a list of the project's column-less, not-done tasks in rank order, with an empty state "Nothing in the backlog". Verify: vitest spec on a `backlogTasks(tasks)` helper; Playwright e2e opens the backlog of a seeded project. Built: `src/views/ProjectBacklog.vue`, `src/utils/backlogHelpers.js` backlogTasks(). Tests: `tests/vitest/backlog.spec.js`; e2e `tests/e2e/backlog.spec.ts`. +- [x] 1.2 "New task" on the backlog creating a task without a column at the bottom. Verify: Playwright e2e. Built as an inline "New task" field on the page (there is no TaskFormDialog at HEAD); store action `createTask`. Tests: `backlog.spec.js` (newBacklogTask payload validated against the real task schema); e2e. + +## 2. Rank, sort and filter + +- [x] 2.1 Drag handle and "Move up" and "Move down" writing sparse `columnOrder`. Verify: vitest spec on the rank helper; Playwright e2e reorders and reloads. Built: drag a row onto another (rank sort only) and Move up / Move down, through `orderFor` and `orderPatchesForStep` in `src/utils/columnHelpers.js`. Tests: `backlog.spec.js` (ranking); e2e. +- [x] 2.2 Sort by rank, priority, due date or created, kept in the query string; dragging disabled when not sorted by rank. Verify: vitest spec on the comparators. Test: `backlog.spec.js` (sortBacklog). +- [x] 2.3 The board filter bar from `boards-filters` on the backlog, plus a "Cancelled" filter. Verify: Playwright e2e filters by priority. Built without `boards-filters` (not built yet): a priority filter and a Cancelled switch on the backlog, in the query string. Test: `backlog.spec.js` (filterBacklog, backlogTasks cancelled). + +## 3. Moving + +- [x] 3.1 "Move to board" with a column menu on a backlog row, and "Move to backlog" in the board card menu. Verify: Playwright e2e moves a task both ways. Built: backlog row menu lists the board columns; board card menu gains "Move to backlog" (`moveToBacklogPatch`). Tests: `backlog.spec.js`; e2e. + +## 4. Spec hygiene, copy and verification + +- [x] 4.1 At archive, retire the "Placeholder until task management is implemented" scenario of `openspec/specs/projects.md`. Verify: the archived spec no longer mentions the placeholder. Done in this change: the scenario is replaced in `openspec/specs/projects.md`. +- [x] 4.2 New strings in `l10n/en.json` and `l10n/nl.json`. Verify: `npm run check:l10n` exits 0. Built in all 37 catalogues; also the three inherited board strings. +- [x] 4.3 `openspec validate backlog-list --type change --strict` passes. Run with openspec 1.12.0. diff --git a/openspec/changes/archive/2026-09-28-boards-configurable-columns/design.md b/openspec/changes/archive/2026-09-28-boards-configurable-columns/design.md new file mode 100644 index 00000000..df932279 --- /dev/null +++ b/openspec/changes/archive/2026-09-28-boards-configurable-columns/design.md @@ -0,0 +1,107 @@ +# Design: let each project's board run on its own columns + +## Context + +Read at development `de35541`: + +- `src/views/ProjectBoard.vue:283-291` `columns()` maps `BOARD_STATUSES` + (`src/utils/taskHelpers.js:252`: open, in_progress, blocked, done, cancelled) to lanes; + `tasksByStatus` groups with `groupTasksByStatus` (`:268`); `applyStatusMove` (`:577`) PATCHes + `status` through `updateTaskStatus` (`src/store/projects.js:835`). Lane header count at `:118`. +- Schema `column`: `title`, `project`, `order`, `wipLimit` (null means unlimited), `color`, `type` + (active, done). Authorization: every project member may create, update and delete columns. +- Schema `task`: `column` (uuid, "null = backlog"), `columnOrder` ("sort order within the column"), + `completedAt` (date-time, never set). +- `src/store/projects.js:96-111` `getDefaultColumns()` reads `loadState('planninq', + 'default_columns')`, else four hard-coded columns; `:469` `createDefaultColumns` saves them. + `grep provideInitialState lib/` finds nothing, so the state is never there. +- `lib/Service/SettingsService.php:61` stores `default_columns` as a JSON list of titles, edited in + `src/views/settings/Settings.vue:439-495`. +- `openspec/specs/tasks.md` scenarios "Assign task to column", "Mark task as done" and "WIP limit + exceeded" describe this behaviour; `docs/ARCHITECTURE.md` section 5 question 6 fixes soft limits. + +## Goals / non-goals + +Goals: a board driven by the project's columns, managed by the owner, with visible WIP limits, a +done column, stable card order, admin defaults, and no lost cards. +Non-goals: hard WIP limits, automation, swimlanes, the backlog page. + +## Decisions + +### Decision 1: the column decides the lane, the column maps a status + +A column gains an optional `status` (one of the task status enum). The board fetches the +project's columns (`{ project }`, sorted by `order`) and groups tasks by `column`. Moving a card +PATCHes `column`, `columnOrder` and, when the column has one, `status`. A column of type `done` +maps to `done`. Alternative: +keep status lanes and drop the column schema. Rejected: FEATURES.md lists configurable columns as +MVP and the schema and store already carry them. + +### Decision 1b: the server stamps `completedAt` + +`completedAt` is set on the server, in the same save as the status change, by a pre-save listener +`lib/Listener/TaskCompletionListener.php` on Open Register's `ObjectCreatingEvent` and +`ObjectUpdatingEvent` for planninq tasks: when `status` becomes `done` it merges `completedAt: now` +into the object, and when `status` leaves `done` it merges `completedAt: null`. It merges with what +other planninq pre-save listeners set and never replaces it. So the finish time is right whichever +client moved the task: the board, the API, a flow or an import. Alternative: send `completedAt` from +the board's PATCH. Rejected: it only covers the board. (Adopted from the lane B design review in the +OpenSpec pass; flow reports and the dashboard's "completed today" depend on it.) + +### Decision 2: the project owner manages columns + +A lane header menu (owner only) offers Rename, Set WIP limit, Mark as done column, Colour, Move +left, Move right and Remove, and an "Add column" button ends the row. The settings sidebar gets a +"Columns" tab with the same actions as a keyboard-friendly list. Column create, +update and delete are narrowed to the project owner and admins, so the menu and the server +agree. Members still move cards. + +Amended at build (28 Sep): OpenRegister cannot match a rule against the owner of another object, +so the narrowing is not a schema rule. `lib/Listener/ColumnOwnerGuardListener.php` refuses the +write on `ObjectCreatingEvent`, `ObjectUpdatingEvent` and `ObjectDeletingEvent` unless the caller +owns the project or is an admin. A write that changes only the planninq-kept `members` list passes, +because membership sync rewrites it as whoever changed the membership, including a member who +leaves. The schema keeps its members rule. + +### Decision 3: removing a column moves its cards first + +Remove is offered on an empty column directly; on a column with cards it asks for a target column +(or the backlog) and moves them before deleting. There must always be one done column: removing +the last one is refused with a message. + +### Decision 4: soft WIP limits + +The header shows "{count} / {limit}" when a limit is set and switches to the warning token +(`--color-warning`) with a text suffix "over limit" when the count exceeds it, so colour is not the +only signal. A drop is never refused. + +### Decision 5: sparse card order + +`columnOrder` uses steps of 1000; a drop between two cards takes the midpoint and renumbers the +lane only when no integer fits. The card menu gains "Move up" and "Move down" for keyboard users. + +### Decision 6: admin defaults reach creation + +The admin's list of titles maps to objects: every title active, the last one type `done`, +statuses mapped by position (first open, middle in_progress, last done). The fallback stays for an +empty setting. + +Amended at build (28 Sep): there is no page controller to provide initial state (the OpenRegister +AppHost serves the page), so the server makes the columns. `ProjectController::create` calls +`BoardColumnService::createDefaultColumns` right after it saves the project, and the client no +longer creates columns. The fallback titles are sentence case: To do, In progress, Review, Done. + +### Decision 7: a repair step keeps existing cards on the board + +A new repair step, once per project: create default columns if the project has none, then give +every task without a column (except cancelled) the first column whose `status` matches, else the +first active column; done tasks go to the done column. It is idempotent: tasks with a column are +untouched. + +## Risks / trade-offs + +- [The Blocked and Cancelled lanes disappear for projects on the defaults] -> blocked is shown by + the badge (`planning-dependencies-on-task-page`); cancelled tasks are in the backlog's cancelled + filter; an owner can add a lane mapped to either status. +- [Narrowing column writes to the owner] -> members who today could write columns through the API + lose that; no screen used it. diff --git a/openspec/changes/archive/2026-09-28-boards-configurable-columns/proposal.md b/openspec/changes/archive/2026-09-28-boards-configurable-columns/proposal.md new file mode 100644 index 00000000..d1045d06 --- /dev/null +++ b/openspec/changes/archive/2026-09-28-boards-configurable-columns/proposal.md @@ -0,0 +1,152 @@ +--- +kind: code +--- + +# Let each project's board run on its own columns + +## Why + +Every project board shows the same five lanes, Open, In progress, Blocked, Done and Cancelled, +because the board maps the task status enum to lanes (`src/views/ProjectBoard.vue:283-291`, +`BOARD_STATUSES` in `src/utils/taskHelpers.js:252`). Meanwhile each new project gets four real +`column` objects with titles, order, WIP limits and a done type +(`createDefaultColumns`, `src/store/projects.js:469`), and nothing ever reads them back. The +column schema is write-only. So a team cannot add a "Review" lane, rename a lane, set a WIP limit +it can see, or mark which lane means done, and the order of cards inside a lane is whatever the +API returns: `task.columnOrder` exists and is never read or written. + +The admin setting for default columns is saved (`lib/Service/SettingsService.php:61`, +`src/views/settings/Settings.vue:439-495`) but does not reach project creation either: the store +reads it with `loadState('planninq', 'default_columns')` and planninq provides no initial state, +so the hard-coded four always win. + +Configurable columns, WIP limits and card order are MVP in `docs/FEATURES.md` and every +competitor has them. + +Parity rows: `brd-columns-edit`, `prj-default-columns`, `brd-done-column`, `brd-wip-limits`, +`brd-card-order` in planninq's `openspec/parity/capabilities.json`. +Decision: build. All five are in the boards and projects core areas; `brd-columns-edit` and +`brd-card-order` have five competitors yes, `prj-default-columns` and `brd-done-column` three, +`brd-wip-limits` two. + +## What changes + +- The board renders the project's own columns in their order. +- The project owner adds, renames, reorders, recolours and removes columns, sets a WIP limit and + marks a column as done. +- A lane header shows its card count against the WIP limit and turns to a warning style when over. + A drag is never blocked. +- A card moved into a column takes that column's status; a done column marks the task done and + stamps `completedAt`. +- Cards keep the order a member gives them inside a lane. +- A new project starts with the admin's default columns. +- Existing boards keep every visible card: a one-time repair places each task in the column that + matches its status. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `brd-columns-edit`, `prj-default-columns`, `brd-done-column`, `brd-wip-limits`, `brd-card-order`. + +### `brd-columns-edit`: Add, rename, reorder and remove a board's columns. + +- Area `boards`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "src/views/ProjectBoard.vue:283-291 columns() is a hardcoded map over BOARD_STATUSES (src/utils/taskHelpers.js:252); there is no add/rename/reorder/remove-column UI anywhere in src/, and the `column` OpenRegister schema is never fetched by the frontend (see brd-wip-limits evidence)." +- Note: "a board's columns are fixed by the task status enum and cannot be added, renamed, reordered or removed from any screen." +- Demand: none recorded on the row. +- Competitors rated yes (5): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/menu-tree.md 'Add list ... each with Add card and an Actions menu (rename, reorder, mark as done column, delete)' ; source read at v1.19.0: src/components/Controls.vue:39-56 'Add list', src/components/board/Stack.vue:43 'Edit list title', :69 'Delete list'; src/components/board/Board.vue:61-67 lists are draggable with @drop onDropStack; appinfo/routes.php:38-41 stack create, update, reorder, delete" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:118 'Click + add list to add lists to your board', lists named freely on Basic boards (:122), removed via 'delete lists' (OpenProject-Boards_delete-lists image), reordered by drag (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/board-partitioned-page/board-list-container.component.html:45-50 'Add list'; :7-10 drag lists to reorder (moveList); frontend/src/app/features/boards/board/board-list/board-list.component.html:22-25 rename a list inline; frontend/src/app/features/boards/board/board-list/board-list-menu.component.ts:66 'Delete ... (shortened; full text in the matrix row)" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/menu-tree.md 'Settings ... States' ; code-census.md §2 State per project with name, color, sequence; 'Groups are not user-definable' (six fixed groups), so columns within groups are free ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(settings)/settings/projects/[projectId]/states route; apps/web/core/components/project-states/root.tsx:30-32 createState, moveStatePosition, updateState and apps/web/core/components/project-states/state-delete-modal.tsx:30,42 deleteState; apps/api/plane/app/views/state/base.py:47 create and :114 destroy" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/menu-tree.md Configure this project 'Columns' ; source read at v1.2.54: app/Template/column/index.php:5 'Add a new column', :29 'Change column position' drag handle, :34 Edit, :38 Remove; app/Controller/ColumnController.php:60 save, :114 update, :151 move, :186 remove" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Adding: Click the Add Column button', 'Renaming: Click the column name area', 'Moving: ... drag it left or right', 'Deleting: Select Delete from the column header' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Click the Add Column button', 'Change the name of a column', 'Move a column ... drag the column left or right', 'Delete a column' (read 2026-09-26)" + +### `prj-default-columns`: Start a new project with a ready-made set of board columns. + +- Area `projects`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "src/store/projects.js:328/354 createProject() -> createDefaultColumns() (line 469) writes 4 `column` objects (title/order/wipLimit/type) via saveObject(COLUMN_SCHEMA,...). But src/views/ProjectBoard.vue:283-291 builds its columns purely from the hardcoded BOARD_STATUSES status enum (src/utils/taskHelpers.js:252) and never fetches or reads the `column` schema (confirmed: no COLUMN_SCHEMA reference outside src/store/projects.js:28,138-139,476,564,566, which only write/delete it, never read it ... (shortened; full text in the matrix row)" +- Defect: "src/views/ProjectBoard.vue:283-291 columns() ignores the `column` schema entirely and hardcodes BOARD_STATUSES" +- Defect: "src/store/projects.js:96-111 getDefaultColumns() also has a dead admin-override path: it calls loadState('planninq','default_columns', null) but no PHP code anywhere calls provideInitialState for that key (confirmed: zero matches for provideInitialState in lib/), so the admin's configured column titles in src/views/settings/Settings.vue:430-495 never reach the frontend and the hardcoded 4-column ... (shortened; full text in the matrix row)" +- Note: "a new project does get a ready-made set of `column` OpenRegister objects written, but they are dead data: the kanban board the user opens is a hardcoded 5-status board, not driven by those column records at all, so the capability the row describes (a board that starts with a ready-made set of columns) does not actually reach the user." +- Demand: none recorded on the row. +- Competitors rated yes (3): + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §2 'DEFAULT_STATES at state.py:24-62 seeds five plus triage'; states are the board columns ; source read at v1.4.2: apps/api/plane/db/models/state.py:24 DEFAULT_STATES list; apps/api/plane/app/views/project/base.py:293 project create bulk-creates a State per entry of DEFAULT_STATES, so every new project starts with the seeded columns" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "source: app/Template/config/project.php:11 'Default columns for new projects (Comma-separated)', app/Model/BoardModel.php:34 board_columns ; corpus: kanboard/round4/menu-tree.md Settings 'Project settings' ; source read at v1.2.54: app/Template/config/project.php:11-12 'Default columns for new projects (Comma-separated)'; app/Model/BoardModel.php:23 default Backlog, Ready, Work in progress, Done; :34 reads board_columns when a project is created" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'By default on Scrum boards, this Done column maps to Resolved, Closed statuses, while Simplified Workflow boards map it to Done'; project templates ship preconfigured workflows (Creating a project: 'Jira comes with several default project types with preconfigured workflows and issue types') ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'If your board's project is using the Jira default workflow: Default column ... To Do Open, Reopened In Progress In Progress Done Resolved, Closed' (read 2026-09-26)" + +### `brd-done-column`: Mark a column as the done column so tasks in it count as finished. + +- Area `boards`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "the `column` schema declares a `type` enum ('active'/'done', src/store/projects.js:96-111 getDefaultColumns) but columns are never rendered or editable (see brd-columns-edit), so there is no user action to mark any column as the done column. The 'Done' status lane is simply hardcoded in BOARD_STATUSES (src/utils/taskHelpers.js:252)." +- Note: "tasks with status 'done' do count as finished, but that is a hardcoded status value, not something a user marks on a column they configured." +- Demand: none recorded on the row. +- Competitors rated yes (3): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/menu-tree.md 'mark as done column' ; source: lib/Service/CardService.php:454-455 a card moved into the done column gets setDone ; source read at v1.19.0: src/components/board/Stack.vue:66 list menu 'Set cards as "done"'; lib/Db/Stack.php:35 isDoneColumn; lib/Service/CardService.php:454-462 a card moved into the done list gets setDone, leaving it clears done; appinfo/routes.php:158 stack_ocs#setDoneStack" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §2 'A state change to a completed group state sets Issue.completed_at (issue.py:236-249)'; the completed group is fixed rather than chosen, but any state placed in it counts as done ; source read at v1.4.2: apps/web/core/components/project-states/group-list.tsx lists states under fixed groups, a state added to the completed group counts as done; apps/api/plane/db/models/issue.py:240-247 _sync_completed_at sets completed_at when the state group is COMPLETED. The done group is fixed, any state in it is a done column" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'The rightmost column is always green and represents items in a successful state ... this Done column maps to Resolved, Closed statuses' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'The single right-most column will always be green, representing items in a successful state'; default mapping 'Done Resolved, Closed' (read 2026-09-26)" + +### `brd-wip-limits`: Set a work in progress limit per column and see when a column goes over it. + +- Area `boards`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "`wipLimit` is written on `column` objects at project creation (src/store/projects.js:106-110 getDefaultColumns, e.g. 3/2), but src/views/ProjectBoard.vue never fetches the `column` schema at all (only COLUMN_SCHEMA writes/deletes exist in src/store/projects.js:28,138-139,476,564,566) and there is no wipLimit reference anywhere in src/ (grep confirmed zero matches outside the store's own write path)." +- Defect: "src/views/ProjectBoard.vue: no WIP-limit badge or read of the `column` schema's wipLimit field" +- Note: "same root cause as prj-default-columns: the `column` schema (which carries wipLimit) is write-only, never read back by the board." +- Demand: none recorded on the row. +- Competitors rated yes (2): + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/code-census.md 'phases, WIP: columns with task_limit' ; source: app/Template/board/table_column.php:113-114 count/limit in the header ; _round4/compare/promoted-rows-batch7.md 9.14 'task_limit, which colours the column header when exceeded' ; source read at v1.2.54: app/Template/column/index.php:19 'Task limit' column setting; app/Template/board/table_column.php:113-114 count over limit in the header; app/Template/board/table_tasks.php:6 board-task-list-limit class when the column is over its limit" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'Column colored red: Maximum number of issues exceeded' and 'Column colored yellow: Minimum number of issues not met' (column constraints) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-columns-938845277.html 'If a column constraint is exceeded, then the column will change color ... Column colored red, Maximum number of issues exceeded' (read 2026-09-26)" + +### `brd-card-order`: Reorder cards within a column to show which comes first. + +- Area `boards`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "the task schema declares `columnOrder` ("Sort order within the column") but grep across src/ finds zero references to columnOrder anywhere in the frontend; src/views/ProjectBoard.vue groups tasks by status (groupTasksByStatus, src/utils/taskHelpers.js:268) with no sort by columnOrder and no drag-to-reorder-within-column handler (onDrop only changes status, src/views/ProjectBoard.vue:510-515)." +- Defect: "schema field task.columnOrder is declared but never read or written anywhere in src/" +- Demand: none recorded on the row. +- Competitors rated yes (5): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/code-census.md Card and Stack carry an order ; source: appinfo/routes.php card#reorder ; source read at v1.19.0: src/components/board/Stack.vue:104-114 drag within a list calls onDropCard; lib/Service/CardService.php:436 reorder(id, stackId, order); appinfo/routes.php:52 card#reorder" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:152 'Move cards with drag and drop within a list'; Basic board lists 'order your work packages within' (:55) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-card-view/services/wp-card-drag-and-drop.service.ts:161-175 same-list drop is a pure reorder; lib/api/v3/queries/order/query_order_api.rb:34, :73 PATCH the manual order; app/models/ordered_work_package.rb:31-35 stored position" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §2 'sort_order float (:158)' on Issue ; source: kanban/block.tsx:206 drag within a group reorders by sort_order under manual ordering ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/block.tsx:206 draggable card; apps/web/core/components/issues/issue-layouts/utils.tsx:491-518 drop computes a new sort_order between neighbours under manual ordering; apps/api/plane/db/models/issue.py:158 sort_order FloatField" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/journeys.md 1 moveTaskPosition with a position ; source: app/Controller/TaskMovePositionController.php ; source read at v1.2.54: assets/js/src/BoardDragAndDrop.js:37 save sends the new position; app/Controller/BoardAjaxController.php:18-46 saves task positions from the drag and drop; app/Template/task_move_position/show.php:14-15 'Insert before this task', 'Insert after this task'" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html, https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html): "corpus: jira-data-center/round4/M1-column.md 3.18 ranking by drag; Jira Software boards and backlog order by Rank (drag cards within a column) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html board filter 'ORDER BY Rank ASC'; https://confluence.atlassian.com/jirasoftwareserver/using-your-kanban-backlog-938845378.html 'Drag and drop an issue to rank it' (read 2026-09-26)" + +## Scope + +### In scope + +- Reading `column` objects on the board; column management in a lane header menu and a "Columns" + tab in the project settings sidebar. +- A `status` mapping on each column, and `completedAt` stamped on the server whenever a task becomes done. +- `columnOrder` on drag within a lane and on "Move up" and "Move down" in the card menu. +- Passing the admin's default columns to project creation. +- A repair step that assigns a column to every task that has none and is not cancelled. + +### Out of scope + +- Blocking a drag at the WIP limit. Row `brd-wip-enforce` is decided no: `docs/ARCHITECTURE.md` + section 5 question 6 keeps limits soft. +- Column automation: `boards-column-automation`. Swimlanes and card colours: `boards-card-display`. +- The backlog page itself: `backlog-list` shows tasks without a column. + +## Impact + +- `src/views/ProjectBoard.vue`, `src/store/projects.js`, `src/components/ProjectSettingsSidebar.vue`, + `src/utils/taskHelpers.js`, `lib/Settings/planninq_register.json` (column `status`; column + write rule narrowed to the project owner), `lib/Settings/AdminSettings.php` or the page + controller (initial state), a new repair step in `lib/Repair/`, `l10n/`. +- Depends on: nothing. `backlog-list`, `boards-filters`, `boards-card-display`, + `boards-column-automation`, `boards-cross-project-board`, `tasks-move-between-projects` and + `projects-templates-shared-workflow` build on it. + +## Risks + +### Risk 1: Cards vanish from existing boards +**Severity**: High +**Mitigation**: the repair step runs before the new board ships and assigns every task without a +column to the first column whose status matches (open to the first active column, done to the +done column). Cancelled tasks stay without a column and remain findable in the backlog's +cancelled filter. A PHPUnit test runs the repair on a fixture of every status. + +### Risk 2: Status and column disagree +**Severity**: Medium +**Mitigation**: the column decides the lane; moving a card writes both `column` and the column's +mapped status in one PATCH. Readers that use status (reminders, portfolio counts, activity) keep +working. diff --git a/openspec/changes/archive/2026-09-28-boards-configurable-columns/specs/board-columns/spec.md b/openspec/changes/archive/2026-09-28-boards-configurable-columns/specs/board-columns/spec.md new file mode 100644 index 00000000..d3fe9aba --- /dev/null +++ b/openspec/changes/archive/2026-09-28-boards-configurable-columns/specs/board-columns/spec.md @@ -0,0 +1,119 @@ +# board-columns delta for boards-configurable-columns + +Extends the flat main specs `openspec/specs/kanban-board.md`, `openspec/specs/tasks.md` and +`openspec/specs/projects.md` (Default Column Creation). + +## ADDED Requirements + +### Requirement: The board shows the project's own columns + +The system MUST render a project's board from that project's `column` objects in their `order`, +placing each task in the column it references. Tier: MVP (docs/FEATURES.md). + +#### Scenario: A project with a Review column + +- **GIVEN** project "Vergunningen" has columns To do, In progress, Review and Done +- **WHEN** a member opens its board at /projects/:id +- **THEN** four lanes show in that order with their titles + +### Requirement: The project owner can manage the columns + +The system MUST let the project owner add, rename, reorder, recolour and remove columns, and MUST +refuse these actions to other members. Removing a column that holds cards MUST first move them to +a column the owner picks or to the backlog, and the last done column MUST NOT be removable. +Tier: MVP. + +#### Scenario: Add and rename a column + +- **GIVEN** the owner is on the board +- **WHEN** they choose "Add column", name it "Waiting for applicant", then rename it "Waiting" +- **THEN** a lane "Waiting" shows at the end of the board + +#### Scenario: Remove a column with cards + +- **GIVEN** the column "Review" holds two cards +- **WHEN** the owner removes it and picks "In progress" as the target +- **THEN** both cards show in "In progress" and the "Review" lane is gone + +#### Scenario: A member cannot change columns + +@e2e exclude API permission contract, covered by PHPUnit on ColumnOwnerGuardListener (tests/unit/Listener/ColumnOwnerGuardListenerTest.php) + +- **GIVEN** a member who is not the owner +- **WHEN** they open a lane header +- **THEN** no column actions are offered +- **AND** an update of a column object through the API answers 403 + +### Requirement: A done column finishes the task + +The system MUST let the owner mark a column as the done column. A card moved into it MUST get +status `done`. Whenever a task's status becomes `done`, by any client, the server MUST set its +`completedAt` in the same save, and MUST clear it when the status leaves `done`. A card moved +into any other column MUST get that column's mapped status. Tier: MVP. + +#### Scenario: Drop a card on Done + +- **GIVEN** a task in progress +- **WHEN** a member drags its card to the Done column +- **THEN** the task has status `done` and `completedAt` set to the time of the move + +#### Scenario: A move through the API is stamped too + +@e2e exclude server-side pre-save stamp, covered by PHPUnit on TaskCompletionListener (tests/unit/Listener/TaskCompletionListenerTest.php) + +- **GIVEN** a flow sets a task's status to `done` through the Open Register objects API +- **WHEN** the save finishes +- **THEN** the stored task carries a `completedAt` time from that same save + +### Requirement: Lanes show their WIP limit without blocking + +The system MUST show a lane's card count against its WIP limit, MUST switch the header to a +warning style with the words "over limit" when the count exceeds it, and MUST still accept the +drop. Tier: MVP. + +#### Scenario: Go over the limit + +- **GIVEN** the In progress column has a WIP limit of 3 and holds 3 cards +- **WHEN** a member drags a fourth card into it +- **THEN** the card lands in the lane +- **AND** the header reads "4 / 3 over limit" in the warning style + +### Requirement: Cards keep the order a member gives them + +The system MUST store a card's position within its lane and show cards in that order, and MUST +offer "Move up" and "Move down" in the card menu as the keyboard equivalent of dragging. +Tier: MVP. + +#### Scenario: Reorder with the keyboard + +- **GIVEN** a lane with cards A above B +- **WHEN** a member opens B's card menu and chooses "Move up" +- **THEN** B shows above A, also after a reload + +### Requirement: New projects start with the admin's default columns + +The system MUST create a new project's columns from the admin's default column setting, with the +last column as the done column, and MUST fall back to To do, In progress, Review and Done when +the setting is empty. Tier: MVP. + +#### Scenario: The admin changed the defaults + +@e2e exclude needs an admin setting change mid-suite; covered by PHPUnit on BoardColumnService and ProjectController (tests/unit/Service/BoardColumnServiceTest.php) + +- **GIVEN** an admin set the default columns to Intake, Work and Closed +- **WHEN** a user creates a project +- **THEN** its board shows Intake, Work and Closed, with Closed as the done column + +### Requirement: Existing boards keep their cards + +The system MUST, once, give every task without a column that is not cancelled the column that +matches its status, so no card that showed before the change disappears from the board. +Tier: MVP. + +#### Scenario: An upgraded board + +@e2e exclude one-shot upgrade repair step, covered by PHPUnit on AssignBoardColumns (tests/unit/Repair/AssignBoardColumnsTest.php) + +- **GIVEN** a project whose tasks have statuses open, in_progress and done and no column +- **WHEN** the app upgrade runs its repair steps +- **THEN** each task sits in the matching column and the board shows all three diff --git a/openspec/changes/archive/2026-09-28-boards-configurable-columns/tasks.md b/openspec/changes/archive/2026-09-28-boards-configurable-columns/tasks.md new file mode 100644 index 00000000..50346587 --- /dev/null +++ b/openspec/changes/archive/2026-09-28-boards-configurable-columns/tasks.md @@ -0,0 +1,28 @@ +# Tasks: boards-configurable-columns + +## 1. Schema and defaults + +- [x] 1.1 Add optional `status` to the column schema and narrow column create, update and delete to the project owner and admins in `lib/Settings/planninq_register.json`. Verify: PHPUnit register test; `npm run check:schema-l10n` exits 0. Built: the owner rule lives in `lib/Listener/ColumnOwnerGuardListener.php` on the pre-save and pre-delete events (OpenRegister cannot match a rule against another object's owner); the schema keeps its members rule. Tests: `tests/unit/Listener/ColumnOwnerGuardListenerTest.php`, `tests/unit/Service/BoardColumnServiceTest.php` (column payload against the real schema). +- [x] 1.2 Provide `default_columns` as initial state mapped to column objects, and read it in `getDefaultColumns`. Verify: PHPUnit test on the mapping; vitest spec on `getDefaultColumns` with and without state. Built: no page controller exists (the AppHost serves the page), so `ProjectController::create` makes the columns on the server through `BoardColumnService::createDefaultColumns`. Tests: `BoardColumnServiceTest`, `ProjectControllerTest::testCreateSucceedsForNonAdminWhenPolicyAllowsAll`. + +## 2. Repair + +- [x] 2.1 Repair step in `lib/Repair/` that creates missing columns and assigns a column to every non-cancelled task without one. Verify: PHPUnit test over a fixture with every status, run twice to prove idempotence. Built: `lib/Repair/AssignBoardColumns.php` over `BoardColumnService::assignColumns`. Tests: `tests/unit/Repair/AssignBoardColumnsTest.php`, `BoardColumnServiceTest::testAssignColumnsPlacesTasksByStatusAndIsIdempotent`. + +## 3. Board + +- [x] 3.1 Fetch the project's columns in `src/views/ProjectBoard.vue` and group tasks by `column`, sorted by `columnOrder`. Verify: vitest spec on a new `groupTasksByColumn` helper. Test: `tests/vitest/boardColumns.spec.js` (groupTasksByColumn). +- [x] 3.2 Moving a card writes `column`, `columnOrder` and the mapped status, with rollback on failure. Verify: vitest spec on the patch builder; Playwright e2e moves a card to Done and reloads. Test: `boardColumns.spec.js` (buildMovePatch); e2e `tests/e2e/board-columns.spec.ts`. +- [x] 3.2b `lib/Listener/TaskCompletionListener.php`: stamp `completedAt` when status becomes done and clear it when status leaves done, on create and update, registered in `lib/AppInfo/Application.php`. Verify: PHPUnit tests in `tests/Unit/Listener/` for enter, leave, unrelated update, and a create with status done. Tests: `tests/unit/Listener/TaskCompletionListenerTest.php`; wiring from the caller in `tests/unit/AppInfo/BoardColumnWiringTest.php`. +- [x] 3.3 WIP count and warning style with text in the lane header. Verify: vitest mount test over and under the limit. Test: `boardColumns.spec.js` (wipState); the vitest suite runs in node without a DOM, so the helper is tested rather than a mount. +- [x] 3.4 Drag within a lane and "Move up" and "Move down" in the card menu. Verify: Playwright e2e reorders two cards and reloads. Test: `boardColumns.spec.js` (orderPatchesForStep); e2e `board-columns.spec.ts`. + +## 4. Column management + +- [x] 4.1 Owner-only lane header menu and "Add column". Verify: Playwright e2e adds, renames and removes a column. Built: `src/components/ColumnActions.vue`, `src/dialogs/ColumnEditDialog.vue`. Tests: e2e `board-columns.spec.ts`; `boardColumns.spec.js` (columnPayload against the real schema). +- [x] 4.2 "Columns" tab in `src/components/ProjectSettingsSidebar.vue`, including remove-with-target and the last-done-column guard. Verify: vitest mount test for the guard. Built: `src/components/ColumnSettingsList.vue`, `src/dialogs/ColumnRemoveDialog.vue`. Test: `boardColumns.spec.js` (canRemoveColumn); no DOM mount in this vitest setup. + +## 5. Copy and verification + +- [x] 5.1 New strings in `l10n/en.json` and `l10n/nl.json`. Verify: `npm run check:l10n` exits 0. Built in all 37 catalogues. +- [x] 5.2 `openspec validate boards-configurable-columns --type change --strict` passes. Run with openspec 1.12.0. diff --git a/openspec/changes/archive/2026-09-28-boards-list-toggle/design.md b/openspec/changes/archive/2026-09-28-boards-list-toggle/design.md new file mode 100644 index 00000000..75a031de --- /dev/null +++ b/openspec/changes/archive/2026-09-28-boards-list-toggle/design.md @@ -0,0 +1,37 @@ +# Design: a list view of the board's own cards + +## Context + +Read at development `4806ed3`: + +- `src/views/ProjectBoard.vue` renders lanes from the project's column objects and cards from + `tasksByColumn`, a grouping of `visibleTasks` (the tasks after the label filter) by `column` + (`src/utils/columnHelpers.js` `groupTasksByColumn`). A task with no column is in the backlog and + not on the board. +- The page already keeps no view state in the URL; the backlog keeps its sort and filters in the + query string (`src/views/ProjectBacklog.vue` `setQuery`). + +## Decisions + +### Decision 1: the list is the board flattened + +`boardListRows(tasks, columns)` walks `groupTasksByColumn` in lane order and returns one row per +card with its column. The list therefore shows exactly the cards the board shows, in the order the +board shows them, and follows the label filter because it reads `visibleTasks`. Alternative: a +separate query. Rejected: two sources can disagree. + +### Decision 2: the view is in the query string + +`?view=list` opens the list; no parameter is the board. A switch of two buttons with +`aria-pressed` sits in the page header. Alternative: a user preference. Rejected: a link should +open what the sender saw, and the backlog already keeps its view state in the URL. + +### Decision 3: the list is read-only in this change + +A row opens the task. Moving and ranking stay on the board, where they already have a keyboard +path (the card menu). Non-goal: inline editing, column sorting of the list. + +## Risks + +- [A long board makes a long list] -> the list has no paging, like the board; the board fetches + every task already. diff --git a/openspec/changes/archive/2026-09-28-boards-list-toggle/proposal.md b/openspec/changes/archive/2026-09-28-boards-list-toggle/proposal.md new file mode 100644 index 00000000..f3124771 --- /dev/null +++ b/openspec/changes/archive/2026-09-28-boards-list-toggle/proposal.md @@ -0,0 +1,40 @@ +--- +kind: code +--- + +# Switch between the board and a list of the same tasks + +## Why + +The only planninq-owned parity row still marked `building` is `brd-list-toggle`, "Switch between +the board and a list of the same tasks", and it named no change. Its built evidence pointed at the +backlog placeholder, which `backlog-list` (archived 2026-09-28) turned into a list of the tasks in +no column: that is the backlog, not the board's own cards. So the row is still not built, and a +`building` row with no change is a claim nobody backs. + +Decision: build. The row is in the boards area (a core area of the product) and four competitors +rate it yes. + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq. Row: `brd-list-toggle` +(origin own-code). +- OpenProject yes: "Work packages list, plus Gantt, board and calendar views" over the same work + packages (corpus openproject/round4/menu-tree.md). +- Plane yes: "spreadsheet, board, calendar, gantt and list layouts" + (apps/web/core/components/issues/issue-layouts/filters/header/layout-selection.tsx:24-36 at v1.4.2). +- Kanboard yes: "Overview · Board · List" with the same search (app/Template/project_header/views.php:12 + and :18 at v1.2.54). +- Jira yes: a board is based on a saved filter, and the same filter opens as a list in the issue + navigator (https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html). +- Nextcloud Deck partial: Kanban and Gantt view modes only (src/components/Controls.vue). + +## What changes + +- The board page gets a Board and List switch. The list shows the same cards the board shows, + with the same label filter, one row per card with its column, priority and due date, in lane + order and then card order. +- The choice lives in the query string, so a link opens the same view. + +## Impact + +- `src/views/ProjectBoard.vue`, `src/utils/columnHelpers.js`, catalogues. +- No schema or server change. diff --git a/openspec/changes/archive/2026-09-28-boards-list-toggle/specs/board-list/spec.md b/openspec/changes/archive/2026-09-28-boards-list-toggle/specs/board-list/spec.md new file mode 100644 index 00000000..25636df8 --- /dev/null +++ b/openspec/changes/archive/2026-09-28-boards-list-toggle/specs/board-list/spec.md @@ -0,0 +1,23 @@ +# board-list delta for boards-list-toggle + +## ADDED Requirements + +### Requirement: A member can see the board as a list + +The system MUST let a project member switch the board page between the board and a list of the +same cards, MUST show in the list every card the board shows (after the label filter) with its +column, priority and due date, in lane order and then card order, and MUST keep the choice in the +page address. Tier: V1. + +#### Scenario: Switch to the list + +- **GIVEN** project "Vergunningen" has two cards in To do and one in Done +- **WHEN** a member opens its board and chooses "List" +- **THEN** a list shows the three cards, the two To do cards first, each with its column +- **AND** after a reload the page still shows the list + +#### Scenario: The list follows the label filter + +- **GIVEN** one of the three cards carries the label "Urgent client" +- **WHEN** the member picks that label in the filter and chooses "List" +- **THEN** the list shows that one card diff --git a/openspec/changes/archive/2026-09-28-boards-list-toggle/tasks.md b/openspec/changes/archive/2026-09-28-boards-list-toggle/tasks.md new file mode 100644 index 00000000..19fa930d --- /dev/null +++ b/openspec/changes/archive/2026-09-28-boards-list-toggle/tasks.md @@ -0,0 +1,11 @@ +# Tasks: boards-list-toggle + +## 1. List view + +- [x] 1.1 `boardListRows(tasks, columns)` in `src/utils/columnHelpers.js`: one row per card on the board, in lane order then card order, with its column. Verify: vitest spec in `tests/vitest/boardColumns.spec.js`. Red on 'boardListRows is not a function', then green. +- [x] 1.2 Board and List switch in `src/views/ProjectBoard.vue`, the view kept in `?view=list`, and a list table (title, column, priority, due date) whose rows open the task. Verify: Playwright e2e switches to the list, finds the board's cards, reloads and stays on the list. Spec file `tests/e2e/board-list.spec.ts`. + +## 2. Copy and verification + +- [x] 2.1 New strings in every catalogue the repo ships. Verify: `npm run check:l10n` exits 0. Four strings in all 37 catalogues. +- [x] 2.2 `openspec validate boards-list-toggle --type change --strict` passes. diff --git a/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/design.md b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/design.md new file mode 100644 index 00000000..52af8479 --- /dev/null +++ b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/design.md @@ -0,0 +1,80 @@ +# Design: project overview, project logs and a risk register + +## Context + +What exists at `de35541`: + +- **Project pages.** `src/manifest.json` declares `ProjectBoard` at `/projects/:id` (`:145`), `ProjectBacklog` at `/projects/:id/backlog` (`:146`), `ProjectTimeline` at `/projects/:id/timeline` (`:147`) and `TaskDetail` (`:148`), each a `type: "custom"` page resolved through `src/registry.js:42-51`. The board header links to Backlog and Timeline with two buttons and opens settings with a cog (`src/views/ProjectBoard.vue:40-62`). There is no overview page and no shared tab row. +- **Project data.** `project` carries `title`, `description`, `status`, `owner`, `members`, `startDate`, `endDate`, the budget fields and `metadata` (`lib/Settings/planninq_register.json:445-580`). `projects.js` reads tasks per project with `fetchTasks` (`src/store/projects.js:775-785`). +- **Progress.** `task.status` has `open`, `in_progress`, `blocked`, `done` and `cancelled`. `task.percentComplete` exists and nothing in `src/` reads it. +- **Notes.** The task detail mounts `CnObjectSidebar` with notes, files and audit trail from OpenRegister's per-object endpoints (`src/views/TaskDetail.vue:124-137`). The project has no such sidebar. +- **Tasks as actions.** `task.issueType` is a free string with default `task` (`planninq_register.json:324-329`). +- **Risk.** Nothing named risk, likelihood, impact or countermeasure exists in `src/`, `lib/` or the register. + +What OpenRegister offers, read at `ConductionNL/openregister` development `c53dd0685`: + +- `x-openregister-calculations` declares a typed, optionally materialised value from an `expression` over the object's own properties (`lib/Service/Calculation/CalculationAnnotationValidator.php:150-200`; injected before persistence per `lib/AppInfo/Application.php:3326`). + +## Goals / non-goals + +Goals: + +- One screen that answers "where does this project stand". +- A log that keeps issues, lessons, meetings and decisions per project, with actions that are ordinary tasks. +- A scored risk register per project and across projects. + +Non-goals: + +- A configurable widget grid. +- Per-portfolio risk scales (next change in this series). + +## Decisions + +### Decision 1: the overview is a tab next to the board, not a replacement for it + +The overview lives at `/projects/:id/overview`. The board stays at `/projects/:id`, because the deep links in `src/manifest.json:272-302` point there. A new `ProjectTabs` component replaces the Backlog and Timeline buttons in the board header and renders Overview, Board, Backlog, Timeline, Risks and Log as links with `aria-current` on the active one. The settings cog stays. + +The overview shows, in this order: title and status, description, planned start and end dates, the people on the project with their display names, progress, the three highest-scored open risks, and the five latest log entries. Each block links to its tab. + +Progress is the number of `done` tasks over all tasks that are not `cancelled`, read from `fetchTasks`. `percentComplete` is not used, because nothing sets it and a mean of unset values reads as zero. + +Alternative considered: make the overview the project's landing page at `/projects/:id` and move the board to `/projects/:id/board`. It matches OpenProject, but it breaks every stored deep link. + +### Decision 2: a log entry is its own schema; an action is a task + +`projectLogEntry` has `project` (`$ref` project), `type` (`issue`, `lesson`, `meeting`, `decision`), `title`, `body` (Markdown), `date`, `status` (`open`, `closed`, used for issues), `attendees` (user ids, used for meetings) and `actions` (task ids). The author and time come from OpenRegister's own object metadata, so the client cannot fake them. + +An action is not a log entry type. "Add action" on an entry creates a task in the same project with `issueType: 'action'` and appends its id to `actions`. The Log tab's "Actions" filter lists the project's tasks with that `issueType`, so an action is assigned, dated, dragged and closed like any task. This follows ADR-001 rule 3: one task model. + +Alternative considered: OpenRegister notes on the project object, as the task sidebar uses. Notes cannot carry a type, a status or linked actions, so the tender's four logs would be one undifferentiated stream. + +### Decision 3: a risk is scored by a declared calculation + +`risk` has `project`, `title`, `description`, `category`, `likelihood` and `impact` (integers from 1 to the scale's size), `score`, `status` (`open`, `mitigating`, `closed`, `occurred`), `owner` (user id), `response` (`avoid`, `reduce`, `transfer`, `accept`), `countermeasures` (Markdown) and `reviewDate`. + +`score` is a materialised `x-openregister-calculations` entry, `likelihood × impact`. Because it is stored, the index sorts and filters on it without the browser computing anything, and no client can write a score that disagrees with its inputs. + +### Decision 4: the scale is data, the colours are tokens + +`risk_scale` is an admin setting in Beheer: the number of levels (3 to 5), a label per level for likelihood and for impact, and two score thresholds that split low, medium and high. The heat map colours the cells with NL Design tokens for those three bands, never hard-coded colours, and every cell also carries its count and band as text, so colour is never the only signal (WCAG 1.4.1). + +### Decision 5: the cross-project Risks page is declarative + +`RiskIndex` at `/projects/risks` is a `type: "index"` page over the `risk` schema, sorted by `score` descending, with the project, owner, status and review date as columns. OpenRegister's read rule decides which risks a user sees, so the page needs no component of its own. The per-project Risks tab is a custom page because the heat map is not an index. + +## Risks / trade-offs + +- [The heat map and the list disagree after a scale change] -> The scale bounds `likelihood` and `impact`. Lowering the number of levels is refused while a risk uses a higher value, with the count of risks in the way. +- [Log entries grow without bound] -> The Log tab pages through OpenRegister with `_limit`, and the overview reads only the latest five. +- [A risk owner who leaves the project] -> The Risks tab marks an owner who is no longer on the project, and the member clean-up of `projects-members-and-roles` leaves the risk in place for a manager to reassign. + +## Changes at build time (28 Sep 2026, at development 86840fa) + +The design was written before three things it leans on were settled. The build follows the code at HEAD: + +- **Authorization.** `projects-members-and-roles` task 1.1 is not built. `projectLogEntry` and `risk` use the settled pattern from planninq#681 instead: a hidden `members` list with the rule `{"members": {"$contains": "$userId"}}` on read, update and delete, no `match` on create, and both schemas added to `ProjectMembershipService::SCOPED_SCHEMAS` and to the gated set of `ProjectMemberAccessListener`, which stamps the members and refuses a create by someone not on the project. The existing member sync and back-fill repair step cover the new schemas through `SCOPED_SCHEMAS`. +- **Creating the action.** `tasks-create-edit-delete` is not built. "Add action" uses `createTask` in `src/store/projects.js` (added by backlog-list). Because the board is column based since boards-configurable-columns, the action lands at the bottom of the project's first column, so it appears on the board as the scenario asks; a project with no columns gets it in the backlog. +- **The risk scale.** The scale lives in `RiskScaleService` (validation, the in-use check, the refusal text) rather than in `SettingsService`. `SettingsController::create()` refuses a malformed scale with 400 and a smaller scale that risks still exceed with 409, `{"error": "risk-scale-in-use", "count": 2, "level": 5}`; `SettingsService` keeps a malformed value out of the config on any other path. The tests are `tests/unit/Service/RiskScaleServiceTest.php` and `tests/unit/Controller/SettingsControllerTest.php`, not `SettingsServiceTest.php`. +- **Schema count.** The register now declares ten schemas; `testRegisterDeclaresExactlyTenSchemas` and the scenario in `openspec/specs/project-delivery/spec.md` name them. +- **Names.** The overview lists people by display name through Nextcloud's autocomplete endpoint (`src/utils/userNames.js`), which every signed-in user may call, falling back to the user id. +- **Menu.** Risks under Projects is a child entry of the Projects menu item, beside "All projects". The `RiskIndex` page is declared before `ProjectBoard` in the manifest. diff --git a/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/proposal.md b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/proposal.md new file mode 100644 index 00000000..8f9c0ab5 --- /dev/null +++ b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/proposal.md @@ -0,0 +1,98 @@ +--- +kind: code +--- + +# Project overview, project logs and a risk register + +## Why + +A project has no page that tells you where it stands. Opening a project lands on the board (`src/views/ProjectBoard.vue`, route `/projects/:id` in `src/manifest.json:145`). The description sits in the Details tab and the members in the Members tab of the settings sidebar (`src/components/ProjectSettingsSidebar.vue:16-127`). Nothing shows progress: `task.percentComplete` is declared on the schema and read nowhere in `src/`. + +A project has no log. The only notes and activity are per task, in the task sidebar (`src/views/TaskDetail.vue:124-137`). A project manager cannot record an issue, a lesson learned or what a meeting decided, and cannot keep the actions from those in one place. + +A project has no risk register. `lib/Settings/planninq_register.json` has no risk schema, and neither `src/manifest.json` nor `src/registry.js:42-51` has a risk page. ADR-001 places `risk-register-issue-tracking` under Projecten as a sub-page (`openspec/architecture/adr-001-information-architecture.md:61`). + +Gemeente Sittard-Geleen asks for all three in tender 365739 (https://www.tenderned.nl/aankondigingen/overzicht/365739): logs for actions, issues, lessons learned and meetings (requirement 4012), and a risk table scored on likelihood and impact with a format that can differ per portfolio (requirements 4003, 4004, 64441). OpenProject and Kanboard ship a project overview page. The OpenProject community also asks for a risk register (https://community.openproject.org/wp/49051). + +Parity rows: `prj-overview-page`, `prj-project-logs`, `prj-risk-register` in planninq's `openspec/parity/capabilities.json`. +Decision: build. The overview is half built and the missing half matters, with two competitors rated yes. Logs and the risk register answer a tender in the core projects area. + +## What changes + +- Every project gets an Overview tab: description, dates, people, progress and the latest risks and log entries on one screen. +- The project pages share one row of tabs: Overview, Board, Backlog, Timeline, Risks and Log. +- A project member records issues, lessons learned, meetings and decisions in the project log, and turns any of them into an action that is a normal task. +- A project member keeps a risk register: each risk scored on likelihood and impact, with an owner, a response and countermeasures, shown as a list and as a heat map. +- Projecten gets a Risks sub-page that lists the risks of every project you can see, highest score first. +- An admin sets the risk scale: how many levels, what each is called, and where low turns into medium and high. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `prj-overview-page`, `prj-project-logs`, `prj-risk-register`. + +### `prj-overview-page`: Open a project overview page showing its description, members and progress. + +- Area `projects`. Planninq is rated `partial`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "src/views/ProjectBoard.vue:26-64 (title/icon/color header) opens src/components/ProjectSettingsSidebar.vue:16-127 (Details tab shows description; Members tab lists members). No progress indicator anywhere: task.percentComplete (schema property) is never read in src/ (grep confirmed zero matches)." +- Note: "description and members are both reachable, but only by opening the settings sidebar from the board, not on one overview screen, and there is no progress indicator anywhere in the app." +- Demand: none recorded on the row. +- Competitors rated yes (2): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/menu-tree.md 'Inside a project > Overview grid of widgets, per project'; corpus: openproject/round4/M1-column.md 10.1 modules/overviews ; source read at v17.8.0: modules/overviews/config/routes.rb:6-7 project overview at the project root; modules/overviews/lib/overviews/grid_registration.rb:16 'project_description', :26 'project_status', :46 'members' default widgets; modules/overviews/app/components/overviews/overview_grid_component.rb renders them" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/menu-tree.md project 'Overview' and 'Summary' ; source: app/Controller/ProjectOverviewController.php shows description, members, column counts and activity ; source read at v1.2.54: app/Template/project_overview/show.php:3-8 column task counts, description, activity; app/Template/project_overview/information.php:10-15 members by role, :22-26 start and end date; app/Controller/ProjectOverviewController.php:16 show" + +### `prj-project-logs`: Keep logs per project for actions, issues, lessons learned and meetings. + +- Area `projects`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "No project-scoped log of actions, issues, lessons learned or meetings. The only logs are per task: CnObjectSidebar Comments (notes) and Activity (audit trail) tabs on src/views/TaskDetail.vue:129-137. The project settings sidebar has Details, Members and Danger zone tabs only (src/components/ProjectSettingsSidebar.vue:8-165)." +- Note: "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirement 4012 (logboeken voor acties, issues, leerpunten, bijeenkomsten), 64437." +- Demand (tender, via origin): https://www.tenderned.nl/aankondigingen/overzicht/365739 +- Competitors rated yes: none. + +### `prj-risk-register`: Keep a risk register per project that scores each risk on likelihood and impact and records its countermeasures. + +- Area `projects`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "searched src/ lib/ and lib/Settings/planninq_register.json for risk, likelihood, impact, countermeasure: none. No risk schema, no risk page in src/manifest.json pages, no risk component in src/registry.js:42-51." +- Note: "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4003, 4004, 64441 (risk table scored on likelihood and impact, format adjustable per portfolio). Also asked for by openproject: https://community.openproject.org/wp/49051 (featureRequest)." +- Demand (tender, via origin): https://www.tenderned.nl/aankondigingen/overzicht/365739 +- Competitors rated yes: none. + +## Scope + +### In scope + +- A project overview page and the shared project tabs. +- A `projectLogEntry` schema, the Log tab, and actions as tasks. +- A `risk` schema with a calculated score, the Risks tab with a heat map, and a cross-project Risks page. +- An app-wide risk scale in Beheer. + +### Out of scope + +- A different risk scale per portfolio. The portfolio grouping arrives in `projects-grouping-hierarchy-fields`, which adds the per-portfolio override of the scale defined here. +- Portfolio roll-ups of risk: `portfolio-status-overview` reads the risk scores defined here. +- Widgets the user can rearrange on the overview (OpenProject's grid). The overview has a fixed layout. + +## Impact + +- Schema: new `projectLogEntry` and `risk` schemas in `lib/Settings/planninq_register.json`, with project-scoped authorization. `task` is unchanged; an action is a task with `issueType: 'action'`. +- Manifest and registry: pages `ProjectOverview` (`/projects/:id/overview`), `ProjectRisks` (`/projects/:id/risks`), `ProjectLog` (`/projects/:id/log`) and `RiskIndex` (`/projects/risks`). +- Components: a shared `ProjectTabs` header used by the board, backlog, timeline and the three new pages; a `RiskHeatMap`; dialogs `src/dialogs/RiskEditDialog.vue` and `src/dialogs/LogEntryEditDialog.vue`. +- Settings: `risk_scale` in the admin settings. +- Extends the flat spec `openspec/specs/projects.md`. +- Depends on: `tasks-create-edit-delete` (lane A) for creating the action task from a log entry. `projects-members-and-roles` for the role lists the new schemas' authorization copies. + +## Risks + +### Risk 1: two new schemas break the exact schema count + +**Severity**: Medium +**Mitigation**: `openspec/specs/project-delivery/spec.md:68-72` and `testRegisterDeclaresExactlySevenSchemas` (`tests/unit/Settings/PlanninqRegisterSchemaTest.php:370`) pin the register at seven schemas. That scenario still names `timeEntry`, which is already `plannedTimeEntry`. Task 1.3 updates the test and the scenario to the new list in the same PR. + +### Risk 2: the project-scoped rule this copies may not scope + +**Severity**: High +**Mitigation**: `projectLogEntry` and `risk` copy the project-scoped authorization of `task`, which matches through `$lookup` (`planninq_register.json:51-143`). `projects-members-and-roles` task 1.1 checks that rule live. This change waits for that answer before it copies the rule. planninq#681 gave the answer: copy the denormalised `members` rule, `{"members": {"$contains": "$userId"}}`, never the `$lookup`. + +### Risk 3: a sixth menu by the back door + +**Severity**: Low +**Mitigation**: The cross-project Risks page is a sub-page of Projecten, as ADR-001 maps it, and the project pages use tabs, not menu entries. diff --git a/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/specs/project-logs/spec.md b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/specs/project-logs/spec.md new file mode 100644 index 00000000..08c8041b --- /dev/null +++ b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/specs/project-logs/spec.md @@ -0,0 +1,33 @@ +# project-logs delta for projects-overview-logs-risks + +## ADDED Requirements + +### Requirement: A project member keeps logs of issues, lessons, meetings and decisions + +Every project MUST have a log where its members record issues, lessons learned, meetings and decisions. Each entry MUST carry its type, a title, a date and a body, and the author and time MUST come from the server. Only people who can read the project MUST see its log. Tier: V1 (docs/FEATURES.md has no row; tender 365739 requirement 4012). + +#### Scenario: Recording a meeting + +- **GIVEN** a project member on the Log tab at /projects/:id/log +- **WHEN** the member presses "Add entry", picks "Meeting", fills in the title "Kick-off", the date and two attendees, and saves +- **THEN** the entry appears at the top of the log with the type "Meeting", the author's name and the time it was saved +- **AND** choosing the filter "Meetings" shows it and hides the other types + +#### Scenario: An outsider cannot read the log + +@e2e exclude API-level refusal with no screen, asserted by a PHPUnit schema test and a live GET in task 2.1 +- **GIVEN** a signed-in user who is not on the project +- **WHEN** the user sends `GET /apps/openregister/api/objects/planninq/projectLogEntry?project={id}` +- **THEN** the answer contains none of that project's entries + +### Requirement: An action from a log entry is a normal task + +A project member MUST be able to create an action from an issue, meeting or decision entry. The action MUST be a task in the same project, linked from the entry, so it can be assigned, dated and moved on the board like any other task. Tier: V1 (docs/FEATURES.md has no row; tender 365739 requirement 4012). + +#### Scenario: Turning a meeting outcome into an action + +- **GIVEN** a meeting entry "Kick-off" in the project log +- **WHEN** a project member presses "Add action" on that entry, types "Send the planning to the steering group", assigns it to "Ada Jansen" and saves +- **THEN** the task appears on the project board at /projects/:id +- **AND** the entry lists the action with its status +- **AND** the Log tab filter "Actions" shows the task diff --git a/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/specs/project-overview/spec.md b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/specs/project-overview/spec.md new file mode 100644 index 00000000..aef5dcfb --- /dev/null +++ b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/specs/project-overview/spec.md @@ -0,0 +1,33 @@ +# project-overview delta for projects-overview-logs-risks + +## ADDED Requirements + +### Requirement: A project member opens one overview of the project + +Every project MUST have an overview page that shows its description, planned dates, the people on it, its progress, its highest open risks and its latest log entries. Progress MUST count done tasks against all tasks that are not cancelled. Tier: MVP (docs/FEATURES.md, "Project progress (tasks done / total)"). + +#### Scenario: The overview shows where the project stands + +- **GIVEN** a project member on a project with 10 tasks, of which 4 are done and 1 is cancelled +- **WHEN** the member opens the Overview tab at /projects/:id/overview +- **THEN** the page shows the project's description and its start and end dates +- **AND** it lists the people on the project by display name +- **AND** it shows progress as "4 of 9 tasks done" + +#### Scenario: An empty project says so + +- **GIVEN** a project member on a project with no tasks, no risks and no log entries +- **WHEN** the member opens /projects/:id/overview +- **THEN** the progress block says "No tasks yet" +- **AND** the risks and log blocks each offer a link to add the first one + +### Requirement: The project pages share one row of tabs + +The board, backlog, timeline, overview, risks and log pages of a project MUST show the same row of tabs, with the current page marked for assistive technology. The tabs MUST be reachable and operable by keyboard. Tier: MVP (docs/FEATURES.md, "Kanban board view per project"). + +#### Scenario: Moving between project pages by keyboard + +- **GIVEN** a project member on the board at /projects/:id +- **WHEN** the member moves focus with Tab to the row of project tabs and activates "Risks" with Enter +- **THEN** the page at /projects/:id/risks opens +- **AND** the "Risks" tab carries `aria-current="page"` diff --git a/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/specs/risk-register/spec.md b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/specs/risk-register/spec.md new file mode 100644 index 00000000..31d4724c --- /dev/null +++ b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/specs/risk-register/spec.md @@ -0,0 +1,48 @@ +# risk-register delta for projects-overview-logs-risks + +## ADDED Requirements + +### Requirement: A project member keeps a scored risk register + +Every project MUST have a risk register. Each risk MUST carry a likelihood and an impact on the admin's risk scale, a score that the server calculates from them, a status, an owner, a response and its countermeasures. The Risks tab MUST show the risks as a list sorted by score and as a heat map of likelihood against impact. Tier: V1 (docs/FEATURES.md has no row; tender 365739 requirements 4003 and 4004). + +#### Scenario: Adding a risk + +- **GIVEN** a project member on the Risks tab at /projects/:id/risks +- **WHEN** the member presses "Add risk", enters the title "Supplier delivers late", sets likelihood 4 and impact 3, picks the response "Reduce", writes a countermeasure and saves +- **THEN** the risk appears in the list with the score 12 +- **AND** the heat map cell for likelihood 4 and impact 3 shows the count 1 and the band name as text + +#### Scenario: A client cannot write its own score + +@e2e exclude Server-side calculation with no screen, asserted by a PHPUnit schema test and a live POST in task 3.1 +- **GIVEN** a project member +- **WHEN** the member sends `POST /apps/openregister/api/objects/planninq/risk` with likelihood 2, impact 2 and score 25 +- **THEN** the stored risk has the score 4 + +### Requirement: Projecten lists the risks of every project you can see + +The Projecten menu MUST have a Risks sub-page that lists the risks of every project the user can read, highest score first, with the project, owner, status and review date. A user MUST NOT see risks of projects they cannot read. Tier: V1 (docs/FEATURES.md has no row; ADR-001 maps `risk-register-issue-tracking` to Projecten). + +#### Scenario: A project leader scans risks across projects + +- **GIVEN** a user on two projects with three open risks between them, and a third project the user is not on +- **WHEN** the user opens Risks under Projecten at /projects/risks +- **THEN** the page lists the three risks, highest score first, each with its project +- **AND** no risk of the third project is listed + +### Requirement: An admin sets the risk scale + +An admin MUST be able to set the number of likelihood and impact levels (3 to 5), a label per level, and the two score thresholds between low, medium and high. The heat map MUST colour its cells by band with NL Design tokens and MUST also show each band as text. Tier: V1 (docs/FEATURES.md has no row; tender 365739 requirement 64441). + +#### Scenario: Switching to a three-level scale + +- **GIVEN** an admin on the planninq admin settings page, and no risk uses a level above 3 +- **WHEN** the admin sets the risk scale to 3 levels with the labels "Low", "Medium" and "High" and saves +- **THEN** the Risks tab of every project shows a three by three heat map with those labels + +#### Scenario: A smaller scale is refused while risks use a higher level + +- **GIVEN** an admin, and two risks with likelihood 5 +- **WHEN** the admin tries to save a scale of 4 levels +- **THEN** the save is refused with "2 risks use level 5. Change them first." diff --git a/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/tasks.md b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/tasks.md new file mode 100644 index 00000000..d3f0c416 --- /dev/null +++ b/openspec/changes/archive/2026-09-28-projects-overview-logs-risks/tasks.md @@ -0,0 +1,25 @@ +# Tasks: projects-overview-logs-risks + +## 1. Overview and tabs (MVP) + +- [x] 1.1 Add `src/components/ProjectTabs.vue` and use it in `ProjectBoard.vue`, `ProjectBacklog.vue` and `ProjectTimeline.vue` in place of the Backlog and Timeline buttons. Verify: `tests/e2e/project-overview.spec.ts` "moving between project pages by keyboard". +- [x] 1.2 Add the `ProjectOverview` page (`/projects/:id/overview`) to `src/manifest.json` and `src/registry.js`, with progress computed from `fetchTasks`. Verify: `tests/vitest/projectProgress.spec.js` for the done over not-cancelled rule; e2e "the overview shows where the project stands" and "an empty project says so". +- [x] 1.3 Update the exact-schema-count test in `tests/unit/Settings/PlanninqRegisterSchemaTest.php` (was `testRegisterDeclaresExactlyEightSchemas`, now `testRegisterDeclaresExactlyTenSchemas`) and the scenario in `openspec/specs/project-delivery/spec.md` to the new schema list. Verify: the PHPUnit suite passes with ten schemas named. + +## 2. Project log (V1) + +- [x] 2.1 Add the `projectLogEntry` schema with the project-scoped authorization settled by `projects-members-and-roles` task 1.1. Verify: `PlanninqRegisterSchemaTest.php` asserts the properties and the read rule; a live GET as an outsider returns none of the entries. +- [x] 2.2 Add the `ProjectLog` page (`/projects/:id/log`) with type filters and `src/dialogs/LogEntryEditDialog.vue`. Verify: `tests/e2e/project-log.spec.ts` "recording a meeting". +- [x] 2.3 Add "Add action", which creates a task with `issueType: 'action'` through the task create path of `tasks-create-edit-delete` and links it in `actions`. Verify: e2e "turning a meeting outcome into an action". + +## 3. Risk register (V1) + +- [x] 3.1 Add the `risk` schema with `score` as a materialised calculation and the project-scoped authorization. Verify: `PlanninqRegisterSchemaTest.php` asserts the calculation; a live POST with a wrong score stores the calculated one. +- [x] 3.2 Add the `ProjectRisks` page (`/projects/:id/risks`), `src/components/RiskHeatMap.vue` and `src/dialogs/RiskEditDialog.vue`. Verify: `tests/vitest/riskHeatMap.spec.js` for cell counts and band text; e2e `tests/e2e/risk-register.spec.ts` "adding a risk". +- [x] 3.3 Add the declarative `RiskIndex` page (`/projects/risks`, `type: "index"`) under Projecten. Verify: e2e "a project leader scans risks across projects", run as a user on two of three seeded projects. +- [x] 3.4 Add `risk_scale` to the admin settings (`RiskScaleService`, `SettingsController`, `SettingsService`) with validation against the levels in use, and its form on the admin page. Verify: `tests/unit/Service/RiskScaleServiceTest.php` and `tests/unit/Controller/SettingsControllerTest.php` for a valid scale and a refused one; e2e "switching to a three-level scale" and "a smaller scale is refused while risks use a higher level". + +## 4. Verification + +- [x] 4.1 `openspec validate projects-overview-logs-risks --type change --strict` passes. +- [x] 4.2 Every scenario in specs/ is covered by a test named in the task above it, or carries an `@e2e exclude ` note. diff --git a/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/design.md b/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/design.md new file mode 100644 index 00000000..dd85a88f --- /dev/null +++ b/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/design.md @@ -0,0 +1,56 @@ +# Design: plan tasks against a release and see a roadmap of releases and epics + +## Context + +What exists at de35541: + +- No release or version concept. The seven schemas (`lib/Settings/planninq_register.json:22-30`) have no such property, and `grep -rni "release\|fixVersion\|milestone" src lib` finds only comments about app releases. +- `task.issueType` (`lib/Settings/planninq_register.json:324-329`) is a free string defaulting to `task`, meant to carry imported vocabularies such as `epic` or `story`. `task.epic` (`:376-383`) is a nullable `$ref: task` pointing at the epic-level task, "distinct from parent, which models sub-tasks". No code in `src/` or `lib/` reads or writes either field. +- `task.startDate` and `task.dueDate` (`:268-279`) are the only dates a task carries. +- `projectPhase` (`:584-752`) is the precedent for a project-scoped object: `project` is a `$ref`, and its authorization block (`:596-690`) grants every operation to members of that project. +- The `FeaturesRoadmap` page (`src/manifest.json:214-221`) is `type: "roadmap"`, rendered by `CnFeaturesAndRoadmapView` from `docs/features.json` and the GitHub proxy. It is the product roadmap. The `ProjectTimeline` note (`src/manifest.json:147`) records that the library's roadmap type "renders milestones on a track and has no vocabulary for task bars". +- The timeline already has pure layout helpers for bars on a day axis: `toScheduled` and `buildLayout` in `src/utils/timelineHelpers.js:75-103`, used by `src/views/ProjectTimeline.vue:219-233`. Its day, week and month zoom lives in `PX_PER_DAY` (`src/utils/timelineHelpers.js:24`). +- The project board header carries the Backlog and Timeline buttons (`src/views/ProjectBoard.vue:41-55`). + +What is missing: a release object, a task-to-release link, a way to make and link epics in the UI, and a roadmap of the user's own work. + +## Goals / non-goals + +Goals: +- Plan tasks against a named, dated release and see how far each release is. +- One roadmap per project showing releases and epics on a time axis, with a list that works without the chart. + +Non-goals: +- Cross-project roadmaps, release burndowns, several releases per task. +- Touching the product roadmap page. + +## Decisions + +### Decision 1: a `release` schema scoped to a project +Amended at build (29 Sep): the schema slug is `projectRelease`, next to `projectPhase` and `projectPortfolio`. `release` was free in the fleet slug contract (gate-106), but it is a word an app like versioniq can claim next, and learniq's claim on `portfolio` already cost this repo a rename. The task property stays `task.release`. The schema is added to the project-scoped lists (ProjectMembershipService::SCOPED_SCHEMAS, the membership subscription, ProjectMemberAccessListener's gated set), so the members list is stamped on every write and an outsider's create is refused, exactly as for `risk`. + +Properties: `title` (required), `project` (required, `$ref: project`), `description`, `startDate` (nullable date), `releaseDate` (the target date, nullable date), `status` (`planned`, `released`, `archived`; default `planned`), `releasedAt` (nullable date-time). Schema.org `schema:CreativeWork`. Authorization copies `projectPhase`'s block. A release belongs to one project, like Jira's project fix versions and OpenProject's project versions. Sharing a release across projects (OpenProject's version sharing) is left out: it needs a cross-project authorization rule the register does not have today. + +### Decision 2: one `task.release`, nullable +A task targets at most one release. The backlog filter "release = X" and the progress count stay scalar-equality reads, which is what `fetchEvery` (`src/store/projects.js:61-94`) and OpenRegister's aggregation support. The alternative, an array like OpenProject 17.8, needs a contains-filter that the store avoids on purpose (`src/store/projects.js:178-179` explains why the array filter is not sent to the server). + +### Decision 3: epics reuse `issueType` and `epic`, no new schema +A task becomes an epic by setting `issueType: epic`. Any other task in the same project links to it through `task.epic`. The task detail offers a "This task is an epic" switch and an "Epic" picker listing the project's epics. This matches the fields the register already declares for imported Jira data, so imported and native epics look the same. An epic cannot point at another epic, and the picker offers only tasks of the same project. + +### Decision 4: the user roadmap is a view of the Timeline tab, reusing the timeline helpers +Amended at build (29 Sep): no new manifest page. Every new `type: "custom"` page adds a finding to the gate-69 custom-page ratchet (17 custom pages at this point), and no typed page (index, detail, dashboard) or widget draws bars on a time axis. The Timeline tab already is the project's time-axis page, so the roadmap is its second view: a "Tasks / Roadmap" switch in the Timeline header, the same pattern as the board's "Board / List" switch, kept in the route as `/projects/:id/timeline?view=roadmap` so a link or a reload keeps it. The view is the component `src/components/ProjectRoadmap.vue`, not a page. The Timeline's zoom applies to both views. It is reached from the project tabs, which replaced the board header's Backlog and Timeline buttons, so no button is added to the board header (that would also grow the gate-114 header-action budget). + +Original text: It reads the project's releases and epic tasks through the object store and lays them out with `buildLayout` from `src/utils/timelineHelpers.js`: epics as bars, releases as a marker on their `releaseDate`. An epic without its own dates spans from the earliest `startDate` to the latest `dueDate` of the tasks linked to it (a new pure helper `epicSpan`). The library's `type: "roadmap"` is not used: it is the product roadmap renderer, and the manifest already notes it has no vocabulary for bars. No controller is added: every read is an object-store read (ADR-022). + +### Decision 5: releases are managed on the roadmap +The roadmap lists releases under the chart, in target-date order, each with its progress (done tasks out of all tasks with that `release`), and offers "New release", "Edit" and "Mark as released". The list is also the keyboard and screen-reader equivalent of the chart (ADR-059). Placement is Projecten > project > Roadmap (ADR-001): a project view, not a menu. ADR-001 lists "roadmap" under Portfolio; that is the cross-project roll-up, which this change leaves to lane C. + +### Decision 6: shipping a release asks about unfinished work +"Mark as released" opens `ReleaseShipDialog`. When every task of the release is `done` or `cancelled`, it just sets `status: released` and `releasedAt`. When some are not, it lists them and offers: move them to another planned release, clear their release, or keep them on this release. The member decides; the dialog never moves work silently. + +## Risks / trade-offs + +- [Two pages called roadmap] -> Different labels and places: "Features & roadmap" in the footer for the product, "Roadmap" inside a project for the user's work. +- [Epics with no dated tasks] -> Listed under "Not scheduled yet", never dropped. +- [Epic links across projects] -> The picker offers only the same project's epics; a cross-project `epic` value from an import is shown as a plain link on the task and left off the roadmap. +- [Schema count assertions] -> Updated in the same PR. diff --git a/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/proposal.md b/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/proposal.md new file mode 100644 index 00000000..4e4d5eae --- /dev/null +++ b/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/proposal.md @@ -0,0 +1,89 @@ +--- +kind: code +--- + +# Plan tasks against a release and see a roadmap of releases and epics + +## Why + +A project member cannot say which release a task is meant for, and cannot see the project's releases and epics laid out over time. No schema in `lib/Settings/planninq_register.json` has a release or version property, and no view names one. The task schema does carry `issueType` (`lib/Settings/planninq_register.json:324-329`, free string, default `task`) and `epic` (`:376-383`, a `$ref` to the epic-level task), but nothing in `src/` or `lib/` reads or writes either, so epics exist only on imported data. + +The matrix rates `bkl-roadmap` as built, and its own evidence says why that is wrong for this row: the only roadmap page, `FeaturesRoadmap` at `/features-roadmap` (`src/manifest.json:214-221`), is planninq's own product roadmap. It is rendered by the shared `CnFeaturesAndRoadmapView` from the committed `docs/features.json` and the GitHub proxy. It shows what Conduction plans to build into planninq, not the user's releases or epics. This change specs the user's roadmap and leaves the product roadmap alone. + +OpenProject (versions with a project roadmap page), Plane (modules with a target date) and Jira (fix versions, version report, Advanced Roadmaps) all let a team plan work against a release; OpenProject and Jira show those releases and epics on a roadmap. + +Parity rows: `bkl-releases`, `bkl-roadmap` in planninq's `openspec/parity/capabilities.json`. +Decision: build, because three competitors plan against releases and two show a roadmap of them, while planninq's only roadmap page describes the product itself. + +This change extends the flat spec `openspec/specs/projects.md` through two new capabilities, `releases` and `project-roadmap`. + +## What changes + +- A project member can create a release with a name, a target date and a description, and plan tasks against it. +- A project member can mark a release as released, and decides what happens to the tasks that are not done. +- Every release shows its progress: done tasks out of all its tasks. +- A project member can mark a task as an epic and link other tasks to it. +- Each project gets a roadmap page that shows its releases as dated markers and its epics as bars over time, with a list equivalent. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `bkl-releases`, `bkl-roadmap`. + +### `bkl-releases`: Plan tasks against a version or release. + +- Area `backlog`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "No release/version field or planning concept exists in the task, project or any other schema (lib/Settings/planninq_register.json has no release/version property), and no UI references one." +- Demand: none recorded on the row. +- Competitors rated yes (3): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/menu-tree.md 'Project settings ... Versions'; corpus: openproject/round4/M1-column.md 9.1 and 11.10 version custom field; docs: opf/openproject HEAD 27a58131 docs/user-guide/roadmap/README.md 'Product roadmap release planning' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/routes.rb:478 project versions new, create; app/models/work_package_version.rb:31-35 a work package links to versions with kind target, several target versions allowed since 17.8; config/initializers/menus.rb:793 project settings 'Versions'" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §3 'Module is a scope grouping: start_date / target_date, status from ModuleStatus ... Membership is ModuleIssue'; no version object as such, a module with a target date stands in for a release ; source read at v1.4.2: apps/web/core/components/modules/modal.tsx:44 createModule; apps/api/plane/app/urls/module.py:20 modules route, apps/api/plane/app/views/module/base.py:295 create; apps/api/plane/db/models/module.py:67-74 Module with target_date and status. A module with a target date stands in for a release" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html, https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Report', 'Release Burndown'; docs: https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html 'a release can start Relative to previous release date' (corpus 8.8) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html 'Releases in Advanced Roadmaps are referred to as Fix versions in Jira Software'; https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'Version Report' (read 2026-09-26)" + +### `bkl-roadmap`: Show a roadmap of epics or versions over time. + +- Area `backlog`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "The only 'roadmap' page in the app, FeaturesRoadmap (src/manifest.json, route /features-roadmap, type 'roadmap'), is the app's OWN development roadmap: its _note says it is 'Rendered by the shared CnFeaturesAndRoadmapView, which reads the committed docs/features.json and OpenRegister's GitHub proxy', it shows Planninq's own GitHub feature/issue roadmap, not a roadmap of the user's epics, projects or releases." +- Demand: none recorded on the row. +- Competitors rated yes (2): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/roadmap/README.md 'Find out about the Product Roadmap and Release planning in OpenProject'; corpus: openproject/round4/menu-tree.md global 'Gantt charts' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: config/initializers/menus.rb:713-716 project 'Roadmap' menu when versions exist; config/routes.rb:484-487 /roadmap is versions#index; app/controllers/versions_controller.rb:39 index lists versions with their work packages and progress" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html, https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html, https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html): "corpus: jira-data-center/round4/M1-column.md 8.8 Releases in Advanced Roadmaps and 3.14 'Modify a view in Advanced Roadmaps'; https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar' (timeline of epics and releases, Advanced Roadmaps bundled in the Jira Software DC documentation set) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html 'a plan contains all of the work that needs to be done on your project in a timeline format'; https://confluence.atlassian.com/jirasoftwareserver/releases-in-advanced-roadmaps-1044784195.html ... (shortened; full text in the matrix row)" + + +## Scope + +### In scope + +- A `release` schema scoped to one project, with the project-membership authorization of `projectPhase`. +- A nullable `task.release` reference, and task detail fields for release, type (epic or not) and epic. +- A roadmap page per project at `/projects/:id/roadmap`, reached from the project board header. +- Release progress and the "mark as released" step. + +### Out of scope + +- A roadmap across projects. Portfolio views belong to `portfolio-status-overview` (lane C), which can reuse this change's helper. +- A release burndown and a version report. +- Several target releases per task (OpenProject allows several since 17.8). One release per task keeps the backlog filter a scalar equality. +- Any change to the product roadmap page `FeaturesRoadmap`. + +## Impact + +- Schema: new `release`; new `task.release`. `issueType` and `epic` are used as they are. +- Store: `src/store/projects.js` gains release reads and writes and epic linking. +- Views: a new `ProjectRoadmap` page (manifest page plus `src/registry.js` entry), a Roadmap button in the `ProjectBoard` header, release, type and epic fields on `TaskDetail`. +- Dialogs: `src/dialogs/ReleaseEditDialog.vue`, `src/dialogs/ReleaseShipDialog.vue`. +- Specs and tests: the schema count in `openspec/specs/project-delivery/spec.md:68-72` and `tests/unit/Settings/PlanninqRegisterSchemaTest.php:370` moves up by one. +- Depends on: `tasks-create-edit-delete` (the editable task detail the release and epic fields sit in). Coordinates with the other changes of this pass that add a schema (for example `boards-cross-project-board`), because each one moves the exact schema count. + +## Risks + +### Risk 1: two pages called roadmap +**Severity**: Medium +**Mitigation**: the footer page keeps its label "Features & roadmap" and describes the product. The new page is titled "Roadmap" inside a project, with the project name in its breadcrumb, and is only reached from that project. The design names this split so nobody "fixes" one into the other. + +### Risk 2: epics without dates vanish from the roadmap +**Severity**: Medium +**Mitigation**: an epic with no dates of its own takes its span from the earliest start and latest due date of its tasks. An epic with no dated task at all is listed under "Not scheduled yet" instead of being dropped, the same rule the timeline applies (`openspec/specs/gantt-timeline-view/spec.md`). + +### Risk 3: schema count assertions break +**Severity**: Low +**Mitigation**: updated in the same PR as the schema (task 1.3), and in whichever order this change and the other schema-adding changes land. diff --git a/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/specs/project-roadmap/spec.md b/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/specs/project-roadmap/spec.md new file mode 100644 index 00000000..98b202da --- /dev/null +++ b/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/specs/project-roadmap/spec.md @@ -0,0 +1,66 @@ +# project-roadmap delta for backlog-releases-roadmap + +## ADDED Requirements + +### Requirement: A project member can mark a task as an epic and link tasks to it + +A project member MUST be able to mark a task as an epic, which SHALL store `issueType: epic`, and MUST be able to link any other task of the same project to an epic through the task's `epic` field. The epic picker SHALL offer only epics of the task's own project and SHALL NOT offer the task itself. Tier: V1. + +#### Scenario: A member makes an epic and links a task to it + +- **GIVEN** a project member on the task detail page of "Self-service export" +- **WHEN** they switch on "This task is an epic", then open the task "Export to CSV" and pick "Self-service export" in the Epic field +- **THEN** "Self-service export" has `issueType` `epic` +- **AND** "Export to CSV" has `epic` referencing "Self-service export" + +#### Scenario: Another project's epic is not offered + +- **GIVEN** a project member on a task of project A, and an epic in project B +- **WHEN** they open the Epic field +- **THEN** the epic of project B is not offered + +### Requirement: A project member can see the project's releases and epics on a roadmap + +Each project MUST have a roadmap, the Roadmap view of the project's Timeline tab at /projects/:id/timeline?view=roadmap, that shows the project's releases as markers on their target date and its epics as bars on a time axis. An epic without its own start and due date SHALL span from the earliest start date to the latest due date of the tasks linked to it, and an epic with no dated task at all MUST be listed under "Not scheduled yet" rather than dropped. The page SHALL read only objects of that project, through the OpenRegister object API. Tier: V1. + +#### Scenario: The member opens the roadmap from the project tabs + +- **GIVEN** a project member on the project board at /projects/:id +- **WHEN** they open the Timeline tab and press "Roadmap" +- **THEN** the roadmap opens at /projects/:id/timeline?view=roadmap with the project's name in its breadcrumb +- **AND** a reload keeps the roadmap open + +#### Scenario: The roadmap shows releases and epics over time + +- **GIVEN** a project with the release "Version 2.0" due 2026-12-01 and the epic "Self-service export" without dates, whose linked tasks start on 2026-10-05 and are due by 2026-11-20 +- **WHEN** a project member opens the roadmap +- **THEN** a marker labelled "Version 2.0" sits on 2026-12-01 +- **AND** a bar labelled "Self-service export" runs from 2026-10-05 to 2026-11-20 + +#### Scenario: An epic with no dates is not dropped + +- **GIVEN** an epic none of whose linked tasks has a date +- **WHEN** a project member opens the roadmap +- **THEN** the epic is listed under "Not scheduled yet" + +### Requirement: The roadmap has a list equivalent + +The roadmap MUST list the same releases and epics as the chart in a list ordered by date, with each release's progress and each epic's date span in text, so a keyboard or screen-reader user gets every fact the chart shows. Tier: V1. + +#### Scenario: The release list works without the chart + +- **GIVEN** a project member using only the keyboard on the roadmap +- **WHEN** they tab past the chart into the list +- **THEN** each release is a row with its name, target date and progress, reachable with Tab +- **AND** each epic is a row with its name and its span as text + +### Requirement: The product roadmap stays separate from the user roadmap + +The footer page "Features & roadmap" at /features-roadmap MUST keep describing planninq itself, and the project roadmap SHALL NOT be reachable from it or replace it. Tier: V1. + +#### Scenario: The features and roadmap page is unchanged + +- **GIVEN** a user in planninq +- **WHEN** they open "Features & roadmap" in the footer +- **THEN** it shows planninq's own feature roadmap as before +- **AND** it shows no project release or epic diff --git a/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/specs/releases/spec.md b/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/specs/releases/spec.md new file mode 100644 index 00000000..9d089e2f --- /dev/null +++ b/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/specs/releases/spec.md @@ -0,0 +1,65 @@ +# releases delta for backlog-releases-roadmap + +## ADDED Requirements + +### Requirement: A project member can create a release for a project + +A project member MUST be able to create a release in their project with a name, an optional start date, a target date and an optional description, and the release SHALL be readable and writable only by members of that project and by admins. Tier: V1 (docs/FEATURES.md, backlog management; this change adds the row). + +#### Scenario: A member creates a release + +- **GIVEN** a project member on the roadmap at /projects/:id/timeline?view=roadmap +- **WHEN** they choose "New release", enter "Version 2.0" with a target date of 2026-12-01 and save +- **THEN** a `release` object with that title, `releaseDate` 2026-12-01, status `planned` and this project exists +- **AND** the release list on the roadmap shows "Version 2.0" with "0 of 0 tasks done" + +#### Scenario: A non-member cannot see the project's releases +@e2e exclude The e2e suite signs in as the admin only; the read rule is the projectPhase members rule, asserted by PHPUnit PlanninqRegisterSchemaTest::testProjectScopedSchemasMatchTheMembersList and ProjectMemberAccessListenerTest::testReleaseIsStampedAndGated. + +- **GIVEN** a user who is not a member of the project that owns "Version 2.0" +- **WHEN** they request the release through GET /apps/openregister/api/objects/planninq/release/{id} +- **THEN** OpenRegister refuses the read + +### Requirement: A project member can plan a task against a release + +A task MUST be able to reference at most one release of its own project, and a project member SHALL be able to set or clear it from the task detail page. Tier: V1. + +#### Scenario: A member plans a task against a release + +- **GIVEN** a project member on the task detail page of "Export to CSV" +- **WHEN** they pick "Version 2.0" in the Release field +- **THEN** the task's `release` references "Version 2.0" +- **AND** the release list on the roadmap shows "0 of 1 tasks done" for "Version 2.0" + +#### Scenario: Only the project's own releases are offered + +- **GIVEN** a project member on a task of project A, and a release "Version 9" in project B +- **WHEN** they open the Release field +- **THEN** "Version 9" is not offered + +### Requirement: A project member can mark a release as released + +A project member MUST be able to mark a planned release as released, which SHALL set its status to `released` and record `releasedAt`. When tasks of the release are neither `done` nor `cancelled`, the system MUST list them and let the member move them to another planned release, clear their release, or keep them, before the release is marked. Tier: V1. + +#### Scenario: Shipping with everything done + +- **GIVEN** the release "Version 2.0" whose three tasks are all done +- **WHEN** a project member chooses "Mark as released" and confirms +- **THEN** "Version 2.0" has status `released` and a `releasedAt` + +#### Scenario: Shipping asks about unfinished tasks + +- **GIVEN** the release "Version 2.0" with two done tasks and one open task, and the planned release "Version 2.1" +- **WHEN** a project member chooses "Mark as released" +- **THEN** the dialog lists the open task and offers "Move to Version 2.1", "Remove the release" and "Keep it on Version 2.0" +- **AND** after they choose "Move to Version 2.1" and confirm, the open task references "Version 2.1" and "Version 2.0" is released + +### Requirement: Every release shows its progress + +The release list MUST show, for every release, how many of its tasks are done or cancelled out of all tasks that reference it. Tier: V1. + +#### Scenario: Progress counts done and cancelled tasks + +- **GIVEN** the release "Version 2.0" with five tasks: two done, one cancelled, two open +- **WHEN** a project member opens the roadmap +- **THEN** "Version 2.0" shows "3 of 5 tasks done" diff --git a/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/tasks.md b/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/tasks.md new file mode 100644 index 00000000..6469a549 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-backlog-releases-roadmap/tasks.md @@ -0,0 +1,26 @@ +# Tasks: backlog-releases-roadmap + +## 1. Schema + +- [x] 1.1 Add the `projectRelease` schema (title, project, description, startDate, releaseDate, status, releasedAt; `projectPhase` authorization block) and list it in the register; stamp and gate it like the other project-scoped schemas. Verify: PHPUnit `PlanninqRegisterSchemaTest::testReleaseSchemaIsProjectScoped`, `ProjectMemberAccessListenerTest::testReleaseIsStampedAndGated`; Newman folder "Releases" in `tests/integration/planninq.postman_collection.json` (create, plan a task, list, mark released, remove). The non-member read runs on the members rule asserted by `testProjectScopedSchemasMatchTheMembersList`; the Newman suite signs in as the admin only. +- [x] 1.2 Add nullable `task.release` (`$ref: projectRelease`) and bump the register and schema versions. Verify: PHPUnit `PlanninqRegisterSchemaTest::testTaskReleaseReferenceIsNullable`. +- [x] 1.3 Raise the exact schema count in `testRegisterDeclaresExactlyFifteenSchemas` and `openspec/specs/project-delivery/spec.md` by one; three demo releases in `lib/Settings/planninq_mock_register.json`. Verify: `composer test:unit` green, `DemoDatasetTest`. + +## 2. Store and helpers + +- [x] 2.1 `fetchReleases(projectId)`, `saveRelease`, `shipRelease(release, tasks, choice, targetId)` and `setTaskRelease(taskId, releaseId)` in `src/store/projects.js`. Verify: vitest `tests/vitest/releases.spec.js` "ship with unfinished tasks moves them to the chosen release" and "ship with everything done only sets status". +- [x] 2.2 `releaseProgress(release, tasks)`, `epicSpan(epic, tasks)` and `roadmapLayout` pure helpers in `src/utils/roadmapHelpers.js`. Verify: vitest `tests/vitest/roadmapHelpers.spec.js` "progress counts done and cancelled", "epic without dates spans its tasks" and "epic without dated tasks is unscheduled". +- [x] 2.3 `setTaskEpic(task, epic)` refuses an epic of another project and an epic pointing at an epic. Verify: vitest `tests/vitest/releases.spec.js` "epic picker refuses another project's epic" and `roadmapHelpers.spec.js` "refuses an epic of another project". + +## 3. Screens + +- [x] 3.1 A "Tasks / Roadmap" switch on the Timeline tab (`?view=roadmap`), rendering `src/components/ProjectRoadmap.vue` (design decision 4, amended: no new custom page). Verify: Playwright `tests/e2e/roadmap.spec.ts` "member opens the roadmap from the project tabs". +- [x] 3.2 Chart (epic bars, release markers, zoom) and the release and epic lists with progress. Verify: Playwright `tests/e2e/roadmap.spec.ts` "roadmap shows releases and epics over time", "epic with no dates is listed as not scheduled", "progress counts done and cancelled tasks" and "release list works without the chart". +- [x] 3.3 `src/dialogs/ReleaseEditDialog.vue` and `src/dialogs/ReleaseShipDialog.vue`. Verify: Playwright `tests/e2e/roadmap.spec.ts` "member creates a release", "shipping with everything done" and "shipping asks about unfinished tasks". +- [x] 3.4 Release, "This task is an epic" and Epic fields on `TaskDetail`. Verify: Playwright `tests/e2e/roadmap.spec.ts` "member plans a task against a release and links it to an epic", "pickers offer only this project's releases and epics". +- [x] 3.5 The product roadmap page keeps its label and route. Verify: Playwright `tests/e2e/roadmap.spec.ts` "features and roadmap page is unchanged". + +## 4. Verification + +- [x] 4.1 `openspec validate backlog-releases-roadmap --type change --strict` passes. +- [x] 4.2 Every scenario in specs/ is covered by a test named in the task above it, or carries an `@e2e exclude ` note. diff --git a/openspec/changes/archive/2026-09-29-boards-card-display/design.md b/openspec/changes/archive/2026-09-29-boards-card-display/design.md new file mode 100644 index 00000000..436e07e9 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-boards-card-display/design.md @@ -0,0 +1,55 @@ +# Design: colour cards and split the board into swimlanes + +## Context + +Read at development `de35541`: + +- `src/components/TaskCard.vue:229-237` `.task-card` uses `var(--color-surface)` and + `var(--color-border)`; label chips carry a swatch (`:44-58`); priority is a chip (`:32-36`). +- `src/views/ProjectBoard.vue:103-175` renders one horizontal row of `
` lanes; drag and + drop and the keyboard move menu work per lane. +- Schema `task`: `epic` (uuid of an epic-level task, unused in `src/`), `priority`, `labels`, + `assignedTo`. +- Per-user preferences are stored through `SettingsController::updateUser` + (`lib/Controller/SettingsController.php:147`) and `SettingsService::updateUserSettings`. + +## Goals / non-goals + +Goals: colour by label or priority, swimlanes by assignee, priority or epic, remembered per user. +Non-goals: custom colour rules, editing epics by drag. + +## Decisions + +### Decision 1: a coloured edge, not a coloured card + +The card gets a 4 pixel inline-start border in the first label's colour, or in a priority token +(urgent `--color-error`, high `--color-warning`, normal and low none). Alternative: tint the card +background. Rejected: label colours are admin-chosen hex values and a tinted background breaks text +contrast in one of the two themes. + +### Decision 2: swimlanes are rows over the same lanes + +With grouping on, the board renders one row per group value (plus "No assignee", "No priority" or +"No epic"), each row holding the full set of lanes, with a collapsible header "{value} ({count})". +Grouping is a pure helper `groupTasksBySwimlane(tasks, field)` that returns ordered groups. +Epic names are read from the epic tasks' titles. + +### Decision 3: dragging across swimlanes changes the field + +A drop in another row PATCHes the grouped field together with the column move: `assignedTo` for +assignee rows, `priority` for priority rows. The assignee change goes through the existing `responsiblePatch`, so +the new responsible person also leaves `sharedWith`. A card added with a row's quick add gets that +row's value. Epic rows refuse a cross-row drop with a short +message. The keyboard move menu offers the same targets. + +### Decision 4: remember the view per user and project + +The choice is stored through the existing user settings endpoint and applied on mount. Amended +while building (29 Sep): one user value `board_views` holds a map of project id to view, kept by +`BoardViewPreferenceService` (at most 100 boards per person, the least recently saved dropped +first), because a key per project cannot be listed back by `getSettings()`. + +## Risks / trade-offs + +- [Many swimlanes times many lanes is a large DOM] -> collapsed rows render only their header; + the default is no grouping. diff --git a/openspec/changes/archive/2026-09-29-boards-card-display/proposal.md b/openspec/changes/archive/2026-09-29-boards-card-display/proposal.md new file mode 100644 index 00000000..9a179818 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-boards-card-display/proposal.md @@ -0,0 +1,86 @@ +--- +kind: code +--- + +# Colour cards and split the board into swimlanes + +## Why + +Every card on a planninq board looks the same. The card background is a fixed surface token +(`src/components/TaskCard.vue:229-237`), and a label only shows as a 12 pixel swatch inside a chip, +so a team cannot see its legal work or its urgent work at a glance. Kanboard and Jira colour cards +by category or label. + +The board is also a single row of lanes (`src/views/ProjectBoard.vue:103-175`). With twenty cards +per lane, nobody can see who is carrying what. Plane and Jira split the board into horizontal +swimlanes by assignee, priority or epic. `docs/FEATURES.md` lists "Column color coding" as MVP +and "Swimlanes (group cards by assignee or priority)" as V1. + +Parity rows: `brd-card-colours`, `brd-swimlanes` in planninq's +`openspec/parity/capabilities.json`. +Decision: build. `brd-card-colours` has three competitors yes and `brd-swimlanes` two; both are +in the boards core area. + +## What changes + +- A board "View" menu: colour cards by first label or by priority, shown as a coloured edge on the + card with the value also in text. +- The same menu: group the board into swimlanes by assignee, priority or epic. Each swimlane can + be collapsed and shows its card count. +- Dragging a card into another swimlane changes the grouped field (assignee or priority). +- The choice is remembered per person and per project. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `brd-card-colours`, `brd-swimlanes`. + +### `brd-card-colours`: Colour cards by label, type or category. + +- Area `boards`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "src/components/TaskCard.vue:229-237 the card background is a fixed `var(--color-surface)`; labels only render as a small circular swatch inside a chip (:56-59, 12px), not as the card's own colour, and there is no colour-by-type or colour-by-category option anywhere." +- Demand: none recorded on the row. +- Competitors rated yes (3): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "source: opf/openproject HEAD 27a58131 (18.0.0-dev): highlighting-mode.const.ts:31 CardHighlightingMode 'priority'|'type'; board configuration modal highlighting-tab.component (openproject-boards.module.ts:38); attribute highlighting is not among the 32 Enterprise symbols (corpus: openproject/round4/open-core.md) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/configuration-modal/tabs/highlighting-tab.component.html:13 'entire card by' with :26 type and :29 priority options; app/contracts/queries/base_contract.rb:42 highlighting_mode saved; searched app and lib for an Enterprise gate on highlighting: none, ... (shortened; full text in the matrix row)" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/menu-tree.md 'Categories · Tags' ; source: app/Action/TaskAssignColorCategory.php and task color_id; tags coloured in app/Template/board/task_footer.php:28 ; source read at v1.2.54: app/Template/task_creation/show.php:18 colour field; app/Template/board/task_private.php:5 card class color-id; app/Action/TaskAssignColorCategory.php:23 'Assign automatically a color based on a category'; app/Action/TaskAssignColorPriority.php:23; app/Template/board/task_footer.php:28 coloured tags" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'One color per issue type', 'One color per priority', 'One color per assignee', 'One color per JQL query' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/customizing-cards-938845307.html 'Base your card colors on ... Issue types One color per issue type', also per priority, assignee or JQL query (read 2026-09-26)" + +### `brd-swimlanes`: Split the board into swimlanes by assignee, priority or epic. + +- Area `boards`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "src/views/ProjectBoard.vue has a single grid of column sections (:102-175), no swimlane grouping dimension; task.epic exists as a schema property but is never read in src/ (grep confirmed)." +- Demand: none recorded on the row. +- Competitors rated yes (2): + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "source: apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx ; packages/constants/src/issue/filter.ts:237 sub_group_by options state, priority, cycle, module, labels, assignees, created_by. No epic swimlane because epics are unreachable (corpus: plane/round4/journeys.md epics 404) ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/swimlanes.tsx:62 SubGroupSwimlaneHeader; packages/constants/src/issue/filter.ts:237 sub_group_by state, priority, cycle, module, labels, assignees, created_by; apps/api/plane/app/views/issue/base.py:159-162 server groups by sub_group_by. No epic option" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845294.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845294.html (redirects to Configuring swimlanes) 'In the Base Swimlanes on drop-down, select either Queries, Stories, Assignees, or No Swimlanes'; epics via a query swimlane ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-quick-filters-938845294.html 'In the Base Swimlanes on drop-down, select either Queries, Stories, Assignees, or No Swimlanes'; a JQL query swimlane covers priority or epic (read 2026-09-26)" + +## Scope + +### In scope + +- View menu, card colour edge, swimlane rendering with collapse, cross-swimlane drag for + assignee and priority, per-user per-project memory of the choice. + +### Out of scope + +- Custom colour rules. Colours come from labels (admin-managed) and fixed priority tokens. +- Moving a card between epics by drag: epic swimlanes are read-only groupings. + +## Impact + +- `src/views/ProjectBoard.vue`, `src/components/TaskCard.vue`, a new + `src/components/BoardViewMenu.vue`, `src/utils/` (grouping helper), `lib/Service/SettingsService.php` + (per-user board view preference), `l10n/`. +- Depends on: `boards-configurable-columns` (lanes), `tasks-assignment-priority-labels` (values to + group by). + +## Risks + +### Risk 1: Colour as the only signal +**Severity**: Medium +**Mitigation**: the edge is decoration; the label chip or priority chip on the card carries the same +information in text (WCAG 1.4.1), and priority colours use NL Design tokens. + +### Risk 2: Low contrast in dark mode +**Severity**: Low +**Mitigation**: the edge is a 4 pixel border, never the background, so text contrast does not +depend on the label colour. diff --git a/openspec/changes/archive/2026-09-29-boards-card-display/specs/board-view-options/spec.md b/openspec/changes/archive/2026-09-29-boards-card-display/specs/board-view-options/spec.md new file mode 100644 index 00000000..668d5d7c --- /dev/null +++ b/openspec/changes/archive/2026-09-29-boards-card-display/specs/board-view-options/spec.md @@ -0,0 +1,53 @@ +# board-view-options delta for boards-card-display + +Extends the flat main spec `openspec/specs/kanban-board.md`. + +## ADDED Requirements + +### Requirement: A member can colour cards by label or priority + +The system MUST let a project member colour the board's cards by their first label or by their +priority, as a coloured edge on the card, while the label or priority stays readable as text on +the card. Tier: MVP (docs/FEATURES.md). + +#### Scenario: Colour by label + +- **GIVEN** tasks labelled "Juridisch" (red) and "Financieel" (blue) +- **WHEN** a member chooses View, then Colour cards by label +- **THEN** the "Juridisch" cards carry a red edge and the "Financieel" cards a blue edge +- **AND** each card still shows its label chip with the label name + +### Requirement: A member can split the board into swimlanes + +The system MUST let a project member group the board into swimlanes by assignee, priority or epic, +with a row per value plus a row for tasks without one, each row collapsible and showing its card +count. Tier: V1. + +#### Scenario: Swimlanes by assignee + +- **GIVEN** Anna has three tasks, Bram two, and one task is unassigned +- **WHEN** a member chooses View, then Group by assignee +- **THEN** the board shows rows "Anna (3)", "Bram (2)" and "No assignee (1)", each with all lanes + +### Requirement: Dragging across swimlanes changes the grouped field + +The system MUST change a task's assignee or priority when its card is dropped in another assignee +or priority swimlane, and MUST refuse a drop in another epic swimlane. Tier: V1. + +#### Scenario: Hand a task to a colleague + +- **GIVEN** the board is grouped by assignee +- **WHEN** Anna drags one of her cards into Bram's row, in the same lane +- **THEN** the task's `assignedTo` is Bram and the card shows in his row + +### Requirement: The board remembers each person's view + +The system MUST remember a person's colour and grouping choice per project and apply it when they +open that board again. Tier: V1. + +#### Scenario: Come back to a grouped board + +- **GIVEN** Anna grouped the "Vergunningen" board by priority yesterday +- **WHEN** she opens it today +- **THEN** it is grouped by priority +- **AND** Bram's view of the same board is unchanged diff --git a/openspec/changes/archive/2026-09-29-boards-card-display/tasks.md b/openspec/changes/archive/2026-09-29-boards-card-display/tasks.md new file mode 100644 index 00000000..2ae5805d --- /dev/null +++ b/openspec/changes/archive/2026-09-29-boards-card-display/tasks.md @@ -0,0 +1,20 @@ +# Tasks: boards-card-display + +## 1. Card colours + +- [x] 1.1 Colour edge on `src/components/TaskCard.vue` (prop `edgeColour`, a 4 pixel inline-start border, `data-edge` for tests) from the first label or the priority token, chosen by `cardEdge()` in `src/utils/boardView.js`. Verify: vitest `tests/vitest/boardView.spec.js` "cardEdge" for each mode (the repo has no component-mount tooling, so the mode logic lives in the helper); Playwright `tests/e2e/board-view.spec.ts` checks the edge and the label chip. + +## 2. Swimlanes + +- [x] 2.1 `groupTasksBySwimlane(tasks, field, names)` helper with the "No value" group last, and `epicTitles()` for epic row names. Verify: vitest spec for assignee, priority and epic. +- [x] 2.2 Swimlane rows with collapsible headers "{name} ({count})" in `src/views/ProjectBoard.vue`. Verify: Playwright `tests/e2e/board-view.spec.ts` groups by assignee and collapses a row. +- [x] 2.3 Cross-row drag and the keyboard "Hand over to" menu PATCH the grouped field through `swimlanePatch()` (assignee through `responsiblePatch`, so the new responsible person leaves `sharedWith`); epic rows refuse; quick add in a row gives the card that row's value (`newCardFields()`). Verify: vitest spec on `swimlanePatch` and `newCardFields`; Playwright drags a card to another assignee row. + +## 3. View menu and memory + +- [x] 3.1 `src/components/BoardViewMenu.vue` with colour and grouping choices, stored per person and project by `lib/Service/BoardViewPreferenceService.php` in one user value `board_views` (project id to view, at most 100, unknown choices stored as none) through `POST /api/settings/user` `board_view`. Verify: PHPUnit `BoardViewPreferenceServiceTest` (per person and project, refusals, oldest dropped) and `SettingsServiceTest::testUpdateUserSettingsStoresTheBoardViewPerUser`; Playwright reloads and keeps the grouping. + +## 4. Copy and verification + +- [x] 4.1 New strings in all 36 locales. Verify: `npm run check:l10n` exits 0. +- [x] 4.2 `openspec validate boards-card-display --type change --strict` passes. diff --git a/openspec/changes/fix-l10n-parity-gate/.openspec.yaml b/openspec/changes/archive/2026-09-29-fix-l10n-parity-gate/.openspec.yaml similarity index 100% rename from openspec/changes/fix-l10n-parity-gate/.openspec.yaml rename to openspec/changes/archive/2026-09-29-fix-l10n-parity-gate/.openspec.yaml diff --git a/openspec/changes/fix-l10n-parity-gate/proposal.md b/openspec/changes/archive/2026-09-29-fix-l10n-parity-gate/proposal.md similarity index 100% rename from openspec/changes/fix-l10n-parity-gate/proposal.md rename to openspec/changes/archive/2026-09-29-fix-l10n-parity-gate/proposal.md diff --git a/openspec/changes/fix-l10n-parity-gate/specs/i18n-locale-completeness/spec.md b/openspec/changes/archive/2026-09-29-fix-l10n-parity-gate/specs/i18n-locale-completeness/spec.md similarity index 100% rename from openspec/changes/fix-l10n-parity-gate/specs/i18n-locale-completeness/spec.md rename to openspec/changes/archive/2026-09-29-fix-l10n-parity-gate/specs/i18n-locale-completeness/spec.md diff --git a/openspec/changes/fix-l10n-parity-gate/tasks.md b/openspec/changes/archive/2026-09-29-fix-l10n-parity-gate/tasks.md similarity index 73% rename from openspec/changes/fix-l10n-parity-gate/tasks.md rename to openspec/changes/archive/2026-09-29-fix-l10n-parity-gate/tasks.md index 61489336..33449d70 100644 --- a/openspec/changes/fix-l10n-parity-gate/tasks.md +++ b/openspec/changes/archive/2026-09-29-fix-l10n-parity-gate/tasks.md @@ -18,4 +18,8 @@ ## 4. Verify - [x] 4.1 Re-run `node tests/l10n/check-l10n-parity.js` and confirm `EXIT=0` with the summary reporting 0 missing / 0 empty across all 36 required locales -- [~] 4.2 `openspec validate fix-l10n-parity-gate --strict` passes — DEFERRED: the openspec CLI is not installed in this worktree (no `node_modules/.bin/openspec`, no global). Spec/tasks are well-formed; validation to run in an environment with the CLI. +- [x] 4.2 `openspec validate fix-l10n-parity-gate --strict` passes (run 2026-09-29 with openspec 1.12.0). + +## 5. Close the source gap (2026-09-29) + +- [x] 5.1 The parity gate only compares locales with `l10n/en.json`, so a string used in `src/` but never added to `en.json` passed every gate and showed in English everywhere: 63 file-and-string pairs (62 distinct strings) at `feat/my-work` (among them the row's `Go to projects`). Add `tests/vitest/l10nSourceCoverage.spec.js`, which fails on any `t('planninq', '')` in `src/` without an English entry, add 62 keys to all 36 locales (four of them the rewritten delete messages), and rewrite the four project-delete error messages without an em-dash. Verify: the test fails before the strings land (63 pairs) and passes after; `npm run check:l10n` exits 0. diff --git a/openspec/changes/archive/2026-09-29-integration-case-bridge/design.md b/openspec/changes/archive/2026-09-29-integration-case-bridge/design.md new file mode 100644 index 00000000..8aa5c719 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-integration-case-bridge/design.md @@ -0,0 +1,83 @@ +# Design: start a project from a case and hand its record back to the case + +## Context + +Read at development `de35541`: + +- Schema `project`: `caseReference` (uuid, "linked Procest case"); schema `task`: `zaakUuid`. +- `src/components/ProjectSettingsSidebar.vue:47-53` shows `caseReference` read-only. +- The `planninq-projects` leaf (ADR-066): client half `src/integrations/registerProjectsLeaf.js` + (surfaces user-dashboard, app-dashboard, detail-page, single-entity), server half + `lib/Listener/RegisterProjectsLeafListener.php` (`LEAF_ID`, `SURFACES`, gate-24 parity). + `src/integrations/projectScope.js` `scopeParams` scopes a detail page by `client` only. +- `src/integrations/CnProjectsWidget.vue` links "New project" to + `/apps/planninq/projects?new=1&client={client}` (`lib/Listener/RegisterProjectsLeafListener.php:379`), + and `src/views/ProjectList.vue` reads no route query, so the dialog never opens (defect recorded on + row `int-projects-on-client`). +- `openspec/specs/procest-integration.md` V1 describes a token-authenticated bridge API + (`POST /planninq/api/bridge/project`). +- hydra ADR-051 (semantic object handoff) and ADR-048 (cross-app references) prefer handing objects + over through Open Register primitives over app-to-app APIs; ADR-054 hardens public surfaces. +- The providers list of the matrix records Dossiq's app id as `procest`; Dossiq's `appinfo/info.xml` now + declares `dossiq`, and `` is the only authority. + +## Goals / non-goals + +Goals: start a project from a case page; hand a project's files and metadata to its case, +provably unchanged. Non-goals: manual case linking, completion mirroring, external zaaksystemen. + +## Decisions + +### Decision 1: reuse the projects leaf instead of a bridge API + +The leaf gains a case scope: on a detail page whose host schema is Dossiq's case, `scopeParams` +returns `{ caseReference: objectId }` and `guardRows` keeps rows with that `caseReference`. The +scope is chosen from the host schema the leaf receives in its props, and both leaf halves list it so +gate-24 keeps them equal. "New project" links to +`/apps/planninq/projects?new=1&case={id}&title={caseTitle}`. Alternative: the main spec's token +bridge. Rejected: a shared-secret endpoint is a public surface (ADR-054), and it would create +projects as nobody in particular instead of as the case handler. + +### Decision 2: ProjectList honours `?new=1` + +`ProjectList` reads `new`, `case`, `client` and `title` from the route query on mount and opens +`ProjectCreationDialog` prefilled; the dialog shows "Linked case: {title}" read-only and saves +`caseReference`. This also fixes the dead `?new=1&client=` link. + +### Decision 3: a handover service copies files and writes a metadata file + +`CaseHandoverService::handOver(projectId)` collects the files on the project object and on each of +its tasks through Open Register's file service as the current user, computes SHA-256 per file, +writes each to the case object's files (Dossiq's register) as the same user, re-reads the checksum, +and adds `project-metadata.json` (project fields, members, tasks with key, status, dates and +assignee) with its own checksum. A route `POST /api/projects/{id}/case-handover` exposes it +(`#[NoAdminRequired]`, owner check in the method). The result is appended to a new project property +`caseHandovers` (date, uid, case, files with name and checksum, failures). + +### Decision 4: shown only when the case app is there + +The action and the leaf scope check `IAppManager::isInstalled('dossiq')`. Dossiq's own id change +has landed (`appinfo/info.xml` reads `dossiq`), so the check uses the new id. + +## Risks / trade-offs + +- [Large projects make a slow request] -> the handover runs as a queued job when it holds more than + twenty files, and the project shows "Handover in progress". + +## Open questions + +- Does Open Register's file service expose a copy between objects in different registers, or must + the service stream each file? Task 3.1 decides. + +## Amendments at build (29 Sep 2026) + +What the code at 64408e3 needed, and what changed while building: + +- **The case scope lives in the client half only.** `RegisterProjectsLeafListener` declares id, label, icon, group, surfaces, reference type and render mode; there is no scope or link template on the server side to mirror (the "New project" link lives in `CnProjectsWidget.vue`), so gate-24 has nothing new to compare and task 1.2 changes only the widget. +- **The host is recognised by its schema slug.** A detail-page host passes `register`, `schema` and `objectId` to a mounted leaf (nextcloud-vue `CnDetailWidgetHost`). Schema slugs are global on a shared OpenRegister, so `schema === 'case'` names Dossiq's case (`dossiq` register, `case` schema). A host that passes numeric ids keeps the client scope. +- **The case title** is read by the widget from OpenRegister's object API when the user chooses "New project", and passed as `title`; without it the dialog says "Linked to a case". +- **Access to the case is the read rule.** OpenRegister's `FileService::addFile` checks nothing itself; its own files API (`FilesController::create`) only checks that the user may access the object. The handover applies the same rule: the case is read with the user's rights (`ObjectService::find`, RBAC on), and an unreadable case refuses the whole handover with `caseNotFound`. The scenario is renamed "No access to the case". +- **Synchronous, no queued job.** A queued job has no user session, and the handover must run with the user's rights; a queued copy would have to run as the system. The request copies synchronously; a very large project is a later change if it is ever needed. +- **File names on the case:** project files keep their name, task files get "{key} {title} - " in front, and a name already taken gets " (1)", " (2)" and so on, so a second handover keeps the first copies. +- **Status endpoint:** `GET /api/projects/{id}/case-handover` returns whether the case app is installed and the handovers so far; the sidebar asks it instead of reading app state from the page. +- **The hidden state is tested as a pure rule** (`handoverOffered` in `src/utils/caseBridge.js`): the vitest suite runs in node without a DOM. diff --git a/openspec/changes/archive/2026-09-29-integration-case-bridge/proposal.md b/openspec/changes/archive/2026-09-29-integration-case-bridge/proposal.md new file mode 100644 index 00000000..ccc5bbb3 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-integration-case-bridge/proposal.md @@ -0,0 +1,101 @@ +--- +kind: code +--- + +# Start a project from a case and hand its record back to the case + +## Why + +Planninq's projects and tasks already carry a case link: `project.caseReference` and +`task.zaakUuid` (`lib/Settings/planninq_register.json`). The link is display only +(`src/components/ProjectSettingsSidebar.vue:47-53`), and neither direction of the bridge exists. + +A case handler in the case app (Dossiq, app id `dossiq`) cannot start a project for a case. +The main spec describes it (`openspec/specs/procest-integration.md`, "Procest Bridge, Create Project +from Case", V1) and links a change that was never written; the matrix marks the row `specified` on +that claim. The matrix also found that Dossiq references planninq nowhere but a repair step. + +When a project ends, its documents and metadata stay in planninq. Gemeente Sittard-Geleen's tender +for a project management tool asks for them to be moved, unchanged, into the case system for the +record (TenderNed 365739, requirements 4054 and 4126, +https://www.tenderned.nl/aankondigingen/overzicht/365739). Nothing exports a project's files or +metadata today. + +Parity rows: `int-project-from-case`, `int-archive-to-case` in planninq's +`openspec/parity/capabilities.json`. +Decision: build. `int-project-from-case` was marked specified with no change directory; +`int-archive-to-case` carries tender demand. + +## What changes + +- On a case's page in Dossiq, planninq's Projects panel lists the projects linked to that case and + offers "New project", which opens planninq's New project dialog with the case linked and the + case title filled in. +- On a project linked to a case, the owner chooses "Hand over to case": every file on the project + and its tasks, plus a metadata file describing the project, is copied byte for byte to the case, + and the handover is recorded on the project with the file checksums. +- Both actions run with the user's own rights on the case; no shared token and no public endpoint. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `int-project-from-case`, `int-archive-to-case`. + +### `int-project-from-case`: Create a project from a case. + +- Area `integration`. Planninq is rated `no`, built.state `specified`, owner `ConductionNL/planninq`. +- Built evidence: "openspec/specs/procest-integration.md:13 describes it; no planninq route, dialog or listener creates a project from a case, and procest/src + procest/lib reference planninq only in lib/Repair/MigrateSchemaApplicationId.php" +- Note: "procest was read from the live workspace checkout (another session's branch), read-only." +- Demand: none recorded on the row. +- Competitors rated yes: none. + +### `int-archive-to-case`: Hand a project's documents and metadata over unchanged to the case management system for the record. + +- Area `integration`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "src/components/ProjectSettingsSidebar.vue:47-53 displays caseReference when set; no action exports a project's attachments or metadata to dossiq/procest or a ZGW DRC. grep for 'zaakUuid', 'caseReference', 'drc', 'archive' in lib/ finds only the portal field exclusion list in lib/Portal/PortalContributionProvider.php:64." +- Note: "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4054, 4126 (bestanden en metadata voor dossiervorming ongewijzigd overzetten naar het zaaksysteem)." +- Demand (tender, via origin): https://www.tenderned.nl/aankondigingen/overzicht/365739 +- Competitors rated yes: none. + +## Scope + +### In scope + +- Case scoping for the existing `planninq-projects` leaf, so Dossiq can place it on a case page. +- `ProjectList` opening the New project dialog from `?new=1` with a prefilled case link and title. +- A handover service and action for projects with a case link. + +### Out of scope + +- Editing the case link by hand on a project or task (row `int-case-ref`, deferred: partial, built, + no demand). +- Mirroring task completion to the case (a V1 scenario of the main spec with no matrix row). +- Handing over to an external zaaksysteem through a ZGW Documenten API: a later integriq connector. +- The Dossiq side: placing the leaf on its case schema is a change in ConductionNL/dossiq, named + here as a dependency and not written in this repo. + +## Impact + +- `src/integrations/projectScope.js`, `src/integrations/registerProjectsLeaf.js` and + `lib/Listener/RegisterProjectsLeafListener.php` (case scope, kept in parity by gate-24), + `src/integrations/CnProjectsWidget.vue`, `src/views/ProjectList.vue`, + `src/dialogs/ProjectCreationDialog.vue`, a new `lib/Service/CaseHandoverService.php` and + controller route, `lib/Settings/planninq_register.json` (project `caseHandovers`), `l10n/`. +- Cross-project: ConductionNL/dossiq adds planninq's leaf to its case schema's linked types. Issue: https://github.com/ConductionNL/dossiq/issues/3190 + +## Risks + +### Risk 1: A handover copies files the user may not see +**Severity**: High +**Mitigation**: the service reads the project's and tasks' files as the requesting user through Open +Register, so it can only copy what that user can read, and writes to the case as that user, so Open +Register refuses a case they cannot write. + +### Risk 2: "Unchanged" is claimed but not proven +**Severity**: Medium +**Mitigation**: each file's SHA-256 is computed before and after the copy and stored in the handover +record; a mismatch fails that file and the record says so. + +### Risk 3: The case app is not installed +**Severity**: Low +**Mitigation**: both actions are hidden unless the case app (`dossiq`, the id Dossiq declares in `appinfo/info.xml`) is +installed; the build checks `isInstalled('dossiq')`. diff --git a/openspec/changes/archive/2026-09-29-integration-case-bridge/specs/case-bridge/spec.md b/openspec/changes/archive/2026-09-29-integration-case-bridge/specs/case-bridge/spec.md new file mode 100644 index 00000000..53f55399 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-integration-case-bridge/specs/case-bridge/spec.md @@ -0,0 +1,54 @@ +# case-bridge delta for integration-case-bridge + +Extends the flat main spec `openspec/specs/procest-integration.md`. + +## ADDED Requirements + +### Requirement: A case handler can start a project from a case page + +The system MUST show planninq's Projects panel on a case page of the case app, listing the projects +linked to that case, and its "New project" action MUST open planninq's New project dialog with the +case linked and the case title filled in. Tier: V1 (docs/FEATURES.md). + +#### Scenario: Start a project from a case +@e2e exclude Needs Dossiq's case page with planninq's leaf placed on it (the Dossiq issue named in the proposal); the case scope is asserted by tests/vitest/caseBridge.spec.js "asks for the projects linked to the case, and keeps only those" and the link by "links the case and its title from a case page" + +- **GIVEN** a case handler allowed to create projects is on the page of case "Omgevingsvergunning Markt 12" in the case app +- **WHEN** they choose "New project" in the Projects panel and create the project +- **THEN** a project exists with `caseReference` set to that case +- **AND** the Projects panel on the case page lists it + +#### Scenario: A link opens the dialog prefilled + +- **GIVEN** a user follows /apps/planninq/projects?new=1&case={uuid}&title=Markt%2012 +- **WHEN** the Projects page loads +- **THEN** the New project dialog is open with the title "Markt 12" and the linked case shown + +### Requirement: The project owner can hand a project's record over to its case + +The system MUST let the owner of a project linked to a case copy every file on the project and its +tasks, and a metadata file describing the project, to that case without changing a byte, and MUST +record the handover on the project with each file's checksum. Tier: Enterprise. + +#### Scenario: Hand over a finished project +@e2e exclude Needs Dossiq installed next to planninq; asserted by CaseHandoverControllerTest::testOwnerHandsOverFilesAndMetadataUnchanged and testChecksumMismatchFailsThatFile + +- **GIVEN** a project linked to a case holds three files on its tasks, and its owner may write to the case +- **WHEN** the owner chooses "Hand over to case" in the project settings +- **THEN** the case holds the three files and `project-metadata.json` +- **AND** each copied file has the same SHA-256 as its source +- **AND** the project lists the handover with date, person and the four checksums + +#### Scenario: No access to the case +@e2e exclude Needs Dossiq installed next to planninq; asserted by CaseHandoverControllerTest::testNothingIsCopiedWithoutAReachableCase + +- **GIVEN** the owner of a linked project cannot open the case (the rule OpenRegister's own files API applies before it adds a file to an object) +- **WHEN** they choose "Hand over to case" +- **THEN** nothing is copied and they see "The linked case could not be found, or you cannot open it." + +#### Scenario: The case app is not installed +@e2e exclude The e2e instance has no Dossiq, so the hidden action is the default there; asserted by tests/vitest/caseBridge.spec.js "is hidden without the case app, without a case link, or for anyone else" and CaseHandoverControllerTest::testNothingIsCopiedWithoutAReachableCase + +- **GIVEN** the case app is not installed on the instance +- **WHEN** a project owner opens the project settings +- **THEN** no "Hand over to case" action is shown diff --git a/openspec/changes/archive/2026-09-29-integration-case-bridge/tasks.md b/openspec/changes/archive/2026-09-29-integration-case-bridge/tasks.md new file mode 100644 index 00000000..435243bf --- /dev/null +++ b/openspec/changes/archive/2026-09-29-integration-case-bridge/tasks.md @@ -0,0 +1,22 @@ +# Tasks: integration-case-bridge + +## 1. Leaf case scope + +- [x] 1.1 Add a case scope to `scopeParams` and `guardRows` in `src/integrations/projectScope.js`, chosen from the host schema. Verify: vitest spec for client and case scopes. +- [x] 1.2 Mirror the scope in `lib/Listener/RegisterProjectsLeafListener.php` and the "New project" link with `case` and `title`. Verify: `node scripts/check-integration-parity.js` exits 0; PHPUnit test on the link template. + +## 2. New project from a link + +- [x] 2.1 `src/views/ProjectList.vue` opens `ProjectCreationDialog` from `?new=1` with `case`, `client` and `title` prefilled; the dialog saves `caseReference`. Verify: Playwright e2e opens /apps/planninq/projects?new=1&case=&title=Case%2012 and creates a linked project. + +## 3. Handover + +- [x] 3.1 `lib/Service/CaseHandoverService.php` copying project and task files and the metadata file with before and after checksums, as the current user. Verify: PHPUnit tests in `tests/Unit/Service/` with a mocked file service, including a checksum mismatch. +- [x] 3.2 Route `POST /api/projects/{id}/case-handover` with an owner check, and the `caseHandovers` property on the project schema. Verify: PHPUnit controller test for owner and non-owner; `npm run check:schema-l10n` exits 0. +- [x] 3.3 "Hand over to case" in the project settings sidebar with the result list, hidden without the case app. Verify: vitest mount test for the hidden state; live check on an instance with Dossiq installed. + +## 4. Cross-project and verification + +- [x] 4.1 Open an issue in ConductionNL/dossiq to add the `planninq-projects` leaf to the case schema's linked types. Verify: the issue link is recorded in this change's proposal. +- [x] 4.2 New strings in `l10n/en.json` and `l10n/nl.json`. Verify: `npm run check:l10n` exits 0. +- [x] 4.3 `openspec validate integration-case-bridge --type change --strict` passes. diff --git a/openspec/changes/archive/2026-09-29-integration-msproject-import/design.md b/openspec/changes/archive/2026-09-29-integration-msproject-import/design.md new file mode 100644 index 00000000..488713b4 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-integration-msproject-import/design.md @@ -0,0 +1,68 @@ +# Design: import a Gantt plan made in Microsoft Project + +## Context + +What exists at de35541: + +- `RegisterImportService` (`lib/Service/RegisterImportService.php:43-160`) imports planninq's own register configuration from `lib/Settings/planninq_register.json`; it has nothing to do with user plans. +- The register holds every object a plan needs: + - `task` (`lib/Settings/planninq_register.json:39-390`): `title`, `description`, `startDate`, `dueDate`, `estimatedDuration` (minutes), `percentComplete` (0 to 100), `parent` (one sub-task level, `docs/ARCHITECTURE.md` section 5 question 2), `phase`, `issueType` (free string), `metadata` (declared catch-all for source-system fields such as import provenance, `:384-389`). + - `projectPhase` (`:584-752`): `title`, `project`, `status`, `order`, `startDate`, `endDate`; no `metadata` yet. + - `dependency` (`:1106-1167`): `blocker`, `blocked`, `type` (`blocks`, `relates`, and others). Edges are created through `DependencyService::create`, which rejects self edges, duplicates, cross-project edges, cycles and non-members (`lib/Service/DependencyService.php:112-141`). +- The timeline (`src/views/ProjectTimeline.vue`, fed by `GET /api/projects/{projectId}/timeline`) draws tasks with dates and the dependency edges between them; it is where a user looks at an imported plan. +- Controllers that carry real logic exist next to the object API: `DependencyController` (validation) and `ProjectController` (creation policy). The hydra gates require every `#[NoAdminRequired]` method to guard access per object. + +Microsoft Project's XML format (MSPDI) lists `Task` elements with `UID`, `Name`, `OutlineLevel`, `Summary`, `Milestone`, `Start`, `Finish`, `Duration`, `PercentComplete`, `Notes` and `PredecessorLink` children (`PredecessorUID`, `Type` 0 to 3 for finish-to-finish, finish-to-start, start-to-finish and start-to-start, `LinkLag`). + +## Goals / non-goals + +Goals: +- A contractor's plan in planninq in one confirmed step, with a clear list of what did not carry over. +- A newer version of the same plan updates what the first import created. + +Non-goals: +- `.mpp`, resources, calendars, costs, baselines, export, deleting tasks missing from a newer file. + +## Decisions + +### Decision 1: the XML format only +The import reads MSPDI XML. `.mpp` is a closed binary format with no PHP reader; Project saves the same plan with "File, Save as, XML format", and the import dialog says so. The parser uses PHP's XML reader with external entities and network access off, rejects any DOCTYPE, and enforces 10 MB and 2,000 tasks before mapping. + +### Decision 2: a fixed mapping onto planninq's model +- A summary task at outline level 1 becomes a `projectPhase` (title, start, end, order by position). +- A task at outline level 2 under such a phase, or any non-summary task at level 1, becomes a `task` with `phase` set when it has one. +- A task at level 3 or deeper becomes a sub-task (`parent`) of its level-2 ancestor; its outline path is kept at the top of its description. Planninq allows one sub-task level, so deeper levels collapse. +- A milestone becomes a task with `issueType: milestone` and `startDate` equal to `dueDate`. +- `Start` and `Finish` become `startDate` and `dueDate` (dates only), `Duration` becomes `estimatedDuration` in minutes, `PercentComplete` becomes `percentComplete`, and `Notes` becomes `description`. A task at 100 percent gets status `done`, one above 0 `in_progress`, otherwise `open`. +- A finish-to-start link becomes a `dependency` of type `blocks`; any other link type becomes `relates`, and every lag is dropped. Links are created through `DependencyService`, so its checks apply. +- Every created object stores `metadata.msProjectUid` and `metadata.msProjectFile` (the plan's `Name` and `SaveVersion`); `projectPhase` gains the same declared `metadata` object. + +### Decision 3: preview first, then commit, both stateless +`ProjectImportController` has `POST /api/projects/{projectId}/import/msproject/preview` and `POST /api/projects/{projectId}/import/msproject`, both `#[NoAdminRequired]` with an in-method check that the caller is the project's owner or an admin (a plan rewrites a project's structure, so the owner decides, like managing columns). Preview parses and maps and returns counts per kind, the first 50 tasks with their dates, and the list of losses ("3 start-to-start links become related links", "12 tasks had resources, which are not imported", "2 tasks at level 4 were placed under their level-2 task"). Commit takes the same file again and writes in order: phases, tasks, sub-tasks, dependencies, each through `ObjectService` with the caller's rights. Nothing is held on the server between the two calls. + +### Decision 4: re-import updates by Project UID +Before writing, commit reads the project's tasks and phases with a `metadata.msProjectUid`. A matching object is updated (title, dates, duration, progress, notes, phase or parent); an unmatched one is created; an existing imported object whose UID is missing from the new file is listed in the result as "no longer in the plan" and left alone. The same rule makes a failed import safe to run again. + +### Decision 5: the entry point is the timeline +"Import from Microsoft Project" sits in the timeline header for the project owner and opens `MsProjectImportDialog` (in `src/dialogs/`): a file field, the preview with its losses, and "Import". After import the timeline reloads and shows the plan. Placement is Projecten > project > timeline (ADR-001); this is a user action on one project, not integration configuration, so it is not in Beheer. + +## Risks / trade-offs + +- [Malicious XML] -> No entities, no network, no DOCTYPE, size and count caps (Decision 1). +- [Model mismatch] -> Fixed mapping, every loss counted in the preview (Decision 2). +- [Half-finished import] -> Ordered writes, UID matching, safe to rerun (Decision 4). +- [Large plans in one request] -> The 2,000-task cap keeps a commit within a normal request; larger plans are refused with that reason. + +## Amendments at build (29 Sep 2026) + +The design was written at de35541. What the code at 5e33023 needed, and what changed while building: + +- **Links go through `DependencyService::createImported()`**, not `create()` once per link. `create()` reads every task and edge of the project for each link, which is 4,000 searches for a large plan, and its membership step refuses an admin who is not on the project although Decision 3 lets admins import. `createImported()` reads the project's edges once and applies the same duplicate, self-link and cycle checks to each link against that list as it grows. The controller has already checked owner-or-admin, and every task id is one the import created or matched in the project. +- **Related links never block.** Nothing read `dependency.type` before this change, so an imported `relates` link would have blocked its task and counted in cycle checks. `DependencyGraph` and `src/utils/taskHelpers.js` now count only edges without a type or of type `blocks`; the timeline receives `type` and draws a related link as a dashed line without an arrow. +- **Imported tasks have no board column.** The board is column-based since boards-configurable-columns: a task without `column` is in the backlog, and that is where imported tasks land. "Move to board" puts them in a lane. +- **Imported phases have no status.** A phase closes only with its concluding document (planning-phase-gate-document), so the import never writes one; a phase starts as `open`. +- **A re-import leaves `status` alone** and changes only what the plan owns (title, dates, duration, progress, notes, phase or parent); what members set in planninq stays. +- **The outline path is kept only for a collapsed task** (level 4 and deeper). A level-3 task sits under its level-2 task where it was, so its path adds nothing. +- **Provenance keys:** `metadata.msProjectUid`, `metadata.msProjectFile` (the plan's `Name`) and `metadata.msProjectSaveVersion`. +- **The fixture** `tests/fixtures/msproject/contractor-plan.xml` is written by hand in the MSPDI format, not exported from Project; no copy of Project was available to the build. +- **Refusals carry a reason code** (`mpp`, `unsafe`, `tooLarge`, `tooManyTasks`, `notAPlan`, `noFile`) that the dialog explains; an `.mpp` file is refused in the browser before upload as well. diff --git a/openspec/changes/archive/2026-09-29-integration-msproject-import/proposal.md b/openspec/changes/archive/2026-09-29-integration-msproject-import/proposal.md new file mode 100644 index 00000000..f0074853 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-integration-msproject-import/proposal.md @@ -0,0 +1,73 @@ +--- +kind: code +--- + +# Import a Gantt plan made in Microsoft Project + +## Why + +A project leader who receives a contractor's plan from Microsoft Project has to retype it into planninq. There is no import for it: `lib/Service/RegisterImportService.php` imports only the app's own register configuration (`load`, `reload` and `import` at `:72-160`), and OpenRegister's generic import takes tabular rows, which cannot rebuild a plan's hierarchy or its links between tasks. The pieces a plan needs do exist in the register: tasks with `startDate`, `dueDate`, `percentComplete`, `parent` and `phase` (`lib/Settings/planninq_register.json:220-310`), project phases (`:584-752`) and dependency edges (`:1106-1166`). + +Gemeente Sittard-Geleen asked for this in its tender for a project management tool: TenderNed 365739 (published 2025-01-31), requirement 4132, a wish: import contractors' Gantt charts from MS Project ("GANTT-diagrammen van aannemers vanuit MS-project importeren"). No competitor in the matrix is rated yes; the demand is the tender. + +Parity rows: `int-import-msproject` in planninq's `openspec/parity/capabilities.json`. +Decision: build, because a public tender asks for it and every object a Gantt plan needs already exists in planninq's register. + +This change extends the flat spec `openspec/specs/projects.md` through a new capability, `msproject-import`. + +## What changes + +- A project owner can upload a plan saved from Microsoft Project in its XML format on the project's timeline. +- Before anything is written, they see what the import will create: phases, tasks, sub-tasks, milestones and links, and what it cannot carry over. +- Confirming creates the plan in the project: summary tasks become phases, tasks keep their dates and progress, and finish-to-start links become dependencies the timeline draws. +- Importing a newer version of the same plan updates the tasks it created before instead of duplicating them. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `int-import-msproject`. + +### `int-import-msproject`: Import a Gantt plan made in Microsoft Project. + +- Area `integration`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "No Microsoft Project import in src/ or lib/. lib/Service/RegisterImportService.php imports the app's own configuration. The nearest path is OpenRegister's generic register import (the int-import-other row), which takes tabular rows and would not rebuild a Gantt plan with dependencies." +- Note: "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirement 4132, wish (GANTT-diagrammen van aannemers vanuit MS-project importeren)." +- Demand (tender, via origin): https://www.tenderned.nl/aankondigingen/overzicht/365739 +- Competitors rated yes: none. + + +## Scope + +### In scope + +- Microsoft Project's XML format (MSPDI, "Save as XML" in Project). +- A preview, then a confirmed import into one existing project. +- Phases from top-level summary tasks, tasks, one level of sub-tasks, milestones, notes, progress, and dependencies. +- Re-import of a newer file from the same plan, matched on Project's task UID. + +### Out of scope + +- The binary `.mpp` format. It has no open specification and no PHP reader; Project saves the same plan as XML, and the import screen says how. +- Resources, calendars, costs and baselines. Contractor resources are rarely Nextcloud users; the preview lists what was left out. +- Export back to Microsoft Project. +- Deleting tasks that disappeared from a newer file. They are listed, not removed. + +## Impact + +- Backend: a new `lib/Service/MsProjectImportService.php` (parse, map, preview, write) and a new `lib/Controller/ProjectImportController.php` with a preview and a commit route in `appinfo/routes.php`. This is import logic, not a pass-through (ADR-022). +- Views and dialogs: an "Import from Microsoft Project" button on `src/views/ProjectTimeline.vue` and a new `src/dialogs/MsProjectImportDialog.vue`. +- Schema: none new. Imported objects carry their Project UID in `metadata` (task `:384-389`); `projectPhase` gains the same `metadata` catch-all. +- Depends on: none of this pass's changes. `planning-phase-gate-document` adds the page where imported phases can be seen and managed. + +## Risks + +### Risk 1: a malicious XML file +**Severity**: High +**Mitigation**: the parser loads no external entities and no network resources, rejects a DOCTYPE, and refuses files over 10 MB or with more than 2,000 tasks, before any mapping runs. + +### Risk 2: a plan does not fit planninq's model +**Severity**: Medium +**Mitigation**: the mapping is fixed and shown in the preview: deeper outline levels collapse to one sub-task level, links other than finish-to-start become "related" links, and lags are dropped. Every loss is listed with a count before the owner confirms. + +### Risk 3: a half-finished import +**Severity**: Medium +**Mitigation**: the write runs in dependency order (phases, tasks, sub-tasks, links) and records each created object's Project UID, so running the same import again completes it without duplicates. A failure reports how far it got. diff --git a/openspec/changes/archive/2026-09-29-integration-msproject-import/specs/msproject-import/spec.md b/openspec/changes/archive/2026-09-29-integration-msproject-import/specs/msproject-import/spec.md new file mode 100644 index 00000000..beb6539e --- /dev/null +++ b/openspec/changes/archive/2026-09-29-integration-msproject-import/specs/msproject-import/spec.md @@ -0,0 +1,63 @@ +# msproject-import delta for integration-msproject-import + +## ADDED Requirements + +### Requirement: A project owner can preview a Microsoft Project plan before importing it + +The project owner, or an admin, MUST be able to upload a plan saved from Microsoft Project in its XML format on the project's timeline and see, before anything is written, how many phases, tasks, sub-tasks, milestones and links the import will create, and every part of the plan it cannot carry over. The preview SHALL write nothing. Other project members SHALL NOT be offered the import. Tier: V1 (docs/FEATURES.md, integration; this change adds the row). + +#### Scenario: The owner previews a contractor plan + +- **GIVEN** the owner of project "Renovatie stadhuis" on its timeline at /projects/:id/timeline +- **WHEN** they choose "Import from Microsoft Project" and select the contractor's plan saved as XML +- **THEN** the dialog shows, for example, "4 phases, 38 tasks, 6 sub-tasks, 3 milestones, 41 links" +- **AND** it lists what will not carry over, such as "12 tasks had resources, which are not imported" +- **AND** the project has no new objects yet + +#### Scenario: A member who is not the owner cannot import +@e2e exclude The e2e suite runs as the admin only; the hidden button is asserted by tests/vitest/msprojectImport.spec.js "offers the import to the owner and to an admin only" and the refused request by ProjectImportControllerTest::testMemberWhoIsNotOwnerIsRefused + +- **GIVEN** a project member who is not the project owner +- **WHEN** they open the project's timeline +- **THEN** there is no "Import from Microsoft Project" button +- **AND** a request from their client to the import endpoint is refused + +### Requirement: Confirming the import builds the plan in the project + +When the owner confirms, the system MUST create the plan in the project: top-level summary tasks as phases, their tasks with the phase set, deeper tasks as sub-tasks of their level-2 task, milestones as tasks whose start and due dates are equal, dates, estimated durations, progress and notes on each task, and finish-to-start links as blocking dependencies. Other link types SHALL become related links. The timeline SHALL then show the imported tasks and links. Tier: V1. + +#### Scenario: The owner imports the plan and sees it on the timeline + +- **GIVEN** the previewed plan with the phase "Ruwbouw" containing "Fundering" (1 to 12 March 2027) followed finish-to-start by "Metselwerk" +- **WHEN** the owner chooses "Import" +- **THEN** the project has a phase "Ruwbouw" with the tasks "Fundering" and "Metselwerk" in it +- **AND** the timeline shows "Fundering" from 1 to 12 March 2027 with an arrow to "Metselwerk" + +### Requirement: The import refuses unsafe or oversized files + +The system MUST refuse a file that declares a DOCTYPE or external entities, a file larger than 10 MB, and a plan with more than 2,000 tasks, before any mapping, and SHALL say why. A binary `.mpp` file SHALL be refused with the hint to save the plan as XML in Microsoft Project. Tier: V1. + +#### Scenario: An mpp file is refused with a hint + +- **GIVEN** the project owner in the import dialog +- **WHEN** they select "planning.mpp" +- **THEN** the dialog says "Save the plan in Microsoft Project with File, Save as, XML format, and import that file." + +### Requirement: Importing a newer version updates the earlier import + +When a plan is imported into a project that already holds objects from an earlier import of the same plan, the system MUST update the objects whose Microsoft Project task UID matches, create the new ones, and list, without deleting them, the objects whose UID is no longer in the file. Running the same import twice SHALL create no duplicates. Tier: V1. + +#### Scenario: A newer plan moves a task instead of duplicating it +@e2e exclude Needs two versions of one plan in one run; asserted by ProjectImportControllerTest::testReimportUpdatesMatchedTasks + +- **GIVEN** a project with "Fundering" imported earlier from 1 to 12 March 2027 +- **WHEN** the owner imports the contractor's new version where "Fundering" runs 8 to 19 March 2027 +- **THEN** the same "Fundering" task now runs from 8 to 19 March 2027 and there is only one "Fundering" + +#### Scenario: A task dropped from the plan is listed, not deleted +@e2e exclude Needs two versions of one plan in one run; asserted by ProjectImportControllerTest::testReimportListsMissingTasks + +- **GIVEN** a project with an imported task "Asbestsanering" +- **WHEN** the owner imports a newer file without it +- **THEN** the result lists "Asbestsanering" under "No longer in the plan" +- **AND** the task still exists diff --git a/openspec/changes/archive/2026-09-29-integration-msproject-import/tasks.md b/openspec/changes/archive/2026-09-29-integration-msproject-import/tasks.md new file mode 100644 index 00000000..c2e37346 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-integration-msproject-import/tasks.md @@ -0,0 +1,21 @@ +# Tasks: integration-msproject-import + +## 1. Parser and mapping + +- [x] 1.1 `MsProjectImportService::parse()` with XML hardening and the size and task caps. Verify: PHPUnit `MsProjectImportServiceTest::testRejectsDoctype`, `testRejectsExternalEntity`, `testRejectsOverTwoThousandTasks`, `testMppIsRefusedWithHint` and `testParsesSampleContractorPlan` (a fixture exported from Project in `tests/fixtures/msproject/`). +- [x] 1.2 The mapping of Decision 2 as a pure function returning objects and losses. Verify: PHPUnit `MsProjectImportServiceTest::testSummaryLevelOneBecomesPhase`, `testDeepLevelsCollapseToOneSubtaskLevel`, `testMilestoneMapping`, `testProgressSetsStatus`, `testFinishToStartBecomesBlocks`, `testOtherLinkTypesBecomeRelates` and `testLossesAreCounted`. +- [x] 1.3 Declared `metadata` object on `projectPhase` and a schema version bump. Verify: PHPUnit `PlanninqRegisterSchemaTest::testPhaseHasMetadata`. + +## 2. Endpoints + +- [x] 2.1 `ProjectImportController` preview and commit routes with the owner-or-admin check. Verify: PHPUnit `ProjectImportControllerTest::testMemberWhoIsNotOwnerIsRefused`, `testPreviewWritesNothing` and `testCommitCreatesPhasesTasksAndLinks`; hydra gates `route-auth`, `no-admin-idor` and `route-reachability` pass. +- [x] 2.2 Re-import by UID. Verify: PHPUnit `ProjectImportControllerTest::testReimportUpdatesMatchedTasks`, `testReimportListsMissingTasks` and `testRerunAfterFailureCreatesNoDuplicates`. + +## 3. Timeline + +- [x] 3.1 "Import from Microsoft Project" in the timeline header for the owner and `src/dialogs/MsProjectImportDialog.vue`. Verify: Playwright `tests/e2e/msproject-import.spec.ts` "owner previews a contractor plan", "owner imports it and sees it on the timeline" and "member who is not the owner sees no import button" (the e2e suite runs as the admin only, so this one is the vitest case "offers the import to the owner and to an admin only"). + +## 4. Verification + +- [x] 4.1 `openspec validate integration-msproject-import --type change --strict` passes. +- [x] 4.2 Every scenario in specs/ is covered by a test named in the task above it, or carries an `@e2e exclude ` note. diff --git a/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/design.md b/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/design.md new file mode 100644 index 00000000..1e8c38a3 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/design.md @@ -0,0 +1,64 @@ +# Design: put the dependency editor and the blocked badge where people can reach them + +## Context + +Read at development `de35541`: + +- `src/components/TaskDependencies.vue` takes props `task` and `projectTasks` + (`:108-120`), renders "Blocked by", "Blocks", a same-project `NcSelect` picker and an inline + error (`:1-76`), and calls `createEdge(selected.id, taskId)` (`:271`). No file imports it. +- `src/components/BlockedBadge.vue` takes `blocked` and `openBlockerCount`. No file imports it. +- `src/utils/taskHelpers.js:105` `isBlocked`, `:134` `deriveBlockedTaskIds`, `:160` + `openBlockerIds`, `:184` `dependencyPickerCandidates`: exported, only used by the unmounted + component. +- `src/store/dependencies.js:42` `fetchEdges`, `:81` `createEdge(blocker, blocked)` posting to + `/apps/planninq/api/dependencies`, `:112` `deleteEdge`. +- `lib/Service/DependencyService.php:112` `create(blocker, blocked)` and `:215` + `assertEdgeIsValid` (self, duplicate, cross-project, cycle via `DependencyGraph`). +- Schema `dependency`: `blocker`, `blocked`, `type` enum; authorization create, update and delete + are admin-only, so writes go through `DependencyController` after its membership check. +- `src/views/ProjectTimeline.vue:86` draws `edgeLines` from the timeline payload's dependencies. +- `openspec/specs/task-dependencies/spec.md` carries the requirements with `@e2e exclude` notes + saying the render layer is not built. + +## Goals / non-goals + +Goals: every dependency scenario in the main spec reachable and tested end to end; non-blocking +links. Non-goals: new validation rules, automatic rescheduling, merging. + +## Decisions + +### Decision 1: mount the existing component, do not rebuild it + +TaskDetail loads the project's tasks and edges on mount and renders `` below the +fields, passing `task` and `projectTasks`. The component already handles the picker, removal and +the inline server error. + +### Decision 2: the board derives blocked ids once + +ProjectBoard calls `fetchEdges` with the project's tasks, computes `deriveBlockedTaskIds` once per +render, and passes `blocked` and the open blocker count to each `TaskCard`, which renders +`BlockedBadge`. The badge never gates a move (main spec, "Blocked task can still be moved"). + +### Decision 3: a type on the link + +The picker gains a type choice: "Blocked by" (default), "Relates to", "Duplicates". The store posts +`type`; `DependencyController` passes it on; `DependencyService::create` accepts it, runs the cycle +check for `blocks` only, and stores it. The section lists related links in their own group. Old +edges without a type are read as `blocks`. + +### Decision 4: replace the e2e excludes with tests + +Playwright tests in `tests/e2e/` cover adding, removing, a refused cycle, the badge appearing and +clearing, and the timeline arrow. The `@e2e exclude` notes in the main spec are replaced when this +change is archived. + +## Risks / trade-offs + +- [An extra edges request per board] -> one request per board load; edges are small. + +## Built at HEAD (29 Sep 2026) + +- The picker offers "Blocked by", "Relates to" and "Duplicates"; `DependencyService::create()` takes the type, refuses a type the schema does not name, and runs the cycle check for `blocks` only. A related link is stored with this task as `blocker` and the picked task as `blocked`; the direction carries no meaning for a non-blocking link. +- `fetchEdges()` read one page of 20 links and dropped `type`; it now asks for 1000 and keeps the type, so a busy instance no longer loses links on the task page and the board. +- The timeline e2e sits in `tests/e2e/task-dependencies.spec.ts` with the other link tests. Draft PR #641 (blocked badge and filter) was untouched since 23 Sep; this change supersedes its badge. diff --git a/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/proposal.md b/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/proposal.md new file mode 100644 index 00000000..95d6a7a1 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/proposal.md @@ -0,0 +1,141 @@ +--- +kind: code +--- + +# Put the dependency editor and the blocked badge where people can reach them + +## Why + +Task dependencies were specified and built in June (archived change +`2026-06-14-task-dependencies`), and no user can use them. The editor +`src/components/TaskDependencies.vue` (picker, blocked banner, remove buttons) is imported by no +view, and `src/views/TaskDetail.vue` has no Dependencies section. The badge +`src/components/BlockedBadge.vue` and the helpers that derive it (`isBlocked`, +`deriveBlockedTaskIds` in `src/utils/taskHelpers.js:105,134`) have no caller either. The server +side is complete: `lib/Service/DependencyService.php` refuses self, duplicate, cross-project and +cyclic links. The timeline draws arrows for stored links (`src/views/ProjectTimeline.vue:86`), +but only seeded demo data ever has one. + +The main spec still excludes every end-to-end test with "task-detail render layer not yet built" +(`openspec/specs/task-dependencies/spec.md`). The change shipped without the capability, so this +change finishes it. + +Teams also need a link that does not block: "relates to" and "duplicates". The schema has the +types (`blocks`, `relates`, `duplicates`, `clones`, `splits`, `causes`), but the store only posts +`blocker` and `blocked` (`src/store/dependencies.js:81-100`), so every link is a block. + +Parity rows: `pln-dependencies`, `pln-dep-validation`, `pln-blocked-badge`, +`pln-deps-on-timeline`, `tsk-related-links` in planninq's `openspec/parity/capabilities.json`. +Decision: build. `pln-dependencies` has five competitors yes and `tsk-related-links` four; +`pln-deps-on-timeline` is rated partial with two competitors yes on the missing half (creating a +link); `pln-dep-validation` and `pln-blocked-badge` were specified by the archived change and +never reached a user, which the pass rule treats as build. + +## What changes + +- The task page shows a Dependencies section: blocked by, blocks, and related links, with a + picker to add and a button to remove. +- A refused link (itself, a duplicate, another project, a cycle) shows the server's reason inline. +- Board cards and backlog rows show a Blocked badge while any blocker is unfinished. +- A member adds a non-blocking link: "relates to" or "duplicates". +- A link made on the task page shows as an arrow on the project timeline. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `pln-dependencies`, `pln-dep-validation`, `pln-blocked-badge`, `pln-deps-on-timeline`, `tsk-related-links`. + +### `pln-dependencies`: Mark a task as blocked by another task. + +- Area `planning`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "src/components/TaskDependencies.vue (full picker/add/remove UI) -> src/store/dependencies.js:81 createEdge -> lib/Service/DependencyService.php:112 create(); but src/views/TaskDetail.vue never imports or mounts TaskDependencies (grep of src/ finds no importer)" +- Defect: "src/components/TaskDependencies.vue: complete component (picker, blocked banner, remove buttons) with no importer anywhere in src/" +- Defect: "src/views/TaskDetail.vue: has no Dependencies section and does not import TaskDependencies.vue" +- Note: "the UI component and backend are fully built, but the component is never wired into any page, so a user has no way to mark a dependency." +- Demand: none recorded on the row. +- Competitors rated yes (5): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/menu-tree.md card Details 'dependent cards' ; _round4/compare/promoted-rows-batch6.md 2.26 'card dependencies (card_api#assignDependentCard, appinfo/routes.php:111, table oc_deck_dependent_cards)' ; source read at v1.19.0: src/components/card/DependentCardsSelector.vue:6 'Assign dependent cards', :56 'Add dependent card', mounted at src/components/card/CardSidebarTabDetails.vue:29-32; lib/Controller/CardController.php:136 assignDependentCard, lib/Service/CardService.php:688, lib/Db/CardMapper.php:673 table deck_dependent_cards" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/M1-column.md 2.10 relation.rb eleven typed entries; 8.9 'a follows relation with lag ... moves a successor'; blocks/blocked by among them ; source read at v17.8.0: app/models/relation.rb:36-39 precedes, follows, blocks, blocked types; app/components/work_package_relations_tab/index_component.rb:160-162 add relation menu per type; app/contracts/relations/base_contract.rb:39-43 relation validation" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §2 IssueRelationChoices includes blocked_by with pair 'blocking' (issue.py:272-290) ; source read at v1.4.2: apps/web/core/components/relations/index.tsx:27 blocked_by option in the relation menu; apps/api/plane/app/urls/issue.py:236 issue-relation route; apps/api/plane/db/models/issue.py:275 BLOCKED_BY and :284 blocked_by paired with blocking" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/journeys.md 4 'createTaskLink(3, 2, link 2 "blocks") and getAllTaskLinks(2) returned the same link as "is blocked by" from the other side' ; source read at v1.2.54: app/Schema/Sqlite.php:962-963 'blocks' and 'is blocked by' link pair; app/Template/task/sidebar.php:48 'Add internal link'; app/Model/TaskLinkModel.php:166 create writes both sides" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html, https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html): "corpus: jira-data-center/round4/M1-column.md 2.10 'An issue may block another' (Linking issues); docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'Dependencies in Advanced Roadmaps indicate which issues are contingent on others being completed first' (corpus 8.8) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html 'An issue may block another'; https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'Dependencies in Advanced Roadmaps indicate which issues are contingent on others being completed first' (read 2026-09-26)" + +### `pln-dep-validation`: Be stopped from creating a circular, duplicate or self dependency. + +- Area `planning`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "lib/Service/DependencyService.php:112-236 assertDistinctTasks/assertEdgeIsValid/DependencyGraph::cyclePath fully implement self/duplicate/cross-project/cycle checks, surfaced by src/components/TaskDependencies.vue:73 (errorMessage)" +- Defect: "src/components/TaskDependencies.vue: the only caller of dependencies.js createEdge/deleteEdge, and it is never imported (see pln-dependencies)" +- Note: "server-side validation is real and thorough, but since the only UI that calls createEdge is never mounted, no user can trigger it." +- Demand: none recorded on the row. +- Competitors rated yes (1): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "source: opf/openproject HEAD 27a58131 (18.0.0-dev): config/locales/en.yml:555 'circular_dependency: This relation would create a circular dependency.' and :851 'The relationship creates a circle of relationships'; corpus: openproject/round4/M1-column.md 2.10 relations normalised by 'before_validation :reverse_if_needed' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/contracts/relations/base_contract.rb:67-68 adds 'circular_dependency' when :99-100 the target is not in WorkPackage.relatable; app/models/work_packages/scopes/relatable.rb:178 relatable excludes cycles; app/models/relation.rb:137 uniqueness of to per from blocks duplicates; ... (shortened; full text in the matrix row)" + +### `pln-blocked-badge`: See at a glance which tasks are blocked by unfinished work. + +- Area `planning`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "src/components/BlockedBadge.vue (renders isBlocked() result) and src/utils/taskHelpers.js:105 isBlocked() / :135 blockedTaskIds() exist, but grep across src/ finds no importer of BlockedBadge.vue and no caller of isBlocked()/blockedTaskIds() anywhere" +- Defect: "src/components/BlockedBadge.vue: defined, never imported by any view or component" +- Defect: "src/utils/taskHelpers.js:105 isBlocked() and :135 blockedTaskIds(): exported, never called outside their own file" +- Note: "ProjectBoard.vue and TaskCard.vue import taskHelpers.js for other things (groupTasksByStatus, dueDateStatus) but never isBlocked/blockedTaskIds, so no card or list anywhere shows a blocked badge." +- Demand: none recorded on the row. +- Competitors rated yes: none. + +### `pln-deps-on-timeline`: See dependency links drawn on the timeline. + +- Area `planning`. Planninq is rated `partial`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "src/views/ProjectTimeline.vue:71-95 (edgeLines svg) <- src/utils/timelineHelpers.js buildLayout() consumes payload.dependencies from src/api/timeline.js:35" +- Defect: "src/components/TaskDependencies.vue: not mounted anywhere, so no real edge ever reaches the timeline outside seeded demo data" +- Note: "the timeline correctly draws arrows for whatever dependency edges exist, but the only UI that creates edges (TaskDependencies.vue) is dead code (see pln-dependencies), so in practice a user cannot produce a dependency for the timeline to show." +- Demand: none recorded on the row. +- Competitors rated yes (2): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart/scheduling/README.md:15 'To add dependencies between work packages, you can set them as predecessor or successor in the Gantt chart' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-table/timeline/global-elements/wp-timeline-relations.directive.ts:39-43 draws TimelineRelationElement lines from WorkPackageRelationsService; app/models/relation.rb:36-37 precedes and follows" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'dependent issues will have numbered badges at either end of the schedule bar based on dependency type' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/dependencies-in-advanced-roadmaps-1044784190.html 'On your timeline, dependent issues will have numbered badges at either end of the schedule bar based on dependency type' (read 2026-09-26)" + +### `tsk-related-links`: Link related tasks to each other without one blocking the other. + +- Area `tasks`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "The dependency schema declares a non-blocking 'type' enum (blocks/relates/duplicates/clones/splits/causes, lib/Settings/planninq_register.json dependency.properties.type), but src/store/dependencies.js:81-100 createEdge() only ever POSTs {blocker, blocked} with no type, so the server always defaults to 'blocks'. Worse, the only component that could create any edge, src/components/TaskDependencies.vue, is never imported by any other file in src/ (grep across src/ finds it only in its own file), ... (shortened; full text in the matrix row)" +- Defect: "src/components/TaskDependencies.vue is never imported/mounted by any view or component in src/, a full dependency-editing UI with no caller" +- Defect: "src/components/BlockedBadge.vue is likewise never imported/mounted anywhere in src/" +- Defect: "src/store/dependencies.js:81 createEdge() has no `type` parameter, so even if wired up it could never create the non-blocking 'relates'/'duplicates'/etc edges the schema declares" +- Demand: none recorded on the row. +- Competitors rated yes (4): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/M1-column.md 2.10 'Relations are app/models/relation.rb:31 with eleven typed entries' (relates to among them) ; source read at v17.8.0: app/models/relation.rb:35 TYPE_RELATES and :55-57 'related to' among the typed relations, non-scheduling; app/components/work_package_relations_tab/index_component.rb:160-162 add relation menu per type; config/locales/en.yml:3609 'related to'" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §2 IssueRelationChoices 'duplicate, relates_to, blocked_by, ...' ; source read at v1.4.2: apps/web/core/components/issues/issue-detail-widgets/relations/quick-action-button.tsx:38-40 opens the relation modal; apps/web/core/components/relations/index.tsx:13-14 relates_to option; apps/api/plane/app/urls/issue.py:236 issue-relation route; apps/api/plane/db/models/issue.py:272-274 IssueRelationChoices RELATES_TO" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/_round4/compare/promoted-rows-batch7.md 2.26 'links holds label pairs with opposite_id (11 shipped: relates to, blocks / is blocked by ...)' ; source read at v1.2.54: app/Template/task/sidebar.php:48 'Add internal link'; app/Template/task_internal_link/create.php:10-13 label and task; app/Schema/Sqlite.php:961 seeds 'relates to'; app/Controller/TaskInternalLinkController.php:48 save" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html): "corpus: jira-data-center/round4/M1-column.md 2.10 'An issue may relate to another. An issue may duplicate another. An issue may block another' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/linking-issues-939938934.html 'An issue may relate to another. An issue may duplicate another. An issue may block another' (read 2026-09-26)" + +## Scope + +### In scope + +- Mounting `TaskDependencies.vue` on TaskDetail and `BlockedBadge.vue` on TaskCard. +- Loading the project's edges once per board and per task page. +- `relates` and `duplicates` link types through the existing endpoint. +- End-to-end tests for the scenarios the main spec excludes today. + +### Out of scope + +- `clones`, `splits` and `causes`: the schema keeps them for imports; the picker offers the two + types the rows ask for. +- Merging duplicates (row `tsk-merge`, deferred). +- Moving dependent dates automatically: `planning-timeline-editing`. + +## Impact + +- `src/views/TaskDetail.vue`, `src/views/ProjectBoard.vue`, `src/components/TaskCard.vue`, + `src/components/TaskDependencies.vue`, `src/store/dependencies.js`, + `lib/Controller/DependencyController.php` and `lib/Service/DependencyService.php` (accept + `type`), `tests/e2e/`, `l10n/`. +- Depends on: nothing. `tasks-create-edit-delete` makes it easier to create the tasks to link. + +## Risks + +### Risk 1: A non-blocking link counts as blocking +**Severity**: Medium +**Mitigation**: the blocked derivation filters on `type === 'blocks'` (and a missing type, for +old edges); a vitest case covers a `relates` edge. + +### Risk 2: The cycle check runs on related links +**Severity**: Low +**Mitigation**: cycle and ordering checks apply to `blocks` only; `relates` and `duplicates` get the +self and duplicate checks only. diff --git a/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/specs/task-dependencies/spec.md b/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/specs/task-dependencies/spec.md new file mode 100644 index 00000000..c46f74f5 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/specs/task-dependencies/spec.md @@ -0,0 +1,61 @@ +# task-dependencies delta for planning-dependencies-on-task-page + +## ADDED Requirements + +### Requirement: The task page carries the dependency editor + +The system MUST show a Dependencies section on every task page with the task's blockers, the +tasks it blocks and its related links, a picker limited to tasks of the same project, and a +remove button per link. A link the server refuses MUST show the server's reason next to the +picker. Tier: V1 (docs/FEATURES.md). + +#### Scenario: Add a blocker from the task page + +- **GIVEN** tasks "Deploy" and "Fix login" in one project, and a member on the task page of "Deploy" +- **WHEN** they pick "Fix login" under "Blocked by" and choose Add +- **THEN** "Deploy" lists "Fix login" under "Blocked by" +- **AND** the task page of "Fix login" lists "Deploy" under "Blocks" + +#### Scenario: A cycle is refused on the page + +- **GIVEN** "Deploy" is blocked by "Fix login" +- **WHEN** a member on the task page of "Fix login" adds "Deploy" under "Blocked by" +- **THEN** the page shows the server's message naming the cycle +- **AND** no link is stored + +### Requirement: Board cards show the blocked badge + +The system MUST show a Blocked badge on a board card while at least one of its blockers is not +done or cancelled, with the number of open blockers in its accessible name, and MUST remove it +once all blockers are finished. Tier: V1. + +#### Scenario: The badge appears and clears + +- **GIVEN** "Deploy" is blocked by "Fix login", which is in progress +- **WHEN** a member opens the board +- **THEN** the "Deploy" card shows the Blocked badge +- **AND** after "Fix login" moves to Done the badge is gone + +### Requirement: A member can link related tasks without blocking + +The system MUST let a project member link two tasks of the same project as "relates to" or +"duplicates". Such a link MUST NOT make either task blocked and MUST NOT take part in the cycle +check. Tier: V1. + +#### Scenario: Link two related tasks + +- **GIVEN** tasks "Update the form" and "Update the manual" in one project +- **WHEN** a member on the first task's page adds the second as "Relates to" +- **THEN** both task pages list the other under "Related" +- **AND** neither card shows a Blocked badge + +### Requirement: A link made on the task page shows on the timeline + +The system MUST draw a blocking link created on the task page as an arrow on the project timeline +between the two tasks' bars. Tier: V1. + +#### Scenario: Arrow on the timeline + +- **GIVEN** a member made "Fix login" block "Deploy" on the task page, and both tasks have dates +- **WHEN** they open /projects/:id/timeline +- **THEN** an arrow runs from the "Fix login" bar to the "Deploy" bar diff --git a/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/tasks.md b/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/tasks.md new file mode 100644 index 00000000..c0ce611a --- /dev/null +++ b/openspec/changes/archive/2026-09-29-planning-dependencies-on-task-page/tasks.md @@ -0,0 +1,24 @@ +# Tasks: planning-dependencies-on-task-page + +## 1. Task page + +- [x] 1.1 Mount `TaskDependencies.vue` on `src/views/TaskDetail.vue` with the project's tasks and edges. Verify: `tests/e2e/task-dependencies.spec.ts` "add a blocked by link, see it on both tasks, and remove it". +- [x] 1.2 Show a refused link's reason inline. Verify: `tests/e2e/task-dependencies.spec.ts` "a cycle is refused with the server message". + +## 2. Board + +- [x] 2.1 Load edges in `src/views/ProjectBoard.vue`, derive blocked ids once, and render `BlockedBadge` in `src/components/TaskCard.vue`. Verify: `tests/e2e/task-dependencies.spec.ts` "a blocked task shows a badge on the board until its blocker is done". + +## 3. Link types + +- [x] 3.1 Accept `type` in `DependencyController` and `DependencyService::create`; cycle check for `blocks` only. Verify: `tests/unit/Service/DependencyServiceTest.php::testCreateStoresARelatedLinkWithoutACycleCheck` and `testCreateChecksBlockingLinksAndRefusesAnUnknownType`. +- [x] 3.2 Type choice in the picker, a "Related" group in the section, and `blocks`-only derivation in `src/utils/taskHelpers.js`. Verify: `tests/vitest/taskDependencies.spec.js` linkGroups cases ("a related link does not block"). + +## 4. Timeline + +- [x] 4.1 A Playwright e2e creates a link on the task page and sees the arrow on /projects/:id/timeline. Verify: `tests/e2e/task-dependencies.spec.ts` "a related link does not block, and a link shows on the timeline" (kept with the other link tests). + +## 5. Copy and verification + +- [x] 5.1 New strings in every locale the app ships. Verify: `npm run check:l10n` exits 0. +- [x] 5.2 `openspec validate planning-dependencies-on-task-page --type change --strict` passes. diff --git a/openspec/changes/archive/2026-09-29-planning-phase-gate-document/design.md b/openspec/changes/archive/2026-09-29-planning-phase-gate-document/design.md new file mode 100644 index 00000000..6c51d4bc --- /dev/null +++ b/openspec/changes/archive/2026-09-29-planning-phase-gate-document/design.md @@ -0,0 +1,62 @@ +# Design: close a project phase only once its concluding document is uploaded + +## Context + +What exists at de35541: + +- `projectPhase` (`lib/Settings/planninq_register.json:584-752`): `title` and `project` required; `description`, `status` (`open`, `in_progress`, `completed`, `cancelled`, default `open`, `:708-718`), `order`, `billable`, `budgetHours`, `startDate`, `endDate`. Its authorization block (`:596-690`) grants read, create, update and delete to members of the referenced project and to admins. There is no lifecycle declaration, so any member can PATCH `status: completed` at any time. +- `task.phase` (`:220-227`) lets a task name the phase it delivers. The shipped requirement "A project may be broken into phases" (`openspec/specs/project-delivery/spec.md:53-78`) covers the schema only. +- No view, store action or component reads phases. The only hit for "phase" in `src/` is a comment (`src/App.vue:122`). +- Files on an object: the task detail page shows an Attachments tab through `CnObjectSidebar` over OpenRegister's per-object files API, with no planninq PHP (`src/views/TaskDetail.vue:124-137`, props from `taskCollaborationSidebarConfig` in `src/utils/taskHelpers.js`). +- The register asks for `"openregister": "^v0.2.10"` (`lib/Settings/planninq_register.json:11`). +- OpenRegister (read at 63ddfd5, `openspec/specs/object-lifecycle/spec.md`, requirement "Direct lifecycle-field edits guarded on update") supports a schema annotation `x-openregister-lifecycle` with a `field`, an `initial` value and `transitions`, each with a `from` list and a `to` value and optionally a `requires` tag. On every update through `saveObject()`, its `LifecycleValidationListener` rejects a change of the lifecycle field that no transition allows (HTTP 422) and, when the matched transition has a `requires` tag, resolves a guard registered under that tag and runs its `check()`; a deny becomes HTTP 403 with the guard's message. Guards implement `OCA\OpenRegister\Lifecycle\LifecycleGuardInterface` (`check(array $object, string $action, string $userId): GuardResult`), must not mutate the object, and are registered with `registerService()` under the tag; a missing tag fails closed. + +What is missing: any screen for phases, a place for phase documents, and the rule. + +## Goals / non-goals + +Goals: +- Project members manage phases and their documents where they manage the project. +- "No concluding document, no closed phase", enforced by OpenRegister for every client. + +Non-goals: +- Approval of the document's content, phase templates, phases on the timeline. + +## Decisions + +### Decision 1: the rule is declared on the schema, the check is a planninq guard +`projectPhase` gets an `x-openregister-lifecycle` block on `status` with `initial: open` and transitions: open to in_progress; open or in_progress to completed with `requires: planninq.phase.concludingDocument`; open or in_progress to cancelled; completed or cancelled back to in_progress (reopen). `lib/Lifecycle/PhaseConcludingDocumentGuard.php` implements `LifecycleGuardInterface` and is registered in `lib/AppInfo/Application.php` under that tag. This follows ADR-031: the rule lives on the schema and OpenRegister enforces it, so the page, the API and any other client get the same answer. The alternatives were a check in the Vue store (bypassed by any direct PATCH) or a planninq controller for "close phase" (a pass-through the object API makes redundant, and still bypassable, ADR-022). + +### Decision 2: what the guard checks +Allow when `concludingDocument` on the incoming phase data is non-empty and a file with that id is attached to this phase object; deny otherwise with the message "Upload the concluding document before you close this phase." The file lookup goes through OpenRegister's object file service, read-only. The guard never writes. + +### Decision 3: documents are files on the phase object +Phase documents are uploaded to the phase through the same OpenRegister per-object files API the task Attachments tab uses, so they live in the register's Nextcloud folder, carry Nextcloud file permissions and show up in the phase's audit trail. `concludingDocument` (nullable string, the file id) marks which one concludes the phase. No new storage and no copy of the file. + +### Decision 4: a phases page per project +A new custom page `ProjectPhases` at `/projects/:id/phases` (manifest entry and `src/registry.js`), reached by a "Phases" button in the project board header next to Backlog and Timeline (`src/views/ProjectBoard.vue:41-55`). It lists the project's phases in `order` with status, dates, budget hours and the concluding document when there is one; "Add phase" and "Edit" open `PhaseEditDialog`; "Move up" and "Move down" reorder with the keyboard. Selecting a phase opens `CnObjectSidebar` for it with Files, Notes and Audit trail tabs. Placement is Projecten > project (ADR-001), not a menu. + +### Decision 5: closing is one dialog +"Close phase" opens `PhaseCloseDialog`. It lists the phase's files, lets the member upload one, asks them to pick the concluding document, then sends one PATCH with `concludingDocument` and `status: completed`. If OpenRegister answers 403 from the guard, the dialog shows the guard's message and stays open. The "Close phase" button is not hidden when no file exists: the dialog explains what is needed, which is clearer than a missing button. + +### Decision 6: the OpenRegister minimum version moves up +The register's `openregister` constraint rises to the first release that ships the lifecycle update guard with `requires` tags. A PHPUnit test asserts that the constraint and the lifecycle block ship together. + +## Risks / trade-offs + +- [Writes that skip `saveObject()`] -> OpenRegister's own spec names this; planninq writes only through the object API and `ObjectService::saveObject`. +- [A completed phase loses its file later] -> The page flags "Concluding document missing"; the audit trail shows the removal. +- [Seed or imported phases already `completed` without a document] -> The guard runs only on a change of `status`, so existing rows are not rejected on unrelated edits; the page flags them. + +## Open questions + +- The exact key OpenRegister's annotation validator expects for a transition's action name is read from its `object-lifecycle` spec at implementation time; this design only fixes the states, the `from`/`to` pairs and the guard tag. + +## Built at HEAD (29 Sep 2026) + +The code at `a9cd351` and OpenRegister at its current development settled four points this design left open. + +- **The guard is named by its class, not a tag.** OpenRegister's `LifecycleGuardRegistry` resolves `requires` from its own container, then from the server container. A plain tag such as `planninq.phase.concludingDocument` resolves in neither and fails closed on every close. The `complete` transition therefore names `OCA\Planninq\Lifecycle\PhaseConcludingDocumentGuard`, which the server container autowires from planninq, as OpenRegister's own `DenialFinaliseGuard` is named. Nothing is registered in `Application.php`. +- **The transitions are named** `start`, `complete` (with `requires`), `cancel` and `reopen`; `final` lists completed and cancelled. OpenRegister's `LifecycleAnnotationValidator` (origin/development) returns no finding for the block, and one for a control with an undeclared `to` state. +- **The OpenRegister constraint** becomes `>=v1.1.7`, the first plain release tag that carries `LifecycleGuardInterface` and the `requires` step in `LifecycleValidationListener`. OpenRegister stores the constraint and does not enforce it; a caret range would have excluded the 2.x line the fleet runs. +- **The page is reached from the Phases tab**, not a board-header button: since `projects-overview-logs-risks` every project page shares one row of tabs (`ProjectTabs`), and a board-header button would be a second way in. The close dialog shows the guard's refusal as the translated sentence for the code `lifecycle-guard-denied`, not OpenRegister's English message. diff --git a/openspec/changes/archive/2026-09-29-planning-phase-gate-document/proposal.md b/openspec/changes/archive/2026-09-29-planning-phase-gate-document/proposal.md new file mode 100644 index 00000000..8481c351 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-planning-phase-gate-document/proposal.md @@ -0,0 +1,75 @@ +--- +kind: code +--- + +# Close a project phase only once its concluding document is uploaded + +## Why + +A project leader cannot close a phase against a document, because planninq has no phase screen at all. The register declares `projectPhase` (`lib/Settings/planninq_register.json:584-752`) with a title, a status (`open`, `in_progress`, `completed`, `cancelled`), an order, a budget and planned dates, and the task schema can point at a phase (`task.phase`, `:220-227`). No page lists phases, no store action reads them (`grep -rn phase src` hits only an unrelated comment in `src/App.vue:122`), and nothing stops a phase from being marked `completed` through the OpenRegister API with nothing uploaded. + +Gemeente Sittard-Geleen asked for exactly this in its tender for a project management tool: TenderNed 365739 (published 2025-01-31), requirement 4130, a wish: closing a phase depends on uploading a phase document ("faseafsluiting afhankelijk van het uploaden van een fasedocument"). No competitor in the matrix is rated yes; the demand is the tender. + +Parity rows: `pln-phase-gate-document` in planninq's `openspec/parity/capabilities.json`. +Decision: build, because a public tender asks for it and the phase schema it needs already exists without any screen. + +This change extends the shipped capability `project-delivery` ("A project may be broken into phases", `openspec/specs/project-delivery/spec.md:53-78`) through a new capability, `project-phases`. + +## What changes + +- A project member can see, add, edit and reorder the phases of a project on a phases page. +- A project member can upload documents to a phase and mark one as the phase's concluding document. +- Nobody can move a phase to completed without a concluding document. The rule holds on the page and on the OpenRegister API, because it is declared on the schema and checked by OpenRegister. +- The phase shows its concluding document, and its audit trail shows who closed it and when. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `pln-phase-gate-document`. + +### `pln-phase-gate-document`: Close a project phase only once the document that concludes it has been uploaded. + +- Area `planning`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "Schema only: lib/Settings/planninq_register.json:584-760 declares projectPhase (title, status open/in_progress/completed/cancelled, order, budget). grep for 'projectPhase' and 'phase' across src/ finds nothing but an unrelated comment in src/App.vue:122. No page lists phases and no guard checks for a concluding document." +- Note: "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirement 4130, wish (faseafsluiting afhankelijk van het uploaden van een fasedocument)." +- Demand (tender, via origin): https://www.tenderned.nl/aankondigingen/overzicht/365739 +- Competitors rated yes: none. + + +## Scope + +### In scope + +- A phases page per project at `/projects/:id/phases`, reached from the project board header. +- Phase documents stored as files on the phase object through OpenRegister's object files API, the same API the task Attachments tab uses. +- A `concludingDocument` reference on `projectPhase` and a close step that sets it. +- A declared lifecycle on `projectPhase` whose transition to `completed` requires a planninq guard that checks the concluding document. + +### Out of scope + +- Approval workflows on a phase (who must sign the document). A guard checks that the document is there, not what it says. +- Phase templates per project type (`projects-templates-shared-workflow`, lane C). +- Gantt bars for phases on the timeline. +- Reopening rules beyond "a project member can reopen a completed phase", which is kept simple and audited. + +## Impact + +- Schema: `projectPhase` gains `concludingDocument` and an `x-openregister-lifecycle` block. +- Backend: a new `lib/Lifecycle/PhaseConcludingDocumentGuard.php` implementing OpenRegister's `LifecycleGuardInterface`, registered in `lib/AppInfo/Application.php` under the tag the schema names. +- Store and views: phase actions in `src/store/projects.js`, a new `ProjectPhases` page (manifest and `src/registry.js`), a Phases button in the `ProjectBoard` header. +- Dialogs: `src/dialogs/PhaseEditDialog.vue`, `src/dialogs/PhaseCloseDialog.vue`. +- OpenRegister: needs a version that ships `x-openregister-lifecycle` with guard tags; the register's `openregister` constraint (`lib/Settings/planninq_register.json:11`) moves up to it. +- Depends on: none of this pass's changes. `projects-overview-logs-risks` (lane C) may later host the phases page as a project tab. + +## Risks + +### Risk 1: the guard is bypassed by a write outside OpenRegister's save path +**Severity**: Medium +**Mitigation**: OpenRegister's lifecycle listener runs on every `saveObject()` update, which is the path the object API, the planninq store and imports through the API take. Its own spec notes that direct mapper writes skip it; planninq has none. + +### Risk 2: an OpenRegister without lifecycle support accepts the transition +**Severity**: Medium +**Mitigation**: the register raises its minimum OpenRegister version, and a PHPUnit test asserts the constraint and the lifecycle block together, so neither can ship without the other. + +### Risk 3: the concluding document is removed after the phase closed +**Severity**: Low +**Mitigation**: the phase keeps `concludingDocument`, and the audit trail records both the close and the file removal. The phases page shows "Concluding document missing" on a completed phase whose file is gone. diff --git a/openspec/changes/archive/2026-09-29-planning-phase-gate-document/specs/project-phases/spec.md b/openspec/changes/archive/2026-09-29-planning-phase-gate-document/specs/project-phases/spec.md new file mode 100644 index 00000000..afd59c51 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-planning-phase-gate-document/specs/project-phases/spec.md @@ -0,0 +1,81 @@ +# project-phases delta for planning-phase-gate-document + +## ADDED Requirements + +### Requirement: A project member can manage the phases of a project + +Each project MUST have a phases page at /projects/:id/phases, reached from the Phases tab in the row of project tabs, that lists the project's phases in order with their status, planned dates and budget hours. A project member SHALL be able to add a phase, edit it and move it up or down with the keyboard. Only members of the project and admins SHALL see its phases. Tier: V1 (docs/FEATURES.md, project management: project milestones). + +#### Scenario: A member opens the phases page from the board + +- **GIVEN** a project member on the project board at /projects/:id +- **WHEN** they press the "Phases" tab +- **THEN** the phases page opens and the tab row marks Phases as the open page + +#### Scenario: A member adds a phase + +- **GIVEN** a project member on the phases page of a project with no phases +- **WHEN** they choose "Add phase", enter "Ontwerp" with planned dates 2026-10-01 to 2026-11-30 and save +- **THEN** a `projectPhase` object for this project exists with status `open` +- **AND** the page lists "Ontwerp" with those dates + +#### Scenario: A member reorders phases with the keyboard + +- **GIVEN** the phases "Ontwerp" then "Realisatie" on the phases page +- **WHEN** a project member focuses "Realisatie" and chooses "Move up" +- **THEN** "Realisatie" is listed first and the phases' `order` values are swapped + +### Requirement: A project member can keep documents on a phase + +A project member MUST be able to upload documents to a phase and see, download and remove them from the phase's side panel. The documents SHALL be stored as files on the phase object through OpenRegister's object files API. Tier: V1. + +#### Scenario: A member uploads a document to a phase + +- **GIVEN** a project member on the phases page +- **WHEN** they select the phase "Ontwerp" and upload "Ontwerpbesluit.pdf" in the Files tab of its side panel +- **THEN** the file is listed on the phase +- **AND** the phase's audit trail records the upload + +### Requirement: A phase can only be completed with a concluding document + +The `projectPhase` schema MUST declare a lifecycle on `status` whose transition to `completed` requires planninq's concluding-document guard, and OpenRegister SHALL reject any update that sets `status` to `completed` unless the phase's `concludingDocument` names a file attached to that phase. The rejection MUST carry the message "Upload the concluding document before you close this phase.". The rule SHALL apply to every client, not only the phases page. Tier: V1. + +#### Scenario: Closing without a document explains what is needed + +- **GIVEN** a project member on the phases page and the phase "Ontwerp" with no files +- **WHEN** they choose "Close phase" and confirm without picking a document +- **THEN** the phase stays `in_progress` +- **AND** the dialog says "Upload the concluding document before you close this phase." + +#### Scenario: Closing with a concluding document completes the phase + +- **GIVEN** the phase "Ontwerp" with the attached file "Ontwerpbesluit.pdf" +- **WHEN** a project member chooses "Close phase", picks "Ontwerpbesluit.pdf" as the concluding document and confirms +- **THEN** the phase has status `completed` and `concludingDocument` names that file +- **AND** the phases page shows "Ontwerpbesluit.pdf" as the phase's concluding document + +#### Scenario: The API refuses a close without a document +@e2e exclude API-level rule with no screen, asserted by the Newman request "phase close without document is refused" and PhaseConcludingDocumentGuardTest::testDeniesWithoutDocument + +- **GIVEN** a project member's client and the phase "Realisatie" with no concluding document +- **WHEN** it sends PATCH /apps/openregister/api/objects/planninq/projectPhase/{id} with `status: completed` +- **THEN** OpenRegister answers 403 with the guard's message +- **AND** the phase's status is unchanged + +#### Scenario: A document that is not on the phase does not count +@e2e exclude API-level rule with no screen, asserted by the Newman request "a file id that is not on the phase does not count" and PhaseConcludingDocumentGuardTest::testDeniesWhenFileIsNotOnThePhase + +- **GIVEN** the phase "Realisatie" and a file attached to a different phase +- **WHEN** a client sets `concludingDocument` to that other file's id and `status` to `completed` +- **THEN** OpenRegister rejects the update + +### Requirement: A completed phase whose document is gone is flagged + +The phases page MUST flag a completed phase whose concluding document is no longer attached to it with the text "Concluding document missing". Tier: V1. + +#### Scenario: A removed concluding document is flagged +@e2e exclude Removing a file needs a second write after the close; asserted by tests/vitest/phases.spec.js "completed phase without its file is flagged" + +- **GIVEN** the completed phase "Ontwerp" whose file "Ontwerpbesluit.pdf" was removed afterwards +- **WHEN** a project member opens the phases page +- **THEN** "Ontwerp" shows "Concluding document missing" diff --git a/openspec/changes/archive/2026-09-29-planning-phase-gate-document/tasks.md b/openspec/changes/archive/2026-09-29-planning-phase-gate-document/tasks.md new file mode 100644 index 00000000..167ee096 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-planning-phase-gate-document/tasks.md @@ -0,0 +1,22 @@ +# Tasks: planning-phase-gate-document + +## 1. Schema and guard + +- [x] 1.1 Add `concludingDocument` (nullable string) and the `x-openregister-lifecycle` block to `projectPhase`, and raise the register's `openregister` constraint. Verify: PHPUnit `PlanninqRegisterSchemaTest::testPhaseLifecycleRequiresConcludingDocumentGuard` asserts the transitions, the `requires` tag on completion and the raised constraint together. +- [x] 1.2 `lib/Lifecycle/PhaseConcludingDocumentGuard.php` implementing `LifecycleGuardInterface`, registered under `planninq.phase.concludingDocument`. Verify: PHPUnit `PhaseConcludingDocumentGuardTest::testDeniesWithoutDocument`, `testDeniesWhenFileIsNotOnThePhase`, `testAllowsWithAttachedDocument` and `testNeverWrites`. +- [x] 1.3 Live check against OpenRegister: PATCH `status: completed` on a phase without a document answers 403 with the guard's message, and with a document answers 200. Verify: Newman requests "phase close without document is refused" and "phase close with document succeeds" in `tests/integration/planninq.postman_collection.json`. + +## 2. Screens + +- [x] 2.1 Phase store actions (`fetchPhases`, `savePhase`, `reorderPhase`, `closePhase`) in `src/store/projects.js`. Verify: vitest `tests/vitest/phases.spec.js` "reorder swaps order values" and "close sends document and status in one write". +- [x] 2.2 `ProjectPhases` page, manifest and registry entries, Phases button on the board, `src/dialogs/PhaseEditDialog.vue`, keyboard reorder. Verify: Playwright `tests/e2e/project-phases.spec.ts` "member adds a phase", "member reorders phases with the keyboard" and "member opens the phases page from the board". +- [x] 2.3 Phase sidebar with Files, Notes and Audit trail tabs. Verify: Playwright `tests/e2e/project-phases.spec.ts` "member uploads a document to a phase". +- [x] 2.4 `src/dialogs/PhaseCloseDialog.vue` (upload, pick the concluding document, close; show the guard's message on 403). Verify: Playwright `tests/e2e/project-phases.spec.ts` "closing without a document explains what is needed" and "closing with a concluding document completes the phase". +- [x] 2.5 "Concluding document missing" flag on completed phases. Verify: vitest `tests/vitest/phases.spec.js` "completed phase without its file is flagged". + +## 3. Verification + +- [x] 3.1 `openspec validate planning-phase-gate-document --type change --strict` passes. +- [x] 3.2 Every scenario in specs/ is covered by a test named in the task above it, or carries an `@e2e exclude ` note. + +Built in one PR (see design, "Built at HEAD"). 1.3 is written as the Newman requests named above plus "attach the concluding document" and "a file id that is not on the phase does not count"; Newman runs nightly, so the live answer (403 without, 200 with) is the PR's live check. 2.3's upload is exercised through the close dialog in the e2e; the sidebar Files tab is OpenRegister's `CnObjectSidebar`. diff --git a/openspec/changes/archive/2026-09-29-platform-demo-data/design.md b/openspec/changes/archive/2026-09-29-platform-demo-data/design.md new file mode 100644 index 00000000..c616e915 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-platform-demo-data/design.md @@ -0,0 +1,47 @@ +# Design: load example data that a user can actually see and try + +## Context + +What exists at de35541: + +- The setup wizard's steps "Load example data?" and "Load the example data" (`src/manifest.json:3-37`) run the `load-demo-data` action through `SetupController`, which calls `DemoDataService::install()` (`lib/Service/DemoDataService.php:202-250`). It reads `lib/Settings/planninq_mock_register.json`, decodes it, and hands it to OpenRegister's `importFromApp` under its own identity `planninq.demo` with `force: true` (`:222-233`). The header states the rule: on demand only, never on install (hydra ADR-111 rule 3). +- The mock descriptor holds 21 objects, three per schema, generated from the schemas by the ADR-111 generator: titles such as "Voorbeeld Title 1", owners such as "Voorbeeld Owner 1", `members: []` on every project (`:135`, `:155`, `:175`), no `id` on any object, references to `00000000-0000-4000-8000-00000000000N` that no object carries, and dependency edges with `blocker` equal to `blocked` (`:69-90`). +- `fetchProjects` keeps only projects whose `members` include the current user (`src/store/projects.js:194-196`); `Boards.vue` and `Portfolio.vue` read the same list. A project with no members is invisible to everyone. +- `DependencyService::assertDistinctTasks` rejects a self edge (`lib/Service/DependencyService.php:153-170`); the import path does not run it. +- The real register file carries 28 objects in `components.objects` (`lib/Settings/planninq_register.json:1169` onward): five labels, three realistic projects ("Client Portal v2", "Infrastructure Migration", "Onboarding Automation") with `owner: admin` and members such as `jdoe` and `ksmits`, twelve columns, five tasks and three time entries by `jdoe` and `ksmits`, with fixed ids and consistent references. The shipped capability `register-schemas` requires these on install ("Seed data loaded on install [MVP]", `openspec/specs/register-schemas/spec.md:99-126`). +- ADR-111 rule 2: demo data is generated from the schema by `generate_mock_register.py`, and "an app that wants curated, domain-true data for a headline schema keeps it: `--keep` tops up only what is short"; `--check` re-validates. + +## Goals / non-goals + +Goals: +- The admin who loads the example sees it on every page and can try every flow with it. +- The example is internally consistent and passes the same rules as real data. +- A fresh install holds configuration only. + +Non-goals: +- Removing example data, cleaning up earlier installs, humaniq-side demo hours. + +## Decisions + +### Decision 1: the realistic sample becomes the demo dataset +The three projects, their columns, tasks and time entries move from `planninq_register.json` into the mock descriptor as curated objects, extended to satisfy ADR-111 rule 1 (at least three per schema): three phases on "Client Portal v2", tasks spread over the projects with `issueType`, priorities and labels, three dependency edges, three time entries. Every object has a fixed `id` and a `demo-` slug, and every reference uses those ids. The generator runs with `--keep` so it keeps these and tops up any schema that is short; `--check` runs in the gates. + +### Decision 2: the loading admin is the example's person +The descriptor writes the placeholder `@operator` wherever a user id belongs: project `owner` and `members`, some tasks' `assignedTo` and `reporter`, and time entries' `user`. `DemoDataService::install()` replaces it with the uid of the admin who runs the step, in memory, before `importFromApp`. Invented accounts are not used, because they do not exist on a customer's instance; a few tasks stay unassigned to show that state. + +### Decision 3: dates are relative to the load day +The descriptor's `x-openregister` block names an `anchorDate`. `install()` shifts every `date` and `date-time` value in the objects by the difference between the anchor and today, so a task due "anchor plus three days" is due three days after loading, one is overdue by two days, and time entries fall in the current week. + +Amended at build: the ADR-111 generator rewrites `info` and `x-openregister` when it runs with `--keep`, so a regeneration drops `anchorDate`. `install()` then keeps the dates as written rather than guessing, and `DemoDatasetTest::testDescriptorNamesItsAnchorAndNoAccount` fails, so the loss cannot ship unnoticed. Without a signed-in user (`install()` called outside a request) the import is refused rather than written with no owner. + +### Decision 4: the demo edges are valid edges +The three dependency objects join different tasks of the same project and form no cycle, the rules `DependencyService` applies on the normal path. A PHPUnit test runs the descriptor through a copy of those rules, because the import path does not. + +### Decision 5: a fresh install seeds only the default labels +`planninq_register.json` keeps the five labels (Bug, Feature, Docs, Design, Infrastructure) in `components.objects` as install defaults: they are configuration a team uses from day one, like the default columns. The requirement "Seed data loaded on install [MVP]" in `register-schemas` is removed and replaced by one that says only these labels are created on install. Instances that already received the sample projects keep them; nothing is deleted. + +## Risks / trade-offs + +- [Existing instances] -> Nothing deleted; only new installs change. +- [Curated data drift] -> `--check` plus the reference test. +- [Placeholder leaking] -> A PHPUnit test asserts no `@operator` survives `install()`'s transformation. diff --git a/openspec/changes/archive/2026-09-29-platform-demo-data/proposal.md b/openspec/changes/archive/2026-09-29-platform-demo-data/proposal.md new file mode 100644 index 00000000..d9ef2adc --- /dev/null +++ b/openspec/changes/archive/2026-09-29-platform-demo-data/proposal.md @@ -0,0 +1,85 @@ +--- +kind: code +--- + +# Load example data that a user can actually see and try + +## Why + +The setup wizard offers "Load example data?", and loading it works (`src/manifest.json:3-37`, `lib/Controller/SetupController.php`, `lib/Service/DemoDataService.php:202-250` importing `lib/Settings/planninq_mock_register.json`). What it loads cannot be used: + +- The three demo projects have `"members": []` (`lib/Settings/planninq_mock_register.json:135`, `:155`, `:175`), and the projects store keeps only projects whose members include the current user (`src/store/projects.js:194-196`). So the example projects appear on no Projects list, no Boards page and no Portfolio, for anyone. +- Every value is a placeholder: "Voorbeeld Title 1", owner "Voorbeeld Owner 1" (`:123-140`). +- Every reference between demo objects points at `00000000-0000-4000-8000-00000000000N`, an id no demo project or task carries, so columns, phases, tasks and time entries hang off nothing. +- The three demo dependency edges have the same task as blocker and blocked (`:69-70`, `:79-80`, `:89-90`), a self-dependency that `DependencyService` refuses on the normal path (`lib/Service/DependencyService.php:153-170`). + +Meanwhile the realistic sample data (three projects with the admin as a member, twelve columns, five tasks, three time entries, five labels) sits in the real register file (`lib/Settings/planninq_register.json:1169` onward), where the ordinary register import seeds it on install. Hydra ADR-111 rule 3 says demo data never installs itself, and `DemoDataService` says the same in its own header. + +Deck, OpenProject, Plane and Jira show a new user a populated example to try. + +Parity rows: `plt-demo-data` in planninq's `openspec/parity/capabilities.json`. +Decision: build, because the loader works but the data it loads is invisible and broken, and four competitors give a new user a working example. + +## What changes + +- Loading the example data gives the admin who loads it three realistic projects they are a member and owner of, with columns, phases, tasks assigned to them, dependencies between different tasks, and logged time. +- Every reference in the example data points at an object the example data contains, and every example object passes its schema and planninq's own rules. +- Due dates and time entries are placed around the day the data is loaded, so boards and My tasks look current instead of months overdue. +- A new install gets the five default labels and nothing else. The sample projects move from the install to the example data. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `plt-demo-data`. + +### `plt-demo-data`: Load demo data to try the app out. + +- Area `platform`. Planninq is rated `partial`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "setup step 'load-demo-data' -> lib/Controller/SetupController.php runAction -> lib/Service/DemoDataService.php:46,202 imports lib/Settings/planninq_mock_register.json" +- Defect: "lib/Settings/planninq_mock_register.json:135,155,175 demo projects have "members": [], so src/store/projects.js:195 filters them out of Projects, Boards and Portfolio for every user (code reading, needs a live check)" +- Defect: "lib/Settings/planninq_mock_register.json:123-140 demo objects are placeholder values ('Voorbeeld Title 1', owner 'Voorbeeld Owner 1') and their project/task references are 00000000-0000-4000-8000-00000000000N, which no demo project carries as its id" +- Defect: "lib/Settings/planninq_mock_register.json:69-70 demo dependency edges have blocker == blocked, a self-dependency lib/Service/DependencyService.php:113 rejects on the normal path" +- Note: "The loader works, but the dataset it loads is generated placeholder data that no page can show: the three projects have members [] so the member filter hides them from everyone, and every task/column points at nil uuids no project carries. The realistic sample data (3 projects with admin as member, 5 tasks, time entries) sits in lib/Settings/planninq_register.json components.objects instead and probably arrives with the ordinary register import, which is the opposite of opt-in (needs a live ... (shortened; full text in the matrix row)" +- Demand: none recorded on the row. +- Competitors rated yes (4): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/menu-tree.md 'All boards Vergunningen r4b6 · Welcome to Nextcloud Deck!' ; source: lib/Service/DefaultBoardService.php and lib/Service/fixtures/default-board.json create a sample board per user ; source read at v1.19.0: lib/Middleware/DefaultBoardMiddleware.php:29-30 on a user's first visit creates 'Welcome to Nextcloud Deck!' from lib/Service/DefaultBoardService.php:66 createDefaultBoard and lib/Service/fixtures/default-board.json:5-16 sample lists and cards, translated at lib/Service/DefaultBoardService.php:78-83; one sample per user, not an admin loader" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "source: opf/openproject HEAD 27a58131 (18.0.0-dev): app/seeders/demo_data_seeder.rb with demo_data/projects_seeder.rb, project_seeder.rb, global_query_seeder.rb; corpus: openproject/round4/install.md 'It self-migrates and self-seeds against an empty database' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/seeders/demo_data_seeder.rb:29-30 DemoDataSeeder with its data seeder classes; app/seeders/demo_data/global_query_seeder.rb and overview_seeder.rb seed demo projects, queries and overviews on a fresh instance" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "source: apps/api/plane/app/views/workspace/base.py:137 workspace_seed.delay on workspace creation, seeds from apps/api/plane/seeds/data (projects, issues, cycles, modules, pages, views, labels, states); corpus: plane/round4/code-census.md §5 cites the seeded dummy data (workspace_seed_task.py:160,163). Automatic, not opt-in ; source read at v1.4.2: apps/api/plane/app/views/workspace/base.py:48,139 workspace create queues workspace_seed; apps/api/plane/bgtasks/workspace_seed_task.py:505 seeds from apps/api/plane/seeds/data/projects.json with issues, cycles, modules, pages, views, labels and states files beside it. Runs on every new workspace, not an opt-in button" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'you can also choose to Create a Scrum board with sample data ... This will base your board on a new project pre-populated with sample data' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'you can also choose to Create a Scrum board with sample data ... This will base your board on a new project pre-populated with sample data' (read 2026-09-26)" + + +## Scope + +### In scope + +- A curated demo dataset in `lib/Settings/planninq_mock_register.json` for the headline schemas, kept by the ADR-111 generator's `--keep` and topped up by it. +- Two import-time adjustments in `DemoDataService::install`: the loading admin becomes owner, member and assignee, and dates shift to the load day. +- Moving the sample projects, columns, tasks and time entries out of `lib/Settings/planninq_register.json`, keeping the five labels there as install defaults. +- A test that every demo reference resolves and every demo dependency joins two different tasks of one project. + +### Out of scope + +- A "remove example data" action. Demo objects carry `demo-` slugs so they can be found; removal can follow. +- Deleting sample projects that earlier installs already received. They stay; this change only stops new installs from seeding them. +- Demo data for the humaniq side of time entries, which follows `plannedtimeentry-reads-humaniqs-hours`. + +## Impact + +- Data: `lib/Settings/planninq_mock_register.json` (rewritten from curated objects), `lib/Settings/planninq_register.json` (`components.objects` reduced to the five labels). +- Backend: `lib/Service/DemoDataService.php` (operator substitution and date shift before `importFromApp`). +- Specs: `register-schemas` loses the requirement "Seed data loaded on install [MVP]" and gains one for the default labels; a new capability `demo-data`. +- Tests: PHPUnit for the descriptor's references and edges and for the install-time adjustments; Playwright for the wizard path. +- Depends on: `boards-configurable-columns` (the demo columns carry the `status` mapping it adds) and `tasks-readable-keys` (the demo projects carry keys). + +## Risks + +### Risk 1: existing instances rely on the install seed +**Severity**: Medium +**Mitigation**: nothing is deleted. Instances that already have the sample projects keep them; only new installs start empty apart from the labels, and the wizard offers the same projects as example data. + +### Risk 2: the curated data drifts from the schemas +**Severity**: Medium +**Mitigation**: the generator's `--check` validates the descriptor in the gates, and the new PHPUnit test resolves every reference, so a schema change that breaks the data fails the build. + +### Risk 3: the loading admin is the only person in the example +**Severity**: Low +**Mitigation**: that is deliberate. Invented accounts such as `jdoe` do not exist on a customer's instance, so tasks assigned to them would show an unknown user. The example assigns to the admin who loaded it, and leaves some tasks unassigned. diff --git a/openspec/changes/archive/2026-09-29-platform-demo-data/specs/demo-data/spec.md b/openspec/changes/archive/2026-09-29-platform-demo-data/specs/demo-data/spec.md new file mode 100644 index 00000000..f91a01e4 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-platform-demo-data/specs/demo-data/spec.md @@ -0,0 +1,47 @@ +# demo-data delta for platform-demo-data + +## ADDED Requirements + +### Requirement: Loaded example data is visible to the admin who loads it + +When an admin loads the example data from the setup wizard, the system MUST make that admin the owner and a member of every example project and the assignee of some example tasks, so the example projects SHALL appear on their Projects list, Boards page, Portfolio and My tasks. No example object SHALL reference a user account the instance does not have. Tier: MVP (docs/FEATURES.md, admin settings: OpenRegister setup). + +#### Scenario: The admin loads example data and sees the projects + +- **GIVEN** an admin on a fresh planninq install with the setup wizard open +- **WHEN** they choose "Example data" and then "Load the example data" +- **THEN** the Projects page lists "Client Portal v2", "Infrastructure Migration" and "Onboarding Automation" +- **AND** the admin is shown as owner and member of each + +#### Scenario: My tasks shows example tasks due around today + +- **GIVEN** the example data loaded today +- **WHEN** the admin opens My tasks +- **THEN** it lists example tasks assigned to them, with one overdue by a few days and others due in the coming days + +### Requirement: Example data is consistent and follows planninq's rules + +Every reference between example objects MUST point at an object the example data contains, every example object SHALL validate against its schema, and every example dependency MUST join two different tasks of the same project without forming a cycle. Tier: MVP. + +#### Scenario: The example board shows cards in columns + +- **GIVEN** the example data loaded +- **WHEN** the admin opens the board of "Client Portal v2" +- **THEN** its columns show the project's example tasks as cards + +#### Scenario: The example timeline draws dependency arrows + +- **GIVEN** the example data loaded +- **WHEN** the admin opens the timeline of "Client Portal v2" +- **THEN** the example tasks appear as bars with arrows between different tasks +- **AND** no task has an arrow to itself + +### Requirement: Example dates are placed around the load day + +The system MUST shift every date in the example data so that the dataset's anchor date falls on the day the data is loaded. Tier: MVP. + +#### Scenario: Dates follow the load day + +- **GIVEN** an example task due three days after the dataset's anchor date +- **WHEN** the admin loads the example data on 5 October 2026 +- **THEN** the task is due on 8 October 2026 diff --git a/openspec/changes/archive/2026-09-29-platform-demo-data/specs/register-schemas/spec.md b/openspec/changes/archive/2026-09-29-platform-demo-data/specs/register-schemas/spec.md new file mode 100644 index 00000000..0cf5d7e2 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-platform-demo-data/specs/register-schemas/spec.md @@ -0,0 +1,22 @@ +# register-schemas delta for platform-demo-data + +## REMOVED Requirements + +### Requirement: Seed data loaded on install [MVP] + +**Reason**: Sample projects, columns, tasks and time entries created on every install are demo data on a production instance, which hydra ADR-111 rule 3 forbids ("demo data NEVER installs itself"). They reference accounts such as `jdoe` that customer instances do not have. + +**Migration**: The same projects, columns, tasks and time entries move to the example data that the setup wizard loads on request (capability `demo-data`). The five default labels stay on install (see the requirement below). Instances that already received the sample objects keep them; nothing is deleted. + +## ADDED Requirements + +### Requirement: Only the default labels are created on install + +On a fresh install the register import MUST create the five default labels, Bug, Feature, Docs, Design and Infrastructure, with their colours, and SHALL create no project, column, task, phase, dependency or time entry. Tier: MVP. + +#### Scenario: A fresh install has labels and no projects + +- **GIVEN** planninq installed for the first time, with the setup wizard closed without loading example data +- **WHEN** an admin opens the Projects page and the label settings +- **THEN** there are no projects +- **AND** the labels Bug, Feature, Docs, Design and Infrastructure exist diff --git a/openspec/changes/archive/2026-09-29-platform-demo-data/tasks.md b/openspec/changes/archive/2026-09-29-platform-demo-data/tasks.md new file mode 100644 index 00000000..88f79cef --- /dev/null +++ b/openspec/changes/archive/2026-09-29-platform-demo-data/tasks.md @@ -0,0 +1,24 @@ +# Tasks: platform-demo-data + +## 1. Dataset + +- [x] 1.1 Rewrite `lib/Settings/planninq_mock_register.json` from the curated objects (fixed ids, `demo-` slugs, `@operator`, dates around `anchorDate`, valid edges, at least three per schema) and run the generator with `--keep`. Verify: `generate_mock_register.py --check` passes in the gates; PHPUnit `DemoDatasetTest::testEveryReferenceResolves`, `testDependenciesJoinDifferentTasksOfOneProject`, `testDependenciesFormNoCycle` and `testAtLeastThreeObjectsPerSchema`. +- [x] 1.2 Reduce `components.objects` in `lib/Settings/planninq_register.json` to the five labels and bump the register version. Verify: PHPUnit `PlanninqRegisterSchemaTest::testInstallSeedsOnlyDefaultLabels`. + +## 2. Import + +- [x] 2.1 `DemoDataService::install()` replaces `@operator` with the loading admin's uid and shifts dates from `anchorDate` to today before `importFromApp`. Verify: PHPUnit `DemoDataServiceTest::testOperatorBecomesOwnerAndMember`, `testNoPlaceholderSurvives` and `testDatesShiftToLoadDay`. +- [x] 2.2 Live check through the wizard on a fresh instance. Verify: Playwright `tests/e2e/demo-data.spec.ts` "admin loads example data and sees the projects", "example board shows cards in columns", "my tasks shows example tasks due around today" and "example timeline draws dependency arrows". +- [x] 2.3 Fresh install without the wizard. Verify: Playwright `tests/e2e/demo-data.spec.ts` "fresh install has labels and no projects". + +## 3. Verification + +- [x] 3.1 `openspec validate platform-demo-data --type change --strict` passes. +- [x] 3.2 Every scenario in specs/ is covered by a test named in the task above it, or carries an `@e2e exclude ` note. + +## Notes from the build (2026-09-29) + +- 1.1: 59 curated objects (at least three per schema, 14 schemas), ids `0000de00-0000-4000-8000-`, so they never collide with the sample ids older installs received. Extra guards beyond the named tests: `testEveryObjectHasAFixedIdAndADemoSlug`, `testCustomFieldValuesUseDefinedFields`, `testTasksSitInAColumnOfTheirProjectWithTheirStatus`, `testDescriptorNamesItsAnchorAndNoAccount`, and `testEveryFittedObjectPassesItsSchema` (every object after `prepare()`, through the Opis validator OpenRegister uses). +- 2.1: the tests live in `tests/unit/Service/DemoDataServiceTest.php` (namespace `OCA\Planninq\Tests\Unit\Service`), beside the older `tests/Unit/Service/DemoDataServiceTest.php`; plus `testShiftWorksBackwardsAndNeedsAnAnchor` and `testInstallRefusesWithoutASignedInUser`. +- 2.2 and 2.3: `tests/e2e/demo-data.spec.ts` is written against the wizard's own endpoints; Playwright does not run from the lane clone, so it first runs in the nightly e2e job. "No projects on a fresh install" cannot hold on the shared e2e instance, so PHPUnit `PlanninqRegisterSchemaTest::testInstallSeedsOnlyDefaultLabels` asserts it and the e2e checks the labels. +- The Newman collection created its tasks in the seeded "Client Portal v2"; it now creates its own project first. diff --git a/openspec/changes/archive/2026-09-29-portfolio-finance/design.md b/openspec/changes/archive/2026-09-29-portfolio-finance/design.md new file mode 100644 index 00000000..7a9c0117 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-finance/design.md @@ -0,0 +1,85 @@ +# Design: project money, delivery terms, budget against actual cost, portfolio totals and the finance import + +## Context + +What exists at `de35541`: + +- **Delivery terms on the schema.** `project` carries `client` (`lib/Settings/planninq_register.json:530`), `billable` (`:538`), `budgetHours` (`:544`), `budgetAmount` (`:550`), `hourlyRate` (`:556`), `startDate` and `endDate` (`:562-575`), specified by `openspec/specs/project-delivery/spec.md:25-51`. A zero budget means "no budget agreed" and is not rendered as a figure. +- **Nothing sets them.** `src/dialogs/ProjectCreationDialog.vue` has title, description, colour and icon. The Details tab (`src/components/ProjectSettingsSidebar.vue:16-64`) has the same plus the read-only case reference. +- **Display only.** `ProjectListItem.vue:38-48` shows a Billable badge and the budget when set, formatted in euro (`:120-142`). `CnProjectsWidget.vue:248-256` totals `budgetAmount` for the projects leaf that other apps render, through `budgetOf` in `src/integrations/projectScope.js:88`. +- **Time and rates.** `plannedTimeEntry` has `duration` in minutes, `billable`, `hourlyRate` and a denormalised `project` (`planninq_register.json:905-1058`). `projectPhase` has `budgetHours` but no money. Nothing multiplies hours by a rate. +- **Hours are moving.** The open change `plannedtimeentry-reads-humaniqs-hours` moves `date`, `duration`, `user` and the rest to humaniq's `TimeEntry`, and keeps `contractorRef` and `hourlyRate` on `plannedTimeEntry` (`openspec/changes/plannedtimeentry-reads-humaniqs-hours/tasks.md:8-15`). +- **Portfolio page.** `src/views/Portfolio.vue:29-69` has one row per project with members, open and overdue counts. No money. +- **Project key.** `project.key` (`planninq_register.json:524`) is declared and unused. Lane A's `tasks-readable-keys` sets it on create. + +## Goals / non-goals + +Goals: + +- Set the terms that the schema already holds. +- Show budget against commitments, actual cost and forecast, per category and per phase. +- Total it per portfolio. +- Let the finance system fill actual cost and commitments without planninq import code. + +Non-goals: + +- Invoicing, currencies, budget alerts. + +## Decisions + +### Decision 1: a Finance tab owns the terms and the figures + +A Finance tab at `/projects/:id/finance` joins `ProjectTabs`. Its top block edits the terms: billable, billing model (`none`, `fixedPrice`, `hourly`, a new `project.billingModel`), budget in hours and money, hourly rate and planned dates. Money figures are shown only to the owner, managers and portfolio readers; members and viewers get the tab without amounts, because a budget is not everyone's business. + +Alternative considered: put the fields in the Details tab of the settings sidebar. The sidebar is narrow and has no room for the tables below, and the terms belong next to the figures they drive. + +### Decision 2: every amount is a `financeLine` + +`financeLine` has `project`, `phase` (optional), `category` (one of the admin's `finance_categories`, for example personnel, hired staff, materials, other), `kind` (`budget`, `commitment`, `actual`, `forecast`), `amount`, `date`, `description`, `source` (`manual` or `import`), `externalRef` (the finance system's line id), `projectKey` (the key the line came in with) and `portfolio` (denormalised, see Decision 4). + +Budget lines break `project.budgetAmount` down by category and phase. The table on the Finance tab has a row per category and per phase, with the columns budget, commitments, actual, forecast and remaining. Remaining is budget minus actual minus open commitments. + +Alternative considered: separate schemas per kind. Four schemas with the same fields would each need their own rights, import mapping and index. + +### Decision 3: labour cost is computed, not stored + +Booked time is its own row, "Labour (booked time)": the sum of hours times rate, where the rate is the entry's `hourlyRate`, else the project's. It is computed by one helper, `laborCost(projectId)`, from a single equality read on `project`, which the project-delivery spec already guarantees is possible (`openspec/specs/project-delivery/spec.md:80-92`). It is not written as `financeLine` objects, so an edited time entry never leaves a stale cost behind. + +When `plannedtimeentry-reads-humaniqs-hours` lands, `laborCost` reads the hours from humaniq's `TimeEntry` and the rate from `plannedTimeEntry`. Nothing else on the Finance tab changes. When humaniq is not installed, the row reads "Hours are not available" rather than zero, which follows that change's rule that a missing owner hides data rather than showing it empty. + +### Decision 4: portfolio totals read one aggregation per portfolio + +`financeLine.portfolio` is a copy of its project's `portfolio`, written by the listener that `projects-grouping-hierarchy-fields` adds for `portfolioReaders`, whenever a line is created or a project moves. The portfolio finance page at `/portfolio/finance` then asks OpenRegister's aggregation for sums grouped by project and by kind with the single equality filter `portfolio = `, the only filter shape the aggregation endpoint applies (`src/manifest.json:170`). Labour cost is added per project through `laborCost`. + +The page has a portfolio picker, a row per project with budget, commitments, actual, forecast and remaining, and a totals row. It sits under Portfolio, as ADR-001 maps `portfolio-dashboard-pmo`. + +### Decision 5: the finance import is an integriq mapping onto `financeLine` + +Planninq writes no import code. Integriq reads the finance system's export or API and writes `financeLine` objects with `source: 'import'`, the finance line id in `externalRef` and the finance project number in `projectKey`. It resolves `project` by looking up the project whose `key` equals `projectKey`. The pair (`source`, `externalRef`) is unique, so a re-run updates lines instead of duplicating them. + +A line whose key matches no project is still written, with `project` empty. Beheer gets a declarative index page "Unmatched finance lines" over `financeLine` with an empty `project`. An admin fixes the project's key or sets the line's project, and the line moves to that project's Finance tab. + +Write rights for imported lines go to a Nextcloud group `planninq-finance-import`, which the admin gives to integriq's service account. Imported lines are read-only on the Finance tab; manual lines are editable by managers. + +Alternative considered: a planninq import controller with a CSV upload. It would put integration plumbing in planninq, which ADR-001 rule 5 keeps in Beheer through the integration app, and every finance system would need its own parser here. + +## Amendments at build time (29 Sep 2026, code at 66ba8f8) + +- **Managers are the owner.** `projects-members-and-roles` is not built, so there is no manager role. The owner (and admins) set the terms and write manual lines; the owner and the portfolio managers (`project.portfolioReaders`) read the money. When the role lands, `FinanceLineService::keptFieldsFor()` and `src/utils/finance.js` `canSeeProjectMoney`/`canEditTerms` are the two places to widen. +- **The access copies are named.** A line carries `financeReaders` (owner plus portfolio managers, never the members) for the read rule and `projectOwner` for update and delete, both hidden, kept by `FinanceLineService`. The rules: read `financeReaders $contains $userId`, the group `planninq-finance-import` and admins; create any signed-in user (OpenRegister checks create before the object exists, so the listener gates it); update and delete `projectOwner`, the import group and admins. +- **The rules OpenRegister cannot express live in `FinanceLineListener`.** Manual lines need the project owner or an admin; imported lines (`source: import`) need the import group or an admin, which is the "property rule on amount" of decision 5 in its enforceable form: nobody else may change an imported line at all. +- **Uniqueness is a refusal, not an upsert.** At HEAD, OpenRegister's named `uniqueConstraints` schema key is not on `Schema::validateConfigurationArray()`'s allowlist and is dropped on import, and its legacy `unique` key counts the object itself on update. So `FinanceLineListener` refuses a second imported line with the same `externalRef`, with the code `planninq-finance-line-exists` and the existing line's id as `conflictingObject`; the integration then updates that line. The finance-import scenario is worded accordingly. +- **Decision 4 keeps `portfolio` in step from two places.** A project write by a person reaches the lines through `ProjectMembershipSyncListener` (owner, portfolio or managers changed), a portfolio's manager change or deletion through `ProjectHierarchyGuardListener::writeProject()`. Both call `FinanceLineService::syncProject()`. +- **Portfolio totals sum on the client.** The page reads the lines with the one equality filter `portfolio = ` through the object list, not the aggregation endpoint, and sums them per project with labour added (`portfolioFinance()` in `src/utils/finance.js`). The cross-check is that every line returned belongs to one of the portfolio's projects; a stray line means the filter was not applied, and the page says the totals may be wrong. The same per-project actual cost fills the actual cost column of the portfolio status page (portfolio-overview requires it for money viewers) and the money suggestion of a status report. +- **Unmatched lines are a declarative index** at `/finance/unmatched` with the fixed filter `project = IS NULL` and a Beheer menu entry for admins; an admin opens a line and sets its project in the index's edit form. +- **Labour is not split by phase.** Time entries name a task, not a phase, so the phase table holds finance lines only; labour is its own row in the category table. + +## Risks / trade-offs + +- [The aggregation ignores a filter it cannot apply] -> Only equality on `portfolio` and on `project` is used, and the portfolio page cross-checks its total against the sum of the per-project rows it rendered. +- [Money shown to the wrong people] -> `financeLine` read rights are the owner, managers and portfolio readers, declared on the schema; the tab's amounts are hidden for members and viewers, and a member's GET on `financeLine` returns nothing. +- [An imported line is edited by hand] -> Imported lines carry `source: 'import'` and a property rule that only the import group may change `amount`; the next import would otherwise overwrite the edit. + +## Open questions + +- Is `project.key` always usable as the finance project number, or does an organisation need a separate `financeNumber`? To be settled with the first municipality that connects its finance system. diff --git a/openspec/changes/archive/2026-09-29-portfolio-finance/proposal.md b/openspec/changes/archive/2026-09-29-portfolio-finance/proposal.md new file mode 100644 index 00000000..c23454de --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-finance/proposal.md @@ -0,0 +1,110 @@ +--- +kind: code +--- + +# Project money: delivery terms, budget against actual cost, portfolio totals and the finance import + +## Why + +The `project` schema already carries the delivery terms: `billable`, `budgetHours`, `budgetAmount` and `hourlyRate` (`lib/Settings/planninq_register.json:538-561`), specified in `openspec/specs/project-delivery/spec.md:25-51`. No planninq screen sets them. `ProjectCreationDialog.vue` asks for title, description, colour and icon, and the Details tab of the settings sidebar adds nothing more (`src/components/ProjectSettingsSidebar.vue:16-64`). The values show up as badges when an import or the API has set them (`src/components/ProjectListItem.vue:38-48`), and only then. + +A project manager cannot compare the budget with what the project costs. Time is booked with a duration and a rate (`plannedTimeEntry`), but nothing multiplies them, and there is no place for other costs, commitments or a forecast. The Portfolio page (`src/views/Portfolio.vue:29-69`) counts members and tasks and has no money column. There is no link with the finance system: `project.key` is declared (`planninq_register.json:524`) and used nowhere, and spend has no property to land in. + +Gemeente Sittard-Geleen asks for all of it in tender 365739 (https://www.tenderned.nl/aankondigingen/overzicht/365739): financial tables per project, per cost category and per phase, totalled per portfolio (requirements 3998, 3999, 4000), and an automated link with the financial system on the project number (requirements 4001, 4023, 4127). OpenProject tracks a budget against booked time and costs. + +Parity rows: `prj-delivery-terms`, `prt-budget`, `prt-portfolio-finance`, `int-finance-import` in planninq's `openspec/parity/capabilities.json`. +Decision: build. The delivery terms are stored but cannot be set, which is a core projects gap. The budget against actual cost is the first half of the tender's financial tables, so it is specified in the same change. The portfolio totals and the finance import answer the tender. + +## What changes + +- A project manager sets the delivery terms on a Finance tab: billable or not, fixed price or hourly, budget in hours and money, hourly rate, and planned dates. +- The Finance tab compares budget with commitments, actual cost and forecast, per cost category and per phase, with time booked on the project counted as labour cost. +- A project manager adds cost lines by hand. The finance system adds them automatically through integriq, matched on the project key. +- Lines from the finance system that match no project wait in a list in Beheer until an admin fixes the key. +- A Portfolio sub-page totals budget, commitments, actual cost and forecast across the projects of a portfolio. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `prj-delivery-terms`, `prt-budget`, `prt-portfolio-finance`, `int-finance-import`. + +### `prj-delivery-terms`: Record a project's delivery and billing terms, such as budget and fixed price or hourly billing. + +- Area `projects`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "lib/Settings/planninq_register.json declares billable/budgetHours/budgetAmount/hourlyRate on the project schema. They are read-only displayed in src/components/ProjectListItem.vue:41,127,138 and src/integrations/CnProjectsWidget.vue:45-52 (badges), but neither src/dialogs/ProjectCreationDialog.vue nor src/components/ProjectSettingsSidebar.vue (Details tab, lines 16-64) exposes any field to set them." +- Defect: "src/components/ProjectSettingsSidebar.vue:16-64 Details tab has no fields for billable/budgetHours/budgetAmount/hourlyRate" +- Note: "the fields exist and are shown when already set (presumably via import/direct API), but the app itself provides no way to record them, which is the capability the row asks about." +- Demand: none recorded on the row. +- Competitors rated yes: none. + +### `prt-budget`: Track a project's budget against actual cost. + +- Area `portfolio`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "lib/Settings/planninq_register.json:544-561 project.budgetHours/budgetAmount/hourlyRate exist as schema properties; no planninq form sets them (src/dialogs/ProjectCreationDialog.vue, src/components/ProjectSettingsSidebar.vue have no budget field); src/integrations/CnProjectsWidget.vue:17-19,47-51 only DISPLAYS budgetAmount on the leaf in other apps" +- Note: "Budget is stored and shown (on the cross-app projects leaf) but never set from a planninq screen and never compared with logged time or its cost." +- Demand: none recorded on the row. +- Competitors rated yes (1): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/budgets/README.md:15 'If you log time or costs to this work package the costs will booked to this budget and show the percentage spent for a project budget' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/budgets/config/routes.rb:31-37 budgets; modules/budgets/app/models/budget.rb:120-123 budget_ratio and :150-151 spent from material and labor; modules/budgets/app/views/budgets/show.html.erb:47-48 spent ratio bar and :79 'Spent'" + +### `prt-portfolio-finance`: See budget, spend, commitments and forecast totalled across all projects of a portfolio. + +- Area `portfolio`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "Budget is schema plus display only: lib/Settings/planninq_register.json:544-561 budgetHours/budgetAmount/hourlyRate, shown on src/components/ProjectListItem.vue:44-49 and totalled in src/integrations/CnProjectsWidget.vue:254-256 (a leaf rendered on OTHER apps' pages). No planninq page sets a budget, and spend, commitments and forecast have no property at all. The Portfolio page (src/views/Portfolio.vue:29-69) carries no money column." +- Note: "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 3998, 3999, 4000 (financial tables per cost category and phase, totals at portfolio level)." +- Demand (tender, via origin): https://www.tenderned.nl/aankondigingen/overzicht/365739 +- Competitors rated yes: none. + +### `int-finance-import`: Import actual spend and commitments from the finance system into each project by its project number. + +- Area `integration`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "No finance import and no project number to match on: project.key is declared at lib/Settings/planninq_register.json:524 and unused in src/ and lib/. lib/Service/RegisterImportService.php loads planninq's own register JSON (schemas and seed objects), not external spend. Spend and commitments have no schema property to land in." +- Note: "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4001, 4023, 4127 (automated link with the financial system, project number as key)." +- Demand (tender, via origin): https://www.tenderned.nl/aankondigingen/overzicht/365739 +- Competitors rated yes: none. + +## Scope + +### In scope + +- Screens that set the existing delivery terms, plus a billing model. +- A `financeLine` schema for budget, commitment, actual and forecast amounts per category and phase. +- Labour cost from booked time. +- The Finance tab, a portfolio finance page, and the unmatched lines list. +- The contract integriq writes to. The mapping itself lives in integriq. + +### Out of scope + +- Import code in planninq. An external import runs through integriq, not planninq code (ADR-001 rule 5: plumbing in Beheer, results inline). +- Invoicing and sending bills. +- Currencies other than euro. `budgetAmount` is described as the reporting currency, and every figure uses it. +- Budget alerts (Enterprise in FEATURES.md, "Overtime / budget alerts"). + +## Impact + +- Schema: `project` gains `billingModel`; a new `financeLine` schema with a denormalised `portfolio`. +- Settings: `finance_categories` in Beheer. +- Views: a Finance tab (`/projects/:id/finance`) in `ProjectTabs`, `src/dialogs/FinanceLineDialog.vue`, a portfolio finance page (`/portfolio/finance`), and an unmatched lines index in Beheer. +- Store: a `laborCost(projectId)` helper that reads booked time and rates in one place. +- Extends the capability folder `project-delivery` and the flat spec `openspec/specs/portfolio-dashboard-pmo.md`. +- Depends on: `tasks-readable-keys` (lane A) for the project key the import matches on. `projects-grouping-hierarchy-fields` for the portfolio and the listener that keeps `portfolio` in step. `projects-overview-logs-risks` for `ProjectTabs`. `projects-members-and-roles` for the manager role. + +## Risks + +### Risk 1: hours are moving to humaniq + +**Severity**: High +**Mitigation**: The open change `plannedtimeentry-reads-humaniqs-hours` moves `duration`, `date` and `user` to humaniq's `TimeEntry` and keeps `hourlyRate` on `plannedTimeEntry`. Labour cost is read by one helper, `laborCost`, which is the only code that changes with that move. When humaniq is absent after the move, the labour row says "Hours are not available" instead of showing zero. + +### Risk 2: two budgets disagree + +**Severity**: Medium +**Mitigation**: `project.budgetAmount` stays the agreed total. Budget lines per category are a breakdown of it, and the Finance tab shows any difference as "Not yet assigned to a category" rather than picking one of the two. + +### Risk 3: a finance number is not a short key + +**Severity**: Medium +**Mitigation**: The import matches on `project.key`, which `tasks-readable-keys` sets. When an organisation's finance numbers do not fit that format, lines stay unmatched and visible in Beheer. Whether a separate finance number is needed is an open question in design.md. + +### Risk 4: another schema changes the schema count + +**Severity**: Low +**Mitigation**: Task 1.4 updates `testRegisterDeclaresExactlySevenSchemas` and `openspec/specs/project-delivery/spec.md:68-72`. diff --git a/openspec/changes/archive/2026-09-29-portfolio-finance/specs/finance-import/spec.md b/openspec/changes/archive/2026-09-29-portfolio-finance/specs/finance-import/spec.md new file mode 100644 index 00000000..9f6517a3 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-finance/specs/finance-import/spec.md @@ -0,0 +1,28 @@ +# finance-import delta for portfolio-finance + +## ADDED Requirements + +### Requirement: The finance system fills cost lines on the project number + +Planninq MUST accept cost lines written by the integration app, carrying the finance system's line id and project number. A line MUST land on the project whose key equals the project number. Writing the same finance line id again MUST NOT add a second line: planninq MUST refuse it and name the existing line, which the integration then updates. Planninq itself MUST NOT contain code that reads the finance system. Tier: Enterprise (docs/FEATURES.md, "Import from CSV (tasks bulk import)" is the nearest row; tender 365739 requirements 4001, 4023 and 4127). + +#### Scenario: An imported line lands on its project + +@e2e exclude The writer is integriq's service account, asserted by the Newman requests of task 3.1 +- **GIVEN** a project with the key "OMG" and the integration account in the group `planninq-finance-import` +- **WHEN** the integration account sends `POST /apps/openregister/api/objects/planninq/financeLine` with `projectKey` "OMG", `kind` "actual", `amount` 1200 and `externalRef` "FIN-778" +- **AND** sends the same line again with `amount` 1250, which is refused with `planninq-finance-line-exists` naming the first line +- **AND** sends `amount` 1250 to that line +- **THEN** the project's Finance tab at /projects/:id/finance shows one line from the finance system of 1250 euro + +### Requirement: An admin resolves finance lines that match no project + +A cost line whose project number matches no project MUST be kept and listed in Beheer. An admin MUST be able to assign it to a project from that list. Tier: Enterprise (docs/FEATURES.md has no row; ADR-001 rule 5). + +#### Scenario: Assigning an unmatched line + + +- **GIVEN** an imported line with `projectKey` "OMGV" and no project +- **WHEN** an admin opens "Unmatched finance lines" in Beheer, picks the line and assigns it to the project "Omgevingsvisie" +- **THEN** the line leaves the unmatched list +- **AND** it appears on the Finance tab of "Omgevingsvisie" diff --git a/openspec/changes/archive/2026-09-29-portfolio-finance/specs/portfolio-finance/spec.md b/openspec/changes/archive/2026-09-29-portfolio-finance/specs/portfolio-finance/spec.md new file mode 100644 index 00000000..23a90367 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-finance/specs/portfolio-finance/spec.md @@ -0,0 +1,23 @@ +# portfolio-finance delta for portfolio-finance + +## ADDED Requirements + +### Requirement: A portfolio manager sees money totalled across a portfolio + +The Portfolio menu MUST have a finance sub-page that, for a chosen portfolio, lists every project in it with budget, commitments, actual cost including labour, forecast and remaining, and totals them. Only people who can read a project's finance lines MUST see its figures. Tier: Enterprise (docs/FEATURES.md, "Project portfolios (grouping across projects)"; tender 365739 requirement 4000). + +#### Scenario: Totals for a portfolio + +- **GIVEN** a portfolio manager of "Ruimte", which holds two projects with budgets of 50000 and 30000 euro and actual costs of 20000 and 35000 euro +- **WHEN** the manager opens the portfolio finance page at /portfolio/finance and picks "Ruimte" +- **THEN** the page lists both projects with their figures +- **AND** the totals row shows a budget of 80000 euro and an actual cost of 55000 euro +- **AND** the second project's remaining amount is shown as over budget, in text as well as colour + +#### Scenario: A project outside your reach is not totalled + +@e2e exclude The e2e suite signs in as the admin only, who sees every project's money; asserted by tests/vitest/portfolioFinance.spec.js "totals nothing for a member who holds no role on the portfolio" + +- **GIVEN** a user who is a member but not a manager of one project in "Ruimte", and holds no role on the portfolio +- **WHEN** the user opens /portfolio/finance and picks "Ruimte" +- **THEN** the page says "You cannot see the money of any project in this portfolio" diff --git a/openspec/changes/archive/2026-09-29-portfolio-finance/specs/project-delivery/spec.md b/openspec/changes/archive/2026-09-29-portfolio-finance/specs/project-delivery/spec.md new file mode 100644 index 00000000..91b7f91f --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-finance/specs/project-delivery/spec.md @@ -0,0 +1,42 @@ +# project-delivery delta for portfolio-finance + +## ADDED Requirements + +### Requirement: A project manager sets the delivery terms on screen + +A project owner (the project's manager until projects-members-and-roles adds a manager role) MUST be able to set whether a project is billable, its billing model (none, fixed price or hourly), its budget in hours and in money, its hourly rate and its planned start and end dates, from the project's Finance tab. A zero or empty budget MUST still mean "no budget agreed". Tier: V1 (docs/FEATURES.md, "Time report (estimated vs actual, per project)"; the terms are specified in this capability's requirement on delivery and billing terms). + +#### Scenario: Setting a fixed-price budget + +- **GIVEN** a project manager on the Finance tab at /projects/:id/finance of a project without terms +- **WHEN** the manager turns on "Billable", picks "Fixed price", enters a budget of 56000 euro and 400 hours, and saves +- **THEN** the Finance tab shows "Budget € 56,000" and "400 hours" +- **AND** the project's entry on the project list at /projects shows the Billable badge and the budget + +#### Scenario: Members do not see the money + +@e2e exclude The e2e suite signs in as the admin only; asserted by PlanninqRegisterSchemaTest::testFinanceLineSchemaAndItsRules, FinanceLineListenerTest::testTheOwnersLineIsStampedForTheOwnerAndThePortfolioManagers and tests/vitest/finance.spec.js "owner, portfolio managers and admins see the amounts; members do not" +- **GIVEN** a project member with the role "Member" +- **WHEN** the member opens /projects/:id/finance +- **THEN** the tab shows the billing model and the planned dates +- **AND** no amount is shown +- **AND** a GET on `/apps/openregister/api/objects/planninq/financeLine?project={id}` with the member's session returns no lines + +### Requirement: A project manager compares budget with cost + +The Finance tab MUST show, per cost category and per phase, the budget, the commitments, the actual cost, the forecast and what remains. Booked time MUST count as labour cost at the entry's rate, else the project's rate. A manager MUST be able to add, change and remove manual cost lines; lines from the finance system MUST be read-only. Tier: V1 (docs/FEATURES.md, "Time report (estimated vs actual, per project)"; tender 365739 requirements 3998 and 3999). + +#### Scenario: Budget against actual cost with booked time + +- **GIVEN** a project with a budget of 10000 euro and an hourly rate of 100 euro +- **AND** 20 hours booked on its tasks, and a manual actual cost line of 1500 euro in the category "Materials" +- **WHEN** a project manager opens the Finance tab at /projects/:id/finance +- **THEN** the row "Labour (booked time)" shows 2000 euro actual +- **AND** the row "Materials" shows 1500 euro actual +- **AND** the total shows 3500 euro spent and 6500 euro remaining + +#### Scenario: Lines from the finance system cannot be edited + +- **GIVEN** an actual cost line with the source "import" +- **WHEN** a project manager opens it on the Finance tab +- **THEN** the line is shown with "From the finance system" and without edit or delete buttons diff --git a/openspec/changes/archive/2026-09-29-portfolio-finance/tasks.md b/openspec/changes/archive/2026-09-29-portfolio-finance/tasks.md new file mode 100644 index 00000000..eec09e21 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-finance/tasks.md @@ -0,0 +1,25 @@ +# Tasks: portfolio-finance + +## 1. Terms and lines (V1) + +- [x] 1.1 Add `project.billingModel` and the `financeLine` schema with read rights for owner, managers and portfolio readers, write rights for managers on manual lines, and for the group `planninq-finance-import` on imported lines. Verify: `tests/unit/Settings/PlanninqRegisterSchemaTest.php::testFinanceLineSchemaAndItsRules` asserts the properties and the rules; `tests/unit/Listener/FinanceLineListenerTest.php` asserts that only the owner writes manual lines and only the import group writes imported ones (built as a listener, see design decision 5). +- [x] 1.2 Add `finance_categories` to `SettingsService` and the admin page. Verify: `tests/unit/Service/SettingsServiceTest.php` for defaults and a saved list. +- [x] 1.3 Add the Finance tab (`/projects/:id/finance`) with the terms form, hiding amounts for members and viewers. Verify: `tests/e2e/project-finance.spec.ts` "setting a fixed-price budget" and "members do not see the money". +- [x] 1.4 Update `testRegisterDeclaresExactlySevenSchemas` and `openspec/specs/project-delivery/spec.md:68-72` for `financeLine`. Verify: the PHPUnit suite passes. + +## 2. Budget against cost (V1) + +- [x] 2.1 Add `laborCost(projectId)` reading hours and rates in one place, with the "Hours are not available" state for a missing humaniq after the time move. Verify: `tests/vitest/laborCost.spec.js` for the entry rate, the project rate fallback and the missing owner. +- [x] 2.2 Add the category and phase table and `src/dialogs/FinanceLineDialog.vue` for manual lines; show imported lines read-only. Verify: e2e "budget against actual cost with booked time" and "lines from the finance system cannot be edited". + +## 3. Import contract and portfolio (Enterprise) + +- [x] 3.1 Enforce uniqueness of (`source`, `externalRef`) and write the integration contract (fields, group, matching on `project.key`) into `docs/`. Verify: Newman folder "Finance Import" in `tests/integration/planninq.postman_collection.json` posts the same line twice (the second is refused naming the first), updates the first and reads one line back; `FinanceLineListenerTest::testASecondLineWithTheSameFinanceIdIsRefusedNamingTheFirst`. Contract: `docs/features/finance-import.md`. +- [x] 3.2 Add the declarative "Unmatched finance lines" index in Beheer and the assign action. Verify: e2e `tests/e2e/portfolio-finance.spec.ts` "assigning an unmatched line"; `FinanceLineListenerTest::testAnAdminAssignsAnUnmatchedLine`. +- [x] 3.3 Keep `financeLine.portfolio` and the access copies in step through the listener of `projects-grouping-hierarchy-fields` and the project membership sync. Verify: `ProjectHierarchyGuardListenerTest::testPortfolioChangesReachTheFinanceLines` and `ProjectMembershipSyncListenerTest::testANewOwnerOrPortfolioReachesTheFinanceLines`. +- [x] 3.4 Add the portfolio finance page (`/portfolio/finance`) on OpenRegister aggregation with an equality filter on `portfolio`, plus labour per project. Verify: `tests/vitest/portfolioFinance.spec.js` for totals and the cross-check; e2e `tests/e2e/portfolio-finance.spec.ts` "totals for a portfolio" ("a project outside your reach is not totalled" is `@e2e exclude`, the suite signs in as admin). The same figures fill the actual cost column of the portfolio status page and the money suggestion of a status report. + +## 4. Verification + +- [x] 4.1 `openspec validate portfolio-finance --type change --strict` passes. +- [x] 4.2 Every scenario in specs/ is covered by a test named in the task above it, or carries an `@e2e exclude ` note. diff --git a/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/design.md b/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/design.md new file mode 100644 index 00000000..e7725f79 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/design.md @@ -0,0 +1,74 @@ +# Design: my work, task figures on the dashboard, and my own project order + +## Context + +Read at development `de35541`: + +- `src/manifest.json:72-140` Dashboard page: three `stat` widgets on the `project` schema + (active, all, archived; the "Projects I am in" widget has no filter) and a `project-panels` + widget rendered by `src/components/DashboardPanels.vue` (registered in `src/main.js:71`). +- `src/components/DashboardPanels.vue:102-106` `recentProjects` filters active projects and takes + the first five in store order. +- Menu entries: Dashboard, Boards, Projects, Timesheet, and footer items; no My work. +- `src/store/projects.js:775` `fetchTasks(projectId)` is per project; task reads are scoped by Open + Register to the user's projects, so a query without `project` already stays inside them. +- `openspec/specs/dashboard-my-work.md` requirements "Personal Dashboard", "My Work View", + "Dashboard Empty State"; it names a change that does not exist. +- hydra ADR-049: manifest `stat` and `stats-block` widgets take token-resolved filters (`@me`, + `@today`); custom widgets need a justification (gate 29, custom-widget ratchet). +- `openspec/architecture/adr-001-information-architecture.md` rule 6: Mijn werk is the landing page. + +## Goals / non-goals + +Goals: the main spec's My Work view and task KPIs, a correct member count, a personal project +order. Non-goals: the menu restructure, a cross-project board, the timer. + +## Decisions + +### Decision 1: My tasks is a custom page over one query + +`src/views/MyWork.vue` (route `/my-tasks`, registered in `src/registry.js`) loads open tasks where +`assignedTo` is the current user, plus those whose `sharedWith` contains them, merges them, and +groups them with a pure helper into Overdue, Due this week and Later, each sorted urgent to low. +A status select per row PATCHes in place; the title opens TaskDetail and Back returns here. The +page is a custom page because the grouping and inline status do not fit a list widget; it is not a +dashboard widget. + +### Decision 2: task KPIs are declarative widgets + +Four manifest `stat` widgets on the `task` schema with `@me` and `@today` tokens: open +(`assignedTo: @me`, status open or in_progress), overdue (`dueDate` before `@today`, not done), +in progress, and completed today (`completedAt` on `@today`). Each `route` opens My tasks with a +`?group=` filter. "Projects I am in" gets `members` contains `@me`. Alternative: count in +`DashboardPanels`. Rejected by ADR-049 while the stat grammar can express it. + +### Decision 3: pinned projects in the user's settings + +"My projects" gets a pin toggle and "Move up" and "Move down" per row. The order is a user +preference `dashboardProjectOrder` (list of project ids) saved through the user settings endpoint; +pinned projects come first in that order, then the rest as today. + +### Decision 4: the menu entry until the five menus land + +A menu entry "My tasks" (order 15) sits under Dashboard. When `adopt-five-menu-navigation-ia` +builds the Mijn werk group, it moves there without a URL change. + +## Risks / trade-offs + +- [The overdue and completed-today filters need date comparison in the stat grammar] -> if the + grammar lacks a before-today operator, the two figures move into one `stats-block` computed by an + Open Register calculation, never into a custom widget. + +## Open questions + +- Does the `stat` widget filter grammar support "before `@today`" and "on `@today`" for date fields + and "contains" for arrays? Task 2.1 checks against nextcloud-vue before choosing. + +## Amendments at build time (2026-09-29) + +- My tasks reads the task collection once, paged, and keeps the tasks assigned to or shared with the user in the browser (`fetchMyTasks`). `sharedWith` is an array, and an array filter on OpenRegister's object list is not portable across databases (the same reason `fetchProjects` filters members in the browser). For an admin this reads every task the admin can see. +- The stat grammar was checked against OpenRegister's aggregation runner (task 2.1): `ne`, `in`, `notIn`, `gt`, `gte`, `lt`, `lte`, and a filter on an array-typed field (`members: @me`) is matched as any-overlap by the PHP fallback. So all four figures and "Projects I am in" are declarative `stat` widgets: open = `status notIn [done, cancelled]`, overdue = that plus `dueDate lt @today`, in progress = `status in_progress`, completed today = `status done` and `completedAt gte @today`. +- The figures count the tasks the user is responsible for (`assignedTo: @me`). The aggregation cannot say "assigned to me OR shared with me" in one filter. So a figure opens My tasks narrowed to exactly what it counts (`?group=open|overdue|in_progress|completed_today`, responsible only), and the unfiltered page lists shared tasks too. A "Show all my tasks" button clears the figure. +- Back on a task opened from My tasks returns to My tasks (`?from=my-tasks` on the task route). +- "My projects" rows became a button (open the board) plus an actions menu (Pin to the top or Unpin, Move up, Move down), because a pin control inside a row that is itself a button nests two interactive elements. Pinned projects are all listed, then the rest up to five in all. +- Copy lands in all 36 locales the app ships, not only en and nl (task 4.1). diff --git a/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/proposal.md b/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/proposal.md new file mode 100644 index 00000000..ca621bcf --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/proposal.md @@ -0,0 +1,113 @@ +--- +kind: code +--- + +# My work: my tasks across projects, task figures on the dashboard, and my own project order + +## Why + +Nobody can see their own tasks in one place. Tasks are only ever fetched per project +(`src/store/projects.js:775`), no page filters them on the current user, and the menu has no "My +work" entry (`src/manifest.json`, menu). The main spec `openspec/specs/dashboard-my-work.md` +describes a My Work view grouped by urgency and names a change `dashboard-my-work` that does not +exist; the matrix marks the row `specified` on that claim. + +The dashboard counts projects only: active, "Projects I am in" and archived +(`src/manifest.json:72-140`), plus up to five active projects in a fixed order +(`src/components/DashboardPanels.vue:102-106`). It shows no tasks at all, although the same main +spec asks for open, overdue, in-progress and completed-today counts. "Projects I am in" has no +member filter, so an admin sees every project counted. ADR-001 rule 6 makes Mijn werk the daily +home "optimised for the 80% of users who are not managers". + +A Kanboard user asked to arrange the projects on their dashboard in their own order +(https://github.com/orgs/kanboard/discussions/5394). + +Parity rows: `prt-my-work`, `prt-dashboard`, `prt-dashboard-order` in planninq's +`openspec/parity/capabilities.json`. +Decision: build. `prt-my-work` was marked specified with no change directory and has five +competitors yes; `prt-dashboard` is rated partial with four competitors yes on the missing half +(task figures); `prt-dashboard-order` has a feature request plus one competitor yes. + +## What changes + +- A "My tasks" page lists every open task assigned to me, or shared with me, across my projects, + grouped as Overdue, Due this week and Later, sorted by priority, with a status change in place. +- The dashboard shows task figures for me: open, overdue, in progress and completed today, each + opening My tasks with that filter. +- "Projects I am in" counts only projects I am a member of. +- I pin projects to the top of "My projects" and put them in my own order. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `prt-my-work`, `prt-dashboard`, `prt-dashboard-order`. + +### `prt-my-work`: See the tasks assigned to you across all projects. + +- Area `portfolio`. Planninq is rated `no`, built.state `specified`, owner `ConductionNL/planninq`. +- Built evidence: "openspec/specs/dashboard-my-work.md (status in-progress) describes a My Work view; no page in src/manifest.json and no component filters tasks by assignedTo == current user" +- Note: "The only board filter is by label (src/views/ProjectBoard.vue:66-95); tasks are only ever fetched per project (src/store/projects.js:775)." +- Demand: none recorded on the row. +- Competitors rated yes (5): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/M1-column.md 3.5 'Upcoming cards (/upcoming/) lists cards assigned to me across boards' ; source read at v1.19.0: src/router.js:36-38 /upcoming; src/components/overview/Overview.vue:111 'Upcoming cards', :57-83 due-date columns; lib/Controller/OverviewApiController.php:29 upcomingCards, lib/Service/OverviewService.php:26-41 cards assigned to me or unassigned across all my boards" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/M1-column.md 3.5 'default queries ship and modules/my_page/ renders personal ones'; global 'Work packages' module across projects (corpus: openproject/round4/menu-tree.md) ; source read at v17.8.0: app/services/work_packages/default_query_generator_service.rb:41 'assigned_to_me' among the default queries, built at :115; app/menus/work_packages/menu.rb:40-50 lists them in the global Work packages menu across all projects; modules/my_page/lib/my_page/grid_registration.rb:72 'work_packages_assigned' widget" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/menu-tree.md workspace 'Your work' ; M1-column.md 5.4 'a workspace member's profile page aggregates their assigned and created work items' ; source: filter.ts profile_issues list and kanban grouped by project ; source read at v1.4.2: apps/web/app/(all)/[workspaceSlug]/(projects)/profile/[userId]/[profileViewId]/page.tsx assigned, created and subscribed tabs; packages/constants/src/issue/filter.ts:113-131 profile_issues list and kanban grouped by project; apps/api/plane/app/urls/workspace.py:153 user-issues route, apps/api/plane/app/views/workspace/user.py:98 WorkspaceUserProfileIssuesEndpoint" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/M1-column.md 3.5 'the dashboard shows "My tasks" and "My subtasks"' ; source read at v1.2.54: app/Template/dashboard/sidebar.php:10 'My tasks', :13 'My subtasks'; app/Controller/DashboardController.php:35-41 tasks via getDashboardPaginator for the user across projects; app/Template/dashboard/tasks.php:2" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/searching-for-issues-939938681.html): "corpus: jira-data-center/round4/M1-column.md 3.5 'predefined system filters for common queries, such as My Open Issues' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/searching-for-issues-939938681.html 'predefined system filters for common queries, such as My Open Issues, Reported by Me, Recently Viewed, and All Issues' (read 2026-09-26)" + +### `prt-dashboard`: See a personal dashboard of your projects and tasks. + +- Area `portfolio`. Planninq is rated `partial`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "src/manifest.json:72-140 (Dashboard page, three project-count stat widgets + project-panels) -> src/components/DashboardPanels.vue:16-44 'My projects' list via src/store/projects.js:170 fetchProjects()" +- Defect: "src/manifest.json:97-110 'Projects I am in' KPI has no member filter; it counts every project the reader can see, which for an admin (project read grants group admin, lib/Settings/planninq_register.json project.authorization) is every project (code reading, needs a live check)" +- Note: "The dashboard is about projects only: active/member/archived project counts and up to five active projects. It shows no tasks at all, although openspec/specs/dashboard-my-work.md asks for open, overdue and in-progress task KPIs." +- Demand: none recorded on the row. +- Competitors rated yes (4): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/menu-tree.md 'Dashboard. Three widgets, Upcoming cards, Today and Tomorrow' ; 'Upcoming cards cards assigned to me across boards' ; source read at v1.19.0: lib/AppInfo/Application.php:138-140 registers dashboard widgets DeckWidgetUpcoming, DeckWidgetToday, DeckWidgetTomorrow, lib/Dashboard/DeckWidgetUpcoming.php:53 'Upcoming cards'; inside Deck src/router.js:36-38 /upcoming renders src/components/overview/Overview.vue:57-83 my cards by due date" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/menu-tree.md 'My page personal dashboard, grid of widgets'; corpus: openproject/round4/M1-column.md 10.2 'modules/my_page/, the same grid machinery per user' ; source read at v17.8.0: modules/my_page/config/routes.rb:3 /my/page; modules/my_page/lib/my_page/grid_registration.rb:72 'work_packages_assigned' and :87 'work_packages_created' default widgets on a per user grid" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/M1-column.md 10.2 'the dashboard is fixed: projects, my tasks, my subtasks, calendar, activity (DashboardController)' ; source read at v1.2.54: app/Template/dashboard/sidebar.php:4-13 'Overview', 'My projects', 'My tasks', 'My subtasks'; app/Controller/DashboardController.php:18 show, :35 tasks, :51 subtasks; app/Template/dashboard/layout.php:18 'My activity stream'" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/configuring-dashboards-939939002.html): "corpus: jira-data-center/round4/M1-column.md 10.2 'you can create a personal dashboard and add gadgets to keep track of assignments and issues you're working on' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/configuring-dashboards-939939002.html 'you can create a personal dashboard and add gadgets to keep track of assignments and issues you're working on' (read 2026-09-26)" + +### `prt-dashboard-order`: Arrange the projects on your dashboard in your own order. + +- Area `portfolio`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "src/components/DashboardPanels.vue:18-44 renders recentProjects [:102-106, a filter and slice of src/store/projects.js:170 fetchProjects]. No stored per-user order, no drag handle, no favourite or pin." +- Note: "Demand row mined from kanboard (featureRequest) on 2026-09-26." +- Demand (featureRequest, via origin): https://github.com/orgs/kanboard/discussions/5394 +- Competitors rated yes (1): + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "source read at v1.4.2: apps/web/core/components/workspace/sidebar/projects-list-item.tsx:307 'drag to rearrange'; apps/web/core/components/workspace/sidebar/projects-list.tsx:102 saves sort_order; apps/api/plane/db/models/project.py:223 sort_order per member" + +## Scope + +### In scope + +- A `MyWork` page and its manifest route and menu entry. +- Task KPI widgets on the Dashboard page and the member filter on "Projects I am in". +- Pin and order for "My projects", stored per user. + +### Out of scope + +- The five-menu relabel of Dashboard to Mijn werk: `adopt-five-menu-navigation-ia` (open) owns + the menu structure; this change adds the page it will group. +- A cross-project board: `boards-cross-project-board`. +- The timer on Mijn werk: `time-timer-and-work-type`. + +## Impact + +- `src/manifest.json` (Dashboard widgets, new MyWork page and menu entry), a new + `src/views/MyWork.vue`, `src/registry.js`, `src/store/projects.js` (my-tasks query), + `src/components/DashboardPanels.vue`, `lib/Service/SettingsService.php` (project order + preference), `l10n/`. +- Depends on: `tasks-assignment-priority-labels` (`sharedWith`), `tasks-dates` (due dates to + group by), `boards-configurable-columns` (`completedAt` for completed today). + +## Risks + +### Risk 1: A cross-project query is slow for a heavy user +**Severity**: Medium +**Mitigation**: the query asks Open Register for `assignedTo = me` and open statuses only, with a +limit and paging; closed work never loads. + +### Risk 2: Two definitions of "my task" +**Severity**: Low +**Mitigation**: one helper decides (`assignedTo` is me, or `sharedWith` contains me) and both the +page and the KPIs use its filters. diff --git a/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/specs/my-work/spec.md b/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/specs/my-work/spec.md new file mode 100644 index 00000000..0e76f2b7 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/specs/my-work/spec.md @@ -0,0 +1,64 @@ +# my-work delta for portfolio-my-work-dashboard + +Implements the flat main spec `openspec/specs/dashboard-my-work.md`. + +## ADDED Requirements + +### Requirement: A user sees all their open tasks across projects in one list + +The system MUST offer a My tasks page listing every open task, in every project the user is a +member of, that is assigned to the user or shared with them, grouped as Overdue, Due this week and +Later, each group sorted from urgent to low priority. Tier: MVP (docs/FEATURES.md). + +#### Scenario: Tasks from two projects + +- **GIVEN** Anna is responsible for an overdue task in "Vergunningen" and a task due Friday in "Handhaving" +- **WHEN** she opens My tasks +- **THEN** the first shows under Overdue and the second under Due this week, each with its project name + +#### Scenario: Change a status without leaving + +- **GIVEN** a task is listed on My tasks +- **WHEN** Anna sets its status to In progress from the row +- **THEN** the task is saved with that status and she stays on My tasks + +#### Scenario: Nothing assigned + +- **GIVEN** Bram has no open tasks assigned or shared +- **WHEN** he opens My tasks +- **THEN** he sees "No tasks assigned to you" and a "Browse projects" action + +### Requirement: The dashboard shows my task figures + +The system MUST show on the dashboard the number of my open tasks, my overdue tasks, my tasks in +progress and my tasks completed today, and each figure MUST open My tasks filtered to it. Tier: MVP. + +#### Scenario: Figures for a user + +- **GIVEN** Anna has four open tasks, one of them overdue and two in progress, and finished one today +- **WHEN** she opens the dashboard +- **THEN** it shows Open 4, Overdue 1, In progress 2 and Completed today 1 +- **AND** choosing Overdue opens My tasks showing that one task + +### Requirement: "Projects I am in" counts only my projects + +The system MUST count only projects whose members include the user in the "Projects I am in" +figure, also for an admin. Tier: MVP. + +#### Scenario: An admin's count + +- **GIVEN** an admin who is a member of two of ten projects +- **WHEN** they open the dashboard +- **THEN** "Projects I am in" shows 2 + +### Requirement: A user can put their projects in their own order + +The system MUST let a user pin projects and order them in the dashboard's "My projects" panel, and +MUST keep that order for that user only. Tier: V1. + +#### Scenario: Pin a project + +- **GIVEN** Anna is a member of five projects +- **WHEN** she pins "Handhaving" in My projects +- **THEN** "Handhaving" is listed first, also after a reload +- **AND** Bram's dashboard order is unchanged diff --git a/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/tasks.md b/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/tasks.md new file mode 100644 index 00000000..48815eee --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-my-work-dashboard/tasks.md @@ -0,0 +1,19 @@ +# Tasks: portfolio-my-work-dashboard + +## 1. My tasks + +- [x] 1.1 `fetchMyTasks()` in `src/store/projects.js` (assigned or shared, open statuses, paged) and a pure `groupMyTasks(tasks, today)` helper. Verify: vitest specs for the merge and the three groups with priority order. +- [x] 1.2 `src/views/MyWork.vue`, its manifest page and registry entry, a "My tasks" menu entry, inline status change, and the empty state "No tasks assigned to you" with "Browse projects". Verify: Playwright e2e opens My tasks, changes a status in place, and follows a title to TaskDetail and back. + +## 2. Dashboard + +- [x] 2.1 Check the stat filter grammar for date and array operators, then add the four task KPI widgets and the member filter on "Projects I am in" in `src/manifest.json`. Verify: `npm run check:manifest` exits 0; Playwright e2e reads the counts for a seeded user. + +## 3. Project order + +- [x] 3.1 Pin and "Move up" and "Move down" in `src/components/DashboardPanels.vue`, stored as `dashboardProjectOrder` through the user settings endpoint. Verify: PHPUnit test for the preference in `SettingsService`; Playwright e2e pins a project and reloads. + +## 4. Copy and verification + +- [x] 4.1 New strings in `l10n/en.json` and `l10n/nl.json`. Verify: `npm run check:l10n` exits 0. +- [x] 4.2 `openspec validate portfolio-my-work-dashboard --type change --strict` passes. diff --git a/openspec/changes/archive/2026-09-29-portfolio-people-capacity/design.md b/openspec/changes/archive/2026-09-29-portfolio-people-capacity/design.md new file mode 100644 index 00000000..e6d819b3 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-people-capacity/design.md @@ -0,0 +1,62 @@ +# Design: capacity per person across projects + +## Context + +What exists at `de35541`: + +- **Page and promise.** `src/manifest.json:151` declares the `Portfolio` page at `/portfolio` with the note "Capacity across projects: one row per assignee aggregating allocation over the projects they appear in". The Reports card "Capacity" (`:163`) says "How allocation is spread across the people working on projects". +- **What it does.** `Portfolio.vue` loads `fetchProjects({ status: 'active' })` (`src/views/Portfolio.vue:134`), which keeps only projects whose `members` include the viewer (`src/store/projects.js:195-197`), reads each project's tasks with `fetchTasks` (`Portfolio.vue:137`), and pushes one row per project with its member count, open and overdue counts (`:139-147`). The table has the columns Project, Members, Open, Overdue and Open work (`:29-69`). +- **Helper.** `summariseProjectTasks` (`src/utils/portfolioHelpers.js:28-41`) counts open tasks (status not in `CLOSED_STATUSES`) and overdue ones through `dueDateStatus`. It is unit-tested in `tests/vitest/portfolio.spec.js`. +- **Task fields.** `assignedTo` is one uid (`lib/Settings/planninq_register.json:255-259`). `estimatedDuration` and `remainingEstimate` are minutes (`:280-284`, `:361-366`). Lane A's `tasks-assignment-priority-labels` (on `development` since `e31a95d`) keeps `assignedTo` as the primary assignee and adds `sharedWith`, an array of further uids. +- **Existing spec.** `openspec/specs/capacity-planning-resource.md` specifies the per-project summary as MVP and lists "Per-member allocation / availability modelling" as a follow-up. + +## Goals / non-goals + +Goals: + +- Answer "who has how much open work, and where" across the projects the viewer can read. +- Keep the per-project summary the existing spec requires. +- Make the page's descriptions true. + +Non-goals: + +- Availability, leave and contract hours. +- Editing work from the report. + +## Decisions + +### Decision 1: group in the browser with a pure helper + +`summariseByAssignee(tasksByProject, now)` in `src/utils/portfolioHelpers.js` returns one entry per person: open tasks, overdue tasks, remaining minutes (`remainingEstimate`, else `estimatedDuration`), the number of open tasks without either, open tasks due in the next 14 days, shared tasks, and a per-project breakdown. Tasks without `assignedTo` go to an "Unassigned" entry. It reuses `CLOSED_STATUSES` and `dueDateStatus`, so "open" and "overdue" mean the same on both views. + +The page reads what it reads today, one `fetchTasks` per project, and groups the result. No server aggregation is added: OpenRegister's aggregation can group by `assignedTo` but cannot sum one field while falling back to another, and the per-project breakdown needs the task rows anyway. + +Alternative considered: an aggregation widget grouped by `assignedTo` on the manifest dashboard, like "Per person" on the Time spent report (`src/manifest.json:203`). It gives one number per person, not the breakdown, and it cannot count tasks without an estimate. + +### Decision 2: primary assignee carries the hours + +A task's remaining estimate counts once, for `assignedTo`. People in `sharedWith` see the task in their "Shared" count, without hours. This keeps the total of the hours column equal to the total remaining estimate of the projects. + +### Decision 3: one page, two views, and a truthful label + +`Portfolio.vue` gets a two-button toggle, "By person" (default) and "By project", as a labelled group with `aria-pressed`. "By project" is today's table, unchanged, so the MVP requirement of `capacity-planning-resource.md` still holds. A portfolio picker and a project filter limit which projects are read; without them the page covers every active project the viewer can read, including projects reached as a portfolio reader. + +Each person's row is a disclosure: a button with the person's avatar and display name that shows the per-project breakdown under it. Hours are shown rounded to whole hours with the unit, and "9 tasks without an estimate" next to them. + +The manifest `_note` of the `Portfolio` page and the Capacity card description are rewritten to say what the page shows: open work per person and per project. + +## Risks / trade-offs + +- [A person with work in a project the viewer cannot read] -> The row covers only projects the viewer can read, and the page says "Showing work in the projects you can see". It never implies a full picture of someone's load. +- [Display names for people who left] -> A uid without a Nextcloud account is shown as the uid with "(no longer an account)", after the clean-up of `projects-members-and-roles` has removed them from projects but not from old tasks. + +## Open questions + +- Availability per person (contract hours, part-time factors, leave) lives in humaniq. A follow-up change can add an "Available" column read from humaniq with `requiredApp: humaniq`, hidden when humaniq is absent, as the time move already does. + +## Amendments at build time (2026-09-29) + +- "Tasks without an estimate" is its own column with the count, not the sentence "9 tasks without an estimate": the catalogues carry no plural forms, and a column reads the same in every locale. The e2e test reads the column. +- A uid whose display name does not resolve is shown as the uid. Nextcloud's autocomplete, which `src/utils/userNames.js` reads, answers the same for a removed account and an unmatched search, so "(no longer an account)" cannot be told apart reliably and is left out. +- The portfolio picker and the project filter work together: the filter lists the projects of the chosen portfolio, and with no project chosen the report reads every project of the portfolio (or every project when "All portfolios" is chosen). Tasks are read once per project and kept while the filters change. +- The per-project view now follows the same filters. diff --git a/openspec/changes/archive/2026-09-29-portfolio-people-capacity/proposal.md b/openspec/changes/archive/2026-09-29-portfolio-people-capacity/proposal.md new file mode 100644 index 00000000..431bd557 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-people-capacity/proposal.md @@ -0,0 +1,77 @@ +--- +kind: code +--- + +# Capacity per person across projects + +## Why + +The Capacity report does not show people. Its manifest page note says "one row per assignee aggregating allocation over the projects they appear in" (`src/manifest.json:151`), and the Reports card promises "How allocation is spread across the people working on projects" (`:163`). The page itself builds one row per project: `Portfolio.vue` loads the viewer's active projects, reads each project's tasks, and pushes a row with the project's member count, open tasks and overdue tasks (`src/views/Portfolio.vue:134-147`, helper `summariseProjectTasks` at `src/utils/portfolioHelpers.js:28-41`). A team lead who wants to know who is overloaded has to open every board and count cards. + +Jira Data Center has a user workload report that shows how much work each person has been given, per project. Xedule shows per team what is asked, what is available and what is planned. + +Parity rows: `prt-capacity` in planninq's `openspec/parity/capabilities.json`. +Decision: build, because the report is half built, its own label promises the missing half, and two competitors ship it. + +## What changes + +- The Capacity report shows one row per person: open tasks, overdue tasks, remaining estimated hours, work due in the next two weeks, and the projects that work sits in. +- Each person's row opens into a breakdown per project. +- Work nobody is assigned to has its own row, so it is not lost. +- The report can be limited to one portfolio or to chosen projects. +- The existing view per project stays, one click away. +- The manifest note and the Reports card describe what the page shows. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `prt-capacity`. + +### `prt-capacity`: See how allocation is spread across the people working on projects. + +- Area `portfolio`. Planninq is rated `partial`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "src/manifest.json:163 (Reports card 'Capacity') -> src/views/Portfolio.vue:134 fetchProjects({status:'active'}) + :137 fetchTasks(project.id) -> src/utils/portfolioHelpers.js:28 summariseProjectTasks(); columns Project/Members/Open/Overdue at src/views/Portfolio.vue:32-45" +- Defect: "src/manifest.json:151 page _note and :163 card description claim 'one row per assignee' / 'spread across the people', but src/views/Portfolio.vue:139-147 builds one row per project (code reading, needs a live check)" +- Note: "The page aggregates per PROJECT (member count, open and overdue task counts), not per person. Nothing groups work by assignee, so 'how allocation is spread across the people' is not what it shows." +- Demand: none recorded on the row. +- Competitors rated yes (2): + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html, https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps, https://confluence.atlassian.com/jirasoftwareserver/capacity-and-velocity-in-advanced-roadmaps-1044784184.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'User Workload Report: Shows how much work a user has been allocated, and how long it should take'; docs: https://confluence.atlassian.com/display/JIRASOFTWARESERVER/Capacity+and+velocity+in+Advanced+Roadmaps team capacity per sprint in hours or story points ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/reporting-939938675.html 'User Workload Report Shows how much work a user has been allocated ... the remaining workload, on a per-project basis'; https://confluence.atlassian.com/jirasoftwareserver/capacity-and-velocity-in-advanced-roadmaps-1044784184.html team capacity per ... (shortened; full text in the matrix row)" + - Xedule (https://support.xedule.nl/hc/nl/articles/33451846658194-Jaarplanning-Analyses-Teams-Budget): "docs read 2026-09-27: https://support.xedule.nl/hc/nl/articles/33451846658194-Jaarplanning-Analyses-Teams-Budget per team 'Vraag', 'Beschikbaar: De som van alle werktijdfactoren van medewerkers binnen het team' and 'Inzet'" + +## Scope + +### In scope + +- A per-person view of open work across the projects the viewer can read, with a per-project breakdown. +- Filters by portfolio and project. +- Keeping the per-project view, and correcting the page's descriptions. + +### Out of scope + +- Availability per person (contract hours, leave). That belongs to humaniq; design.md names it as an open question. +- Booking or moving work from this page. The report is read-only, as ADR-001 rule 4 keeps project and portfolio views of people's work. +- Time actually logged per person: the Time spent report (`src/manifest.json:193-213`) covers it. + +## Impact + +- View: `src/views/Portfolio.vue` gains a "By person" view, the default, next to "By project". +- Helper: a pure `summariseByAssignee` next to `summariseProjectTasks` in `src/utils/portfolioHelpers.js`. +- Manifest: the `Portfolio` page `_note` and the Capacity card description. +- Extends the flat spec `openspec/specs/capacity-planning-resource.md`. +- Depends on: `tasks-assignment-priority-labels` (lane A) for `sharedWith`, the extra assignees of a task. `projects-grouping-hierarchy-fields` for the portfolio filter and portfolio readers. + +## Risks + +### Risk 1: hours counted twice for shared tasks + +**Severity**: Medium +**Mitigation**: A task's remaining estimate counts for its primary assignee (`assignedTo`) only. People in `sharedWith` see the task in a separate "Shared" count without hours, and the column header says so. + +### Risk 2: estimates are missing on most tasks + +**Severity**: Medium +**Mitigation**: The row shows how many of the person's open tasks have no estimate next to the hours, so "12 h" with "9 tasks without an estimate" is not read as a light load. + +### Risk 3: a slow page on many projects + +**Severity**: Low +**Mitigation**: The page already reads tasks per project (`Portfolio.vue:136-137`). It keeps one read per project and groups in the browser, and the portfolio filter narrows the reads before they start. diff --git a/openspec/changes/archive/2026-09-29-portfolio-people-capacity/specs/people-capacity/spec.md b/openspec/changes/archive/2026-09-29-portfolio-people-capacity/specs/people-capacity/spec.md new file mode 100644 index 00000000..2696c92b --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-people-capacity/specs/people-capacity/spec.md @@ -0,0 +1,43 @@ +# people-capacity delta for portfolio-people-capacity + +## ADDED Requirements + +### Requirement: A team lead sees open work per person across projects + +The Capacity report MUST show one row per person who holds open work in the projects the viewer can read, with open tasks, overdue tasks, remaining estimated hours, the number of open tasks without an estimate, open tasks due in the next 14 days, and tasks shared with them. Open work without an assignee MUST have its own row. Each row MUST open into a breakdown per project. Tier: V1 (docs/FEATURES.md, "Team workload report (tasks per user)"). + +#### Scenario: Two people across two projects + +- **GIVEN** a user on the projects "Omgevingsvisie" and "Wegbeheer" +- **AND** "Ada Jansen" has 3 open tasks in "Omgevingsvisie" with 10 hours remaining and 2 open tasks in "Wegbeheer" without an estimate +- **AND** "Bram de Vries" has 1 open task in "Wegbeheer", past its due date, with 4 hours remaining +- **AND** 2 open tasks in "Wegbeheer" have no assignee +- **WHEN** the user opens the Capacity report at /portfolio +- **THEN** the "By person" view shows "Ada Jansen" with 5 open tasks, 10 h and "2 tasks without an estimate" +- **AND** "Bram de Vries" with 1 open task, 1 overdue and 4 h +- **AND** an "Unassigned" row with 2 open tasks +- **AND** opening "Ada Jansen" shows 3 tasks in "Omgevingsvisie" and 2 in "Wegbeheer" + +#### Scenario: Shared tasks do not double the hours + +- **GIVEN** an open task assigned to "Ada Jansen", shared with "Bram de Vries", with 6 hours remaining +- **WHEN** a user opens the "By person" view at /portfolio +- **THEN** "Ada Jansen" counts the 6 hours +- **AND** "Bram de Vries" shows the task under "Shared" without hours + +### Requirement: The report can be narrowed and switched to projects + +The Capacity report MUST let the viewer limit it to one portfolio or to chosen projects, and MUST keep the per-project view one control away. The page and its Reports card MUST describe what the page shows. Tier: V1 (docs/FEATURES.md, "Team workload report (tasks per user)"). + +#### Scenario: Switching between people and projects by keyboard + +- **GIVEN** a user on the Capacity report at /portfolio with the "By person" view +- **WHEN** the user moves focus to "By project" and presses Enter +- **THEN** the table shows one row per project with members, open and overdue tasks +- **AND** "By project" reports itself as pressed + +#### Scenario: Limiting to a portfolio + +- **GIVEN** a portfolio manager of "Ruimte" who is also on projects outside it +- **WHEN** the manager picks "Ruimte" in the portfolio picker on /portfolio +- **THEN** the rows count only open work in the projects of "Ruimte" diff --git a/openspec/changes/archive/2026-09-29-portfolio-people-capacity/tasks.md b/openspec/changes/archive/2026-09-29-portfolio-people-capacity/tasks.md new file mode 100644 index 00000000..a92fbdd3 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-people-capacity/tasks.md @@ -0,0 +1,16 @@ +# Tasks: portfolio-people-capacity + +## 1. Grouping (V1) + +- [x] 1.1 Add `summariseByAssignee` to `src/utils/portfolioHelpers.js`, reusing `CLOSED_STATUSES` and `dueDateStatus`, with the unassigned row, the missing-estimate count, the 14-day window and `sharedWith` handled as shared without hours. Verify: new cases in `tests/vitest/portfolio.spec.js` for each field, the unassigned row and a shared task. + +## 2. Page (V1) + +- [x] 2.1 Add the "By person" view as the default of `src/views/Portfolio.vue`, with a disclosure per person for the per-project breakdown, and keep "By project" unchanged behind a toggle with `aria-pressed`. Verify: `tests/e2e/capacity.spec.ts` "two people across two projects" and "switching between people and projects by keyboard" on seeded data. +- [x] 2.2 Add the portfolio picker and project filter, reading only the chosen projects. Verify: e2e "limiting to a portfolio"; `tests/vitest/portfolio.spec.js` case that tasks outside the chosen projects are not counted. +- [x] 2.3 Rewrite the `_note` of the `Portfolio` page and the Capacity card description in `src/manifest.json`. Verify: the Reports page e2e reads the new card text. + +## 3. Verification + +- [x] 3.1 `openspec validate portfolio-people-capacity --type change --strict` passes. +- [x] 3.2 Every scenario in specs/ is covered by a test named in the task above it, or carries an `@e2e exclude ` note. diff --git a/openspec/changes/archive/2026-09-29-portfolio-status-overview/design.md b/openspec/changes/archive/2026-09-29-portfolio-status-overview/design.md new file mode 100644 index 00000000..2aa61b61 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-status-overview/design.md @@ -0,0 +1,89 @@ +# Design: portfolio overview, status per aspect and a multi-project timeline + +## Context + +What exists at `de35541`: + +- **Portfolio page.** `Portfolio.vue` loads `fetchProjects({ status: 'active' })` (`src/views/Portfolio.vue:134`), then `fetchTasks` per project, and renders one table row per project with members, open, overdue and an open-work bar (`:29-69`). `fetchProjects` keeps only projects whose `members` include the viewer (`src/store/projects.js:195-197`). The page is reached from the Reports card "Capacity" (`src/manifest.json:163`); the menu has no Portfolio entry (`:48-58`). +- **Project data.** `project` has `status`, `startDate`, `endDate` and the budget fields (`lib/Settings/planninq_register.json:445-580`), and no health or report field. +- **Timeline.** `TimelineController::forProject` (`lib/Controller/TimelineController.php:123-205`) finds the project through ObjectService with RBAC on, reads its tasks with the single filter `project` (`:214-240`) and its dependencies (`:264`), and returns rows with start, due, duration and status. `src/api/timeline.js` calls it for one project. `ProjectTimeline.vue` draws it. +- **Open navigation change.** `adopt-five-menu-navigation-ia` plans the Portfolio menu of ADR-001. It is not built. + +From other changes of this pass: portfolios and `portfolioReaders` (`projects-grouping-hierarchy-fields`), risk scores and bands (`projects-overview-logs-risks`), budget and actual cost per project (`portfolio-finance`). + +## Goals / non-goals + +Goals: + +- One list of a portfolio's projects with the facts a portfolio office asks for. +- GROTIK status per project with history, rolled up per portfolio. +- Several projects on one read-only timeline. + +Non-goals: + +- Editing on the timeline. +- Automatic status without a person deciding. + +## Decisions + +### Decision 1: a status report is its own object; the latest one is copied onto the project + +`projectStatusReport` has `project`, `reportDate`, and for each aspect a status (`onTrack`, `atRisk`, `offTrack`) and a note: `money`, `organisation`, `time`, `information`, `quality` and `risk`, as flat properties such as `statusMoney` and `noteMoney`. `overall` is a materialised `x-openregister-calculations` value: the worst of the six. The author and save time come from OpenRegister's metadata. Its rights follow the project: managers write, everyone who can read the project reads. + +A listener on report create, update and delete copies the newest report's statuses and date onto the project's `health` fields. The portfolio overview then reads projects only, and OpenRegister's aggregation can count `healthMoney` per value with an equality filter on `portfolio`, the only filter shape it applies (`src/manifest.json:170`). + +Alternative considered: six status fields on the project, edited in place. It is simpler, but every report overwrites the last one, and the tender asks for status reporting over time. + +### Decision 2: planninq suggests, the project leader decides + +The report form (`/projects/:id/status`, a tab in `ProjectTabs`) pre-selects nothing. Next to three aspects it shows a suggestion with its reason: + +- money: at risk when actual plus commitments pass 90 percent of the budget, off track above 100 percent (from `portfolio-finance`); +- time: at risk when any open task is past its due date, off track when the project's `endDate` has passed with open tasks; +- risk: the band of the highest-scored open risk (from `projects-overview-logs-risks`). + +Organisation, information and quality have no suggestion. The thresholds are named constants in one helper so a later admin setting can replace them. + +### Decision 3: the portfolio overview is a new page under Portfolio + +`PortfolioStatus` at `/portfolio/status` has a portfolio picker and a table with a row per project the viewer can read in that portfolio, including projects the viewer reaches only as a portfolio reader. Columns: project, lifecycle status, progress (done over not cancelled), start and end date, budget and actual cost when the viewer may see money, the six aspect statuses, and the last report date. Each aspect status is shown as a word and an icon as well as a colour token, so colour is never the only signal. + +Above the table, the roll-up shows per aspect how many projects are on track, at risk and off track, and the portfolio's state for that aspect, which is the worst of its projects. A project without any report counts as "No report" and is listed separately, not as on track. + +The existing `Portfolio.vue` stays the capacity page (see `portfolio-people-capacity`). Where the Portfolio landing page sits is decided by `adopt-five-menu-navigation-ia`; until then the Reports page gets cards for the status overview and the timeline. + +### Decision 4: the multi-project timeline reads through one endpoint + +`TimelineController` gains `GET /apps/planninq/api/timeline?projects=` for up to 50 projects. It runs the same RBAC-scoped read as `forProject` for each id and leaves out any project the caller cannot read, listing it in `skipped` rather than failing the whole answer. Each project comes back with a summary span (its `startDate` and `endDate`, else the earliest start and latest due date of its tasks), its phases and its task rows. Dependencies between tasks of two different projects in the answer are included as edges. + +`PortfolioTimeline` at `/portfolio/timeline` draws one summary bar per project, sorted by start date, which opens into phases and tasks on click or Enter. It is read-only and reuses the bar and axis code of `ProjectTimeline.vue`. + +Alternative considered: calling the per-project endpoint once per project from the browser. For a portfolio of 40 projects that is 40 requests before anything draws, and cross-project edges would need a second pass. + +## Risks / trade-offs + +- [A 50-project answer is slow] -> The endpoint reads each project's tasks with one filtered query, as `forProject` does; task 3.1 measures 50 projects of 100 tasks and the limit drops if the answer takes over two seconds. +- [Portfolio readers without the `$lookup` answer] -> The overview relies on `portfolioReaders` from `projects-grouping-hierarchy-fields`, which works without a lookup rule. +- [A stale report looks current] -> The table shows the report date, and a report older than the admin's reporting period (default 30 days) is marked "Out of date" in text. + +## Built at HEAD (first PR, 29 Sep 2026) + +The code at `94c2eda` differs from what this design assumed in four places. The first PR follows the code and says so here. + +- **Who writes a report.** `projects-members-and-roles` is not built, so there is no manager role. The project owner and admins write reports, as they manage columns. `ProjectStatusListener` enforces it on `ObjectCreatingEvent`, `ObjectUpdatingEvent` and `ObjectDeletingEvent` with the error code `planninq-not-the-project-owner`; members read reports through the `members` rule like every project-scoped schema. When the roles land, the owner check widens to managers. +- **Where the copy runs.** ADR-078 (gate-61) keeps synchronous writes out of post-event listeners, so the copy runs in the report's own pre-event: the listener knows the report's new data (or that it is leaving) and works out the newest report from the stored ones plus that one. It writes the project inside OpenRegister's `SystemOperationContext`. Newest is the latest `reportDate`; on a tie the report being saved wins. +- **How the health fields are protected.** OpenRegister's `readOnly` would refuse the project settings form, which sends the whole project back with its health. The same listener instead restores the stored health on a project update from anyone but the system scope, and empties it on a project create. Nobody gets an error; nobody changes the health either. +- **The money suggestion.** No cost is recorded anywhere yet: `portfolio-finance` adds cost lines. The money suggestion therefore says "No suggestion: no costs are recorded for this project yet." (or "the project has no budget"), and `suggestMoney()` already applies the 90 and 100 percent thresholds, named in `src/utils/statusReports.js` as `MONEY_AT_RISK_RATIO`, for when `portfolio-finance` passes a cost. +- **A wiring gap it found.** `ProjectMemberAccessListener` was subscribed for `task`, `column`, `projectPhase` and `plannedTimeEntry` only, while `ProjectMembershipService::SCOPED_SCHEMAS` also held `projectLogEntry` and `risk` (#708). Log entries and risks were therefore never stamped with their project's members on a live instance. The subscription now lists every scoped schema, including `projectStatusReport`, and `BoardColumnWiringTest` asserts the two lists are equal. The app version bump runs `BackfillProjectMembers`, which stamps the entries and risks already written. + +Sections 2 and 3 need portfolios (`project.portfolio` and portfolio readers from `projects-grouping-hierarchy-fields`), which are not built. They follow in a second PR once portfolios exist, and this change is archived with that PR. + +## Built at HEAD (second PR, 29 Sep 2026) + +Sections 2 and 3 were built on `5172b4c`, after portfolios landed (#714). Five places differ from the decisions above. + +- **The roll-up runs in the browser.** Decision 1 counted the `health` fields with OpenRegister's aggregation and an equality filter on `portfolio`. The overview loads the portfolio's readable projects anyway to draw its rows, so `portfolioRollup()` in `src/utils/portfolioStatus.js` counts them from that same list. It sees exactly the projects the rows show, including the ones the viewer reads as a portfolio reader, and it needs no second request. +- **Progress comes from the timeline endpoint.** The rows read the tasks of every shown project through one `GET /api/timeline?projects=` call instead of one task request per project. +- **Who sees money.** Project roles are not built (`projects-members-and-roles`), so the budget column shows for admins, the project's owner and the portfolio's managers (`canSeeMoney()`). Actual cost is not shown: no cost is recorded until `portfolio-finance`. +- **The portfolio is chosen in the address.** Both pages read `?portfolio=` and default to the first portfolio in list order, so a link opens the same portfolio. +- **The limit and its measurement.** `forProjects()` refuses more than 50 ids with a 400; the browser client asks in batches of 50, so edges between two batches are not drawn. For 50 projects of 100 tasks the controller's own work took 19.5 ms on a fixture (500 edges, 776 kB of JSON); it makes 50 finds, 50 task reads, 50 phase reads and one dependency read against OpenRegister, whose query time the fixture does not include. diff --git a/openspec/changes/archive/2026-09-29-portfolio-status-overview/proposal.md b/openspec/changes/archive/2026-09-29-portfolio-status-overview/proposal.md new file mode 100644 index 00000000..d54559c0 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-status-overview/proposal.md @@ -0,0 +1,98 @@ +--- +kind: code +--- + +# Portfolio overview, status per aspect and a multi-project timeline + +## Why + +A portfolio office cannot see how its projects are doing. The only cross-project page is Portfolio (`src/views/Portfolio.vue`), reached from a Reports card (`src/manifest.json:163`). It loads the active projects the viewer is a member of (`Portfolio.vue:134` through `fetchProjects`, with the member filter at `src/store/projects.js:195-197`) and shows members, open tasks and overdue tasks per project (`Portfolio.vue:29-69`). It shows no lifecycle status, progress, dates, money or health, and it cannot be limited to one portfolio. + +A project leader cannot report status the way Dutch municipalities do. There is no per-aspect status on the project (`lib/Settings/planninq_register.json:445-580`) and no report history. Gemeente Sittard-Geleen asks in tender 365739 (https://www.tenderned.nl/aankondigingen/overzicht/365739) for a status per project on money, organisation, time, information, quality and risk, the aspects of the GROTIK method, rolled up to the portfolio (requirements 4020, 4129, 24322, 64437). + +Nobody can see several projects on one timeline. `ProjectTimeline.vue` is scoped to one `:id`, and its endpoint `GET /apps/planninq/api/projects/{projectId}/timeline` (`lib/Controller/TimelineController.php:123`) reads one project. + +OpenProject and Jira Data Center show many projects in one status list and on one timeline. + +Parity rows: `prt-portfolio`, `prt-status-grotik`, `pln-multi-project-timeline` in planninq's `openspec/parity/capabilities.json`. +Decision: build. The portfolio view is half built and the missing half matters, with two competitors rated yes. The per-aspect status answers the tender. The multi-project timeline has two competitors rated yes. + +## What changes + +- A portfolio overview lists every project of a chosen portfolio the viewer can read, with lifecycle status, progress, dates, money, the six aspect statuses and the date of the last report. +- A project leader writes a status report: on track, at risk or off track for money, organisation, time, information, quality and risk, each with a short note. Planninq suggests a status for money, time and risk from the project's own data. +- The portfolio overview rolls the six aspects up: how many projects are in each state per aspect, and the portfolio's worst state per aspect. +- A multi-project timeline shows the projects of a portfolio on one time axis, each project a summary bar that opens into its phases and tasks. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `prt-portfolio`, `prt-status-grotik`, `pln-multi-project-timeline`. + +### `prt-portfolio`: See the state of all projects in one portfolio view. + +- Area `portfolio`. Planninq is rated `partial`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "src/manifest.json:163 -> src/views/Portfolio.vue:134 fetchProjects({status:'active'}) -> src/store/projects.js:170 fetchProjects() (client-side member filter at :195) -> OpenRegister /api/objects/planninq/project" +- Note: "One table over projects, but only ACTIVE projects the viewer is a member of, and only members/open/overdue counts: no status, progress, dates, budget or health per project. Portfolio is not in the main menu, only a Reports card." +- Demand: none recorded on the row. +- Competitors rated yes (2): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-lists/README.md:44 'create a multi-project status dashboard if you include your own project attributes or project life cycle phases' and project status filters (:129); portfolio and program workspaces are Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/models/queries/projects/filters/project_status_filter.rb:35 project status on the free projects list with custom project attribute columns; app/components/projects/index_page_header_component.rb:64-66 open all as one Gantt; ... (shortened; full text in the matrix row)" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html issue sources 'determine which projects, boards, and filters you want to import', a plan holds up to 100 projects (Advanced Roadmaps, bundled) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html 'Issue sources - Choose which projects, boards, and filters you want to import'; 'For a program: Connected plans - choose the plans you want to c[onnect]' (read 2026-09-26)" + +### `prt-status-grotik`: Report each project's status on money, organisation, time, information, quality and risk, and roll it up to the portfolio. + +- Area `portfolio`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "The only per-project roll-up is src/views/Portfolio.vue:29-69 (members, open, overdue, open-work bar) fed by src/store/projects.js:170 fetchProjects. No per-aspect status property on the project schema (lib/Settings/planninq_register.json:450-580) and no portfolio roll-up of such statuses." +- Note: "Demand row from TenderNed 365739, gemeente Sittard-Geleen, Projectmanagementtool (published 2025-01-31, intelligence database tender id 285): requirements 4020, 4129, 24322, 64437 (GROTIK status per project, aggregated per portfolio)." +- Demand (tender, via origin): https://www.tenderned.nl/aankondigingen/overzicht/365739 +- Competitors rated yes: none. + +### `pln-multi-project-timeline`: See several projects on one timeline. + +- Area `planning`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "src/views/ProjectTimeline.vue is scoped to one :id (route /projects/:id/timeline); src/views/Portfolio.vue (route /portfolio) is a per-project capacity bar chart of open-task counts, not a shared Gantt/timeline" +- Note: "Portfolio is the closest cross-project view and it is a bar chart, not a timeline." +- Demand: none recorded on the row. +- Competitors rated yes (2): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/menu-tree.md global module 'Gantt charts' across projects; docs: opf/openproject HEAD 27a58131 docs/user-guide/gantt-chart OpenProject-overarching-project-planning.png (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: modules/gantt/config/routes.rb:16-24 global Gantt outside any project; modules/gantt/lib/open_project/gantt/engine.rb:60 global menu item; app/components/projects/index_page_header_component.rb:64-66 'Open as Gantt' from the project list via app/services/projects/gantt_query_generator_service.rb" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html, https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/creating-a-board-938845220.html 'A board displays issues from one or more projects'; Advanced Roadmaps plans take several projects and boards as sources (corpus: jira-data-center/round4/M1-column.md 8.8 plan releases across a plan) ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/plans-1044784166.html 'Issue sources - Choose which projects, boards, and filters you want to import'; 'A single plan can load up to 5,000 issues and can't contain more than 100 projects' (read 2026-09-26)" + +## Scope + +### In scope + +- A `projectStatusReport` schema, the report form, report history, and the latest statuses copied onto the project. +- The portfolio status overview and its roll-up. +- A read-only multi-project timeline. + +### Out of scope + +- Editing dates on the timeline: `planning-timeline-editing` (lane B). +- The capacity page: `portfolio-people-capacity`. +- Money figures themselves: `portfolio-finance`, which this change reads. +- Sprints of any kind. Planninq is kanban-only by a recorded decision (`docs/ARCHITECTURE.md:149`). + +## Impact + +- Schema: new `projectStatusReport`; `project` gains `health` fields for the latest report (`healthMoney`, `healthOrganisation`, `healthTime`, `healthInformation`, `healthQuality`, `healthRisk`, `healthOverall`, `healthDate`). +- Listener: copies the newest report onto its project. +- Controller: `TimelineController` gains a read for several projects at once, RBAC-scoped like the single read. +- Views: a Status tab on the project (`/projects/:id/status`), a portfolio overview (`/portfolio/status`) and a portfolio timeline (`/portfolio/timeline`). +- Extends the flat spec `openspec/specs/portfolio-dashboard-pmo.md` and the capability folder `gantt-timeline-view`. +- Depends on: `projects-grouping-hierarchy-fields` (portfolios and portfolio readers), `projects-overview-logs-risks` (risk scores and `ProjectTabs`), `portfolio-finance` (budget and actual cost for the money suggestion). + +## Risks + +### Risk 1: a copied status drifts from its report + +**Severity**: Medium +**Mitigation**: Only the listener writes the `health` fields, from the newest report by `reportDate`. A property rule lets no user write them, and deleting the newest report copies the one before it. + +### Risk 2: a suggestion read as a judgement + +**Severity**: Low +**Mitigation**: A suggestion is shown next to the choice with its reason ("3 tasks are past their due date"), and the project leader always picks the status. A report never saves a suggestion the leader did not choose. + +### Risk 3: another schema changes the schema count + +**Severity**: Low +**Mitigation**: Task 1.4 updates `testRegisterDeclaresExactlySevenSchemas` and `openspec/specs/project-delivery/spec.md:68-72`. diff --git a/openspec/changes/archive/2026-09-29-portfolio-status-overview/specs/gantt-timeline-view/spec.md b/openspec/changes/archive/2026-09-29-portfolio-status-overview/specs/gantt-timeline-view/spec.md new file mode 100644 index 00000000..54605b61 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-status-overview/specs/gantt-timeline-view/spec.md @@ -0,0 +1,22 @@ +# gantt-timeline-view delta for portfolio-status-overview + +## ADDED Requirements + +### Requirement: Several projects can be viewed on one timeline + +The portfolio timeline MUST show the projects of a chosen portfolio on one time axis, each as a summary bar that opens into its phases and tasks. It MUST read all projects through one RBAC-scoped request, MUST leave out projects the viewer cannot read, and MUST draw dependencies between tasks of different projects when both ends are shown. It MUST be read-only and operable by keyboard. Tier: V1 (docs/FEATURES.md has no row; it extends this capability's single-project timeline). + +#### Scenario: A portfolio on one axis + +- **GIVEN** a portfolio manager of "Ruimte", which holds three projects with planned dates +- **WHEN** the manager opens the portfolio timeline at /portfolio/timeline and picks "Ruimte" +- **THEN** three summary bars are drawn on one axis, sorted by start date +- **AND** moving focus to a bar and pressing Enter shows that project's phases and task bars under it + +#### Scenario: Projects the viewer cannot read are left out + +@e2e exclude API-level filtering with no screen, asserted by TimelineControllerTest (task 3.1) +- **GIVEN** a user who can read two of three requested projects +- **WHEN** the user sends `GET /apps/planninq/api/timeline?projects=a,b,c` +- **THEN** the answer holds the two readable projects +- **AND** lists the third under `skipped` without any of its tasks diff --git a/openspec/changes/archive/2026-09-29-portfolio-status-overview/specs/portfolio-overview/spec.md b/openspec/changes/archive/2026-09-29-portfolio-status-overview/specs/portfolio-overview/spec.md new file mode 100644 index 00000000..11cdf3de --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-status-overview/specs/portfolio-overview/spec.md @@ -0,0 +1,25 @@ +# portfolio-overview delta for portfolio-status-overview + +## ADDED Requirements + +### Requirement: A portfolio office sees every project of a portfolio in one list + +The portfolio overview MUST list, for a chosen portfolio, every project in it that the viewer can read, whether the viewer is a member or a portfolio reader, and in any lifecycle status. Each row MUST show the lifecycle status, progress, planned dates, the six aspect statuses with the last report date, and the budget and actual cost when the viewer may see money. Tier: Enterprise (docs/FEATURES.md, "Project portfolios (grouping across projects)"). + +#### Scenario: A portfolio manager opens the overview + +- **GIVEN** a portfolio manager of "Ruimte", which holds three projects, one of them completed, and the manager is a member of none +- **WHEN** the manager opens the portfolio overview at /portfolio/status and picks "Ruimte" +- **THEN** all three projects are listed with their lifecycle status, progress and dates +- **AND** each aspect status is shown as a word and an icon, not only as a colour + +### Requirement: The six aspects roll up to the portfolio + +Above the list, the overview MUST show for each aspect how many projects are on track, at risk and off track, and the portfolio's state for that aspect, which is the worst state among its projects. Projects without a report MUST be counted apart as "No report". A report older than the reporting period MUST be marked out of date. Tier: Enterprise (docs/FEATURES.md has no row; tender 365739 requirements 4020 and 64437). + +#### Scenario: The roll-up of a portfolio + +- **GIVEN** the portfolio "Ruimte" with four projects: two report money on track, one reports money off track, and one has no report +- **WHEN** a portfolio manager opens /portfolio/status for "Ruimte" +- **THEN** the money roll-up reads "2 on track, 0 at risk, 1 off track, 1 no report" +- **AND** the portfolio's money state reads "Off track" diff --git a/openspec/changes/archive/2026-09-29-portfolio-status-overview/specs/project-status-report/spec.md b/openspec/changes/archive/2026-09-29-portfolio-status-overview/specs/project-status-report/spec.md new file mode 100644 index 00000000..892065d1 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-status-overview/specs/project-status-report/spec.md @@ -0,0 +1,32 @@ +# project-status-report delta for portfolio-status-overview + +## ADDED Requirements + +### Requirement: A project leader reports status on six aspects + +A project owner or manager MUST be able to write a dated status report that sets money, organisation, time, information, quality and risk each to on track, at risk or off track, with a note per aspect. The overall status MUST be the worst of the six and MUST be calculated by the server. Earlier reports MUST stay readable as history. Tier: Enterprise (docs/FEATURES.md has no row; tender 365739 requirements 4020, 4129, 24322 and 64437). + +#### Scenario: Writing a status report + +- **GIVEN** a project manager on the Status tab at /projects/:id/status +- **WHEN** the manager presses "New report", sets time to "At risk" with the note "Permit delayed by 3 weeks", sets the other five aspects to "On track" and saves +- **THEN** the tab shows the report with today's date, the manager's name and the overall status "At risk" +- **AND** the report history lists it above the earlier reports + +#### Scenario: The server decides the overall status + +@e2e exclude Server-side calculation with no screen, asserted by a PHPUnit schema test and a live POST in task 1.1 +- **GIVEN** a project manager +- **WHEN** the manager sends `POST /apps/openregister/api/objects/planninq/projectStatusReport` with `statusQuality` "offTrack", the other statuses "onTrack", and `overall` "onTrack" +- **THEN** the stored report has `overall` "offTrack" + +### Requirement: Planninq suggests a status for money, time and risk + +The report form MUST show a suggested status with its reason for money, time and risk, based on the project's budget and costs, its task due dates and end date, and its open risks. It MUST NOT choose a status for the project leader. Tier: Enterprise (docs/FEATURES.md has no row). + +#### Scenario: A time suggestion from late tasks + +- **GIVEN** a project with 3 open tasks past their due date +- **WHEN** a project manager opens "New report" on the Status tab +- **THEN** next to "Time" the form shows "Suggested: at risk. 3 tasks are past their due date." +- **AND** no status is selected for "Time" until the manager picks one diff --git a/openspec/changes/archive/2026-09-29-portfolio-status-overview/tasks.md b/openspec/changes/archive/2026-09-29-portfolio-status-overview/tasks.md new file mode 100644 index 00000000..7f6967fd --- /dev/null +++ b/openspec/changes/archive/2026-09-29-portfolio-status-overview/tasks.md @@ -0,0 +1,28 @@ +# Tasks: portfolio-status-overview + +## 1. Status reports (Enterprise) + +- [x] 1.1 Add the `projectStatusReport` schema with the six statuses and notes, `overall` as a materialised calculation, and project-scoped rights. Verify: `tests/unit/Settings/PlanninqRegisterSchemaTest.php` asserts the calculation; a live POST with a wrong `overall` stores the worst status. +- [x] 1.2 Add the `health` fields to `project` with a property rule that no user writes them, and a listener that copies the newest report on create, update and delete. Verify: `tests/unit/Listener/ProjectStatusListenerTest.php` constructs the real OpenRegister event classes and covers a newer report, an older report and deleting the newest. +- [x] 1.3 Add the Status tab (`/projects/:id/status`) with the report form, history and suggestions for money, time and risk. Verify: `tests/vitest/statusSuggestions.spec.js` for each threshold; `tests/e2e/project-status.spec.ts` "writing a status report" and "a time suggestion from late tasks". +- [x] 1.4 Update `testRegisterDeclaresExactlySevenSchemas` and `openspec/specs/project-delivery/spec.md:68-72` for `projectStatusReport`. Verify: the PHPUnit suite passes. + +Done in the first PR (see design, "Built at HEAD"): 1.1 is proven by `PlanninqRegisterSchemaTest::testProjectStatusReportSchemaCalculatesTheOverallStatus` and by OpenRegister's own CalculationEvaluator on four payloads (quality off track with overall "onTrack" sent: stored "offTrack"); 1.2 by `tests/unit/Listener/ProjectStatusListenerTest.php` on the real event classes; 1.3 by `tests/vitest/statusSuggestions.spec.js` and `tests/e2e/project-status.spec.ts`; 1.4 renamed the test to `testRegisterDeclaresExactlyElevenSchemas`. + +## 2. Portfolio overview (Enterprise) + +- [x] 2.1 Add the `PortfolioStatus` page (`/portfolio/status`) with the portfolio picker, the project rows and the money columns for viewers who may see money. Verify: e2e `tests/e2e/portfolio-status.spec.ts` "a portfolio manager opens the overview". +- [x] 2.2 Add the roll-up from OpenRegister aggregation on the `health` fields with an equality filter on `portfolio`, the "No report" count, and the out-of-date marker driven by a `status_report_period_days` admin setting (default 30). Verify: `tests/vitest/portfolioRollup.spec.js` for the worst-state rule and the no-report count; e2e "the roll-up of a portfolio". +- [x] 2.3 Add Reports cards for the status overview and the timeline in `src/manifest.json`. Verify: the Reports page e2e lists both cards. + +## 3. Multi-project timeline (V1) + +- [x] 3.1 Add `GET /api/timeline?projects=` to `TimelineController`, reusing the per-project read, with `skipped` and cross-project edges, and measure 50 projects of 100 tasks. Verify: new cases in `tests/unit/Controller/TimelineControllerTest.php` for skipped projects and cross-project edges; the timing in the PR body. +- [x] 3.2 Add the `PortfolioTimeline` page (`/portfolio/timeline`) with summary bars that open by click and Enter, reusing the bar code of `ProjectTimeline.vue`. Verify: `tests/e2e/portfolio-timeline.spec.ts` "a portfolio on one axis". + +## 4. Verification + +- [x] 4.1 `openspec validate portfolio-status-overview --type change --strict` passes. +- [x] 4.2 Every scenario in specs/ is covered by a test named in the task above it, or carries an `@e2e exclude ` note. + +Done in the second PR (see design, "Built at HEAD (second PR)"): 2.1 by `tests/e2e/portfolio-status.spec.ts` and `canSeeMoney()` in `tests/vitest/portfolioRollup.spec.js`; 2.2 by `tests/vitest/portfolioRollup.spec.js` (worst state, no-report count, out of date) and `SettingsServiceTest::testStatusReportPeriodDefaultsToThirtyAndAcceptsWholeDays`; 2.3 by `tests/e2e/app-chrome.spec.ts` (both cards listed); 3.1 by `TimelineControllerTest` (`testForProjectsListsUnreadableProjectsUnderSkipped`, `testForProjectsIncludesCrossProjectEdges`, `testForProjectsSummarySpanAndPhases`, `testForProjectsLimitsTheListToFifty`, `testForProjectsUnauthenticatedReturns401`), timing in the design; 3.2 by `tests/vitest/portfolioTimeline.spec.js` and `tests/e2e/portfolio-timeline.spec.ts`. diff --git a/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/design.md b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/design.md new file mode 100644 index 00000000..682a2e54 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/design.md @@ -0,0 +1,91 @@ +# Design: portfolios, subprojects and custom project fields + +## Context + +What exists at `de35541`: + +- **Project list.** `ProjectList.vue` renders `filteredProjects` as one `ul` of `ProjectListItem` (`src/views/ProjectList.vue:86-92`), filtered by status chips (`:220-227`) and a search term (`:238-249`). `Boards.vue` shows the same projects as cards (`src/views/Boards.vue:22-40`). +- **Project schema.** No category, folder, portfolio or parent property (`lib/Settings/planninq_register.json:445-580`). `metadata` (`:576-581`) is a declared catch-all for import provenance. Read access is `members` only (`:404-443`). +- **Listeners.** Planninq already listens to OpenRegister object events: `TaskDependencyCleanupListener` handles `ObjectDeletingEvent` and uses `TaskScopeResolver` to tell a planninq task from any other object (`lib/Listener/TaskScopeResolver.php:88`). Listeners are registered in `lib/AppInfo/Application.php:466-510`. +- **Existing portfolio page.** `Portfolio.vue` at `/portfolio` aggregates capacity per project (`src/manifest.json:151`). It knows no portfolio entity. + +What OpenRegister offers, read at `ConductionNL/openregister` development `c53dd0685`: + +- `ObjectCreatingEvent` and `ObjectUpdatingEvent` are stoppable: a listener can reject a write with `stopPropagation()` and `setErrors()` (`lib/Event/ObjectUpdatingEvent.php:33`, `:126`, `:139`). + +## Goals / non-goals + +Goals: + +- Portfolios as a shared way to group projects, with read rights for the people who run them. +- One level of meaning for hierarchy: a project can have a parent, and the parent sees its children. +- Admin-defined project fields with typed values. + +Non-goals: + +- Roll-ups beyond progress (next changes in this series). +- Task custom fields. + +## Decisions + +### Decision 1: a portfolio is its own schema, not a kind of project + +`portfolio` has `title`, `description`, `color`, `managers` (user ids), `order` and an optional `riskScale` that overrides the app-wide `risk_scale`. Every signed-in user can read a portfolio's name, so the list can group by it. Admins and the portfolio's managers edit it. A project manager sets `project.portfolio`. + +Alternative considered: a portfolio as a project with `kind: 'portfolio'` and children, as OpenProject does with workspace types. It would give a portfolio a board, tasks and members it has no use for, and it would mix grouping with the parent chain of Decision 3. + +### Decision 2: portfolio managers read the projects in their portfolio + +A portfolio office has to see every project it is accountable for, including ones it is not a member of. `project` gains `portfolioReaders`, a user id list, and a read rule `{"portfolioReaders": {"$contains": "$userId"}}`. It is derived, never typed in: the listener of Decision 3 writes it when `project.portfolio` changes, and a portfolio update rewrites it on every project in that portfolio. Any value a client sends is replaced. + +The project-scoped schemas (`task`, `column`, `projectPhase`, `plannedTimeEntry`, and `risk` and `projectLogEntry` from `projects-overview-logs-risks`) gain the same path on read only, through whichever project-scoped mechanism `projects-members-and-roles` task 1.1 settles on. The role helper of that change returns `viewer` for a portfolio reader, so the board opens read-only. + +This is the only derived list in the design, and it exists because of the `$lookup` question in `projects-members-and-roles` task 1.1. If that task shows a lookup rule scopes correctly, the derived list is replaced by a lookup on `portfolio.managers` and removed. + +### Decision 3: a parent reference, guarded by a listener + +`project.parent` is an optional `$ref` to another project. `ProjectHierarchyGuardListener` handles `ObjectCreatingEvent` and `ObjectUpdatingEvent` for the `project` schema and rejects a write when the new parent is the project itself or one of its descendants, or when the chain would be deeper than three levels (programme, project, subproject). It uses the same scope check as `TaskScopeResolver`. + +A child can sit in a different portfolio from its parent. The parent's overview lists its children with their own progress, and adds their tasks to its progress figure. The project list shows children indented under their parent when both are visible, with an expand control that is a real button and announces its state. + +Alternative considered: a `programme` schema above projects. It fixes the depth at two and cannot express a subproject under a project, which OpenProject users rely on. + +### Decision 4: custom fields are definitions plus one value object + +`fieldDefinition` has `key` (stable, lower camel case), `label`, `type` (`text`, `number`, `date`, `choice`, `person`, `boolean`), `options` (for `choice`), `required`, `order` and `appliesTo` (`project` only in this change). Admins manage them in Beheer, and project managers see them read-only there, following ADR-001 rule 7. + +Values live in `project.customFields`, an object keyed by `key`. The guard listener checks each value against its definition and rejects wrong types and empty required fields. The Details tab of the project settings sidebar renders one input per definition, each with a visible label, and the overview shows the filled ones. + +Alternative considered: letting admins add properties to the `project` schema itself. The next register import would overwrite them, because `lib/Settings/planninq_register.json` is the source the repair step imports. + +## Risks / trade-offs + +- [A deleted portfolio strands its projects] -> Deleting a portfolio clears `project.portfolio` and `portfolioReaders` on its projects in the same listener pass, and the dialog says how many projects that affects. +- [A deleted field definition leaves values behind] -> Values stay in `customFields` but are not shown. Restoring a definition with the same `key` brings them back. +- [Project lists get slower with grouping and trees] -> Grouping and nesting are done in the browser over the list `fetchProjects` already loads. Nothing new is fetched per group. + +## Built at HEAD, section 1 (29 Sep 2026) + +The code at `c4a6694` settled three questions this design left open. + +- **The project-scoped mechanism** (Decision 2 pointed at `projects-members-and-roles` task 1.1, not built) is the denormalised list planninq#681 introduced for `members`. Every project-scoped schema (`task`, `column`, `projectPhase`, `plannedTimeEntry`, `projectLogEntry`, `risk`, `projectStatusReport`) gains a hidden `portfolioReaders` list and a read-only rule `{"portfolioReaders": {"$contains": "$userId"}}`; update and delete stay members-only. `ProjectMemberAccessListener` stamps the list from the project on every write, `ProjectMembershipSyncListener` copies a changed list to the project's objects, and `BackfillProjectMembers` fills it on upgrade. +- **Who may write the derived list.** `ProjectHierarchyGuardListener` sets `project.portfolioReaders` to the portfolio's managers on every project create and update from a person, whatever the client sent. When a portfolio's managers change or it is deleted, it writes the projects inside OpenRegister's `SystemOperationContext` (which it trusts, and which raises no post-event) and copies the list to each project's objects itself. All of it runs on pre-events (ADR-078). +- **Where portfolios are managed.** A declarative index page, Projects > Portfolios (`/projects/portfolios`), over the portfolio schema. OpenRegister enforces the rights: every signed-in user reads, admins create and delete, managers edit. The portfolio's own risk scale is a JSON string on the portfolio in the shape of the app-wide `risk_scale`; the Risks tab uses it when set. A dedicated editor for it is not built. + +The board opens read-only for a portfolio manager who is not on the project: a note says so, cards do not drag and the move menu is hidden. The server refuses their writes the same way. There is no role helper yet (`projects-members-and-roles`), so the rule lives in `isReadOnlyFor()` in `src/utils/portfolioGrouping.js`. + +- **The schema slug is `projectPortfolio`, not `portfolio`.** learniq owns the `portfolio` slug (a learner's portfolio), and slugs are global on a shared OpenRegister (gate-106). The project property stays `project.portfolio`; only the schema slug carries the qualifier. + +## Built at HEAD, section 2 (29 Sep 2026) + +- `project.parent` (project schema 0.8.0) with the checks in `lib/Service/ProjectRulesService.php`, called from `ProjectHierarchyGuardListener` only when the parent changes: the new parent may not be the project or one of its descendants (`planninq-project-cycle`, "A project cannot sit under one of its own subprojects."), and the parent's chain plus the project's own subtree may not exceed three levels (`planninq-project-too-deep`). An unchanged parent is not checked again, so a legacy chain never blocks an unrelated edit. +- The parent is picked in the settings sidebar's Details tab ("Part of"). The picker leaves out the project and its descendants (`parentOptions()` in `src/utils/projectTree.js`); the server check is the rule. The sidebar used to report "Project saved" even when the save failed, because `updateProject` returns null rather than throwing; it now shows the refusal. +- The overview lists the direct subprojects the user can read, each with the progress of its own subtree, and adds them to the programme's progress with the words "including subprojects". A subproject the user cannot read is left out of both. +- The project list folds per session only; the folded set is not stored. + +## Built at HEAD, section 3 (29 Sep 2026) + +- The schema slug is `projectField`, not `fieldDefinition`: slugs are global across the fleet (gate-106) and a generic name invites a collision. Admins keep it through OpenRegister (`create`, `update`, `delete` admin only); everyone signed in reads it. +- Admins manage the fields in Beheer, "Project fields" (`/project-fields`), a declarative index with the schema's own form, not a section on the admin settings page. +- `ProjectRulesService::problem()` checks the values when a write changes `customFields`: each value against its type (text, number, date as YYYY-MM-DD, a choice from the options, a person's user id, yes or no), an empty required field, and a key no field defines. A write that leaves the values alone is not held to a field added later, so creating or renaming a project never fails on a new required field. A stored value of a removed field may stay as it is (risk "a deleted field definition leaves values behind"). +- The Details tab renders one input per field with a visible label and checks the required fields before it saves; the overview lists the filled values under the dates. diff --git a/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/proposal.md b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/proposal.md new file mode 100644 index 00000000..31e5b6c3 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/proposal.md @@ -0,0 +1,94 @@ +--- +kind: code +--- + +# Portfolios, subprojects and custom project fields + +## Why + +Projects are one flat list. `src/views/ProjectList.vue:86-92` renders every project the user is on as one list, with status chips and a search field, and `src/views/Boards.vue` does the same as cards. The `project` schema has no category, folder, portfolio or parent (`lib/Settings/planninq_register.json:445-580`). An organisation with forty projects cannot sort them into portfolios, and cannot put a subproject under the programme it belongs to. + +Projects cannot carry your own fields. The only open-ended property is `metadata`, described as a catch-all for source-system and provenance keys (`planninq_register.json:576-581`), and no screen edits it. A municipality that tracks a budget holder, a policy area or a contract number per project has nowhere to put it. + +Nextcloud Deck users ask for board grouping (https://github.com/nextcloud/deck/issues/2006). OpenProject nests subprojects and lets admins define project attributes. Jira Data Center groups projects into categories. Tender 365739 of gemeente Sittard-Geleen asks for status and money rolled up per portfolio and for a risk table whose format can differ per portfolio (requirement 64441), which needs a portfolio to exist first. + +Parity rows: `prj-grouping`, `prj-hierarchy`, `prj-custom-fields` in planninq's `openspec/parity/capabilities.json`. +Decision: build. Grouping has a feature request and two competitors rated yes. Hierarchy and custom fields are core to the projects area. + +## What changes + +- An admin or portfolio manager creates portfolios. A project manager puts a project in one. +- The project list and the board picker group projects by portfolio, with sections you can fold, and a portfolio filter. +- A portfolio's managers can read every project in it, so a portfolio office sees its whole portfolio. +- A portfolio can use its own risk scale, overriding the app-wide one from `projects-overview-logs-risks`. +- A project manager puts a project under a parent project. The parent's overview lists its subprojects and adds their progress to its own. +- An admin defines custom fields for projects: text, number, date, choice, person or yes/no. They show on the project's Details tab and overview. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `prj-grouping`, `prj-hierarchy`, `prj-custom-fields`. + +### `prj-grouping`: Group projects into folders or categories in the navigation. + +- Area `projects`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "Projects are a flat list on src/views/ProjectList.vue:86-92 with status chips :10-17 and free text search :33-37. The project schema has no category, folder or group property, and the menu src/manifest.json:48-58 lists pages, not projects." +- Note: "Demand row mined from nextcloud-deck (featureRequest) on 2026-09-26." +- Demand (featureRequest, via origin): https://github.com/nextcloud/deck/issues/2006 +- Competitors rated yes (2): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "source read at v17.8.0: config/locales/en.yml:3696 'Add subproject'; app/models/projects/hierarchy.rb:104 nested set; frontend/src/app/shared/components/searchable-project-list/project-data.ts:38 children render as a tree in the project picker" + - Jira Software Data Center 11 (https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html): "https://confluence.atlassian.com/adminjiraserver/defining-a-project-938847066.html project categories are created 'via Administration > Projects > Project Categories', and Jira 'can display projects sorted by the project category' (read 2026-09-26)" + +### `prj-hierarchy`: Nest projects as subprojects under a parent project or programme. + +- Area `projects`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "the project schema (lib/Settings/planninq_register.json) has no parent/programme reference property; grep for parentProject/programme in src/ and lib/ finds nothing." +- Demand: none recorded on the row. +- Competitors rated yes (1): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'add a subproject'; subprojects free, portfolio and program workspace types Enterprise gated (corpus: openproject/round4/open-core.md portfolio_management; code-census #19 'Creating a project whose workspace_type is portfolio or program is rejected') (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:64-65 'New subproject' needs add_subprojects; app/contracts/projects/base_contract.rb:45-46 parent attribute validated as assignable; app/contracts/projects/create_contract.rb:43-44 portfolio and ... (shortened; full text in the matrix row)" + +### `prj-custom-fields`: Add your own fields to projects. + +- Area `projects`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "the project schema's only catch-all is `metadata` (lib/Settings/planninq_register.json, described as "Declared catch-all for source-system fields and provenance keys (e.g. jiraProjectId, migratedAt)"), which is for import provenance, not a user-facing custom-fields feature; no UI exposes it for editing." +- Demand: none recorded on the row. +- Competitors rated yes (1): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/menu-tree.md Administration 'Projects > Project attributes'; corpus: openproject/round4/M1-column.md 5.6 'app/models/project_custom_field.rb:59-68 ... admin-only fields' ; source read at v17.8.0: config/routes.rb:789 admin project_custom_fields resources; config/initializers/menus.rb:777 project settings 'Project attributes'; app/models/project_custom_field.rb:58-66 visibility with admin_only fields; config/locales/en.yml:3575 'Project attributes'" + +## Scope + +### In scope + +- A `portfolio` schema, `project.portfolio`, grouping in the project list and board picker, portfolio read rights, and a per-portfolio risk scale. +- `project.parent`, a guard against cycles and depth, and subprojects on the parent's overview. +- A `fieldDefinition` schema for project fields and `project.customFields` for their values. + +### Out of scope + +- Portfolio roll-ups of status, money and time: `portfolio-status-overview` and `portfolio-finance`. +- Custom fields on tasks (Enterprise in FEATURES.md). `fieldDefinition.appliesTo` only accepts `project` in this change. +- Personal folders for your own boards. Your own project order belongs to `portfolio-my-work-dashboard` (lane A). + +## Impact + +- Schema: new `portfolio` and `fieldDefinition` schemas; `project` gains `portfolio`, `parent`, `customFields` and `portfolioReaders`. +- Listener: `ProjectHierarchyGuardListener` on OpenRegister's `ObjectCreatingEvent` and `ObjectUpdatingEvent` for the parent and custom field rules, and an update of `portfolioReaders` when a portfolio's managers change. +- Views: `ProjectList.vue`, `Boards.vue`, the project settings sidebar, the overview from `projects-overview-logs-risks`, and a portfolios and custom fields section on the admin page. +- Extends the flat specs `openspec/specs/projects.md` and `openspec/specs/portfolio-dashboard-pmo.md`. +- Depends on: `projects-overview-logs-risks` (the overview and the risk scale). `projects-members-and-roles` (the manager role and task 1.1's answer on `$lookup`). + +## Risks + +### Risk 1: portfolio read rights through a lookup + +**Severity**: High +**Mitigation**: Letting portfolio managers read the projects in their portfolio needs a rule that follows `project.portfolio` to the portfolio's managers. Until `projects-members-and-roles` task 1.1 shows `$lookup` scopes, the rights ride on a denormalised `portfolioReaders` list on each project, kept in step by the listener when a project moves or a portfolio's managers change. + +### Risk 2: custom field values bypass their definition + +**Severity**: Medium +**Mitigation**: The creating and updating listener rejects a value whose type does not match its definition, and a required field left empty, with the field's label in the error. + +### Risk 3: two more schemas change the schema count + +**Severity**: Low +**Mitigation**: Task 1.5 updates `testRegisterDeclaresExactlySevenSchemas` and `openspec/specs/project-delivery/spec.md:68-72`. diff --git a/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/specs/project-custom-fields/spec.md b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/specs/project-custom-fields/spec.md new file mode 100644 index 00000000..e9d3cd37 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/specs/project-custom-fields/spec.md @@ -0,0 +1,22 @@ +# project-custom-fields delta for projects-grouping-hierarchy-fields + +## ADDED Requirements + +### Requirement: An admin adds custom fields to projects + +An admin MUST be able to define project fields with a label and a type: text, number, date, choice, person or yes/no, optionally required. Every project's Details tab MUST show an input per field, and its overview MUST show the filled values. The server MUST reject a value that does not match its field's type and an empty required field. Tier: Enterprise (docs/FEATURES.md, "Custom task fields"; the project variant has no dedicated row). + +#### Scenario: Adding a choice field + +- **GIVEN** an admin on Beheer, Project fields at /project-fields +- **WHEN** the admin adds the field "Beleidsveld" of type "Choice" with the options "Wonen", "Mobiliteit" and "Economie", marked required +- **AND** a project manager opens the Details tab of the project settings sidebar at /projects/:id +- **THEN** the tab shows a "Beleidsveld" select with those three options +- **AND** saving without a choice shows "Beleidsveld is required" next to the field + +#### Scenario: A wrong value type is refused by the server + +@e2e exclude API-level validation with no screen, asserted by ProjectHierarchyGuardListenerTest (task 3.2) +- **GIVEN** a number field "Contractwaarde" +- **WHEN** a project manager sends a PATCH to `/apps/openregister/api/objects/planninq/project/{id}` with `customFields.contractwaarde` set to "veel" +- **THEN** the request is refused and the error names "Contractwaarde" diff --git a/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/specs/project-hierarchy/spec.md b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/specs/project-hierarchy/spec.md new file mode 100644 index 00000000..c2bb42a5 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/specs/project-hierarchy/spec.md @@ -0,0 +1,29 @@ +# project-hierarchy delta for projects-grouping-hierarchy-fields + +## ADDED Requirements + +### Requirement: A project manager nests a project under a parent + +A project owner or manager MUST be able to set a parent project, up to three levels deep. A project MUST NOT become its own ancestor. The parent's overview MUST list its subprojects with their progress, and its own progress MUST include their tasks. Tier: Enterprise (docs/FEATURES.md, "Project portfolios (grouping across projects)"; no dedicated row). + +#### Scenario: A programme shows its subprojects + +- **GIVEN** a project "Programma Wonen" and two projects whose parent is "Programma Wonen", with 3 of 10 and 5 of 5 tasks done +- **AND** "Programma Wonen" itself has no tasks +- **WHEN** a member of all three opens the Overview tab of "Programma Wonen" at /projects/:id/overview +- **THEN** the page lists both subprojects with "3 of 10" and "5 of 5" +- **AND** the programme's progress reads "8 of 15 tasks done, including subprojects" + +#### Scenario: A cycle is refused + +- **GIVEN** project A is the parent of project B +- **WHEN** a manager of A opens the Details tab of A's project settings sidebar and picks B as A's parent +- **THEN** the save is refused with "A project cannot sit under one of its own subprojects." +- **AND** A has no parent + +#### Scenario: The project list shows subprojects under their parent + +- **GIVEN** a user on "Programma Wonen" and on both of its subprojects +- **WHEN** the user opens the project list at /projects +- **THEN** the subprojects appear indented under "Programma Wonen" +- **AND** the button before "Programma Wonen" hides and shows them and announces whether they are shown diff --git a/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/specs/project-portfolios/spec.md b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/specs/project-portfolios/spec.md new file mode 100644 index 00000000..733dce18 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/specs/project-portfolios/spec.md @@ -0,0 +1,52 @@ +# project-portfolios delta for projects-grouping-hierarchy-fields + +## ADDED Requirements + +### Requirement: Projects are grouped into portfolios + +An admin MUST be able to create portfolios and name their managers. A project owner or manager MUST be able to put a project in one portfolio. The project list and the board picker MUST group projects by portfolio, in the portfolio's order, with projects outside any portfolio in their own section, and MUST offer a portfolio filter. Tier: Enterprise (docs/FEATURES.md, "Project portfolios (grouping across projects)"). + +#### Scenario: The project list groups by portfolio + +- **GIVEN** an admin who created the portfolios "Ruimte" and "Dienstverlening" +- **AND** a user on three projects: two in "Ruimte" and one in no portfolio +- **WHEN** the user opens the project list at /projects +- **THEN** the list shows a "Ruimte" section with two projects and a "No portfolio" section with one +- **AND** each section heading is a button that folds the section and announces whether it is open + +#### Scenario: A project manager moves a project into a portfolio + +- **GIVEN** a project manager on the Details tab of the project settings sidebar at /projects/:id +- **WHEN** the manager picks "Dienstverlening" under "Portfolio" and saves +- **THEN** the project moves to the "Dienstverlening" section of /projects and of the board picker at /boards + +### Requirement: Portfolio managers read every project in their portfolio + +A portfolio manager MUST be able to read every project in that portfolio, with its tasks, risks and log, without being a project member. The right MUST follow the project when it moves between portfolios and MUST end when the person stops being a manager of the portfolio. A client MUST NOT be able to grant itself this right. Tier: Enterprise (docs/FEATURES.md, "Project portfolios (grouping across projects)"). + +#### Scenario: A portfolio manager sees a project they are not on + +@e2e exclude The e2e suite has one admin account and no portfolio manager who is not a member; asserted by PlanninqRegisterSchemaTest::testPortfolioSchemaAndTheProjectReaderRule and ProjectHierarchyGuardListenerTest, live recipe in PR #714 +- **GIVEN** a user who manages the portfolio "Ruimte" and is not a member of the project "Omgevingsvisie" in it +- **WHEN** the user opens the project list at /projects +- **THEN** "Omgevingsvisie" is listed under "Ruimte" +- **AND** its board at /projects/:id opens read-only for this user + +#### Scenario: A client cannot write the derived readers list + +@e2e exclude API-level guard with no screen, asserted by ProjectHierarchyGuardListenerTest (task 1.3) +- **GIVEN** a project member +- **WHEN** the member sends a PATCH to `/apps/openregister/api/objects/planninq/project/{id}` with `portfolioReaders` set to their own user id +- **THEN** the stored `portfolioReaders` equals the managers of the project's portfolio + +### Requirement: A portfolio may use its own risk scale + +A portfolio manager MUST be able to give a portfolio its own risk scale. The risk register of a project in that portfolio MUST use the portfolio's scale, and a project outside any portfolio MUST use the app-wide scale. Tier: V1 (tender 365739 requirement 64441; docs/FEATURES.md has no row). + +#### Scenario: A portfolio with a three-level scale + +- **GIVEN** the app-wide risk scale has 5 levels +- **AND** the portfolio "Dienstverlening" has its own scale of 3 levels +- **WHEN** a project member opens the Risks tab at /projects/:id/risks of a project in "Dienstverlening" +- **THEN** the heat map is three by three +- **AND** the Risks tab of a project in no portfolio shows five by five diff --git a/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/tasks.md b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/tasks.md new file mode 100644 index 00000000..e829da3b --- /dev/null +++ b/openspec/changes/archive/2026-09-29-projects-grouping-hierarchy-fields/tasks.md @@ -0,0 +1,29 @@ +# Tasks: projects-grouping-hierarchy-fields + +## 1. Portfolios (Enterprise) + +- [x] 1.1 Add the `portfolio` schema and `project.portfolio` and `project.portfolioReaders`, with the read rule on `portfolioReaders`. Verify: `tests/unit/Settings/PlanninqRegisterSchemaTest.php` asserts the schema, the properties and the read rule. +- [x] 1.2 Group the project list and the board picker by portfolio, with foldable sections and a portfolio filter. Verify: `tests/vitest/projectGrouping.spec.js` for the grouping and ordering; `tests/e2e/project-portfolios.spec.ts` "the project list groups by portfolio" and "a project manager moves a project into a portfolio". +- [x] 1.3 Add `ProjectHierarchyGuardListener` for `ObjectCreatingEvent` and `ObjectUpdatingEvent` on `project`, writing `portfolioReaders`, and rewrite it on every project when a portfolio's managers change or the portfolio is deleted. Verify: `tests/unit/Listener/ProjectHierarchyGuardListenerTest.php` constructs the real OpenRegister event classes and covers a move, a manager change, a deletion and a client-sent `portfolioReaders`. +- [x] 1.4 Use the portfolio's `riskScale` in the Risks tab when set. Verify: e2e "a portfolio with a three-level scale". +- [x] 1.5 Update `testRegisterDeclaresExactlySevenSchemas` and `openspec/specs/project-delivery/spec.md:68-72` for `portfolio` and `fieldDefinition`. Verify: the PHPUnit suite passes. +- [x] 1.6 Check that a portfolio manager who is not a member reads a project in their portfolio and cannot write it. Verify: `PlanninqRegisterSchemaTest::testPortfolioSchemaAndTheProjectReaderRule` (read rule on `portfolioReaders`, not on update) and `ProjectHierarchyGuardListenerTest` (the list is stamped); the scenario carries `@e2e exclude` because the e2e suite has one admin account. The live recipe is in PR #714 and in the lane's live-check list; it has not been run on an instance. + +Section 1 was built in one PR (see design, "Built at HEAD, section 1"). 1.5 added only `portfolio` (the register test is now `testRegisterDeclaresExactlyTwelveSchemas`); `fieldDefinition` comes with 3.1. 1.6 stays open: the e2e suite has no second, non-admin account, so the check is a live recipe in the PR, with the read rule asserted by `PlanninqRegisterSchemaTest::testPortfolioSchemaAndTheProjectReaderRule` and the stamping by `ProjectHierarchyGuardListenerTest`. + +## 2. Subprojects (Enterprise) + +- [x] 2.1 Add `project.parent` and the cycle and depth checks to the guard listener. Verify: `ProjectHierarchyGuardListenerTest::testACycleIsRefused` (self, descendant) and `testAFourthLevelIsRefused` (a new fourth level, a subtree that would land on it, an unchanged parent); e2e `tests/e2e/project-hierarchy.spec.ts` "a cycle is refused". +- [x] 2.2 List subprojects on the parent's overview and add their tasks to its progress. Verify: `tests/vitest/projectTree.spec.js` rollupProgress case; e2e "a programme shows its subprojects". +- [x] 2.3 Indent subprojects under their parent in the project list with a toggle button. Verify: `tests/vitest/projectTree.spec.js` treeRows cases; e2e "the project list shows subprojects under their parent". + +## 3. Custom fields (Enterprise) + +- [x] 3.1 Add the `projectField` schema (named `fieldDefinition` in the design; slugs are global across the fleet) and `project.customFields`, and a declarative index "Project fields" in Beheer. Verify: `PlanninqRegisterSchemaTest::testProjectFieldSchemaAndTheProjectValues`; e2e `tests/e2e/project-custom-fields.spec.ts` "adding a choice field". +- [x] 3.2 Validate `customFields` against the definitions in the guard listener. Verify: `ProjectHierarchyGuardListenerTest::testCustomFieldsOfTheRightTypePass`, `testAWrongValueTypeIsRefusedNamingTheField` (each type) and `testARequiredFieldAndAnUnknownKeyAreRefused`. +- [x] 3.3 Render the inputs on the Details tab and the filled values on the overview. Verify: `tests/vitest/projectFields.spec.js`; e2e "adding a choice field". + +## 4. Verification + +- [x] 4.1 `openspec validate projects-grouping-hierarchy-fields --type change --strict` passes. +- [x] 4.2 Every scenario in specs/ is covered by a test named in the task above it, or carries an `@e2e exclude ` note. diff --git a/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/design.md b/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/design.md new file mode 100644 index 00000000..5a05b999 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/design.md @@ -0,0 +1,101 @@ +# Design: restore archived projects, creation by group, and reviewed project requests + +## Context + +What exists at `de35541`: + +- **Status.** `project.status` is an enum of `active`, `archived`, `completed` and `cancelled`, default `active` (`lib/Settings/planninq_register.json:455-466`). The schema has no `x-openregister-lifecycle` block, so any caller with update rights can write any status. +- **Archive.** The Danger zone tab (`src/components/ProjectSettingsSidebar.vue:129-165`) shows "Archive project" whatever the current status, with an inline confirm (`:139-156`). `doArchive` (`:378`) calls `archiveProject` (`src/store/projects.js:506-517`), which PATCHes `status: 'archived'` and drops the project from the local list. +- **List.** `ProjectList.vue` has status chips All, Active, Archived and Completed (`:220-227`) and filters client-side (`:238-249`). An archived project opens its board like any other. There is no restore action anywhere. +- **Creation policy.** `SettingsService::canCurrentUserCreateProject` (`lib/Service/SettingsService.php:158-171`) reads `allow_project_creation` (default `all`, `:62`) and knows only `admins`. `ProjectController::checkCreatePolicy` (`lib/Controller/ProjectController.php:191-200`) and `create` (`:221-278`) enforce it on the server. `ProjectList.vue:207-215` mirrors it in the browser. The admin page offers two options (`src/views/settings/Settings.vue:76-86`) and saves through `settingsStore.saveSettings` (`:510-522`). +- **Live schema patch.** `DueReminderWindowService` writes an admin setting into the live `task` schema (`lib/Service/DueReminderWindowService.php:104`). Only `SettingsService.php:272` calls it, on save. +- **Create dialog.** `src/dialogs/ProjectCreationDialog.vue` asks for title, description, colour and icon and posts through `createProject` (`projects.js:328-363`). + +What OpenRegister offers, read at `ConductionNL/openregister` development `c53dd0685`: + +- A schema can declare `x-openregister-lifecycle` with a `field`, an `initial` state and named `transitions`, each with `from`, `to` and optional `authorization`, `condition` and `message` (`lib/Service/Lifecycle/LifecycleAnnotationValidator.php:118-133`, `:200-330`). A transition's `authorization` is a list of group ids or `{role}` objects (`:491-520`). +- `POST /apps/openregister/api/objects/{id}/transition` applies a named transition, and `GET /apps/openregister/api/objects/{id}/available-actions` lists the ones the caller may run (`appinfo/routes.php:613-614`). +- Notification rules accept the triggers `created`, `updated`, `transition`, `scheduled`, `threshold` and `calculatedChange` (`lib/Service/Notification/NotificationAnnotationValidator.php:50`). + +## Goals / non-goals + +Goals: + +- Restore is one click for a project manager, and OpenRegister refuses it for anyone else. +- An admin can name the groups that may create projects. +- Everyone else can ask, and someone who may create answers. + +Non-goals: + +- Read-only archived projects. +- A configurable request form. + +## Decisions + +### Decision 1: archive, restore, approve and reject are schema transitions + +The `project` schema gets an `x-openregister-lifecycle` block on `status`: + +| Action | From | To | Who | +|---|---|---|---| +| `archive` | `active`, `completed` | `archived` | owner and managers | +| `restore` | `archived`, `completed` | `active` | owner and managers | +| `approve` | `requested` | `active` | reviewers | +| `reject` | `requested` | `rejected` | reviewers | + +The store calls the transition endpoint instead of PATCHing `status`, and the sidebar asks `available-actions` which buttons to show. This is ADR-031: the rule sits on the schema, and a direct API call gets the same answer as the interface. + +Owner and manager are object-level rights, not groups, so `archive` and `restore` carry no transition `authorization` list and rely on the project's update rule. `approve` and `reject` carry the reviewer groups (Decision 3). + +Alternative considered: a `restoreProject` store action that PATCHes `status: 'active'`, mirroring `archiveProject`. It is the smallest change, but any member with update rights could then jump a project to any status, including approving their own request. + +### Decision 2: `allow_project_creation` gains `groups` + +The setting takes `all`, `admins` or `groups`. With `groups`, a second key `project_creation_groups` holds a JSON list of group ids. `canCurrentUserCreateProject` returns true for admins and for members of any listed group, through `IGroupManager::isInGroup`. The admin page shows an `NcSelect` of groups, with `inputLabel`, when `groups` is chosen. The browser mirror in `ProjectList.vue` reads a server-computed `canCreateProject` flag from the settings payload instead of repeating the rule. + +### Decision 3: a request is a project in status `requested` + +A person who may not create a project may request one when the admin turns on `project_requests` (default off). `ProjectController::create` then stores the project with `status: 'requested'` instead of answering 403. The requester is `owner` and the only member, so they see their own request and nobody else's. + +The reviewers are the people who may create projects: admins, plus the creation groups when the policy is `groups`. When the admin saves the policy, a new `ProjectPolicySchemaService` writes those groups into the live `project` schema in two places: the `authorization` list of `approve` and `reject`, and a read rule `{"group": "", "match": {"status": "requested"}}` per group. It follows `DueReminderWindowService`. A repair step re-applies the patch after the register import, because the import rewrites the live schema. + +On `approve`, the approving reviewer's client creates the default columns, as `createProject` does today (`projects.js:353-354`). + +The request form, `src/dialogs/ProjectRequestDialog.vue`, has two steps: what the project is (title, description) and why it is needed (`requestReason`, a desired start date). The review dialog, `src/dialogs/ProjectRequestReviewDialog.vue`, shows the request and asks for a `reviewNote` on reject. + +Two notification rules on `project` (trigger `transition`, actions `approve` and `reject`) tell the owner, who is the requester. + +Alternative considered: a separate `projectRequest` schema that an approval copies into a new `project`. It keeps requests out of the project list, but it duplicates every project field and breaks the link between the request and the project it became. + +### Decision 4: a requested project is not a working project + +While `status` is `requested` or `rejected`, the board shows a banner instead of the columns: "This project is waiting for review" or "This request was not approved", with the review note. The dashboard KPIs already count `active` and `archived` by equality (`src/manifest.json:88-127`), so they do not change. + +## Risks / trade-offs + +- [A register import resets the live patch] -> The repair step re-applies it, and a PHPUnit test runs the import then the repair and asserts the reviewer groups are present. +- [A group listed in the policy is deleted] -> `ProjectPolicySchemaService` drops unknown groups on save, and the admin page shows a warning for a listed group that no longer exists. +- [Transition authorization and object update rules disagree] -> Task 1.2 checks live that a member without update rights gets 403 on `restore`, before the store is moved to the transition endpoint. + +## Built at HEAD (29 Sep 2026, section 1) + +- The lifecycle also declares `complete` (active to completed) and `cancel` (active to cancelled), and `restore` also leaves `cancelled`. OpenRegister's `LifecycleValidationListener` refuses any status write no transition allows, so without them an API client setting `completed` or `cancelled` would have been refused. +- "Owner and managers": managers do not exist yet (`projects-members-and-roles` is not built), so archive and restore follow the project's update rule: the owner and admins. The list shows Restore to them only. +- `approve` and `reject` carry `authorization: ["admin"]` in the register file; section 3 writes the reviewer groups into the live schema. +- The block passed OpenRegister's own `LifecycleAnnotationValidator` (development `4abd834`): 0 findings, control with an empty `authorization` 1. + +## Built at HEAD (29 Sep 2026, section 2) + +- `SettingsService` refuses an `allow_project_creation` value outside `all`, `admins`, `groups`, and on save keeps only groups that exist. For an admin the settings payload names listed groups that no longer exist (`creationGroupsMissing`), and the admin page warns about each. +- The group picker reads the groups through OCS `cloud/groups` (admin only, like the page). +- The list reads `canCreateProject` from the settings payload; an older payload without it falls back to the policy, with `groups` read as admins only. + +## Built at HEAD (29 Sep 2026, section 3) + +- Approving needs `update` permission on the project: OpenRegister's transition endpoint checks it before the lifecycle does, and the reviewer is not the owner. So `ProjectPolicySchemaService` writes, per reviewer group, a read AND an update rule `{"group": "", "match": {"status": "requested"}}`, besides the `approve`/`reject` authorization. The requester (owner) keeps update rights on the request but cannot approve it: the transition authorization does not name them. +- The live schema is found through the planninq register's schema ids, not the slug alone, because another app may have a `project` schema. +- Reviewer groups follow the creation policy: the creation groups under `groups`, none (admins only) under `admins`. The patch runs on saving the policy and in the `ApplyProjectPolicy` repair step after the import. A settings `load` (forced re-import) does not re-run it; saving the policy once does. +- `reject` declares the input `reviewNote` (required), so the reason arrives in the transition save. `ProjectReviewListener` stamps `reviewedBy` and `reviewedAt` in the reviewing save and, after an approval, creates the default columns inside OpenRegister's system scope (the column guard keeps columns to the owner). +- `project_requests` is an admin switch (`on`/`off`, default off) shown when creation is not open to all. The list shows "Request a project" to whoever the server says may request. +- The desired start date uses the existing `startDate` property. + diff --git a/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/proposal.md b/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/proposal.md new file mode 100644 index 00000000..ff1520d9 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/proposal.md @@ -0,0 +1,105 @@ +--- +kind: code +--- + +# Restore archived projects, creation by group, and reviewed project requests + +## Why + +A project manager can archive a project but cannot bring it back. The Danger zone tab has an "Archive project" button (`src/components/ProjectSettingsSidebar.vue:139-156`) that calls `archiveProject` (`src/store/projects.js:506-517`), which PATCHes `status: 'archived'`. Nothing in `src/` sets a project back to `active`: no button, no store action. An archived project stays archived unless someone edits the object through the OpenRegister API. + +An admin can let everyone create projects or only admins. `SettingsService::canCurrentUserCreateProject` (`lib/Service/SettingsService.php:158-171`) knows the values `all` and `admins`, and the admin page offers exactly those two (`src/views/settings/Settings.vue:76-86`). FEATURES.md section 3.1 already names a third value, `groups`, and `openspec/specs/admin-user-settings.md:24` lists it too. It was never built. + +There is no way to ask for a project. `ProjectCreationDialog.vue` posts straight to `POST /apps/planninq/api/projects`, and `ProjectController::create` (`lib/Controller/ProjectController.php:221-278`) stores the project at once. When creation is restricted, everyone else sees "Ask an administrator to create one" (`src/views/ProjectList.vue:64`) and has to do that outside the app. + +Nextcloud Deck, OpenProject, Plane, Kanboard and Jira Data Center archive and restore projects. Deck, OpenProject and Kanboard limit creation to chosen groups or a global role. The project request row was mined from the OpenProject 17.1 release notes. + +Parity rows: `prj-archive`, `prj-create-policy`, `prj-request-approval` in planninq's `openspec/parity/capabilities.json`. +Decision: build. Archive and the creation policy are half built and the missing halves matter, with five and three competitors rated yes. Project requests sit in the core projects area. + +## What changes + +- A project manager restores an archived project from the project settings sidebar or from the Archived filter of the project list. +- Archive and restore become declared transitions on the `project` schema, so OpenRegister refuses them for anyone without the right. +- An admin limits project creation to one or more Nextcloud groups. +- When creation is limited, everyone else sees "Request a project" and fills in a short guided form. +- People who may create projects review requests, approve them into active projects or reject them with a reason, and the requester is told either way. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `prj-archive`, `prj-create-policy`, `prj-request-approval`. + +### `prj-archive`: Archive a finished project and restore it later. + +- Area `projects`. Planninq is rated `partial`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "src/components/ProjectSettingsSidebar.vue:149 (Archive project button, Danger zone tab) -> src/store/projects.js:506 archiveProject() (PATCH status='archived')" +- Defect: "src/components/ProjectSettingsSidebar.vue: Danger zone tab has no restore/unarchive action for an already-archived project" +- Note: "archiving works and removes the project from the active list. There is no restore/unarchive action anywhere in src/ (no button, no store action), an archived project can only be reopened by filtering the list to Archived and there is nothing there to bring it back to active from the UI." +- Demand: none recorded on the row. +- Competitors rated yes (5): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/menu-tree.md 'All boards ... (with Archived boards ...)' ; source: lib/Controller/BoardController.php:54 update(..., bool archived) ; source read at v1.19.0: src/components/navigation/AppNavigationBoard.vue:62-68 'Archive board' and :54-60 'Unarchive board' actions calling archiveBoard/unarchiveBoard (:364-370); lib/Controller/BoardController.php:54 update(id, title, color, archived)" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/projects/project-settings/project-information/README.md:42 'More actions menu ... make it public, set it as a template, archive it, or delete it'; project-lists README:127 'Archived projects - returns all projects that are not active' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: app/components/projects/row_actions_component.rb:141-148 'Archive' item needs archive_project; :153-161 'Unarchive' item (admin only); app/controllers/projects/archive_controller.rb:38-43 create archives, destroy unarchives; config/routes.rb:447" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/menu-tree.md workspace 'Archives' ; source: apps/api/plane/db/models/project.py:114 archived_at, apps/api/plane/app/urls/project.py:123-125 ProjectArchiveUnarchiveEndpoint (archive and unarchive) ; source read at v1.4.2: apps/web/core/components/project/archive-restore-modal.tsx:32,44,67 archiveProject and restoreProject; apps/api/plane/app/urls/project.py:123-125 archive route; apps/api/plane/app/views/project/base.py:427-437 ProjectArchiveUnarchiveEndpoint post and delete; apps/api/plane/db/models/project.py:114 archived_at" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/menu-tree.md 'Close this project' ; source: app/Template/project_list/project_icons.php:20 is_active 0 shown as closed, reopen from the same menu ; source read at v1.2.54: app/Template/project/sidebar.php:59 'Close this project', :62 'Open this project'; app/Controller/ProjectStatusController.php:28 enable, :57 disable; app/Model/ProjectModel.php:539 enable, :555 disable; app/Template/project_list/project_icons.php:20 closed marker" + - Jira Software Data Center 11 (https://confluence.atlassian.com/adminjiraserver/archiving-a-project-938847621.html): "corpus: jira-data-center/round4/open-core.md 'archiving of issues and projects, with restore' citing Archiving a project (2025-12-11); Data Center only ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/archiving-a-project-938847621.html 'You can archive any project, and restore it later, if needed'; needs 'the Jira Administrator or Jira System Administrator global permission' (read 2026-09-26)" + +### `prj-create-policy`: Restrict who may create projects to admins or chosen groups. + +- Area `projects`. Planninq is rated `partial`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "src/views/ProjectList.vue:207-215 canCreateProject() -> lib/Service/SettingsService.php:158 canCurrentUserCreateProject() reads app config 'allow_project_creation' (default 'all', line 62) -> lib/Controller/ProjectController.php:191 checkCreatePolicy()" +- Note: "only two policy values exist: 'all' or 'admins' (lib/Service/SettingsService.php:158-169). There is no group-based restriction anywhere in the code, so "admins or chosen groups" is only half true." +- Demand: none recorded on the row. +- Competitors rated yes (3): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/menu-tree.md 'Deck settings ... group limit for board creation (admin)' ; source: lib/Service/PermissionService.php:345-363 canCreate reads groupLimit ; source read at v1.19.0: src/components/DeckAppSettings.vue:26-37 admin section 'Limit board creation to some groups' (multi-select of groups); lib/Service/ConfigService.php:209 stores groupLimit; lib/Service/PermissionService.php:368-383 canCreate allows only members of the listed groups" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/menu-tree.md Administration 'Roles and permissions' with global roles; corpus: openproject/round4/M1-column.md 13.1 'nine subtypes ... spanning project roles, global roles (app/models/global_role.rb)'; add_project is a global permission (corpus: openproject/round4/M1-column.md 13.8 'the select_project_custom_fields and add_project permissions') ; source read at v17.8.0: config/initializers/permissions.rb:34-39 add_project is a global permission; app/contracts/projects/create_contract.rb:67 create checks user.allowed_globally?(:add_project); app/models/global_role.rb:31 global roles; app/controllers/groups_controller.rb:184 a group has a 'global_roles' tab, so a ... (shortened; full text in the matrix row)" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/menu-tree.md 'New project · New personal project' ; source: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Controller/ProjectCreationController.php:145 disable_private_project switch ; source read at v1.2.54: app/ServiceProvider/AuthenticationProvider.php:168 ProjectCreationController create needs Role::APP_MANAGER; app/Template/config/project.php:21 'Disable personal projects' admin setting; app/Controller/ProjectCreationController.php:145 refuses personal projects when disabled; restriction is by application role, not by chosen group" + +### `prj-request-approval`: Request a new project through a guided form that someone reviews before it starts. + +- Area `projects`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "Create path: src/dialogs/ProjectCreationDialog.vue:65-75 submit -> src/store/projects.js:328 createProject -> POST /apps/planninq/api/projects -> lib/Controller/ProjectController.php create, which stores the project immediately. No request status, no reviewer and no guided intake form. The creation policy [prj-create-policy] restricts WHO may create, it does not route a request to someone." +- Note: "Demand row mined from openproject (changelog) on 2026-09-26." +- Demand (changelog, via origin): https://www.openproject.org/docs/release-notes/17-1-0/ +- Competitors rated yes: none. + +## Scope + +### In scope + +- Restore for archived projects, and archive and restore as schema transitions. +- The `groups` value for `allow_project_creation` and the group picker on the admin page. +- A request status on the project, a guided request dialog, a review list, approve and reject. + +### Out of scope + +- Making an archived project read-only for its members. Archiving hides it from the active list today, and this change keeps that behaviour. +- Capping the number of projects per user (`max_projects_per_user`, Enterprise in FEATURES.md). +- A configurable intake form. The request form has fixed fields in this change. +- Templates offered in the request form: `projects-templates-shared-workflow`. + +## Impact + +- Schema: `project` gains the statuses `requested` and `rejected`, the fields `requestReason`, `reviewedBy`, `reviewedAt` and `reviewNote`, an `x-openregister-lifecycle` block, and notification rules for approve and reject. +- Service: `SettingsService::canCurrentUserCreateProject` learns `groups`; a new `ProjectPolicySchemaService` writes the reviewer groups into the live schema, following `DueReminderWindowService`. +- Controller: `ProjectController::create` stores a request instead of refusing when the caller may only request. +- Views and dialogs: `ProjectSettingsSidebar.vue`, `ProjectList.vue`, `Settings.vue`, a new `src/dialogs/ProjectRequestDialog.vue` and `src/dialogs/ProjectRequestReviewDialog.vue`. +- Store: `src/store/projects.js` gains `restoreProject`, `requestProject`, `approveRequest` and `rejectRequest`. +- Extends the flat specs `openspec/specs/projects.md` (requirement "Project Lifecycle") and `openspec/specs/admin-user-settings.md`. +- Depends on: `projects-members-and-roles` for the manager role that may archive and restore. Until it lands, the owner holds that right. + +## Risks + +### Risk 1: reviewer rights come from an admin setting + +**Severity**: Medium +**Mitigation**: The transition `authorization` list and the read rule for requested projects are written into the live schema when the admin saves the policy, the same way `DueReminderWindowService` writes the reminder window. A register import rewrites the live schema, and today the reminder window is patched only on save (`lib/Service/SettingsService.php:272`). This change re-applies its own patch in a repair step that runs after the import, and a PHPUnit test asserts both paths. + +### Risk 2: new statuses surprise existing readers + +**Severity**: Medium +**Mitigation**: The dashboard KPIs filter on `status` equality (`src/manifest.json:88-127`), so `requested` and `rejected` do not count as active or archived. `fetchProjects` shows requested projects only to their requester and to reviewers, and the list gets a "Requested" chip. + +### Risk 3: the register schema count + +**Severity**: Low +**Mitigation**: This change adds no schema. It changes `project` only, so `testRegisterDeclaresExactlySevenSchemas` is unaffected. diff --git a/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/specs/project-lifecycle/spec.md b/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/specs/project-lifecycle/spec.md new file mode 100644 index 00000000..4da3c768 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/specs/project-lifecycle/spec.md @@ -0,0 +1,68 @@ +# project-lifecycle delta for projects-lifecycle-policy + +## ADDED Requirements + +### Requirement: A project manager restores an archived project + +A project owner or manager MUST be able to set an archived project back to active. Archive and restore MUST be declared as transitions on the `project` schema, so OpenRegister refuses them for anyone without update rights on the project. Tier: MVP (docs/FEATURES.md, "Project archiving"). + +#### Scenario: Restore from the project settings sidebar + +- **GIVEN** a project owner whose project has the status "archived" +- **WHEN** the owner opens the Danger zone tab of the project settings sidebar at /projects/:id and presses "Restore project" +- **THEN** the project's status is "active" +- **AND** the project appears under the Active chip of the project list at /projects +- **AND** the Danger zone tab shows "Archive project" again + +#### Scenario: Restore from the archived list + +- **GIVEN** a project owner on the project list at /projects with the Archived chip selected +- **WHEN** the owner opens the actions of an archived project and chooses "Restore" +- **THEN** the project leaves the archived list and shows under Active + +#### Scenario: A member without update rights cannot restore + +@e2e exclude API-level refusal with no screen, asserted by a live call in task 1.2 and a PHPUnit schema test +- **GIVEN** a project member who is not the owner or a manager +- **WHEN** the member sends `POST /apps/openregister/api/objects/{id}/transition` with the action `restore` for an archived project +- **THEN** the request is refused with 403 +- **AND** the project stays archived + +### Requirement: An admin limits project creation to chosen groups + +The creation policy MUST accept three values: all signed-in users, administrators only, and members of chosen Nextcloud groups. The server MUST enforce the policy on `POST /apps/planninq/api/projects`, and the "New project" button MUST follow the same answer. Tier: V1 (docs/FEATURES.md, "User settings, manage which users can create projects"; section 3.1 `allow_project_creation`). + +#### Scenario: Only the chosen groups may create + +- **GIVEN** an admin who sets "Allow project creation" to "Members of these groups" and picks "Projectleiders" on the planninq admin settings page +- **AND** a user in "Projectleiders" and a user who is not +- **WHEN** each opens the project list at /projects +- **THEN** the user in "Projectleiders" sees "New project" +- **AND** the other user does not +- **AND** a `POST /apps/planninq/api/projects` from the other user answers 403 + +### Requirement: A person outside the policy requests a project and a reviewer decides + +When the admin turns on project requests, a person who may not create a project MUST be able to request one through a guided form. The request MUST be stored as a project with the status "requested" that only the requester and the reviewers can see. The reviewers are the people who may create projects. A reviewer MUST be able to approve the request, which makes it an active project, or reject it with a reason. The requester MUST be told the outcome. Tier: Enterprise (docs/FEATURES.md, "Advanced admin controls"; no dedicated row). + +#### Scenario: A requester fills in the guided form + +- **GIVEN** creation is limited to "Projectleiders", project requests are on, and a user who is not in that group +- **WHEN** the user presses "Request a project" on the project list at /projects, fills in the title, description, reason and desired start date over the two steps, and presses "Send request" +- **THEN** the project list shows the request under the "Requested" chip +- **AND** opening it shows "This project is waiting for review" instead of the board + +#### Scenario: A reviewer approves a request + +- **GIVEN** a user in "Projectleiders" and a waiting request from someone else +- **WHEN** the reviewer opens the request from the "Requested" chip and presses "Approve" +- **THEN** the project's status is "active" and its board shows the default columns +- **AND** the requester gets a Nextcloud notification that the request was approved + +#### Scenario: A reviewer rejects a request with a reason + +- **GIVEN** a user in "Projectleiders" and a waiting request from someone else +- **WHEN** the reviewer presses "Reject", writes "Fits in the existing portal project" and confirms +- **THEN** the project's status is "rejected" +- **AND** the requester sees "This request was not approved" with that reason when opening it +- **AND** the requester gets a Nextcloud notification that the request was not approved diff --git a/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/tasks.md b/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/tasks.md new file mode 100644 index 00000000..96444722 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-projects-lifecycle-policy/tasks.md @@ -0,0 +1,26 @@ +# Tasks: projects-lifecycle-policy + +## 1. Lifecycle on the project schema (MVP) + +- [x] 1.1 Add the statuses `requested` and `rejected`, the fields `requestReason`, `reviewedBy`, `reviewedAt` and `reviewNote`, and an `x-openregister-lifecycle` block with `archive`, `restore`, `approve` and `reject` to `project` in `lib/Settings/planninq_register.json`, and bump its version. Verify: `tests/unit/Settings/PlanninqRegisterSchemaTest.php` asserts the enum, the fields and each transition's `from` and `to`. +- [ ] 1.2 On the dev instance, as a member without update rights, call the transition endpoint with `restore` on an archived project. Verify: the answer is 403 and the status is unchanged; the result goes in the PR body. Not run live yet (the lane has no instance on this branch). Read instead at OpenRegister development `4abd834`: `TransitionEngine::resolveTransitionSubject()` refuses a transition without `update` permission on the object (403), and `LifecycleValidationListener` refuses a direct status write that no transition allows. +- [x] 1.3 Replace the PATCH in `archiveProject` with the transition endpoint and add `restoreProject` to `src/store/projects.js`. Verify: `tests/vitest/projectLifecycle.spec.js` asserts the request URL and body for both actions. +- [x] 1.4 Show "Restore project" in the Danger zone tab for an archived project and "Archive project" otherwise, based on `available-actions`, and add "Restore" to the actions of an archived project in the list. Verify: `tests/e2e/project-lifecycle.spec.ts` "restore from the project settings sidebar" and "restore from the archived list". + +## 2. Creation by group (V1) + +- [x] 2.1 Teach `SettingsService::canCurrentUserCreateProject` the `groups` value and the `project_creation_groups` key, and return a `canCreateProject` flag in the settings payload. Verify: new cases in `tests/unit/Service/SettingsServiceTest.php` for a member and a non-member of a listed group. +- [x] 2.2 Offer "Members of these groups" with a group `NcSelect` (with `inputLabel`) on the admin page in `src/views/settings/Settings.vue`, and read the flag in `ProjectList.vue`. Verify: e2e "only the chosen groups may create" (`tests/e2e/project-creation-groups.spec.ts`, through the API for the two users and the admin page for the picker); `tests/vitest/creationPolicy.spec.js`. + +## 3. Project requests (Enterprise) + +- [x] 3.1 Add the `project_requests` setting and make `ProjectController::create` store `status: 'requested'` when the caller may only request. Verify: new cases in `tests/unit/Controller/ProjectControllerTest.php` for allowed, requesting and refused callers. Built as `tests/unit/Controller/ProjectRequestControllerTest.php` (real in-memory ObjectService, payload validated against the project schema). +- [x] 3.2 Add `ProjectPolicySchemaService` that writes the reviewer groups into the live `project` schema on save, and a repair step that re-applies it after the register import. Verify: `tests/unit/Service/ProjectPolicySchemaServiceTest.php` covers save, import then repair, and a deleted group. +- [x] 3.3 Add `src/dialogs/ProjectRequestDialog.vue` (two steps) and the "Request a project" button, and a "Requested" chip on the project list. Verify: e2e "a requester fills in the guided form" (`tests/e2e/project-requests.spec.ts`: the request goes in through the requester's own API call; the browser runs as the admin, who may create and so gets no Request button); `tests/vitest/projectRequests.spec.js` covers the two steps and the payload. +- [x] 3.4 Add `src/dialogs/ProjectRequestReviewDialog.vue` with approve and reject, and the waiting and rejected banners on the board. Verify: e2e "a reviewer approves a request" and "a reviewer rejects a request with a reason". +- [x] 3.5 Add notification rules on `project` for the `approve` and `reject` transitions, with the owner as recipient. Verify: PHPUnit schema test for both rules, plus the notification assertions in the two e2e scenarios of 3.4. Built: `PlanninqRegisterSchemaTest::testProjectRequestsNotifyTheRequester` and OpenRegister's own NotificationAnnotationValidator (0 findings, control 1). The e2e does not assert the Nextcloud notification. + +## 4. Verification + +- [x] 4.1 `openspec validate projects-lifecycle-policy --type change --strict` passes. +- [x] 4.2 Every scenario in specs/ is covered by a test named in the task above it, or carries an `@e2e exclude ` note. diff --git a/openspec/changes/archive/2026-09-29-school-timetable-target/.openspec.yaml b/openspec/changes/archive/2026-09-29-school-timetable-target/.openspec.yaml new file mode 100644 index 00000000..5c1c7a7a --- /dev/null +++ b/openspec/changes/archive/2026-09-29-school-timetable-target/.openspec.yaml @@ -0,0 +1,2 @@ +schema: conduction +created: 2026-09-27 diff --git a/openspec/changes/archive/2026-09-29-school-timetable-target/contract.md b/openspec/changes/archive/2026-09-29-school-timetable-target/contract.md new file mode 100644 index 00000000..a2254260 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-school-timetable-target/contract.md @@ -0,0 +1,177 @@ +# Contract: school-timetable-target + +Contract version: **1**. Every event class carries `public const CONTRACT_VERSION = 1;` and every result array carries `contractVersion: 1`. + +## Consumers +- `integriq`: delivers a rostering batch through `TimetableUpsertRequestedEvent` (change `rostering-adapter-targets-planninq`). +- `learniq`: reads sessions through `TimetableSessionsQueryEvent` on the server and through `GET /api/timetable/sessions` when a page needs them (change `sessions-from-planninq`). + +## The session shape + +One row of schema `timetableSession` in register `planninq`. + +| Field | Type | Required | Meaning | +|---|---|---|---| +| `externalRef` | string | yes | The source system's own occurrence id (Zermelo appointment instance, Untis period id, Xedule event id, TimeEdit reservation id). | +| `sourceSystem` | string | yes | Who delivered the row: the integriq Source id (`roster-zermelo`, `roster-untis-oneroster`, `roster-xedule`, `roster-timeedit`) or `manual`. | +| `subject` | string | yes | The subject as the school names it (`Wiskunde`, `wi`). | +| `title` | string | no | Display title. Defaults to `subject`. | +| `startsAt` | date-time | yes | ISO 8601 start. | +| `endsAt` | date-time | yes | ISO 8601 end, after `startsAt`. | +| `groupReference` | string | no | The school's own group code (`3a`, `H3B`). | +| `cohortId` | string | no | The fleet cohort this lesson is for (a learniq `Cohort` uuid), when the deliverer resolved it. | +| `teacherReference` | string | no | The school's own teacher code (`JAN`). | +| `teacherUserId` | string | no | The teacher's Nextcloud user id, when resolved. | +| `roomReference` | string | no | The school's own room code (`A1.12`). | +| `roomLabel` | string | no | Room display name. | +| `status` | `scheduled` \| `cancelled` | no | Default `scheduled`. A source that reports a cancelled lesson sends `cancelled`. | +| `importedAt` | date-time | no | Stamped by planninq on every create or update. Never taken from the caller. | + +The upsert key is the pair (`sourceSystem`, `externalRef`). A row written by one source is never matched by another. + +## Server-side interface (ADR-041 events) + +Consumers MUST NOT import a planninq class. They look the class up by name, `class_exists()`-guard it, construct it with named arguments, `dispatchTyped()` it through `OCP\EventDispatcher\IEventDispatcher`, and read the result slot. When the class does not exist, or `isHandled()` is false after dispatch, planninq is absent and the consumer fails closed (it reports the failure; it never pretends the batch landed). + +### `OCA\Planninq\Event\TimetableUpsertRequestedEvent` + +```php +new TimetableUpsertRequestedEvent( + sourceApp: 'integriq', + sourceSystem: 'roster-zermelo', + sessions: [ /* rows in the session shape, without importedAt */ ], + correlationId: '', +); +``` + +Getters: `getSourceApp()`, `getSourceSystem()`, `getSessions()`, `getCorrelationId()`, `isHandled()`, `getResult(): ?array`. Planninq's listener calls `setResult(array)`, which also marks the event handled. + +A row's own `sourceSystem`, when present, is ignored: the event's `sourceSystem` wins, so one batch is always one source. + +Result: +```json +{ + "contractVersion": 1, + "sourceSystem": "roster-zermelo", + "processed": 3, + "created": 1, + "updated": 1, + "unchanged": 0, + "rejected": [ + {"externalRef": "zm-1003", "errorCode": "missing-fields", "errorMessage": "Missing required field(s): subject"} + ], + "sessionIds": ["", ""] +} +``` + +`processed` equals `created + updated + unchanged + count(rejected)`. `sessionIds` lists the rows created, updated or found unchanged, in batch order. + +When planninq refuses the batch as a whole (an empty `sourceSystem`, or OpenRegister not available), the event still comes back handled, with every count at 0 and an `error` string. A consumer MUST treat a result with `error` as a failed delivery, not as an empty one. + +### `OCA\Planninq\Event\TimetableSessionsQueryEvent` + +```php +new TimetableSessionsQueryEvent( + sourceApp: 'learniq', + criteria: [ + 'cohortId' => '', // or groupReference, teacherUserId, teacherReference + 'from' => '2026-09-28T00:00:00+02:00', + 'to' => '2026-10-04T23:59:59+02:00', + 'limit' => 500, + ], +); +``` + +Criteria keys: `cohortId`, `groupReference`, `teacherUserId`, `teacherReference` (at least one is required), `from`, `to` (optional ISO 8601 window; a session is included when it overlaps the window), `limit` (default 500, capped at 1,000), `includeCancelled` (default true), `includeDrafts` (default false; added by timetable-draft-review, additive under version 1: without it no `draft` session is returned). + +Getters: `getSourceApp()`, `getCriteria()`, `isHandled()`, `getSessions(): ?array`, `getError(): ?string`. The listener calls `setSessions(array)` on success or `setError(string)` when the criteria are invalid; both mark the event handled. The read runs with OpenRegister RBAC off: the dispatching app MUST ask only for a cohort or teacher its user may see, because planninq holds no cohort membership to check (planninq#711). + +Each session in the result: +```json +{ + "id": "", + "externalRef": "zm-1001", + "sourceSystem": "roster-zermelo", + "subject": "Wiskunde", + "title": "Wiskunde", + "startsAt": "2026-09-28T09:00:00+02:00", + "endsAt": "2026-09-28T09:50:00+02:00", + "groupReference": "3a", + "cohortId": null, + "teacherReference": "JAN", + "teacherUserId": null, + "roomReference": "A1.12", + "roomLabel": "A1.12", + "status": "scheduled" +} +``` + +Sessions are sorted by `startsAt` ascending. + +## Endpoints + +### `GET /apps/planninq/api/timetable/sessions` +**Auth**: Nextcloud session, any signed-in user (`#[NoAdminRequired]`). Rows are read through OpenRegister with RBAC on, so a caller sees only what the schema lets them read: the `planninq-timetable` group and admins every lesson, a teacher the lessons whose `teacherUserId` is theirs, anyone else nothing (planninq#711). + +**Request:** query parameters `cohortId`, `groupReference`, `teacherUserId`, `teacherReference`, `from`, `to`, `limit`, as the query event. + +**Response (200):** +```json +{"results": [ /* sessions as above */ ], "total": 1, "window": {"from": "2026-09-28T00:00:00+02:00", "to": null}} +``` + +**Errors:** +| Code | Condition | +|------|-----------| +| 400 | No identity filter, an unparseable `from`/`to`, or `from` after `to`. | +| 401 | No signed-in user. | +| 503 | OpenRegister is not available. | + +### `POST /apps/planninq/api/timetable/sessions/upsert` +**Auth**: Nextcloud session, admins only. The method carries `#[AuthorizedAdminSetting]` for planninq's admin settings and no `#[NoAdminRequired]`, so Nextcloud's security middleware refuses ordinary users; an explicit admin check in the method then refuses a delegated settings admin with 403. + +**Request:** +```json +{"sourceSystem": "roster-zermelo", "sessions": [ /* rows in the session shape */ ]} +``` + +**Response (200):** the upsert result above. + +**Errors:** +| Code | Condition | +|------|-----------| +| 400 | `sourceSystem` empty, or `sessions` not a list. | +| 403 | Caller is not an admin (middleware, or the explicit check for a delegated settings admin). | +| 503 | OpenRegister is not available. | + +### `POST /apps/planninq/api/timetable/sessions/publish` +Added by timetable-draft-review (additive under version 1). Admins only, like the upsert: `#[AuthorizedAdminSetting]`, no `#[NoAdminRequired]`, and an explicit admin check. + +**Body:** `{"sourceSystem": "roster-zermelo", "from": "2026-10-05T00:00:00+02:00", "to": "2026-10-11T23:59:59+02:00"}`. Every `draft` session of that source overlapping the window becomes `scheduled`, saved whole with a fresh `importedAt`. + +**Response:** `{"contractVersion": 1, "sourceSystem": "roster-zermelo", "published": 5, "failed": []}`; `failed` lists the ids OpenRegister refused. + +**Errors:** 400 when `sourceSystem`, `from` or `to` is missing or the window is reversed; 403 for a non-admin; 503 without OpenRegister. + +A session's `status` may be `draft` (timetable-draft-review). The object read rule lets only the teacher it names (`teacherUserId`) and admins read a draft; the `planninq-timetable` group reads published lessons only. The GET endpoint takes `includeDrafts=true` to return the drafts the caller may read. + +## Error Codes +Row-level rejection codes in an upsert result: + +| Code | Meaning | Condition | +|------|---------|-----------| +| `missing-fields` | A required field is absent | `externalRef`, `subject`, `startsAt` or `endsAt` empty. | +| `invalid-dates` | The times do not make a lesson | `startsAt` or `endsAt` unparseable, or `endsAt` not after `startsAt`. | +| `invalid-status` | Unknown status | `status` present and not `draft`, `scheduled` or `cancelled`. | +| `already-published` | A published lesson cannot become a draft again | `status` is `draft` and the stored session with the same key is `scheduled` or `cancelled`; nothing is saved (timetable-draft-review, additive). | +| `duplicate-external-ref` | Same key twice in one batch | An earlier row with the same `externalRef`; the last one wins. | +| `save-failed` | OpenRegister refused the write | The save threw or returned nothing. | + +## Versioning +Contract version 1. Additive changes (a new optional field, a new criteria key, a new rejection code) keep version 1. Consumers MUST ignore unknown result keys. + +## Breaking Change Policy +A rename or removal of a field, criteria key, event class or constructor argument bumps `CONTRACT_VERSION` and ships as a new event class next to the old one for one release, announced in the PR bodies of both consumers. + +## SLA +In-process events: no network. An upsert of 1,500 rows performs one lookup and at most one save per row. A read returns at most 1,000 rows. diff --git a/openspec/changes/archive/2026-09-29-school-timetable-target/design.md b/openspec/changes/archive/2026-09-29-school-timetable-target/design.md new file mode 100644 index 00000000..038d994a --- /dev/null +++ b/openspec/changes/archive/2026-09-29-school-timetable-target/design.md @@ -0,0 +1,123 @@ +# Design: school-timetable-target + +## Architecture Overview + +``` +integriq RosterDelivery ──dispatchTyped──▶ TimetableUpsertRequestedEvent + │ + ▼ + TimetableUpsertRequestedListener + │ +admin ──POST /api/timetable/sessions/upsert──▶│ + ▼ + TimetableSessionService ──▶ OpenRegister (planninq / timetableSession) + ▲ +learniq TimetableSource ──dispatchTyped──▶ TimetableSessionsQueryEvent ──▶ TimetableSessionsQueryListener +learniq page ──GET /api/timetable/sessions──▶ TimetableController ─────────┘ +``` + +The service owns every rule. The listeners and the controller only translate their input into a service call and the service's answer into their output. Storage is OpenRegister (ADR-022); planninq still owns no table. + +## Decisions + +### D1: Typed events, not a container lookup +ADR-041 names typed `IEventDispatcher` events as the only sanctioned cross-app command, and gate 27 blocks the alternatives (registry RPC, server-side HTTP to a sibling). The listener runs inside planninq's own DI context, so integriq and learniq never resolve a planninq service. Rejected: `ContainerInterface::get('OCA\Planninq\Service\TimetableSessionService')` from the consumer (the shillinq-contribution shape). It works, but it binds the consumer to planninq's internal class and constructor, which ADR-041 calls cross-container resolution. + +### D2: A read is an event too +The query event keeps planninq's field names behind a contract instead of making learniq search planninq's register by slug. Rejected: learniq calling `ObjectService::searchObjectsBySlug('planninq', 'timetableSession', ...)` directly. It needs no planninq code, but every schema rename in planninq would silently empty learniq's timetable, the failure the fleet has shipped before. + +### D3: Upsert key is (`sourceSystem`, `externalRef`) +An occurrence id is unique only inside its own system; Untis period `1001` and a Zermelo appointment `1001` are different lessons. Scoping by source also keeps a manual row (`sourceSystem: manual`) out of reach of any import. + +### D4: One exact lookup per row, not a prefetch +A prefetch with an `in` filter would save queries, but if OpenRegister ignored the operator the prefetch would come back empty and every row would be created again. One `searchObjectsBySlug` per row with both key fields and `_limit: 2` is exact, and a week of a full school is about 1,500 rows. When a lookup finds two rows (legacy duplicates), the first is updated and a warning is logged. + +### D5: Unchanged rows are not saved +The service compares the significant fields (everything in the session shape except `importedAt`) with what is stored. Skipping unchanged rows keeps the audit trail readable after the nightly re-delivery and makes the second run of the same batch observable as `unchanged`. + +### D6: Upsert writes with RBAC off; the HTTP read uses RBAC, the query event does not +The upsert listener is reachable only from in-process server code, and the HTTP upsert is admin-only by middleware, so the service writes with `_rbac: false` for both. A coordinator who starts a learniq import is not an OpenRegister admin, and must still get the timetable in. + +The first version let every signed-in user read every lesson, so a pupil could list every group's timetable over the object API and get round learniq's visibility rules (planninq#711). The read rule is now narrow: the `planninq-timetable` group (planners and staff who need the whole school timetable; the admin creates it, as with `planninq-finance-import`), the teacher a lesson names (`teacherUserId` equal to `$userId`), and admins. The HTTP read and the OpenRegister object API use RBAC as the current user, so a pupil reads nothing there. + +A learner's own lessons are not in that rule, because learner membership lives in learniq (`Cohort.learnerIds`, `Enrolment.cohortId`), not on the lesson. A match rule can only compare the lesson's own fields with the caller, and `$user.groups` would only help where the school's group codes happen to be Nextcloud group ids. So the query event reads with RBAC off: only in-process server code can dispatch it, and learniq resolves which cohorts its user belongs to, or checks that the user may read the cohort, before it asks. Reading as the caller there would empty every pupil's timetable in learniq. Rejected: copying learner ids onto each lesson, which makes planninq keep a second, drifting copy of learniq's membership. + +### D7: Codes and ids side by side +The school's own codes (`groupReference`, `teacherReference`, `roomReference`) are what every rostering system has. The fleet ids (`cohortId`, `teacherUserId`) are what learniq has. Planninq stores both and filters on either, so learniq can read a group's lessons before anyone maps the code to a cohort. Planninq does not resolve codes itself: the deliverer knows the school's mapping. + +## Declarative-vs-imperative decision (ADR-031) + +| Behaviour | Path | Rationale | +|---|---|---| +| Session status (`scheduled`, `cancelled`) | Declarative: enum with default on the schema | The source decides; there is no transition a user performs in planninq. | +| Idempotent upsert by external key | Imperative: `TimetableSessionService` | External-system bridge (ADR-031 exception: external integration). OpenRegister has no upsert-by-foreign-key declaration. | +| Read by cohort or teacher in a window | Imperative, thin: the service builds one bounded OpenRegister query | Cross-app contract door; the filtering itself is OpenRegister's. | +| Authorization | Declarative: `authorization` block on the schema | Standard. | + +## API Design +See `contract.md`, which is authoritative. Two routes are added to `appinfo/routes.php` before the SPA catch-all: +- `timetable#sessions`: `GET /api/timetable/sessions` +- `timetable#upsert`: `POST /api/timetable/sessions/upsert` + +## Database Changes +None. The schema is declared in the register descriptor and created by the existing register import. + +## Nextcloud Integration +- Controllers: `TimetableController` (`sessions()` with `#[NoAdminRequired]` + `#[NoCSRFRequired]`; `upsert()` admin-only). +- Services: `TimetableSessionService`, resolving OpenRegister's `ObjectService` by FQCN through the container, the same duck-typed pattern as `TimelineController`. +- Events: `TimetableUpsertRequestedEvent`, `TimetableSessionsQueryEvent` extend `OCP\EventDispatcher\Event`; listeners implement `OCP\EventDispatcher\IEventListener` and are registered in `Application::register()` via `IRegistrationContext::registerEventListener()`. +- OCP: `IUserSession` (controller auth), `IEventDispatcher` (consumers), `Psr\Log\LoggerInterface`. + +## Security Considerations +- `GET` is `#[NoAdminRequired]`; the guard is the RBAC read: the service passes `_rbac: true`, so OpenRegister applies the schema's `authorization.read` for the current user (gate 7: the RBAC read is the guard, as in `TimelineController`). An identity filter is mandatory, so no caller can dump the whole table in one call. +- `POST` has no `#[NoAdminRequired]`: Nextcloud's security middleware refuses non-admins before the method runs; it keeps `#[NoCSRFRequired]` off so a browser call needs the request token. +- The upsert copies only the declared fields from each row, so a caller cannot inject OpenRegister metadata (`@self`, `id`, `importedAt`). +- No pupil personal data: a lesson carries a group code, a teacher code and a room, as the integriq design recorded. + +## File Structure +``` +lib/ + Controller/TimetableController.php (new) + Event/TimetableUpsertRequestedEvent.php (new) + Event/TimetableSessionsQueryEvent.php (new) + Listener/TimetableUpsertRequestedListener.php (new) + Listener/TimetableSessionsQueryListener.php (new) + Service/TimetableSessionService.php (new: upsert and list rules) + Service/TimetableSessionQuery.php (new: one validated, bounded read) + Service/TimetableSessionRows.php (new: reads ObjectService rows, shapes sessions) + AppInfo/Application.php (two listener registrations) + Settings/planninq_register.json (timetableSession schema, version bump) + Settings/planninq_mock_register.json (three demo sessions) +appinfo/routes.php (two routes) +l10n/en.json, l10n/nl.json (schema strings) +tests/unit/Service/TimetableSessionServiceTest.php +tests/unit/Service/TimetableSessionRowsTest.php +tests/unit/Support/InMemoryObjectService.php +tests/unit/Controller/TimetableControllerTest.php +tests/unit/Listener/TimetableUpsertRequestedListenerTest.php +tests/unit/Listener/TimetableSessionsQueryListenerTest.php +tests/unit/Settings/PlanninqRegisterSchemaTest.php (timetableSession assertions) +docs/features/school-timetable.md (new) +``` + +## Seed Data +Demo data only (mock register, imported on demand from the setup walkthrough). A timetable belongs to a school, so no session is seeded into every install. + +### Schema: `timetableSession` +| Field | Object 1 | Object 2 | Object 3 | +|-------|----------|----------|----------| +| slug | `timetable-wiskunde-3a` | `timetable-nederlands-3a` | `timetable-biologie-4b` | +| externalRef | `demo-zm-1001` | `demo-zm-1002` | `demo-zm-1003` | +| sourceSystem | `roster-zermelo` | `roster-zermelo` | `roster-zermelo` | +| subject | Wiskunde | Nederlands | Biologie | +| startsAt | 2026-09-28T09:00:00+02:00 | 2026-09-28T10:00:00+02:00 | 2026-09-28T11:15:00+02:00 | +| endsAt | 2026-09-28T09:50:00+02:00 | 2026-09-28T10:50:00+02:00 | 2026-09-28T12:05:00+02:00 | +| groupReference | 3a | 3a | 4b | +| teacherReference | JAN | PIE | KLA | +| roomReference | A1.12 | B2.04 | C0.03 | +| status | scheduled | scheduled | cancelled | + +**Related items per object:** none; a lesson links to nothing inside planninq. + +## Migration Plan +Deploy: the register version bump (0.5.0 to 0.6.0) makes the existing repair-step import create the schema. Rollback: revert; the schema stays unused. diff --git a/openspec/changes/archive/2026-09-29-school-timetable-target/migration.md b/openspec/changes/archive/2026-09-29-school-timetable-target/migration.md new file mode 100644 index 00000000..c41374cd --- /dev/null +++ b/openspec/changes/archive/2026-09-29-school-timetable-target/migration.md @@ -0,0 +1,32 @@ +# Migration: school-timetable-target + +## Current State +Register `planninq` 0.5.0 (after planninq#683) declares seven schemas. No timetable schema exists and no timetable rows exist. + +## Target State +Register `planninq` 0.6.0 declares eight schemas; the new `timetableSession` schema (version 0.1.0) is empty until a rostering delivery or the demo import fills it. + +## Migration Class +``` +Version: none +File: none +Key operations: +- No Nextcloud migration class. Planninq owns no table (ADR-022). +- The existing repair step imports lib/Settings/planninq_register.json through + OpenRegister's ConfigurationService; the info.version bump to 0.6.0 makes the + version-based skip logic import it again, which creates the schema. +``` + +## Migration Steps +1. Bump `info.version` and `components.registers.planninq.version` to 0.6.0 (development reached 0.5.0 with planninq#683 while this change was open) and add the schema with `version: 0.1.0`. Verifiable: the register file parses and the schema test passes. +2. On upgrade, the repair step imports the register. Verifiable: `timetableSession` is listed under the `planninq` register in OpenRegister. + +## Data Impact +No existing record is read, changed or removed. The import only adds a schema. + +## Rollback Procedure +Revert the merge commit. The schema remains in OpenRegister, unused; it can be deleted from the OpenRegister schema admin if wanted. No data outside it is affected. + +## Validation +- `PlanninqRegisterSchemaTest` asserts the schema, its required fields and its authorization. +- After upgrade on an instance: `GET /apps/openregister/api/registers` lists `timetableSession` under `planninq`. diff --git a/openspec/changes/archive/2026-09-29-school-timetable-target/proposal.md b/openspec/changes/archive/2026-09-29-school-timetable-target/proposal.md new file mode 100644 index 00000000..b7ebd7e0 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-school-timetable-target/proposal.md @@ -0,0 +1,70 @@ +--- +kind: code +--- + +# Proposal: school-timetable-target + +## Summary +Planninq becomes the place a school timetable lives. It gains a `timetableSession` schema that carries one lesson as the school's rostering system knows it: the source's own occurrence id (`externalRef`), the group, the teacher, the room and the subject, each with the school's own code and, where known, the fleet id it resolves to. An idempotent upsert keyed by source system and `externalRef` lets the integriq rostering adapter deliver a Zermelo, Untis, Xedule or TimeEdit timetable again and again without duplicates. A read API lists the sessions of a cohort or a teacher in a date range, so learniq can show timetables it no longer stores. + +## Motivation +Decision D10 (learniq round 1, `market-intelligence/learniq/_round1/compare/decisions.md`, Ruben, 2026-09-27) says planninq owns the timetable, the integriq adapter delivers into planninq, and learniq reads sessions from there. D25 says it is built now. + +Today planninq has no timetable concept at all. Its register holds `task`, `project`, `projectPhase`, `column`, `plannedTimeEntry`, `label` and `dependency`; nothing carries a start and end time, a room or a group. The integriq rostering adapter merged as integriq #2166 maps a lesson onto learniq's `DataExchangeJob` payload, and learniq's `TimetableImportHandler` writes learniq `Session` rows from it. Once D10 moves the target, integriq needs a planninq shape to deliver into, and learniq needs a planninq read to replace its own rows. + +Corpus evidence: +- M3 row `I11` (`_round1/compare/M3-integrations.md`): a live timetable koppeling from Zermelo, Untis or Xedule is documented by every VO, MBO and HE incumbent surveyed (vo-las#11.7, mbo-he-sis#11.7, DPIA "SIS<=>Xedule: Uitwisselen van student, groepen en roosterinformatie"). Section (b) of that file recommends planninq own the rostering-import contract. +- Planninq's own parity matrix (`openspec/parity/capabilities.json`, planninq #665) carries Zermelo, Untis, Xedule and TimeEdit as timetabling competitors; `pln-calendar-view` quotes each one showing day and week timetables per teacher, group or room (rung: competitor docs read 2026-09-27). + +## Affected Projects +- [x] Project: `planninq`: new `timetableSession` schema, idempotent upsert service, two ADR-041 events (upsert request, sessions query), a read endpoint and an admin upsert endpoint. +- [ ] Project: `integriq`: consumer, repointed in the follow-up change `rostering-adapter-targets-planninq`. +- [ ] Project: `learniq`: consumer, reads through the follow-up change `sessions-from-planninq`. + +## Scope + +### In Scope +- `timetableSession` schema in `lib/Settings/planninq_register.json` with authorization (read for signed-in users, write for admins), demo rows in the mock register, and catalogue keys for every new schema string. +- `TimetableSessionService`: validate, normalise and upsert a batch by (`sourceSystem`, `externalRef`); report created, updated, unchanged and rejected rows; list sessions by cohort, group, teacher or teacher code in a date window, bounded by a limit. +- `TimetableUpsertRequestedEvent` and `TimetableSessionsQueryEvent` in `OCA\Planninq\Event`, each with a result slot, and the listeners that answer them through the service (ADR-041). +- `GET /api/timetable/sessions` (signed-in users, read through OpenRegister with RBAC on) and `POST /api/timetable/sessions/upsert` (admins only). +- A `school-timetable` capability spec and the contract document the two consumers build against. + +### Out of Scope +- A timetable page inside planninq. Learniq renders the school timetable; a planninq calendar is the separate `planning-calendar` change. +- The wire binding to Zermelo, Untis, Xedule or TimeEdit. That stays in integriq and stays dormant until each institution onboards (D9). +- Resolving a school's group or teacher code to a fleet id. Planninq stores what the deliverer resolved; integriq's target configuration does the mapping. +- Substitutions, cancellation notices and conflict detection. Learniq keeps those and runs them on the data this change exposes. + +## Approach +One schema, one service, two events, one controller. The service owns every rule: required fields, date sanity, the upsert key and the query bounds. The events and the controller are thin doors onto it. Writes from the upsert event run with RBAC off because only server code in another app can dispatch them; the admin endpoint is protected by Nextcloud's admin middleware. Reads always run with RBAC on as the current user. Details and alternatives are in design.md. + +## New Dependencies +None. + +## Impact +- `lib/Settings/planninq_register.json`: one new schema, register `info.version` 0.5.0 to 0.6.0. +- `lib/Settings/planninq_mock_register.json`: three demo sessions. +- New PHP: `lib/Service/TimetableSessionService.php`, `lib/Event/TimetableUpsertRequestedEvent.php`, `lib/Event/TimetableSessionsQueryEvent.php`, `lib/Listener/TimetableUpsertRequestedListener.php`, `lib/Listener/TimetableSessionsQueryListener.php`, `lib/Controller/TimetableController.php`. +- `appinfo/routes.php`: two routes. `lib/AppInfo/Application.php`: two listener registrations. +- `l10n/en.json`, `l10n/nl.json`: schema strings. + +## Cross-Project Dependencies +Integriq and learniq consume this change through `contract.md`. Neither imports a planninq class: both look the event class up by name and fail closed when planninq is absent, the way shillinq reaches filinq today. Their changes are stacked on this one in time, not in git: each works against the contract and degrades cleanly when planninq is not installed. + +## Risks + +### Risk 1: Upsert runs without RBAC +**Severity:** Medium. **Mitigation:** only in-process server code can dispatch the event, and the listener accepts nothing but the declared fields. The HTTP door to the same service is admin-only. + +### Risk 2: A school's group code never resolves to a cohort +**Severity:** Medium. **Mitigation:** the read API filters on the school's own `groupReference` as well as on `cohortId`, so a consumer can still find a group's lessons before a mapping exists. + +### Risk 3: Large timetables +**Severity:** Low. **Mitigation:** one lookup per record keeps the upsert exact; a week for a full VO school is about 1,500 lessons, well inside one request. Reads are bounded (default 500, maximum 1,000). + +## Rollback Strategy +Revert the merge commit. The schema and its rows stay in OpenRegister but nothing reads or writes them; integriq and learniq fall back to their current paths because their class lookup finds no event. + +## Open Questions +None. The deliverer-side mapping of school codes to fleet ids is recorded as an integriq concern in the follow-up change. diff --git a/openspec/changes/archive/2026-09-29-school-timetable-target/specs/school-timetable/spec.md b/openspec/changes/archive/2026-09-29-school-timetable-target/specs/school-timetable/spec.md new file mode 100644 index 00000000..172640c5 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-school-timetable-target/specs/school-timetable/spec.md @@ -0,0 +1,129 @@ +# school-timetable Specification + +**Status**: in-progress +**Scope**: planninq +**OpenSpec changes**: +- school-timetable-target + +## Purpose +Planninq holds a school's timetable as `timetableSession` rows (schema:Event; iCalendar VEVENT: `UID` = `externalRef`, `DTSTART` = `startsAt`, `DTEND` = `endsAt`, `SUMMARY` = `title`, `LOCATION` = `roomLabel`, `STATUS` = `status`). Rows arrive from a rostering system through the integriq adapter and are upserted idempotently by source and occurrence id. Other apps read them by cohort, group or teacher in a date window. Decision D10 (learniq round 1) makes planninq the timetable owner; ADR-041 fixes the cross-app mechanism as typed events; ADR-022 keeps storage in OpenRegister. + +## ADDED Requirements + +### Requirement: A timetable session schema carries the school's own ids (REQ-001) +The register MUST declare a `timetableSession` schema whose required fields are `externalRef`, `sourceSystem`, `subject`, `startsAt` and `endsAt`, and whose optional fields are `title`, `groupReference`, `cohortId`, `teacherReference`, `teacherUserId`, `roomReference`, `roomLabel`, `status` (`scheduled` or `cancelled`, default `scheduled`) and `importedAt`. Its authorization MUST let the `planninq-timetable` group, the teacher a lesson names (`teacherUserId` equal to the caller) and admins read, MUST NOT let every signed-in user read (planninq#711), and MUST let only admins create, update or delete. The register version and the schema version MUST be bumped. Feature tier: V1. + +#### Scenario: The schema is declared with its required fields +- GIVEN `lib/Settings/planninq_register.json` +- WHEN the `timetableSession` schema is read +- THEN its `required` list is exactly `externalRef`, `sourceSystem`, `subject`, `startsAt`, `endsAt` +- AND `status` declares the enum `scheduled`, `cancelled` with default `scheduled` +- AND `authorization.read` is exactly the `planninq-timetable` group, the `authenticated` group matched on `teacherUserId` equal to `$userId`, and `admin` +- AND no read rule admits the `authenticated` group without a match +- AND `create`, `update` and `delete` admit only `admin` + +#### Scenario: A pupil cannot read another group's lessons +- GIVEN lessons for groups 4A and 4B, each naming its own teacher +- AND a signed-in pupil of 4A who is not in `planninq-timetable` and is named by no lesson +- WHEN the `timetableSession` read rule is applied to that pupil +- THEN no lesson of 4B is readable, and no lesson of 4A either +- AND the teacher `klaas` reads exactly the lessons that name `klaas` +- AND a member of `planninq-timetable` and an admin read every lesson + +#### Scenario: Demo data covers the schema +- GIVEN `lib/Settings/planninq_mock_register.json` +- WHEN its objects are grouped by schema +- THEN at least one object has schema `timetableSession` and carries every required field + +### Requirement: Upsert is idempotent by source and occurrence id (REQ-002) +`TimetableSessionService::upsert()` MUST match an incoming row to an existing session only when both `sourceSystem` and `externalRef` are equal. A match with unchanged significant fields MUST be counted `unchanged` and not saved; a match with a changed field MUST be updated in place; no match MUST create a new session. Every create or update MUST stamp `importedAt` server-side. A row whose key appears again later in the same batch MUST be rejected with `duplicate-external-ref`, and the last occurrence MUST win. Feature tier: V1. + +#### Scenario: Delivering the same timetable twice creates no duplicates +- GIVEN an empty timetable +- WHEN a batch of two rows from `roster-zermelo` is upserted twice +- THEN the first run reports `created: 2` +- AND the second run reports `created: 0`, `updated: 0`, `unchanged: 2` +- AND no save is made on the second run + +#### Scenario: A moved lesson is updated, not duplicated +- GIVEN a session `zm-1001` from `roster-zermelo` in room `A1.12` +- WHEN the same `externalRef` arrives with room `B2.04` +- THEN the existing session is saved with its own id and room `B2.04` +- AND the result reports `updated: 1` + +#### Scenario: The same externalRef from another source is a different lesson +- GIVEN a session `1001` from `roster-untis-oneroster` +- WHEN a row `1001` arrives from `roster-zermelo` +- THEN a new session is created +- AND the Untis session is left untouched + +### Requirement: Upsert validates before it writes (REQ-003) +The service MUST reject, without any write, a row that lacks a required field (`missing-fields`), whose times are unparseable or do not end after they start (`invalid-dates`), or whose `status` is not `scheduled` or `cancelled` (`invalid-status`). A save that throws or returns nothing MUST be reported as `save-failed`. The result MUST satisfy `processed = created + updated + unchanged + count(rejected)`. Feature tier: V1. + +#### Scenario: An incomplete row is rejected and the rest lands +- GIVEN a batch where one row has no `subject` +- WHEN the batch is upserted +- THEN that row appears in `rejected` with `errorCode` `missing-fields` +- AND the other rows are created +- AND `processed` equals the batch size + +#### Scenario: A lesson that ends before it starts is rejected +- GIVEN a row with `endsAt` earlier than `startsAt` +- WHEN it is upserted +- THEN it is rejected with `invalid-dates` and nothing is saved + +### Requirement: Another app delivers a batch through a typed event (REQ-004) +Planninq MUST publish `OCA\Planninq\Event\TimetableUpsertRequestedEvent` (contract version 1) carrying `sourceApp`, `sourceSystem`, `sessions` and `correlationId`, and MUST register a listener that runs the upsert with the event's `sourceSystem` and writes the result into the event's result slot, marking it handled. The listener MUST write with RBAC off, because only in-process server code can dispatch the event. Feature tier: V1. + +#### Scenario: Integriq's dispatch is answered with a result +- GIVEN planninq is installed +- WHEN a `TimetableUpsertRequestedEvent` for `roster-zermelo` with two valid rows is dispatched +- THEN after dispatch `isHandled()` is true +- AND `getResult()` reports `contractVersion: 1` and `created: 2` + +#### Scenario: A row's own sourceSystem cannot redirect the batch +- GIVEN an event for `roster-zermelo` whose row says `sourceSystem: roster-xedule` +- WHEN it is handled +- THEN the session is stored with `sourceSystem` `roster-zermelo` + +### Requirement: Another app reads sessions through a typed event (REQ-005) +Planninq MUST publish `OCA\Planninq\Event\TimetableSessionsQueryEvent` (contract version 1) and a listener that answers it with the sessions matching the criteria, read with RBAC off. Only in-process server code can dispatch the event, and the requesting app MUST ask only for a cohort or teacher its user may see; planninq holds no cohort membership it could check that against (planninq#711). At least one of `cohortId`, `groupReference`, `teacherUserId`, `teacherReference` MUST be given, or the listener MUST set an error instead of sessions. A session MUST be included when it overlaps the optional `from`/`to` window. Results MUST be sorted by `startsAt` and bounded by `limit` (default 500, at most 1,000). Feature tier: V1. + +#### Scenario: A cohort's week is returned in time order +- GIVEN three sessions for cohort `c-1`, one of them outside the requested week +- WHEN a query event asks for `cohortId: c-1` in that week +- THEN the two sessions inside the week are returned, earliest first +- AND the read ran with RBAC off + +#### Scenario: A query without an identity filter is refused +- GIVEN a query event with only a date window +- WHEN it is handled +- THEN `getSessions()` is null and `getError()` names the missing filter + +### Requirement: Signed-in users read sessions over HTTP; only admins upsert (REQ-006) +`GET /api/timetable/sessions` MUST be open to any signed-in user, MUST read through OpenRegister with RBAC on, so a caller receives only the lessons the schema's read rule grants them, and MUST answer 400 when no identity filter is given or the window is invalid. `POST /api/timetable/sessions/upsert` MUST NOT carry `#[NoAdminRequired]`, so Nextcloud refuses non-admins, and MUST answer 400 when `sourceSystem` is empty or `sessions` is not a list. Feature tier: V1. + +#### Scenario: A teacher lists their own week +- GIVEN a signed-in teacher with sessions under `teacherUserId` +- WHEN they call `GET /api/timetable/sessions?teacherUserId=&from=...&to=...` +- THEN the response is 200 with `results` and `total` + +#### Scenario: A read without filters is refused +- GIVEN a signed-in user +- WHEN they call `GET /api/timetable/sessions` with no filter +- THEN the response is 400 + +## Non-Functional Requirements + +- **Performance:** an upsert makes one lookup and at most one save per row; a read returns at most 1,000 rows. +- **Accessibility:** no user interface in this change. +- **Internationalization:** every schema title and description has an English and a Dutch catalogue value (ADR-007). + +## Acceptance Criteria + +- The schema, its demo rows and its catalogue keys exist and pass `npm run check:schema-l10n`. +- Re-delivering the same batch reports every row unchanged. +- Both events are answered by planninq's listeners and both endpoints are routed with the declared auth posture. + +## Notes +Integriq (`rostering-adapter-targets-planninq`) and learniq (`sessions-from-planninq`) build against `contract.md` of this change. diff --git a/openspec/changes/archive/2026-09-29-school-timetable-target/tasks.md b/openspec/changes/archive/2026-09-29-school-timetable-target/tasks.md new file mode 100644 index 00000000..24d65fe8 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-school-timetable-target/tasks.md @@ -0,0 +1,59 @@ +# Tasks: school-timetable-target + +## Implementation Tasks + +### Task 1: Declare the timetableSession schema, demo rows and catalogue keys (V1) +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-a-timetable-session-schema-carries-the-schools-own-ids-req-001` +- **files**: `lib/Settings/planninq_register.json`, `lib/Settings/planninq_mock_register.json`, `l10n/en.json`, `l10n/nl.json`, `tests/unit/Settings/PlanninqRegisterSchemaTest.php` +- **acceptance_criteria**: + - GIVEN the register WHEN parsed THEN `timetableSession` exists with the required fields, status enum and authorization + - GIVEN the mock register WHEN grouped THEN three demo sessions exist + - GIVEN `npm run check:schema-l10n` WHEN run THEN it exits 0 +- [x] Implement +- [x] Test + +### Task 2: TimetableSessionService upsert and list (V1) +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-upsert-is-idempotent-by-source-and-occurrence-id-req-002` +- **files**: `lib/Service/TimetableSessionService.php`, `lib/Service/TimetableSessionQuery.php`, `lib/Service/TimetableSessionRows.php`, `tests/unit/Service/TimetableSessionServiceTest.php`, `tests/unit/Service/TimetableSessionRowsTest.php` +- **acceptance_criteria**: + - GIVEN a batch delivered twice WHEN upserted THEN the second run is all `unchanged` + - GIVEN invalid rows WHEN upserted THEN each is rejected with its code before any write + - GIVEN a cohort and a window WHEN listed THEN overlapping sessions come back sorted and bounded +- [x] Implement +- [x] Test + +### Task 3: The two ADR-041 events and their listeners (V1) +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004` +- **files**: `lib/Event/TimetableUpsertRequestedEvent.php`, `lib/Event/TimetableSessionsQueryEvent.php`, `lib/Listener/TimetableUpsertRequestedListener.php`, `lib/Listener/TimetableSessionsQueryListener.php`, `lib/AppInfo/Application.php`, listener tests +- **acceptance_criteria**: + - GIVEN an upsert event WHEN handled THEN the result slot carries the service result and the event is handled + - GIVEN a query event without an identity filter WHEN handled THEN it carries an error and no sessions +- [x] Implement +- [x] Test + +### Task 4: TimetableController read and admin upsert routes (V1) +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-signed-in-users-read-sessions-over-http-only-admins-upsert-req-006` +- **files**: `lib/Controller/TimetableController.php`, `appinfo/routes.php`, `tests/unit/Controller/TimetableControllerTest.php` +- **acceptance_criteria**: + - GIVEN a signed-in user WHEN they read with a filter THEN 200; without a filter THEN 400 + - GIVEN the upsert method WHEN inspected THEN it carries no `NoAdminRequired` +- [x] Implement +- [x] Test + +### Task 5: Feature documentation (V1) +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005` +- **files**: `docs/features/school-timetable.md` +- **acceptance_criteria**: + - GIVEN an integrator WHEN they read the page THEN they find the session shape, both events and both endpoints +- [x] Implement + +## Verification +- [x] All tasks checked off +- [x] `openspec validate school-timetable-target` passes + +## Quality checklist + +- New business logic covered by PHPUnit unit tests (`tests/unit/`). +- No Newman collection: the endpoints are covered by controller unit tests; the lane has no instance of its own. +- No UI change, so no Playwright test. +- English and Dutch catalogue values for every new schema string (ADR-007). diff --git a/openspec/changes/archive/2026-09-29-school-timetable-target/test-plan.md b/openspec/changes/archive/2026-09-29-school-timetable-target/test-plan.md new file mode 100644 index 00000000..5ddc13c2 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-school-timetable-target/test-plan.md @@ -0,0 +1,70 @@ +# Test Plan: school-timetable-target + +## Test Cases + +### TC-1: Schema declares the session shape and its access rules +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-a-timetable-session-schema-carries-the-schools-own-ids-req-001` +- **type**: regression +- **preconditions**: the register file on the branch +- **steps**: run `PlanninqRegisterSchemaTest` +- **expected result**: required fields, status enum and authorization match the spec; demo rows exist +- **test command**: `vendor/bin/phpunit -c phpunit-unit.xml --filter PlanninqRegisterSchemaTest` + +### TC-2: Re-delivery is idempotent +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-upsert-is-idempotent-by-source-and-occurrence-id-req-002` +- **type**: regression +- **preconditions**: an ObjectService double that stores saved rows in memory +- **steps**: upsert the same two-row batch twice +- **expected result**: `created: 2`, then `unchanged: 2` and no second save +- **test command**: `vendor/bin/phpunit -c phpunit-unit.xml --filter TimetableSessionServiceTest` + +### TC-3: Moved lesson updates, other source creates +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-upsert-is-idempotent-by-source-and-occurrence-id-req-002` +- **type**: regression +- **preconditions**: one stored session +- **steps**: upsert the same key with a new room; upsert the same `externalRef` from another source +- **expected result**: update in place with the stored id; a separate create for the other source +- **test command**: `vendor/bin/phpunit -c phpunit-unit.xml --filter TimetableSessionServiceTest` + +### TC-4: Validation rejects before writing +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-upsert-validates-before-it-writes-req-003` +- **type**: regression +- **preconditions**: a batch with a missing subject, reversed times, an unknown status and a duplicate key +- **steps**: upsert it +- **expected result**: each bad row rejected with its code, the valid rows created, the tally adds up +- **test command**: `vendor/bin/phpunit -c phpunit-unit.xml --filter TimetableSessionServiceTest` + +### TC-5: Upsert event is answered +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-delivers-a-batch-through-a-typed-event-req-004` +- **type**: api +- **preconditions**: the listener with a service double +- **steps**: handle a real `TimetableUpsertRequestedEvent` +- **expected result**: handled, result carries `contractVersion: 1`, the event's source wins over a row's +- **test command**: `vendor/bin/phpunit -c phpunit-unit.xml --filter TimetableUpsertRequestedListenerTest` + +### TC-6: Query event is answered in time order, refused without a filter +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-another-app-reads-sessions-through-a-typed-event-req-005` +- **type**: api +- **preconditions**: the listener with the real service over an ObjectService double +- **steps**: handle a cohort query for a week; handle a query with only a window +- **expected result**: sessions in the week, earliest first; an error and no sessions for the second +- **test command**: `vendor/bin/phpunit -c phpunit-unit.xml --filter TimetableSessionsQueryListenerTest` + +### TC-7: HTTP read and admin upsert +- **spec_ref**: `openspec/changes/school-timetable-target/specs/school-timetable/spec.md#requirement-signed-in-users-read-sessions-over-http-only-admins-upsert-req-006` +- **type**: security +- **preconditions**: controller with a user session double +- **steps**: call `sessions()` with and without filters and without a user; call `upsert()` with a bad body; inspect attributes +- **expected result**: 200, 400, 401; 400 for the bad body; `upsert()` carries no `NoAdminRequired` +- **test command**: `vendor/bin/phpunit -c phpunit-unit.xml --filter TimetableControllerTest` + +## Coverage Summary +- REQ-001: covered by TC-1. +- REQ-002: covered by TC-2, TC-3. +- REQ-003: covered by TC-4. +- REQ-004: covered by TC-5. +- REQ-005: covered by TC-6. +- REQ-006: covered by TC-7. + +## Out of Scope +A live instance run against a real OpenRegister: the lane has no instance of its own and must not deploy to the shared one on :8080. The integriq and learniq changes exercise the events from the consumer side with the real event classes. diff --git a/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/design.md b/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/design.md new file mode 100644 index 00000000..435a21f6 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/design.md @@ -0,0 +1,78 @@ +# Design: assign people, set priority and attach labels on a task + +## Context + +Read at development `de35541`: + +- Schema `task` (`lib/Settings/planninq_register.json`): `assignedTo` string (one uid), + `priority` enum low, normal, high, urgent, `labels` array of label uuids, `watchers` array of + uids (unused). +- Readers of `assignedTo`: `src/components/TaskCard.vue:65-66`, `src/views/TaskDetail.vue:267`, + `src/store/projects.js:642` (member task count before removal), + `lib/Listener/TaskActivityListener.php:197-230` (assignee change subject and audience), the + `taskDueSoon` notification rule (recipients `field: assignedTo`), and the portal exclusion list + in `lib/Portal/PortalContributionProvider.php:20,61`. +- `src/utils/taskHelpers.js:34` hides the library's `tags` and `tasks` sidebar tabs. +- Labels: schema `label` is readable by every authenticated user and writable by admins only; + `fetchLabels` (`src/store/projects.js:806`) reads them; `resolveTaskLabels` + (`src/utils/labelHelpers.js:126`) maps a task's uuids to label objects. +- Board card actions: the `NcActions` menu per card (`src/views/ProjectBoard.vue:152-165`) holds + the keyboard move targets. +- Project members: `project.members` (uids); `MemberSearch.vue` looks users up for the + settings sidebar. + +## Goals / non-goals + +Goals: set and change the responsible person, extra people, priority and labels from planninq. +Non-goals: notifications (lane B), board filters, label administration. + +## Decisions + +### Decision 1: one responsible person plus a shared-with list + +`assignedTo` keeps its meaning and type. A new optional `sharedWith` (array of uids) holds the +others. The picker shows the responsible person first and "Also working on this" for the rest. +Alternative: change `assignedTo` to an array. Rejected: a type change on a field that a +notification rule, a listener, a portal filter and a ZGW mapping read is a breaking schema change. + +### Decision 2: pick from project members only + +The picker's options are `project.members`, shown with `NcAvatar` and display name. Assigning +someone who is not a member is not offered. A member removed from the project keeps their +assignments until reassigned; the removal dialog already warns with the count. + +### Decision 3: priority inline and on the card + +TaskDetail shows priority as an `NcSelect` that saves on change through `updateTask`. The card's +action menu gains a "Priority" submenu with the four levels, so a triage pass needs no page +change. + +### Decision 4: a label picker instead of the generic tag tab + +TaskDetail shows a multi-select of all labels (title and colour swatch) writing `task.labels`. +The generic `tags` tab stays hidden: it stores Nextcloud system tags, not planninq labels. + +### Decision 5: the Activity audience includes `sharedWith` + +`TaskActivityListener::resolveAudience` adds every uid in `sharedWith`, so the people sharing a +task see its events. + +## Amendments at build time (29 Sep 2026, on top of tasks-create-edit-delete) + +- **Decision 3, the card menu:** the card's `NcActions` menu gains a "Priority" caption followed + by the four levels, not a nested submenu: the menu is already a flat list of move targets, and a + caption keeps every level one keypress away. +- **Decision 2, who is offered:** the project's owner is offered with the members, since the owner + is not always in `members`. +- **The task dialog** from tasks-create-edit-delete gets the two people pickers when it knows the + project (board header and task page both pass it). +- **Vitest runs in the node environment**, so the "mount tests" of tasks 2.2 and 3.1 are tests of + the pure helpers in `src/utils/taskPeople.js` plus a source check of the board menu; the + browser behaviour is in `tests/e2e/task-people.spec.ts`. +- `sharedWith` is not checked against the project's members on the server; the pickers offer + members only. A later server rule can refuse others if that matters. + +## Risks / trade-offs + +- [Two people fields to read] -> the "my tasks" queries (`portfolio-my-work-dashboard`) match on + either field; documented there. diff --git a/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/proposal.md b/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/proposal.md new file mode 100644 index 00000000..2631ef17 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/proposal.md @@ -0,0 +1,120 @@ +--- +kind: code +--- + +# Assign people, set priority and attach labels on a task + +## Why + +A task's assignee, priority and labels are shown but can never be set. `assignedTo` is read for +display only (`src/components/TaskCard.vue:65-66`, `src/views/TaskDetail.vue:267`) and as a +query filter (`src/store/projects.js:642`); nothing writes it. `priority` is a chip on the card +and a line on the task page, never an input. Labels render as chips and filter the board, but +the generic tag tab that could attach one is hidden on purpose +(`src/utils/taskHelpers.js:34`) and nothing replaced it. So the due reminder, which is sent to +`assignedTo`, and the Activity entry for a new assignee +(`lib/Listener/TaskActivityListener.php:197-230`) have nobody to reach unless an import set the +field. + +A task also holds one person only (`assignedTo` is a string). Deck and Plane let a pair share a +card. + +Parity rows: `tsk-assign`, `tsk-multi-assign`, `tsk-priority`, `tsk-labels` in planninq's +`openspec/parity/capabilities.json`. +Decision: build. `tsk-assign` has six competitors yes, `tsk-priority` four, `tsk-multi-assign` +two, and `tsk-labels` is rated partial with three competitors yes on the missing half +(attaching a label). + +## What changes + +- A project member assigns a task to one project member, the person responsible, and can add + more members who share the work. +- Names show as avatars with display names, not raw user ids. +- A project member sets a task's priority on the task page and from the card's action menu. +- A project member attaches and removes labels on the task page from the app-wide label list. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `tsk-assign`, `tsk-multi-assign`, `tsk-priority`, `tsk-labels`. + +### `tsk-assign`: Assign a task to a person. + +- Area `tasks`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "task.assignedTo is a plain string schema property (lib/Settings/planninq_register.json). It is only ever read for display: src/components/TaskCard.vue:65-66 and src/views/TaskDetail.vue:267 (fields()). No component, dialog or store action writes assignedTo anywhere in src/ (only read as a query filter in src/store/projects.js:642 getMemberTaskCount)." +- Demand: none recorded on the row. +- Competitors rated yes (6): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/M1-column.md 2.4 'assignUser and unassignUser per card ... Verified live' ; source read at v1.19.0: src/components/card/AssignmentSelector.vue:17-18 'Assign a user to this card…' mounted from src/components/card/CardSidebarTabDetails.vue:15-19; lib/Controller/CardController.php:126 assignUser, lib/Service/AssignmentService.php:48" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/M1-column.md 2.4 'assigned_to and a separate responsible, both Principal (app/models/work_package.rb:57-81)' ; source read at v17.8.0: app/models/work_package.rb:61 assigned_to (a Principal); lib/api/v3/work_packages/schema/work_package_schema_representer.rb:451-453 available assignees feed the assignee picker; lib/api/v3/work_packages/work_packages_api.rb:99 AvailableAssigneesAPI" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/M1-column.md 2.4 'Issue.assignees M2M (issue.py:149) ... editable from the work item peek and the spreadsheet layout' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:126 assignee_ids dropdown; apps/web/core/components/issues/issue-layouts/properties/all-properties.tsx:121 updateIssue assignee_ids from the card; apps/api/plane/db/models/issue.py:149 assignees M2M; apps/api/plane/app/views/issue/base.py:628 partial_update" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/M1-column.md 2.4 'yes' ; journeys.md 5 ; source: app/Model/TaskCreationModel.php:67 owner_id ; source read at v1.2.54: app/Helper/TaskHelper.php:126-130 'Assignee' select with 'Assign to me'; app/Controller/TaskModificationController.php:17 assignToMe; app/Model/TaskCreationModel.php:67 owner_id" + - Jira Software Data Center 11 (https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html): "corpus: jira-data-center/round4/M1-column.md 2.4 'Assign issues Permission to assign issues to users' ; docs read 2026-09-26: https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html 'Assign issues Permission to assign issues to users. This permissions also allows autocompletion of users in the Assign Issue dropdown' (read 2026-09-26)" + - Untis, WebUntis and Untis Mobile (https://help.untis.at/hc/de/articles/360015324359): "docs read 2026-09-27: https://help.untis.at/hc/de/articles/360015324359 'Die Aufgabe kann nun vom Sachbearbeiter mit einer Bemerkung versehen, einem anderen Benutzer zugewiesen ... werden' and staff can take a ticket for themselves" + +### `tsk-multi-assign`: Assign one task to several people. + +- Area `tasks`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "assignedTo is declared type: string (single value), not an array (lib/Settings/planninq_register.json properties.assignedTo), and as tsk-assign shows there is no assignment UI at all." +- Demand: none recorded on the row. +- Competitors rated yes (2): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/journeys.md 2 'jdevries and the group as assignees' ; code-census.md 'Assignment: user, group, team, remote' ; source read at v1.19.0: src/components/card/AssignmentSelector.vue:14 :multiple="true", :6 'Assign to users/groups/team'; lib/Db/Assignment.php:17-20 user, group, circle and remote assignees" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §2 'assignees M2M (:149)'; journeys.md 'assignees' plural set in the driven journey ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:126-139 assignee_ids dropdown with multiple; apps/api/plane/db/models/issue.py:149 assignees ManyToManyField" + +### `tsk-priority`: Give a task a priority. + +- Area `tasks`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "priority is only displayed, never set: src/components/TaskCard.vue:32-36 (chip) and :189-211 (priorityLabel/priorityVariant), src/views/TaskDetail.vue:266 (fields()). No form or control anywhere writes task.priority." +- Demand: none recorded on the row. +- Competitors rated yes (4): + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/M1-column.md 8.2 'IssuePriority as a separate administered vocabulary'; 3.9 custom action kinds include priority ; source read at v17.8.0: app/models/work_package.rb:64 belongs_to priority IssuePriority; app/models/issue_priority.rb:31; config/routes.rb:771 admin work_package_priorities; config/initializers/menus.rb:421-422 'Priorities' admin page" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §2 'priority from PRIORITY_CHOICES urgent/high/medium/low/none' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:109-119 PriorityDropdown; apps/api/plane/db/models/issue.py:107 PRIORITY_CHOICES and :141-143 priority field" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "source: app/Filter/TaskPriorityFilter.php, app/Template/board/task_footer.php:135 renderPriority, app/Action/TaskAssignColorPriority.php ; corpus: kanboard/round4/M1-column.md 2.6 bulk 'change ... priority' ; source read at v1.2.54: app/Helper/TaskHelper.php:174-179 'Priority' select over the project range; app/Template/board/task_footer.php:135 renderPriority on the card; app/Filter/TaskPriorityFilter.php; app/Action/TaskAssignColorPriority.php:23" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/advanced-searching-fields-reference-939938743.html, https://confluence.atlassian.com/adminjiraserver/translating-resolutions-priorities-statuses-and-issue-types-938847111.html): "corpus: jira-data-center/round4/M1-column.md 8.2 'priority is a separate list'; 1.11 issue collector standard fields include 'Priority' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/advanced-searching-fields-reference-939938743.html 'Syntax priority Field Type PRIORITY'; https://confluence.atlassian.com/adminjiraserver/translating-resolutions-priorities-statuses-and-issue-types-938847111.html names 'the priority field' as an issue constant (read 2026-09-26)" + +### `tsk-labels`: Tag tasks with coloured labels. + +- Area `tasks`. Planninq is rated `partial`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "Labels are app-wide objects tasks reference by UUID array (task.labels), rendered and filterable on the board: src/views/ProjectBoard.vue:69-95 (filter chips), :439-441 (labelsForTask), src/components/TaskCard.vue:44-58 (label chips). But no UI anywhere lets a user add/remove a label ON a given task: the library's generic per-object tag tab is deliberately hidden, src/utils/taskHelpers.js:34 TASK_SIDEBAR_HIDDEN_TABS = ['tags', 'tasks'] applied at :59, and Planninq built no replacement tagging ... (shortened; full text in the matrix row)" +- Defect: "src/utils/taskHelpers.js:34 hides the generic CnTagsTab with a comment claiming Planninq has its own label concept, but no per-task label-attach UI exists to replace it" +- Note: "a task can display and be filtered by labels, but there is no way for a user to actually tag a task with one." +- Demand: none recorded on the row. +- Competitors rated yes (3): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/M1-column.md 2.8 'labels per board with a colour ... Verified live: label Kap on card 6' ; source read at v1.19.0: src/components/card/TagSelector.vue:15-16 'Assign a tag to this card…', 'Select or create a tag…', mounted at src/components/card/CardSidebarTabDetails.vue:8-13, :187 addLabelToCard; lib/Controller/CardController.php:116 assignLabel, lib/Service/CardService.php:618" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/M1-column.md 2.8 'label.py:11 workspace-scoped with an optional project, a self-FK parent, color and sort_order' ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/default-properties.tsx:147-157 label_ids dropdown; apps/web/core/components/issues/issue-layouts/properties/labels.tsx:155 coloured chip; apps/api/plane/db/models/label.py:11-21 Label with parent and color; apps/api/plane/db/models/issue.py:543-545 IssueLabel" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/journeys.md 4 'createTag spoed and setTaskTags' ; source: app/Template/board/task_footer.php:28 tag colour ; source read at v1.2.54: app/Helper/TaskHelper.php:90-95 'Tags' field on the task form; app/Model/TaskTagModel.php:100 save; app/Template/board/task_footer.php:28 tag colour on the card; app/Controller/ProjectTagController.php:39 save a project tag" + +## Scope + +### In scope + +- A people picker limited to the project's members, on TaskDetail and in `TaskFormDialog.vue`. +- A new optional `sharedWith` array on the task schema for the extra assignees. +- Priority control on TaskDetail and in the card's action menu on the board. +- A label picker on TaskDetail writing `task.labels`. + +### Out of scope + +- Sending a notification on assignment: `collaboration-notifications` (lane B) does that and + reads the same fields. +- Creating new labels: labels stay admin-managed (`2026-06-14-label-management-admin`). +- Filtering the board by assignee or priority: `boards-filters`. + +## Impact + +- `lib/Settings/planninq_register.json` (task: new `sharedWith`), `src/views/TaskDetail.vue`, + `src/views/ProjectBoard.vue` (card action), `src/components/TaskCard.vue`, + `src/dialogs/TaskFormDialog.vue`, `lib/Listener/TaskActivityListener.php` (audience includes + `sharedWith`), `l10n/`. +- Depends on: `tasks-create-edit-delete` (the task dialog). + +## Risks + +### Risk 1: Turning `assignedTo` into an array breaks its readers +**Severity**: High +**Mitigation**: `assignedTo` stays a single uid (the responsible person, and the VNG InterneTaak +`toegewezenAanGebruikersnaam`). Extra people go in a new `sharedWith` array, so the reminder +rule, the Activity listener, the member task count and the portal exclusion list keep working. + +### Risk 2: Assigning someone outside the project +**Severity**: Medium +**Mitigation**: the picker lists `project.members` only, and removing a member already counts +their assigned tasks first (`src/components/ProjectSettingsSidebar.vue`). diff --git a/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/specs/task-people-and-tags/spec.md b/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/specs/task-people-and-tags/spec.md new file mode 100644 index 00000000..bd10cf14 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/specs/task-people-and-tags/spec.md @@ -0,0 +1,60 @@ +# task-people-and-tags delta for tasks-assignment-priority-labels + +Extends the flat main spec `openspec/specs/tasks.md`. + +## ADDED Requirements + +### Requirement: A project member can assign a task to a member + +The system MUST let a project member set and change the one person responsible for a task +(`assignedTo`), choosing from the project's members only, on the task page and in the task +dialog. Tier: MVP (docs/FEATURES.md). + +#### Scenario: Assign a task on the task page + +- **GIVEN** project "Vergunningen" has members Anna and Bram, and Anna is on the task page of an unassigned task +- **WHEN** she picks Bram as the responsible person +- **THEN** the task stores Bram's uid in `assignedTo` +- **AND** the board card shows Bram's avatar and display name + +#### Scenario: Only members are offered + +- **GIVEN** Carla is not a member of project "Vergunningen" +- **WHEN** a member opens the people picker on one of its tasks +- **THEN** Carla is not in the list + +### Requirement: A task can be shared with more than one person + +The system MUST let a project member add other project members who work on a task alongside the +responsible person, stored separately from `assignedTo`. Tier: V1. + +#### Scenario: Two people on one task + +- **GIVEN** Bram is responsible for a task +- **WHEN** Anna adds herself under "Also working on this" +- **THEN** the task stores Anna in `sharedWith` and Bram stays in `assignedTo` +- **AND** the card shows both avatars, Bram first + +### Requirement: A project member can set a task's priority + +The system MUST let a project member set a task's priority to low, normal, high or urgent on the +task page and from the card's action menu on the board. Tier: MVP. + +#### Scenario: Raise a priority from the board + +- **GIVEN** a project member is on the board and a card shows priority normal +- **WHEN** they open the card's action menu and choose Priority, then Urgent +- **THEN** the card shows the urgent chip without a page change +- **AND** the stored task has priority `urgent` + +### Requirement: A project member can attach labels to a task + +The system MUST let a project member attach and remove app-wide labels on the task page, writing +the task's `labels`. Tier: MVP. + +#### Scenario: Attach a label + +- **GIVEN** an admin created the label "Juridisch" and a member is on a task page +- **WHEN** the member picks "Juridisch" in the labels control +- **THEN** the task's card on the board shows the "Juridisch" chip +- **AND** the board's label filter for "Juridisch" includes the task diff --git a/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/tasks.md b/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/tasks.md new file mode 100644 index 00000000..dcd1c610 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-tasks-assignment-priority-labels/tasks.md @@ -0,0 +1,24 @@ +# Tasks: tasks-assignment-priority-labels + +## 1. Schema + +- [x] 1.1 Add optional `sharedWith` (array of uids) to the task schema in `lib/Settings/planninq_register.json`, with a title and description in both languages. Verify: PHPUnit register descriptor test; `npm run check:schema-l10n` exits 0. Done: task schema 0.6.0 `sharedWith` (array of strings, default []), register 0.21.0, app 0.2.23-unstable.20260930030000; title and description in all 36 locales. Test: PlanninqRegisterSchemaTest::testTaskIsSharedWithAListOfPeople (real validator, control); check:schema-l10n 0. + +## 2. People + +- [x] 2.1 Add a people picker (project members, avatar and display name) for `assignedTo` and `sharedWith` on `src/views/TaskDetail.vue` and in `src/dialogs/TaskFormDialog.vue`. Verify: Playwright e2e assigns a member and sees the avatar on the card. Done: TaskDetail 'Responsible' and 'Also working on this' pickers (members and owner only, by display name), same pickers in TaskFormDialog when it gets the project. Tests: tests/vitest/taskPeople.spec.js memberOptions/responsiblePatch/sharedWithPatch, taskEditing.spec.js newLaneTask and editPatch with people (payload validated against the real schema); tests/e2e/task-people.spec.ts. +- [x] 2.2 Show avatars with display names on `src/components/TaskCard.vue` instead of the raw uid. Verify: vitest mount test. Done: TaskCard lists avatars and display names, responsible first (peopleOf). Test: taskPeople.spec.js peopleOf (node environment, no mount); e2e. +- [x] 2.3 Add `sharedWith` to the audience in `lib/Listener/TaskActivityListener.php`. Verify: PHPUnit test in `tests/Unit/Listener/`. Done. Test: tests/unit/Listener/TaskActivityListenerTest.php::testSharedWithIsInTheAudience (red first). + +## 3. Priority + +- [x] 3.1 Priority select on TaskDetail saving through `updateTask`, and a "Priority" submenu in the card action menu of `src/views/ProjectBoard.vue`. Verify: vitest mount test for the menu; Playwright e2e changes priority from the board. Done: TaskDetail priority select; board card menu gains a 'Priority' caption with the four levels (setPriority, optimistic, reverts on failure). Tests: taskPeople.spec.js priorityPatch and the board source check; e2e. + +## 4. Labels + +- [x] 4.1 Label multi-select on TaskDetail writing `task.labels`. Verify: Playwright e2e attaches a label and filters the board by it. Done: TaskDetail 'Labels' multi-select writing task.labels (labelsPatch). Tests: taskPeople.spec.js labelsPatch; e2e attaches a label and filters the board by it. + +## 5. Copy and verification + +- [x] 5.1 New strings in `l10n/en.json` and `l10n/nl.json`. Verify: `npm run check:l10n` exits 0. Done in all 36 locales. `npm run check:l10n` 0. +- [x] 5.2 `openspec validate tasks-assignment-priority-labels --type change --strict` passes. Done. diff --git a/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/design.md b/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/design.md new file mode 100644 index 00000000..f9e1ab54 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/design.md @@ -0,0 +1,118 @@ +# Design: create, edit and delete a task from the board and the task page + +## Context + +Read at development `de35541`: + +- Task schema: `lib/Settings/planninq_register.json`, schema `task`, required `title` and + `status`; `status` enum open, in_progress, blocked, done, cancelled; `priority` enum low, + normal, high, urgent; `description` is a string; `reporter` holds the creator's uid and is + never set by the app; `column` and `columnOrder` exist and are unused by the board. +- Task authorization in the same file: read, create, update and delete are granted to any + authenticated member of the task's project (a `$lookup` on `project.members`) and to admins. + Since planninq#681 that rule is a denormalised `members` list on the task, matched with + `{"members": {"$contains": "$userId"}}`, and a create is checked against the project by `ProjectMemberAccessListener`. +- Store: `src/store/projects.js` has `fetchTask` (`:285`), `fetchTasks` (`:775`), + `updateTaskStatus` (`:835`) and `updateTask` (`:871`). Both updates PATCH + `/apps/openregister/api/objects/planninq/task/{id}` because a PUT nulls every missing + property. There is no create or single delete action. `deleteProject` deletes tasks and their + time entries one by one (`:537-561`). +- Board: `src/views/ProjectBoard.vue:104-175` renders one `
` per status lane from + `BOARD_STATUSES` (`src/utils/taskHelpers.js:252`); a card opens TaskDetail + (`navigateToTask`, `:527`). There is no add control. +- Task page: `src/views/TaskDetail.vue:262-270` builds read-only label and value pairs; only the + estimate is editable (`saveEstimate`, `:557`). The page title is `taskTitle`. +- Card: `src/components/TaskCard.vue:9` interpolates the description as text. +- Dialog pattern: `src/dialogs/ProjectCreationDialog.vue` (NcDialog, NcTextField, NcTextArea). +- Dependency edges of a deleted task are removed by `lib/Listener/TaskDependencyCleanupListener.php` + on `ObjectDeletingEvent`. +- Time entries (`plannedTimeEntry`) can only be updated or deleted by the user who logged them + (schema authorization), and the hours are moving to humaniq's `TimeEntry` + (open change `plannedtimeentry-reads-humaniqs-hours`). + +## Goals / non-goals + +Goals: a member can create, edit and delete a task without leaving planninq; the description +supports Markdown. + +Non-goals: dates, people, labels, subtasks (sibling changes in this pass); a WYSIWYG editor. + +## Decisions + +### Decision 1: write through the object store, no planninq controller + +`createTask(projectId, data)` calls the shared object store's `saveObject('task', ...)` with +`project`, `status` (default `open`), `priority` (default `normal`) and `reporter` (the current +uid). OpenRegister enforces the schema's create rule, so a non-member is refused without any +planninq PHP. Alternative: a `TaskController::create`. Rejected by ADR-022: it would be a +pass-through. + +### Decision 2: one dialog for create and edit + +`src/dialogs/TaskFormDialog.vue` takes an optional `task` prop. Without it the dialog creates; +with it the dialog PATCHes only the changed fields through `updateTask`. The board's "New task" +header button and TaskDetail's "Edit" button both open it. The dialog is its own file (ADR-004 +modal isolation). + +### Decision 3: quick add sets the lane's status until columns exist + +Each lane gets a text field at its foot ("Add a task"). Enter creates a task with that title and +the lane's status and keeps focus in the field for the next one. When +`boards-configurable-columns` lands, the same control also writes the lane's `column` and a +`columnOrder` after the last card. + +### Decision 4: delete refuses a task with logged time + +`TaskDeleteDialog.vue` reads the task's `plannedTimeEntry` count first. With no time logged it +deletes through the object store and removes the card. With time logged it says so and offers +"Cancel task" (status `cancelled`) instead. Alternative: cascade the time entries like +`deleteProject`. Rejected: a member may not delete someone else's entry, and the hours are +another person's record. + +The delete action shows for the reporter, the project owner and admins. The schema's delete rule +is narrowed to match (`reporter` equals `$userId`, or the project's `owner`, or admin), so the +button and the server agree. Tasks imported without a reporter can be deleted by the project +owner and admins only. + +### Decision 5: Markdown with NcRichText + +The description stays a string, now treated as Markdown. TaskDetail renders it with +`NcRichText` (`use-markdown`), which escapes raw HTML. The card shows the first 140 characters +with Markdown syntax stripped. The dialog edits the source in `NcTextArea` with a preview +toggle. Alternative: the Nextcloud Text editor. Rejected for now: it is an optional app and +far heavier than a description needs. + +## Amendments at build time (29 Sep 2026, development 395ae3c) + +The design was read at `de35541`; four things had changed by the time it was built. + +- **The board is column based** (`boards-configurable-columns`). Quick add writes the lane's + `column`, a `columnOrder` after the last card and the lane's mapped status + (`buildMovePatch`). "New task" in the header puts the task at the bottom of the first lane, + so the create dialog has no status field; the edit dialog has one. +- **`createTask` already existed** (`backlog-list`). It now applies the defaults (`status: open`, + `priority: normal`) itself; the callers keep their payloads. +- **Decision 4, the delete rule, is a listener, not a schema rule.** OpenRegister matches a rule + against the object's own fields, and the project owner lives on the project, so "reporter or + project owner" cannot be written in the task schema. The schema keeps members plus admin; + `lib/Listener/TaskReporterGuardListener.php` holds the narrower rule on `ObjectDeletingEvent` + (answer 403, code `planninq-task-delete-not-allowed`) and refuses a task with time entries + (409, `planninq-task-has-logged-time`), as `ColumnOwnerGuardListener` does for columns. It is + subscribed before `TaskDependencyCleanupListener`, so a refused delete keeps its links. +- **`reporter` is stamped by the server.** The same listener sets it to the caller on create and + keeps the stored value on every update, so a member cannot make themselves the reporter of + someone else's task (and so its deleter), and a PUT that nulls the unsent field keeps it. +- **Vitest runs in the node environment** with no component mounting, so the dialog tests of + tasks 2.1, 2.2 and 4.2 are tests of the pure helpers in `src/utils/taskEditing.js` + (`editPatch`, `deleteRefusal`, `descriptionExcerpt`) plus a source check that TaskDetail + renders the description through `NcRichText` with Markdown on and has no `v-html`. The browser + behaviour is in `tests/e2e/task-editing.spec.ts`. + +## Risks / trade-offs + +- [Quick add creates tasks with only a title] -> that is the point; the card opens TaskDetail for + the rest. +- [Narrowing the delete rule changes behaviour for API clients] -> it only removes the right of + a plain member to delete a task someone else reported; noted in the release notes. +- [Existing descriptions contain characters Markdown interprets] -> plain text renders the same + in Markdown except for leading `#`, `*` and `-`; acceptable, and the edit dialog shows a preview. diff --git a/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/proposal.md b/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/proposal.md new file mode 100644 index 00000000..6a4e0053 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/proposal.md @@ -0,0 +1,127 @@ +--- +kind: code +--- + +# Create, edit and delete a task from the board and the task page + +## Why + +Nobody can create a task in planninq today. The store has `fetchTask`, `fetchTasks`, +`updateTaskStatus` and `updateTask` (`src/store/projects.js:285`, `:775`, `:835`, `:871`) and +no create action, and no dialog in `src/dialogs/` creates or edits a task. A board only fills +up through an import or a direct call to the OpenRegister objects API. The board has no add +control in a column (`src/views/ProjectBoard.vue:103-175`), the task page shows title and +description read-only (`src/views/TaskDetail.vue:262-270`), and a single task can only be +deleted as a side effect of deleting its whole project (`src/store/projects.js:554-561`). + +The description is plain text everywhere it shows (`src/components/TaskCard.vue:9`, +`src/views/TaskDetail.vue:48`). Every competitor in the comparison except Deck lets a team +write it with headings, lists and links. + +This is the first thing a buyer tries, and it is the core of the product's own main spec +(`openspec/specs/tasks.md`, "Task CRUD"), which has no change directory. Most other changes +in this pass depend on it: dates, assignment, labels, subtasks, the backlog and quick add all +need a task to exist first. + +Parity rows: `tsk-create-edit`, `brd-quick-add`, `tsk-rich-text` in planninq's +`openspec/parity/capabilities.json`. +Decision: build. `tsk-create-edit` is rated partial with five competitors rated yes on the +missing half; `brd-quick-add` sits in the boards core area with four competitors yes; +`tsk-rich-text` has five competitors yes. + +## What changes + +- A project member adds a task straight into a board column with a one-line quick add. +- A project member creates a task with a title, a Markdown description, a status and a + priority from a "New task" dialog. +- A project member edits the title, the description and the status on the task page. +- The task's reporter, the project owner or an admin deletes a single task after a + confirmation. A task with logged time is not deleted; the dialog offers to cancel it instead. +- The description renders as formatted Markdown on the task page and as a short plain-text + excerpt on the card. + +## Evidence from the parity matrix + +Matrix: `openspec/parity/capabilities.json` in ConductionNL/planninq (compared on 2026-09-26). Rows in this change: `tsk-create-edit`, `brd-quick-add`, `tsk-rich-text`. + +### `tsk-create-edit`: Create, edit and delete a task with a title, description and status. + +- Area `tasks`. Planninq is rated `partial`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "No task create or edit form exists anywhere in src/ (dialogs/ holds only LabelEditDialog, LabelDeleteDialog, ProjectCreationDialog, ProjectDeleteDialog, ProjectLeaveDialog, TimeEntryDialog; registry.js has no task dialog/component). Status changes via drag/keyboard move only: src/views/ProjectBoard.vue:562-593 (applyStatusMove) and :152-165 (move menu). Estimate is the only editable field: src/views/TaskDetail.vue:557-570 (saveEstimate). Delete only happens as a project-delete cascade: ... (shortened; full text in the matrix row)" +- Note: "creating a task, editing its title/description, and deleting a single task have no UI path at all; only the status (drag/move) and the time estimate are editable, so only part of the sentence is true." +- Demand: none recorded on the row. +- Competitors rated yes (5): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/journeys.md 2 'A card becomes a case' ; menu-tree.md card action menu 'Delete' ; done or open is the status (code-census.md Card done, archived) ; source read at v1.19.0: src/components/board/Stack.vue:74 'Add card' and :135 'Card name'; src/components/card/CardSidebar.vue:231-238 title edit; src/components/card/Description.vue description; src/components/cards/CardMenuEntries.vue:49 'Mark as done', :78 'Delete card'; lib/Controller/CardController.php:49 create, :67 update, :83 delete, :106 done" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "corpus: openproject/round4/journeys.md 'Creating a work package, giving it a start date and a duration ... is the best-supported path'; corpus: openproject/round4/M1-column.md 1.2 work package create form; 2.17 delete service ; source read at v17.8.0: frontend/src/app/features/work-packages/components/wp-new/wp-new-full-view.component.ts:35 create view; config/initializers/permissions.rb:324 add_work_packages, :333 edit_work_packages, :436 delete_work_packages; app/services/work_packages/create_service.rb, update_service.rb and delete_service.rb do the writes; app/models/work_package.rb:59 status" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/journeys.md 'create a work item, give it a state, a priority, assignees, labels, a start date and a target date' ; code-census.md §2 Issue fields ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/title-input.tsx:53 title, apps/web/core/components/issues/issue-modal/form.tsx:238 description_html, apps/web/core/components/issues/issue-modal/components/default-properties.tsx:90 state_id; apps/api/plane/app/views/issue/base.py:405 create, :628 partial_update, :717 destroy; apps/api/plane/db/models/issue.py:136 name" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/menu-tree.md task 'Edit the task ... Open this task / Close this task · Remove' ; journeys.md 1 createTask ; source read at v1.2.54: app/Template/task/sidebar.php:36 'Edit the task', :92 'Close this task', :96 'Open this task', :102 'Remove'; app/Controller/TaskCreationController.php:51 save; app/Controller/TaskModificationController.php:83 edit; app/Controller/TaskSuppressionController.php:35 remove" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/creating-issues-and-sub-tasks-939938925.html, https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html): "corpus: jira-data-center/round4/M1-column.md 1.2 'Select Create at the top of the screen to open the Create issue dialog box'; 2.17 'Delete issues Permission'; statuses 2.7 ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/creating-issues-and-sub-tasks-939938925.html 'Select Create at the top of the screen to open the Create issue dialog box'; https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html lists Edit and Delete issues permissions (read 2026-09-26)" + +### `brd-quick-add`: Add a card straight into a column from the board. + +- Area `boards`. Planninq is rated `no`, built.state `none`, owner `ConductionNL/planninq`. +- Built evidence: "no add-card/add-task control exists on src/views/ProjectBoard.vue. Wider check: there is no task-creation code path anywhere in the app, no createTask action in src/store/projects.js (only fetchTasks/updateTaskStatus/updateTask), no POST to the task schema anywhere in src/, and src/views/ProjectBacklog.vue:24-30 is an explicit placeholder pending future task CRUD." +- Defect: "no task-creation UI or store action anywhere in src/ (checked src/store/projects.js, src/views/ProjectBoard.vue, src/views/ProjectBacklog.vue)" +- Note: "this is broader than the board: the whole app currently has no way to create a task at all, so tasks on the board can only exist via import/migration or direct OpenRegister API use." +- Demand: none recorded on the row. +- Competitors rated yes (4): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/menu-tree.md 'each with Add card' ; source read at v1.19.0: src/components/board/Stack.vue:74 'Add card' in each list, :128-135 inline 'Card name' input; src/components/KeyboardShortcuts.vue:106-107 'KeyN' new card; appinfo/routes.php:47 card#create" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/agile-boards/README.md:139 'Click + under the lists title to add a card: create a new card or choose an existing work package' (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/features/boards/board/add-card-dropdown/add-card-dropdown-menu.directive.ts:61 'Add new card' and :69 'Add existing'; config/locales/js-en.yml:189 'Add new card'; frontend/src/app/features/boards/board/board-list/board-inline-create.service.ts creates the card inside the list's query" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "source: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:47,333 QuickAddIssueRoot per column ; corpus: plane/round4/menu-tree.md 'New work item' global create ; source read at v1.4.2: apps/web/core/components/issues/issue-layouts/kanban/kanban-group.tsx:47,333 QuickAddIssueRoot at the foot of each column; apps/api/plane/app/views/issue/base.py:405 create" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "corpus: kanboard/round4/menu-tree.md 'Add a new task' ; source: app/Template/board/table_column.php add task per column ; source read at v1.2.54: app/Template/board/table_column.php:19 per column add button; app/Helper/TaskHelper.php:325-334 getNewBoardTaskButton 'Add a new task' opening TaskCreationController in that column; app/Template/board/table_column.php:35 'Create tasks in bulk'; app/Controller/TaskCreationController.php:51 save" + +### `tsk-rich-text`: Write a task description in rich text or Markdown with headings, lists and links. + +- Area `tasks`. Planninq is rated `no`, built.state `built`, owner `ConductionNL/planninq`. +- Built evidence: "task.description is rendered as plain text interpolation everywhere it appears: src/components/TaskCard.vue:9 ({{ task.description }}) and src/views/TaskDetail.vue:48/269 ({{ field.value }}). No markdown/rich-text renderer or editor is used, and (per tsk-create-edit) there is no description edit form at all." +- Demand: none recorded on the row. +- Competitors rated yes (5): + - Nextcloud Deck 1.18 (no URL in the cell; source or corpus citation only): "corpus: nextcloud-deck/round4/usability.md 'cards with a title, a markdown description' ; menu-tree.md 'the markdown description with checkboxes' ; source read at v1.19.0: src/components/card/Description.vue:47-53 VueEasymde markdown editor, :69-87 markdown-it renders headings, lists, task checkboxes and links, :120 uses the Text app editor when installed, :45 'Write a description …'; lib/Db/Card.php:74 description" + - OpenProject 16 Community (no URL in the cell; source or corpus citation only): "docs: opf/openproject HEAD 27a58131 docs/user-guide/wysiwyg/README.md:27 'The CKEditor5 build in OpenProject supports basic text styles, such as bold and italic formatting, headings' and :63 Markdown '#, ##, ###' (GFM tables :50) (cited source paths checked present at the released v17.8.0 tag.) ; source read at v17.8.0: frontend/src/app/shared/components/editor/components/ckeditor/op-ckeditor.component.ts the CKEditor 5 field on descriptions and comments; lib/open_project/text_formatting/filters/markdown_filter.rb:68 GFM with table, autolink and tasklist, so text is stored as Markdown" + - Plane Community 1.4 (no URL in the cell; source or corpus citation only): "corpus: plane/round4/code-census.md §2 description_json / description_html; usability.md driven editor ; source: packages/editor rich text editor with markdown copy (i18n 'Copy markdown') ; source read at v1.4.2: apps/web/core/components/issues/issue-modal/components/description-editor.tsx:23,184 RichTextEditor for the description; packages/editor/src/core/extensions/extensions.ts:65 CoreEditorExtensions with lists and task lists; apps/api/plane/db/models/issue.py:137-138 description_json and description_html" + - Kanboard 1.2 (no URL in the cell; source or corpus citation only): "source: app/Helper/TextHelper.php:5,43 Markdown transformation of descriptions and comments ; corpus: kanboard/round4/M1-column.md 6.1 'comments in markdown' ; source read at v1.2.54: app/Helper/TaskHelper.php:63 description uses the textEditor; app/Helper/FormHelper.php:228 textEditor, assets/js/components/text-editor.js:79 editor with preview; app/Helper/TextHelper.php:43-49 Markdown rendering" + - Jira Software Data Center 11 (https://confluence.atlassian.com/jirasoftwareserver/visual-editing-939938940.html): "docs: https://confluence.atlassian.com/jirasoftwareserver/visual-editing-939938940.html Visual mode 'gives you a What You See Is What You Get (WYSIWYG) experience' and 'you can still enter wiki markup syntax' ; docs read 2026-09-26: https://confluence.atlassian.com/jirasoftwareserver/visual-editing-939938940.html 'Formatting content in Visual mode gives you a What You See Is What You Get (WYSIWYG) experience' (read 2026-09-26)" + +## Scope + +### In scope + +- `createTask` and `deleteTask` actions in the projects store, writing to OpenRegister. +- `src/dialogs/TaskFormDialog.vue` for create and edit, `src/dialogs/TaskDeleteDialog.vue` + for the confirmation. +- Quick add at the bottom of each board column. +- Markdown rendering of the description on TaskDetail and a plain-text excerpt on TaskCard. +- Narrowing the task schema's delete rule to reporter, project owner and admin. + +### Out of scope + +- Due and start dates, assignee, priority editing beyond the create dialog's default, labels: + `tasks-dates` and `tasks-assignment-priority-labels`. +- Subtasks and the delete guard for a parent task: `tasks-subtasks-checklist`. +- Creating a task in the backlog page: `backlog-list` reuses this dialog. +- Column-driven lanes: `boards-configurable-columns`. Until that lands, quick add sets the + lane's status. + +## Impact + +- `src/store/projects.js` (new actions), `src/views/ProjectBoard.vue`, `src/views/TaskDetail.vue`, + `src/components/TaskCard.vue`, two new dialogs, `lib/Settings/planninq_register.json` + (task delete rule, `reporter` set on create), `l10n/`. +- Depends on: nothing in this pass. Many other changes depend on this one. + +## Risks + +### Risk 1: A PUT on update wipes required fields +**Severity**: High +**Mitigation**: edits go through the existing PATCH path (`updateTask`, `src/store/projects.js:871`), +never `saveObject` with a partial body. A unit test asserts the request method. + +### Risk 2: Deleting a task erases hours that belong to someone else +**Severity**: Medium +**Mitigation**: a task with logged time cannot be deleted; the dialog offers "Cancel task" +instead. Hours stay with the person who logged them, which also keeps this change compatible +with the move of hours to humaniq (`plannedtimeentry-reads-humaniqs-hours`). + +### Risk 3: Markdown opens a script injection path +**Severity**: Medium +**Mitigation**: render with `NcRichText` and `use-markdown`, which escapes raw HTML. No `v-html`. diff --git a/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/specs/task-editing/spec.md b/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/specs/task-editing/spec.md new file mode 100644 index 00000000..eb44d3c4 --- /dev/null +++ b/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/specs/task-editing/spec.md @@ -0,0 +1,96 @@ +# task-editing delta for tasks-create-edit-delete + +Extends the flat main spec `openspec/specs/tasks.md` (Task CRUD). + +## ADDED Requirements + +### Requirement: A project member can create a task + +The system MUST let a member of a project create a task in that project with a title, and MAY +take a Markdown description, a status and a priority. A new task MUST default to status `open` +and priority `normal`, and MUST record the creator as `reporter`. Tier: MVP (docs/FEATURES.md). + +#### Scenario: Create a task from the board header + +- **GIVEN** a project member has the board of project "Vergunningen" open at /projects/:id +- **WHEN** they choose "New task", enter the title "Draft the permit letter" and save +- **THEN** the task is stored with status `open`, priority `normal` and the member as reporter +- **AND** its card appears at the bottom of the board's first lane without a page reload + +#### Scenario: A non-member cannot create a task + +- **GIVEN** a user who is not a member of project "Vergunningen" +- **WHEN** they POST a task for that project to the OpenRegister objects API +- **THEN** the request is refused with 403 and no task is stored + +@e2e exclude needs a second, non-member account the CI e2e run does not have; covered by tests/unit/Listener/ProjectMemberAccessListenerTest.php::testCreateByNonMemberIsRefused on the real listener + +### Requirement: A project member can quick-add a task in a board lane + +The system MUST offer a one-line add field at the foot of every board lane. Pressing Enter MUST +create a task with that title in that lane and MUST keep focus in the field. Tier: MVP. + +#### Scenario: Quick add two tasks in a row + +- **GIVEN** a project member is on the board with the In progress lane visible +- **WHEN** they type "Call the applicant" in that lane's add field, press Enter, type "Check the drawings" and press Enter +- **THEN** both cards appear in the In progress lane in that order +- **AND** the add field is empty and still focused + +### Requirement: A project member can edit a task's title, description and status + +The system MUST let a project member change a task's title, description and status from the +task page, and MUST send only the changed fields. Tier: MVP. + +#### Scenario: Rename a task + +- **GIVEN** a project member is on the task page of "Draft the permit letter" +- **WHEN** they choose "Edit", change the title to "Draft and send the permit letter" and save +- **THEN** the task page shows the new title +- **AND** the stored task keeps its project, priority and other fields unchanged + +### Requirement: The task description supports Markdown + +The system MUST render a task description as Markdown on the task page, with headings, lists +and links, and MUST NOT execute HTML or script from it. The board card MUST show a short +plain-text excerpt. Tier: V1. + +#### Scenario: A checklist-style description renders as a list + +- **GIVEN** a task whose description is "## Steps" followed by two lines starting with "- " +- **WHEN** a project member opens the task page +- **THEN** they see a heading "Steps" and a two-item bulleted list + +#### Scenario: Script in a description stays text + +- **GIVEN** a task whose description contains `` +- **WHEN** a project member opens the task page +- **THEN** the text is shown literally and no script runs + +### Requirement: The reporter, the project owner or an admin can delete a task + +The system MUST let the task's reporter, the project's owner or an admin delete a single task +after a confirmation, and MUST refuse other members. A task with logged time MUST NOT be +deleted; the confirmation MUST offer to cancel it instead. Tier: MVP. + +#### Scenario: Delete a task without logged time + +- **GIVEN** the reporter of a task with no logged time is on its task page +- **WHEN** they choose "Delete task" and confirm +- **THEN** the task is deleted, its dependency links are removed, and they return to the board without the card + +#### Scenario: A task with logged time is cancelled instead + +- **GIVEN** the project owner is on the task page of a task with two hours logged +- **WHEN** they choose "Delete task" +- **THEN** the dialog says the task has logged time and offers "Cancel task" +- **AND** choosing it sets the status to `cancelled` and keeps the time entries + +#### Scenario: A plain member cannot delete someone else's task + +- **GIVEN** a project member who is neither the reporter nor the owner +- **WHEN** they open the task page +- **THEN** no "Delete task" action is shown +- **AND** a DELETE on the OpenRegister objects API for that task answers 403 + +@e2e exclude needs a second member account the CI e2e run does not have; covered by tests/unit/Listener/TaskReporterGuardListenerTest.php::testAPlainMemberCannotDeleteSomeoneElsesTask (code and status 403) and tests/vitest/taskEditing.spec.js canDeleteTask diff --git a/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/tasks.md b/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/tasks.md new file mode 100644 index 00000000..737b0a0b --- /dev/null +++ b/openspec/changes/archive/2026-09-29-tasks-create-edit-delete/tasks.md @@ -0,0 +1,30 @@ +# Tasks: tasks-create-edit-delete + +## 1. Store + +- [x] 1.1 Add `createTask(projectId, data)` to `src/store/projects.js`: saves a task with defaults `status: open`, `priority: normal` and `reporter` set to the current uid, and returns it. Verify: a vitest spec in `tests/vitest/` asserts the payload and the defaults against a mocked object store. Done: `createTask` applies `withTaskDefaults`; reporter is stamped server-side by `TaskReporterGuardListener` (tests/unit/Listener/TaskReporterGuardListenerTest.php::testACreatedTaskRecordsTheCreatorAsReporter). Test: tests/vitest/taskEditing.spec.js withTaskDefaults, validated against the real task schema. +- [x] 1.2 Add `deleteTask(taskId)` that refuses when the task has time entries and otherwise deletes through the object store. Verify: vitest spec for both branches. Done: `deleteTask` counts `plannedTimeEntry` rows, then DELETEs and maps the server's code with `deleteRefusal`. Tests: taskEditing.spec.js deleteRefusal; TaskReporterGuardListenerTest::testATaskWithLoggedTimeIsNotDeleted. + +## 2. Dialogs + +- [x] 2.1 Create `src/dialogs/TaskFormDialog.vue` (title required, Markdown description with preview, status, priority) for create and edit; edit sends only changed fields through `updateTask`. Verify: vitest mount test that edit issues a PATCH with only the changed field. Done: src/dialogs/TaskFormDialog.vue. Test: taskEditing.spec.js editPatch (node environment, no mount; see design amendments). +- [x] 2.2 Create `src/dialogs/TaskDeleteDialog.vue` with the logged-time branch offering "Cancel task". Verify: vitest mount test for both branches. Done: src/dialogs/TaskDeleteDialog.vue. Tests: deleteRefusal and the e2e delete test. + +## 3. Board + +- [x] 3.1 Add a "New task" button to the board header and a quick-add field at the foot of each lane in `src/views/ProjectBoard.vue`; Enter creates the task in that lane and keeps focus. Verify: Playwright e2e in `tests/e2e/kanban-board.spec.ts` creates a task through quick add and sees the card. Done: header button and per-lane quick add (writes column, columnOrder and the lane status). Tests: taskEditing.spec.js newLaneTask; tests/e2e/task-editing.spec.ts. +- [x] 3.2 Show a plain-text excerpt of the description on `src/components/TaskCard.vue`. Verify: vitest spec for the excerpt helper (strips Markdown, 140 characters). Done: TaskCard shows `descriptionExcerpt`. Test: taskEditing.spec.js descriptionExcerpt. + +## 4. Task page + +- [x] 4.1 Add "Edit" and "Delete task" actions to `src/views/TaskDetail.vue`; show "Delete task" only to the reporter, the project owner and admins. Verify: Playwright e2e edits a title and deletes a task without time. Done: TaskDetail Edit and Delete task (`canDeleteTask`). Tests: taskEditing.spec.js canDeleteTask; tests/e2e/task-editing.spec.ts. +- [x] 4.2 Render the description with `NcRichText` and `use-markdown`. Verify: vitest mount test that `` +- **WHEN** a project member opens the task page +- **THEN** the text is shown literally and no script runs + +### Requirement: The reporter, the project owner or an admin can delete a task + +The system MUST let the task's reporter, the project's owner or an admin delete a single task +after a confirmation, and MUST refuse other members. A task with logged time MUST NOT be +deleted; the confirmation MUST offer to cancel it instead. Tier: MVP. + +#### Scenario: Delete a task without logged time + +- **GIVEN** the reporter of a task with no logged time is on its task page +- **WHEN** they choose "Delete task" and confirm +- **THEN** the task is deleted, its dependency links are removed, and they return to the board without the card + +#### Scenario: A task with logged time is cancelled instead + +- **GIVEN** the project owner is on the task page of a task with two hours logged +- **WHEN** they choose "Delete task" +- **THEN** the dialog says the task has logged time and offers "Cancel task" +- **AND** choosing it sets the status to `cancelled` and keeps the time entries + +#### Scenario: A plain member cannot delete someone else's task + +- **GIVEN** a project member who is neither the reporter nor the owner +- **WHEN** they open the task page +- **THEN** no "Delete task" action is shown +- **AND** a DELETE on the OpenRegister objects API for that task answers 403 + +@e2e exclude needs a second member account the CI e2e run does not have; covered by tests/unit/Listener/TaskReporterGuardListenerTest.php::testAPlainMemberCannotDeleteSomeoneElsesTask (code and status 403) and tests/vitest/taskEditing.spec.js canDeleteTask diff --git a/openspec/specs/task-people-and-tags/spec.md b/openspec/specs/task-people-and-tags/spec.md new file mode 100644 index 00000000..710a1520 --- /dev/null +++ b/openspec/specs/task-people-and-tags/spec.md @@ -0,0 +1,61 @@ +# task-people-and-tags Specification + +## Purpose +Who is responsible for a task and who shares it, its priority, and its labels, set by project members from the task page, the task dialog and the board card. Built by tasks-assignment-priority-labels (archived 2026-09-29). + +## Requirements + +### Requirement: A project member can assign a task to a member + +The system MUST let a project member set and change the one person responsible for a task +(`assignedTo`), choosing from the project's members only, on the task page and in the task +dialog. Tier: MVP (docs/FEATURES.md). + +#### Scenario: Assign a task on the task page + +- **GIVEN** project "Vergunningen" has members Anna and Bram, and Anna is on the task page of an unassigned task +- **WHEN** she picks Bram as the responsible person +- **THEN** the task stores Bram's uid in `assignedTo` +- **AND** the board card shows Bram's avatar and display name + +#### Scenario: Only members are offered + +- **GIVEN** Carla is not a member of project "Vergunningen" +- **WHEN** a member opens the people picker on one of its tasks +- **THEN** Carla is not in the list + +### Requirement: A task can be shared with more than one person + +The system MUST let a project member add other project members who work on a task alongside the +responsible person, stored separately from `assignedTo`. Tier: V1. + +#### Scenario: Two people on one task + +- **GIVEN** Bram is responsible for a task +- **WHEN** Anna adds herself under "Also working on this" +- **THEN** the task stores Anna in `sharedWith` and Bram stays in `assignedTo` +- **AND** the card shows both avatars, Bram first + +### Requirement: A project member can set a task's priority + +The system MUST let a project member set a task's priority to low, normal, high or urgent on the +task page and from the card's action menu on the board. Tier: MVP. + +#### Scenario: Raise a priority from the board + +- **GIVEN** a project member is on the board and a card shows priority normal +- **WHEN** they open the card's action menu and choose Priority, then Urgent +- **THEN** the card shows the urgent chip without a page change +- **AND** the stored task has priority `urgent` + +### Requirement: A project member can attach labels to a task + +The system MUST let a project member attach and remove app-wide labels on the task page, writing +the task's `labels`. Tier: MVP. + +#### Scenario: Attach a label + +- **GIVEN** an admin created the label "Juridisch" and a member is on a task page +- **WHEN** the member picks "Juridisch" in the labels control +- **THEN** the task's card on the board shows the "Juridisch" chip +- **AND** the board's label filter for "Juridisch" includes the task diff --git a/openspec/specs/timetable-draft-review/spec.md b/openspec/specs/timetable-draft-review/spec.md new file mode 100644 index 00000000..229cb8cb --- /dev/null +++ b/openspec/specs/timetable-draft-review/spec.md @@ -0,0 +1,75 @@ +# timetable-draft-review Specification + +## Purpose +A school checks a new timetable with its teachers before learners see it. A lesson can be delivered as a draft that only the teacher it names and admins read, is returned only to a caller that asks for drafts, never replaces a published lesson, and becomes scheduled when an admin publishes the drafts of one source in a window. It builds on the school-timetable capability. + +## Requirements + +### Requirement: A draft lesson is readable only by the teacher it names and by admins + +The `timetableSession` schema MUST accept the status `draft` besides `scheduled` and `cancelled`. Its read authorization MUST let a signed-in user read a `draft` session only when the session's `teacherUserId` is that user, and MUST let admins read every session. A signed-in user who is not the named teacher or an admin MUST NOT receive a `draft` session from `GET /api/timetable/sessions` or the OpenRegister object API, including a member of the `planninq-timetable` group, who reads every published lesson. `TimetableSessionsQueryEvent` reads with RBAC off (planninq#711), so there a `draft` session is returned only when the consumer passes `includeDrafts`, and the consumer decides who sees it. + +#### Scenario: The named teacher sees their draft lesson + +- **GIVEN** a draft session "Wiskunde 3a" on Monday at 09:00 with `teacherUserId` "jan" +- **WHEN** Jan calls `GET /apps/planninq/api/timetable/sessions?teacherUserId=jan&includeDrafts=true` for that week +- **THEN** the response lists "Wiskunde 3a" with status `draft` + +#### Scenario: A learner does not see a draft lesson + +- **GIVEN** the same draft session for group `3a` +- **WHEN** a learner of group 3a calls `GET /apps/planninq/api/timetable/sessions?groupReference=3a&includeDrafts=true` for that week +- **THEN** the response does not list "Wiskunde 3a" + +#### Scenario: The timetable group does not see a draft lesson + +- **GIVEN** the same draft session +- **WHEN** a member of `planninq-timetable` calls `GET /apps/planninq/api/timetable/sessions?groupReference=3a&includeDrafts=true` for that week +- **THEN** the response does not list "Wiskunde 3a" + +### Requirement: Drafts are returned only when the caller asks for them + +The read criteria MUST accept `includeDrafts`, default false. When it is false or absent, no `draft` session MUST be returned, even to a caller allowed to read it. This MUST hold for the HTTP read and for `TimetableSessionsQueryEvent`, so a consumer built against contract version 1 keeps receiving published lessons only. + +#### Scenario: A consumer that does not ask gets the published timetable + +- **GIVEN** Jan's week holds one published and one draft lesson +- **WHEN** learniq dispatches `TimetableSessionsQueryEvent` with `teacherUserId: jan` and no `includeDrafts` +- **THEN** the event's sessions hold the published lesson only + +@e2e exclude an in-process PHP event that no browser or HTTP client can dispatch; covered by tests/unit/Listener/TimetableSessionsQueryListenerTest.php::testConsumerThatDoesNotAskGetsNoDrafts + +### Requirement: A later delivery never turns a published lesson into a draft + +The upsert MUST reject, without saving, a row with status `draft` whose stored session with the same `sourceSystem` and `externalRef` has status `scheduled` or `cancelled`, reporting `errorCode` `already-published`. A row with status `scheduled` for a stored `draft` session MUST update it in place. + +#### Scenario: A draft delivery for a published lesson is refused + +- **GIVEN** a published session `zm-1001` from `roster-zermelo` +- **WHEN** integriq delivers `zm-1001` from `roster-zermelo` with status `draft` +- **THEN** the upsert result lists `zm-1001` in `rejected` with `already-published` +- **AND** learners still see the published lesson + +#### Scenario: Delivering the lesson as scheduled publishes the draft + +- **GIVEN** a draft session `zm-2001` from `roster-zermelo` +- **WHEN** the same row arrives with status `scheduled` +- **THEN** the session is updated in place to `scheduled` +- **AND** the upsert result reports `updated: 1` + +### Requirement: An admin publishes the drafts of one source in a date window + +`POST /apps/planninq/api/timetable/sessions/publish` MUST take `sourceSystem`, `from` and `to`, MUST set every `draft` session of that source overlapping the window to `scheduled`, and MUST answer with `contractVersion`, `published` and `failed`. It MUST NOT carry `#[NoAdminRequired]`, and a non-admin MUST be refused. + +#### Scenario: Publishing a week makes the lessons visible + +- **GIVEN** five draft sessions from `roster-zermelo` in the week of 5 October 2026 +- **WHEN** an admin posts `{"sourceSystem": "roster-zermelo", "from": "2026-10-05T00:00:00+02:00", "to": "2026-10-11T23:59:59+02:00"}` to the publish endpoint +- **THEN** the response reports `published: 5` +- **AND** a `planninq-timetable` member's read for that week lists the five lessons (a learner reads their timetable through learniq, which asks the query event) + +#### Scenario: A teacher cannot publish + +- **GIVEN** a signed-in teacher who is not an admin +- **WHEN** they post to the publish endpoint +- **THEN** Nextcloud refuses the request and no session changes status diff --git a/openspec/specs/timetable-generator/spec.md b/openspec/specs/timetable-generator/spec.md new file mode 100644 index 00000000..1c592226 --- /dev/null +++ b/openspec/specs/timetable-generator/spec.md @@ -0,0 +1,69 @@ +# timetable-generator Specification + +## Purpose +Planninq generates a school timetable from the activities (learniq or uploaded sheets) and the wishes a timetabler sets, hard or soft. A generated scenario never breaks a hard wish. The current timetable can be taken into a scenario and scored the same way, two or three scenarios are compared side by side, and a chosen generated scenario is published as draft lessons through the existing draft review. Built by change archive/2026-09-30-timetabling-generator (DECISIONS rows 17 and 21: a PHP local search behind the `TimetableSolver` interface). + +## Requirements + +### Requirement: A timetabler marks each wish as hard or soft + +The system MUST let a timetabler record a wish on a teacher, a group, a room or one activity, and +MUST store for each wish whether it is hard (the generator must respect it) or soft (the generator +should respect it), with a weight of 1 to 3 for a soft wish. Only admins MAY write wishes; members of +`planninq-timetable` MAY read them. Tier: V1. + +#### Scenario: A timetabler marks a wish as hard + +- **GIVEN** the teacher `klaas` cannot teach on Wednesday afternoon +- **WHEN** the timetabler adds the wish "not on these periods" for `klaas` on Wednesday periods 5 to 8, strength hard +- **THEN** the wish is listed under `klaas` as hard +- **AND** a soft wish "preferably not on Friday period 8" for `klaas` is listed with its weight + +### Requirement: A generated timetable never breaks a hard wish + +The system MUST generate a scenario in which no teacher, group or room has two lessons in the same +period and no hard wish is broken. A lesson that cannot be placed without breaking a hard wish MUST +be listed as unplaced with the hard wish that blocked it. The system SHOULD keep soft wishes and MUST +report every soft wish it broke with its weight. Tier: V1. + +#### Scenario: Generate a scenario that respects a hard wish + +- **GIVEN** activities for group 3A and the hard wish that `klaas` does not teach on Wednesday periods 5 to 8 +- **WHEN** the timetabler generates a scenario +- **THEN** the scenario has no lesson of `klaas` on Wednesday periods 5 to 8 +- **AND** it reports 0 broken hard wishes + +#### Scenario: A lesson that cannot be placed is listed with its reason + +- **GIVEN** a teacher whose hard wishes leave fewer free periods than their lessons +- **WHEN** the timetabler generates a scenario +- **THEN** the lessons that do not fit are listed as unplaced +- **AND** each names the hard wish that blocked it + +### Requirement: A timetabler compares scenarios before publishing one + +The system MUST keep several scenarios per week pattern, generated or made from the current +timetable, and MUST show two or three of them side by side with the same measures: lessons placed and +unplaced, hard and soft wishes broken, teacher gaps, lessons per day and room use, marking the best +value per measure and listing the lessons that differ. Tier: V1. + +#### Scenario: Compare a generated and an imported scenario + +- **GIVEN** a scenario made from the current timetable and a generated scenario for the same week +- **WHEN** the timetabler opens the compare page with both +- **THEN** each measure shows both values with the better one marked +- **AND** the lessons whose period or room differ are listed + +### Requirement: Publishing a scenario uses the draft review + +The system MUST publish a chosen scenario by writing its lessons as draft `timetableSession` rows with +`sourceSystem` `planninq-generator` for every week of the scenario's window, so the existing draft +review and publish flow applies, and MUST refuse to replace lessons of that window that are already +published from that source. Tier: V1. + +#### Scenario: Publish a scenario as drafts + +- **GIVEN** a generated scenario for the weeks of 5 to 30 October +- **WHEN** the admin publishes it +- **THEN** its lessons exist as drafts for every week of that window +- **AND** a teacher sees their own draft lessons and nobody else does until the drafts are published diff --git a/openspec/specs/work-item-keys/spec.md b/openspec/specs/work-item-keys/spec.md new file mode 100644 index 00000000..6fc469b0 --- /dev/null +++ b/openspec/specs/work-item-keys/spec.md @@ -0,0 +1,64 @@ +# work-item-keys Specification + +## Purpose +A project has a short unique key, and every task in it gets a readable key made of that key and a number, such as VERG-42. Built by `tasks-readable-keys` (archived 2026-09-29). + +## Requirements + +### Requirement: A project has a short unique key chosen at creation + +The system MUST ask for a project key in the New project dialog, suggest one from the title, and +refuse a key that another project already uses. A key MUST be two to ten characters, letters A-Z +and digits, starting with a letter. Tier: MVP (docs/FEATURES.md). + +#### Scenario: Create a project with a key + +- **GIVEN** a user allowed to create projects opens "New project" on the Projects page +- **WHEN** they enter the title "Vergunningen Centrum", change the suggested key to "VERG" and create +- **THEN** the project stores `key` "VERG" + +#### Scenario: A used key is refused + +- **GIVEN** a project with key "VERG" exists that the user cannot see +- **WHEN** the user tries to create another project with key "VERG" +- **THEN** the dialog says "This key is already used by another project." and nothing is created +- **AND** the message does not name the other project + +### Requirement: Every new task gets a readable key + +The system MUST give every task created in a project with a key the next number in that project, +as `{projectKey}-{n}`, and MUST keep a key the task already carries. Two tasks in one project MUST +NOT get the same key. Tier: V1. + +#### Scenario: Numbered on create + +- **GIVEN** project "VERG" whose last task key is VERG-41 +- **WHEN** a member creates a task +- **THEN** the task's key is VERG-42 and its card shows "VERG-42" + +#### Scenario: Two members create at the same moment + +- **GIVEN** two members create a task in project "VERG" at the same time +- **WHEN** both creates finish +- **THEN** the two tasks carry different keys + +@e2e exclude two creates at the same instant cannot be timed from one browser; covered by tests/unit/Listener/WorkItemKeyListenerTest.php::testTwoCreatesOnOneCounterGetDifferentKeys (a held lock, then the next number) + +#### Scenario: An imported key is kept + +- **GIVEN** an import creates a task with key "PLX-7" in project "VERG" +- **WHEN** the create finishes +- **THEN** the task's key is still "PLX-7" + +### Requirement: Existing tasks are numbered when a project first gets a key + +The system MUST number the keyless tasks of a project, oldest first, once the project's owner +sets a key for the first time. Tier: V1. + +#### Scenario: Number an existing project + +- **GIVEN** a project without a key that holds three tasks +- **WHEN** its owner sets the key "HAND" in the settings sidebar +- **THEN** the three tasks get HAND-1, HAND-2 and HAND-3 in creation order + +@e2e exclude the numbering runs in a queued background job that CI e2e does not drive; covered by tests/unit/Listener/WorkItemKeyListenerTest.php::testTheFirstKeyQueuesTheNumberingOfExistingTasks and ::testTheJobNumbersTheKeylessTasksInOrder diff --git a/openspec/specs/working-calendar/spec.md b/openspec/specs/working-calendar/spec.md new file mode 100644 index 00000000..cf35efe0 --- /dev/null +++ b/openspec/specs/working-calendar/spec.md @@ -0,0 +1,47 @@ +# working-calendar Specification + +## Purpose +The app-wide working calendar: the working weekdays and the non-working days an admin keeps, which every date the timeline computes and shades follows. + +## Requirements + +### Requirement: An admin maintains the working week and non-working days + +The admin settings MUST let an admin choose the working weekdays (default Monday to Friday) and keep a list of non-working days, each a date with a name. The system SHALL reject a malformed value without storing it, and SHALL return both settings to every signed-in user through GET /apps/planninq/api/settings. Tier: V1. + +#### Scenario: An admin adds a holiday + +- **GIVEN** an admin on the planninq admin settings page, section "Working days and holidays" +- **WHEN** they add 25 December 2026 named "Christmas Day" and save +- **THEN** `non_working_days` holds that entry +- **AND** a project member's GET /apps/planninq/api/settings returns it + +#### Scenario: An admin fills in the Dutch holidays for a year + +- **GIVEN** an admin in the same section +- **WHEN** they choose "Add Dutch national holidays" for 2027 +- **THEN** the list gains the Dutch national holidays of 2027, including Easter Monday 29 March and King's Day 27 April +- **AND** each added entry can be removed again before saving + +#### Scenario: A malformed value is refused + +- **GIVEN** an admin client +- **WHEN** it posts `non_working_days` with a value that is not a list of dated entries +- **THEN** the stored value is unchanged and the rejection is logged + +### Requirement: Dates set on the timeline land on working days + +When a member moves or edits a task on the timeline, the system MUST move a start date that falls on a non-working day to the next working day, and MUST count a task's length in working days, using the admin's working weekdays and non-working days. The timeline SHALL shade every non-working day and SHALL give a listed holiday its name as the day's accessible label. Tier: V1. + +#### Scenario: A dropped start on a holiday moves to the next working day + +- **GIVEN** a project member on the timeline, 28 December 2026 listed as a non-working day, and a two-working-day task +- **WHEN** they drop the task so it starts on 28 December 2026 +- **THEN** the task starts on Tuesday 29 December and is due on Wednesday 30 December 2026 + +#### Scenario: A holiday is shaded and named on the timeline + +- **GIVEN** 25 December 2026 listed as "Christmas Day" +- **WHEN** a project member opens a timeline that spans that date +- **THEN** the day is shaded like a weekend +- **AND** its tick has the accessible label "Christmas Day" diff --git a/package-lock.json b/package-lock.json index de4478d9..db4c2c0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,25 +9,25 @@ "version": "0.1.0", "license": "EUPL-1.2", "dependencies": { - "@conduction/nextcloud-vue": "^2.25.1", + "@conduction/nextcloud-vue": "^2.57.1", "@nextcloud/auth": "^2.5.0", - "@nextcloud/axios": "~2.5.2", + "@nextcloud/axios": "~2.6.0", "@nextcloud/capabilities": "^1.2.1", "@nextcloud/dialogs": "^7.5.0", "@nextcloud/initial-state": "^3.0.0", "@nextcloud/l10n": "3.4.1", - "@nextcloud/router": "^3.1.0", + "@nextcloud/router": "^3.2.0", "@nextcloud/vue": "^9.9.0", "@vueuse/core": "^14.3.0", "axe-core": "^4.10.0", - "dexie": "^4.4.5", + "dexie": "^4.4.6", "dompurify": "^3.4.12", "gridstack": "^13.2.0", "marked": "^18.0.11", "path-browserify": "^1.0.1", "pinia": "^3.0.3", "terser-webpack-plugin": "^5.6.1", - "vue": "^3.5.18", + "vue": "^3.5.43", "vue-material-design-icons": "^5.3.0", "vue-router": "^4.6.4" }, @@ -35,29 +35,25 @@ "@babel/core": "^7.29.7", "@babel/preset-env": "^7.29.5", "@cyclonedx/cyclonedx-npm": "^6.0.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/eslintrc": "^3.3.1", + "@eslint/config-helpers": "^0.7.0", "@eslint/js": "^9.39.1", "@nextcloud/browserslist-config": "^3.0.1", - "@nextcloud/eslint-config": "^8.4.1", + "@nextcloud/eslint-config": "^9.0.1", "@nextcloud/stylelint-config": "^3.2.2", "@nextcloud/webpack-vue-config": "^7.0.2", - "@playwright/test": "^1.49.0", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", + "@playwright/test": "^1.63.0", + "@typescript-eslint/parser": "^8.69.0", "@vue/compiler-sfc": "^3.5.18", "babel-loader": "^10.1.1", "css-loader": "~7.1.1", - "eslint": "^8.56.0", - "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-vue": "^9.21.1", + "eslint": "^10.10.0", "node-polyfill-webpack-plugin": "4.0.0", "style-loader": "~4.0.0", - "stylelint": "^17.9.1", - "vitest": "^4.1.11", - "vue-eslint-parser": "^10.4.1", + "stylelint": "^17.15.0", + "vitest": "^5.0.0", + "vue-eslint-parser": "^10.3.0", "vue-loader": "^17.4.2", - "webpack": "^5.94.0", + "webpack": "^5.111.1", "webpack-cli": "^6.0.1" }, "engines": { @@ -69,7 +65,7 @@ "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", @@ -121,26 +117,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/eslint-parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.29.7.tgz", - "integrity": "sha512-zxt+UJTOMKvUt3yOg+D58MLuz334pHp93qifMFcjIIO+9hN6t+ufw2gi7vDPMpxvfnHRR+3VVXvIjineCcgyXw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, "node_modules/@babel/generator": { "version": "7.29.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", @@ -1635,7 +1611,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@cacheable/utils": "^2.5.0", @@ -1644,54 +1620,17 @@ "keyv": "^5.6.0" } }, - "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", - "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "hashery": "^1.4.0", - "hookified": "^1.15.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "keyv": "^5.6.0" - } - }, - "node_modules/@cacheable/memory/node_modules/keyv": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", - "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@keyv/serialize": "^1.1.1" - } - }, "node_modules/@cacheable/utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "hashery": "^1.5.1", "keyv": "^5.6.0" } }, - "node_modules/@cacheable/utils/node_modules/keyv": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", - "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@keyv/serialize": "^1.1.1" - } - }, "node_modules/@ckpack/vue-color": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@ckpack/vue-color/-/vue-color-1.6.0.tgz", @@ -1827,9 +1766,9 @@ } }, "node_modules/@codemirror/search": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.1.tgz", - "integrity": "sha512-uMe5UO6PamJtSHrXhhHOzSX3ReWtiJrva6GnPMwSOrZtiExb5X5eExhr2OUZQVvdxPsKpY3Ro2mFbQadpPWmHA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.7.2.tgz", + "integrity": "sha512-gUYkYhT2+n/+VGZ+8EzE5WFkYZUZYm1VOKDudIsNqh42uRVQJ0a6Yss9sdKT3MeOYfuL1N6AZA57oza0Oyr0LA==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", @@ -1838,18 +1777,18 @@ } }, "node_modules/@codemirror/state": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.1.tgz", - "integrity": "sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.7.2.tgz", + "integrity": "sha512-U3RiPX62Wl/Gx4ftQ7UxLlloSfsFTQqKa+7vFBYteZGCzkp6oBqcsD7iSwniWRGobCAmDcwZSY+Six3+3ztdfg==", "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "node_modules/@codemirror/view": { - "version": "6.43.9", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.9.tgz", - "integrity": "sha512-sTuUzTpPMFebRhg6dawChoKKgndIwfjmJgKVxBefPElcU2NwQ6AFroupk0SFqEerQyZOGRfDNnSN8Dw/lMAsXw==", + "version": "6.43.10", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.43.10.tgz", + "integrity": "sha512-vVWLvd4fKWYN/pMcwUrg6dWeublxmSz+V+52ZjW3h64IVN9cRUYLk5Km4JDT9vifxAFfDtNOIFxKYENthcolJQ==", "license": "MIT", "dependencies": { "@codemirror/state": "^6.7.0", @@ -1859,9 +1798,9 @@ } }, "node_modules/@conduction/nextcloud-vue": { - "version": "2.27.2", - "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.27.2.tgz", - "integrity": "sha512-FhDF3FvM+ee0Jx7z70Lki7o7Mm4DeX/GsOqHo33hOcdylzXR63UXLRbxKMedodEiIqgOFUAI6GTox735iyL8Dw==", + "version": "2.57.1", + "resolved": "https://registry.npmjs.org/@conduction/nextcloud-vue/-/nextcloud-vue-2.57.1.tgz", + "integrity": "sha512-yYN+ZZZqeN8Aj+ncgcMv4P3XWrU69vBDFnYDX4ZIHpGfC9pYpXXuLd+kDKiveap/ingjkD5Ign3miK+dutHhQA==", "license": "EUPL-1.2", "dependencies": { "@ckpack/vue-color": "^1.6.0", @@ -1878,11 +1817,10 @@ "@microsoft/fetch-event-source": "^2.0.1", "@nextcloud/dialogs": "^7.4.1", "@nextcloud/event-bus": "^3.3.3", - "@nextcloud/files": "^3.12.2", + "@nextcloud/files": "^4.0.0", "@nextcloud/notify_push": "^1.4.0", "@nextcloud/password-confirmation": "^6.1.0", "@toast-ui/editor": "^3.2.2", - "@types/react": "^18.0.0", "@uiw/codemirror-theme-github": "^4.25.8", "@vue-flow/background": "^1.3.2", "@vue-flow/core": "^1.48.2", @@ -1892,12 +1830,11 @@ "ajv-formats": "^3.0.1", "apexcharts": "^4.7.0", "codemirror": "^6.0.0", - "dompurify": "^3.0.0", + "commander": "^14.0.3", "leaflet": "^1.9.0", "leaflet.markercluster": "^1.5.3", "linkifyjs": "^4.3.3", "lodash": "^4.17.21", - "marked": "^12.0.0", "style-mod": "^4.0.0", "vue-codemirror6": "^1.4.3", "vue3-apexcharts": "~1.8.0", @@ -1916,6 +1853,7 @@ "@nextcloud/initial-state": "^2.2.0 || ^3.0.0", "@nextcloud/l10n": "^2.0.0 || ^3.0.0", "@nextcloud/router": "^2.0.0 || ^3.0.0", + "@nextcloud/stylelint-config": "^3.2.2", "@nextcloud/vue": "^9.0.0", "@vueuse/core": "^11.0.0 || ^14.0.0", "axe-core": "^4.10.0", @@ -1924,20 +1862,18 @@ "eslint": "^8.56.0 || ^9.0.0 || ^10.0.0", "eslint-plugin-vue": "^9.21.0 || ^10.0.0", "gridstack": "^12.0.0 || ^13.0.0", - "marked": "^12.0.0", + "marked": ">=12 <19", "pinia": "^2.0.0 || ^3.0.0 || ^4.0.0", + "stylelint": "^17.9.1", "vue": "^3.5.0", "vue-eslint-parser": "^9.4.0 || ^10.0.0", "vue-material-design-icons": "^5.0.0" }, "peerDependenciesMeta": { - "axe-core": { + "@nextcloud/stylelint-config": { "optional": true }, - "dexie": { - "optional": true - }, - "dompurify": { + "axe-core": { "optional": true }, "eslint": { @@ -1946,7 +1882,7 @@ "eslint-plugin-vue": { "optional": true }, - "marked": { + "stylelint": { "optional": true }, "vue-eslint-parser": { @@ -1954,23 +1890,11 @@ } } }, - "node_modules/@conduction/nextcloud-vue/node_modules/marked": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", - "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/@csstools/css-calc": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -1994,7 +1918,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -2014,10 +1938,10 @@ } }, "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.10.tgz", - "integrity": "sha512-xBja6gaAaH2R2c7eNyl0TY4dhnnZ2uhj+KXpLdEQ6M/wuk9bYFZM8wY0ykw3VO4TgEJ56KGlerXS/9KBKVR/Cg==", - "dev": true, + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.11.tgz", + "integrity": "sha512-+a7SqvwQfLl8OAp/C/B8PhfV2UjRUIeCRvcZQEXjhTkM2nTxg8r9nbB7mdxkEGT67VbR6pREsAIlsx65N2KR6Q==", + "devOptional": true, "funding": [ { "type": "github", @@ -2042,7 +1966,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -2062,7 +1986,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-5.0.0.tgz", "integrity": "sha512-T9lXmZOfnam3eMERPsszjY5NK0jX8RmThmmm99FZ8b7z8yMaFZWKwLWGZuTwdO3ddRY5fy13GmmEYZXB4I98Eg==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -2082,6 +2006,52 @@ "@csstools/css-tokenizer": "^4.0.0" } }, + "node_modules/@csstools/selector-resolve-nested": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.1.tgz", + "integrity": "sha512-j3vdQu0XwLME5qOTWxm8cnmvsf423R2YL6DbKklCHZwkDm7UdKNu6RPlw4REIJhSlKBICY3B70/7QZdicLqZgg==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.1.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", + "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.1.1" + } + }, "node_modules/@ctrl/tinycolor": { "version": "3.6.1", "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", @@ -2183,826 +2153,630 @@ "node": ">=14.17.0" } }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "node_modules/@es-joy/jsdoccomment": { + "version": "0.91.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.91.0.tgz", + "integrity": "sha512-vgqlMGNNhZxwDYbUNIHj3Hskb4R28iqdXx90ufHyt/NeuTQkeqjTDslAs9I0/GCAfbxP5BpH5WsL1R1fht5Lxg==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "tslib": "^2.4.0" + "@types/estree": "^1.0.9", + "@typescript-eslint/types": "^8.65.0", + "comment-parser": "1.4.7", + "esquery": "^1.7.0", + "jsdoc-type-pratt-parser": "~8.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "node_modules/@es-joy/resolve.exports": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz", + "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" + "engines": { + "node": ">=10" } }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", - "integrity": "sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==", - "dev": true, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { - "comment-parser": "1.4.1", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": ">=16" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", - "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "devOptional": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", - "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "devOptional": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", - "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/compat": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.1.0.tgz", + "integrity": "sha512-LgaSCymEpw7tF53xvDw9SNsraPb1IBHxpdABIOM0hW8UAlP8znrjYtuxfR58FSJ3L9BhwD+FaPRFQpZq84Nh6g==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "peerDependencies": { + "eslint": "^8.40 || 9 || 10" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", - "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", - "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", - "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", - "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", - "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/json": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@eslint/json/-/json-2.0.1.tgz", + "integrity": "sha512-Thz2j92ceUF3Bq/0TuWb3MWn3Z+Cwc8k5ptF0fakl2D4Mp8mSx07Xr1aQM4R5NoihzarWUdxfOmQ8DesGy4jOg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.2", + "@humanwhocodes/momoa": "^3.3.10", + "natural-compare": "^1.4.0" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", - "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "devOptional": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", - "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@eslint/plugin-kit": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", - "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@file-type/xml": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@file-type/xml/-/xml-0.4.4.tgz", + "integrity": "sha512-NhCyXoHlVZ8TqM476hyzwGJ24+D5IPSaZhmrPj7qXnEVb3q6jrFzA3mM9TBpknKSI9EuQeGTKRg2DXGUwvBBoQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "sax": "^1.4.1", + "strtok3": "^10.3.4" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", - "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", - "cpu": [ - "loong64" - ], - "dev": true, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@floating-ui/utils": "^0.2.12" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", - "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", - "cpu": [ - "mips64el" - ], - "dev": true, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", - "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", + "license": "MIT" + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", - "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", - "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "devOptional": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", - "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "devOptional": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", - "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", - "cpu": [ - "arm64" - ], + "node_modules/@humanwhocodes/momoa": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-3.3.12.tgz", + "integrity": "sha512-xS9xl4ieqTqhSZfKV3YXj/htwJCUxbgvkTVaK1fkESgrOzvoVSOTRQeQ8tTLOZUS0Csi2xqtJQXgVTRH5OEbHQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "license": "Apache-2.0", "engines": { "node": ">=18" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", - "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "devOptional": true, + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", - "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", - "cpu": [ - "arm64" - ], + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dev": true, - "license": "MIT", + "license": "ISC", "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", - "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", - "cpu": [ - "x64" - ], + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, - "license": "MIT", + "license": "ISC", "optional": true, - "os": [ - "openbsd" - ], + "dependencies": { + "minipass": "^7.0.4" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", - "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", - "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", - "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">=18" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", - "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", - "devOptional": true, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsonjoy.com/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "dev": true, + "license": "Apache-2.0", + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "github", + "url": "https://github.com/sponsors/streamich" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "tslib": "2" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "devOptional": true, + "node_modules/@jsonjoy.com/buffers": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", + "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", - "devOptional": true, - "license": "MIT", + "node_modules/@jsonjoy.com/codegen": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", + "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "dev": true, + "license": "Apache-2.0", + "peer": true, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", - "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "node_modules/@jsonjoy.com/fs-core": { + "version": "4.68.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.68.2.tgz", + "integrity": "sha512-PoBeUNEbjyLKKwCap2z8LkkqdhdfttS4rTHCALVuP65BdF+sAoyBqHo1m+uGTRBiQWv3H7MGfr8f7lY4pDwanw==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { - "@eslint/core": "^0.17.0" + "@jsonjoy.com/fs-node-builtins": "4.68.2", + "@jsonjoy.com/fs-node-utils": "4.68.2", + "thingies": "^2.5.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", - "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "node_modules/@jsonjoy.com/fs-fsa": { + "version": "4.68.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.68.2.tgz", + "integrity": "sha512-h6eGXlLGGMyPfNliDQrbuHKTB9Z29ksCLjreAmdBqrDOBdfrTrHssi+b9WLfrF+J2KzAbIt9OMjJu6AEpTnYkg==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { - "@types/json-schema": "^7.0.15" + "@jsonjoy.com/fs-core": "4.68.2", + "@jsonjoy.com/fs-node-builtins": "4.68.2", + "@jsonjoy.com/fs-node-utils": "4.68.2", + "thingies": "^2.5.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", - "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", + "node_modules/@jsonjoy.com/fs-node": { + "version": "4.68.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.68.2.tgz", + "integrity": "sha512-Kpj519Qk4OXG4+mZ8vTf9BEflliJrPueIDEVcbx8tAOufMJJ8IxR0WwdbcEvJol2KQog3PJjtALXVclorE+xbQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "peer": true, "dependencies": { - "ajv": "^6.14.0", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.3.0", - "minimatch": "^3.1.5", - "strip-json-comments": "^3.1.1" + "@jsonjoy.com/fs-core": "4.68.2", + "@jsonjoy.com/fs-node-builtins": "4.68.2", + "@jsonjoy.com/fs-node-utils": "4.68.2", + "@jsonjoy.com/fs-print": "4.68.2", + "@jsonjoy.com/fs-snapshot": "4.68.2", + "glob-to-regex.js": "^1.0.0", + "thingies": "^2.5.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "node_modules/@jsonjoy.com/fs-node-builtins": { + "version": "4.68.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.68.2.tgz", + "integrity": "sha512-V8WzQsW2YIrH3RxBGY6HZisxn+dDUltHgksVRuCdPEOXEkAfXuhL/01eHFrabNu84Dn13XuLqvcQUKOYVKAUOA==", "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">=10.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/js": { - "version": "9.39.5", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", - "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "node_modules/@jsonjoy.com/fs-node-to-fsa": { + "version": "4.68.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.68.2.tgz", + "integrity": "sha512-4O1K4w5G4oJIpKpoa3WSLG83AsQYVnGv+aUSBGOvIUph9Axm6bB1mPlvldkNg2tBx/4dkiTlZnqNrK5SQ21Wtg==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@jsonjoy.com/fs-fsa": "4.68.2", + "@jsonjoy.com/fs-node-builtins": "4.68.2", + "@jsonjoy.com/fs-node-utils": "4.68.2" + }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10.0" }, "funding": { - "url": "https://eslint.org/donate" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@file-type/xml": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@file-type/xml/-/xml-0.4.4.tgz", - "integrity": "sha512-NhCyXoHlVZ8TqM476hyzwGJ24+D5IPSaZhmrPj7qXnEVb3q6jrFzA3mM9TBpknKSI9EuQeGTKRg2DXGUwvBBoQ==", - "license": "MIT", - "dependencies": { - "sax": "^1.4.1", - "strtok3": "^10.3.4" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", - "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.12" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", - "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.8.0", - "@floating-ui/utils": "^0.2.12" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", - "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==", - "license": "MIT" - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "devOptional": true, + "node_modules/@jsonjoy.com/fs-node-utils": { + "version": "4.68.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.68.2.tgz", + "integrity": "sha512-CxFwyG9fJr7dAKAd1uanNRNrRMtDDqbYJA8do53+M4LY7SxcBEEmMjC1zi9MOsBlVLHTXvA7OP9+n639UqtIcw==", + "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" + "@jsonjoy.com/fs-node-builtins": "4.68.2", + "glob-to-regex.js": "^1.0.1" }, "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" + "node": ">=10.0" }, "funding": { "type": "github", - "url": "https://github.com/sponsors/nzakas" + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "devOptional": true, - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@jsonjoy.com/fs-print": { + "version": "4.68.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.68.2.tgz", + "integrity": "sha512-cBABQmZJXig6bahwNka3+yPNGUF1GeMWbR76ZM1N2ajgCd+S+twZigCoe9+0ueZmkhM9xd2a7688Gy/ch7T+2w==", "dev": true, - "license": "ISC", - "optional": true, + "license": "Apache-2.0", + "peer": true, "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@jsonjoy.com/fs-node-utils": "4.68.2", + "tree-dump": "^1.1.0" }, "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", - "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/streamich" + }, + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/@jsonjoy.com/fs-snapshot": { + "version": "4.68.2", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.68.2.tgz", + "integrity": "sha512-Aix7+NM38LzvewM0T3PICSgFdF5BVCtVgsjNsrlDPGc9hiMgJzReTDDl2/elgl0A9USMl3QP27x5WwxZSOtrfw==", "dev": true, - "license": "MIT", - "optional": true, + "license": "Apache-2.0", + "peer": true, "dependencies": { - "ansi-regex": "^6.2.2" + "@jsonjoy.com/buffers": "^17.65.0", + "@jsonjoy.com/fs-node-utils": "4.68.2", + "@jsonjoy.com/json-pack": "^17.65.0", + "@jsonjoy.com/util": "^17.65.0" }, "engines": { - "node": ">=12" + "node": ">=10.0" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "minipass": "^7.0.4" + "type": "github", + "url": "https://github.com/sponsors/streamich" }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "peerDependencies": { + "tslib": "2" } }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", + "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -3017,10 +2791,10 @@ "tslib": "2" } }, - "node_modules/@jsonjoy.com/buffers": { + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", - "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", + "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -3035,13 +2809,23 @@ "tslib": "2" } }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", + "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", "dev": true, "license": "Apache-2.0", "peer": true, + "dependencies": { + "@jsonjoy.com/base64": "17.67.0", + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0", + "@jsonjoy.com/json-pointer": "17.67.0", + "@jsonjoy.com/util": "17.67.0", + "hyperdyperid": "^1.2.0", + "thingies": "^2.5.0", + "tree-dump": "^1.1.0" + }, "engines": { "node": ">=10.0" }, @@ -3053,17 +2837,15 @@ "tslib": "2" } }, - "node_modules/@jsonjoy.com/fs-core": { - "version": "4.68.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.68.2.tgz", - "integrity": "sha512-PoBeUNEbjyLKKwCap2z8LkkqdhdfttS4rTHCALVuP65BdF+sAoyBqHo1m+uGTRBiQWv3H7MGfr8f7lY4pDwanw==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", + "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.68.2", - "@jsonjoy.com/fs-node-utils": "4.68.2", - "thingies": "^2.5.0" + "@jsonjoy.com/util": "17.67.0" }, "engines": { "node": ">=10.0" @@ -3076,261 +2858,16 @@ "tslib": "2" } }, - "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.68.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.68.2.tgz", - "integrity": "sha512-h6eGXlLGGMyPfNliDQrbuHKTB9Z29ksCLjreAmdBqrDOBdfrTrHssi+b9WLfrF+J2KzAbIt9OMjJu6AEpTnYkg==", + "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { + "version": "17.67.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", + "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", "dev": true, "license": "Apache-2.0", "peer": true, "dependencies": { - "@jsonjoy.com/fs-core": "4.68.2", - "@jsonjoy.com/fs-node-builtins": "4.68.2", - "@jsonjoy.com/fs-node-utils": "4.68.2", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node": { - "version": "4.68.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.68.2.tgz", - "integrity": "sha512-Kpj519Qk4OXG4+mZ8vTf9BEflliJrPueIDEVcbx8tAOufMJJ8IxR0WwdbcEvJol2KQog3PJjtALXVclorE+xbQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@jsonjoy.com/fs-core": "4.68.2", - "@jsonjoy.com/fs-node-builtins": "4.68.2", - "@jsonjoy.com/fs-node-utils": "4.68.2", - "@jsonjoy.com/fs-print": "4.68.2", - "@jsonjoy.com/fs-snapshot": "4.68.2", - "glob-to-regex.js": "^1.0.0", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.68.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.68.2.tgz", - "integrity": "sha512-V8WzQsW2YIrH3RxBGY6HZisxn+dDUltHgksVRuCdPEOXEkAfXuhL/01eHFrabNu84Dn13XuLqvcQUKOYVKAUOA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.68.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.68.2.tgz", - "integrity": "sha512-4O1K4w5G4oJIpKpoa3WSLG83AsQYVnGv+aUSBGOvIUph9Axm6bB1mPlvldkNg2tBx/4dkiTlZnqNrK5SQ21Wtg==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@jsonjoy.com/fs-fsa": "4.68.2", - "@jsonjoy.com/fs-node-builtins": "4.68.2", - "@jsonjoy.com/fs-node-utils": "4.68.2" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.68.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.68.2.tgz", - "integrity": "sha512-CxFwyG9fJr7dAKAd1uanNRNrRMtDDqbYJA8do53+M4LY7SxcBEEmMjC1zi9MOsBlVLHTXvA7OP9+n639UqtIcw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.68.2", - "glob-to-regex.js": "^1.0.1" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-print": { - "version": "4.68.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.68.2.tgz", - "integrity": "sha512-cBABQmZJXig6bahwNka3+yPNGUF1GeMWbR76ZM1N2ajgCd+S+twZigCoe9+0ueZmkhM9xd2a7688Gy/ch7T+2w==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.68.2", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.68.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.68.2.tgz", - "integrity": "sha512-Aix7+NM38LzvewM0T3PICSgFdF5BVCtVgsjNsrlDPGc9hiMgJzReTDDl2/elgl0A9USMl3QP27x5WwxZSOtrfw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.68.2", - "@jsonjoy.com/json-pack": "^17.65.0", - "@jsonjoy.com/util": "^17.65.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", - "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", - "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", - "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@jsonjoy.com/base64": "17.67.0", - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0", - "@jsonjoy.com/json-pointer": "17.67.0", - "@jsonjoy.com/util": "17.67.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", - "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@jsonjoy.com/util": "17.67.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", - "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0" + "@jsonjoy.com/buffers": "17.67.0", + "@jsonjoy.com/codegen": "17.67.0" }, "engines": { "node": ">=10.0" @@ -3451,11 +2988,28 @@ "tslib": "2" } }, + "node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, "node_modules/@keyv/serialize": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/@leichtgewicht/ip-codec": { @@ -3563,46 +3117,6 @@ "integrity": "sha512-W6CLUJ2eBMw3Rec70qrsEW0jOm/3twwJv21mrmj2yORiaVmVYGS4sSS5yUwvQc1ZlDLYGPnClVWmUUMagKNsfA==", "license": "MIT" }, - "node_modules/@napi-rs/lzma-linux-x64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", - "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.3.tgz", - "integrity": "sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.4", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.4" - } - }, "node_modules/@nextcloud/auth": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@nextcloud/auth/-/auth-2.6.0.tgz", @@ -3618,14 +3132,13 @@ } }, "node_modules/@nextcloud/axios": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/@nextcloud/axios/-/axios-2.5.2.tgz", - "integrity": "sha512-8frJb77jNMbz00TjsSqs1PymY0nIEbNM4mVmwen2tXY7wNgRai6uXilIlXKOYB9jR/F/HKRj6B4vUwVwZbhdbw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@nextcloud/axios/-/axios-2.6.0.tgz", + "integrity": "sha512-ehcIgyora8DAJ+STG6iFI4e+ufPVFrIA6o0FgMKeKdfyaxRJ9UM7L+n7V+rc/qv8sDiWC/hWIKwFtLw2W5yE4Q==", "license": "GPL-3.0-or-later", "dependencies": { - "@nextcloud/auth": "^2.5.1", - "@nextcloud/router": "^3.0.1", - "axios": "^1.12.2" + "@nextcloud/auth": "^2.6.0", + "axios": "^1.15.0" }, "engines": { "node": "^20.0.0 || ^22.0.0 || ^24.0.0" @@ -3674,7 +3187,7 @@ "dependencies": { "@mdi/js": "^7.4.47", "@nextcloud/auth": "^2.6.0", - "@nextcloud/axios": "^2.6.0", + "@nextcloud/axios": "~2.6.0", "@nextcloud/browser-storage": "^0.5.0", "@nextcloud/capabilities": "^1.2.1", "@nextcloud/event-bus": "^3.3.3", @@ -3694,121 +3207,61 @@ "node": "^20 || ^22 || ^24" } }, - "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/files": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-4.0.0.tgz", - "integrity": "sha512-TmecnZIS+PGWGtRh7RpGEboCT4K6iTbHULUcfR6hs3eEzjDVsCc1Ldf8popGY/70lbpdlfYle8xbXnPIo3qaXA==", - "license": "AGPL-3.0-or-later", - "dependencies": { - "@nextcloud/auth": "^2.5.3", - "@nextcloud/capabilities": "^1.2.1", - "@nextcloud/l10n": "^3.4.1", - "@nextcloud/logger": "^3.0.3", - "@nextcloud/paths": "^3.0.0", - "@nextcloud/router": "^3.1.0", - "@nextcloud/sharing": "^0.3.0", - "is-svg": "^6.1.0", - "typescript-event-target": "^1.1.2", - "webdav": "^5.9.0" - }, - "engines": { - "node": "^24.0.0" - } - }, - "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/files/node_modules/@nextcloud/files": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-3.12.2.tgz", - "integrity": "sha512-vBo8tf3Xh6efiF8CrEo3pKj9AtvAF6RdDGO1XKL65IxV8+UUd9Uxl2lUExHlzoDRRczCqfGfaWfRRaFhYqce5Q==", + "node_modules/@nextcloud/eslint-config": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nextcloud/eslint-config/-/eslint-config-9.0.1.tgz", + "integrity": "sha512-TzJrZdrIJgnoW9V0U31sLuhot/i1kWB3A9VMFUiuMXEKYQUTwgL4LTA5DbJ6Dnlsx+6XuR3Bi6d4RWfaeLzlJw==", + "dev": true, "license": "AGPL-3.0-or-later", - "optional": true, - "dependencies": { - "@nextcloud/auth": "^2.5.3", - "@nextcloud/capabilities": "^1.2.1", - "@nextcloud/l10n": "^3.4.1", - "@nextcloud/logger": "^3.0.3", - "@nextcloud/paths": "^3.0.0", - "@nextcloud/router": "^3.1.0", - "@nextcloud/sharing": "^0.3.0", - "cancelable-promise": "^4.3.1", - "is-svg": "^6.1.0", - "typescript-event-target": "^1.1.1", - "webdav": "^5.8.0" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || ^24.0.0" - } - }, - "node_modules/@nextcloud/dialogs/node_modules/@nextcloud/files/node_modules/@nextcloud/sharing": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.3.0.tgz", - "integrity": "sha512-kV7qeUZvd1fTKeFyH+W5Qq5rNOqG9rLATZM3U9MBxWXHJs3OxMqYQb8UQ3NYONzsX3zDGJmdQECIGHm1ei2sCA==", - "license": "GPL-3.0-or-later", "dependencies": { - "@nextcloud/initial-state": "^3.0.0", - "is-svg": "^6.1.0" + "@eslint/js": "^10.0.1", + "@eslint/json": "^2.0.0", + "@stylistic/eslint-plugin": "^5.10.0", + "eslint-config-flat-gitignore": "^2.3.0", + "eslint-plugin-antfu": "^3.2.3", + "eslint-plugin-jsdoc": "^63.0.10", + "eslint-plugin-perfectionist": "^5.9.1", + "eslint-plugin-vue": "^10.9.2", + "fast-xml-parser": "^5.9.3", + "globals": "^17.7.0", + "semver": "^7.8.5", + "sort-package-json": "^4.0.0", + "typescript-eslint": "^8.62.1" }, "engines": { - "node": "^20.0.0 || ^22.0.0 || ^24.0.0" + "node": "^22.14 || ^24 || >=26" }, - "optionalDependencies": { - "@nextcloud/files": "^3.12.0" + "peerDependencies": { + "eslint": ">=10" } }, - "node_modules/@nextcloud/eslint-config": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@nextcloud/eslint-config/-/eslint-config-8.4.2.tgz", - "integrity": "sha512-zsDcBxvp2Vr/BgasK/vNYJ84LOXjl4RseJPrcp93zcnaB2WnygV50Sd0nQ5JN0ngTyPjiIlGd92MMzrMTofjRA==", + "node_modules/@nextcloud/eslint-config/node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, - "license": "AGPL-3.0-or-later", + "license": "MIT", "engines": { - "node": "^20.0.0", - "npm": "^10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.26.9", - "@babel/eslint-parser": "^7.16.5", - "@nextcloud/eslint-plugin": "^2.2.1", - "@vue/eslint-config-typescript": "^13.0.0", - "eslint": "^8.27.0", - "eslint-config-standard": "^17.1.0", - "eslint-import-resolver-exports": "^1.0.0-beta.5", - "eslint-import-resolver-typescript": "^3.8.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jsdoc": "^46.2.6", - "eslint-plugin-n": "^16.0.0", - "eslint-plugin-promise": "^6.6.0", - "eslint-plugin-vue": "^9.7.0", - "typescript": "^5.0.2" - } - }, - "node_modules/@nextcloud/eslint-plugin": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@nextcloud/eslint-plugin/-/eslint-plugin-2.2.1.tgz", - "integrity": "sha512-RX+0FxpL1h2EzjNLeW0VSGTkbyWIq7WgV7QAjtyUmDbSGwf1ds9Zy5OcRkgXRHRIu/W0gB0DhS2iz9qXHphCzA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fast-xml-parser": "^4.2.5", - "requireindex": "^1.2.0", - "semver": "^7.5.3" + "node": "^20.19.0 || ^22.13.0 || >=24" }, - "engines": { - "node": "^20.0.0", - "npm": "^10.0.0" + "funding": { + "url": "https://eslint.org/donate" }, "peerDependencies": { - "eslint": ">=7.0.0" + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/@nextcloud/eslint-plugin/node_modules/semver": { + "node_modules/@nextcloud/eslint-config/node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -3842,41 +3295,27 @@ } }, "node_modules/@nextcloud/files": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-3.12.2.tgz", - "integrity": "sha512-vBo8tf3Xh6efiF8CrEo3pKj9AtvAF6RdDGO1XKL65IxV8+UUd9Uxl2lUExHlzoDRRczCqfGfaWfRRaFhYqce5Q==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@nextcloud/files/-/files-4.1.0.tgz", + "integrity": "sha512-C45fxBxU9v5HQ437I+r4EuqG/A9CYqNnYM34ltdxFNSBMjId7DoRJrk5UDA7QsC4eB/CP1xNxFSpkY+g6RPWXA==", "license": "AGPL-3.0-or-later", "dependencies": { - "@nextcloud/auth": "^2.5.3", + "@nextcloud/auth": "^2.6.0", + "@nextcloud/axios": "^2.6.0", "@nextcloud/capabilities": "^1.2.1", "@nextcloud/l10n": "^3.4.1", "@nextcloud/logger": "^3.0.3", - "@nextcloud/paths": "^3.0.0", + "@nextcloud/paths": "^3.1.0", "@nextcloud/router": "^3.1.0", - "@nextcloud/sharing": "^0.3.0", - "cancelable-promise": "^4.3.1", + "@nextcloud/sharing": "^0.4.0", + "axios-retry": "^4.5.0", "is-svg": "^6.1.0", - "typescript-event-target": "^1.1.1", - "webdav": "^5.8.0" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || ^24.0.0" - } - }, - "node_modules/@nextcloud/files/node_modules/@nextcloud/sharing": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@nextcloud/sharing/-/sharing-0.3.0.tgz", - "integrity": "sha512-kV7qeUZvd1fTKeFyH+W5Qq5rNOqG9rLATZM3U9MBxWXHJs3OxMqYQb8UQ3NYONzsX3zDGJmdQECIGHm1ei2sCA==", - "license": "GPL-3.0-or-later", - "dependencies": { - "@nextcloud/initial-state": "^3.0.0", - "is-svg": "^6.1.0" + "p-queue": "^9.3.3", + "typescript-event-target": "^1.1.2", + "webdav": "^5.10.0" }, "engines": { - "node": "^20.0.0 || ^22.0.0 || ^24.0.0" - }, - "optionalDependencies": { - "@nextcloud/files": "^3.12.0" + "node": "^24.0.0 || >=26.0.0" } }, "node_modules/@nextcloud/initial-state": { @@ -3922,7 +3361,7 @@ "integrity": "sha512-07UDgz1xLG9XABP8+mwQ2CsNWZu6lKzz0ErUA2HfE1ZfxXKiwVpo60t30y34UExGB9+Ok1nFaYU8fyJHncz9aQ==", "license": "AGPL-3.0-or-later", "dependencies": { - "@nextcloud/axios": "^2.6.0", + "@nextcloud/axios": "~2.6.0", "@nextcloud/capabilities": "^1.2.1", "@nextcloud/event-bus": "^3.3.3" } @@ -3955,9 +3394,9 @@ } }, "node_modules/@nextcloud/router": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-3.1.0.tgz", - "integrity": "sha512-e4dkIaxRSwdZJlZFpn9x03QgBn/Sa2hN1hp/BA7+AbzykmSAlKuWfdmX8j/8ewrLpQwYmZR23IZO9XwpJXq2Uw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@nextcloud/router/-/router-3.2.0.tgz", + "integrity": "sha512-an4gJ7mlDZGtYq8zTxp4Sg+iLlKKGvQ9ZH3Dp6ga/IlDNAP7VeMVGphsY798ORjncAp9+sEf370L5zpsnuxgng==", "license": "GPL-3.0-or-later", "dependencies": { "@nextcloud/typings": "^1.10.0" @@ -3986,7 +3425,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/@nextcloud/stylelint-config/-/stylelint-config-3.2.2.tgz", "integrity": "sha512-5rr77fGK+zoa8yN+8zR43XbqyuN/yB2wSAy4vKE2F+hgAeOhpUAyChV+pfySDbP20t4s22DHgn7BDiZKsbNE3Q==", - "dev": true, + "devOptional": true, "license": "AGPL-3.0-or-later", "dependencies": { "stylelint-use-logical": "^2.1.3" @@ -4021,7 +3460,7 @@ "@ckpack/vue-color": "^1.6.0", "@floating-ui/dom": "^1.8.0", "@nextcloud/auth": "^2.6.0", - "@nextcloud/axios": "^2.6.0", + "@nextcloud/axios": "~2.6.0", "@nextcloud/browser-storage": "^0.5.0", "@nextcloud/capabilities": "^1.2.1", "@nextcloud/event-bus": "^3.3.3", @@ -4112,18 +3551,6 @@ "integrity": "sha512-LjgdTytVFXeUgtHZr9WYViYSM/g8MkcTPYDlPa3cDqMirHjKiSZPYd6DoL7pK8AJQr+uWkQvCjHNdiMqsrJs+g==", "license": "MIT" }, - "node_modules/@nextcloud/vue/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@nextcloud/vue/node_modules/vue-router": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.3.0.tgz", @@ -4199,17 +3626,6 @@ "webpack-dev-server": "^6.0.0" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "eslint-scope": "5.1.1" - } - }, "node_modules/@noble/hashes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", @@ -4274,17 +3690,6 @@ "node": ">= 8" } }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12.4.0" - } - }, "node_modules/@npmcli/agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz", @@ -4417,11 +3822,21 @@ "node": ">=20.0" } }, + "node_modules/@oxc-project/types": { + "version": "0.147.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.147.0.tgz", + "integrity": "sha512-IJ3s6ltHLp45S0bh7phkX+gJO7A1Wuz2EaqpAhb8WjqDwbzMiWKHhyyT42tskaWjEYXtHtVCPpnBJVT9+dcRLg==", + "devOptional": true, + "license": "MIT", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/Boshen" + } + }, "node_modules/@parcel/watcher": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -4461,7 +3876,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4483,7 +3897,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4505,7 +3918,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4527,7 +3939,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4549,7 +3960,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4571,7 +3981,6 @@ "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4593,7 +4002,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4615,7 +4023,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4637,7 +4044,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4659,7 +4065,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4681,7 +4086,6 @@ "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4703,7 +4107,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -4718,21 +4121,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@peculiar/asn1-cms": { "version": "2.9.4", "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.9.4.tgz", @@ -4956,13 +4344,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz", - "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.63.0.tgz", + "integrity": "sha512-oxMK4vllB9RK5NQ2l1pq1IfOf2AvnEuj/vYGDj0H2nMtmtZpKtCwt/l00GEO6xjGfpBNAvjovvYdCm50dRQkpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.62.1" + "playwright": "1.63.0" }, "bin": { "playwright": "cli.js" @@ -4971,369 +4359,287 @@ "node": ">=20" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", - "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.6.tgz", + "integrity": "sha512-b+jTcARdTiFLI6jB4a5XjTm0RWd6KcRfQj/I2356fxUZemiho9zQLxo0RtCuMDAyKcLo6cEltkgbQp6d1+sjjQ==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "android" - ] + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", - "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.6.tgz", + "integrity": "sha512-lkWU8ZJaRk9q3CIEY1Tc7vIFALp3Xw5NfGJo2hQg5oIqNgxWi1zI+IiDEK3r70BF5Dzol1tcXsnzsRc8NLhG+Q==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "android" - ] + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", - "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.6.tgz", + "integrity": "sha512-dgR56NYnvAszm7Ob1B2/Vn0e8bUQYZH2UjVaMMtMVOCKFSfjhfLmuA/9+O+F+ajUdG6B/bSssrKW6JJYASa8jA==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" - ] + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", - "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.6.tgz", + "integrity": "sha512-vpVxFvUCFioJqug7OTvqptkc4yb8UX0AwfDmJpaR/0sWz+BUmqSVAf7c8JkUgnN8YLspb4a/N6NhTyMAmdyQ7Q==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", - "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", - "cpu": [ - "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", - "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.6.tgz", + "integrity": "sha512-h1wG6Y6K3JlRswxsI64qQJqBAy4vrLuHgRbc8CZMGSWTOFRY6ghMApM1NKzB2I0n5xV1fjkE18SuVl2QpLeNpA==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" - ] + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", - "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.6.tgz", + "integrity": "sha512-tbCiqub0q2MVWJKgF5PoAlNWCtQydiOYSLIkd8sByqK/6MMYLJRcSXSYodqYtd0O+Fw7QaVmKKlS4oL94YRZ0w==", "cpu": [ "arm" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", - "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.6.tgz", + "integrity": "sha512-oxK9+baEBPhZG5HB4URY+uU04zJWeZlH6Tb9rB5DK4DF9XR1uXNLXt5Q5ZsugTKayNCNLhkcwz/ye74hRI98dg==", "cpu": [ - "arm" + "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", - "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.6.tgz", + "integrity": "sha512-muWCk27FVBEZtv0MsK8gnfSmgczA8KQ0uRVJbTABKhkRfQc38aUrcb7fhi3BNiyseFmgcRsoMfQsSNJ+DbZdSw==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", - "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.6.tgz", + "integrity": "sha512-eWDoSfU7Co2qj3vgB3Dt4lj1mG6CoWbcJQkRMP3XJplyCMtuaq3LHvPFjS9QIPvMGWVadJC04Xiy0IdcVPtnwQ==", "cpu": [ - "arm64" + "ppc64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", - "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.6.tgz", + "integrity": "sha512-2bWNjRSIayvupRKxXUY2tWG9fYdoUlTqWywHRvE8Eq3GvuQ+f2HeIkve697fIt+IQs/PV8yFsdWuhp1aJ1PdnA==", "cpu": [ - "loong64" + "s390x" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", - "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", - "cpu": [ - "loong64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", - "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", - "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", - "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", - "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", - "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", - "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.6.tgz", + "integrity": "sha512-KekI0gS0wLxe1UBSQSjenBVwou/JkcQPDzBPICGZjxUv9k3RteHDPBQaiOicZUFKRIH2wKEimGwVpnJsbPzu7w==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", - "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.6.tgz", + "integrity": "sha512-TvtPnfVr+HtyGiDmPK4VWmlNm7QhNNAcK5Q9A7aOXsI8545yCyaoMaicXrFZ72JzeYjaUVk7yT243zT0jzjFKQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", - "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", - "cpu": [ - "x64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", - "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.6.tgz", + "integrity": "sha512-iOo0VEay2XFhaCcH0sps5XIimkSuOnNaZrf6+ZkoSOQBJPKNU48RkmJv0/lSpipexu5P+ouFgafe5IGr/DiQfg==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "openharmony" - ] + ], + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", - "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.6.tgz", + "integrity": "sha512-y5NTmmasMS455JlOCO4ZM9krIchv3Mvm1crL1iUPGOPgEzSkves9n0SdC5Sjz6+qWDFhd8/JpfWMH8NSWNHe+A==", "cpu": [ "arm64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", - "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", - "cpu": [ - "ia32" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", - "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.6.tgz", + "integrity": "sha512-np8iZSLfXlAD4kWhiyq/u0Yt8oZDtRQ8lGhQaCXo2rl37KNjeU0GjJuwr4P3oeZ++ROfofsKNBqR5LTO8aXyWQ==", "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", - "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", - "cpu": [ - "x64" ], - "dev": true, + "peer": true, + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "devOptional": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "peer": true }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "node_modules/@sindresorhus/base62": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz", + "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==", "dev": true, "license": "MIT", - "peer": true + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/@sindresorhus/merge-streams": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -5342,12 +4648,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", - "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", - "dev": true, - "license": "MIT" + "node_modules/@stylistic/eslint-plugin": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz", + "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/types": "^8.56.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^9.0.0 || ^10.0.0" + } }, "node_modules/@svgdotjs/svg.draggable.js": { "version": "3.0.6", @@ -5433,18 +4753,6 @@ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", "license": "MIT" }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -5605,14 +4913,6 @@ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "license": "MIT" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", @@ -5637,12 +4937,6 @@ "undici-types": "~8.3.0" } }, - "node_modules/@types/prop-types": { - "version": "15.7.15", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", - "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", - "license": "MIT" - }, "node_modules/@types/qs": { "version": "6.15.1", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", @@ -5659,16 +4953,6 @@ "license": "MIT", "peer": true }, - "node_modules/@types/react": { - "version": "18.3.31", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", - "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.2.2" - } - }, "node_modules/@types/semver": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.8.0.tgz", @@ -5746,188 +5030,204 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz", - "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==", + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.68.0.tgz", + "integrity": "sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/type-utils": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/type-utils": "8.68.0", + "@typescript-eslint/utils": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^1.3.0" + "ts-api-utils": "^2.5.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@typescript-eslint/parser": "^8.68.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/parser": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.18.0.tgz", - "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz", + "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.69.0.tgz", + "integrity": "sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==", + "devOptional": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/typescript-estree": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "debug": "^4.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", - "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", - "dev": true, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.69.0.tgz", + "integrity": "sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==", + "devOptional": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0" + "@typescript-eslint/tsconfig-utils": "^8.69.0", + "@typescript-eslint/types": "^8.69.0", + "debug": "^4.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz", - "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==", - "dev": true, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.69.0.tgz", + "integrity": "sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==", + "devOptional": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.18.0", - "@typescript-eslint/utils": "7.18.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.69.0.tgz", + "integrity": "sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, - "peerDependencies": { - "eslint": "^8.56.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/types": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", - "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", - "dev": true, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.69.0.tgz", + "integrity": "sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==", + "devOptional": true, "license": "MIT", "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", - "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.69.0.tgz", + "integrity": "sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==", + "devOptional": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/visitor-keys": "7.18.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" + "@typescript-eslint/project-service": "8.69.0", + "@typescript-eslint/tsconfig-utils": "8.69.0", + "@typescript-eslint/types": "8.69.0", + "@typescript-eslint/visitor-keys": "8.69.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", - "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", - "dev": true, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.69.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.69.0.tgz", + "integrity": "sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==", + "devOptional": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@typescript-eslint/types": "8.69.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "devOptional": true, + "license": "Apache-2.0", "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "node_modules/@typescript-eslint/parser/node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, + "devOptional": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5936,41 +5236,179 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/utils": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", - "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.68.0.tgz", + "integrity": "sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.18.0", - "@typescript-eslint/types": "7.18.0", - "@typescript-eslint/typescript-estree": "7.18.0" + "@typescript-eslint/tsconfig-utils": "^8.68.0", + "@typescript-eslint/types": "^8.68.0", + "debug": "^4.4.3" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.56.0" + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", - "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.68.0.tgz", + "integrity": "sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.18.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.68.0.tgz", + "integrity": "sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.68.0.tgz", + "integrity": "sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/utils": "8.68.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.68.0.tgz", + "integrity": "sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.68.0.tgz", + "integrity": "sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.68.0", + "@typescript-eslint/tsconfig-utils": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.68.0.tgz", + "integrity": "sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.68.0.tgz", + "integrity": "sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.68.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { - "node": "^18.18.0 || >=20.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", @@ -5978,13 +5416,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" @@ -6027,1833 +5465,1491 @@ "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", "license": "ISC" }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", - "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", - "cpu": [ - "arm" - ], + "node_modules/@vitest/mocker": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.0.tgz", + "integrity": "sha512-66PGTMIiVJP3t4a5yxU9qPtf7MdTBs8jmToMvy+HVflB3Yy13WJZTtPePdvU+wjRV02SKK5doLbSA6o9pwOmiA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true + "dependencies": { + "@jridgewell/trace-mapping": "0.3.31", + "@vitest/spy": "5.0.0", + "estree-walker": "^3.0.3", + "magic-string": "^1.2.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", - "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", - "cpu": [ - "arm64" - ], + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "peer": true + "dependencies": { + "@types/estree": "^1.0.0" + } }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", - "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", - "cpu": [ - "arm64" - ], + "node_modules/@vitest/mocker/node_modules/magic-string": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz", + "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", - "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", - "cpu": [ - "x64" - ], + "node_modules/@vitest/spy": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.0.tgz", + "integrity": "sha512-uy+luWBAPw9XfthoHi5AkfHUnuPYEESjl0p/r+meoBnU8bxg5GDQ3Ey8MjcJ6sqahkL4PFyrvfMJJBw7LbU06g==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true + "funding": { + "url": "https://opencollective.com/vitest" + } }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", - "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@vue-flow/background": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@vue-flow/background/-/background-1.3.2.tgz", + "integrity": "sha512-eJPhDcLj1wEo45bBoqTXw1uhl0yK2RaQGnEINqvvBsAFKh/camHJd5NPmOdS1w+M9lggc9igUewxaEd3iCQX2w==", "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "peer": true + "peerDependencies": { + "@vue-flow/core": "^1.23.0", + "vue": "^3.3.0" + } }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", - "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@vue-flow/core": { + "version": "1.48.2", + "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.48.2.tgz", + "integrity": "sha512-raxhgKWE+G/mcEvXJjGFUDYW9rAI3GOtiHR3ZkNpwBWuIaCC1EYiBmKGwJOoNzVFgwO7COgErnK7i08i287AFA==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "@vueuse/core": "^10.5.0", + "d3-drag": "^3.0.0", + "d3-interpolate": "^3.0.1", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + }, + "peerDependencies": { + "vue": "^3.3.0" + } }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", - "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "node_modules/@vue-flow/core/node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", - "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@vue-flow/core/node_modules/@vueuse/core": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", + "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "10.11.1", + "@vueuse/shared": "10.11.1", + "vue-demi": ">=0.14.8" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", - "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", - "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-linux-loong64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", - "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", - "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", - "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", - "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", - "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", - "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", - "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-openharmony-arm64": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", - "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@vue-flow/core/node_modules/@vueuse/metadata": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", + "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "peer": true + "funding": { + "url": "https://github.com/sponsors/antfu" + } }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", - "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", - "cpu": [ - "wasm32" - ], - "dev": true, + "node_modules/@vue-flow/core/node_modules/@vueuse/shared": { + "version": "10.11.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", + "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", "license": "MIT", - "optional": true, - "peer": true, "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" + "vue-demi": ">=0.14.8" }, - "engines": { - "node": ">=14.0.0" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", - "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", - "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", - "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@vue-flow/minimap": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@vue-flow/minimap/-/minimap-1.5.4.tgz", + "integrity": "sha512-l4C+XTAXnRxsRpUdN7cAVFBennC1sVRzq4bDSpVK+ag7tdMczAnhFYGgbLkUw3v3sY6gokyWwMl8CDonp8eB2g==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "peer": true + "dependencies": { + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + }, + "peerDependencies": { + "@vue-flow/core": "^1.23.0", + "vue": "^3.3.0" + } }, - "node_modules/@vitest/expect": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", - "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", - "dev": true, + "node_modules/@vue-flow/node-resizer": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@vue-flow/node-resizer/-/node-resizer-1.5.1.tgz", + "integrity": "sha512-DNYgXTF39GXPAygVMFmgn5azgFztaWfqbWvv8D/X0HGgeunRrexJ0W94DyXH1rnndGyYAJ0KexEjyelsb+Nlbg==", "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.1.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.11", - "@vitest/utils": "4.1.11", - "chai": "^6.2.2", - "tinyrainbow": "^3.1.0" + "d3-drag": "^3.0.0", + "d3-selection": "^3.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "peerDependencies": { + "@vue-flow/core": "^1.23.0", + "vue": "^3.3.0" } }, - "node_modules/@vitest/mocker": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", - "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", - "dev": true, + "node_modules/@vue-macros/common": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.4.tgz", + "integrity": "sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==", "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.11", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" + "@vue/compiler-sfc": "^3.5.22", + "ast-kit": "^2.1.2", + "local-pkg": "^1.1.2", + "magic-string-ast": "^1.0.2", + "unplugin-utils": "^0.3.0" + }, + "engines": { + "node": ">=20.19.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/vue-macros" }, "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + "vue": "^2.7.0 || ^3.2.25" }, "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { + "vue": { "optional": true } } }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, + "node_modules/@vue/compiler-core": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.43.tgz", + "integrity": "sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==", "license": "MIT", "dependencies": { - "@types/estree": "^1.0.0" + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.43", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" } }, - "node_modules/@vitest/pretty-format": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", - "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", - "dev": true, + "node_modules/@vue/compiler-dom": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.43.tgz", + "integrity": "sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==", "license": "MIT", "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@vue/compiler-core": "3.5.43", + "@vue/shared": "3.5.43" } }, - "node_modules/@vitest/runner": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", - "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", - "dev": true, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.43.tgz", + "integrity": "sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==", "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.11", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.43", + "@vue/compiler-dom": "3.5.43", + "@vue/compiler-ssr": "3.5.43", + "@vue/shared": "3.5.43", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.28", + "source-map-js": "^1.2.1" } }, - "node_modules/@vitest/snapshot": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", - "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", - "dev": true, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.43.tgz", + "integrity": "sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==", "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.11", - "@vitest/utils": "4.1.11", - "magic-string": "^0.30.21", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "@vue/compiler-dom": "3.5.43", + "@vue/shared": "3.5.43" } }, - "node_modules/@vitest/spy": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", - "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", - "dev": true, + "node_modules/@vue/devtools-api": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.10.tgz", + "integrity": "sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==", "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" + "dependencies": { + "@vue/devtools-kit": "^7.7.10" } }, - "node_modules/@vitest/utils": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", - "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", - "dev": true, + "node_modules/@vue/devtools-kit": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.10.tgz", + "integrity": "sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==", "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.11", - "convert-source-map": "^2.0.0", - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vue-flow/background": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@vue-flow/background/-/background-1.3.2.tgz", - "integrity": "sha512-eJPhDcLj1wEo45bBoqTXw1uhl0yK2RaQGnEINqvvBsAFKh/camHJd5NPmOdS1w+M9lggc9igUewxaEd3iCQX2w==", - "license": "MIT", - "peerDependencies": { - "@vue-flow/core": "^1.23.0", - "vue": "^3.3.0" + "@vue/devtools-shared": "^7.7.10", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" } }, - "node_modules/@vue-flow/core": { - "version": "1.48.2", - "resolved": "https://registry.npmjs.org/@vue-flow/core/-/core-1.48.2.tgz", - "integrity": "sha512-raxhgKWE+G/mcEvXJjGFUDYW9rAI3GOtiHR3ZkNpwBWuIaCC1EYiBmKGwJOoNzVFgwO7COgErnK7i08i287AFA==", + "node_modules/@vue/devtools-shared": { + "version": "7.7.10", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.10.tgz", + "integrity": "sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==", "license": "MIT", "dependencies": { - "@vueuse/core": "^10.5.0", - "d3-drag": "^3.0.0", - "d3-interpolate": "^3.0.1", - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0" - }, - "peerDependencies": { - "vue": "^3.3.0" + "rfdc": "^1.4.1" } }, - "node_modules/@vue-flow/core/node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", - "license": "MIT" + "node_modules/@vue/reactivity": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.43.tgz", + "integrity": "sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.43" + } }, - "node_modules/@vue-flow/core/node_modules/@vueuse/core": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.1.tgz", - "integrity": "sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==", + "node_modules/@vue/runtime-core": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.43.tgz", + "integrity": "sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==", "license": "MIT", "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "10.11.1", - "@vueuse/shared": "10.11.1", - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "@vue/reactivity": "3.5.43", + "@vue/shared": "3.5.43" } }, - "node_modules/@vue-flow/core/node_modules/@vueuse/metadata": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.1.tgz", - "integrity": "sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==", + "node_modules/@vue/runtime-dom": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.43.tgz", + "integrity": "sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==", "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "dependencies": { + "@vue/reactivity": "3.5.43", + "@vue/runtime-core": "3.5.43", + "@vue/shared": "3.5.43", + "csstype": "^3.2.3" } }, - "node_modules/@vue-flow/core/node_modules/@vueuse/shared": { - "version": "10.11.1", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.1.tgz", - "integrity": "sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==", + "node_modules/@vue/server-renderer": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.43.tgz", + "integrity": "sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==", "license": "MIT", "dependencies": { - "vue-demi": ">=0.14.8" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "@vue/compiler-ssr": "3.5.43", + "@vue/runtime-dom": "3.5.43", + "@vue/shared": "3.5.43" } }, - "node_modules/@vue-flow/minimap": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@vue-flow/minimap/-/minimap-1.5.4.tgz", - "integrity": "sha512-l4C+XTAXnRxsRpUdN7cAVFBennC1sVRzq4bDSpVK+ag7tdMczAnhFYGgbLkUw3v3sY6gokyWwMl8CDonp8eB2g==", + "node_modules/@vue/shared": { + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.43.tgz", + "integrity": "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==", + "license": "MIT" + }, + "node_modules/@vuepic/vue-datepicker": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-11.0.3.tgz", + "integrity": "sha512-sb2adwqwK2PizLQOpxCYps2SwhVT6/ic2HMIOqHJXuYa6iAJZWGL5YVlS7O4aW+sk6ZyxlDURLO7kDZPL4HB/w==", "license": "MIT", "dependencies": { - "d3-selection": "^3.0.0", - "d3-zoom": "^3.0.0" + "date-fns": "^4.1.0" + }, + "engines": { + "node": ">=18.12.0" }, "peerDependencies": { - "@vue-flow/core": "^1.23.0", - "vue": "^3.3.0" + "vue": ">=3.3.0" } }, - "node_modules/@vue-flow/node-resizer": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@vue-flow/node-resizer/-/node-resizer-1.5.1.tgz", - "integrity": "sha512-DNYgXTF39GXPAygVMFmgn5azgFztaWfqbWvv8D/X0HGgeunRrexJ0W94DyXH1rnndGyYAJ0KexEjyelsb+Nlbg==", + "node_modules/@vueuse/components": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-14.4.0.tgz", + "integrity": "sha512-USgxljmrGUTjtMJcOCbjU7SlRP6K1i5inM6JgMD8bOBn/oL4dK0XYTtNfWyuo0FgUhtCftIKXi+4vJ8ml+tmqw==", "license": "MIT", "dependencies": { - "d3-drag": "^3.0.0", - "d3-selection": "^3.0.0" + "@vueuse/core": "14.4.0", + "@vueuse/shared": "14.4.0" }, "peerDependencies": { - "@vue-flow/core": "^1.23.0", - "vue": "^3.3.0" + "vue": "^3.5.0" } }, - "node_modules/@vue-macros/common": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-3.1.4.tgz", - "integrity": "sha512-/5Fv+6DgIcM9ajY05ZmKBv+LMX1M9A0X+IUwDRVdt67ciw8OV9bvG2r34p3RiEadlsQybjhKPRKNXDC8Bp23cw==", + "node_modules/@vueuse/core": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.4.0.tgz", + "integrity": "sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==", "license": "MIT", "dependencies": { - "@vue/compiler-sfc": "^3.5.22", - "ast-kit": "^2.1.2", - "local-pkg": "^1.1.2", - "magic-string-ast": "^1.0.2", - "unplugin-utils": "^0.3.0" - }, - "engines": { - "node": ">=20.19.0" + "@types/web-bluetooth": "^0.0.21", + "@vueuse/metadata": "14.4.0", + "@vueuse/shared": "14.4.0" }, "funding": { - "url": "https://github.com/sponsors/vue-macros" + "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "vue": "^2.7.0 || ^3.2.25" - }, - "peerDependenciesMeta": { - "vue": { - "optional": true - } + "vue": "^3.5.0" } }, - "node_modules/@vue/compiler-core": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.42.tgz", - "integrity": "sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==", + "node_modules/@vueuse/metadata": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.4.0.tgz", + "integrity": "sha512-swx/255R6JyHZFJhx845iz5CRWDZdCfvkZOpACWc5+c5WHcG24mv8gUT1WIdFQaHt6dq79rvILd9QnCWiyVm9g==", "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.8", - "@vue/shared": "3.5.42", - "entities": "^7.0.1", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.42.tgz", - "integrity": "sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==", + "node_modules/@vueuse/shared": { + "version": "14.4.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.4.0.tgz", + "integrity": "sha512-JRgY90Sz8DDtPMsaDflvPMp9xYk69JZAmbuDvAquUVXKr2gEjqtzGNTTthLfckH0BzBqvnu31gb4a8TGLRe79g==", "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.42", - "@vue/shared": "3.5.42" + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vue": "^3.5.0" } }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.42.tgz", - "integrity": "sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==", + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.8", - "@vue/compiler-core": "3.5.42", - "@vue/compiler-dom": "3.5.42", - "@vue/compiler-ssr": "3.5.42", - "@vue/shared": "3.5.42", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.21", - "postcss": "^8.5.19", - "source-map-js": "^1.2.1" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.42.tgz", - "integrity": "sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==", + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.42", - "@vue/shared": "3.5.42" + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" } }, - "node_modules/@vue/devtools-api": { - "version": "7.7.10", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.10.tgz", - "integrity": "sha512-KxtEpUOOpFz/qOGRrAwA36QF7DqIA+FXgCYit9mk9wjbaZt0sXOFz81ElOZtKA4HbWHUdwNjZHBFsFFyp5BZiA==", + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "license": "MIT", "dependencies": { - "@vue/devtools-kit": "^7.7.10" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, - "node_modules/@vue/devtools-kit": { - "version": "7.7.10", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.10.tgz", - "integrity": "sha512-3WNi2Kq4tbpVbmhml7RiphmAt0279oh3fKNeWMQIrltfX8Q91b4i5PL8DtyNKdwmcsGrV4fg+erwWOmD05CLIw==", + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "license": "MIT", "dependencies": { - "@vue/devtools-shared": "^7.7.10", - "birpc": "^2.3.0", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.2" + "@xtuc/ieee754": "^1.2.0" } }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.10", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.10.tgz", - "integrity": "sha512-wOPslzB8vTvpxwdaOcR2qAbwmuSP0L+rhpoC6Cf56V3Jip+HWb7PQQXOUPgBNQARpXsbQX/+mvi8kKucmBGRwQ==", - "license": "MIT", + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "dependencies": { - "rfdc": "^1.4.1" + "@xtuc/long": "4.2.2" } }, - "node_modules/@vue/eslint-config-typescript": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-13.0.0.tgz", - "integrity": "sha512-MHh9SncG/sfqjVqjcuFLOLD6Ed4dRAis4HNt0dXASeAuLqIAx4YMB1/m2o4pUKK1vCt8fUvYG8KKX2Ot3BVZTg==", - "dev": true, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "license": "MIT", - "peer": true, "dependencies": { - "@typescript-eslint/eslint-plugin": "^7.1.1", - "@typescript-eslint/parser": "^7.1.1", - "vue-eslint-parser": "^9.3.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "peerDependencies": { - "eslint": "^8.56.0", - "eslint-plugin-vue": "^9.0.0", - "typescript": ">=4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, - "node_modules/@vue/eslint-config-typescript/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", + "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", + "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18.12.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" } }, - "node_modules/@vue/eslint-config-typescript/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/@webpack-cli/serve": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", + "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", "dev": true, - "license": "Apache-2.0", - "peer": true, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=18.12.0" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/@yr/monotone-cubic-spline": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", + "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", + "license": "MIT" + }, + "node_modules/abbrev": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", + "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/@vue/eslint-config-typescript/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, - "license": "BSD-2-Clause", - "peer": true, + "license": "MIT", "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "event-target-shim": "^5.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6.5" } }, - "node_modules/@vue/eslint-config-typescript/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "peer": true, + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.6" } }, - "node_modules/@vue/eslint-config-typescript/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "node_modules/accepts/node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, - "license": "ISC", + "license": "MIT", "peer": true, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/@vue/eslint-config-typescript/node_modules/vue-eslint-parser": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "node_modules/accepts/node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" + "mime-db": "^1.54.0" }, "engines": { - "node": "^14.17.0 || >=16.0.0" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/@vue/reactivity": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.42.tgz", - "integrity": "sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==", + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", "license": "MIT", - "dependencies": { - "@vue/shared": "3.5.42" + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@vue/runtime-core": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.42.tgz", - "integrity": "sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "devOptional": true, "license": "MIT", - "dependencies": { - "@vue/reactivity": "3.5.42", - "@vue/shared": "3.5.42" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.42.tgz", - "integrity": "sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==", + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.42", - "@vue/runtime-core": "3.5.42", - "@vue/shared": "3.5.42", - "csstype": "^3.2.3" + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" } }, - "node_modules/@vue/server-renderer": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.42.tgz", - "integrity": "sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==", + "node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.42", - "@vue/runtime-dom": "3.5.42", - "@vue/shared": "3.5.42" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@vue/shared": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.42.tgz", - "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==", - "license": "MIT" - }, - "node_modules/@vuepic/vue-datepicker": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-11.0.3.tgz", - "integrity": "sha512-sb2adwqwK2PizLQOpxCYps2SwhVT6/ic2HMIOqHJXuYa6iAJZWGL5YVlS7O4aW+sk6ZyxlDURLO7kDZPL4HB/w==", + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "license": "MIT", "dependencies": { - "date-fns": "^4.1.0" - }, - "engines": { - "node": ">=18.12.0" + "ajv": "^8.0.0" }, "peerDependencies": { - "vue": ">=3.3.0" + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, - "node_modules/@vueuse/components": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-14.4.0.tgz", - "integrity": "sha512-USgxljmrGUTjtMJcOCbjU7SlRP6K1i5inM6JgMD8bOBn/oL4dK0XYTtNfWyuo0FgUhtCftIKXi+4vJ8ml+tmqw==", + "node_modules/ajv-formats-draft2019": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ajv-formats-draft2019/-/ajv-formats-draft2019-1.6.1.tgz", + "integrity": "sha512-JQPvavpkWDvIsBp2Z33UkYCtXCSpW4HD3tAZ+oL4iEFOk9obQZffx0yANwECt6vzr6ET+7HN5czRyqXbnq/u0Q==", + "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "@vueuse/core": "14.4.0", - "@vueuse/shared": "14.4.0" + "punycode": "^2.1.1", + "schemes": "^1.4.0", + "smtp-address-parser": "^1.0.3", + "uri-js": "^4.4.1" }, "peerDependencies": { - "vue": "^3.5.0" + "ajv": "*" } }, - "node_modules/@vueuse/core": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.4.0.tgz", - "integrity": "sha512-X4WHz1HlCzCBoYXesUkifzzWBAcZgXG8Fi5iNPQg/epdzOB3gu8Fawj3hvuwYR1nGcXGnvxwYYcUC/71++svtQ==", + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "license": "MIT", "dependencies": { - "@types/web-bluetooth": "^0.0.21", - "@vueuse/metadata": "14.4.0", - "@vueuse/shared": "14.4.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "fast-deep-equal": "^3.1.3" }, "peerDependencies": { - "vue": "^3.5.0" + "ajv": "^8.8.2" } }, - "node_modules/@vueuse/metadata": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-14.4.0.tgz", - "integrity": "sha512-swx/255R6JyHZFJhx845iz5CRWDZdCfvkZOpACWc5+c5WHcG24mv8gUT1WIdFQaHt6dq79rvILd9QnCWiyVm9g==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "peer": true, + "bin": { + "ansi-html": "bin/ansi-html" } }, - "node_modules/@vueuse/shared": { - "version": "14.4.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-14.4.0.tgz", - "integrity": "sha512-JRgY90Sz8DDtPMsaDflvPMp9xYk69JZAmbuDvAquUVXKr2gEjqtzGNTTthLfckH0BzBqvnu31gb4a8TGLRe79g==", + "node_modules/ansi-regex": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", + "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "devOptional": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "engines": { + "node": ">=12" }, - "peerDependencies": { - "vue": "^3.5.0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "devOptional": true, "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "node_modules/anynum": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", + "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], "license": "MIT" }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "node_modules/apexcharts": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.7.0.tgz", + "integrity": "sha512-iZSrrBGvVlL+nt2B1NpqfDuBZ9jX61X9I2+XV0hlYXHtTwhwLTHDKGXjNXAgFBDLuvSYCB/rq2nPWVPRv2DrGA==", "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" + "@svgdotjs/svg.draggable.js": "^3.0.4", + "@svgdotjs/svg.filter.js": "^3.0.8", + "@svgdotjs/svg.js": "^3.2.4", + "@svgdotjs/svg.resize.js": "^2.0.2", + "@svgdotjs/svg.select.js": "^4.0.1", + "@yr/monotone-cubic-spline": "^1.0.3" } }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "engines": { + "node": ">=14" } }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "devOptional": true, + "license": "Python-2.0" }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", + "node_modules/asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "license": "MIT", "dependencies": { - "@xtuc/long": "4.2.2" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "dev": true, "license": "MIT" }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=12.0.0" } }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "node_modules/assert": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "engines": { + "node": ">=12" } }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "node_modules/ast-kit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", + "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@babel/parser": "^7.28.5", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" } }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "node_modules/ast-walker-scope": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.9.0.tgz", + "integrity": "sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==", "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" + "@babel/parser": "^7.29.2", + "@babel/types": "^7.29.0", + "ast-kit": "^2.2.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" } }, - "node_modules/@webpack-cli/configtest": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", - "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", - "dev": true, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "devOptional": true, "license": "MIT", "engines": { - "node": ">=18.12.0" - }, - "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" + "node": ">=8" } }, - "node_modules/@webpack-cli/info": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", - "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { - "node": ">=18.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz", + "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==", + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/axios-retry": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-4.5.0.tgz", + "integrity": "sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==", + "license": "Apache-2.0", + "dependencies": { + "is-retry-allowed": "^2.2.0" }, "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" + "axios": "0.x || 1.x" } }, - "node_modules/@webpack-cli/serve": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", - "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", + "node_modules/babel-loader": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.1.1.tgz", + "integrity": "sha512-JwKSzk2kjIe7mgPK+/lyZ2QAaJcpahNAdM+hgR2HI8D0OJVkdj8Rl6J3kaLYki9pwF7P2iWnD8qVv80Lq1ABtg==", "dev": true, "license": "MIT", + "dependencies": { + "find-up": "^5.0.0" + }, "engines": { - "node": ">=18.12.0" + "node": "^18.20.0 || ^20.10.0 || >=22.0.0" }, "peerDependencies": { - "webpack": "^5.82.0", - "webpack-cli": "6.x.x" + "@babel/core": "^7.12.0 || ^8.0.0-beta.1", + "@rspack/core": "^1.0.0 || ^2.0.0-0", + "webpack": ">=5.61.0" }, "peerDependenciesMeta": { - "webpack-dev-server": { + "@rspack/core": { + "optional": true + }, + "webpack": { "optional": true } } }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, - "node_modules/@yr/monotone-cubic-spline": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz", - "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==", - "license": "MIT" - }, - "node_modules/abbrev": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz", - "integrity": "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==", - "dev": true, - "license": "ISC", - "optional": true, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.17", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "dev": true, "license": "MIT", "dependencies": { - "event-target-shim": "^5.0.0" + "@babel/compat-data": "^7.28.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", + "semver": "^6.3.1" }, - "engines": { - "node": ">=6.5" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", + "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" + "@babel/helper-define-polyfill-provider": "^0.6.8", + "core-js-compat": "^3.48.0" }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.6" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/accepts/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" + "@babel/helper-define-polyfill-provider": "^0.6.8" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/acorn": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", - "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "devOptional": true, "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": "18 || 20 || >=22" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } + "peer": true }, - "node_modules/ajv-formats-draft2019": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ajv-formats-draft2019/-/ajv-formats-draft2019-1.6.1.tgz", - "integrity": "sha512-JQPvavpkWDvIsBp2Z33UkYCtXCSpW4HD3tAZ+oL4iEFOk9obQZffx0yANwECt6vzr6ET+7HN5czRyqXbnq/u0Q==", + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "punycode": "^2.1.1", - "schemes": "^1.4.0", - "smtp-address-parser": "^1.0.3", - "uri-js": "^4.4.1" - }, - "peerDependencies": { - "ajv": "*" + "file-uri-to-path": "1.0.0" } }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "peer": true, - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "devOptional": true, "license": "MIT", + "optional": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "node_modules/anynum": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz", - "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==", + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], - "license": "MIT" - }, - "node_modules/apexcharts": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-4.7.0.tgz", - "integrity": "sha512-iZSrrBGvVlL+nt2B1NpqfDuBZ9jX61X9I2+XV0hlYXHtTwhwLTHDKGXjNXAgFBDLuvSYCB/rq2nPWVPRv2DrGA==", "license": "MIT", + "optional": true, "dependencies": { - "@svgdotjs/svg.draggable.js": "^3.0.4", - "@svgdotjs/svg.filter.js": "^3.0.8", - "@svgdotjs/svg.js": "^3.2.4", - "@svgdotjs/svg.resize.js": "^2.0.2", - "@svgdotjs/svg.select.js": "^4.0.1", - "@yr/monotone-cubic-spline": "^1.0.3" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "license": "MIT", - "peer": true, + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, "engines": { - "node": ">=14" + "node": ">= 6" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "devOptional": true, - "license": "Python-2.0" + "node_modules/blurhash": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==", + "license": "MIT" }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", - "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "node_modules/bn.js": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", + "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", + "dev": true, + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "call-bound": "^1.0.3", - "is-array-buffer": "^3.0.5" + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/array-includes": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", - "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.0", - "es-object-atoms": "^1.1.1", - "get-intrinsic": "^1.3.0", - "is-string": "^1.1.1", - "math-intrinsics": "^1.1.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", - "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "node_modules/bonjour-service": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.4.tgz", + "integrity": "sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-shim-unscopables": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", - "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", - "dev": true, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "devOptional": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "20 || >=22" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", - "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", - "dev": true, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-shim-unscopables": "^1.0.2" + "fill-range": "^7.1.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", - "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT" }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "license": "MIT", "dependencies": { - "bn.js": "^4.0.0", + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "safe-buffer": "^5.0.1" } }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/asn1js": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", - "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, - "license": "BSD-3-Clause", - "peer": true, + "license": "MIT", "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.5", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "node_modules/assert": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", - "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "is-nan": "^1.3.2", - "object-is": "^1.1.5", - "object.assign": "^4.1.4", - "util": "^0.12.5" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/browserify-rsa": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", + "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-kit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-2.2.0.tgz", - "integrity": "sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==", - "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.5", - "pathe": "^2.0.3" + "bn.js": "^5.2.1", + "randombytes": "^2.1.0", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" + "node": ">= 0.10" } }, - "node_modules/ast-walker-scope": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.9.0.tgz", - "integrity": "sha512-IJdzo2vLiElBxKzwS36VsCue/62d6IdWjnPB2v3nuPKeWGynp6FF/CYoLa5i/3jXH/z97ZDdsXz6abpgM6w07A==", - "license": "MIT", + "node_modules/browserify-sign": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.6.tgz", + "integrity": "sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==", + "dev": true, + "license": "ISC", "dependencies": { - "@babel/parser": "^7.29.2", - "@babel/types": "^7.29.0", - "ast-kit": "^2.2.0" + "bn.js": "^5.2.3", + "browserify-rsa": "^4.1.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.6.1", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.9", + "readable-stream": "^2.3.8", + "safe-buffer": "^5.2.1" }, "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" + "node": ">= 0.10" } }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "node_modules/browserify-sign/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/async-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", - "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, "license": "MIT" }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/browserify-sign/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "safe-buffer": "~5.1.0" } }, - "node_modules/axe-core": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.13.0.tgz", - "integrity": "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==", - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", - "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.6", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, - "node_modules/babel-loader": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-10.1.1.tgz", - "integrity": "sha512-JwKSzk2kjIe7mgPK+/lyZ2QAaJcpahNAdM+hgR2HI8D0OJVkdj8Rl6J3kaLYki9pwF7P2iWnD8qVv80Lq1ABtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^5.0.0" - }, - "engines": { - "node": "^18.20.0 || ^20.10.0 || >=22.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0 || ^8.0.0-beta.1", - "@rspack/core": "^1.0.0 || ^2.0.0-0", - "webpack": ">=5.61.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", - "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.8", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.2.tgz", - "integrity": "sha512-coWpDLJ410R781Npmn/SIBZEsAetR4xVi0SxLMXPaMO4lSf1MwnkGYMtkFxew0Dn8B3/CpbpYxN0JCgg8mn67g==", + "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8", - "core-js-compat": "^3.48.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } + "license": "MIT" }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", - "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.8" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "pako": "~1.0.5" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base-64": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", - "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", "funding": [ { - "type": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, { - "type": "consulting", - "url": "https://feross.org/support" + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.11.20", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", - "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, "bin": { - "baseline-browser-mapping": "dist/cli.cjs" + "browserslist": "cli.js" }, "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/birpc": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", - "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/bl/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -7870,272 +6966,186 @@ } ], "license": "MIT", - "optional": true, "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, - "node_modules/bl/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" }, - "node_modules/blurhash": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", - "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==", + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", + "dev": true, "license": "MIT" }, - "node_modules/bn.js": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.5.tgz", - "integrity": "sha512-Vq886eXykuP5E6HcKSSStP3bJgrE6In5WKxVUvJ8XGpWWYs2xZHWqUwzCtGgEtBcxyd57KBFDPFoUfNzdaHCNg==", + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", "dev": true, "license": "MIT" }, - "node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "bytes": "^3.1.2", - "content-type": "^2.0.0", - "debug": "^4.4.3", - "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", - "on-finished": "^2.4.1", - "qs": "^6.15.2", - "raw-body": "^3.0.2", - "type-is": "^2.1.0" + "run-applescript": "^7.0.0" }, "engines": { "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", - "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "node_modules/byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/byte-length/-/byte-length-1.0.2.tgz", + "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 0.8" } }, - "node_modules/bonjour-service": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.4.tgz", - "integrity": "sha512-jCZcVv7eoc4QesRscwEZtSROBen+6LpKAmBIsQYQrsAeVHLyMXWX/t6eIV5KiRZYNUBl8eVqImEEMQ8L5+c/Kw==", + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "devOptional": true, - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/cacache": { + "version": "19.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", + "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", "dev": true, - "license": "MIT", + "license": "ISC", + "optional": true, "dependencies": { - "fill-range": "^7.1.1" + "@npmcli/fs": "^4.0.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^12.0.0", + "tar": "^7.4.3", + "unique-filename": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", "dev": true, - "license": "MIT" + "license": "ISC", + "optional": true }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "devOptional": true, "license": "MIT", "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" } }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "node_modules/call-bind": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/browserify-des": { + "node_modules/call-bind-apply-helpers": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-rsa": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.1.tgz", - "integrity": "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "bn.js": "^5.2.1", - "randombytes": "^2.1.0", - "safe-buffer": "^5.2.1" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" } }, - "node_modules/browserify-sign": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.6.tgz", - "integrity": "sha512-sd+Q65fjlWCYWtZKXiKfrUc8d+4jtp/8f0W2NkwzLtoW4bI6UDnWusLWIurHnmurW0XShIRxpwiOX4EoPtXUAg==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "bn.js": "^5.2.3", - "browserify-rsa": "^4.1.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.6.1", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.9", - "readable-stream": "^2.3.8", - "safe-buffer": "^5.2.1" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/browserify-sign/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/browserify-sign/node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-sign/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/browserify-sign/node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "license": "MIT" - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "devOptional": true, "license": "MIT", - "dependencies": { - "pako": "~1.0.5" + "engines": { + "node": ">=6" } }, - "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", "funding": [ { "type": "opencollective", @@ -8143,433 +7153,162 @@ }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } + "license": "CC-BY-4.0" }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "node_modules/chai": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", + "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=18" } }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/builtins": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/builtins/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "run-applescript": "^7.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=18" - }, + "node": ">=8" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/byte-length/-/byte-length-1.0.2.tgz", - "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==", - "license": "MIT" + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/bytestreamjs": { + "node_modules/character-reference-invalid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "dev": true, + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "license": "BSD-3-Clause", - "peer": true, "engines": { - "node": ">=6.0.0" + "node": "*" } }, - "node_modules/cacache": { - "version": "19.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz", - "integrity": "sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ==", - "dev": true, - "license": "ISC", - "optional": true, + "node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "license": "MIT", "dependencies": { - "@npmcli/fs": "^4.0.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^7.0.2", - "ssri": "^12.0.0", - "tar": "^7.4.3", - "unique-filename": "^4.0.0" + "readdirp": "^5.0.0" }, "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/cacache/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/cacheable": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", - "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "license": "MIT", - "dependencies": { - "@cacheable/memory": "^2.2.0", - "@cacheable/utils": "^2.5.0", - "hookified": "^1.15.0", - "keyv": "^5.6.0", - "qified": "^0.10.1" + "license": "BlueOak-1.0.0", + "optional": true, + "engines": { + "node": ">=18" } }, - "node_modules/cacheable/node_modules/keyv": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", - "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", - "dev": true, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "license": "MIT", - "dependencies": { - "@keyv/serialize": "^1.1.1" + "engines": { + "node": ">=6.0" } }, - "node_modules/call-bind": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", - "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "node_modules/cipher-base": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", + "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "get-intrinsic": "^1.3.0", - "set-function-length": "^1.2.2" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1", + "to-buffer": "^1.2.2" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cancelable-promise": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/cancelable-promise/-/cancelable-promise-4.3.1.tgz", - "integrity": "sha512-A/8PwLk/T7IJDfUdQ68NR24QHa8rIlnN/stiJEBo6dmVUkD4K14LswG0w3VwdeK/o7qOwRUR1k2MhK5Rpy2m7A==", - "license": "MIT" - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001810", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", - "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/ccount": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", - "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-html4": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", - "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-entities-legacy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", - "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/character-reference-invalid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", - "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "license": "BSD-3-Clause", - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "dev": true, - "license": "BlueOak-1.0.0", - "optional": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.7.tgz", - "integrity": "sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.2" - }, - "engines": { - "node": ">= 0.10" + "node": ">= 0.10" } }, "node_modules/clone": { @@ -8648,7 +7387,7 @@ "version": "2.10.0", "resolved": "https://registry.npmjs.org/colord/-/colord-2.10.0.tgz", "integrity": "sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/colorette": { @@ -8684,19 +7423,17 @@ "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "dev": true, "license": "MIT", "engines": { "node": ">=20" } }, "node_modules/comment-parser": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", - "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.7.tgz", + "integrity": "sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 12.0.0" } @@ -8765,13 +7502,6 @@ "node": ">= 0.6" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true, - "license": "MIT" - }, "node_modules/confbox": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", @@ -8914,7 +7644,7 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz", "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.1", @@ -9045,7 +7775,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.3.3.tgz", "integrity": "sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -9104,7 +7834,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "mdn-data": "2.27.1", @@ -9247,92 +7977,35 @@ "node": ">= 12" } }, - "node_modules/data-view-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", - "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", - "dev": true, + "node_modules/date-fns": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz", + "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==", "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" } }, - "node_modules/data-view-byte-length": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", - "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", - "dev": true, + "node_modules/debounce": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-3.0.0.tgz", + "integrity": "sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==", "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/inspect-js" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/data-view-byte-offset": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", - "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", - "dev": true, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", - "peer": true, "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/date-fns": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.4.0.tgz", - "integrity": "sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/debounce": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-3.0.0.tgz", - "integrity": "sha512-64byRbF0/AirwbuHqB3/ZpMG9/nckDa6ZA0yd6UnaQNwbbemCOwvz2sL5sjXLHhZHADyiwLm0M5qMhltUUx+TA==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -9353,603 +8026,86 @@ }, "funding": { "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/default-browser": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", - "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dexie": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/dexie/-/dexie-4.4.5.tgz", - "integrity": "sha512-wWCHdihT3dmlUSuNhn5mMZDWSpG0suxjAni7YjjiZdzabZcKmy3uNZGZ7AeYYXBoLbpSXX35fikPLkPC44Osiw==", - "license": "Apache-2.0" - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "devOptional": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/domain-browser": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-5.7.0.tgz", - "integrity": "sha512-edTFu0M/7wO1pXY6GDxVNVW086uqwWYIHP98txhcPyV995X21JIH2DtYp33sQJOupYoXKe9RwTw2Ya2vWaquTQ==", - "dev": true, - "license": "Artistic-2.0", - "engines": { - "node": ">=4" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause", - "peer": true - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/dompurify": { - "version": "3.4.14", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.14.tgz", - "integrity": "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optionalDependencies": { - "@types/trusted-types": "^2.0.7" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/electron-to-chromium": { - "version": "1.5.416", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.416.tgz", - "integrity": "sha512-K6bvB2BjnNrugtIih6ewlbBI9DXa976jIdiIlRLHhBoEI9a4JaQjjHyF+A1IQI543aQYR4LnmOrT/K5fZj0aPA==", - "license": "ISC" - }, - "node_modules/elliptic": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", - "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.5", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", - "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-mart-vue-fast": { - "version": "15.0.5", - "resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-15.0.5.tgz", - "integrity": "sha512-wnxLor8ggpqshoOPwIc33MdOC3A1XFeDLgUwYLPtNPL8VeAtXJAVrnFq1CN5PeCYAFoLo4IufHQZ9CfHD4IZiw==", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.18.6", - "core-js": "^3.23.5" - }, - "peerDependencies": { - "vue": ">2.0.0" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "once": "^1.4.0" + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/enhanced-resolve": { - "version": "5.24.5", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz", - "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==", + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, "license": "MIT", + "optional": true, "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" + "mimic-response": "^3.1.0" }, "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", - "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" + "node": ">=10" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": ">=6" + "node": ">=4.0.0" } }, - "node_modules/envinfo": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", - "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/default-browser": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.1.tgz", + "integrity": "sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==", "dev": true, "license": "MIT", - "bin": { - "envinfo": "dist/cli.js" + "peer": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "node_modules/default-browser-id": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", + "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", "dev": true, "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" + "peer": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/es-abstract": { - "version": "1.24.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", - "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "array-buffer-byte-length": "^1.0.2", - "arraybuffer.prototype.slice": "^1.0.4", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "data-view-buffer": "^1.0.2", - "data-view-byte-length": "^1.0.2", - "data-view-byte-offset": "^1.0.1", - "es-define-property": "^1.0.1", + "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "es-set-tostringtag": "^2.1.0", - "es-to-primitive": "^1.3.0", - "function.prototype.name": "^1.1.8", - "get-intrinsic": "^1.3.0", - "get-proto": "^1.0.1", - "get-symbol-description": "^1.1.0", - "globalthis": "^1.0.4", - "gopd": "^1.2.0", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "internal-slot": "^1.1.0", - "is-array-buffer": "^3.0.5", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.2", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.2.1", - "is-set": "^2.0.3", - "is-shared-array-buffer": "^1.0.4", - "is-string": "^1.1.1", - "is-typed-array": "^1.1.15", - "is-weakref": "^1.1.1", - "math-intrinsics": "^1.1.0", - "object-inspect": "^1.13.4", - "object-keys": "^1.1.1", - "object.assign": "^4.1.7", - "own-keys": "^1.0.1", - "regexp.prototype.flags": "^1.5.4", - "safe-array-concat": "^1.1.3", - "safe-push-apply": "^1.0.0", - "safe-regex-test": "^1.1.0", - "set-proto": "^1.0.0", - "stop-iteration-iterator": "^1.1.0", - "string.prototype.trim": "^1.2.10", - "string.prototype.trimend": "^1.0.9", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.3", - "typed-array-byte-length": "^1.0.3", - "typed-array-byte-offset": "^1.0.4", - "typed-array-length": "^1.0.7", - "unbox-primitive": "^1.1.0", - "which-typed-array": "^1.1.19" + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -9958,18 +8114,30 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-abstract-get": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", - "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "license": "MIT", "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.2", - "is-callable": "^1.2.7", - "object-inspect": "^1.13.4" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -9978,616 +8146,492 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=0.4.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.4" + "node": ">= 0.8" } }, - "node_modules/es-module-lexer": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", - "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/es-shim-unscopables": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", - "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "node_modules/detect-indent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz", + "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "hasown": "^2.0.2" + "engines": { + "node": ">=12.20" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/es-to-primitive": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", - "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", + "node_modules/detect-newline": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", + "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "es-abstract-get": "^1.0.0", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "is-callable": "^1.2.7", - "is-date-object": "^1.1.0", - "is-symbol": "^1.1.1" - }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", - "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", - "devOptional": true, - "hasInstallScript": true, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" + "dependencies": { + "dequal": "^2.0.0" }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.2", - "@esbuild/android-arm": "0.28.2", - "@esbuild/android-arm64": "0.28.2", - "@esbuild/android-x64": "0.28.2", - "@esbuild/darwin-arm64": "0.28.2", - "@esbuild/darwin-x64": "0.28.2", - "@esbuild/freebsd-arm64": "0.28.2", - "@esbuild/freebsd-x64": "0.28.2", - "@esbuild/linux-arm": "0.28.2", - "@esbuild/linux-arm64": "0.28.2", - "@esbuild/linux-ia32": "0.28.2", - "@esbuild/linux-loong64": "0.28.2", - "@esbuild/linux-mips64el": "0.28.2", - "@esbuild/linux-ppc64": "0.28.2", - "@esbuild/linux-riscv64": "0.28.2", - "@esbuild/linux-s390x": "0.28.2", - "@esbuild/linux-x64": "0.28.2", - "@esbuild/netbsd-arm64": "0.28.2", - "@esbuild/netbsd-x64": "0.28.2", - "@esbuild/openbsd-arm64": "0.28.2", - "@esbuild/openbsd-x64": "0.28.2", - "@esbuild/openharmony-arm64": "0.28.2", - "@esbuild/sunos-x64": "0.28.2", - "@esbuild/win32-arm64": "0.28.2", - "@esbuild/win32-ia32": "0.28.2", - "@esbuild/win32-x64": "0.28.2" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dexie": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/dexie/-/dexie-4.4.6.tgz", + "integrity": "sha512-hJP/BO6mjB+tX6hToIO1kmxYLNmun90wYbfcoAoLpKEyDYal/k33dg0TAfoUe2TDsbbLoVIzljJ3BN2UbR5EOg==", + "license": "Apache-2.0" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, "engines": { "node": ">=6" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "devOptional": true, "license": "MIT", - "engines": { - "node": ">=10" + "peer": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "node_modules/dom-serializer/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "devOptional": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, + "license": "BSD-2-Clause", + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.12" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/eslint-compat-utils": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", - "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "node_modules/domain-browser": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-5.7.0.tgz", + "integrity": "sha512-edTFu0M/7wO1pXY6GDxVNVW086uqwWYIHP98txhcPyV995X21JIH2DtYp33sQJOupYoXKe9RwTw2Ya2vWaquTQ==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "semver": "^7.5.4" - }, + "license": "Artistic-2.0", "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/eslint-compat-utils/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" + "node": ">=4" }, - "engines": { - "node": ">=10" + "funding": { + "url": "https://bevry.me/fund" } }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "devOptional": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" + "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", + "license": "BSD-2-Clause", + "peer": true + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "devOptional": true, + "license": "BSD-2-Clause", "peer": true, - "engines": { - "node": ">=12.0.0" + "dependencies": { + "domelementtype": "^2.3.0" }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/eslint-import-resolver-alias": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-alias/-/eslint-import-resolver-alias-1.1.2.tgz", - "integrity": "sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==", - "dev": true, - "license": "MIT", "engines": { "node": ">= 4" }, - "peerDependencies": { - "eslint-plugin-import": ">=1.4.0" + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "node_modules/eslint-import-resolver-exports": { - "version": "1.0.0-beta.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-exports/-/eslint-import-resolver-exports-1.0.0-beta.5.tgz", - "integrity": "sha512-o6t0w7muUpXr7MkUVzD5igQoDfAQvTmcPp8HEAJdNF8eOuAO+yn6I/TTyMxz9ecCwzX7e02vzlkHURoScUuidg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "MIT", + "node_modules/dompurify": { + "version": "3.4.14", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.14.tgz", + "integrity": "sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "devOptional": true, + "license": "BSD-2-Clause", "peer": true, "dependencies": { - "resolve.exports": "^2.0.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", - "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", - "dev": true, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", - "peer": true, "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.16.1", - "resolve": "^2.0.0-next.6" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" } }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "ms": "^2.1.1" - } + "optional": true }, - "node_modules/eslint-import-resolver-node/node_modules/resolve": { - "version": "2.0.0-next.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", - "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.417", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.417.tgz", + "integrity": "sha512-4T+DTDWuMPM4aHlHwWdAVCVWwp7LDilnhzkj+c/Lbj91XSQrLuOmZSLtS9Q4iIqjlPUbPOnC624zDVVHCHaolQ==", + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.2", - "node-exports-info": "^1.6.0", - "object-keys": "^1.1.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", - "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", "dev": true, - "license": "ISC", - "peer": true, + "license": "MIT" + }, + "node_modules/emoji-mart-vue-fast": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/emoji-mart-vue-fast/-/emoji-mart-vue-fast-15.0.5.tgz", + "integrity": "sha512-wnxLor8ggpqshoOPwIc33MdOC3A1XFeDLgUwYLPtNPL8VeAtXJAVrnFq1CN5PeCYAFoLo4IufHQZ9CfHD4IZiw==", + "license": "BSD-3-Clause", "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.4.0", - "get-tsconfig": "^4.10.0", - "is-bun-module": "^2.0.0", - "stable-hash": "^0.0.5", - "tinyglobby": "^0.2.13", - "unrs-resolver": "^1.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-import-resolver-typescript" + "@babel/runtime": "^7.18.6", + "core-js": "^3.23.5" }, "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } + "vue": ">2.0.0" } }, - "node_modules/eslint-module-utils": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", - "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "license": "MIT", "peer": true, - "dependencies": { - "debug": "^3.2.7" - }, "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">= 0.8" } }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "license": "MIT", - "peer": true, + "optional": true, "dependencies": { - "ms": "^2.1.1" + "iconv-lite": "^0.6.2" } }, - "node_modules/eslint-plugin-es-x": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", - "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", "dev": true, - "funding": [ - "https://github.com/sponsors/ota-meshi", - "https://opencollective.com/eslint" - ], "license": "MIT", - "peer": true, + "optional": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.11.0", - "eslint-compat-utils": "^0.5.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": ">=8" + "once": "^1.4.0" } }, - "node_modules/eslint-plugin-import": { - "version": "2.32.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", - "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", - "dev": true, + "node_modules/enhanced-resolve": { + "version": "5.25.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", + "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", "license": "MIT", - "peer": true, "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.9", - "array.prototype.findlastindex": "^1.2.6", - "array.prototype.flat": "^1.3.3", - "array.prototype.flatmap": "^1.3.3", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.1", - "hasown": "^2.0.2", - "is-core-module": "^2.16.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.1", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.9", - "tsconfig-paths": "^3.15.0" + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" }, "engines": { - "node": ">=4" + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "devOptional": true, "license": "MIT", - "peer": true, - "dependencies": { - "ms": "^2.1.1" + "engines": { + "node": ">=6" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/envinfo": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", + "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "esutils": "^2.0.2" + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/eslint-plugin-jsdoc": { - "version": "46.10.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.10.1.tgz", - "integrity": "sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag==", + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", "dev": true, - "license": "BSD-3-Clause", - "peer": true, + "license": "MIT", + "optional": true + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "devOptional": true, + "license": "MIT", "dependencies": { - "@es-joy/jsdoccomment": "~0.41.0", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.1", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.4", - "spdx-expression-parse": "^4.0.0" - }, + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { - "node": ">=16" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "node": ">= 0.4" } }, - "node_modules/eslint-plugin-jsdoc/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/eslint-plugin-n": { - "version": "16.6.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", - "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", - "dev": true, + "node_modules/es-module-lexer": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", - "peer": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.5.0", - "get-tsconfig": "^4.7.0", - "globals": "^13.24.0", - "ignore": "^5.2.4", - "is-builtin-module": "^3.2.1", - "is-core-module": "^2.12.1", - "minimatch": "^3.1.2", - "resolve": "^1.22.2", - "semver": "^7.5.3" + "es-errors": "^1.3.0" }, "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "node": ">= 0.4" } }, - "node_modules/eslint-plugin-n/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "license": "MIT", - "peer": true, "dependencies": { - "type-fest": "^0.20.2" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "node_modules/eslint-plugin-n/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/eslint-plugin-n/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "peer": true, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "devOptional": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -10595,125 +8639,159 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint-plugin-promise": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.6.0.tgz", - "integrity": "sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==", - "dev": true, - "license": "ISC", - "peer": true, + "node_modules/eslint": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.10.0.tgz", + "integrity": "sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==", + "devOptional": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "11.1.5 || >11.1.6 <12", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://eslint.org/donate" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } } }, - "node_modules/eslint-plugin-vue": { - "version": "9.33.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.33.0.tgz", - "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", - "devOptional": true, + "node_modules/eslint-config-flat-gitignore": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-2.4.0.tgz", + "integrity": "sha512-JhYC+V7qEDiCDsbJcVP8fxNc62fk4+i91YLP/YvmVHlkaQ8Xo99olYN8MO5COdxl7onGlsrfZVONe5NYsZP1UA==", + "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "globals": "^13.24.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.3", - "vue-eslint-parser": "^9.4.3", - "xml-name-validator": "^4.0.0" + "@eslint/compat": "^2.1.0" }, - "engines": { - "node": "^14.17.0 || >=16.0.0" + "funding": { + "url": "https://github.com/sponsors/antfu" }, "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + "eslint": "^9.5.0 || ^10.0.0" } }, - "node_modules/eslint-plugin-vue/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "devOptional": true, - "license": "BSD-2-Clause", + "node_modules/eslint-plugin-antfu": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-antfu/-/eslint-plugin-antfu-3.2.3.tgz", + "integrity": "sha512-U2fnz/H0gFPxpuC7QpaHa0Jv2AgCZ5hunp36SOP/yWo8yFzgvMh8X4pZ4uN4IKoqtBhk7G3HuVa93Urf51+sZg==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "63.3.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.3.3.tgz", + "integrity": "sha512-xI4IeVRzRFA2DGHrPLIxF3U+oJHU3FE+P9Zb27fVs5dPHgfcpoAs0PyCbznVhK7pwR+9BPUztFeXSgpw/CL4Yg==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@es-joy/jsdoccomment": "~0.91.0", + "@es-joy/resolve.exports": "1.2.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.7", + "debug": "^4.4.3", + "escape-string-regexp": "^4.0.0", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "html-entities": "^2.6.0", + "object-deep-merge": "^2.0.1", + "parse-imports-exports": "^0.2.4", + "semver": "^7.8.5", + "spdx-expression-parse": "^5.0.0", + "to-valid-identifier": "^1.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^22.13.0 || >=24" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/eslint-plugin-vue/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "devOptional": true, + "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-vue/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "devOptional": true, + "node_modules/eslint-plugin-jsdoc/node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-plugin-vue/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-plugin-vue/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-vue/node_modules/semver": { + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "devOptional": true, + "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -10722,102 +8800,109 @@ "node": ">=10" } }, - "node_modules/eslint-plugin-vue/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "devOptional": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-5.0.0.tgz", + "integrity": "sha512-vngmw3Rgn+o2arXNbnZaj5UtOEBuWBfvaI+Wc8GFfykIhA5/vdK9/Sp/XkLv63dykz2rxKDvKEHupF5P0FORcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/eslint-plugin-vue/node_modules/vue-eslint-parser": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", - "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", - "devOptional": true, + "node_modules/eslint-plugin-perfectionist": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.11.0.tgz", + "integrity": "sha512-kZV1otBcu4xT5R1p+0x1N1wRv4pS+OIbxrA47n5a1fTnN3MWbexOx5eQgbQhGyCNbpvF/rqrbnpkGjumHF+Y0Q==", + "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" + "@typescript-eslint/utils": "^8.68.0", + "natural-orderby": "^5.0.0" }, "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": "^20.0.0 || >=22.0.0" }, "peerDependencies": { - "eslint": ">=6.0.0" + "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, + "node_modules/eslint-plugin-vue": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-10.10.0.tgz", + "integrity": "sha512-dL9x9rBHqqNcByWiLOHK6L0SB97V82/NC0cZRn9cXPjM7pCuWlpQQP9bFH4vjBv80ej1ZpzAkuD8zWH1o9bZbA==", + "devOptional": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "@eslint-community/eslint-utils": "^4.9.1", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^7.1.4", + "semver": "^7.8.5", + "xml-name-validator": "^5.0.0" }, "engines": { - "node": ">=8.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@stylistic/eslint-plugin": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "vue-eslint-parser": "^10.3.0" + }, + "peerDependenciesMeta": { + "@stylistic/eslint-plugin": { + "optional": true + }, + "@typescript-eslint/parser": { + "optional": true + } } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "devOptional": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, "engines": { "node": ">=10" } }, - "node_modules/eslint/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", "devOptional": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "devOptional": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ajv": { @@ -10837,80 +8922,37 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "devOptional": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "devOptional": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", "devOptional": true, "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.9.0", + "acorn": "^8.16.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" + "eslint-visitor-keys": "^5.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10918,19 +8960,6 @@ "devOptional": true, "license": "MIT" }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "devOptional": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -10949,19 +8978,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esquery": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", @@ -10975,16 +8991,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -10998,7 +9004,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -11008,17 +9014,6 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "license": "BSD-2-Clause", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", @@ -11228,7 +9223,7 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -11245,7 +9240,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -11301,10 +9296,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.7.tgz", - "integrity": "sha512-a6Qh1RMCNbSrU1+sAyAAZH3rTe+OaWJbNZIq0S+ifZciUUOQtlVxBJwoTUE2bYhysmG/RYyI5WJFIKdBahJdrQ==", - "dev": true, + "version": "5.11.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.11.1.tgz", + "integrity": "sha512-TBw6K/fxoQGGjCmZDw9w/ZwP3uDcnTM4YH/g+PFRWr8sbe5idXtxNN6vITh4+1ruCZaho6uBFurElsA7F0zzgw==", "funding": [ { "type": "github", @@ -11312,9 +9306,13 @@ } ], "license": "MIT", - "peer": true, "dependencies": { - "strnum": "^1.0.5" + "@nodable/entities": "^3.0.0", + "fast-xml-builder": "^1.2.0", + "is-unsafe": "^2.0.0", + "path-expression-matcher": "^1.6.2", + "strnum": "^2.4.2", + "xml-naming": "^0.3.0" }, "bin": { "fxparser": "src/cli/cli.js" @@ -11324,7 +9322,7 @@ "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 4.9.1" @@ -11340,6 +9338,23 @@ "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fetch-blob": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", @@ -11364,16 +9379,13 @@ } }, "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", "devOptional": true, "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "flat-cache": "^6.1.23" } }, "node_modules/file-uri-to-path": { @@ -11388,7 +9400,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -11448,18 +9460,15 @@ } }, "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", "devOptional": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" } }, "node_modules/flatted": { @@ -11632,28 +9641,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "devOptional": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -11663,42 +9650,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function.prototype.name": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", - "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2", - "hasown": "^2.0.4", - "is-callable": "^1.2.7", - "is-document.all": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/generator-function": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", @@ -11723,7 +9674,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -11769,37 +9720,14 @@ "node": ">= 0.4" } }, - "node_modules/get-symbol-description": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", - "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.14.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", - "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", + "node_modules/git-hooks-list": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-4.2.1.tgz", + "integrity": "sha512-WNvqJjOxxs/8ZP9+DWdwWJ7cDsd60NHf39XnD82pDVrKO5q7xfPqpkK6hwEAmBa/ZSEE4IOoR75EzbbIuwGlMw==", "dev": true, "license": "MIT", - "peer": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" } }, "node_modules/github-from-package": { @@ -11864,6 +9792,14 @@ "tslib": "2" } }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", @@ -11896,7 +9832,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" @@ -11909,7 +9845,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ini": "^1.3.5", @@ -11924,7 +9860,7 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -11934,9 +9870,9 @@ } }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.11.0.tgz", + "integrity": "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==", "dev": true, "license": "MIT", "engines": { @@ -11946,50 +9882,43 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", - "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", - "dev": true, + "node_modules/globby": { + "version": "16.2.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.4.tgz", + "integrity": "sha512-c8B/VNLmxRcmqqenRA9t+9IyOjf9+V6lTxPaUJLqOCONdQkWZ0ETYgX0qbtJqPsgCNusT9MZ5Jeidw8Eb9tn2g==", + "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { - "define-properties": "^1.2.1", - "gopd": "^1.0.1" + "@sindresorhus/merge-streams": "^4.0.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.5", + "is-path-inside": "^4.0.0", + "micromatch": "^4.0.8", + "slash": "^5.1.0", + "unicorn-magic": "^0.4.0" }, "engines": { - "node": ">= 0.4" + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, + "node_modules/globby/node_modules/ignore": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz", + "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==", + "devOptional": true, "license": "MIT", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, "node_modules/globjoin": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/gopd": { @@ -12010,13 +9939,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "devOptional": true, - "license": "MIT" - }, "node_modules/gridstack": { "version": "13.2.0", "resolved": "https://registry.npmjs.org/gridstack/-/gridstack-13.2.0.tgz", @@ -12033,20 +9955,6 @@ ], "license": "MIT" }, - "node_modules/has-bigints": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", - "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -12069,23 +9977,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", - "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "dunder-proto": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -12149,7 +10040,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "hookified": "^1.15.0" @@ -12270,7 +10161,7 @@ "version": "1.15.1", "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/hosted-git-info": { @@ -12302,11 +10193,28 @@ "integrity": "sha512-ECg1JFG0YzehicQaogenlcs2qg6WsXQsxtnbr1i696u5tLUjtJdQAh0u2g0Q5YV45f263Ta1GnUJsc8WIfJf4Q==", "license": "MIT" }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, "node_modules/html-tags": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-5.1.0.tgz", "integrity": "sha512-n6l5uca7/y5joxZ3LUePhzmBFUJ+U2YWzhMa8XUTecSeSlQiZdF5XAd/Q3/WUl0VsXgUwWi8I7CNIwdI5WN1SQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=20.10" @@ -12319,7 +10227,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "dev": true, + "devOptional": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -12340,7 +10248,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, + "devOptional": true, "license": "BSD-2-Clause", "peer": true, "engines": { @@ -12525,7 +10433,7 @@ "version": "5.1.9", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true }, @@ -12570,7 +10478,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz", "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "type": "github", @@ -12587,30 +10495,18 @@ "node": ">=0.8.19" } }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "devOptional": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, + "devOptional": true, "license": "ISC" }, "node_modules/inline-style-parser": { @@ -12619,22 +10515,6 @@ "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", "license": "MIT" }, - "node_modules/internal-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", - "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.2", - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/interpret": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", @@ -12710,89 +10590,7 @@ "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", - "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-async-function": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", - "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "async-function": "^1.0.0", - "call-bound": "^1.0.3", - "get-proto": "^1.0.1", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", - "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-bigints": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", - "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", + "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" }, "engines": { @@ -12802,54 +10600,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "license": "MIT" }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-bun-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", - "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "semver": "^7.7.1" - } - }, - "node_modules/is-bun-module/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -12879,43 +10642,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-view": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", - "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", - "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -12943,23 +10669,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-document.all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", - "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -12970,28 +10679,11 @@ "node": ">=0.10.0" } }, - "node_modules/is-finalizationregistry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", - "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=8" @@ -13074,20 +10766,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -13105,20 +10783,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-network-error": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", @@ -13137,38 +10801,23 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", - "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "devOptional": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-plain-obj": { @@ -13187,7 +10836,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.1.0.tgz", "integrity": "sha512-bUi/yjmtKYcRVUtWRGr0UA6xEFh2I6zWUwMrUXB3s7bmYCaZ8a+0ZsTRkrawh/mzlSD1Y0Ph8bp/U+TvBpWDNw==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "engines": { @@ -13221,53 +10870,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", - "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", - "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", - "dev": true, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-tostringtag": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-svg": { @@ -13285,25 +10897,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-symbol": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", - "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "has-symbols": "^1.1.0", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", @@ -13332,55 +10925,6 @@ ], "license": "MIT" }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", - "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", - "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-wsl": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", @@ -13448,31 +10992,16 @@ "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + }, + "engines": { + "node": ">= 10.13.0" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -13499,14 +11028,13 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-8.0.0.tgz", + "integrity": "sha512-uQu/fXVqVaMg6gM8/E5G5+eygVcZ1NV0Z51CvqhNa2bDWxvHMl484ETr6vph4oPyC+KUcbP/w2W2pewfCiR9aQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { - "node": ">=12.0.0" + "node": ">=20.0.0" } }, "node_modules/jsesc": { @@ -13522,18 +11050,11 @@ "node": ">=6" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "devOptional": true, - "license": "MIT" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/json-schema-traverse": { @@ -13563,20 +11084,20 @@ } }, "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "devOptional": true, "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "@keyv/serialize": "^1.1.1" } }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -13586,7 +11107,7 @@ "version": "0.37.0", "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true }, @@ -13655,11 +11176,273 @@ "node": ">=22" } }, + "node_modules/lightningcss": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", + "devOptional": true, + "license": "MPL-2.0", + "peer": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/linkifyjs": { @@ -13714,18 +11497,11 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "devOptional": true, - "license": "MIT" - }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/longest-streak": { @@ -13842,7 +11618,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-4.0.0.tgz", "integrity": "sha512-aa6AU2Pcx0VP/XWnh8IGL0SYSgQHDT6Ucror2j2mXeFAlN3ahaNs8EZtG1YiticMkSLj3Gt6VPFfZogt7G5iFQ==", - "dev": true, + "devOptional": true, "license": "MIT", "funding": { "type": "github", @@ -14085,7 +11861,7 @@ "version": "2.27.1", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, + "devOptional": true, "license": "CC0-1.0" }, "node_modules/media-typer": { @@ -14135,7 +11911,7 @@ "version": "14.1.0", "resolved": "https://registry.npmjs.org/meow/-/meow-14.1.0.tgz", "integrity": "sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=20" @@ -14168,7 +11944,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">= 8" @@ -14620,7 +12396,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -14630,6 +12406,19 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/miller-rabin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", @@ -14701,16 +12490,19 @@ "license": "MIT" }, "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "devOptional": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.8" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -14719,6 +12511,7 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "license": "MIT", + "optional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15061,23 +12854,6 @@ "license": "MIT", "optional": true }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", - "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -15085,6 +12861,16 @@ "devOptional": true, "license": "MIT" }, + "node_modules/natural-orderby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz", + "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/nearley": { "version": "2.20.1", "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", @@ -15134,12 +12920,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, "node_modules/nested-property": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/nested-property/-/nested-property-4.0.0.tgz", @@ -15178,7 +12958,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "dev": true, "license": "MIT", "optional": true, "peer": true @@ -15203,26 +12982,6 @@ "node": ">=10.5.0" } }, - "node_modules/node-exports-info": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", - "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "array.prototype.flatmap": "^1.3.3", - "es-errors": "^1.3.0", - "object.entries": "^1.1.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/node-fetch": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", @@ -15406,7 +13165,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -15431,6 +13190,13 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/object-deep-merge": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.1.tgz", + "integrity": "sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==", + "dev": true, + "license": "MIT" + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -15492,79 +13258,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.entries": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", - "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", - "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/obug": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz", @@ -15608,7 +13301,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, + "dev": true, "license": "ISC", "dependencies": { "wrappy": "1" @@ -15667,26 +13360,6 @@ "dev": true, "license": "MIT" }, - "node_modules/own-keys": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.2.tgz", - "integrity": "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "object-keys": "^1.1.1", - "safe-push-apply": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -15865,11 +13538,21 @@ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "license": "MIT" }, + "node_modules/parse-imports-exports": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz", + "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-statements": "1.0.11" + } + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -15884,6 +13567,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parse-statements": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz", + "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==", + "dev": true, + "license": "MIT" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -15926,16 +13616,6 @@ "node": ">=14.0.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -15997,16 +13677,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -16044,13 +13714,12 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -16177,28 +13846,25 @@ } }, "node_modules/playwright": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz", - "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", + "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.62.1" + "playwright-core": "1.63.0" }, "bin": { "playwright": "cli.js" }, "engines": { "node": ">=20" - }, - "optionalDependencies": { - "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.62.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz", - "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", + "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -16219,9 +13885,9 @@ } }, "node_modules/postcss": { - "version": "8.5.26", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", - "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", "funding": [ { "type": "opencollective", @@ -16238,7 +13904,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.17", + "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -16250,7 +13916,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-1.8.1.tgz", "integrity": "sha512-OLF6P7qctfAWayOhLpcVnTGqVeJzu2W3WpIYelfz2+JV5oGxfkcEvweN9U4XpeqE0P98dcD9ssusGwlF0TK0uQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -16267,7 +13933,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true }, @@ -16275,7 +13941,7 @@ "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true }, @@ -16310,20 +13976,6 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", - "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-modules-scope": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", @@ -16340,20 +13992,6 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", - "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", @@ -16374,7 +14012,7 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true }, @@ -16382,7 +14020,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "engines": { @@ -16400,7 +14038,7 @@ "version": "4.0.9", "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", - "dev": true, + "devOptional": true, "funding": [ { "type": "opencollective", @@ -16425,9 +14063,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", - "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", + "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -16442,7 +14080,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/powershell-utils": { @@ -16739,7 +14377,7 @@ "version": "0.10.1", "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "hookified": "^2.1.1" @@ -16752,7 +14390,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/qs": { @@ -16935,17 +14573,6 @@ "rc": "cli.js" } }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/readable-stream": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", @@ -16997,30 +14624,6 @@ "license": "Apache-2.0", "peer": true }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", - "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.9", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.7", - "get-proto": "^1.0.1", - "which-builtin-type": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -17041,28 +14644,6 @@ "node": ">=4" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", - "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpu-core": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz", @@ -17216,18 +14797,7 @@ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requireindex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", - "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.5" + "node": ">=0.10.0" } }, "node_modules/requires-port": { @@ -17236,6 +14806,19 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "license": "MIT" }, + "node_modules/reserved-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz", + "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/resolve": { "version": "1.22.12", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", @@ -17291,28 +14874,6 @@ "node": ">=4" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -17352,45 +14913,6 @@ "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "license": "MIT" }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "devOptional": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "devOptional": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/ripemd160": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.3.tgz", @@ -17468,50 +14990,39 @@ "dev": true, "license": "MIT" }, - "node_modules/rollup": { - "version": "4.63.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz", - "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", + "node_modules/rolldown": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.6.tgz", + "integrity": "sha512-vMM4q3aixf46GiF1Kok8jDPFsEpXgFWGjUHXNkNHNm+Y2adXAG2dbX91jkti3i0ZRsOlcmbuzAz1poObSHCmUA==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { - "@types/estree": "1.0.9" + "@oxc-project/types": "=0.147.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { - "rollup": "dist/bin/rollup" + "rolldown": "bin/cli.mjs" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.63.1", - "@rollup/rollup-android-arm64": "4.63.1", - "@rollup/rollup-darwin-arm64": "4.63.1", - "@rollup/rollup-darwin-x64": "4.63.1", - "@rollup/rollup-freebsd-arm64": "4.63.1", - "@rollup/rollup-freebsd-x64": "4.63.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", - "@rollup/rollup-linux-arm-musleabihf": "4.63.1", - "@rollup/rollup-linux-arm64-gnu": "4.63.1", - "@rollup/rollup-linux-arm64-musl": "4.63.1", - "@rollup/rollup-linux-loong64-gnu": "4.63.1", - "@rollup/rollup-linux-loong64-musl": "4.63.1", - "@rollup/rollup-linux-ppc64-gnu": "4.63.1", - "@rollup/rollup-linux-ppc64-musl": "4.63.1", - "@rollup/rollup-linux-riscv64-gnu": "4.63.1", - "@rollup/rollup-linux-riscv64-musl": "4.63.1", - "@rollup/rollup-linux-s390x-gnu": "4.63.1", - "@rollup/rollup-linux-x64-gnu": "4.63.1", - "@rollup/rollup-linux-x64-musl": "4.63.1", - "@rollup/rollup-openbsd-x64": "4.63.1", - "@rollup/rollup-openharmony-arm64": "4.63.1", - "@rollup/rollup-win32-arm64-msvc": "4.63.1", - "@rollup/rollup-win32-ia32-msvc": "4.63.1", - "@rollup/rollup-win32-x64-gnu": "4.63.1", - "@rollup/rollup-win32-x64-msvc": "4.63.1", - "fsevents": "~2.3.2" + "@rolldown/binding-android-arm-eabi": "1.2.6", + "@rolldown/binding-android-arm64": "1.2.6", + "@rolldown/binding-darwin-arm64": "1.2.6", + "@rolldown/binding-darwin-x64": "1.2.6", + "@rolldown/binding-freebsd-x64": "1.2.6", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.6", + "@rolldown/binding-linux-arm64-gnu": "1.2.6", + "@rolldown/binding-linux-arm64-musl": "1.2.6", + "@rolldown/binding-linux-ppc64-gnu": "1.2.6", + "@rolldown/binding-linux-s390x-gnu": "1.2.6", + "@rolldown/binding-linux-x64-gnu": "1.2.6", + "@rolldown/binding-linux-x64-musl": "1.2.6", + "@rolldown/binding-openharmony-arm64": "1.2.6", + "@rolldown/binding-win32-arm64-msvc": "1.2.6", + "@rolldown/binding-win32-x64-msvc": "1.2.6" } }, "node_modules/rope-sequence": { @@ -17576,27 +15087,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-array-concat": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", - "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "get-intrinsic": "^1.3.0", - "has-symbols": "^1.1.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -17618,24 +15108,6 @@ ], "license": "MIT" }, - "node_modules/safe-push-apply": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", - "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "es-errors": "^1.3.0", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", @@ -17665,7 +15137,7 @@ "version": "1.103.1", "resolved": "https://registry.npmjs.org/sass/-/sass-1.103.1.tgz", "integrity": "sha512-9icZURbP51S6S0QGoyaeqk9uB06GNWxsFYWfH5RgpFgqK5FA8tJcM3AdVxrZEVJ7dz+L87nG95gBKf4VuaMHGw==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -17728,14 +15200,14 @@ } }, "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.5.0.tgz", + "integrity": "sha512-zJlMCZ0cAR5p/Y4oVpRoqioDMJcGxaXRrQ/4rP4WyR84vc5z/DolXdbvXeDpTwbtocDFr2rhPqHPErDCUtz2kA==", "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", + "@types/json-schema": "^7.0.15", + "ajv": "^8.20.0", + "ajv-formats": "^3.0.1", "ajv-keywords": "^5.1.0" }, "engines": { @@ -17746,23 +15218,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/schema-utils/node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, "node_modules/schemes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/schemes/-/schemes-1.4.0.tgz", @@ -18010,39 +15465,6 @@ "node": ">= 0.4" } }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-proto": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", - "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "dunder-proto": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", @@ -18216,7 +15638,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, + "devOptional": true, "license": "ISC", "engines": { "node": ">=14" @@ -18275,20 +15697,23 @@ } }, "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "devOptional": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/slice-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -18371,6 +15796,48 @@ "node": ">= 14" } }, + "node_modules/sort-object-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-2.1.0.tgz", + "integrity": "sha512-SOiEnthkJKPv2L6ec6HMwhUcN0/lppkeYuN1x63PbyPRrgSPIuBJCiYxYyvWRTtjMlOi14vQUCGUJqS6PLVm8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/sort-package-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-4.0.0.tgz", + "integrity": "sha512-6aYOlYI9AWioZ+rzu+4zKLmoFqJP0/fHDxrd7X04yqEibikY+5YVF0EYlyGn4v6X2PJY7yAUWV7oeP+i5rOm/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^7.0.2", + "detect-newline": "^4.0.1", + "git-hooks-list": "^4.1.1", + "is-plain-obj": "^4.1.0", + "semver": "^7.7.3", + "sort-object-keys": "^2.0.1", + "tinyglobby": "^0.2.15" + }, + "bin": { + "sort-package-json": "cli.js" + }, + "engines": { + "node": ">=22" + } + }, + "node_modules/sort-package-json/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sortablejs": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.14.0.tgz", @@ -18497,14 +15964,6 @@ "node": "^18.17.0 || >=20.5.0" } }, - "node_modules/stable-hash": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", - "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -18530,21 +15989,6 @@ "dev": true, "license": "MIT" }, - "node_modules/stop-iteration-iterator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", - "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "es-errors": "^1.3.0", - "internal-slot": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", @@ -18645,106 +16089,37 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", - "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", - "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-data-property": "^1.1.4", - "define-properties": "^1.2.1", - "es-abstract": "^1.24.2", - "es-object-atoms": "^1.1.2", - "has-property-descriptors": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", - "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bind": "^1.0.9", - "call-bound": "^1.0.4", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.1.2" - }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT", - "peer": true, + "optional": true + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "optional": true, "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, "node_modules/stringify-entities": { @@ -18762,16 +16137,19 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "devOptional": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.2.2" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/strip-ansi-cjs": { @@ -18789,28 +16167,26 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "peer": true, + "optional": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "devOptional": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, "license": "MIT", + "optional": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/striptags": { @@ -18820,10 +16196,9 @@ "license": "MIT" }, "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "dev": true, + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.2.tgz", + "integrity": "sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==", "funding": [ { "type": "github", @@ -18831,7 +16206,9 @@ } ], "license": "MIT", - "peer": true + "dependencies": { + "anynum": "^1.0.1" + } }, "node_modules/strtok3": { "version": "10.3.5", @@ -18891,10 +16268,10 @@ } }, "node_modules/stylelint": { - "version": "17.14.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.14.1.tgz", - "integrity": "sha512-xVQwyiuxALUBNB2fBe0tmNemg9KqLtdj3T64mioFDar79B2cU8LIyz+3KL6LdiHs9NkeNfwxpKSaIVOY8f112g==", - "dev": true, + "version": "17.15.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-17.15.0.tgz", + "integrity": "sha512-mWIkesYQvQjf4Kvdeu9ns0IL8/K/wtjaGxPqsPd6DlLZvaQxGysJsocxUDrBcyHQ5VleAk4uSMat4yMrVED7PA==", + "devOptional": true, "funding": [ { "type": "opencollective", @@ -18907,14 +16284,14 @@ ], "license": "MIT", "dependencies": { - "@csstools/css-calc": "^3.2.1", + "@csstools/css-calc": "^3.3.0", "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-syntax-patches-for-csstree": "^1.1.6", + "@csstools/css-syntax-patches-for-csstree": "^1.1.9", "@csstools/css-tokenizer": "^4.0.0", "@csstools/media-query-list-parser": "^5.0.0", - "@csstools/selector-resolve-nested": "^4.0.0", + "@csstools/selector-resolve-nested": "^4.0.1", "@csstools/selector-specificity": "^6.0.0", - "colord": "^2.9.3", + "colord": "^2.10.0", "cosmiconfig": "^9.0.2", "css-functions-list": "^3.3.3", "css-tree": "^3.2.1", @@ -18923,21 +16300,21 @@ "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^11.1.5", "global-modules": "^2.0.0", - "globby": "^16.2.1", + "globby": "^16.2.4", "globjoin": "^0.1.4", "html-tags": "^5.1.0", - "ignore": "^7.0.5", + "ignore": "^7.0.6", "import-meta-resolve": "^4.2.0", "mathml-tag-names": "^4.0.0", "meow": "^14.1.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", - "postcss": "^8.5.16", + "postcss": "^8.5.26", "postcss-safe-parser": "^7.0.1", - "postcss-selector-parser": "^7.1.4", + "postcss-selector-parser": "^7.1.5", "postcss-value-parser": "^4.2.0", - "string-width": "^8.2.1", + "string-width": "^8.2.2", "supports-hyperlinks": "^4.5.0", "svg-tags": "^1.0.0", "table": "^6.9.0", @@ -18954,7 +16331,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-html/-/stylelint-config-html-2.0.0.tgz", "integrity": "sha512-Lk1NPEdUxzHkPv3ehktjpiOk4MPaqQ3H8fkvhxdWlQpaZCm9ze0SoMbRQLqkUxEMfPE1G9/x968uxm/+d2njoA==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "engines": { @@ -18972,7 +16349,7 @@ "version": "18.0.0", "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-18.0.0.tgz", "integrity": "sha512-mxgT2XY6YZ3HWWe3Di8umG6aBmWmHTblTgu/f10rqFXnyWxjKWwNdjSWkgkwCtxIKnqjSJzvFmPT5yabVIRxZg==", - "dev": true, + "devOptional": true, "funding": [ { "type": "opencollective", @@ -18996,7 +16373,7 @@ "version": "17.0.1", "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-17.0.1.tgz", "integrity": "sha512-x5DVehzJudcwF0od3sGpgkln2PLLranFE7twwbp7dqDINCyZvwzFkMc6TLhNOvazRiVBJYATQLouJY0xPGB8WA==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -19021,7 +16398,7 @@ "version": "1.6.1", "resolved": "https://registry.npmjs.org/stylelint-config-recommended-vue/-/stylelint-config-recommended-vue-1.6.1.tgz", "integrity": "sha512-lLW7hTIMBiTfjenGuDq2kyHA6fBWd/+Df7MO4/AWOxiFeXP9clbpKgg27kHfwA3H7UNMGC7aeP3mNlZB5LMmEQ==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -19044,7 +16421,7 @@ "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "dev": true, + "devOptional": true, "license": "ISC", "peer": true, "bin": { @@ -19058,7 +16435,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-7.2.0.tgz", "integrity": "sha512-6E79Bachv0Iz0gqRUZgdqdXCsiq26DWBWIBNHYtjTmAp3wJu6cp/I37VfW7BPntmh2puF3bY09XWl4HZGrLhzw==", - "dev": true, + "devOptional": true, "license": "MIT", "peer": true, "dependencies": { @@ -19081,26 +16458,11 @@ "stylelint": "^16.8.2 || ^17.0.0" } }, - "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", - "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/stylelint-use-logical": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/stylelint-use-logical/-/stylelint-use-logical-2.1.3.tgz", "integrity": "sha512-haPkgxKre+eSqr4IZJnHwNT/9/wICykeFZIaz7rZbe4SohTHkw7vBahMOrZJZpdny/EBVHAcPH2IBeoiUcZWWw==", - "dev": true, + "devOptional": true, "license": "CC0-1.0", "engines": { "node": ">=14.0.0" @@ -19109,137 +16471,21 @@ "stylelint": ">= 11 < 18" } }, - "node_modules/stylelint/node_modules/@csstools/selector-resolve-nested": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-4.0.1.tgz", - "integrity": "sha512-j3vdQu0XwLME5qOTWxm8cnmvsf423R2YL6DbKklCHZwkDm7UdKNu6RPlw4REIJhSlKBICY3B70/7QZdicLqZgg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.1.1" - } - }, - "node_modules/stylelint/node_modules/@csstools/selector-specificity": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-6.0.0.tgz", - "integrity": "sha512-4sSgl78OtOXEX/2d++8A83zHNTgwCJMaR24FvsYL7Uf/VS8HZk9PTwR51elTbGqMuwH3szLvvOXEaVnqn0Z3zA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "postcss-selector-parser": "^7.1.1" - } - }, - "node_modules/stylelint/node_modules/ansi-regex": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", - "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", - "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^6.1.23" - } - }, - "node_modules/stylelint/node_modules/flat-cache": { - "version": "6.1.23", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", - "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "cacheable": "^2.5.0", - "flatted": "^3.4.2", - "hookified": "^1.15.0" - } - }, - "node_modules/stylelint/node_modules/globby": { - "version": "16.2.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-16.2.4.tgz", - "integrity": "sha512-c8B/VNLmxRcmqqenRA9t+9IyOjf9+V6lTxPaUJLqOCONdQkWZ0ETYgX0qbtJqPsgCNusT9MZ5Jeidw8Eb9tn2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.5", - "is-path-inside": "^4.0.0", - "micromatch": "^4.0.8", - "slash": "^5.1.0", - "unicorn-magic": "^0.4.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stylelint/node_modules/ignore": { - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.7.tgz", - "integrity": "sha512-dML0wP6oak21rsNYCJpJB6O1BJIEwNpGrTw0URPfAk4hm0e3pRfCtzkfB6olBcXcVlU2rouCyz7lCyRB0OMVCA==", - "dev": true, + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz", + "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==", + "devOptional": true, "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/stylelint/node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stylelint/node_modules/postcss-safe-parser": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", - "dev": true, + "devOptional": true, "funding": [ { "type": "opencollective", @@ -19262,64 +16508,21 @@ "postcss": "^8.4.31" } }, - "node_modules/stylelint/node_modules/postcss-selector-parser": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.5.tgz", - "integrity": "sha512-KvvtD7SrlBP7dlgkBghEE3r84CABm5SmV2aNcG4oCA+qDnJ/tvKonFVvwWAyyWUEwxuNawdfEAZKP9zM3oZ2Uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stylelint/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/stylelint/node_modules/string-width": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.5.0", - "strip-ansi": "^7.1.2" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylelint/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.2.2" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=12" + "node": ">=20" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/superjson": { @@ -19335,23 +16538,25 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "devOptional": true, + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-hyperlinks": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-4.5.0.tgz", "integrity": "sha512-ZW2OvfeCXrNTbLakPUzjQG922EeGCOteFSVoek5DKStTh898wf7zgtuFlzQN8HfZCxC3Eh02yJVrRW51hADf+w==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "has-flag": "^5.0.1", @@ -19368,7 +16573,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-5.0.1.tgz", "integrity": "sha512-CsNUt5x9LUdx6hnk/E2SZLsDyvfqANZSUq4+D3D8RzDJ2M+HDTIkF60ibS1vHaK55vzgiZw1bEPFG9yH7l33wA==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -19381,7 +16586,7 @@ "version": "10.2.2", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz", "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=18" @@ -19407,7 +16612,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", - "dev": true + "devOptional": true }, "node_modules/tabbable": { "version": "6.5.0", @@ -19419,7 +16624,7 @@ "version": "6.9.0", "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", - "dev": true, + "devOptional": true, "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", @@ -19432,18 +16637,28 @@ "node": ">=10.0.0" } }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/table/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/table/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -19454,6 +16669,19 @@ "node": ">=8" } }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tapable": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", @@ -19636,13 +16864,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "license": "MIT" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "devOptional": true, - "license": "MIT" - }, "node_modules/thingies": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.1.tgz", @@ -19683,11 +16904,14 @@ } }, "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.1.4.tgz", + "integrity": "sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=20.0.0" + } }, "node_modules/tinyexec": { "version": "1.3.0", @@ -19715,45 +16939,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinyrainbow": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", - "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/to-buffer": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.2.tgz", @@ -19773,7 +16958,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -19782,6 +16967,23 @@ "node": ">=8.0" } }, + "node_modules/to-valid-identifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz", + "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/base62": "^1.0.0", + "reserved-identifiers": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -19838,16 +17040,16 @@ } }, "node_modules/ts-api-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.3.tgz", - "integrity": "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==", - "dev": true, + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "devOptional": true, "license": "MIT", "engines": { - "node": ">=16" + "node": ">=18.12" }, "peerDependencies": { - "typescript": ">=4.2.0" + "typescript": ">=4.8.4" } }, "node_modules/ts-loader": { @@ -19876,20 +17078,6 @@ } } }, - "node_modules/ts-loader/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/ts-loader/node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -19910,34 +17098,6 @@ "node": ">=18" } }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -20079,85 +17239,68 @@ "node": ">= 0.4" } }, - "node_modules/typed-array-byte-length": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", - "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", - "dev": true, - "license": "MIT", + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", + "devOptional": true, + "license": "Apache-2.0", "peer": true, - "dependencies": { - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.14" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=14.17" } }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", - "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "node_modules/typescript-eslint": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.68.0.tgz", + "integrity": "sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "for-each": "^0.3.3", - "gopd": "^1.2.0", - "has-proto": "^1.2.0", - "is-typed-array": "^1.1.15", - "reflect.getprototypeof": "^1.0.9" + "@typescript-eslint/eslint-plugin": "8.68.0", + "@typescript-eslint/parser": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/utils": "8.68.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/typed-array-length": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", - "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", + "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { + "version": "8.68.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.68.0.tgz", + "integrity": "sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { - "call-bind": "^1.0.9", - "for-each": "^0.3.5", - "gopd": "^1.2.0", - "is-typed-array": "^1.1.15", - "possible-typed-array-names": "^1.1.0", - "reflect.getprototypeof": "^1.0.10" + "@typescript-eslint/scope-manager": "8.68.0", + "@typescript-eslint/types": "8.68.0", + "@typescript-eslint/typescript-estree": "8.68.0", + "@typescript-eslint/visitor-keys": "8.68.0", + "debug": "^4.4.3" }, "engines": { - "node": ">= 0.4" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "devOptional": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=14.17" + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/typescript-event-target": { @@ -20172,26 +17315,6 @@ "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", "license": "MIT" }, - "node_modules/unbox-primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", - "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.3", - "has-bigints": "^1.0.2", - "has-symbols": "^1.1.0", - "which-boxed-primitive": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/undici-types": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", @@ -20246,7 +17369,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz", "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=20" @@ -20457,88 +17580,25 @@ "vite": { "optional": true }, - "webpack": { - "optional": true - } - } - }, - "node_modules/unplugin-utils": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.2.tgz", - "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==", - "license": "MIT", - "dependencies": { - "pathe": "^2.0.3", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/unplugin-utils/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unplugin/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "webpack": { + "optional": true + } } }, - "node_modules/unrs-resolver": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", - "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", - "dev": true, - "hasInstallScript": true, + "node_modules/unplugin-utils": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.3.2.tgz", + "integrity": "sha512-xVToRh2CTmLk2HnEG7ac4rl1MJTT3RFkpS8B++/SnB0kXvuaavD+n3m/vrzyWQOdJNSZQACnbz01pnppbwV5BA==", "license": "MIT", - "peer": true, "dependencies": { - "napi-postinstall": "^0.3.4" + "pathe": "^2.0.3", + "picomatch": "^4.0.4" }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" + "engines": { + "node": ">=20.19.0" }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.12.2", - "@unrs/resolver-binding-android-arm64": "1.12.2", - "@unrs/resolver-binding-darwin-arm64": "1.12.2", - "@unrs/resolver-binding-darwin-x64": "1.12.2", - "@unrs/resolver-binding-freebsd-x64": "1.12.2", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", - "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", - "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", - "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", - "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", - "@unrs/resolver-binding-linux-x64-musl": "1.12.2", - "@unrs/resolver-binding-openharmony-arm64": "1.12.2", - "@unrs/resolver-binding-wasm32-wasi": "1.12.2", - "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", - "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", - "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + "funding": { + "url": "https://github.com/sponsors/sxzz" } }, "node_modules/update-browserslist-db": { @@ -20704,18 +17764,18 @@ } }, "node_modules/vite": { - "version": "7.3.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", - "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { - "esbuild": "^0.27.0 || ^0.28.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" + "lightningcss": "^1.33.0", + "picomatch": "^4.0.5", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" @@ -20731,9 +17791,10 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", - "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", @@ -20746,13 +17807,16 @@ "@types/node": { "optional": true }, - "jiti": { + "@vitejs/devtools": { "optional": true }, - "less": { + "esbuild": { "optional": true }, - "lightningcss": { + "jiti": { + "optional": true + }, + "less": { "optional": true }, "sass": { @@ -20778,85 +17842,47 @@ } } }, - "node_modules/vite/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, "node_modules/vite/node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ "darwin" ], + "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vitest": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", - "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.0.tgz", + "integrity": "sha512-gpsMNoRhMjMktVxPtstOH4/PJuPyovVaMDr4oDilXaGH1EcqM2OE96SoHT2VIQ6fTGtTjqmHDrEu2X9RQiXf8Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.11", - "@vitest/mocker": "4.1.11", - "@vitest/pretty-format": "4.1.11", - "@vitest/runner": "4.1.11", - "@vitest/snapshot": "4.1.11", - "@vitest/spy": "4.1.11", - "@vitest/utils": "4.1.11", - "es-module-lexer": "^2.0.0", - "expect-type": "^1.3.0", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^4.0.0-rc.1", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.1.0", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", + "@types/chai": "^5.2.2", + "@vitest/mocker": "5.0.0", + "chai": "^6.2.2", + "es-module-lexer": "^2.3.2", + "expect-type": "^1.4.0", + "magic-string": "^1.2.3", + "obug": "^2.1.4", + "picomatch": "^4.0.7", + "std-env": "^4.2.0", + "tinybench": "6.1.4", + "tinyexec": "1.3.0", + "tinyglobby": "^0.2.17", "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + "node": "^22.12.0 || ^24.0.0 || >=26.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -20864,16 +17890,16 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.11", - "@vitest/browser-preview": "4.1.11", - "@vitest/browser-webdriverio": "4.1.11", - "@vitest/coverage-istanbul": "4.1.11", - "@vitest/coverage-v8": "4.1.11", - "@vitest/ui": "4.1.11", + "@types/node": "^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "5.0.0", + "@vitest/browser-preview": "5.0.0", + "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", + "@vitest/coverage-istanbul": "5.0.0", + "@vitest/coverage-v8": "5.0.0", + "@vitest/ui": "5.0.0", "happy-dom": "*", "jsdom": "*", - "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "@edge-runtime/vm": { @@ -20914,17 +17940,14 @@ } } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", - "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "node_modules/vitest/node_modules/magic-string": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.2.3.tgz", + "integrity": "sha512-Bpb0W2TbLKOZ7vJnOUnVRGq3WL2p+ISV29M6hYPL1AFCpyKZpdr5ytiXoTSSxRVhg8YW7f65+6gbG8WG6PCa/g==", "dev": true, "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/vm-browserify": { @@ -20935,16 +17958,16 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.42", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.42.tgz", - "integrity": "sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.43.tgz", + "integrity": "sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.42", - "@vue/compiler-sfc": "3.5.42", - "@vue/runtime-dom": "3.5.42", - "@vue/server-renderer": "3.5.42", - "@vue/shared": "3.5.42" + "@vue/compiler-dom": "3.5.43", + "@vue/compiler-sfc": "3.5.43", + "@vue/runtime-dom": "3.5.43", + "@vue/server-renderer": "3.5.43", + "@vue/shared": "3.5.43" }, "peerDependencies": { "typescript": "*" @@ -21026,48 +18049,6 @@ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0" } }, - "node_modules/vue-eslint-parser/node_modules/eslint-scope": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", - "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", - "devOptional": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/esrecurse": "^4.3.1", - "@types/estree": "^1.0.8", - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", - "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/vue-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "devOptional": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, "node_modules/vue-eslint-parser/node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", @@ -21214,6 +18195,12 @@ "node": ">=14" } }, + "node_modules/webdav/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, "node_modules/webdav/node_modules/brace-expansion": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", @@ -21235,29 +18222,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/webdav/node_modules/fast-xml-parser": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.11.1.tgz", - "integrity": "sha512-TBw6K/fxoQGGjCmZDw9w/ZwP3uDcnTM4YH/g+PFRWr8sbe5idXtxNN6vITh4+1ruCZaho6uBFurElsA7F0zzgw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "@nodable/entities": "^3.0.0", - "fast-xml-builder": "^1.2.0", - "is-unsafe": "^2.0.0", - "path-expression-matcher": "^1.6.2", - "strnum": "^2.4.2", - "xml-naming": "^0.3.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, "node_modules/webdav/node_modules/minimatch": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", @@ -21273,25 +18237,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/webdav/node_modules/strnum": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.2.tgz", - "integrity": "sha512-rDG3Ah4TV0k1hWvLSzkZtMmLN9+eS+h3knq4MP6A42Y3Yh5qGNnOUs1jJkoSr8FG5dsL28c7KgkIBzSEykqtuw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "anynum": "^1.0.1" - } - }, "node_modules/webpack": { - "version": "5.110.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.110.2.tgz", - "integrity": "sha512-TciLrfM7zgEjqGdY851HkirDsSPQgTFsWQpl9oHqMAMYsHhEC0bKjscvjpnz+pzx10hLC8qISApGrsnrCP4UtQ==", + "version": "5.111.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.111.1.tgz", + "integrity": "sha512-cNypaz0RP+S4cvQVi1M/3bRUkvNP0xZpL0TjFx+c6jg64VbxD+2weWDgY9UnjRI6dhZgtaj8DU76GGFcJ79xPQ==", "license": "MIT", "dependencies": { "@types/estree": "^1.0.8", @@ -21299,17 +18248,15 @@ "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.16.0", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.24.4", + "enhanced-resolve": "^5.25.0", "es-module-lexer": "^2.1.0", "events": "^3.2.0", "graceful-fs": "^4.2.11", "mime-db": "^1.54.0", "minimizer-webpack-plugin": "^5.7.0", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", + "schema-utils": "^4.5.0", "tapable": "^2.3.0", "watchpack": "^2.5.2", "webpack-sources": "^3.5.1" @@ -21552,76 +18499,6 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", - "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-bigint": "^1.1.0", - "is-boolean-object": "^1.2.1", - "is-number-object": "^1.1.1", - "is-string": "^1.1.1", - "is-symbol": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", - "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "call-bound": "^1.0.2", - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "is-async-function": "^2.0.0", - "is-date-object": "^1.1.0", - "is-finalizationregistry": "^1.1.0", - "is-generator-function": "^1.0.10", - "is-regex": "^1.2.1", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.1.0", - "which-collection": "^1.0.2", - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-typed-array": { "version": "1.1.22", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", @@ -21717,6 +18594,17 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -21741,18 +18629,18 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.3.0.tgz", - "integrity": "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==", + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "optional": true, - "engines": { - "node": ">=12" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=8" } }, "node_modules/wrap-ansi/node_modules/ansi-styles": { @@ -21769,35 +18657,18 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", - "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-regex": "^6.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "devOptional": true, + "dev": true, "license": "ISC" }, "node_modules/write-file-atomic": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-7.0.1.tgz", "integrity": "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==", - "dev": true, + "devOptional": true, "license": "ISC", "dependencies": { "signal-exit": "^4.0.1" @@ -21862,13 +18733,13 @@ } }, "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", "devOptional": true, "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/xml-naming": { diff --git a/package.json b/package.json index a90f35d0..9c5ef0eb 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "build": "NODE_ENV=production webpack --config webpack.config.js --progress", "dev": "NODE_ENV=development webpack --config webpack.config.js --progress", "watch": "NODE_ENV=development webpack --config webpack.config.js --progress --watch", - "lint": "eslint src", + "lint": "eslint src tests scripts", "lint-fix": "npm run lint -- --fix", "test": "vitest run", "test:watch": "vitest", @@ -29,61 +29,57 @@ "extends @nextcloud/browserslist-config" ], "dependencies": { - "@conduction/nextcloud-vue": "^2.25.1", + "@conduction/nextcloud-vue": "^2.57.1", "@nextcloud/auth": "^2.5.0", - "@nextcloud/axios": "~2.5.2", + "@nextcloud/axios": "~2.6.0", "@nextcloud/capabilities": "^1.2.1", "@nextcloud/dialogs": "^7.5.0", "@nextcloud/initial-state": "^3.0.0", "@nextcloud/l10n": "3.4.1", - "@nextcloud/router": "^3.1.0", + "@nextcloud/router": "^3.2.0", "@nextcloud/vue": "^9.9.0", "@vueuse/core": "^14.3.0", "axe-core": "^4.10.0", - "dexie": "^4.4.5", + "dexie": "^4.4.6", "dompurify": "^3.4.12", "gridstack": "^13.2.0", "marked": "^18.0.11", "path-browserify": "^1.0.1", "pinia": "^3.0.3", "terser-webpack-plugin": "^5.6.1", - "vue": "^3.5.18", + "vue": "^3.5.43", "vue-material-design-icons": "^5.3.0", "vue-router": "^4.6.4" }, "overrides": { "libxmljs2": "^0.37.0", - "@nextcloud/axios": "~2.5.2", - "@nextcloud/l10n": "3.4.1", + "@nextcloud/axios": "$@nextcloud/axios", + "@nextcloud/l10n": "$@nextcloud/l10n", "eslint-plugin-import-x": "4.13.1" }, "devDependencies": { "@babel/core": "^7.29.7", "@babel/preset-env": "^7.29.5", "@cyclonedx/cyclonedx-npm": "^6.0.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/eslintrc": "^3.3.1", + "@eslint/config-helpers": "^0.7.0", "@eslint/js": "^9.39.1", "@nextcloud/browserslist-config": "^3.0.1", - "@nextcloud/eslint-config": "^8.4.1", + "@nextcloud/eslint-config": "^9.0.1", "@nextcloud/stylelint-config": "^3.2.2", "@nextcloud/webpack-vue-config": "^7.0.2", - "@playwright/test": "^1.49.0", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", + "@playwright/test": "^1.63.0", + "@typescript-eslint/parser": "^8.69.0", "@vue/compiler-sfc": "^3.5.18", "babel-loader": "^10.1.1", "css-loader": "~7.1.1", - "eslint": "^8.56.0", - "eslint-import-resolver-alias": "^1.1.2", - "eslint-plugin-vue": "^9.21.1", + "eslint": "^10.10.0", "node-polyfill-webpack-plugin": "4.0.0", "style-loader": "~4.0.0", - "stylelint": "^17.9.1", - "vitest": "^4.1.11", - "vue-eslint-parser": "^10.4.1", + "stylelint": "^17.15.0", + "vitest": "^5.0.0", + "vue-eslint-parser": "^10.3.0", "vue-loader": "^17.4.2", - "webpack": "^5.94.0", + "webpack": "^5.111.1", "webpack-cli": "^6.0.1" } } diff --git a/phpstan.neon b/phpstan.neon index aeb524cc..7d6fafeb 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -37,6 +37,18 @@ parameters: # the REAL signatures so calls into the engine are still type-checked. # Analysis-only: never autoloaded or executed at runtime. - tests/stubs/openregister-apphost.stub.php + # `OCA\OpenRegister\AppHost\Bootstrap`, which used to live in the file + # above and now ships in the shared package, because decidiq and filinq + # carry the same guarded call and were red on psalm without it. + - vendor/conduction/hydra-gates/hydra-gates/stubs/openregister-apphost-bootstrap.stub.php + # OpenRegister's lifecycle guard contract, verbatim copies of + # lib/Lifecycle/*.php (planning-phase-gate-document). An interface a + # class implements cannot be ignored, only supplied. + - tests/stubs/openregister/Lifecycle/LifecycleGuardInterface.php + - tests/stubs/openregister/Lifecycle/GuardResult.php + # OpenRegister's recipient resolver contract, a verbatim copy of + # lib/Service/Notification/RecipientResolverInterface.php (collaboration-notifications). + - tests/stubs/openregister/Service/Notification/RecipientResolverInterface.php reportUnmatchedIgnoredErrors: false ignoreErrors: # Nextcloud server internals (\OC, OC_App, OC\) not stubbed in nextcloud/ocp diff --git a/phpunit-unit.xml b/phpunit-unit.xml index 7bcb89db..16eb03a5 100644 --- a/phpunit-unit.xml +++ b/phpunit-unit.xml @@ -39,5 +39,15 @@ + + diff --git a/phpunit.xml b/phpunit.xml index a69e2fc3..e4ca6a06 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -39,5 +39,15 @@ + + diff --git a/psalm.xml b/psalm.xml index 97cba542..ac3019e2 100644 --- a/psalm.xml +++ b/psalm.xml @@ -24,6 +24,15 @@ so calls into the engine stay type-checked. Analysis-only: never autoloaded or executed at runtime. --> + + @@ -76,6 +85,9 @@ + + + diff --git a/scripts/build-l10n-js.js b/scripts/build-l10n-js.js index 176ef519..9c8209c7 100644 --- a/scripts/build-l10n-js.js +++ b/scripts/build-l10n-js.js @@ -65,7 +65,10 @@ const L10N_DIR = path.join(REPO_ROOT, 'l10n') * @return {string} the declared in appinfo/info.xml */ function appId() { - const xml = fs.readFileSync(path.join(REPO_ROOT, 'appinfo', 'info.xml'), 'utf8') + const xml = fs.readFileSync( + path.join(REPO_ROOT, 'appinfo', 'info.xml'), + 'utf8', + ) const match = xml.match(/([^<]+)<\/id>/) if (match === null) { console.error('appinfo/info.xml declares no ') @@ -84,10 +87,7 @@ function appId() { */ function renderJs(id, translations, pluralForm) { const body = Object.keys(translations) - .map( - (key) => - ` ${JSON.stringify(key)}: ${JSON.stringify(translations[key])}`, - ) + .map((key) => ` ${JSON.stringify(key)}: ${JSON.stringify(translations[key])}`) .join(',\n') return [ 'OC.L10N.register(', @@ -146,9 +146,7 @@ function main() { : null if (current === rendered) { - console.log( - ` ✓ l10n/${locale}.js up to date (${Object.keys(doc.translations).length} keys)`, - ) + console.log(` ✓ l10n/${locale}.js up to date (${Object.keys(doc.translations).length} keys)`) continue } if (check) { @@ -156,9 +154,7 @@ function main() { continue } fs.writeFileSync(jsFile, rendered) - console.log( - ` ✎ l10n/${locale}.js written (${Object.keys(doc.translations).length} keys)`, - ) + console.log(` ✎ l10n/${locale}.js written (${Object.keys(doc.translations).length} keys)`) } if (stale.length > 0) { diff --git a/scripts/check-integration-parity.js b/scripts/check-integration-parity.js new file mode 100644 index 00000000..2f9eb346 --- /dev/null +++ b/scripts/check-integration-parity.js @@ -0,0 +1,171 @@ +#!/usr/bin/env node +// SPDX-FileCopyrightText: 2026 Conduction B.V. +// SPDX-License-Identifier: EUPL-1.2 +// +// check-integration-parity.js — hydra gate-24 (`integration-parity`) checker. +// +// An OpenRegister leaf is registered TWICE (ADR-019 AD-11/AD-13, ADR-066 +// decisions 4 and 7): a PHP half contributes a `LeafDescriptor` through +// `RegisterLeafProvidersEvent`, and a JS half registers the render surface on +// `window.OCA.OpenRegister.integrations`. The two are bound by nothing but a +// shared `id` string, and nothing at runtime compares them. +// +// This checker correlates them, in two passes: +// +// 1. ID SETS — every leaf declared on one side exists on the other. A half +// without its partner is an orphan registration: the PHP-only leaf is +// invisible in the UI, the JS-only leaf is invisible to every server-side +// consumer that never loads an app bundle. Neither errors. +// +// 2. FIELDS — for each correlated leaf, the values both halves declare agree: +// label, icon, group, referenceType, renderMode and the surfaces list. +// Every way these drift is invisible. A changed `renderMode` makes the host +// hand an SFC to a mount-mode leaf and the surface BLANKS with no console +// message. A changed `label` renders one name in the app and another in the +// admin leaf catalogue, so one leaf looks like two. +// +// hermiq's two halves drifted exactly this way and it went unnoticed. That is +// why both halves in this repo write their `surfaces` out explicitly instead of +// relying on a default: a set declared by OMISSION gives this checker nothing to +// compare, and it would report a pass having correlated nothing. +// +// NOTHING HERE SKIPS QUIETLY. Every way this script can fail to check something +// exits non-zero with a named reason — a gate whose absence looks exactly like +// its success is worse than no gate. + +const fs = require('fs') +const path = require('path') + +const ROOT = process.argv[2] ? path.resolve(process.argv[2]) : path.resolve(__dirname, '..') +const failures = [] + +/** + * Every file under `dir` matching `re`, recursively. + * + * @param {string} dir Directory to walk. + * @param {RegExp} re Filename pattern. + * @return {string[]} Absolute paths. + */ +function walk(dir, re) { + if (!fs.existsSync(dir)) { + return [] + } + const out = [] + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const p = path.join(dir, entry.name) + if (entry.isDirectory()) { + if (entry.name === 'node_modules' || entry.name === 'vendor') { + continue + } + out.push(...walk(p, re)) + } else if (re.test(entry.name)) { + out.push(p) + } + } + return out +} + +/** Leaves declared by the PHP half, keyed by id. */ +const php = new Map() +for (const f of walk(path.join(ROOT, 'lib'), /\.php$/)) { + const src = fs.readFileSync(f, 'utf8') + if (!src.includes('new LeafDescriptor(')) { + continue + } + const id = (src.match(/LEAF_ID\s*=\s*'([^']+)'/) || [])[1] + if (!id) { + failures.push(`${path.relative(ROOT, f)}: constructs a LeafDescriptor but declares no LEAF_ID ` + + 'constant, so its id cannot be correlated with the JS half.') + continue + } + php.set(id, { + file: path.relative(ROOT, f), + label: (src.match(/LABEL_SOURCE\s*=\s*'([^']+)'/) || [])[1] || '', + icon: (src.match(/ICON\s*=\s*'([^']+)'/) || [])[1] || '', + group: (src.match(/GROUP\s*=\s*'([^']+)'/) || [])[1] || '', + referenceType: (src.match(/REFERENCE_TYPE\s*=\s*'([^']+)'/) || [])[1] || '', + renderMode: /RENDER_MODE_MOUNT/.test(src) ? 'mount' : '', + surfaces: ((src.match(/const SURFACES\s*=\s*\[([\s\S]*?)\];/) || [])[1] || '') + .match(/'([^']+)'/g)?.map((s) => s.replace(/'/g, '')) || [], + }) +} + +/** Leaves declared by the JS half, keyed by id. */ +const js = new Map() +for (const f of walk(path.join(ROOT, 'src'), /\.(js|ts)$/)) { + const src = fs.readFileSync(f, 'utf8') + if (!/integrations\.register\(|registerIntegration\(/.test(src)) { + continue + } + const id = (src.match(/_INTEGRATION_ID\s*=\s*'([^']+)'/) || src.match(/\bid:\s*'([^']+)'/) || [])[1] + if (!id) { + failures.push(`${path.relative(ROOT, f)}: registers an integration but no id could be read, ` + + 'so it cannot be correlated with the PHP half.') + continue + } + js.set(id, { + file: path.relative(ROOT, f), + label: (src.match(/label:\s*t\('[^']+',\s*'([^']+)'\)/) || [])[1] || '', + icon: (src.match(/\n\ticon:\s*'([^']+)'/) || [])[1] || '', + group: (src.match(/\n\tgroup:\s*'([^']+)'/) || [])[1] || '', + referenceType: (src.match(/\n\treferenceType:\s*'([^']+)'/) || [])[1] || '', + renderMode: (src.match(/renderMode:\s*'([^']+)'/) || [])[1] || '', + surfaces: ((src.match(/const SURFACES\s*=\s*\[([^\]]*)\]/) || [])[1] || '') + .match(/'([^']+)'/g)?.map((s) => s.replace(/'/g, '')) || [], + }) +} + +// Pass 1 — id sets. +for (const [id, e] of php) { + if (!js.has(id)) { + failures.push(`'${id}': declared by ${e.file} but by no JS half. The descriptor reaches ` + + 'server-side consumers and renders nothing — an orphan registration (ADR-066 decision 4).') + } +} +for (const [id, e] of js) { + if (!php.has(id)) { + failures.push(`'${id}': registered by ${e.file} but by no PHP half. The surface renders but is ` + + 'invisible to every consumer that does not load this app\'s bundle (gate-24 R2).') + } +} + +// Pass 2 — fields, for leaves both halves declare. +const FIELDS = ['label', 'icon', 'group', 'referenceType', 'renderMode'] +for (const [id, p] of php) { + const j = js.get(id) + if (!j) { + continue + } + for (const field of FIELDS) { + if (p[field] === '' || j[field] === '') { + failures.push(`'${id}'.${field}: unreadable on the ${p[field] === '' ? 'PHP' : 'JS'} half. ` + + 'A value this checker cannot see is one it cannot compare, so this is a failure, not a skip.') + } else if (p[field] !== j[field]) { + failures.push(`'${id}'.${field}: JS says ${JSON.stringify(j[field])}, PHP says ` + + `${JSON.stringify(p[field])} — the halves are bound by these values.`) + } + } + if (p.surfaces.length === 0 || j.surfaces.length === 0) { + failures.push(`'${id}'.surfaces: one half declares none. Both must write the list out — a set ` + + 'declared by omission gives this checker nothing to compare.') + } else if (JSON.stringify(p.surfaces) !== JSON.stringify(j.surfaces)) { + failures.push(`'${id}'.surfaces: JS ${j.surfaces.join(',')} vs PHP ${p.surfaces.join(',')} — ` + + 'order is part of what both halves promise.') + } +} + +if (failures.length > 0) { + console.error(`✗ integration parity: ${failures.length} finding(s)`) + for (const f of failures) { + console.error(` - ${f}`) + } + process.exit(1) +} + +if (php.size === 0 && js.size === 0) { + console.log('✓ integration parity: this repo registers no OpenRegister leaves — nothing to correlate.') + process.exit(0) +} + +console.log(`✓ integration parity: ${php.size} leaf/leaves correlated on both halves ` + + `(${[...php.keys()].join(', ')}) — id, label, icon, group, referenceType, renderMode and surfaces all agree.`) diff --git a/scripts/check-integration-parity.sh b/scripts/check-integration-parity.sh new file mode 100755 index 00000000..6ec4cf56 --- /dev/null +++ b/scripts/check-integration-parity.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# +# check-integration-parity.sh — hydra gate-24 (`integration-parity`) entry point. +# +# gate-24 invokes exactly this path. Without it the gate reports SKIPPED even +# though this repo registers a leaf, and a skipped gate correlated nothing. +# +# This wrapper deliberately does NOT skip when something is missing. A gate +# whose absence looks exactly like its success is worse than no gate, so every +# way it can fail to check something exits non-zero with a named reason. +# +# Exit codes: +# 0 — every parity rule that had subject matter passed +# 1 — at least one parity violation, or the checker could not be run +# +# SPDX-FileCopyrightText: 2026 Conduction B.V. +# SPDX-License-Identifier: EUPL-1.2 + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" +JS_CHECK="${SCRIPT_DIR}/check-integration-parity.js" + +if [ ! -f "${JS_CHECK}" ]; then + echo "✗ integration parity: checker missing at ${JS_CHECK} — the gate's own machinery is absent, so NOTHING was correlated. Refusing to report a pass." >&2 + exit 1 +fi + +if ! command -v node >/dev/null 2>&1; then + echo "✗ integration parity: node is required to run ${JS_CHECK} but was not found on PATH — NOTHING was correlated. Refusing to report a pass." >&2 + exit 1 +fi + +exec node "${JS_CHECK}" "${REPO_ROOT}" diff --git a/scripts/check-schema-l10n.js b/scripts/check-schema-l10n.js index 8a860b33..a17b4d73 100644 --- a/scripts/check-schema-l10n.js +++ b/scripts/check-schema-l10n.js @@ -66,10 +66,14 @@ const BASELINE = path.join(REPO_ROOT, 'l10n', '.schema-l10n-baseline.json') * @return {string[]} absolute paths */ function schemaFiles(dir) { - if (!fs.existsSync(dir)) return [] + if (!fs.existsSync(dir)) { + return [] + } return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => { const full = path.join(dir, entry.name) - if (entry.isDirectory()) return schemaFiles(full) + if (entry.isDirectory()) { + return schemaFiles(full) + } return entry.name.endsWith('.json') ? [full] : [] }) } @@ -83,34 +87,51 @@ function schemaFiles(dir) { */ function collect(node, where, sink) { if (Array.isArray(node)) { - for (const item of node) collect(item, where, sink) + for (const item of node) { + collect(item, where, sink) + } + return + } + if (node === null || typeof node !== 'object') { return } - if (node === null || typeof node !== 'object') return const remember = (value, what) => { - if (typeof value !== 'string' || value.trim() === '') return - if (!sink.has(value)) sink.set(value, `${where}:${what}`) + if (typeof value !== 'string' || value.trim() === '') { + return + } + if (!sink.has(value)) { + sink.set(value, `${where}:${what}`) + } } const props = node.properties if (props !== null && typeof props === 'object' && !Array.isArray(props)) { remember(node.title, 'schema title') for (const [key, prop] of Object.entries(props)) { - if (prop === null || typeof prop !== 'object') continue + if (prop === null || typeof prop !== 'object') { + continue + } remember(prop.title, `${key}.title`) remember(prop.description, `${key}.description`) for (const source of [prop, prop.items]) { - if (source === null || typeof source !== 'object') continue + if (source === null || typeof source !== 'object') { + continue + } const labels = source['x-enum-labels'] - if (labels === null || typeof labels !== 'object') continue - for (const label of Object.values(labels)) + if (labels === null || typeof labels !== 'object') { + continue + } + for (const label of Object.values(labels)) { remember(label, `${key}.x-enum-labels`) + } } } } - for (const value of Object.values(node)) collect(value, where, sink) + for (const value of Object.values(node)) { + collect(value, where, sink) + } } function main() { @@ -130,11 +151,8 @@ function main() { let covered = new Set() try { - covered = new Set( - Object.keys( - JSON.parse(fs.readFileSync(CATALOGUE, 'utf8')).translations || {}, - ), - ) + covered = new Set(Object.keys(JSON.parse(fs.readFileSync(CATALOGUE, 'utf8')).translations + || {})) } catch { // no catalogue yet — then everything is uncovered, which the baseline records } @@ -142,7 +160,9 @@ function main() { const uncovered = [...strings.keys()].filter((s) => !covered.has(s)).sort() if (list) { - for (const s of uncovered) console.log(`${strings.get(s)}\n ${s}`) + for (const s of uncovered) { + console.log(`${strings.get(s)}\n ${s}`) + } } if (update) { @@ -150,44 +170,32 @@ function main() { BASELINE, JSON.stringify({ uncovered: uncovered.length }, null, 2) + '\n', ) - console.log( - `baseline written: ${uncovered.length} uncovered schema string(s)`, - ) + console.log(`baseline written: ${uncovered.length} uncovered schema string(s)`) return } if (!fs.existsSync(BASELINE)) { - console.error( - 'No baseline. Run `npm run check:schema-l10n -- --update` and commit it.', - ) + console.error('No baseline. Run `npm run check:schema-l10n -- --update` and commit it.') process.exit(1) } const baseline = JSON.parse(fs.readFileSync(BASELINE, 'utf8')).uncovered - console.log( - `${strings.size} schema string(s); ${uncovered.length} uncovered, baseline ${baseline}`, - ) + console.log(`${strings.size} schema string(s); ${uncovered.length} uncovered, baseline ${baseline}`) if (uncovered.length > baseline) { const added = uncovered.length - baseline console.error('') - console.error( - `${added} schema string(s) added with no catalogue key — they will render`, - ) + console.error(`${added} schema string(s) added with no catalogue key — they will render`) console.error('in English inside an otherwise translated form.') console.error('') - console.error( - 'Add them to l10n/en.json (identity) and l10n/nl.json (translated), then', - ) + console.error('Add them to l10n/en.json (identity) and l10n/nl.json (translated), then') console.error('run `npm run l10n:build`. See what is uncovered with:') console.error(' node scripts/check-schema-l10n.js --list') process.exit(1) } if (uncovered.length < baseline) { - console.log( - `${baseline - uncovered.length} fewer than the baseline — lower it with:`, - ) + console.log(`${baseline - uncovered.length} fewer than the baseline — lower it with:`) console.log(' npm run check:schema-l10n -- --update') } } diff --git a/src/App.vue b/src/App.vue index c699a698..9f381729 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,6 +1,31 @@ + + + + diff --git a/src/components/TimetableScenarioCompare.vue b/src/components/TimetableScenarioCompare.vue new file mode 100644 index 00000000..f63223d6 --- /dev/null +++ b/src/components/TimetableScenarioCompare.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/src/components/TimetableScenarioSections.vue b/src/components/TimetableScenarioSections.vue new file mode 100644 index 00000000..0803b53d --- /dev/null +++ b/src/components/TimetableScenarioSections.vue @@ -0,0 +1,449 @@ + + + + + diff --git a/src/components/WorkingCalendarSettings.vue b/src/components/WorkingCalendarSettings.vue new file mode 100644 index 00000000..14262cd0 --- /dev/null +++ b/src/components/WorkingCalendarSettings.vue @@ -0,0 +1,299 @@ + + + + + + diff --git a/src/dialogs/BoardFilterSaveDialog.vue b/src/dialogs/BoardFilterSaveDialog.vue new file mode 100644 index 00000000..b8500dea --- /dev/null +++ b/src/dialogs/BoardFilterSaveDialog.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/src/dialogs/ColumnEditDialog.vue b/src/dialogs/ColumnEditDialog.vue new file mode 100644 index 00000000..a08c9f6e --- /dev/null +++ b/src/dialogs/ColumnEditDialog.vue @@ -0,0 +1,254 @@ + + + + + diff --git a/src/dialogs/ColumnRemoveDialog.vue b/src/dialogs/ColumnRemoveDialog.vue new file mode 100644 index 00000000..1cd04640 --- /dev/null +++ b/src/dialogs/ColumnRemoveDialog.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/src/dialogs/ColumnRulesDialog.vue b/src/dialogs/ColumnRulesDialog.vue new file mode 100644 index 00000000..990b7e2f --- /dev/null +++ b/src/dialogs/ColumnRulesDialog.vue @@ -0,0 +1,329 @@ + + + + + diff --git a/src/dialogs/FinanceLineDialog.vue b/src/dialogs/FinanceLineDialog.vue new file mode 100644 index 00000000..e21f393e --- /dev/null +++ b/src/dialogs/FinanceLineDialog.vue @@ -0,0 +1,254 @@ + + + + + diff --git a/src/dialogs/LabelDeleteDialog.vue b/src/dialogs/LabelDeleteDialog.vue index 7a6f6ceb..b43d00e0 100644 --- a/src/dialogs/LabelDeleteDialog.vue +++ b/src/dialogs/LabelDeleteDialog.vue @@ -35,6 +35,7 @@ + + diff --git a/src/dialogs/LogEntryEditDialog.vue b/src/dialogs/LogEntryEditDialog.vue new file mode 100644 index 00000000..f541be06 --- /dev/null +++ b/src/dialogs/LogEntryEditDialog.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/src/dialogs/MsProjectImportDialog.vue b/src/dialogs/MsProjectImportDialog.vue new file mode 100644 index 00000000..ed394110 --- /dev/null +++ b/src/dialogs/MsProjectImportDialog.vue @@ -0,0 +1,321 @@ + + + + + diff --git a/src/dialogs/PhaseCloseDialog.vue b/src/dialogs/PhaseCloseDialog.vue new file mode 100644 index 00000000..1b0044dd --- /dev/null +++ b/src/dialogs/PhaseCloseDialog.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/src/dialogs/PhaseEditDialog.vue b/src/dialogs/PhaseEditDialog.vue new file mode 100644 index 00000000..7badd33c --- /dev/null +++ b/src/dialogs/PhaseEditDialog.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/src/dialogs/ProjectCreationDialog.vue b/src/dialogs/ProjectCreationDialog.vue index d1d2a1d5..08afcd00 100644 --- a/src/dialogs/ProjectCreationDialog.vue +++ b/src/dialogs/ProjectCreationDialog.vue @@ -1,8 +1,11 @@ @@ -52,18 +96,28 @@ * * @spec openspec/specs/portfolio-dashboard-pmo.md */ -import { NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue' +import { getCurrentUser } from '@nextcloud/auth' +import { NcButton, NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue' +import PlusIcon from 'vue-material-design-icons/Plus.vue' import ViewDashboardOutline from 'vue-material-design-icons/ViewDashboardOutline.vue' +import PortfolioSections from '../components/PortfolioSections.vue' +import ProjectsViewEditDialog from '../dialogs/ProjectsViewEditDialog.vue' import { useProjectsStore } from '../store/projects.js' +import { groupByPortfolio } from '../utils/portfolioGrouping.js' +import { pickableProjects } from '../utils/projectsView.js' export default { name: 'Boards', - components: { NcEmptyContent, NcLoadingIcon, ViewDashboardOutline }, + components: { NcButton, NcEmptyContent, NcLoadingIcon, PlusIcon, PortfolioSections, ProjectsViewEditDialog, ViewDashboardOutline }, data() { return { projectsStore: useProjectsStore(), + portfolios: [], + /** @type {Array} Cross-project views the user owns or that are shared with them. */ + views: [], + editing: false, } }, @@ -81,13 +135,44 @@ export default { loading() { return this.projectsStore.loading }, + + /** + * The boards grouped by portfolio, like the project list. + * + * @return {Array} + * + * @spec openspec/changes/projects-grouping-hierarchy-fields/tasks.md#task-1.2 + */ + groups() { + return groupByPortfolio(this.projects, this.portfolios) + }, + + /** + * @spec exclude Auth passthrough — the user's id. + */ + uid() { + return getCurrentUser()?.uid || '' + }, + + /** + * The projects a new view may show: the ones the user is in. + * + * @return {Array} + * + * @spec openspec/changes/archive/2026-09-30-boards-cross-project-board/tasks.md#task-3.1 + */ + pickable() { + return pickableProjects(this.projects, this.uid) + }, }, /** * @spec exclude Lifecycle glue — loads the user's member projects. */ async mounted() { - await this.projectsStore.fetchProjects({ status: 'active' }) + const [portfolios, views] = await Promise.all([this.projectsStore.fetchPortfolios(), this.projectsStore.fetchBoardViews(), this.projectsStore.fetchProjects({ status: 'active' })]) + this.portfolios = portfolios + this.views = [...views].sort((a, b) => String(a.title).localeCompare(String(b.title))) }, methods: { @@ -110,6 +195,29 @@ export default { openBoard(project) { this.$router.push({ name: 'ProjectBoard', params: { id: project.id } }) }, + + /** + * Open a cross-project view. + * + * @param {object} view The view. + * + * @spec openspec/changes/archive/2026-09-30-boards-cross-project-board/tasks.md#task-3.1 + */ + openView(view) { + this.$router.push({ name: 'ProjectsView', params: { id: view.id } }) + }, + + /** + * A new view is saved: open it. + * + * @param {object} view The saved view. + * + * @spec openspec/changes/archive/2026-09-30-boards-cross-project-board/tasks.md#task-3.1 + */ + onViewSaved(view) { + this.editing = false + this.openView(view) + }, }, } @@ -130,6 +238,27 @@ export default { margin: 0; } +.boards__views { + margin-bottom: 32px; +} + +.boards__views-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 12px; +} + +.boards__views-title { + margin: 0; +} + +.boards__views-empty { + margin: 0; + color: var(--color-text-maxcontrast); +} + .boards__loading { display: flex; justify-content: center; diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue deleted file mode 100644 index 5a97a372..00000000 --- a/src/views/Dashboard.vue +++ /dev/null @@ -1,228 +0,0 @@ - - - - - diff --git a/src/views/MyCalendar.vue b/src/views/MyCalendar.vue new file mode 100644 index 00000000..b0f7ebbb --- /dev/null +++ b/src/views/MyCalendar.vue @@ -0,0 +1,101 @@ + + + + + + diff --git a/src/views/MyReports.vue b/src/views/MyReports.vue new file mode 100644 index 00000000..04057717 --- /dev/null +++ b/src/views/MyReports.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/src/views/MyWork.vue b/src/views/MyWork.vue new file mode 100644 index 00000000..78410f95 --- /dev/null +++ b/src/views/MyWork.vue @@ -0,0 +1,402 @@ + + + + + + diff --git a/src/views/Portfolio.vue b/src/views/Portfolio.vue index 2a1c3174..b8772b61 100644 --- a/src/views/Portfolio.vue +++ b/src/views/Portfolio.vue @@ -5,7 +5,7 @@ {{ t('planninq', 'Portfolio') }}

- {{ t('planninq', 'Capacity across your projects') }} + {{ t('planninq', 'Open work per person and per project.') }}

@@ -14,7 +14,7 @@ @@ -35,27 +138,87 @@ /** * ProjectBacklog view. * - * Renders the `/projects/:id/backlog` route as a navigable shell — breadcrumb - * back to the project board plus a placeholder NcEmptyContent. Hydrates the - * projects store on direct deep link so the breadcrumb resolves the project - * title rather than echoing the raw UUID. Stays a placeholder until - * tasks#REQ-Task-CRUD lands. + * The project's backlog: every task in no board column, in rank order. A + * member adds a task straight into it, ranks it by dragging a row or with + * "Move up" and "Move down", sorts it by rank, priority, due date or creation + * date, filters it by priority or to the cancelled tasks, and moves a task + * onto the board with a column choice. Sort and filters live in the query + * string. Hydrates the project on a deep link so the breadcrumb shows its + * title. * - * @spec openspec/changes/retrofit-2026-05-24-reverse-spec-projects-backlog/tasks.md#task-1 + * @spec openspec/changes/backlog-list/tasks.md#task-1.1 */ -import { NcButton, NcEmptyContent } from '@nextcloud/vue' +import { showError } from '@nextcloud/dialogs' +import { + NcActionButton, + NcActionCaption, + NcActions, + NcButton, + NcCheckboxRadioSwitch, + NcEmptyContent, + NcLoadingIcon, + NcSelect, + NcTextField, +} from '@nextcloud/vue' +import ArrowDownIcon from 'vue-material-design-icons/ArrowDown.vue' +import ArrowRightIcon from 'vue-material-design-icons/ArrowRight.vue' +import ArrowUpIcon from 'vue-material-design-icons/ArrowUp.vue' +import DragIcon from 'vue-material-design-icons/Drag.vue' import FormatListBulleted from 'vue-material-design-icons/FormatListBulleted.vue' +import ProjectTabs from '../components/ProjectTabs.vue' import { useProjectsStore } from '../store/projects.js' +import { + BACKLOG_SORTS, + backlogTasks, + filterBacklog, + newBacklogTask, + sortBacklog, +} from '../utils/backlogHelpers.js' +import { + buildMovePatch, + groupTasksByColumn, + orderFor, + orderPatchesForStep, + sortColumns, +} from '../utils/columnHelpers.js' export default { name: 'ProjectBacklog', components: { + NcActionButton, + NcActionCaption, + NcActions, NcButton, + NcCheckboxRadioSwitch, NcEmptyContent, + NcLoadingIcon, + NcSelect, + NcTextField, + ProjectTabs, + ArrowDownIcon, + ArrowRightIcon, + ArrowUpIcon, + DragIcon, FormatListBulleted, }, + data() { + return { + /** @type {Array} Every task of the project. */ + tasks: [], + /** @type {Array} The project's board columns. */ + boardColumns: [], + loading: false, + newTitle: '', + creating: false, + /** @type {object|null} The row being dragged. */ + draggingTask: null, + /** @type {string|null} Id of the row hovered during a drag. */ + dropTargetId: null, + } + }, + computed: { /** * @spec exclude Store passthrough — returns the projects Pinia store. @@ -63,24 +226,242 @@ export default { projectsStore() { return useProjectsStore() }, + /** * @spec exclude Trivial display getter — active project title with UUID fallback. */ projectTitle() { return this.projectsStore.activeProject?.title || this.$route.params.id }, + + /** + * @spec exclude Display helper — the board columns in lane order. + */ + columns() { + return sortColumns(this.boardColumns) + }, + + /** + * The sort from the query string, rank when absent or unknown. + * + * @return {string} + * + * @spec openspec/changes/backlog-list/tasks.md#task-2.2 + */ + sort() { + const sort = this.$route.query.sort + return BACKLOG_SORTS.includes(sort) ? sort : 'rank' + }, + + /** + * @spec exclude Display helper — whether the Cancelled filter is on. + */ + showCancelled() { + return this.$route.query.cancelled === '1' + }, + + /** + * The backlog as shown: filtered, then in the chosen order. + * + * @return {Array} + * + * @spec openspec/changes/backlog-list/tasks.md#task-2.3 + */ + rows() { + const backlog = backlogTasks(this.tasks, { cancelled: this.showCancelled }) + return sortBacklog(filterBacklog(backlog, { priority: this.$route.query.priority || '' }), this.sort) + }, + + /** + * @spec exclude Display helper — the sort choices. + */ + sortOptions() { + return [ + { id: 'rank', label: this.t('planninq', 'Rank') }, + { id: 'priority', label: this.t('planninq', 'Priority') }, + { id: 'due', label: this.t('planninq', 'Due date') }, + { id: 'created', label: this.t('planninq', 'Created') }, + ] + }, + + /** + * @spec exclude Display helper — the selected sort choice. + */ + sortOption() { + return this.sortOptions.find((option) => option.id === this.sort) + }, + + /** + * @spec exclude Display helper — the priority filter choices. + */ + priorityOptions() { + return [ + { id: '', label: this.t('planninq', 'All priorities') }, + { id: 'urgent', label: this.t('planninq', 'Urgent') }, + { id: 'high', label: this.t('planninq', 'High') }, + { id: 'normal', label: this.t('planninq', 'Normal') }, + { id: 'low', label: this.t('planninq', 'Low') }, + ] + }, + + /** + * @spec exclude Display helper — the selected priority filter. + */ + priorityOption() { + return this.priorityOptions.find((option) => option.id === (this.$route.query.priority || '')) || this.priorityOptions[0] + }, }, /** - * Hydrate the projects store on direct deep link so the breadcrumb - * title resolves to the project title rather than the raw UUID. + * Hydrate the project on a deep link, then load the tasks and columns. * - * @spec openspec/changes/retrofit-2026-05-24-reverse-spec-projects-backlog/tasks.md#task-1 + * @spec openspec/changes/backlog-list/tasks.md#task-1.1 */ async mounted() { - if (!this.projectsStore.activeProject || this.projectsStore.activeProject.id !== this.$route.params.id) { - await this.projectsStore.fetchProject(this.$route.params.id) + const id = this.$route.params.id + if (!this.projectsStore.activeProject || this.projectsStore.activeProject.id !== id) { + await this.projectsStore.fetchProject(id) } + await this.load() + }, + + methods: { + /** + * Load the project's tasks and board columns. + * + * @return {Promise} + * + * @spec openspec/changes/backlog-list/tasks.md#task-1.1 + */ + async load() { + const id = this.$route.params.id + this.loading = true + try { + this.boardColumns = await this.projectsStore.fetchColumns(id) + this.tasks = await this.projectsStore.fetchTasks(id) + } finally { + this.loading = false + } + }, + + /** + * Change the sort or a filter, keeping the rest of the query. + * + * @param {object} change Query keys to set; undefined removes a key. + * + * @spec openspec/changes/backlog-list/tasks.md#task-2.2 + */ + setQuery(change) { + const query = { ...this.$route.query, ...change } + for (const key of Object.keys(query)) { + if (query[key] === undefined) { + delete query[key] + } + } + this.$router.replace({ query }) + }, + + /** + * @param {string} priority A task priority. + * @return {string} Its label. + * @spec exclude Display helper — the label of a priority value. + */ + priorityLabel(priority) { + return (this.priorityOptions.find((option) => option.id === (priority || 'normal')) || {}).label + }, + + /** + * Create a task straight into the backlog, last in rank. + * + * @return {Promise} + * + * @spec openspec/changes/backlog-list/tasks.md#task-1.2 + */ + async createTask() { + if (this.newTitle.trim() === '' || this.creating) { + return + } + this.creating = true + const payload = newBacklogTask(this.newTitle, this.$route.params.id, backlogTasks(this.tasks)) + const created = await this.projectsStore.createTask(payload) + this.creating = false + if (!created) { + showError(this.t('planninq', 'Could not create the task. Please try again.')) + return + } + this.newTitle = '' + this.tasks = [...this.tasks, created] + }, + + /** + * Apply task patches optimistically and persist them; revert on failure. + * + * @param {Array} patches Each `{ id, ...fields }`. + * @return {Promise} + * + * @spec openspec/changes/backlog-list/tasks.md#task-2.1 + */ + async patchTasks(patches) { + if (!patches.length) { + return + } + const previous = this.tasks + const byId = new Map(patches.map((patch) => [patch.id, patch])) + this.tasks = this.tasks.map((task) => byId.has(task.id) ? { ...task, ...byId.get(task.id) } : task) + for (const { id, ...fields } of patches) { + if (!(await this.projectsStore.updateTask(id, fields))) { + this.tasks = previous + showError(this.t('planninq', 'Could not move the task. Please try again.')) + return + } + } + }, + + /** + * Move a row one step up (-1) or down (+1) in rank. + * + * @param {object} task The task. + * @param {number} direction -1 or +1. + * @return {Promise} + * + * @spec openspec/changes/backlog-list/tasks.md#task-2.1 + */ + async step(task, direction) { + await this.patchTasks(orderPatchesForStep(this.rows, task, direction)) + }, + + /** + * Drop the dragged row in front of another; only when sorted by rank. + * + * @param {object} beforeTask The row it was dropped on. + * @return {Promise} + * + * @spec openspec/changes/backlog-list/tasks.md#task-2.1 + */ + async onDrop(beforeTask) { + const task = this.draggingTask + this.draggingTask = null + this.dropTargetId = null + if (!task || this.sort !== 'rank' || task.id === beforeTask.id) { + return + } + const list = this.rows.filter((row) => row.id !== task.id) + await this.patchTasks([{ id: task.id, columnOrder: orderFor(list, beforeTask) }]) + }, + + /** + * Plan a task: put it at the bottom of a board lane with that lane's status. + * + * @param {object} task The backlog task. + * @param {object} column The chosen column. + * @return {Promise} + * + * @spec openspec/changes/backlog-list/tasks.md#task-3.1 + */ + async moveToBoard(task, column) { + const lane = groupTasksByColumn(this.tasks, this.columns)[column.id] || [] + await this.patchTasks([{ id: task.id, ...buildMovePatch(column, lane) }]) + }, }, } @@ -101,6 +482,11 @@ export default { } .project-backlog__header { + display: flex; + flex-wrap: wrap; + align-items: flex-end; + justify-content: space-between; + gap: 12px; margin-bottom: 16px; } @@ -109,4 +495,60 @@ export default { font-size: 22px; font-weight: 600; } + +.project-backlog__create, +.project-backlog__toolbar { + display: flex; + flex-wrap: wrap; + align-items: flex-end; + gap: 8px; +} + +.project-backlog__toolbar { + margin-bottom: 8px; +} + +.project-backlog__hint { + margin: 0 0 8px; + color: var(--color-text-maxcontrast); +} + +.project-backlog__list { + margin: 0; + padding: 0; + list-style: none; +} + +.project-backlog__row { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 8px; + border-bottom: 1px solid var(--color-border); +} + +.project-backlog__row--drop-target { + box-shadow: inset 0 2px 0 var(--color-primary-element); +} + +.project-backlog__handle { + cursor: grab; + color: var(--color-text-maxcontrast); +} + +.project-backlog__title { + flex: 1; + justify-content: flex-start; +} + +.project-backlog__meta { + font-size: 12px; + color: var(--color-text-maxcontrast); +} + +.project-backlog__loading { + display: flex; + justify-content: center; + padding: 24px; +} diff --git a/src/views/ProjectBoard.vue b/src/views/ProjectBoard.vue index bf33fbb3..9c0fdc47 100644 --- a/src/views/ProjectBoard.vue +++ b/src/views/ProjectBoard.vue @@ -1,5 +1,8 @@ + + diff --git a/src/views/ProjectFinance.vue b/src/views/ProjectFinance.vue new file mode 100644 index 00000000..c889a89a --- /dev/null +++ b/src/views/ProjectFinance.vue @@ -0,0 +1,677 @@ + + + + + diff --git a/src/views/ProjectFlow.vue b/src/views/ProjectFlow.vue new file mode 100644 index 00000000..571e2d28 --- /dev/null +++ b/src/views/ProjectFlow.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/src/views/ProjectList.vue b/src/views/ProjectList.vue index 141a4e71..6195c1c0 100644 --- a/src/views/ProjectList.vue +++ b/src/views/ProjectList.vue @@ -12,7 +12,7 @@ :key="String(chip.value)" :text="chip.label" :variant="activeStatus === chip.value ? 'primary' : 'secondary'" - :no-close="true" + :noClose="true" :aria-pressed="activeStatus === chip.value" @click="setStatusFilter(chip.value)" /> @@ -25,16 +25,36 @@ {{ t('planninq', 'New project') }} + + + + {{ t('planninq', 'Request a project') }} + - + @@ -82,24 +102,43 @@ - -
    - -
+ + + + + + + + diff --git a/src/views/ProjectOverview.vue b/src/views/ProjectOverview.vue new file mode 100644 index 00000000..ec6e5dde --- /dev/null +++ b/src/views/ProjectOverview.vue @@ -0,0 +1,503 @@ + + + + + diff --git a/src/views/ProjectPhases.vue b/src/views/ProjectPhases.vue new file mode 100644 index 00000000..816d03ff --- /dev/null +++ b/src/views/ProjectPhases.vue @@ -0,0 +1,427 @@ + + + + + diff --git a/src/views/ProjectRisks.vue b/src/views/ProjectRisks.vue new file mode 100644 index 00000000..2cac7d7c --- /dev/null +++ b/src/views/ProjectRisks.vue @@ -0,0 +1,361 @@ + + + + + diff --git a/src/views/ProjectStatus.vue b/src/views/ProjectStatus.vue new file mode 100644 index 00000000..c2f437c7 --- /dev/null +++ b/src/views/ProjectStatus.vue @@ -0,0 +1,403 @@ + + + + + diff --git a/src/views/ProjectTimeline.vue b/src/views/ProjectTimeline.vue index 7d063577..59653abe 100644 --- a/src/views/ProjectTimeline.vue +++ b/src/views/ProjectTimeline.vue @@ -11,27 +11,58 @@ {{ projectTitle }} - {{ t('planninq', 'Timeline') }} + {{ view === 'roadmap' ? t('planninq', 'Roadmap') : t('planninq', 'Timeline') }} + +

- {{ t('planninq', 'Timeline') }} + {{ view === 'roadmap' ? t('planninq', 'Roadmap') : t('planninq', 'Timeline') }}

+
+ + {{ t('planninq', 'Tasks') }} + + + {{ t('planninq', 'Roadmap') }} + +
+ + + {{ t('planninq', 'Import from Microsoft Project') }} + + trackBy="value" />
+ + + -
+
@@ -54,6 +85,11 @@ :key="tick.iso" class="project-timeline__tick" :class="{ 'project-timeline__tick--weekend': tick.weekend }" + :role="tick.holiday ? 'img' : null" + :aria-label="tick.holiday || null" + :title="tick.holiday || null" + :data-date="tick.iso" + :data-non-working="tick.weekend ? 'true' : null" :style="{ left: tick.x + 'px', width: pxPerDay + 'px' }"> {{ tick.label }}
@@ -85,23 +121,46 @@ + :stroke-dasharray="edge.related ? '4 3' : null" + :marker-end="edge.related ? null : 'url(#planninq-timeline-arrow)'" /> -
+ :class="{ 'project-timeline__bar--dragging': drag && drag.id === bar.id }" + :style="barStyle(bar)" + :title="bar.tooltip" + :aria-label="barLabel(bar)" + :data-task-id="bar.id" + data-testid="timeline-bar" + @pointerdown="startDrag($event, bar, 'move')" + @pointermove="moveDrag" + @pointerup="endDrag" + @pointercancel="cancelDrag" + @keydown.left.prevent="keyMove(bar, -1, $event.shiftKey)" + @keydown.right.prevent="keyMove(bar, 1, $event.shiftKey)" + @click="openDates(bar)"> +
+